diff --git a/README.md b/README.md index 02655d4..7616dc9 100644 --- a/README.md +++ b/README.md @@ -96,8 +96,8 @@ Then a global variable `v` is exposed for the entire library: | [v.slugify][slugify] | [v.isUpperCase][isUpperCase] | **Count** | [v.graphemes][graphemes] | | | [v.splice][splice] | [v.matches][matches] | [v.count][count] | [v.split][split] | | | [v.trim][trim] | [v.startsWith][startsWith] | [v.countGraphemes][countGraphemes] | [v.words][words] | | -| [v.trimLeft][trimLeft] | **Format** | [v.countSubstrings][countSubstrings] | | | -| [v.trimRight][trimRight] | [v.sprintf][sprintf] | [v.countWhere][countWhere] | | | +| [v.trimLeft][trimLeft] | **Format** | [v.countSubstrings][countSubstrings] | **Strip** | | +| [v.trimRight][trimRight] | [v.sprintf][sprintf] | [v.countWhere][countWhere] | [v.stripTags][stripTags] | | | [v.wordWrap][wordWrap] | [v.vprintf][vprintf] | [v.countWords][countWords] | | | ## Bug reports @@ -132,9 +132,9 @@ Licensed under [MIT](https://github.com/panzerdp/voca/blob/master/LICENSE.md) [CODE_OF_CONDUCT]: https://github.com/panzerdp/voca/blob/master/CODE_OF_CONDUCT.md [CONTRIBUTING]: https://github.com/panzerdp/voca/blob/master/.github/CONTRIBUTING.md -[voca_min_js]: https://raw.githubusercontent.com/panzerdp/voca/1.0.0/dist/voca.min.js -[source_map]: https://raw.githubusercontent.com/panzerdp/voca/1.0.0/dist/voca.min.js.map -[voca_js]: https://raw.githubusercontent.com/panzerdp/voca/1.0.0/dist/voca.js +[voca_min_js]: https://raw.githubusercontent.com/panzerdp/voca/1.1.0/dist/voca.min.js +[source_map]: https://raw.githubusercontent.com/panzerdp/voca/1.1.0/dist/voca.min.js.map +[voca_js]: https://raw.githubusercontent.com/panzerdp/voca/1.1.0/dist/voca.js [voca]: https://vocajs.com [logo]: https://github.com/panzerdp/voca/raw/master/jsdoc/template/static/images/voca-logo@300px.png [logo_commonjs]: https://github.com/panzerdp/voca/raw/master/jsdoc/template/static/images/commonjs@200px.png @@ -212,3 +212,5 @@ Licensed under [MIT](https://github.com/panzerdp/voca/blob/master/LICENSE.md) [graphemes]: https://vocajs.com/#graphemes [split]: https://vocajs.com/#split [words]: https://vocajs.com/#words + +[stripTags]: https://vocajs.com/#stripTags \ No newline at end of file diff --git a/dist/voca.js b/dist/voca.js index b0d0087..b87fbba 100644 --- a/dist/voca.js +++ b/dist/voca.js @@ -1,5 +1,5 @@ /*! - * Voca string library 1.0.0 + * Voca string library 1.1.0 * https://vocajs.com * * Copyright Dmitri Pavlutin and other contributors @@ -3263,7 +3263,6 @@ function parseTagName(tagContent) { return tagName; } -/* eslint-disable */ var STATE_OUTPUT = 0; var STATE_HTML = 1; var STATE_EXCLAMATION = 2; @@ -3276,16 +3275,20 @@ var STATE_COMMENT = 3; * @static * @since 1.1.0 * @memberOf Strip - * @param {string} [subject=''] The string to strip. - * @param {string|Array} [allowableTags] The string or array of tags that should not be stripped. + * @param {string} [subject=''] The string to strip from. + * @param {string|Array} [allowableTags] The string `''` or array `['tag1', 'tag2']` of tags that should not be stripped. * @param {string} [replacement=''] The string to replace the stripped tag. * @return {string} Returns the stripped string. * @example - * v.trim(' Mother nature '); - * // => 'Mother nature' * - * v.trim('--Earth--', '-'); - * // => 'Earth' + * v.stripTags('Summer is nice'); + * // => 'Summer is nice' + * + * v.stripTags('Winter is cold', ['b', 'i']); + * // => 'Winter is cold' + * + * v.stripTags('Sun
set', '', '-'); + * // => 'Sun-set' */ function trim$1(subject, allowableTags, replacement) { subject = coerceToString(subject); @@ -3377,10 +3380,12 @@ function trim$1(subject, allowableTags, replacement) { var tagName = parseTagName(tagContent); if (allowableTags.indexOf(tagName.toLowerCase()) !== -1) { output += tagContent; + } else { + output += replacementString; } tagContent = ''; } else { - tagContent += replacementString; + output += replacementString; } break; } @@ -3446,7 +3451,7 @@ var previousV = globalObject.v; * @return {Object} Returns Voca library instance. * @example * var voca = v.noConflict(); - * voca.isAlhpa('Hello'); + * voca.isAlpha('Hello'); * // => true */ function noConflict() { @@ -3465,9 +3470,9 @@ function noConflict() { * @type string * @example * v.version - * // => '1.0.0' + * // => '1.1.0' */ -var version = '1.0.0'; +var version = '1.1.0'; /* eslint sort-imports: "off" */ diff --git a/dist/voca.min.js b/dist/voca.min.js index 1528712..9b720ab 100644 --- a/dist/voca.min.js +++ b/dist/voca.min.js @@ -1,9 +1,9 @@ /*! - * Voca string library 1.0.0 + * Voca string library 1.1.0 * https://vocajs.com * * Copyright Dmitri Pavlutin and other contributors * Released under the MIT license */ -!function(e,u){"object"==typeof exports&&"undefined"!=typeof module?module.exports=u():"function"==typeof define&&define.amd?define(u):e.v=u()}(this,function(){"use strict";function e(e){return void 0===e||null===e}function u(u){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return e(u)?n:Boolean(u)}function n(e){return"string"==typeof e}function r(u){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return e(u)?r:n(u)?u:String(u)}function t(e,n){var t=r(e),i=u(n);return""===t?"":(i&&(t=t.toLowerCase()),t.substr(0,1).toUpperCase()+t.substr(1))}function i(e){var u=r(e,"");return u.toLowerCase()}function a(e,u){return null==e?u:e}function c(u){return e(u)?null:n(u)?u:String(u)}function o(u,n,t){var i=r(u),o=void 0;if(e(n))o=Du.test(i)?Pu:Ru;else if(n instanceof RegExp)o=n;else{var f=c(a(t,""));o=new RegExp(c(n),f)}return a(i.match(o),[])}function f(e,u){return 0===u?i(e):t(e,!0)}function s(e){var u=r(e);return""===u?"":o(u).map(f).join("")}function E(e){var u=r(e);return""===u?u:u.substr(0,1).toLowerCase()+u.substr(1)}function p(e){var u=r(e);return""===u?"":o(u).map(i).join("-")}function l(e){var u=r(e);return""===u?"":o(u).map(i).join("_")}function g(e){var u=r(e);return u.toUpperCase()}function h(e,u,n){return e<=u?u:e>=n?n:e}function v(e){return e===1/0?yu:e===-(1/0)?-yu:~~e}function A(u,n,t){var i=r(u),a=e(n)?i.length:h(v(n),0,yu),c=r(t,"...");return a>=i.length?i:i.substr(0,n-c.length)+c}function d(e,u){var n=r(e);return n.charAt(u)}function T(e){return e>=wu&&e<=Ou}function _(e){return e>=Nu&&e<=Yu}function F(e,u){return 1024*(e-wu)+u-Nu+65536}function C(u){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return e(u)?n:"number"==typeof u?u:Number(u)}function I(e,u){return e!==e?u:e}function x(e,u){var n=r(e),t=n.length,i=C(u);if(i=I(i,0),!(i<0||i>=t)){var a=n.charCodeAt(i),c=void 0;return T(a)&&t>i+1&&(c=n.charCodeAt(i+1),_(c))?F(a,c):a}}function b(u,n){var t=r(u),i=e(n)?1:h(v(n),0,yu);return t.length<=i?t:t.substr(0,i)}function R(e,u){var n=r(e),t=C(u),i=void 0,a=0;for(t=I(t,0);null!==(i=fu.exec(n));){if(a===t)return fu.lastIndex=0,i[0];a++}return""}function P(u,n){var t=r(u),i=e(n)?1:h(v(n),0,yu);return t.length<=i?t:t.substr(t.length-i,i)}function L(u,n,t){var i=r(u),a=e(n)?i.length:h(v(n),0,yu),c=r(t,"...");if(a>=i.length)return i;var o=Du.test(i)?Pu:Ru,f=0;return i.replace(o,function(e,u){var n=u+e.length;n<=a-c.length&&(f=n)}),i.substr(0,f)+c}function S(e,u,n){return r(e).slice(u,n)}function D(e,u,n){return r(e).substr(u,n)}function y(e,u,n){return r(e).substring(u,n)}function w(e){return r(e).length}function O(e){return r(e).replace(cu,"*").replace(ou,"*").length}function N(e,u){var n=r(e),t=r(u),i=t.length,a=0,c=0;if(""===n||""===t)return a;do c=n.indexOf(t,c),c!==-1&&(a++,c+=i);while(c!==-1);return a}function Y(e,u,n){var t=r(e);if(""===t||"function"!=typeof u)return 0;var i=u.bind(n);return mu.call(t,function(e,u,n){return i(u,n,t)?e+1:e},0)}function m(e,u,n){return o(e,u,n).length}function B(){this.index=0}function k(u,n){for(var t=r(u),i=e(n)?1:h(v(n),0,yu),a="";i;)1&i&&(a+=t),i>1&&(t+=t),i>>=1;return a}function G(e,u){var n=v(u/e.length),r=u%e.length;return k(e,n+r).substr(0,u)}function U(u,n,t){var i=r(u),a=e(n)?0:h(v(n),0,yu),c=r(t," ");return a<=i.length?i:G(c,a-i.length)+i}function j(u,n,t){var i=r(u),a=e(n)?0:h(v(n),0,yu),c=r(t," ");return a<=i.length?i:i+G(c,a-i.length)}function H(u,n){var r=n.width;if(e(r)||u.length>=r)return u;var t=n.alignmentSpecifier===Bu.LITERAL_MINUS?j:U;return t(u,r,n.getPaddingCharacter())}function X(e,u,n){return n.signSpecifier===Bu.LITERAL_PLUS&&e>=0&&(u=Bu.LITERAL_PLUS+u),u}function M(e,u){var n=parseFloat(e),t=void 0;isNaN(n)&&(n=0);var i=C(u.precision,6);switch(u.typeSpecifier){case Bu.TYPE_FLOAT:t=n.toFixed(i);break;case Bu.TYPE_FLOAT_SCIENTIFIC:t=n.toExponential(i);break;case Bu.TYPE_FLOAT_SCIENTIFIC_UPPERCASE:t=n.toExponential(i).toUpperCase();break;case Bu.TYPE_FLOAT_SHORT:case Bu.TYPE_FLOAT_SHORT_UPPERCASE:t=z(n,i,u)}return t=X(n,t,u),r(t)}function z(e,u,n){if(0===e)return"0";var r=0===u?1:u,t=e.toPrecision(r).replace(du,"");return n.typeSpecifier===Bu.TYPE_FLOAT_SHORT_UPPERCASE&&(t=t.toUpperCase()),t}function $(e,u){var n=parseInt(e);switch(isNaN(n)&&(n=0),n>>>=0,u.typeSpecifier){case Bu.TYPE_INTEGER_ASCII_CHARACTER:n=String.fromCharCode(n);break;case Bu.TYPE_INTEGER_BINARY:n=n.toString(Bu.RADIX_BINARY);break;case Bu.TYPE_INTEGER_OCTAL:n=n.toString(Bu.RADIX_OCTAL);break;case Bu.TYPE_INTEGER_HEXADECIMAL:n=n.toString(Bu.RADIX_HEXADECIMAL);break;case Bu.TYPE_INTEGER_HEXADECIMAL_UPPERCASE:n=n.toString(Bu.RADIX_HEXADECIMAL).toUpperCase()}return r(n)}function V(e,u){var n=parseInt(e);return isNaN(n)&&(n=0),X(n,c(n),u)}function Z(u,n){var r=u,t=n.precision;return!e(t)&&r.length>t&&(r=A(r,t,"")),r}function W(e,u){var n=void 0;switch(u.typeSpecifier){case Bu.TYPE_STRING:n=Z;break;case Bu.TYPE_INTEGER_DECIMAL:case Bu.TYPE_INTEGER:n=V;break;case Bu.TYPE_INTEGER_ASCII_CHARACTER:case Bu.TYPE_INTEGER_BINARY:case Bu.TYPE_INTEGER_OCTAL:case Bu.TYPE_INTEGER_HEXADECIMAL:case Bu.TYPE_INTEGER_HEXADECIMAL_UPPERCASE:case Bu.TYPE_INTEGER_UNSIGNED_DECIMAL:n=$;break;case Bu.TYPE_FLOAT:case Bu.TYPE_FLOAT_SCIENTIFIC:case Bu.TYPE_FLOAT_SCIENTIFIC_UPPERCASE:case Bu.TYPE_FLOAT_SHORT:case Bu.TYPE_FLOAT_SHORT_UPPERCASE:n=M}var r=n(e,u);return H(r,u)}function J(e){this.percent=e.percent,this.signSpecifier=e.signSpecifier,this.paddingSpecifier=e.paddingSpecifier,this.alignmentSpecifier=e.alignmentSpecifier,this.width=e.width,this.precision=e.precision,this.typeSpecifier=e.typeSpecifier}function q(u,n,r){if(e(r.typeSpecifier))throw new Error("sprintf(): Unknown type specifier");if(u>n-1)throw new Error("sprintf(): Too few arguments");if(u<0)throw new Error("sprintf(): Argument number must be greater than zero")}function Q(e,u,n,r,t,i,a,c,o,f,s){var E=new J({percent:r,signSpecifier:i,paddingSpecifier:a,alignmentSpecifier:c,width:C(o,null),precision:C(f,null),typeSpecifier:s});if(E.isPercentLiteral())return n.slice(1);var p=e.getIndexByPosition(t);return e.incrementOnEmptyPosition(t),q(p,u.length,E),W(u[p],E)}function K(e){var u=r(e);if(""===u)return u;for(var n=arguments.length,t=Array(n>1?n-1:0),i=1;it.length||""===i?t:t.slice(0,a)+i+t.slice(a)}function Ee(){return null!==Hu?Hu:(Hu={},Object.keys(ju).forEach(function(e){for(var u=ju[e],n=0;ni.length&&(c=i.length);var o=C(n,i.length-c);return o<0&&(o=0),i.slice(0,c)+a+i.slice(c+o)}function be(u,n){var t=r(u);if(""===n||""===t)return t;var i=c(n);if(e(i))return t.replace(Eu,"");for(var a=i.length,o=!0,f=0;o;)t.indexOf(i,f)===f?f+=a:o=!1;return t.substring(f)}function Re(u,n){var t=r(u);if(""===n||""===t)return t;var i=c(n);if(e(i))return t.replace(pu,"");for(var a=i.length,o=t.length,f=!0,s=0,E=void 0;f;)E=o-s-a,t.indexOf(i,E)===E?s+=a:f=!1;return t.substring(0,o-s)}function Pe(u,n){var t=r(u);if(""===n||""===t)return t;var i=c(n);return e(i)?t.trim():Re(be(t,i),i)}function Le(e){return{width:C(e[Xu],75),newLine:r(e[Mu],"\n"),indent:r(e[zu],""),cut:u(e[$u],!1)}}function Se(e){var u=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=r(e),t=Le(u),i=t.width,a=t.newLine,c=t.indent,o=t.cut;if(""===n||i<=0)return c;for(var f=n.length,s=n.substring.bind(n),E=0,p="";f-E>i;)if(" "!==n[E]){var l=n.lastIndexOf(" ",i+E);l>=E?(p+=c+s(E,l)+a,E=l+1):o?(p+=c+s(E,i+E)+a,E+=i):(l=n.indexOf(" ",i+E),l>=0?(p+=c+s(E,l)+a,E=l+1):(p+=c+s(E),E=f))}else E++;return E65535?2:1;return t}function Xe(e){var u=r(e);return a(u.match(fu),[])}function Me(e,u,n){var t=r(e);return t.split(u,n)}function ze(e,u,n){var r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],t=0;r&&(t=-u.length+1);var i=e.substr(n+t,u.length);return i.toLowerCase()===u}function $e(e){for(var u=[],n=void 0;null!==(n=_u.exec(e));)u.push(n[1]);return u}function Ve(e){for(var u=Vu,n="",r=0;u!==Wu;){var t=e[r++].toLowerCase();switch(t){case"<":break;case">":u=Wu;break;default:su.test(t)?u===Zu&&(u=Wu):(u===Vu&&(u=Zu),"/"!==t&&(n+=t))}}return n}function Ze(e,u,n){if(e=r(e),""===e)return"";if(!Array.isArray(u)){var t=r(u);u=""===t?[]:$e(t)}for(var i=r(n),a=e.length,c=u.length>0,o=ze.bind(null,e),f=Ju,s=0,E="",p="",l=null,g=0;g":if(s>0){s--;break}if(l)break;if(f===qu){if(l=null,f=Ju,c){p+=">";var A=Ve(p);u.indexOf(A.toLowerCase())!==-1&&(E+=p),p=""}else p+=i;break}if(f===Qu||f===Ku&&o("-->",g)){l=null,f=Ju,p="";break}v=!0;break;default:v=!0}if(v)switch(f){case Ju:E+=h;break;case qu:c&&(p+=h)}}return E}function We(){return null!==en?en:en="object"==typeof global&&global.Object===Object?global:"object"==typeof self&&self.Object===Object?self:new Function("return this")()}function Je(){return this===un.v&&(un.v=nn),this}function qe(e,u){this._wrappedValue=e,this._explicitChain=u}function Qe(e){return function(){for(var u=arguments.length,n=Array(u),r=0;r&"'`]/g,Au=/(%{1,2})(?:(\d+)\$)?(\+)?([ 0]|'.{1})?(-)?(\d+)?(?:\.(\d+))?([bcdiouxXeEfgGs])?/g,du=/\.?0+$/g,Tu=/[gimuy]*$/,_u=/<([A-Za-z0-9]+)>/g,Fu="\\u2000-\\u206F",Cu="\\x00-\\x2F\\x3A-\\x40\\x5B-\\x60\\x7b-\\xBF\\xD7\\xF7",Iu="\\u2700-\\u27BF",xu="a-z\\xB5\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F",bu="\\x41-\\x5a\\xc0-\\xd6\\xd8-\\xde\\u0100\\u0102\\u0104\\u0106\\u0108\\u010a\\u010c\\u010e\\u0110\\u0112\\u0114\\u0116\\u0118\\u011a\\u011c\\u011e\\u0120\\u0122\\u0124\\u0126\\u0128\\u012a\\u012c\\u012e\\u0130\\u0132\\u0134\\u0136\\u0139\\u013b\\u013d\\u013f\\u0141\\u0143\\u0145\\u0147\\u014a\\u014c\\u014e\\u0150\\u0152\\u0154\\u0156\\u0158\\u015a\\u015c\\u015e\\u0160\\u0162\\u0164\\u0166\\u0168\\u016a\\u016c\\u016e\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017b\\u017d\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018b\\u018e-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019c\\u019d\\u019f\\u01a0\\u01a2\\u01a4\\u01a6\\u01a7\\u01a9\\u01ac\\u01ae\\u01af\\u01b1-\\u01b3\\u01b5\\u01b7\\u01b8\\u01bc\\u01c4\\u01c5\\u01c7\\u01c8\\u01ca\\u01cb\\u01cd\\u01cf\\u01d1\\u01d3\\u01d5\\u01d7\\u01d9\\u01db\\u01de\\u01e0\\u01e2\\u01e4\\u01e6\\u01e8\\u01ea\\u01ec\\u01ee\\u01f1\\u01f2\\u01f4\\u01f6-\\u01f8\\u01fa\\u01fc\\u01fe\\u0200\\u0202\\u0204\\u0206\\u0208\\u020a\\u020c\\u020e\\u0210\\u0212\\u0214\\u0216\\u0218\\u021a\\u021c\\u021e\\u0220\\u0222\\u0224\\u0226\\u0228\\u022a\\u022c\\u022e\\u0230\\u0232\\u023a\\u023b\\u023d\\u023e\\u0241\\u0243-\\u0246\\u0248\\u024a\\u024c\\u024e",Ru=new RegExp("(?:["+bu+"]["+iu+"]*)?(?:["+xu+"]["+iu+"]*)+|(?:["+bu+"]["+iu+"]*)+(?!["+xu+"])|["+uu+"]+|["+Iu+"]|[^"+Cu+Fu+nu+"]+","g"),Pu=/[A-Z\xC0-\xD6\xD8-\xDE]?[a-z\xDF-\xF6\xF8-\xFF]+|[A-Z\xC0-\xD6\xD8-\xDE]+(?![a-z\xDF-\xF6\xF8-\xFF])|\d+/g,Lu=new RegExp("^(?:["+xu+bu+"]["+iu+"]*)+$"),Su=new RegExp("^((?:["+xu+bu+"]["+iu+"]*)|["+uu+"])+$"),Du=/^[\x00-\xFF]*$/,yu=9007199254740991,wu=55296,Ou=56319,Nu=56320,Yu=57343,mu=Array.prototype.reduce;B.prototype.increment=function(){this.index++},B.prototype.incrementOnEmptyPosition=function(u){e(u)&&this.increment()},B.prototype.getIndexByPosition=function(u){return e(u)?this.index:u-1};var Bu=Object.freeze({TYPE_INTEGER:"i",TYPE_INTEGER_BINARY:"b",TYPE_INTEGER_ASCII_CHARACTER:"c",TYPE_INTEGER_DECIMAL:"d",TYPE_INTEGER_OCTAL:"o",TYPE_INTEGER_UNSIGNED_DECIMAL:"u",TYPE_INTEGER_HEXADECIMAL:"x",TYPE_INTEGER_HEXADECIMAL_UPPERCASE:"X",TYPE_FLOAT_SCIENTIFIC:"e",TYPE_FLOAT_SCIENTIFIC_UPPERCASE:"E",TYPE_FLOAT:"f",TYPE_FLOAT_SHORT:"g",TYPE_FLOAT_SHORT_UPPERCASE:"G",TYPE_STRING:"s",LITERAL_PERCENT:"%",LITERAL_SINGLE_QUOTE:"'",LITERAL_PLUS:"+",LITERAL_MINUS:"-",LITERAL_PERCENT_SPECIFIER:"%%",RADIX_BINARY:2,RADIX_OCTAL:8,RADIX_DECIMAL:10,RADIX_HEXADECIMAL:16});J.prototype.isPercentLiteral=function(){return Bu.LITERAL_PERCENT_SPECIFIER===this.percent},J.prototype.getPaddingCharacter=function(){var e=a(this.paddingSpecifier," ");return 2===e.length&&e[0]===Bu.LITERAL_SINGLE_QUOTE&&(e=e[1]),e};var ku={"<":"<",">":">","&":"&",'"':""","'":"'","`":"`"},Gu={"<":/(<)|(�*3c;)|(�*60;)/gi,">":/(>)|(�*3e;)|(�*62;)/gi,"&":/(&)|(�*26;)|(�*38;)/gi,'"':/(")|(�*22;)|(�*34;)/gi,"'":/(�*27;)|(�*39;)/gi,"`":/(�*60;)|(�*96;)/gi},Uu=Object.keys(Gu),ju={3:"Ξξ",8:"Θθ",A:"AÀÁÂÃÄÅĀĂĄǍǞǠǺȀȂȦȺḀẠẢẤẦẨẪẬẮẰẲẴẶⒶⱯAΆΑА",B:"BƁƂɃḂḄḆⒷBΒБ",C:"CÇĆĈĊČƇȻḈⒸꜾCЦ",D:"DĎĐƉƊƋḊḌḎḐḒⒹꝹDÐΔД",E:"EÈÉÊËĒĔĖĘĚƎƐȄȆȨḔḖḘḚḜẸẺẼẾỀỂỄỆⒺEΈΕЕЭ",F:"FƑḞⒻꝻFΦФ",G:"GĜĞĠĢƓǤǦǴḠⒼꝽꝾꞠGΓГҐ",H:"HĤĦȞḢḤḦḨḪⒽⱧⱵꞍHΉΗХ",I:"IÌÍÎÏĨĪĬĮİƗǏȈȊḬḮỈỊⒾIΊΙΪІИ",J:"JĴɈⒿJЙ",K:"KĶƘǨḰḲḴⓀⱩꝀꝂꝄꞢKΚК",L:"LĹĻĽĿŁȽḶḸḺḼⓁⱠⱢꝆꝈꞀLΛЛ",M:"MƜḾṀṂⓂⱮMΜМ",N:"NÑŃŅŇƝǸȠṄṆṈṊⓃꞐꞤNΝН",O:"OÒÓÔÕÖØŌŎŐƆƟƠǑǪǬǾȌȎȪȬȮȰṌṎṐṒỌỎỐỒỔỖỘỚỜỞỠỢⓄꝊꝌOΌΟО",P:"PƤṔṖⓅⱣꝐꝒꝔPΠП",Q:"QɊⓆꝖꝘQ",R:"RŔŖŘȐȒɌṘṚṜṞⓇⱤꝚꞂꞦRΡР",S:"SŚŜŞŠȘṠṢṤṦṨẞⓈⱾꞄꞨSΣС",T:"TŢŤŦƬƮȚȾṪṬṮṰⓉꞆTΤТ",U:"UÙÚÛÜŨŪŬŮŰŲƯǓǕǗǙǛȔȖɄṲṴṶṸṺỤỦỨỪỬỮỰⓊUУЪ",V:"VƲɅṼṾⓋꝞVВ",W:"WŴẀẂẄẆẈⓌⱲWΏΩ",X:"XẊẌⓍXΧ",Y:"YÝŶŸƳȲɎẎỲỴỶỸỾⓎYΎΥΫЫ",Z:"ZŹŻŽƵȤẐẒẔⓏⱫⱿꝢZΖЗ",a:"aàáâãäåāăąǎǟǡǻȁȃȧɐḁẚạảấầẩẫậắằẳẵặⓐⱥaάαа",b:"bƀƃɓḃḅḇⓑbβб",c:"cçćĉċčƈȼḉↄⓒꜿcц",d:"dďđƌɖɗḋḍḏḑḓⓓꝺdðδд",e:"eèéêëēĕėęěǝȅȇȩɇɛḕḗḙḛḝẹẻẽếềểễệⓔeέεеэ",f:"fƒḟⓕꝼfφф",g:"gĝğġģǥǧǵɠᵹḡⓖꝿꞡgγгґ",h:"hĥħȟɥḣḥḧḩḫẖⓗⱨⱶhήηх",i:"iìíîïĩīĭįıǐȉȋɨḭḯỉịⓘiΐίιϊиі",j:"jĵǰɉⓙjй",k:"kķƙǩḱḳḵⓚⱪꝁꝃꝅꞣkκк",l:"lĺļľŀłſƚɫḷḹḻḽⓛⱡꝇꝉꞁlλл",m:"mɯɱḿṁṃⓜmμм",n:"nñńņňʼnƞǹɲṅṇṉṋⓝꞑꞥnνн",o:"oòóôõöøōŏőơǒǫǭǿȍȏȫȭȯȱɔɵṍṏṑṓọỏốồổỗộớờởỡợⓞꝋꝍoοόо",p:"pƥᵽṕṗⓟꝑꝓꝕpπп",q:"qɋⓠꝗꝙq",r:"rŕŗřȑȓɍɽṙṛṝṟⓡꝛꞃꞧrρр",s:"sßśŝşšșȿṡṣṥṧṩẛⓢꞅꞩsςσс",t:"tţťŧƭțʈṫṭṯṱẗⓣⱦꞇtτт",u:"uùúûüũūŭůűųưǔǖǘǚǜȕȗʉṳṵṷṹṻụủứừửữựⓤuуъ",v:"vʋʌṽṿⓥꝟvв",w:"wŵẁẃẅẇẉẘⓦⱳwωώ",x:"xẋẍⓧxχ",y:"yýÿŷƴȳɏẏẙỳỵỷỹỿⓨyΰυϋύы",z:"zźżžƶȥɀẑẓẕⓩⱬꝣzζз",OE:"ŒŒ",oe:"œœ",AE:"ÆǢǼ",ae:"æǣǽ",hv:"ƕ",OI:"Ƣ",oi:"ƣ",DZ:"DŽDZ",Dz:"DžDz",dz:"dždz",LJ:"LJ",Lj:"Lj",lj:"lj",NJ:"NJ",Nj:"Nj",nj:"nj",OU:"Ȣ",ou:"ȣ",TZ:"Ꜩ",tz:"ꜩ",AA:"Ꜳ",aa:"ꜳ",AO:"Ꜵ",ao:"ꜵ",AU:"Ꜷ",au:"ꜷ",AV:"ꜸꜺ",av:"ꜹꜻ",AY:"Ꜽ",ay:"ꜽ",OO:"Ꝏ",oo:"ꝏ",VY:"Ꝡ",vy:"ꝡ",TH:"Þ",th:"þ",PS:"Ψ",ps:"ψ",Yo:"Ё",Ye:"Є",Yi:"Ї",Zh:"Ж",Ch:"Ч",Sh:"ШЩ","":"Ьь",Yu:"Ю",Ya:"Я",zh:"ж",ch:"ч",sh:"шщ",yu:"ю",ya:"я",yo:"ё",ye:"є",yi:"ї"},Hu=null,Xu="width",Mu="newLine",zu="indent",$u="cut",Vu=0,Zu=1,Wu=2,Ju=0,qu=1,Qu=2,Ku=3,en=null,un=We(),nn=un.v,rn="1.0.0",tn={camelCase:s,capitalize:t,decapitalize:E,kebabCase:p,lowerCase:i,snakeCase:l,upperCase:g,count:w,countGraphemes:O,countSubstrings:N,countWhere:Y,countWords:m,escapeHtml:re,escapeRegExp:te,unescapeHtml:ae,sprintf:K,vprintf:ue,indexOf:ce,lastIndexOf:oe,search:fe,charAt:d,codePointAt:x,first:b,graphemeAt:R,last:P,prune:L,slice:S,substr:D,substring:y,truncate:A,insert:se,latinise:ge,pad:he,padLeft:U,padRight:j,repeat:k,replace:ve,replaceAll:_e,reverse:Fe,reverseGrapheme:Ce,slugify:Ie,splice:xe,trim:Pe,trimLeft:be,trimRight:Re,wordWrap:Se,endsWith:De,includes:de,isAlpha:ye,isAlphaDigit:we,isBlank:Oe,isDigit:Ne,isEmpty:Ye,isLowerCase:me,isNumeric:Be,isString:n,isUpperCase:ke,matches:Ge,startsWith:Ue,chars:je,codePoints:He,graphemes:Xe,split:Me,words:o,stripTags:Ze,noConflict:Je,version:rn};qe.prototype.value=function(){return this._wrappedValue},qe.prototype.valueOf=function(){return this.value()},qe.prototype.toJSON=function(){return this.value()},qe.prototype.toString=function(){return String(this.value())},qe.prototype.chain=function(){return new qe(this._wrappedValue,!0)},qe.prototype.thru=function(e){return"function"==typeof e?new qe(e(this._wrappedValue),this._explicitChain):this},qe.prototype._explicitChain=!0,Object.keys(tn).forEach(function(e){qe.prototype[e]=Qe(tn[e])});var an=Object.assign||function(e){for(var u=1;u1&&void 0!==arguments[1]&&arguments[1];return e(u)?n:Boolean(u)}function n(e){return"string"==typeof e}function r(u){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return e(u)?r:n(u)?u:String(u)}function t(e,n){var t=r(e),i=u(n);return""===t?"":(i&&(t=t.toLowerCase()),t.substr(0,1).toUpperCase()+t.substr(1))}function i(e){var u=r(e,"");return u.toLowerCase()}function a(e,u){return null==e?u:e}function c(u){return e(u)?null:n(u)?u:String(u)}function o(u,n,t){var i=r(u),o=void 0;if(e(n))o=Du.test(i)?Pu:Ru;else if(n instanceof RegExp)o=n;else{var f=c(a(t,""));o=new RegExp(c(n),f)}return a(i.match(o),[])}function f(e,u){return 0===u?i(e):t(e,!0)}function s(e){var u=r(e);return""===u?"":o(u).map(f).join("")}function E(e){var u=r(e);return""===u?u:u.substr(0,1).toLowerCase()+u.substr(1)}function p(e){var u=r(e);return""===u?"":o(u).map(i).join("-")}function l(e){var u=r(e);return""===u?"":o(u).map(i).join("_")}function g(e){var u=r(e);return u.toUpperCase()}function h(e,u,n){return e<=u?u:e>=n?n:e}function v(e){return e===1/0?yu:e===-(1/0)?-yu:~~e}function A(u,n,t){var i=r(u),a=e(n)?i.length:h(v(n),0,yu),c=r(t,"...");return a>=i.length?i:i.substr(0,n-c.length)+c}function d(e,u){var n=r(e);return n.charAt(u)}function T(e){return e>=wu&&e<=Ou}function _(e){return e>=Nu&&e<=Yu}function F(e,u){return 1024*(e-wu)+u-Nu+65536}function C(u){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return e(u)?n:"number"==typeof u?u:Number(u)}function I(e,u){return e!==e?u:e}function x(e,u){var n=r(e),t=n.length,i=C(u);if(i=I(i,0),!(i<0||i>=t)){var a=n.charCodeAt(i),c=void 0;return T(a)&&t>i+1&&(c=n.charCodeAt(i+1),_(c))?F(a,c):a}}function b(u,n){var t=r(u),i=e(n)?1:h(v(n),0,yu);return t.length<=i?t:t.substr(0,i)}function R(e,u){var n=r(e),t=C(u),i=void 0,a=0;for(t=I(t,0);null!==(i=fu.exec(n));){if(a===t)return fu.lastIndex=0,i[0];a++}return""}function P(u,n){var t=r(u),i=e(n)?1:h(v(n),0,yu);return t.length<=i?t:t.substr(t.length-i,i)}function L(u,n,t){var i=r(u),a=e(n)?i.length:h(v(n),0,yu),c=r(t,"...");if(a>=i.length)return i;var o=Du.test(i)?Pu:Ru,f=0;return i.replace(o,function(e,u){var n=u+e.length;n<=a-c.length&&(f=n)}),i.substr(0,f)+c}function S(e,u,n){return r(e).slice(u,n)}function D(e,u,n){return r(e).substr(u,n)}function y(e,u,n){return r(e).substring(u,n)}function w(e){return r(e).length}function O(e){return r(e).replace(cu,"*").replace(ou,"*").length}function N(e,u){var n=r(e),t=r(u),i=t.length,a=0,c=0;if(""===n||""===t)return a;do c=n.indexOf(t,c),c!==-1&&(a++,c+=i);while(c!==-1);return a}function Y(e,u,n){var t=r(e);if(""===t||"function"!=typeof u)return 0;var i=u.bind(n);return mu.call(t,function(e,u,n){return i(u,n,t)?e+1:e},0)}function m(e,u,n){return o(e,u,n).length}function B(){this.index=0}function k(u,n){for(var t=r(u),i=e(n)?1:h(v(n),0,yu),a="";i;)1&i&&(a+=t),i>1&&(t+=t),i>>=1;return a}function G(e,u){var n=v(u/e.length),r=u%e.length;return k(e,n+r).substr(0,u)}function U(u,n,t){var i=r(u),a=e(n)?0:h(v(n),0,yu),c=r(t," ");return a<=i.length?i:G(c,a-i.length)+i}function j(u,n,t){var i=r(u),a=e(n)?0:h(v(n),0,yu),c=r(t," ");return a<=i.length?i:i+G(c,a-i.length)}function H(u,n){var r=n.width;if(e(r)||u.length>=r)return u;var t=n.alignmentSpecifier===Bu.LITERAL_MINUS?j:U;return t(u,r,n.getPaddingCharacter())}function X(e,u,n){return n.signSpecifier===Bu.LITERAL_PLUS&&e>=0&&(u=Bu.LITERAL_PLUS+u),u}function M(e,u){var n=parseFloat(e),t=void 0;isNaN(n)&&(n=0);var i=C(u.precision,6);switch(u.typeSpecifier){case Bu.TYPE_FLOAT:t=n.toFixed(i);break;case Bu.TYPE_FLOAT_SCIENTIFIC:t=n.toExponential(i);break;case Bu.TYPE_FLOAT_SCIENTIFIC_UPPERCASE:t=n.toExponential(i).toUpperCase();break;case Bu.TYPE_FLOAT_SHORT:case Bu.TYPE_FLOAT_SHORT_UPPERCASE:t=z(n,i,u)}return t=X(n,t,u),r(t)}function z(e,u,n){if(0===e)return"0";var r=0===u?1:u,t=e.toPrecision(r).replace(du,"");return n.typeSpecifier===Bu.TYPE_FLOAT_SHORT_UPPERCASE&&(t=t.toUpperCase()),t}function $(e,u){var n=parseInt(e);switch(isNaN(n)&&(n=0),n>>>=0,u.typeSpecifier){case Bu.TYPE_INTEGER_ASCII_CHARACTER:n=String.fromCharCode(n);break;case Bu.TYPE_INTEGER_BINARY:n=n.toString(Bu.RADIX_BINARY);break;case Bu.TYPE_INTEGER_OCTAL:n=n.toString(Bu.RADIX_OCTAL);break;case Bu.TYPE_INTEGER_HEXADECIMAL:n=n.toString(Bu.RADIX_HEXADECIMAL);break;case Bu.TYPE_INTEGER_HEXADECIMAL_UPPERCASE:n=n.toString(Bu.RADIX_HEXADECIMAL).toUpperCase()}return r(n)}function V(e,u){var n=parseInt(e);return isNaN(n)&&(n=0),X(n,c(n),u)}function Z(u,n){var r=u,t=n.precision;return!e(t)&&r.length>t&&(r=A(r,t,"")),r}function W(e,u){var n=void 0;switch(u.typeSpecifier){case Bu.TYPE_STRING:n=Z;break;case Bu.TYPE_INTEGER_DECIMAL:case Bu.TYPE_INTEGER:n=V;break;case Bu.TYPE_INTEGER_ASCII_CHARACTER:case Bu.TYPE_INTEGER_BINARY:case Bu.TYPE_INTEGER_OCTAL:case Bu.TYPE_INTEGER_HEXADECIMAL:case Bu.TYPE_INTEGER_HEXADECIMAL_UPPERCASE:case Bu.TYPE_INTEGER_UNSIGNED_DECIMAL:n=$;break;case Bu.TYPE_FLOAT:case Bu.TYPE_FLOAT_SCIENTIFIC:case Bu.TYPE_FLOAT_SCIENTIFIC_UPPERCASE:case Bu.TYPE_FLOAT_SHORT:case Bu.TYPE_FLOAT_SHORT_UPPERCASE:n=M}var r=n(e,u);return H(r,u)}function J(e){this.percent=e.percent,this.signSpecifier=e.signSpecifier,this.paddingSpecifier=e.paddingSpecifier,this.alignmentSpecifier=e.alignmentSpecifier,this.width=e.width,this.precision=e.precision,this.typeSpecifier=e.typeSpecifier}function q(u,n,r){if(e(r.typeSpecifier))throw new Error("sprintf(): Unknown type specifier");if(u>n-1)throw new Error("sprintf(): Too few arguments");if(u<0)throw new Error("sprintf(): Argument number must be greater than zero")}function Q(e,u,n,r,t,i,a,c,o,f,s){var E=new J({percent:r,signSpecifier:i,paddingSpecifier:a,alignmentSpecifier:c,width:C(o,null),precision:C(f,null),typeSpecifier:s});if(E.isPercentLiteral())return n.slice(1);var p=e.getIndexByPosition(t);return e.incrementOnEmptyPosition(t),q(p,u.length,E),W(u[p],E)}function K(e){var u=r(e);if(""===u)return u;for(var n=arguments.length,t=Array(n>1?n-1:0),i=1;it.length||""===i?t:t.slice(0,a)+i+t.slice(a)}function Ee(){return null!==Hu?Hu:(Hu={},Object.keys(ju).forEach(function(e){for(var u=ju[e],n=0;ni.length&&(c=i.length);var o=C(n,i.length-c);return o<0&&(o=0),i.slice(0,c)+a+i.slice(c+o)}function be(u,n){var t=r(u);if(""===n||""===t)return t;var i=c(n);if(e(i))return t.replace(Eu,"");for(var a=i.length,o=!0,f=0;o;)t.indexOf(i,f)===f?f+=a:o=!1;return t.substring(f)}function Re(u,n){var t=r(u);if(""===n||""===t)return t;var i=c(n);if(e(i))return t.replace(pu,"");for(var a=i.length,o=t.length,f=!0,s=0,E=void 0;f;)E=o-s-a,t.indexOf(i,E)===E?s+=a:f=!1;return t.substring(0,o-s)}function Pe(u,n){var t=r(u);if(""===n||""===t)return t;var i=c(n);return e(i)?t.trim():Re(be(t,i),i)}function Le(e){return{width:C(e[Xu],75),newLine:r(e[Mu],"\n"),indent:r(e[zu],""),cut:u(e[$u],!1)}}function Se(e){var u=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=r(e),t=Le(u),i=t.width,a=t.newLine,c=t.indent,o=t.cut;if(""===n||i<=0)return c;for(var f=n.length,s=n.substring.bind(n),E=0,p="";f-E>i;)if(" "!==n[E]){var l=n.lastIndexOf(" ",i+E);l>=E?(p+=c+s(E,l)+a,E=l+1):o?(p+=c+s(E,i+E)+a,E+=i):(l=n.indexOf(" ",i+E),l>=0?(p+=c+s(E,l)+a,E=l+1):(p+=c+s(E),E=f))}else E++;return E65535?2:1;return t}function Xe(e){var u=r(e);return a(u.match(fu),[])}function Me(e,u,n){var t=r(e);return t.split(u,n)}function ze(e,u,n){var r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],t=0;r&&(t=-u.length+1);var i=e.substr(n+t,u.length);return i.toLowerCase()===u}function $e(e){for(var u=[],n=void 0;null!==(n=_u.exec(e));)u.push(n[1]);return u}function Ve(e){for(var u=Vu,n="",r=0;u!==Wu;){var t=e[r++].toLowerCase();switch(t){case"<":break;case">":u=Wu;break;default:su.test(t)?u===Zu&&(u=Wu):(u===Vu&&(u=Zu),"/"!==t&&(n+=t))}}return n}function Ze(e,u,n){if(e=r(e),""===e)return"";if(!Array.isArray(u)){var t=r(u);u=""===t?[]:$e(t)}for(var i=r(n),a=e.length,c=u.length>0,o=ze.bind(null,e),f=Ju,s=0,E="",p="",l=null,g=0;g":if(s>0){s--;break}if(l)break;if(f===qu){if(l=null,f=Ju,c){p+=">";var A=Ve(p);E+=u.indexOf(A.toLowerCase())!==-1?p:i,p=""}else E+=i;break}if(f===Qu||f===Ku&&o("-->",g)){l=null,f=Ju,p="";break}v=!0;break;default:v=!0}if(v)switch(f){case Ju:E+=h;break;case qu:c&&(p+=h)}}return E}function We(){return null!==en?en:en="object"==typeof global&&global.Object===Object?global:"object"==typeof self&&self.Object===Object?self:new Function("return this")()}function Je(){return this===un.v&&(un.v=nn),this}function qe(e,u){this._wrappedValue=e,this._explicitChain=u}function Qe(e){return function(){for(var u=arguments.length,n=Array(u),r=0;r&"'`]/g,Au=/(%{1,2})(?:(\d+)\$)?(\+)?([ 0]|'.{1})?(-)?(\d+)?(?:\.(\d+))?([bcdiouxXeEfgGs])?/g,du=/\.?0+$/g,Tu=/[gimuy]*$/,_u=/<([A-Za-z0-9]+)>/g,Fu="\\u2000-\\u206F",Cu="\\x00-\\x2F\\x3A-\\x40\\x5B-\\x60\\x7b-\\xBF\\xD7\\xF7",Iu="\\u2700-\\u27BF",xu="a-z\\xB5\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F",bu="\\x41-\\x5a\\xc0-\\xd6\\xd8-\\xde\\u0100\\u0102\\u0104\\u0106\\u0108\\u010a\\u010c\\u010e\\u0110\\u0112\\u0114\\u0116\\u0118\\u011a\\u011c\\u011e\\u0120\\u0122\\u0124\\u0126\\u0128\\u012a\\u012c\\u012e\\u0130\\u0132\\u0134\\u0136\\u0139\\u013b\\u013d\\u013f\\u0141\\u0143\\u0145\\u0147\\u014a\\u014c\\u014e\\u0150\\u0152\\u0154\\u0156\\u0158\\u015a\\u015c\\u015e\\u0160\\u0162\\u0164\\u0166\\u0168\\u016a\\u016c\\u016e\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017b\\u017d\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018b\\u018e-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019c\\u019d\\u019f\\u01a0\\u01a2\\u01a4\\u01a6\\u01a7\\u01a9\\u01ac\\u01ae\\u01af\\u01b1-\\u01b3\\u01b5\\u01b7\\u01b8\\u01bc\\u01c4\\u01c5\\u01c7\\u01c8\\u01ca\\u01cb\\u01cd\\u01cf\\u01d1\\u01d3\\u01d5\\u01d7\\u01d9\\u01db\\u01de\\u01e0\\u01e2\\u01e4\\u01e6\\u01e8\\u01ea\\u01ec\\u01ee\\u01f1\\u01f2\\u01f4\\u01f6-\\u01f8\\u01fa\\u01fc\\u01fe\\u0200\\u0202\\u0204\\u0206\\u0208\\u020a\\u020c\\u020e\\u0210\\u0212\\u0214\\u0216\\u0218\\u021a\\u021c\\u021e\\u0220\\u0222\\u0224\\u0226\\u0228\\u022a\\u022c\\u022e\\u0230\\u0232\\u023a\\u023b\\u023d\\u023e\\u0241\\u0243-\\u0246\\u0248\\u024a\\u024c\\u024e",Ru=new RegExp("(?:["+bu+"]["+iu+"]*)?(?:["+xu+"]["+iu+"]*)+|(?:["+bu+"]["+iu+"]*)+(?!["+xu+"])|["+uu+"]+|["+Iu+"]|[^"+Cu+Fu+nu+"]+","g"),Pu=/[A-Z\xC0-\xD6\xD8-\xDE]?[a-z\xDF-\xF6\xF8-\xFF]+|[A-Z\xC0-\xD6\xD8-\xDE]+(?![a-z\xDF-\xF6\xF8-\xFF])|\d+/g,Lu=new RegExp("^(?:["+xu+bu+"]["+iu+"]*)+$"),Su=new RegExp("^((?:["+xu+bu+"]["+iu+"]*)|["+uu+"])+$"),Du=/^[\x00-\xFF]*$/,yu=9007199254740991,wu=55296,Ou=56319,Nu=56320,Yu=57343,mu=Array.prototype.reduce;B.prototype.increment=function(){this.index++},B.prototype.incrementOnEmptyPosition=function(u){e(u)&&this.increment()},B.prototype.getIndexByPosition=function(u){return e(u)?this.index:u-1};var Bu=Object.freeze({TYPE_INTEGER:"i",TYPE_INTEGER_BINARY:"b",TYPE_INTEGER_ASCII_CHARACTER:"c",TYPE_INTEGER_DECIMAL:"d",TYPE_INTEGER_OCTAL:"o",TYPE_INTEGER_UNSIGNED_DECIMAL:"u",TYPE_INTEGER_HEXADECIMAL:"x",TYPE_INTEGER_HEXADECIMAL_UPPERCASE:"X",TYPE_FLOAT_SCIENTIFIC:"e",TYPE_FLOAT_SCIENTIFIC_UPPERCASE:"E",TYPE_FLOAT:"f",TYPE_FLOAT_SHORT:"g",TYPE_FLOAT_SHORT_UPPERCASE:"G",TYPE_STRING:"s",LITERAL_PERCENT:"%",LITERAL_SINGLE_QUOTE:"'",LITERAL_PLUS:"+",LITERAL_MINUS:"-",LITERAL_PERCENT_SPECIFIER:"%%",RADIX_BINARY:2,RADIX_OCTAL:8,RADIX_DECIMAL:10,RADIX_HEXADECIMAL:16});J.prototype.isPercentLiteral=function(){return Bu.LITERAL_PERCENT_SPECIFIER===this.percent},J.prototype.getPaddingCharacter=function(){var e=a(this.paddingSpecifier," ");return 2===e.length&&e[0]===Bu.LITERAL_SINGLE_QUOTE&&(e=e[1]),e};var ku={"<":"<",">":">","&":"&",'"':""","'":"'","`":"`"},Gu={"<":/(<)|(�*3c;)|(�*60;)/gi,">":/(>)|(�*3e;)|(�*62;)/gi,"&":/(&)|(�*26;)|(�*38;)/gi,'"':/(")|(�*22;)|(�*34;)/gi,"'":/(�*27;)|(�*39;)/gi,"`":/(�*60;)|(�*96;)/gi},Uu=Object.keys(Gu),ju={3:"Ξξ",8:"Θθ",A:"AÀÁÂÃÄÅĀĂĄǍǞǠǺȀȂȦȺḀẠẢẤẦẨẪẬẮẰẲẴẶⒶⱯAΆΑА",B:"BƁƂɃḂḄḆⒷBΒБ",C:"CÇĆĈĊČƇȻḈⒸꜾCЦ",D:"DĎĐƉƊƋḊḌḎḐḒⒹꝹDÐΔД",E:"EÈÉÊËĒĔĖĘĚƎƐȄȆȨḔḖḘḚḜẸẺẼẾỀỂỄỆⒺEΈΕЕЭ",F:"FƑḞⒻꝻFΦФ",G:"GĜĞĠĢƓǤǦǴḠⒼꝽꝾꞠGΓГҐ",H:"HĤĦȞḢḤḦḨḪⒽⱧⱵꞍHΉΗХ",I:"IÌÍÎÏĨĪĬĮİƗǏȈȊḬḮỈỊⒾIΊΙΪІИ",J:"JĴɈⒿJЙ",K:"KĶƘǨḰḲḴⓀⱩꝀꝂꝄꞢKΚК",L:"LĹĻĽĿŁȽḶḸḺḼⓁⱠⱢꝆꝈꞀLΛЛ",M:"MƜḾṀṂⓂⱮMΜМ",N:"NÑŃŅŇƝǸȠṄṆṈṊⓃꞐꞤNΝН",O:"OÒÓÔÕÖØŌŎŐƆƟƠǑǪǬǾȌȎȪȬȮȰṌṎṐṒỌỎỐỒỔỖỘỚỜỞỠỢⓄꝊꝌOΌΟО",P:"PƤṔṖⓅⱣꝐꝒꝔPΠП",Q:"QɊⓆꝖꝘQ",R:"RŔŖŘȐȒɌṘṚṜṞⓇⱤꝚꞂꞦRΡР",S:"SŚŜŞŠȘṠṢṤṦṨẞⓈⱾꞄꞨSΣС",T:"TŢŤŦƬƮȚȾṪṬṮṰⓉꞆTΤТ",U:"UÙÚÛÜŨŪŬŮŰŲƯǓǕǗǙǛȔȖɄṲṴṶṸṺỤỦỨỪỬỮỰⓊUУЪ",V:"VƲɅṼṾⓋꝞVВ",W:"WŴẀẂẄẆẈⓌⱲWΏΩ",X:"XẊẌⓍXΧ",Y:"YÝŶŸƳȲɎẎỲỴỶỸỾⓎYΎΥΫЫ",Z:"ZŹŻŽƵȤẐẒẔⓏⱫⱿꝢZΖЗ",a:"aàáâãäåāăąǎǟǡǻȁȃȧɐḁẚạảấầẩẫậắằẳẵặⓐⱥaάαа",b:"bƀƃɓḃḅḇⓑbβб",c:"cçćĉċčƈȼḉↄⓒꜿcц",d:"dďđƌɖɗḋḍḏḑḓⓓꝺdðδд",e:"eèéêëēĕėęěǝȅȇȩɇɛḕḗḙḛḝẹẻẽếềểễệⓔeέεеэ",f:"fƒḟⓕꝼfφф",g:"gĝğġģǥǧǵɠᵹḡⓖꝿꞡgγгґ",h:"hĥħȟɥḣḥḧḩḫẖⓗⱨⱶhήηх",i:"iìíîïĩīĭįıǐȉȋɨḭḯỉịⓘiΐίιϊиі",j:"jĵǰɉⓙjй",k:"kķƙǩḱḳḵⓚⱪꝁꝃꝅꞣkκк",l:"lĺļľŀłſƚɫḷḹḻḽⓛⱡꝇꝉꞁlλл",m:"mɯɱḿṁṃⓜmμм",n:"nñńņňʼnƞǹɲṅṇṉṋⓝꞑꞥnνн",o:"oòóôõöøōŏőơǒǫǭǿȍȏȫȭȯȱɔɵṍṏṑṓọỏốồổỗộớờởỡợⓞꝋꝍoοόо",p:"pƥᵽṕṗⓟꝑꝓꝕpπп",q:"qɋⓠꝗꝙq",r:"rŕŗřȑȓɍɽṙṛṝṟⓡꝛꞃꞧrρр",s:"sßśŝşšșȿṡṣṥṧṩẛⓢꞅꞩsςσс",t:"tţťŧƭțʈṫṭṯṱẗⓣⱦꞇtτт",u:"uùúûüũūŭůűųưǔǖǘǚǜȕȗʉṳṵṷṹṻụủứừửữựⓤuуъ",v:"vʋʌṽṿⓥꝟvв",w:"wŵẁẃẅẇẉẘⓦⱳwωώ",x:"xẋẍⓧxχ",y:"yýÿŷƴȳɏẏẙỳỵỷỹỿⓨyΰυϋύы",z:"zźżžƶȥɀẑẓẕⓩⱬꝣzζз",OE:"ŒŒ",oe:"œœ",AE:"ÆǢǼ",ae:"æǣǽ",hv:"ƕ",OI:"Ƣ",oi:"ƣ",DZ:"DŽDZ",Dz:"DžDz",dz:"dždz",LJ:"LJ",Lj:"Lj",lj:"lj",NJ:"NJ",Nj:"Nj",nj:"nj",OU:"Ȣ",ou:"ȣ",TZ:"Ꜩ",tz:"ꜩ",AA:"Ꜳ",aa:"ꜳ",AO:"Ꜵ",ao:"ꜵ",AU:"Ꜷ",au:"ꜷ",AV:"ꜸꜺ",av:"ꜹꜻ",AY:"Ꜽ",ay:"ꜽ",OO:"Ꝏ",oo:"ꝏ",VY:"Ꝡ",vy:"ꝡ",TH:"Þ",th:"þ",PS:"Ψ",ps:"ψ",Yo:"Ё",Ye:"Є",Yi:"Ї",Zh:"Ж",Ch:"Ч",Sh:"ШЩ","":"Ьь",Yu:"Ю",Ya:"Я",zh:"ж",ch:"ч",sh:"шщ",yu:"ю",ya:"я",yo:"ё",ye:"є",yi:"ї"},Hu=null,Xu="width",Mu="newLine",zu="indent",$u="cut",Vu=0,Zu=1,Wu=2,Ju=0,qu=1,Qu=2,Ku=3,en=null,un=We(),nn=un.v,rn="1.1.0",tn={camelCase:s,capitalize:t,decapitalize:E,kebabCase:p,lowerCase:i,snakeCase:l,upperCase:g,count:w,countGraphemes:O,countSubstrings:N,countWhere:Y,countWords:m,escapeHtml:re,escapeRegExp:te,unescapeHtml:ae,sprintf:K,vprintf:ue,indexOf:ce,lastIndexOf:oe,search:fe,charAt:d,codePointAt:x,first:b,graphemeAt:R,last:P,prune:L,slice:S,substr:D,substring:y,truncate:A,insert:se,latinise:ge,pad:he,padLeft:U,padRight:j,repeat:k,replace:ve,replaceAll:_e,reverse:Fe,reverseGrapheme:Ce,slugify:Ie,splice:xe,trim:Pe,trimLeft:be,trimRight:Re,wordWrap:Se,endsWith:De,includes:de,isAlpha:ye,isAlphaDigit:we,isBlank:Oe,isDigit:Ne,isEmpty:Ye,isLowerCase:me,isNumeric:Be,isString:n,isUpperCase:ke,matches:Ge,startsWith:Ue,chars:je,codePoints:He,graphemes:Xe,split:Me,words:o,stripTags:Ze,noConflict:Je,version:rn};qe.prototype.value=function(){return this._wrappedValue},qe.prototype.valueOf=function(){return this.value()},qe.prototype.toJSON=function(){return this.value()},qe.prototype.toString=function(){return String(this.value())},qe.prototype.chain=function(){return new qe(this._wrappedValue,!0)},qe.prototype.thru=function(e){return"function"==typeof e?new qe(e(this._wrappedValue),this._explicitChain):this},qe.prototype._explicitChain=!0,Object.keys(tn).forEach(function(e){qe.prototype[e]=Qe(tn[e])});var an=Object.assign||function(e){for(var u=1;u true\n *\n * v.isString(560);\n * // => false\n */\nexport default function isString(subject) {\n return typeof subject === 'string';\n}","import isNil from 'helper/object/is_nil';\nimport isString from 'query/is_string';\n\n/**\n * Get the string representation of the `value`.\n * Converts the `value` to string.\n * If `value` is `null` or `undefined`, return `defaultValue`.\n *\n * @ignore\n * @function toString\n * @param {*} value The value to convert.\n * @param {*} [defaultValue=''] The default value to return.\n * @return {string|null} Returns the string representation of `value`. Returns `defaultValue` if `value` is\n * `null` or `undefined`.\n */\nexport default function coerceToString(value, defaultValue = '') {\n if (isNil(value)) {\n return defaultValue;\n }\n if (isString(value)) {\n return value;\n }\n return String(value);\n}","import coerceToBoolean from 'helper/boolean/coerce_to_boolean';\nimport coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Converts the first character of `subject` to upper case. If `restToLower` is `true`, convert the rest of\n * `subject` to lower case.\n *\n * @function capitalize\n * @static\n * @since 1.0.0\n * @memberOf Case\n * @param {string} [subject=''] The string to capitalize.\n * @param {boolean} [restToLower=false] Convert the rest of `subject` to lower case.\n * @return {string} Returns the capitalized string.\n * @example\n * v.capitalize('apple');\n * // => 'Apple'\n *\n * v.capitalize('aPPle', true);\n * // => 'Apple'\n */\nexport default function capitalize(subject, restToLower) {\n let subjectString = coerceToString(subject);\n const restToLowerCaseBoolean = coerceToBoolean(restToLower);\n if (subjectString === '') {\n return '';\n }\n if (restToLowerCaseBoolean) {\n subjectString = subjectString.toLowerCase();\n }\n return subjectString.substr(0, 1).toUpperCase() + subjectString.substr(1);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Converts the `subject` to lower case.\n *\n * @function lowerCase\n * @static\n * @since 1.0.0\n * @memberOf Case\n * @param {string} [subject=''] The string to convert to lower case.\n * @return {string} Returns the lower case string.\n * @example\n * v.lowerCase('Green');\n * // => 'green'\n *\n * v.lowerCase('BLUE');\n * // => 'blue'\n */\nexport default function lowerCase(subject) {\n const subjectString = coerceToString(subject, '');\n return subjectString.toLowerCase();\n}\n","/**\n * Verifies if `value` is `undefined` or `null` and returns `defaultValue`. In other case returns `value`.\n *\n * @ignore\n * @function nilDefault\n * @param {*} value The value to verify.\n * @param {*} defaultValue The default value.\n * @return {*} Returns `defaultValue` if `value` is `undefined` or `null`, otherwise `defaultValue`.\n */\nexport default function nilDefault(value, defaultValue) {\n return value == null ? defaultValue : value;\n}","import isNil from 'helper/object/is_nil';\nimport isString from 'query/is_string';\n\n/**\n * Get the string representation of the `value`.\n * Converts the `value` to string.\n *\n * @ignore\n * @function toString\n * @param {*} value The value to convert.\n * @return {string|null} Returns the string representation of `value`.\n */\nexport default function toString(value) {\n if (isNil(value)) {\n return null;\n }\n if (isString(value)) {\n return value;\n }\n return String(value);\n}","import { REGEXP_EXTENDED_ASCII, REGEXP_LATIN_WORD, REGEXP_WORD } from 'helper/reg_exp/const_extended';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport nilDefault from 'helper/undefined/nil_default';\nimport toString from 'helper/string/to_string';\n\n/**\n * Splits `subject` into an array of words.\n *\n * @function words\n * @static\n * @since 1.0.0\n * @memberOf Split\n * @param {string} [subject=''] The string to split into words.\n * @param {string|RegExp} [pattern] The pattern to watch words. If `pattern` is not RegExp, it is transformed to `new RegExp(pattern, flags)`.\n * @param {string} [flags=''] The regular expression flags. Applies when `pattern` is string type.\n * @return {Array} Returns the array of words.\n * @example\n * v.words('gravity can cross dimensions');\n * // => ['gravity', 'can', 'cross', 'dimensions']\n *\n * v.words('GravityCanCrossDimensions');\n * // => ['Gravity', 'Can', 'Cross', 'Dimensions']\n *\n * v.words('Gravity - can cross dimensions!');\n * // => ['Gravity', 'can', 'cross', 'dimensions']\n *\n * v.words('Earth gravity', /[^\\s]+/g);\n * // => ['Earth', 'gravity']\n */\nexport default function words(subject, pattern, flags) {\n const subjectString = coerceToString(subject);\n let patternRegExp;\n if (isNil(pattern)) {\n patternRegExp = REGEXP_EXTENDED_ASCII.test(subjectString) ? REGEXP_LATIN_WORD : REGEXP_WORD;\n } else if (pattern instanceof RegExp) {\n patternRegExp = pattern;\n } else {\n const flagsString = toString(nilDefault(flags, ''));\n patternRegExp = new RegExp(toString(pattern), flagsString);\n }\n return nilDefault(subjectString.match(patternRegExp), []);\n}","import capitalize from 'case/capitalize';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport lowerCase from 'case/lower_case';\nimport words from 'split/words';\n\n/**\n * Transforms the `word` into camel case chunk.\n *\n * @param {string} word The word string\n * @param {number} index The index of the word in phrase.\n * @return {string} The transformed word.\n * @ignore\n */\nfunction wordToCamel(word, index) {\n return index === 0 ? lowerCase(word) : capitalize(word, true);\n}\n\n/**\n * Converts the `subject` to camel case.\n *\n * @function camelCase\n * @static\n * @since 1.0.0\n * @memberOf Case\n * @param {string} [subject=''] The string to convert to camel case.\n * @return {string} The camel case string.\n * @example\n * v.camelCase('bird flight');\n * // => 'birdFlight'\n *\n * v.camelCase('BirdFlight');\n * // => 'birdFlight'\n *\n * v.camelCase('-BIRD-FLIGHT-');\n * // => 'birdFlight'\n */\nexport default function camelCase(subject) {\n const subjectString = coerceToString(subject);\n if (subjectString === '') {\n return '';\n }\n return words(subjectString).map(wordToCamel).join('');\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Converts the first character of `subject` to lower case.\n *\n * @function decapitalize\n * @static\n * @since 1.0.0\n * @memberOf Case\n * @param {string} [subject=''] The string to decapitalize.\n * @return {string} Returns the decapitalized string.\n * @example\n * v.decapitalize('Sun');\n * // => 'sun'\n *\n * v.decapitalize('moon');\n * // => 'moon'\n */\nexport default function decapitalize(subject) {\n const subjectString = coerceToString(subject);\n if (subjectString === '') {\n return subjectString;\n }\n return subjectString.substr(0, 1).toLowerCase() + subjectString.substr(1);\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport lowerCase from 'case/lower_case';\nimport words from 'split/words';\n\n/**\n * Converts the `subject` to kebab case,\n * also called spinal case or lisp case.\n *\n * @function kebabCase\n * @static\n * @since 1.0.0\n * @memberOf Case\n * @param {string} [subject=''] The string to convert to kebab case.\n * @return {string} Returns the kebab case string.\n * @example\n * v.kebabCase('goodbye blue sky');\n * // => 'goodbye-blue-sky'\n *\n * v.kebabCase('GoodbyeBlueSky');\n * // => 'goodbye-blue-sky'\n *\n * v.kebabCase('-Goodbye-Blue-Sky-');\n * // => 'goodbye-blue-sky'\n */\nexport default function kebabCase(subject) {\n const subjectString = coerceToString(subject);\n if (subjectString === '') {\n return '';\n }\n return words(subjectString).map(lowerCase).join('-');\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport lowerCase from 'case/lower_case';\nimport words from 'split/words';\n\n/**\n * Converts the `subject` to snake case.\n *\n * @function snakeCase\n * @static\n * @since 1.0.0\n * @memberOf Case\n * @param {string} [subject=''] The string to convert to snake case.\n * @return {string} Returns the snake case string.\n * @example\n * v.snakeCase('learning to fly');\n * // => 'learning_to_fly'\n *\n * v.snakeCase('LearningToFly');\n * // => 'learning_to_fly'\n *\n * v.snakeCase('-Learning-To-Fly-');\n * // => 'learning_to_fly'\n */\nexport default function snakeCase(subject) {\n const subjectString = coerceToString(subject);\n if (subjectString === '') {\n return '';\n }\n return words(subjectString).map(lowerCase).join('_');\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Converts the `subject` to upper case.\n *\n * @function upperCase\n * @static\n * @since 1.0.0\n * @memberOf Case\n * @param {string} [subject=''] The string to convert to upper case.\n * @return {string} Returns the upper case string.\n * @example\n * v.upperCase('school');\n * // => 'SCHOOL'\n */\nexport default function upperCase(subject) {\n const subjectString = coerceToString(subject);\n return subjectString.toUpperCase();\n}","/**\n * Clip the number to interval `downLimit` to `upLimit`.\n *\n * @ignore\n * @function clipNumber\n * @param {number} value The number to clip\n * @param {number} downLimit The down limit\n * @param {number} upLimit The upper limit\n * @return {number} The clipped number\n */\nexport default function clipNumber(value, downLimit, upLimit) {\n if (value <= downLimit) {\n return downLimit;\n }\n if (value >= upLimit) {\n return upLimit;\n }\n return value;\n}","import { MAX_SAFE_INTEGER } from 'helper/number/const';\n\n/**\n * Transforms `value` to an integer.\n *\n * @ignore\n * @function toInteger\n * @param {number} value The number to transform.\n * @returns {number} Returns the transformed integer.\n */\nexport default function toInteger(value) {\n if (value === Infinity) {\n return MAX_SAFE_INTEGER;\n }\n if (value === -Infinity) {\n return - MAX_SAFE_INTEGER;\n }\n return ~~value;\n}","import clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { MAX_SAFE_INTEGER } from 'helper/number/const';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Truncates `subject` to a new `length`.\n *\n * @function truncate\n * @static\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to truncate.\n * @param {int} length The length to truncate the string.\n * @param {string} [end='...'] The string to be added at the end.\n * @return {string} Returns the truncated string.\n * @example\n * v.truncate('Once upon a time', 7);\n * // => 'Once...'\n *\n * v.truncate('Good day, Little Red Riding Hood', 14, ' (...)');\n * // => 'Good day (...)'\n *\n * v.truncate('Once upon', 10);\n * // => 'Once upon'\n */\nexport default function truncate(subject, length, end) {\n const subjectString = coerceToString(subject);\n const lengthInt = isNil(length) ? subjectString.length : clipNumber(toInteger(length), 0, MAX_SAFE_INTEGER);\n const endString = coerceToString(end, '...');\n if (lengthInt >= subjectString.length) {\n return subjectString;\n }\n return subjectString.substr(0, length - endString.length) + endString;\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Access a character from `subject` at specified `position`.\n *\n * @function charAt\n * @static\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to extract from.\n * @param {numbers} position The position to get the character.\n * @return {string} Returns the character at specified position.\n * @example\n * v.charAt('helicopter', 0);\n * // => 'h'\n *\n * v.charAt('helicopter', 1);\n * // => 'e'\n */\nexport default function charAt(subject, position) {\n const subjectString = coerceToString(subject);\n return subjectString.charAt(position);\n}","const HIGH_SURROGATE_START = 0xD800;\nconst HIGH_SURROGATE_END = 0xDBFF;\nconst LOW_SURROGATE_START = 0xDC00;\nconst LOW_SURROGATE_END = 0xDFFF;\n\n/**\n * Checks if `codePoint` is a high-surrogate number from range 0xD800 to 0xDBFF.\n *\n * @ignore\n * @param {number} codePoint The code point number to be verified\n * @return {boolean} Returns a boolean whether `codePoint` is a high-surrogate number.\n */\nexport function isHighSurrogate(codePoint) {\n return codePoint >= HIGH_SURROGATE_START && codePoint <= HIGH_SURROGATE_END;\n}\n\n/**\n * Checks if `codePoint` is a low-surrogate number from range 0xDC00 to 0xDFFF.\n *\n * @ignore\n * @param {number} codePoint The code point number to be verified\n * @return {boolean} Returns a boolean whether `codePoint` is a low-surrogate number.\n */\nexport function isLowSurrogate(codePoint) {\n return codePoint >= LOW_SURROGATE_START && codePoint <= LOW_SURROGATE_END;\n}\n\n/**\n * Get the astral code point number based on surrogate pair numbers.\n *\n * @ignore\n * @param {number} highSurrogate The high-surrogate code point number.\n * @param {number} lowSurrogate The low-surrogate code point number.\n * @return {number} Returns the astral symbol number.\n */\nexport function getAstralNumberFromSurrogatePair(highSurrogate, lowSurrogate) {\n return (highSurrogate - HIGH_SURROGATE_START) * 0x400 + lowSurrogate - LOW_SURROGATE_START + 0x10000;\n}","import isNil from 'helper/object/is_nil';\n\n/**\n * Get the number representation of the `value`.\n * Converts the `value` to number.\n * If `value` is `null` or `undefined`, return `defaultValue`.\n *\n * @ignore\n * @function toString\n * @param {*} value The value to convert.\n * @param {*} [defaultValue=''] The default value to return.\n * @return {number|null} Returns the number representation of `value`. Returns `defaultValue` if `value` is\n * `null` or `undefined`.\n */\nexport default function coerceToNumber(value, defaultValue = 0) {\n if (isNil(value)) {\n return defaultValue;\n }\n if (typeof value === 'number') {\n return value;\n }\n return Number(value);\n}","/**\n * If `value` is `NaN`, return `defaultValue`. In other case returns `value`.\n *\n * @ignore\n * @function nanDefault\n * @param {*} value The value to verify.\n * @param {*} defaultValue The default value.\n * @return {*} Returns `defaultValue` if `value` is `NaN`, otherwise `defaultValue`.\n */\nexport default function nanDefault(value, defaultValue) {\n return value !== value ? defaultValue : value;\n}","import { getAstralNumberFromSurrogatePair, isHighSurrogate, isLowSurrogate } from 'helper/string/surrogate_pair';\nimport coerceToNumber from 'helper/number/coerce_to_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport nanDefault from 'helper/number/nan_default';\n\n/**\n * Get the Unicode code point value of the character at `position`.
\n * If a valid UTF-16 \n * surrogate pair starts at `position`, the\n * astral code point\n * value at `position` is returned.\n *\n * @function codePointAt\n * @static\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to extract from.\n * @param {number} position The position to get the code point number.\n * @return {number} Returns a non-negative number less than or equal to `0x10FFFF`.\n * @example\n * v.codePointAt('rain', 1);\n * // => 97, or 0x0061\n *\n * v.codePointAt('\\uD83D\\uDE00 is smile', 0); // or '😀 is smile'\n * // => 128512, or 0x1F600\n */\nexport default function codePointAt(subject, position) {\n const subjectString = coerceToString(subject);\n const subjectStringLength = subjectString.length;\n let positionNumber = coerceToNumber(position);\n positionNumber = nanDefault(positionNumber, 0);\n if (positionNumber < 0 || positionNumber >= subjectStringLength) {\n return undefined;\n }\n const firstCodePoint = subjectString.charCodeAt(positionNumber);\n let secondCodePoint;\n if (isHighSurrogate(firstCodePoint) && subjectStringLength > positionNumber + 1) {\n secondCodePoint = subjectString.charCodeAt(positionNumber + 1);\n if (isLowSurrogate(secondCodePoint)) {\n return getAstralNumberFromSurrogatePair(firstCodePoint, secondCodePoint);\n }\n }\n return firstCodePoint;\n}","import clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { MAX_SAFE_INTEGER } from 'helper/number/const';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Extracts the first `length` characters from `subject`.\n *\n * @function first\n * @static\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to extract from.\n * @param {int} [length=1] The number of characters to extract.\n * @return {string} Returns the first characters string.\n * @example\n * v.first('helicopter');\n * // => 'h'\n *\n * v.first('vehicle', 2);\n * // => 've'\n *\n * v.first('car', 5);\n * // => 'car'\n */\nexport default function first(subject, length) {\n const subjectString = coerceToString(subject);\n const lengthInt = isNil(length) ? 1 : clipNumber(toInteger(length), 0, MAX_SAFE_INTEGER);\n if (subjectString.length <= lengthInt) {\n return subjectString;\n }\n return subjectString.substr(0, lengthInt);\n}","import coerceToNumber from 'helper/number/coerce_to_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport nanDefault from 'helper/number/nan_default';\nimport { REGEXP_UNICODE_CHARACTER } from 'helper/reg_exp/const';\n\n/**\n * Get a grapheme from `subject` at specified `position` taking care of\n * surrogate pairs and\n * combining marks.\n *\n * @function graphemeAt\n * @static\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to extract from.\n * @param {number} position The position to get the grapheme.\n * @return {string} Returns the grapheme at specified position.\n * @example\n * v.graphemeAt('\\uD835\\uDC00\\uD835\\uDC01', 0); // or '𝐀𝐁'\n * // => 'A'\n *\n * v.graphemeAt('cafe\\u0301', 3); // or 'café'\n * // => 'é'\n */\nexport default function graphemeAt(subject, position) {\n const subjectString = coerceToString(subject);\n let positionNumber = coerceToNumber(position);\n let graphemeMatch;\n let graphemeMatchIndex = 0;\n positionNumber = nanDefault(positionNumber, 0);\n while ((graphemeMatch = REGEXP_UNICODE_CHARACTER.exec(subjectString)) !== null) {\n if (graphemeMatchIndex === positionNumber) {\n REGEXP_UNICODE_CHARACTER.lastIndex = 0;\n return graphemeMatch[0];\n }\n graphemeMatchIndex++;\n }\n return '';\n}","import clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { MAX_SAFE_INTEGER } from 'helper/number/const';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Extracts the last `length` characters from `subject`.\n *\n * @function last\n * @static\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to extract from.\n * @param {int} [length=1] The number of characters to extract.\n * @return {string} Returns the last characters string.\n * @example\n * v.last('helicopter');\n * // => 'r'\n *\n * v.last('vehicle', 2);\n * // => 'le'\n *\n * v.last('car', 5);\n * // => 'car'\n */\nexport default function last(subject, length) {\n const subjectString = coerceToString(subject);\n const lengthInt = isNil(length) ? 1 : clipNumber(toInteger(length), 0, MAX_SAFE_INTEGER);\n if (subjectString.length <= lengthInt) {\n return subjectString;\n }\n return subjectString.substr(subjectString.length - lengthInt, lengthInt);\n}","import { REGEXP_EXTENDED_ASCII, REGEXP_LATIN_WORD, REGEXP_WORD } from 'helper/reg_exp/const_extended';\nimport clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { MAX_SAFE_INTEGER } from 'helper/number/const';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Truncates `subject` to a new `length` and does not break the words. Guarantees that the truncated string is no longer\n * than `length`.\n *\n * @static\n * @function prune\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to prune.\n * @param {int} length The length to prune the string.\n * @param {string} [end='...'] The string to be added at the end.\n * @return {string} Returns the pruned string.\n * @example\n * v.prune('Once upon a time', 7);\n * // => 'Once...'\n *\n * v.prune('Good day, Little Red Riding Hood', 16, ' (more)');\n * // => 'Good day (more)'\n *\n * v.prune('Once upon', 10);\n * // => 'Once upon'\n */\nexport default function prune(subject, length, end) {\n const subjectString = coerceToString(subject);\n const lengthInt = isNil(length) ? subjectString.length : clipNumber(toInteger(length), 0, MAX_SAFE_INTEGER);\n const endString = coerceToString(end, '...');\n if (lengthInt >= subjectString.length) {\n return subjectString;\n }\n const pattern = REGEXP_EXTENDED_ASCII.test(subjectString) ? REGEXP_LATIN_WORD : REGEXP_WORD;\n let truncatedLength = 0;\n subjectString.replace(pattern, function(word, offset) {\n const wordInsertLength = offset + word.length;\n if (wordInsertLength <= lengthInt - endString.length) {\n truncatedLength = wordInsertLength;\n }\n });\n return subjectString.substr(0, truncatedLength) + endString;\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Extracts from `subject` a string from `start` position up to `end` position. The character at `end` position is not\n * included.\n *\n * @function slice\n * @static\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to extract from.\n * @param {number} start The position to start extraction. If negative use `subject.length + start`.\n * @param {number} [end=subject.length] The position to end extraction. If negative use `subject.length + end`.\n * @return {string} Returns the extracted string.\n * @note Uses native `String.prototype.slice()`\n * @example\n * v.slice('miami', 1);\n * // => 'iami'\n *\n * v.slice('florida', -4);\n * // => 'rida'\n *\n * v.slice('florida', 1, 4);\n * // => \"lor\"\n */\nexport default function slice(subject, start, end) {\n return coerceToString(subject).slice(start, end);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Extracts from `subject` a string from `start` position a number of `length` characters.\n *\n * @function substr\n * @static\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to extract from.\n * @param {number} start The position to start extraction.\n * @param {number} [length=subject.endOfString] The number of characters to extract. If omitted, extract to the end of `subject`.\n * @return {string} Returns the extracted string.\n * @note Uses native `String.prototype.substr()`\n * @example\n * v.substr('infinite loop', 9);\n * // => 'loop'\n *\n * v.substr('dreams', 2, 2);\n * // => 'ea'\n */\nexport default function substr(subject, start, length) {\n return coerceToString(subject).substr(start, length);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Extracts from `subject` a string from `start` position up to `end` position. The character at `end` position is not\n * included.\n *\n * @function substring\n * @static\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to extract from.\n * @param {number} start The position to start extraction.\n * @param {number} [end=subject.length] The position to end extraction.\n * @return {string} Returns the extracted string.\n * @note Uses native `String.prototype.substring()`\n * @example\n * v.substring('beach', 1);\n * // => 'each'\n *\n * v.substring('ocean', 1, 3);\n * // => 'ea'\n */\nexport default function substring(subject, start, end) {\n return coerceToString(subject).substring(start, end);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Counts the characters in `subject`.
\n *\n * @function count\n * @static\n * @since 1.0.0\n * @memberOf Count\n * @param {string} [subject=''] The string to count characters.\n * @return {number} Returns the number of characters in `subject`.\n * @example\n * v.count('rain');\n * // => 4\n */\nexport default function count(subject) {\n return coerceToString(subject).length;\n}","import { REGEXP_COMBINING_MARKS, REGEXP_SURROGATE_PAIRS } from 'helper/reg_exp/const';\nimport coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Counts the graphemes in `subject` taking care of\n * surrogate pairs and\n * combining marks.\n *\n * @function countGraphemes\n * @static\n * @since 1.0.0\n * @memberOf Count\n * @param {string} [subject=''] The string to count graphemes.\n * @return {number} Returns the number of graphemes in `subject`.\n * @example\n * v.countGraphemes('cafe\\u0301'); // or 'café'\n * // => 4\n *\n * v.countGraphemes('\\uD835\\uDC00\\uD835\\uDC01'); // or '𝐀𝐁'\n * // => 2\n *\n * v.countGraphemes('rain');\n * // => 4\n */\nexport default function countGrapheme(subject) {\n return coerceToString(subject)\n .replace(REGEXP_COMBINING_MARKS, '*')\n .replace(REGEXP_SURROGATE_PAIRS, '*')\n .length;\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Counts the number of `substring` appearances in `subject`.\n *\n * @function countSubstrings\n * @static\n * @since 1.0.0\n * @memberOf Count\n * @param {string} [subject=''] The string where to count.\n * @param {string} substring The substring to be counted.\n * @return {number} Returns the number of `substring` appearances.\n * @example\n * v.countSubstrings('bad boys, bad boys whatcha gonna do?', 'boys');\n * // => 2\n *\n * v.countSubstrings('every dog has its day', 'cat');\n * // => 0\n */\nexport default function countSubstrings(subject, substring) {\n const subjectString = coerceToString(subject);\n const substringString = coerceToString(substring);\n const substringLength = substringString.length;\n let count = 0;\n let matchIndex = 0;\n if (subjectString === '' || substringString === '') {\n return count;\n }\n do {\n matchIndex = subjectString.indexOf(substringString, matchIndex);\n if (matchIndex !== -1) {\n count++;\n matchIndex += substringLength;\n }\n } while (matchIndex !== -1);\n return count;\n}","import coerceToString from 'helper/string/coerce_to_string';\n\nconst reduce = Array.prototype.reduce;\n\n/**\n * Counts the characters in `subject` for which `predicate` returns truthy.\n *\n * @function countWhere\n * @static\n * @since 1.0.0\n * @memberOf Count\n * @param {string} [subject=''] The string to count characters.\n * @param {Function} predicate The predicate function invoked on each character with parameters `(character, index, string)`.\n * @param {Object} [context] The context to invoke the `predicate`.\n * @return {number} Returns the number of characters for which `predicate` returns truthy.\n * @example\n * v.countWhere('hola!', v.isAlpha);\n * // => 4\n *\n * v.countWhere('2022', function(character, index, str) {\n * return character === '2';\n * });\n * // => 3\n */\nexport default function countWhere(subject, predicate, context) {\n const subjectString = coerceToString(subject);\n if (subjectString === '' || typeof predicate !== 'function') {\n return 0;\n }\n const predicateWithContext = predicate.bind(context);\n return reduce.call(subjectString, function(countTruthy, character, index) {\n return predicateWithContext(character, index, subjectString) ? countTruthy + 1 : countTruthy;\n }, 0);\n}","import words from 'split/words';\n\n/**\n * Counts the number of words in `subject`.\n *\n * @function countWords\n * @static\n * @since 1.0.0\n * @memberOf Count\n * @param {string} [subject=''] The string to split into words.\n * @param {string|RegExp} [pattern] The pattern to watch words. If `pattern` is not RegExp, it is transformed to `new RegExp(pattern, flags)`.\n * @param {string} [flags=''] The regular expression flags. Applies when `pattern` is string type.\n * @return {number} Returns the number of words.\n * @example\n * v.countWords('gravity can cross dimensions');\n * // => 4\n *\n * v.countWords('GravityCanCrossDimensions');\n * // => 4\n *\n * v.countWords('Gravity - can cross dimensions!');\n * // => 4\n *\n * v.words('Earth gravity', /[^\\s]+/g);\n * // => 2\n */\nexport default function countWords(subject, pattern, flags) {\n return words(subject, pattern, flags).length;\n}","import isNil from 'helper/object/is_nil';\n\n/**\n * The current index.\n *\n * @ignore\n * @name ReplacementIndex#index\n * @type {number}\n * @return {ReplacementIndex} ReplacementIndex instance.\n */\nfunction ReplacementIndex() {\n this.index = 0;\n}\n\n/**\n * Increment the current index.\n *\n * @ignore\n * @return {undefined}\n */\nReplacementIndex.prototype.increment = function() {\n this.index++;\n};\n\n/**\n * Increment the current index by position.\n *\n * @ignore\n * @param {number} [position] The replacement position.\n * @return {undefined}\n */\nReplacementIndex.prototype.incrementOnEmptyPosition = function(position) {\n if (isNil(position)) {\n this.increment();\n }\n};\n\n/**\n * Get the replacement index by position.\n *\n * @ignore\n * @param {number} [position] The replacement position.\n * @return {number} The replacement index.\n */\nReplacementIndex.prototype.getIndexByPosition = function(position) {\n return isNil(position) ? this.index : position - 1;\n};\n\nexport default ReplacementIndex;","import clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { MAX_SAFE_INTEGER } from 'helper/number/const';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Repeats the `subject` number of `times`.\n *\n * @function repeat\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to repeat.\n * @param {number} [times=1] The number of times to repeat.\n * @return {string} Returns the repeated string.\n * @example\n * v.repeat('w', 3);\n * // => 'www'\n *\n * v.repeat('world', 0);\n * // => ''\n */\nexport default function repeat(subject, times) {\n let subjectString = coerceToString(subject);\n let timesInt = isNil(times) ? 1 : clipNumber(toInteger(times), 0, MAX_SAFE_INTEGER);\n let repeatString = '';\n while (timesInt) {\n if (timesInt & 1) {\n repeatString += subjectString;\n }\n if (timesInt > 1) {\n subjectString += subjectString;\n }\n timesInt >>= 1;\n }\n return repeatString;\n}","import repeat from 'manipulate/repeat';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Creates the padding string.\n *\n * @ignore\n * @param {string} padCharacters The characters to create padding string.\n * @param {number} length The padding string length.\n * @return {string} The padding string.\n */\nexport default function buildPadding(padCharacters, length) {\n const padStringRepeat = toInteger(length / padCharacters.length);\n const padStringRest = length % padCharacters.length;\n return repeat(padCharacters, padStringRepeat + padStringRest).substr(0, length);\n}","import buildPadding from 'helper/string/build_padding';\nimport clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { MAX_SAFE_INTEGER } from 'helper/number/const';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Pads `subject` from left to a new `length`.\n *\n * @function padLeft\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to pad.\n * @param {int} [length=0] The length to left pad the string. No changes are made if `length` is less than `subject.length`.\n * @param {string} [pad=' '] The string to be used for padding.\n * @return {string} Returns the left padded string.\n * @example\n * v.padLeft('dog', 5);\n * // => ' dog'\n *\n * v.padLeft('bird', 6, '-');\n * // => '--bird'\n *\n * v.padLeft('cat', 6, '-=');\n * // => '-=-cat'\n */\nexport default function padLeft(subject, length, pad) {\n const subjectString = coerceToString(subject);\n const lengthInt = isNil(length) ? 0 : clipNumber(toInteger(length), 0, MAX_SAFE_INTEGER);\n const padString = coerceToString(pad, ' ');\n if (lengthInt <= subjectString.length) {\n return subjectString;\n }\n return buildPadding(padString, lengthInt - subjectString.length) + subjectString;\n}","import buildPadding from 'helper/string/build_padding';\nimport clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { MAX_SAFE_INTEGER } from 'helper/number/const';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Pads `subject` from right to a new `length`.\n *\n * @function padRight\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to pad.\n * @param {int} [length=0] The length to right pad the string. No changes are made if `length` is less than `subject.length`.\n * @param {string} [pad=' '] The string to be used for padding.\n * @return {string} Returns the right padded string.\n * @example\n * v.padRight('dog', 5);\n * // => 'dog '\n *\n * v.padRight('bird', 6, '-');\n * // => 'bird--'\n *\n * v.padRight('cat', 6, '-=');\n * // => 'cat-=-'\n */\nexport default function padRight(subject, length, pad) {\n const subjectString = coerceToString(subject);\n const lengthInt = isNil(length) ? 0 : clipNumber(toInteger(length), 0, MAX_SAFE_INTEGER);\n const padString = coerceToString(pad, ' ');\n if (lengthInt <= subjectString.length) {\n return subjectString;\n }\n return subjectString + buildPadding(padString, lengthInt - subjectString.length);\n}","import Const from 'helper/format/const';\nimport isNil from 'helper/object/is_nil';\nimport padLeft from 'manipulate/pad_left';\nimport padRight from 'manipulate/pad_right';\n\n/**\n * Aligns and pads `subject` string.\n *\n * @ignore\n * @param {string} subject The subject string.\n * @param {ConversionSpecification} conversion The conversion specification object.\n * @return {string} Returns the aligned and padded string.\n */\nexport default function alignAndPad(subject, conversion) {\n const width = conversion.width;\n if (isNil(width) || subject.length >= width) {\n return subject;\n }\n const padType = conversion.alignmentSpecifier === Const.LITERAL_MINUS ? padRight : padLeft;\n return padType(subject, width, conversion.getPaddingCharacter());\n}","import Const from 'helper/format/const';\n\n/**\n * Add sign to the formatted number.\n *\n * @ignore\n * @name addSignToFormattedNumber\n * @param {number} replacementNumber The number to be replaced.\n * @param {string} formattedReplacement The formatted version of number.\n * @param {ConversionSpecification} conversion The conversion specification object.\n * @return {string} Returns the formatted number string with a sign.\n */\nexport default function addSignToFormattedNumber(replacementNumber, formattedReplacement, conversion) {\n if (conversion.signSpecifier === Const.LITERAL_PLUS && replacementNumber >= 0) {\n formattedReplacement = Const.LITERAL_PLUS + formattedReplacement;\n }\n return formattedReplacement;\n}","import addSignToFormattedNumber from 'helper/format/type_format/add_sign_to_formatted_number';\nimport coerceToNumber from 'helper/number/coerce_to_number';\nimport Const from 'helper/format/const';\nimport { REGEXP_TRAILING_ZEROS } from 'helper/reg_exp/const';\nimport toString from 'helper/string/coerce_to_string';\n\n/**\n * Formats a float type according to specifiers.\n *\n * @ignore\n * @param {string} replacement The string to be formatted.\n * @param {ConversionSpecification} conversion The conversion specification object.\n * @return {string} Returns the formatted string.\n */\n\nexport default function float(replacement, conversion) {\n let replacementNumber = parseFloat(replacement);\n let formattedReplacement;\n if (isNaN(replacementNumber)) {\n replacementNumber = 0;\n }\n const precision = coerceToNumber(conversion.precision, 6);\n switch (conversion.typeSpecifier) {\n case Const.TYPE_FLOAT:\n formattedReplacement = replacementNumber.toFixed(precision);\n break;\n case Const.TYPE_FLOAT_SCIENTIFIC:\n formattedReplacement = replacementNumber.toExponential(precision);\n break;\n case Const.TYPE_FLOAT_SCIENTIFIC_UPPERCASE:\n formattedReplacement = replacementNumber.toExponential(precision).toUpperCase();\n break;\n case Const.TYPE_FLOAT_SHORT:\n case Const.TYPE_FLOAT_SHORT_UPPERCASE:\n formattedReplacement = formatFloatAsShort(replacementNumber, precision, conversion);\n break;\n }\n formattedReplacement = addSignToFormattedNumber(replacementNumber, formattedReplacement, conversion);\n return toString(formattedReplacement);\n}\n\n/**\n * Formats the short float.\n *\n * @ignore\n * @param {number} replacementNumber The number to format.\n * @param {number} precision The precision to format the float.\n * @param {ConversionSpecification} conversion The conversion specification object.\n * @return {string} Returns the formatted short float.\n */\nfunction formatFloatAsShort(replacementNumber, precision, conversion) {\n if (replacementNumber === 0) {\n return '0';\n }\n const nonZeroPrecision = precision === 0 ? 1 : precision;\n let formattedReplacement = replacementNumber\n .toPrecision(nonZeroPrecision)\n .replace(REGEXP_TRAILING_ZEROS, '');\n if (conversion.typeSpecifier === Const.TYPE_FLOAT_SHORT_UPPERCASE) {\n formattedReplacement = formattedReplacement.toUpperCase();\n }\n return formattedReplacement;\n}","import Const from 'helper/format/const';\nimport toString from 'helper/string/coerce_to_string';\n\n/**\n * Formats an integer type according to specifiers.\n *\n * @ignore\n * @param {string} replacement The string to be formatted.\n * @param {ConversionSpecification} conversion The conversion specification object.\n * @return {string} Returns the formatted string.\n */\n\nexport default function integerBase(replacement, conversion) {\n let integer = parseInt(replacement);\n if (isNaN(integer)) {\n integer = 0;\n }\n integer = integer >>> 0;\n switch (conversion.typeSpecifier) {\n case Const.TYPE_INTEGER_ASCII_CHARACTER:\n integer = String.fromCharCode(integer);\n break;\n case Const.TYPE_INTEGER_BINARY:\n integer = integer.toString(Const.RADIX_BINARY);\n break;\n case Const.TYPE_INTEGER_OCTAL:\n integer = integer.toString(Const.RADIX_OCTAL);\n break;\n case Const.TYPE_INTEGER_HEXADECIMAL:\n integer = integer.toString(Const.RADIX_HEXADECIMAL);\n break;\n case Const.TYPE_INTEGER_HEXADECIMAL_UPPERCASE:\n integer = integer.toString(Const.RADIX_HEXADECIMAL).toUpperCase();\n break;\n }\n return toString(integer);\n}","import addSignToFormattedNumber from 'helper/format/type_format/add_sign_to_formatted_number';\nimport toString from 'helper/string/to_string';\n\n/**\n * Formats a decimal integer type according to specifiers.\n *\n * @ignore\n * @param {string} replacement The string to be formatted.\n * @param {ConversionSpecification} conversion The conversion specification object.\n * @return {string} Returns the formatted string.\n */\n\nexport default function integerDecimal(replacement, conversion) {\n let integer = parseInt(replacement);\n if (isNaN(integer)) {\n integer = 0;\n }\n return addSignToFormattedNumber(integer, toString(integer), conversion);\n}","import isNil from 'helper/object/is_nil';\nimport truncate from 'chop/truncate';\n\n/**\n * Formats a string type according to specifiers.\n *\n * @ignore\n * @param {string} replacement The string to be formatted.\n * @param {ConversionSpecification} conversion The conversion specification object.\n * @return {string} Returns the formatted string.\n */\nexport default function stringFormat(replacement, conversion) {\n let formattedReplacement = replacement;\n const precision = conversion.precision;\n if (!isNil(precision) && formattedReplacement.length > precision) {\n formattedReplacement = truncate(formattedReplacement, precision, '');\n }\n return formattedReplacement;\n}","import alignAndPad from 'helper/format/align_and_pad';\nimport Const from 'helper/format/const';\nimport formatFloat from 'helper/format/type_format/float';\nimport formatIntegerBase from 'helper/format/type_format/integer_base';\nimport formatIntegerDecimal from 'helper/format/type_format/integer_decimal';\nimport formatString from 'helper/format/type_format/string';\n\n/**\n * Returns the computed string based on format specifiers.\n *\n * @ignore\n * @name computeReplacement\n * @param {string} replacement The replacement value.\n * @param {ConversionSpecification} conversion The conversion specification object.\n * @return {string} Returns the computed string.\n */\nexport default function compute(replacement, conversion) {\n let formatFunction;\n switch (conversion.typeSpecifier) {\n case Const.TYPE_STRING:\n formatFunction = formatString;\n break;\n case Const.TYPE_INTEGER_DECIMAL:\n case Const.TYPE_INTEGER:\n formatFunction = formatIntegerDecimal;\n break;\n case Const.TYPE_INTEGER_ASCII_CHARACTER:\n case Const.TYPE_INTEGER_BINARY:\n case Const.TYPE_INTEGER_OCTAL:\n case Const.TYPE_INTEGER_HEXADECIMAL:\n case Const.TYPE_INTEGER_HEXADECIMAL_UPPERCASE:\n case Const.TYPE_INTEGER_UNSIGNED_DECIMAL:\n formatFunction = formatIntegerBase;\n break;\n case Const.TYPE_FLOAT:\n case Const.TYPE_FLOAT_SCIENTIFIC:\n case Const.TYPE_FLOAT_SCIENTIFIC_UPPERCASE:\n case Const.TYPE_FLOAT_SHORT:\n case Const.TYPE_FLOAT_SHORT_UPPERCASE:\n formatFunction = formatFloat;\n break;\n }\n const formattedString = formatFunction(replacement, conversion);\n return alignAndPad(formattedString, conversion);\n}","import Const from 'helper/format/const';\nimport nilDefault from 'helper/undefined/nil_default';\n\n/**\n * Construct the new conversion specification object.\n *\n * @ignore\n * @param {Object} properties An object with properties to initialize.\n * @return {ConversionSpecification} ConversionSpecification instance.\n */\nfunction ConversionSpecification(properties) {\n\n /**\n * The percent characters from conversion specification.\n *\n * @ignore\n * @name ConversionSpecification#percent\n * @type {string}\n */\n this.percent = properties.percent;\n\n /**\n * The sign specifier to force a sign to be used on a number.\n *\n * @ignore\n * @name ConversionSpecification#signSpecifier\n * @type {string}\n */\n this.signSpecifier = properties.signSpecifier;\n\n /**\n * The padding specifier that says what padding character will be used.\n *\n * @ignore\n * @name ConversionSpecification#paddingSpecifier\n * @type {string}\n */\n this.paddingSpecifier = properties.paddingSpecifier;\n\n /**\n * The alignment specifier that says if the result should be left-justified or right-justified.\n *\n * @ignore\n * @name ConversionSpecification#alignmentSpecifier\n * @type {string}\n */\n this.alignmentSpecifier = properties.alignmentSpecifier;\n\n /**\n * The width specifier how many characters this conversion should result in.\n *\n * @ignore\n * @name ConversionSpecification#width\n * @type {number}\n */\n this.width = properties.width;\n\n /**\n * The precision specifier says how many decimal digits should be displayed for floating-point numbers.\n *\n * @ignore\n * @name ConversionSpecification#precision\n * @type {number}\n */\n this.precision = properties.precision;\n\n /**\n * The type specifier says what type the argument data should be treated as.\n *\n * @ignore\n * @name ConversionSpecification#typeSpecifier\n * @type {string}\n */\n this.typeSpecifier = properties.typeSpecifier;\n}\n\n\n/**\n * Check if the conversion specification is a percent literal \"%%\".\n *\n * @ignore\n * @return {boolean} Returns true if the conversion is a percent literal, false otherwise.\n */\nConversionSpecification.prototype.isPercentLiteral = function() {\n return Const.LITERAL_PERCENT_SPECIFIER === this.percent;\n};\n\n/**\n * Get the padding character from padding specifier.\n *\n * @ignore\n * @returns {string} Returns the padding character.\n */\nConversionSpecification.prototype.getPaddingCharacter = function() {\n let paddingCharacter = nilDefault(this.paddingSpecifier, ' ');\n if (paddingCharacter.length === 2 && paddingCharacter[0] === Const.LITERAL_SINGLE_QUOTE) {\n paddingCharacter = paddingCharacter[1];\n }\n return paddingCharacter;\n};\n\nexport default ConversionSpecification;","import isNil from 'helper/object/is_nil';\n\n/**\n * Validates the specifier type and replacement position.\n *\n * @ignore\n * @throws {Error} Throws an exception on insufficient arguments or unknown specifier.\n * @param {number} index The index of the matched specifier.\n * @param {number} replacementsLength The number of replacements.\n * @param {ConversionSpecification} conversion The conversion specification object.\n * @return {undefined}\n */\nexport default function validate(index, replacementsLength, conversion) {\n if (isNil(conversion.typeSpecifier)) {\n throw new Error('sprintf(): Unknown type specifier');\n }\n if (index > replacementsLength - 1) {\n throw new Error('sprintf(): Too few arguments');\n }\n if (index < 0) {\n throw new Error('sprintf(): Argument number must be greater than zero');\n }\n}","import coerceToNumber from 'helper/number/coerce_to_number';\nimport computeReplacement from 'helper/format/replacement/compute';\nimport ConversionSpecification from 'helper/format/conversion_specification';\nimport validateReplacement from 'helper/format/replacement/validate';\n\n/**\n * Return the replacement for regular expression match of the conversion specification.\n *\n * @ignore\n * @name matchReplacement\n * @param {ReplacementIndex} replacementIndex The replacement index object.\n * @param {string[]} replacements The array of replacements.\n * @param {string} conversionSpecification The conversion specification.\n * @param {string} percent The percent characters from conversion specification.\n * @param {string} position The position to insert the replacement.\n * @param {string} signSpecifier The sign specifier to force a sign to be used on a number.\n * @param {string} paddingSpecifier The padding specifier that says what padding character will be used.\n * @param {string} alignmentSpecifier The alignment specifier that says if the result should be left-justified or right-justified.\n * @param {string} widthSpecifier The width specifier how many characters this conversion should result in.\n * @param {string} precisionSpecifier The precision specifier says how many decimal digits should be displayed for floating-point numbers.\n * @param {string} typeSpecifier The type specifier says what type the argument data should be treated as.\n * @return {string} Returns the computed replacement.\n */\nexport default function match(replacementIndex, replacements, conversionSpecification, percent, position, signSpecifier,\n paddingSpecifier, alignmentSpecifier, widthSpecifier, precisionSpecifier, typeSpecifier) {\n const conversion = new ConversionSpecification({\n percent,\n signSpecifier,\n paddingSpecifier,\n alignmentSpecifier,\n width: coerceToNumber(widthSpecifier, null),\n precision: coerceToNumber(precisionSpecifier, null),\n typeSpecifier\n });\n if (conversion.isPercentLiteral()) {\n return conversionSpecification.slice(1);\n }\n const actualReplacementIndex = replacementIndex.getIndexByPosition(position);\n replacementIndex.incrementOnEmptyPosition(position);\n validateReplacement(actualReplacementIndex, replacements.length, conversion);\n return computeReplacement(replacements[actualReplacementIndex], conversion);\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport { REGEXP_CONVERSION_SPECIFICATION } from 'helper/reg_exp/const';\nimport ReplacementIndex from 'helper/format/replacement/index';\nimport replacementMatch from 'helper/format/replacement/match';\n\n/**\n * Produces a string according to `format`.\n *\n *
\n * `format` string is composed of zero or more directives: ordinary characters (not %), which are copied unchanged\n * to the output string and conversion specifications, each of which results in fetching zero or more subsequent\n * arguments.

\n *\n * Each conversion specification is introduced by the character %, and ends with a conversion\n * specifier. In between there may be (in this order) zero or more flags, an optional minimum field width\n * and an optional precision.
\n * The syntax is: ConversionSpecification = \"%\" { Flags }\n * [ MinimumFieldWidth ] [ Precision ] ConversionSpecifier, where curly braces { } denote repetition\n * and square brackets [ ] optionality.

\n *\n * By default, the arguments are used in the given order.
\n * For argument numbering and swapping, `%m$` (where `m` is a number indicating the argument order)\n * is used instead of `%` to specify explicitly which argument is taken. For instance `%1$s` fetches the 1st argument,\n * `%2$s` the 2nd and so on, no matter what position the conversion specification has in `format`.\n *

\n *\n * The flags
\n * The character % is followed by zero or more of the following flags:
\n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n *
+\n * A sign (+ or -) should always be placed before a number produced by a\n * signed conversion. By default a sign is used only for negative numbers.\n *
0The value should be zero padded.
(a space) The value should be space padded.
'Indicates alternate padding character, specified by prefixing it with a single quote '.
-The converted value is to be left adjusted on the field boundary (the default is right justification).
\n *\n * The minimum field width
\n * An optional decimal digit string (with nonzero first digit) specifying a minimum field width. If the converted\n * value has fewer characters than the field width, it will be padded with spaces on the left (or right, if the\n * left-adjustment flag has been given).

\n *\n * The precision
\n * An optional precision, in the form of a period `.` followed by an optional decimal digit string.
\n * This gives the number of digits to appear after the radix character for `e`, `E`, `f` and `F` conversions, the\n * maximum number of significant digits for `g` and `G` conversions or the maximum number of characters to be printed\n * from a string for `s` conversion.

\n *\n * The conversion specifier
\n * A specifier that mentions what type the argument should be treated as:\n *\n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n *\n *
`s`The string argument is treated as and presented as a string.
`d` `i`The integer argument is converted to signed decimal notation.
`b`The unsigned integer argument is converted to unsigned binary.
`c`The unsigned integer argument is converted to an ASCII character with that number.
`o`The unsigned integer argument is converted to unsigned octal.
`u`The unsigned integer argument is converted to unsigned decimal.
`x` `X`The unsigned integer argument is converted to unsigned hexadecimal. The letters `abcdef` are used for `x`\n * conversions; the letters `ABCDEF` are used for `X` conversions.
`f`\n * The float argument is rounded and converted to decimal notation in the style `[-]ddd.ddd`, where the number of\n * digits after the decimal-point character is equal to the precision specification. If the precision is missing,\n * it is taken as 6; if the precision is explicitly zero, no decimal-point character appears.\n * If a decimal point appears, at least one digit appears before it.\n *
`e` `E`\n * The float argument is rounded and converted in the style `[-]d.ddde±dd`, where there is one digit\n * before the decimal-point character and the number of digits after it is equal to the precision. If\n * the precision is missing, it is taken as `6`; if the precision is zero, no decimal-point character\n * appears. An `E` conversion uses the letter `E` (rather than `e`) to introduce the exponent.\n *
`g` `G`\n * The float argument is converted in style `f` or `e` (or `F` or `E` for `G` conversions). The precision specifies\n * the number of significant digits. If the precision is missing, `6` digits are given; if the\n * precision is zero, it is treated as `1`. Style `e` is used if the exponent from its conversion is less\n * than `-6` or greater than or equal to the precision. Trailing zeros are removed from the fractional\n * part of the result; a decimal point appears only if it is followed by at least one digit.\n *
`%`A literal `%` is written. No argument is converted. The complete conversion specification is `%%`.
\n *
\n *\n * @function sprintf\n * @static\n * @since 1.0.0\n * @memberOf Format\n * @param {string} [format=''] The format string.\n * @param {...*} replacements The replacements to produce the string.\n * @return {string} Returns the produced string.\n * @example\n * v.sprintf('%s, %s!', 'Hello', 'World');\n * // => 'Hello World!'\n *\n * v.sprintf('%s costs $%d', 'coffee', 2);\n * // => 'coffee costs $2'\n *\n * v.sprintf('%1$s %2$s %1$s %2$s, watcha gonna %3$s', 'bad', 'boys', 'do')\n * // => 'bad boys bad boys, watcha gonna do'\n *\n * v.sprintf('% 6s', 'bird');\n * // => ' bird'\n *\n * v.sprintf('% -6s', 'crab');\n * // => 'crab '\n *\n * v.sprintf(\"%'*5s\", 'cat');\n * // => '**cat'\n *\n * v.sprintf(\"%'*-6s\", 'duck');\n * // => 'duck**'\n *\n * v.sprintf('%d %i %+d', 15, -2, 25);\n * // => '15 -2 +25'\n *\n * v.sprintf(\"%06d\", 15);\n * // => '000015'\n *\n * v.sprintf('0b%b 0o%o 0x%X', 12, 9, 155);\n * // => '0b1100 0o11 0x9B'\n *\n * v.sprintf('%.2f', 10.469);\n * // => '10.47'\n *\n * v.sprintf('%.2e %g', 100.5, 0.455);\n * // => '1.01e+2 0.455'\n * \n */\nexport default function sprintf(format, ...replacements) {\n const formatString = coerceToString(format);\n if (formatString === '') {\n return formatString;\n }\n const boundReplacementMatch = replacementMatch.bind(undefined, new ReplacementIndex(), replacements);\n return formatString.replace(REGEXP_CONVERSION_SPECIFICATION, boundReplacementMatch);\n}","import nilDefault from 'helper/undefined/nil_default';\nimport sprintf from 'format/sprintf';\n\n/**\n * Produces a string according to `format`. Works exactly like sprintf(),\n * with the only difference that accepts the formatting arguments in an array `values`.
\n * See here `format` string specifications.\n *\n * @function vprintf\n * @static\n * @since 1.0.0\n * @memberOf Format\n * @param {string} format=''] The format string.\n * @param {Array} replacements The array of replacements to produce the string.\n * @return {string} Returns the produced string.\n * @example\n * v.vprintf('%s', ['Welcome'])\n * // => 'Welcome'\n *\n * v.vprintf('%s has %d apples', ['Alexandra', 3]);\n * // => 'Alexandra has 3 apples'\n */\nexport default function vprintf(format, replacements) {\n return sprintf(format, ...nilDefault(replacements, []));\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport { REGEXP_HTML_SPECIAL_CHARACTERS } from 'helper/reg_exp/const';\n\nconst escapeCharactersMap = {\n '<': '<',\n '>': '>',\n '&': '&',\n '\"': '"',\n \"'\": ''',\n '`': '`'\n};\n\n/**\n * Return the escaped version of `character`.\n *\n * @ignore\n * @param {string} character The character to be escape.\n * @return {string} The escaped version of character.\n */\nfunction replaceSpecialCharacter(character) {\n return escapeCharactersMap[character];\n}\n\n/**\n * Escapes HTML special characters < > & ' \" ` in subject.\n *\n * @function escapeHtml\n * @static\n * @since 1.0.0 \n * @memberOf Escape\n * @param {string} [subject=''] The string to escape.\n * @return {string} Returns the escaped string.\n * @example\n * v.escapeHtml('

wonderful world

');\n * // => '<p>wonderful world</p>'\n */\nexport default function escapeHtml(subject) {\n return coerceToString(subject).replace(REGEXP_HTML_SPECIAL_CHARACTERS, replaceSpecialCharacter);\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport { REGEXP_SPECIAL_CHARACTERS } from 'helper/reg_exp/const';\n\n/**\n * Escapes the regular expression special characters `- [ ] / { } ( ) * + ? . \\ ^ $ |` in `subject`.\n *\n * @function escapeRegExp\n * @static\n * @since 1.0.0\n * @memberOf Escape\n * @param {string} [subject=''] The string to escape.\n * @return {string} Returns the escaped string.\n * @example\n * v.escapeRegExp('(hours)[minutes]{seconds}');\n * // => '\\(hours\\)\\[minutes\\]\\{seconds\\}'\n */\nexport default function escapeRegExp(subject) {\n return coerceToString(subject).replace(REGEXP_SPECIAL_CHARACTERS, '\\\\$&');\n}","import coerceToString from 'helper/string/coerce_to_string';\n\nconst unescapeCharactersMap = {\n '<': /(<)|(�*3c;)|(�*60;)/gi,\n '>': /(>)|(�*3e;)|(�*62;)/gi,\n '&': /(&)|(�*26;)|(�*38;)/gi,\n '\"': /(")|(�*22;)|(�*34;)/gi,\n \"'\": /(�*27;)|(�*39;)/gi,\n '`': /(�*60;)|(�*96;)/gi\n};\nconst characters = Object.keys(unescapeCharactersMap);\n\n/**\n * Replaces the HTML entities with corresponding characters.\n *\n * @ignore\n * @param {string} string The accumulator string.\n * @param {string} key The character.\n * @return {string} The string with replaced HTML entity\n */\nfunction reduceUnescapedString(string, key) {\n return string.replace(unescapeCharactersMap[key], key);\n}\n\n/**\n * Unescapes HTML special characters from &lt; &gt; &amp; &quot; &#x27; &#x60;\n * to corresponding < > & ' \" ` in subject.\n *\n * @function unescapeHtml\n * @static\n * @since 1.0.0\n * @memberOf Escape\n * @param {string} [subject=''] The string to unescape.\n * @return {string} Returns the unescaped string.\n * @example\n * v.unescapeHtml('<p>wonderful world</p>');\n * // => '

wonderful world

'\n */\nexport default function unescapeHtml(subject) {\n const subjectString = coerceToString(subject);\n return characters.reduce(reduceUnescapedString, subjectString);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Returns the first occurrence index of `search` in `subject`.\n *\n * @function indexOf\n * @static\n * @since 1.0.0\n * @memberOf Index\n * @param {string} [subject=''] The string where to search.\n * @param {string} search The string to search.\n * @param {number} [fromIndex=0] The index to start searching.\n * @return {number} Returns the first occurrence index or `-1` if not found.\n * @example\n * v.indexOf('morning', 'n');\n * // => 3\n *\n * v.indexOf('evening', 'o');\n * // => -1\n */\nexport default function indexOf(subject, search, fromIndex) {\n const subjectString = coerceToString(subject);\n return subjectString.indexOf(search, fromIndex);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Returns the last occurrence index of `search` in `subject`.\n *\n * @function lastIndexOf\n * @static\n * @since 1.0.0\n * @memberOf Index\n * @param {string} [subject=''] The string where to search.\n * @param {string} search The string to search.\n * @param {number} [fromIndex=subject.length - 1] The index to start searching backward in the string.\n * @return {number} Returns the last occurrence index or `-1` if not found.\n * @example\n * v.lastIndexOf('morning', 'n');\n * // => 5\n *\n * v.lastIndexOf('evening', 'o');\n * // => -1\n */\nexport default function lastIndexOf(subject, search, fromIndex) {\n const subjectString = coerceToString(subject);\n return subjectString.lastIndexOf(search, fromIndex);\n}","import clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Returns the first index of a `pattern` match in `subject`.\n *\n * @function search\n * @static\n * @since 1.0.0\n * @memberOf Index\n * @param {string} [subject=''] The string where to search.\n * @param {string|RegExp} pattern The pattern to match. If `pattern` is not RegExp, it is transformed to `new RegExp(pattern)`.\n * @param {number} [fromIndex=0] The index to start searching.\n * @return {number} Returns the first match index or `-1` if not found.\n * @example\n * v.search('morning', /rn/);\n * // => 2\n *\n * v.search('evening', '/\\d/');\n * // => -1\n */\nexport default function search(subject, pattern, fromIndex) {\n const subjectString = coerceToString(subject);\n const fromIndexNumber = isNil(fromIndex) ? 0 : clipNumber(toInteger(fromIndex), 0, subjectString.length);\n let matchIndex = subjectString.substr(fromIndexNumber).search(pattern);\n if (matchIndex !== -1 && !isNaN(fromIndexNumber)) {\n matchIndex += fromIndexNumber;\n }\n return matchIndex;\n}","import coerceToNumber from 'helper/number/coerce_to_number';\nimport coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Inserts into `subject` a string `toInsert` at specified `position`.\n *\n * @function insert\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string where to insert.\n * @param {string} [toInsert=''] The string to be inserted.\n * @param {number} [position=0] The position to insert.\n * @return {string} Returns the string after insertion.\n * @example\n * v.insert('ct', 'a', 1);\n * // => 'cat'\n *\n * v.insert('sunny', ' day', 5);\n * // => 'sunny day'\n */\nexport default function insert(subject, toInsert, position) {\n const subjectString = coerceToString(subject);\n const toInsertString = coerceToString(toInsert);\n const positionNumber = coerceToNumber(position);\n if (positionNumber < 0 || positionNumber > subjectString.length || toInsertString === '') {\n return subjectString;\n }\n return subjectString.slice(0, positionNumber) + toInsertString + subjectString.slice(positionNumber);\n}","/**\n * Generated diacritics map. See bellow the base code.\n * @ignore\n * @see http://stackoverflow.com/a/18391901/1894471\n * @type Object\n */\n\nconst diacritics = {\n \"3\": \"\\u039e\\u03be\",\n \"8\": \"\\u0398\\u03b8\",\n \"A\": \"\\x41\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\u0100\\u0102\\u0104\\u01cd\\u01de\\u01e0\\u01fa\\u0200\\u0202\\u0226\\u023a\\u1e00\\u1ea0\\u1ea2\\u1ea4\\u1ea6\\u1ea8\\u1eaa\\u1eac\\u1eae\\u1eb0\\u1eb2\\u1eb4\\u1eb6\\u24b6\\u2c6f\\uff21\\u0386\\u0391\\u0410\",\n \"B\": \"\\x42\\u0181\\u0182\\u0243\\u1e02\\u1e04\\u1e06\\u24b7\\uff22\\u0392\\u0411\",\n \"C\": \"\\x43\\xc7\\u0106\\u0108\\u010a\\u010c\\u0187\\u023b\\u1e08\\u24b8\\ua73e\\uff23\\u0426\",\n \"D\": \"\\x44\\u010e\\u0110\\u0189\\u018a\\u018b\\u1e0a\\u1e0c\\u1e0e\\u1e10\\u1e12\\u24b9\\ua779\\uff24\\xd0\\u0394\\u0414\",\n \"E\": \"\\x45\\xc8\\xc9\\xca\\xcb\\u0112\\u0114\\u0116\\u0118\\u011a\\u018e\\u0190\\u0204\\u0206\\u0228\\u1e14\\u1e16\\u1e18\\u1e1a\\u1e1c\\u1eb8\\u1eba\\u1ebc\\u1ebe\\u1ec0\\u1ec2\\u1ec4\\u1ec6\\u24ba\\uff25\\u0388\\u0395\\u0415\\u042d\",\n \"F\": \"\\x46\\u0191\\u1e1e\\u24bb\\ua77b\\uff26\\u03a6\\u0424\",\n \"G\": \"\\x47\\u011c\\u011e\\u0120\\u0122\\u0193\\u01e4\\u01e6\\u01f4\\u1e20\\u24bc\\ua77d\\ua77e\\ua7a0\\uff27\\u0393\\u0413\\u0490\",\n \"H\": \"\\x48\\u0124\\u0126\\u021e\\u1e22\\u1e24\\u1e26\\u1e28\\u1e2a\\u24bd\\u2c67\\u2c75\\ua78d\\uff28\\u0389\\u0397\\u0425\",\n \"I\": \"\\x49\\xcc\\xcd\\xce\\xcf\\u0128\\u012a\\u012c\\u012e\\u0130\\u0197\\u01cf\\u0208\\u020a\\u1e2c\\u1e2e\\u1ec8\\u1eca\\u24be\\uff29\\u038a\\u0399\\u03aa\\u0406\\u0418\",\n \"J\": \"\\x4a\\u0134\\u0248\\u24bf\\uff2a\\u0419\",\n \"K\": \"\\x4b\\u0136\\u0198\\u01e8\\u1e30\\u1e32\\u1e34\\u24c0\\u2c69\\ua740\\ua742\\ua744\\ua7a2\\uff2b\\u039a\\u041a\",\n \"L\": \"\\x4c\\u0139\\u013b\\u013d\\u013f\\u0141\\u023d\\u1e36\\u1e38\\u1e3a\\u1e3c\\u24c1\\u2c60\\u2c62\\ua746\\ua748\\ua780\\uff2c\\u039b\\u041b\",\n \"M\": \"\\x4d\\u019c\\u1e3e\\u1e40\\u1e42\\u24c2\\u2c6e\\uff2d\\u039c\\u041c\",\n \"N\": \"\\x4e\\xd1\\u0143\\u0145\\u0147\\u019d\\u01f8\\u0220\\u1e44\\u1e46\\u1e48\\u1e4a\\u24c3\\ua790\\ua7a4\\uff2e\\u039d\\u041d\",\n \"O\": \"\\x4f\\xd2\\xd3\\xd4\\xd5\\xd6\\xd8\\u014c\\u014e\\u0150\\u0186\\u019f\\u01a0\\u01d1\\u01ea\\u01ec\\u01fe\\u020c\\u020e\\u022a\\u022c\\u022e\\u0230\\u1e4c\\u1e4e\\u1e50\\u1e52\\u1ecc\\u1ece\\u1ed0\\u1ed2\\u1ed4\\u1ed6\\u1ed8\\u1eda\\u1edc\\u1ede\\u1ee0\\u1ee2\\u24c4\\ua74a\\ua74c\\uff2f\\u038c\\u039f\\u041e\",\n \"P\": \"\\x50\\u01a4\\u1e54\\u1e56\\u24c5\\u2c63\\ua750\\ua752\\ua754\\uff30\\u03a0\\u041f\",\n \"Q\": \"\\x51\\u024a\\u24c6\\ua756\\ua758\\uff31\",\n \"R\": \"\\x52\\u0154\\u0156\\u0158\\u0210\\u0212\\u024c\\u1e58\\u1e5a\\u1e5c\\u1e5e\\u24c7\\u2c64\\ua75a\\ua782\\ua7a6\\uff32\\u03a1\\u0420\",\n \"S\": \"\\x53\\u015a\\u015c\\u015e\\u0160\\u0218\\u1e60\\u1e62\\u1e64\\u1e66\\u1e68\\u1e9e\\u24c8\\u2c7e\\ua784\\ua7a8\\uff33\\u03a3\\u0421\",\n \"T\": \"\\x54\\u0162\\u0164\\u0166\\u01ac\\u01ae\\u021a\\u023e\\u1e6a\\u1e6c\\u1e6e\\u1e70\\u24c9\\ua786\\uff34\\u03a4\\u0422\",\n \"U\": \"\\x55\\xd9\\xda\\xdb\\xdc\\u0168\\u016a\\u016c\\u016e\\u0170\\u0172\\u01af\\u01d3\\u01d5\\u01d7\\u01d9\\u01db\\u0214\\u0216\\u0244\\u1e72\\u1e74\\u1e76\\u1e78\\u1e7a\\u1ee4\\u1ee6\\u1ee8\\u1eea\\u1eec\\u1eee\\u1ef0\\u24ca\\uff35\\u0423\\u042a\",\n \"V\": \"\\x56\\u01b2\\u0245\\u1e7c\\u1e7e\\u24cb\\ua75e\\uff36\\u0412\",\n \"W\": \"\\x57\\u0174\\u1e80\\u1e82\\u1e84\\u1e86\\u1e88\\u24cc\\u2c72\\uff37\\u038f\\u03a9\",\n \"X\": \"\\x58\\u1e8a\\u1e8c\\u24cd\\uff38\\u03a7\",\n \"Y\": \"\\x59\\xdd\\u0176\\u0178\\u01b3\\u0232\\u024e\\u1e8e\\u1ef2\\u1ef4\\u1ef6\\u1ef8\\u1efe\\u24ce\\uff39\\u038e\\u03a5\\u03ab\\u042b\",\n \"Z\": \"\\x5a\\u0179\\u017b\\u017d\\u01b5\\u0224\\u1e90\\u1e92\\u1e94\\u24cf\\u2c6b\\u2c7f\\ua762\\uff3a\\u0396\\u0417\",\n \"a\": \"\\x61\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\u0101\\u0103\\u0105\\u01ce\\u01df\\u01e1\\u01fb\\u0201\\u0203\\u0227\\u0250\\u1e01\\u1e9a\\u1ea1\\u1ea3\\u1ea5\\u1ea7\\u1ea9\\u1eab\\u1ead\\u1eaf\\u1eb1\\u1eb3\\u1eb5\\u1eb7\\u24d0\\u2c65\\uff41\\u03ac\\u03b1\\u0430\",\n \"b\": \"\\x62\\u0180\\u0183\\u0253\\u1e03\\u1e05\\u1e07\\u24d1\\uff42\\u03b2\\u0431\",\n \"c\": \"\\x63\\xe7\\u0107\\u0109\\u010b\\u010d\\u0188\\u023c\\u1e09\\u2184\\u24d2\\ua73f\\uff43\\u0446\",\n \"d\": \"\\x64\\u010f\\u0111\\u018c\\u0256\\u0257\\u1e0b\\u1e0d\\u1e0f\\u1e11\\u1e13\\u24d3\\ua77a\\uff44\\xf0\\u03b4\\u0434\",\n \"e\": \"\\x65\\xe8\\xe9\\xea\\xeb\\u0113\\u0115\\u0117\\u0119\\u011b\\u01dd\\u0205\\u0207\\u0229\\u0247\\u025b\\u1e15\\u1e17\\u1e19\\u1e1b\\u1e1d\\u1eb9\\u1ebb\\u1ebd\\u1ebf\\u1ec1\\u1ec3\\u1ec5\\u1ec7\\u24d4\\uff45\\u03ad\\u03b5\\u0435\\u044d\",\n \"f\": \"\\x66\\u0192\\u1e1f\\u24d5\\ua77c\\uff46\\u03c6\\u0444\",\n \"g\": \"\\x67\\u011d\\u011f\\u0121\\u0123\\u01e5\\u01e7\\u01f5\\u0260\\u1d79\\u1e21\\u24d6\\ua77f\\ua7a1\\uff47\\u03b3\\u0433\\u0491\",\n \"h\": \"\\x68\\u0125\\u0127\\u021f\\u0265\\u1e23\\u1e25\\u1e27\\u1e29\\u1e2b\\u1e96\\u24d7\\u2c68\\u2c76\\uff48\\u03ae\\u03b7\\u0445\",\n \"i\": \"\\x69\\xec\\xed\\xee\\xef\\u0129\\u012b\\u012d\\u012f\\u0131\\u01d0\\u0209\\u020b\\u0268\\u1e2d\\u1e2f\\u1ec9\\u1ecb\\u24d8\\uff49\\u0390\\u03af\\u03b9\\u03ca\\u0438\\u0456\",\n \"j\": \"\\x6a\\u0135\\u01f0\\u0249\\u24d9\\uff4a\\u0439\",\n \"k\": \"\\x6b\\u0137\\u0199\\u01e9\\u1e31\\u1e33\\u1e35\\u24da\\u2c6a\\ua741\\ua743\\ua745\\ua7a3\\uff4b\\u03ba\\u043a\",\n \"l\": \"\\x6c\\u013a\\u013c\\u013e\\u0140\\u0142\\u017f\\u019a\\u026b\\u1e37\\u1e39\\u1e3b\\u1e3d\\u24db\\u2c61\\ua747\\ua749\\ua781\\uff4c\\u03bb\\u043b\",\n \"m\": \"\\x6d\\u026f\\u0271\\u1e3f\\u1e41\\u1e43\\u24dc\\uff4d\\u03bc\\u043c\",\n \"n\": \"\\x6e\\xf1\\u0144\\u0146\\u0148\\u0149\\u019e\\u01f9\\u0272\\u1e45\\u1e47\\u1e49\\u1e4b\\u24dd\\ua791\\ua7a5\\uff4e\\u03bd\\u043d\",\n \"o\": \"\\x6f\\xf2\\xf3\\xf4\\xf5\\xf6\\xf8\\u014d\\u014f\\u0151\\u01a1\\u01d2\\u01eb\\u01ed\\u01ff\\u020d\\u020f\\u022b\\u022d\\u022f\\u0231\\u0254\\u0275\\u1e4d\\u1e4f\\u1e51\\u1e53\\u1ecd\\u1ecf\\u1ed1\\u1ed3\\u1ed5\\u1ed7\\u1ed9\\u1edb\\u1edd\\u1edf\\u1ee1\\u1ee3\\u24de\\ua74b\\ua74d\\uff4f\\u03bf\\u03cc\\u043e\",\n \"p\": \"\\x70\\u01a5\\u1d7d\\u1e55\\u1e57\\u24df\\ua751\\ua753\\ua755\\uff50\\u03c0\\u043f\",\n \"q\": \"\\x71\\u024b\\u24e0\\ua757\\ua759\\uff51\",\n \"r\": \"\\x72\\u0155\\u0157\\u0159\\u0211\\u0213\\u024d\\u027d\\u1e59\\u1e5b\\u1e5d\\u1e5f\\u24e1\\ua75b\\ua783\\ua7a7\\uff52\\u03c1\\u0440\",\n \"s\": \"\\x73\\xdf\\u015b\\u015d\\u015f\\u0161\\u0219\\u023f\\u1e61\\u1e63\\u1e65\\u1e67\\u1e69\\u1e9b\\u24e2\\ua785\\ua7a9\\uff53\\u03c2\\u03c3\\u0441\",\n \"t\": \"\\x74\\u0163\\u0165\\u0167\\u01ad\\u021b\\u0288\\u1e6b\\u1e6d\\u1e6f\\u1e71\\u1e97\\u24e3\\u2c66\\ua787\\uff54\\u03c4\\u0442\",\n \"u\": \"\\x75\\xf9\\xfa\\xfb\\xfc\\u0169\\u016b\\u016d\\u016f\\u0171\\u0173\\u01b0\\u01d4\\u01d6\\u01d8\\u01da\\u01dc\\u0215\\u0217\\u0289\\u1e73\\u1e75\\u1e77\\u1e79\\u1e7b\\u1ee5\\u1ee7\\u1ee9\\u1eeb\\u1eed\\u1eef\\u1ef1\\u24e4\\uff55\\u0443\\u044a\",\n \"v\": \"\\x76\\u028b\\u028c\\u1e7d\\u1e7f\\u24e5\\ua75f\\uff56\\u0432\",\n \"w\": \"\\x77\\u0175\\u1e81\\u1e83\\u1e85\\u1e87\\u1e89\\u1e98\\u24e6\\u2c73\\uff57\\u03c9\\u03ce\",\n \"x\": \"\\x78\\u1e8b\\u1e8d\\u24e7\\uff58\\u03c7\",\n \"y\": \"\\x79\\xfd\\xff\\u0177\\u01b4\\u0233\\u024f\\u1e8f\\u1e99\\u1ef3\\u1ef5\\u1ef7\\u1ef9\\u1eff\\u24e8\\uff59\\u03b0\\u03c5\\u03cb\\u03cd\\u044b\",\n \"z\": \"\\x7a\\u017a\\u017c\\u017e\\u01b6\\u0225\\u0240\\u1e91\\u1e93\\u1e95\\u24e9\\u2c6c\\ua763\\uff5a\\u03b6\\u0437\",\n \"OE\": \"\\x8c\\u0152\",\n \"oe\": \"\\x9c\\u0153\",\n \"AE\": \"\\xc6\\u01e2\\u01fc\",\n \"ae\": \"\\xe6\\u01e3\\u01fd\",\n \"hv\": \"\\u0195\",\n \"OI\": \"\\u01a2\",\n \"oi\": \"\\u01a3\",\n \"DZ\": \"\\u01c4\\u01f1\",\n \"Dz\": \"\\u01c5\\u01f2\",\n \"dz\": \"\\u01c6\\u01f3\",\n \"LJ\": \"\\u01c7\",\n \"Lj\": \"\\u01c8\",\n \"lj\": \"\\u01c9\",\n \"NJ\": \"\\u01ca\",\n \"Nj\": \"\\u01cb\",\n \"nj\": \"\\u01cc\",\n \"OU\": \"\\u0222\",\n \"ou\": \"\\u0223\",\n \"TZ\": \"\\ua728\",\n \"tz\": \"\\ua729\",\n \"AA\": \"\\ua732\",\n \"aa\": \"\\ua733\",\n \"AO\": \"\\ua734\",\n \"ao\": \"\\ua735\",\n \"AU\": \"\\ua736\",\n \"au\": \"\\ua737\",\n \"AV\": \"\\ua738\\ua73a\",\n \"av\": \"\\ua739\\ua73b\",\n \"AY\": \"\\ua73c\",\n \"ay\": \"\\ua73d\",\n \"OO\": \"\\ua74e\",\n \"oo\": \"\\ua74f\",\n \"VY\": \"\\ua760\",\n \"vy\": \"\\ua761\",\n \"TH\": \"\\xde\",\n \"th\": \"\\xfe\",\n \"PS\": \"\\u03a8\",\n \"ps\": \"\\u03c8\",\n \"Yo\": \"\\u0401\",\n \"Ye\": \"\\u0404\",\n \"Yi\": \"\\u0407\",\n \"Zh\": \"\\u0416\",\n \"Ch\": \"\\u0427\",\n \"Sh\": \"\\u0428\\u0429\",\n \"\": \"\\u042c\\u044c\",\n \"Yu\": \"\\u042e\",\n \"Ya\": \"\\u042f\",\n \"zh\": \"\\u0436\",\n \"ch\": \"\\u0447\",\n \"sh\": \"\\u0448\\u0449\",\n \"yu\": \"\\u044e\",\n \"ya\": \"\\u044f\",\n \"yo\": \"\\u0451\",\n \"ye\": \"\\u0454\",\n \"yi\": \"\\u0457\"\n};\n\nlet diacriticsMap = null;\n\n/**\n * Creates a map of the diacritics.\n *\n * @ignore\n * @returns {Object} Returns the diacritics map.\n */\nfunction getDiacriticsMap() {\n if (diacriticsMap !== null) {\n return diacriticsMap;\n }\n diacriticsMap = {};\n Object.keys(diacritics).forEach(function(key) {\n const characters = diacritics[key];\n for (let index = 0; index < characters.length; index++) {\n const character = characters[index];\n diacriticsMap[character] = key;\n }\n });\n return diacriticsMap;\n}\n\n/**\n * Get the latin character from character with diacritics.\n *\n * @ignore\n * @param {string} character The character with diacritics.\n * @returns {string} Returns the character without diacritics.\n */\nexport function getLatinCharacter(character) {\n const characterWithoutDiacritic = getDiacriticsMap()[character];\n return characterWithoutDiacritic ? characterWithoutDiacritic : character;\n}","import { REGEXP_COMBINING_MARKS, REGEXP_NON_LATIN } from 'helper/reg_exp/const';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport { getLatinCharacter } from 'helper/string/diacritics_map';\n\n/**\n * Returns the `cleanCharacter` from combining marks regular expression match.\n *\n * @ignore\n * @param {string} character The character with combining marks\n * @param {string} cleanCharacter The character without combining marks.\n * @return {string} The character without combining marks.\n */\nfunction removeCombiningMarks(character, cleanCharacter) {\n return cleanCharacter;\n}\n\n/**\n * Latinises the `subject` by removing diacritic characters.\n *\n * @function latinise\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to latinise.\n * @return {string} Returns the latinised string.\n * @example\n * v.latinise('cafe\\u0301'); // or 'café'\n * // => 'cafe'\n *\n * v.latinise('août décembre');\n * // => 'aout decembre'\n *\n * v.latinise('как прекрасен этот мир');\n * // => 'kak prekrasen etot mir'\n */\nexport default function latinise(subject) {\n const subjectString = coerceToString(subject);\n if (subjectString === '') {\n return subjectString;\n }\n return subjectString\n .replace(REGEXP_NON_LATIN, getLatinCharacter)\n .replace(REGEXP_COMBINING_MARKS, removeCombiningMarks);\n}","import buildPadding from 'helper/string/build_padding';\nimport clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { MAX_SAFE_INTEGER } from 'helper/number/const';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Pads `subject` to a new `length`.\n *\n * @function pad\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to pad.\n * @param {int} [length=0] The length to pad the string. No changes are made if `length` is less than `subject.length`.\n * @param {string} [pad=' '] The string to be used for padding.\n * @return {string} Returns the padded string.\n * @example\n * v.pad('dog', 5);\n * // => ' dog '\n *\n * v.pad('bird', 6, '-');\n * // => '-bird-'\n *\n * v.pad('cat', 6, '-=');\n * // => '-cat-='\n */\nexport default function pad(subject, length, pad) {\n const subjectString = coerceToString(subject);\n const lengthInt = isNil(length) ? 0 : clipNumber(toInteger(length), 0, MAX_SAFE_INTEGER);\n const padString = coerceToString(pad, ' ');\n if (lengthInt <= subjectString.length) {\n return subjectString;\n }\n const paddingLength = lengthInt - subjectString.length;\n const paddingSideLength = toInteger(paddingLength / 2);\n const paddingSideRemainingLength = paddingLength % 2;\n return buildPadding(padString, paddingSideLength) + subjectString +\n buildPadding(padString, paddingSideLength + paddingSideRemainingLength);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Returns a new string where the matches of `pattern` are replaced with `replacement`.
\n *\n * @function replace\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to verify.\n * @param {string|RegExp} pattern The pattern which match is replaced. If `pattern` is a string,\n * a simple string match is evaluated and only the first occurrence replaced.\n * @param {string|Function} replacement The string or function which invocation result replaces `pattern` match.\n * @return {string} Returns the replacement result.\n * @example\n * v.replace('swan', 'wa', 'u');\n * // => 'sun'\n *\n * v.replace('domestic duck', /domestic\\s/, '');\n * // => 'duck'\n *\n * v.replace('nice duck', /(nice)(duck)/, function(match, nice, duck) {\n * return 'the ' + duck + ' is ' + nice;\n * });\n * // => 'the duck is nice'\n */\nexport default function replace(subject, pattern, replacement) {\n const subjectString = coerceToString(subject);\n return subjectString.replace(pattern, replacement);\n}","import { REGEXP_FLAGS } from 'helper/reg_exp/const';\n\n/**\n * Get the flags string from a regular expression object.\n *\n * @ignore\n * @param {RegExp} regExp The regular expression object.\n * @return {string} Returns the string with flags chars.\n */\nexport default function getRegExpFlags(regExp) {\n return regExp.toString().match(REGEXP_FLAGS)[0];\n}","import clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport toInteger from 'helper/number/to_integer';\nimport toString from 'helper/string/to_string';\n\n/**\n * Checks whether `subject` includes `search` starting from `position`.\n *\n * @function includes\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string where to search.\n * @param {string} search The string to search.\n * @param {number} [position=0] The position to start searching.\n * @return {boolean} Returns `true` if `subject` includes `search` or `false` otherwise.\n * @example\n * v.includes('starship', 'star');\n * // => true\n *\n * v.includes('galaxy', 'g', 1);\n * // => false\n */\nexport default function includes(subject, search, position) {\n const subjectString = coerceToString(subject);\n const searchString = toString(search);\n if (searchString === null) {\n return false;\n }\n if (searchString === '') {\n return true;\n }\n position = isNil(position) ? 0 : clipNumber(toInteger(position), 0, subjectString.length);\n return subjectString.indexOf(searchString, position) !== -1;\n}","import getRegExpFlags from 'helper/reg_exp/get_reg_exp_flags';\nimport includes from 'query/includes';\n\n/**\n * Append flag to a regular expression.\n *\n * @ignore\n * @param {RegExp} pattern The pattern to coerce.\n * @param {string} appendFlag The flag to append to regular expression.\n * @return {RegExp} The regular expression with added flag.\n */\nexport default function appendFlagToRegExp(pattern, appendFlag) {\n const regularExpressionFlags = getRegExpFlags(pattern);\n if (!includes(regularExpressionFlags, appendFlag)) {\n return new RegExp(pattern.source, regularExpressionFlags + appendFlag);\n }\n return pattern;\n}","import appendFlagToRegularExpression from 'helper/reg_exp/append_flag_to_reg_exp';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport escapeRegExp from 'escape/escape_reg_exp';\n\n/**\n * Returns a new string where all matches of `pattern` are replaced with `replacement`.
\n *\n * @function replaceAll\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to verify.\n * @param {string|RegExp} pattern The pattern which match is replaced. If `pattern` is a string, a simple string match is evaluated.\n * All matches are replaced.\n * @param {string|Function} replacement The string or function which invocation result replaces `pattern` match.\n * @return {string} Returns the replacement result.\n * @example\n * v.replaceAll('good morning', 'o', '*');\n * // => 'g**d m*rning'\n * v.replaceAll('evening', /n/, 's');\n * // => 'evesisg'\n *\n */\nexport default function replaceAll(subject, pattern, replacement) {\n const subjectString = coerceToString(subject);\n let regExp = pattern;\n if (!(pattern instanceof RegExp)) {\n regExp = new RegExp(escapeRegExp(pattern), 'g');\n } else if (!pattern.global) {\n regExp = appendFlagToRegularExpression(pattern, 'g');\n }\n return subjectString.replace(regExp, replacement);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Reverses the `subject`.\n *\n * @function reverse\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to reverse.\n * @return {string} Returns the reversed string.\n * @example\n * v.reverse('winter');\n * // => 'retniw'\n */\nexport default function reverse(subject) {\n const subjectString = coerceToString(subject);\n return subjectString.split('').reverse().join('');\n}","import { REGEXP_COMBINING_MARKS, REGEXP_SURROGATE_PAIRS } from 'helper/reg_exp/const';\nimport coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Reverses the `subject` taking care of\n * surrogate pairs and\n * combining marks.\n *\n * @function reverseGrapheme\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to reverse.\n * @return {string} Returns the reversed string.\n * @example\n * v.reverseGrapheme('summer');\n * // => 'remmus'\n *\n * v.reverseGrapheme('𝌆 bar mañana mañana');\n * // => 'anañam anañam rab 𝌆'\n */\nexport default function reverseGrapheme(subject) {\n let subjectString = coerceToString(subject);\n /**\n * @see https://github.com/mathiasbynens/esrever\n */\n subjectString = subjectString\n .replace(REGEXP_COMBINING_MARKS, function($0, $1, $2) {\n return reverseGrapheme($2) + $1;\n })\n .replace(REGEXP_SURROGATE_PAIRS, '$2$1');\n let reversedString = '';\n let index = subjectString.length;\n while (index--) {\n reversedString += subjectString.charAt(index);\n }\n return reversedString;\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport kebabCase from 'case/kebab_case';\nimport latinise from 'manipulate/latinise';\nimport { REGEXP_NON_LATIN } from 'helper/reg_exp/const';\n\n/**\n * Slugifies the `subject`. Cleans the `subject` by replacing diacritics with corresponding latin characters.\n *\n * @function slugify\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to slugify.\n * @return {string} Returns the slugified string.\n * @example\n * v.slugify('Italian cappuccino drink');\n * // => 'italian-cappuccino-drink'\n *\n * v.slugify('caffé latté');\n * // => 'caffe-latte'\n *\n * v.slugify('хорошая погода');\n * // => 'horoshaya-pogoda'\n */\nexport default function slugify(subject) {\n const subjectString = coerceToString(subject);\n if (subjectString === '') {\n return '';\n }\n const cleanSubjectString = latinise(subjectString).replace(REGEXP_NON_LATIN, '-');\n return kebabCase(cleanSubjectString);\n}","import coerceToNumber from 'helper/number/coerce_to_number';\nimport coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Changes `subject` by deleting `deleteCount` of characters starting at position `start`. Places a new string\n * `toAdd` instead of deleted characters.\n *\n * @function splice\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string where to insert.\n * @param {string} start The position to start changing the string. For a negative position will start from the end of\n * the string.\n * @param {number} [deleteCount=subject.length-start] The number of characters to delete from string.\n * @param {string} [toAdd=''] The string to be added instead of deleted characters.\n * @return {string} Returns the modified string.\n * @example\n * v.splice('new year', 0, 4);\n * // => 'year'\n *\n * v.splice('new year', 0, 3, 'happy');\n * // => 'happy year'\n *\n * v.splice('new year', -4, 4, 'day');\n * // => 'new day'\n */\nexport default function splice(subject, start, deleteCount, toAdd) {\n const subjectString = coerceToString(subject);\n const toAddString = coerceToString(toAdd);\n let startPosition = coerceToNumber(start);\n if (startPosition < 0) {\n startPosition = subjectString.length + startPosition;\n if (startPosition < 0) {\n startPosition = 0;\n }\n } else if (startPosition > subjectString.length) {\n startPosition = subjectString.length;\n }\n let deleteCountNumber = coerceToNumber(deleteCount, subjectString.length - startPosition);\n if (deleteCountNumber < 0) {\n deleteCountNumber = 0;\n }\n return subjectString.slice(0, startPosition) + toAddString + subjectString.slice(startPosition + deleteCountNumber);\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { REGEXP_TRIM_LEFT } from 'helper/reg_exp/const';\nimport toString from 'helper/string/to_string';\n\n/**\n * Removes whitespaces from the left side of the `subject`.\n *\n * @function trimLeft\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to trim.\n * @param {string} [whitespace=whitespace] The whitespace characters to trim.\n * @return {string} Returns the trimmed string.\n * @example\n * v.trimLeft(' Starship Troopers');\n * // => 'Starship Troopers'\n *\n * v.trimLeft('***Mobile Infantry', '*');\n * // => 'Mobile Infantry'\n */\nexport default function trimLeft(subject, whitespace) {\n const subjectString = coerceToString(subject);\n if (whitespace === '' || subjectString === '') {\n return subjectString;\n }\n const whitespaceString = toString(whitespace);\n if (isNil(whitespaceString)) {\n return subjectString.replace(REGEXP_TRIM_LEFT, '');\n }\n const whitespaceLength = whitespaceString.length;\n let matchWhitespace = true;\n let totalWhitespaceLength = 0;\n while (matchWhitespace) {\n if (subjectString.indexOf(whitespaceString, totalWhitespaceLength) === totalWhitespaceLength) {\n totalWhitespaceLength += whitespaceLength;\n } else {\n matchWhitespace = false;\n }\n }\n return subjectString.substring(totalWhitespaceLength);\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { REGEXP_TRIM_RIGHT } from 'helper/reg_exp/const';\nimport toString from 'helper/string/to_string';\n\n/**\n * Removes whitespaces from the right side of the `subject`.\n *\n * @function trimRight\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to trim.\n * @param {string} [whitespace=whitespace] The whitespace characters to trim.\n * @return {string} Returns the trimmed string.\n * @example\n * v.trimRight('the fire rises ');\n * // => 'the fire rises'\n *\n * v.trimRight('do you feel in charge?!!!', '!');\n * // => 'do you feel in charge?'\n */\nexport default function trimRight(subject, whitespace) {\n const subjectString = coerceToString(subject);\n if (whitespace === '' || subjectString === '') {\n return subjectString;\n }\n const whitespaceString = toString(whitespace);\n if (isNil(whitespaceString)) {\n return subjectString.replace(REGEXP_TRIM_RIGHT, '');\n }\n const whitespaceLength = whitespaceString.length;\n const subjectLength = subjectString.length;\n let matchWhitespace = true;\n let totalWhitespaceLength = 0;\n let position;\n while (matchWhitespace) {\n position = subjectLength - totalWhitespaceLength - whitespaceLength;\n if (subjectString.indexOf(whitespaceString, position) === position) {\n totalWhitespaceLength += whitespaceLength;\n } else {\n matchWhitespace = false;\n }\n }\n return subjectString.substring(0, subjectLength - totalWhitespaceLength);\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport toString from 'helper/string/to_string';\nimport trimLeft from 'manipulate/trim_left';\nimport trimRight from 'manipulate/trim_right';\n\n/**\n * Removes whitespaces from left and right sides of the `subject`.\n *\n * @function trim\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to trim.\n * @param {string} [whitespace=whitespace] The whitespace characters to trim.\n * @return {string} Returns the trimmed string.\n * @example\n * v.trim(' Mother nature ');\n * // => 'Mother nature'\n *\n * v.trim('--Earth--', '-');\n * // => 'Earth'\n */\nexport default function trim(subject, whitespace) {\n const subjectString = coerceToString(subject);\n if (whitespace === '' || subjectString === '') {\n return subjectString;\n }\n const whitespaceString = toString(whitespace);\n if (isNil(whitespaceString)) {\n return subjectString.trim();\n }\n return trimRight(trimLeft(subjectString, whitespaceString), whitespaceString);\n}","import coerceToBoolean from 'helper/boolean/coerce_to_boolean';\nimport coerceToNumber from 'helper/number/coerce_to_number';\nimport coerceToString from 'helper/string/coerce_to_string';\n\nconst OPTION_WIDTH = 'width';\nconst OPTION_NEW_LINE = 'newLine';\nconst OPTION_INDENT = 'indent';\nconst OPTION_CUT = 'cut';\n\n/**\n * Determine the word wrap options. The missing values are filled with defaults.\n *\n * @param {Object} options The options object.\n * @return {Object} The word wrap options, with default settings if necessary.\n * @ignore\n */\nfunction determineOptions(options) {\n return {\n width: coerceToNumber(options[OPTION_WIDTH], 75),\n newLine: coerceToString(options[OPTION_NEW_LINE], '\\n'),\n indent: coerceToString(options[OPTION_INDENT], ''),\n cut: coerceToBoolean(options[OPTION_CUT], false)\n };\n}\n\n/**\n * Wraps `subject` to a given number of characters using a string break character.\n *\n * @function wordWrap\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to wrap.\n * @param {Object} [options={}] The wrap options.\n * @param {number} [options.width=75] The number of characters at which to wrap.\n * @param {string} [options.newLine='\\n'] The string to add at the end of line.\n * @param {string} [options.indent=''] The string to intend the line.\n * @param {boolean} [options.cut=false] When `false` (default) does not split the word even if word length is bigger than `width`.
\n * When `true` breaks the word that has length bigger than `width`.\n *\n * @return {string} Returns wrapped string.\n * @example\n * v.wordWrap('Hello world', {\n * width: 5\n * });\n * // => 'Hello\\nworld'\n *\n * v.wordWrap('Hello world', {\n * width: 5,\n * newLine: '
',\n * indent: '__'\n * });\n * // => '__Hello
__world'\n *\n * v.wordWrap('Wonderful world', {\n * width: 5,\n * cut: true\n * });\n * // => 'Wonde\\nrful\\nworld'\n *\n */\nexport default function wordWrap(subject, options = {}) {\n const subjectString = coerceToString(subject);\n const { width, newLine, indent, cut } = determineOptions(options);\n if (subjectString === '' || width <= 0) {\n return indent;\n }\n const subjectLength = subjectString.length;\n const substring = subjectString.substring.bind(subjectString);\n let offset = 0;\n let wrappedLine = '';\n while ((subjectLength - offset) > width) {\n if (subjectString[offset] === ' ') {\n offset++;\n continue;\n }\n let spaceToWrapAt = subjectString.lastIndexOf(' ', width + offset);\n if (spaceToWrapAt >= offset) {\n wrappedLine += indent + substring(offset, spaceToWrapAt) + newLine;\n offset = spaceToWrapAt + 1;\n } else {\n if (cut) {\n wrappedLine += indent + substring(offset, width + offset) + newLine;\n offset += width;\n } else {\n spaceToWrapAt = subjectString.indexOf(' ', width + offset);\n if (spaceToWrapAt >= 0) {\n wrappedLine += indent + substring(offset, spaceToWrapAt) + newLine;\n offset = spaceToWrapAt + 1;\n } else {\n wrappedLine += indent + substring(offset);\n offset = subjectLength;\n }\n }\n }\n }\n if (offset < subjectLength) {\n wrappedLine += indent + substring(offset);\n }\n return wrappedLine;\n}","import clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Checks whether `subject` ends with `end`.\n *\n * @function endsWith\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @param {string} end The ending string.\n * @param {number} [position=subject.length] Search within `subject` as if the string were only `position` long.\n * @return {boolean} Returns `true` if `subject` ends with `end` or `false` otherwise.\n * @example\n * v.endsWith('red alert', 'alert');\n * // => true\n *\n * v.endsWith('metro south', 'metro');\n * // => false\n *\n * v.endsWith('Murphy', 'ph', 5);\n * // => true\n */\nexport default function endsWith(subject, end, position) {\n if (isNil(end)) {\n return false;\n }\n const subjectString = coerceToString(subject);\n const endString = coerceToString(end);\n if (endString === '') {\n return true;\n }\n position = isNil(position) ? subjectString.length : clipNumber(toInteger(position), 0, subjectString.length);\n position -= endString.length;\n const lastIndex = subjectString.indexOf(endString, position);\n return lastIndex !== -1 && lastIndex === position;\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport { REGEXP_ALPHA } from 'helper/reg_exp/const_extended';\n\n/**\n * Checks whether `subject` contains only alpha characters.\n *\n * @function isAlpha\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @return {boolean} Returns `true` if `subject` contains only alpha characters or `false` otherwise.\n * @example\n * v.isAlpha('bart');\n * // => true\n *\n * v.isAlpha('lisa!');\n * // => false\n *\n * v.isAlpha('lisa and bart');\n * // => false\n */\nexport default function isAlpha(subject) {\n const subjectString = coerceToString(subject);\n return REGEXP_ALPHA.test(subjectString);\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport { REGEXP_ALPHA_DIGIT } from 'helper/reg_exp/const_extended';\n\n/**\n * Checks whether `subject` contains only alpha and digit characters.\n *\n * @function isAlphaDigit\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @return {boolean} Returns `true` if `subject` contains only alpha and digit characters or `false` otherwise.\n * @example\n * v.isAlphaDigit('year2020');\n * // => true\n *\n * v.isAlphaDigit('1448');\n * // => true\n *\n * v.isAlphaDigit('40-20');\n * // => false\n */\nexport default function isAlphaDigit(subject) {\n const subjectString = coerceToString(subject);\n return REGEXP_ALPHA_DIGIT.test(subjectString);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Checks whether `subject` is empty or contains only whitespaces.\n *\n * @function isBlank\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @return {boolean} Returns `true` if `subject` is empty or contains only whitespaces or `false` otherwise.\n * @example\n * v.isBlank('');\n * // => true\n *\n * v.isBlank(' ');\n * // => true\n *\n * v.isBlank('World');\n * // => false\n */\nexport default function isBlank(subject) {\n const subjectString = coerceToString(subject);\n return subjectString.trim().length === 0;\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport { REGEXP_DIGIT } from 'helper/reg_exp/const';\n\n/**\n * Checks whether `subject` contains only digit characters.\n *\n * @function isDigit\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @return {boolean} Returns `true` if `subject` contains only digit characters or `false` otherwise.\n * @example\n * v.isDigit('35');\n * // => true\n *\n * v.isDigit('1.5');\n * // => false\n *\n * v.isDigit('ten');\n * // => false\n */\nexport default function isDigit(subject) {\n const subjectString = coerceToString(subject);\n return REGEXP_DIGIT.test(subjectString);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Checks whether `subject` is empty.\n *\n * @function isEmpty\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @return {boolean} Returns `true` if `subject` is empty or `false` otherwise\n * @example\n * v.isEmpty('');\n * // => true\n *\n * v.isEmpty(' ');\n * // => false\n *\n * v.isEmpty('sun');\n * // => false\n */\nexport default function isEmpty(subject) {\n const subjectString = coerceToString(subject);\n return subjectString.length === 0;\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport isAlpha from 'query/is_alpha';\n\n/**\n * Checks whether `subject` has only lower case characters.\n *\n * @function isLowerCase\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @return {boolean} Returns `true` if `subject` is lower case or `false` otherwise.\n * @example\n * v.isLowerCase('motorcycle');\n * // => true\n *\n * v.isLowerCase('John');\n * // => false\n *\n * v.isLowerCase('T1000');\n * // => false\n */\nexport default function isLowerCase(subject) {\n const valueString = coerceToString(subject);\n return isAlpha(valueString) && valueString.toLowerCase() === valueString;\n}","import isNil from 'helper/object/is_nil';\n\n/**\n * Checks whether `subject` is numeric.\n *\n * @function isNumeric\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @return {boolean} Returns `true` if `subject` is numeric or `false` otherwise.\n * @example\n * v.isNumeric('350');\n * // => true\n *\n * v.isNumeric('-20.5');\n * // => true\n *\n * v.isNumeric('1.5E+2');\n * // => true\n *\n * v.isNumeric('five');\n * // => false\n */\nexport default function isNumeric(subject) {\n const valueNumeric = typeof subject === 'object' && !isNil(subject) ? Number(subject) : subject;\n return (typeof valueNumeric === 'number' || typeof valueNumeric === 'string')\n && !isNaN(valueNumeric - parseFloat(valueNumeric));\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport isAlpha from 'query/is_alpha';\n\n/**\n * Checks whether `subject` contains only upper case characters.\n *\n * @function isUpperCase\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @return {boolean} Returns `true` if `subject` is upper case or `false` otherwise.\n * @example\n * v.isUpperCase('ACDC');\n * // => true\n *\n * v.isUpperCase('Morning');\n * // => false\n */\nexport default function isUpperCase(subject) {\n const subjectString = coerceToString(subject);\n return isAlpha(subjectString) && subjectString.toUpperCase() === subjectString;\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport toString from 'helper/string/to_string';\n\n/**\n * Checks whether `subject` matches the regular expression `pattern`.\n *\n * @function matches\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @param {RegExp|string} pattern The pattern to match. If `pattern` is not RegExp, it is transformed to `new RegExp(pattern, flags)`.\n * @param {string} [flags=''] The regular expression flags. Applies when `pattern` is string type.\n * @return {boolean} Returns `true` if `subject` matches `pattern` or `false` otherwise.\n * @example\n * v.matches('pluto', /plu.{2}/);\n * // => true\n *\n * v.matches('sun', 'S', 'i');\n * // => true\n *\n * v.matches('apollo 11', '\\\\d{3}');\n * // => false\n */\nexport default function matches(subject, pattern, flags) {\n const subjectString = coerceToString(subject);\n const flagsString = coerceToString(flags);\n let patternString;\n if (!(pattern instanceof RegExp)) {\n patternString = toString(pattern);\n if (patternString === null) {\n return false;\n }\n pattern = new RegExp(patternString, flagsString);\n }\n return pattern.test(subjectString);\n}","import clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport toInteger from 'helper/number/to_integer';\nimport toString from 'helper/string/to_string';\n\n/**\n * Checks whether `subject` starts with `start`.\n *\n * @function startsWith\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @param {string} start The starting string.\n * @param {number} [position=0] The position to start searching.\n * @return {boolean} Returns `true` if `subject` starts with `start` or `false` otherwise.\n * @example\n * v.startsWith('say hello to my little friend', 'say hello');\n * // => true\n *\n * v.startsWith('tony', 'on', 1);\n * // => true\n *\n * v.startsWith('the world is yours', 'world');\n * // => false\n */\nexport default function startsWith(subject, start, position) {\n const subjectString = coerceToString(subject);\n const startString = toString(start);\n if (startString === null) {\n return false;\n }\n if (startString === '') {\n return true;\n }\n position = isNil(position) ? 0 : clipNumber(toInteger(position), 0, subjectString.length);\n return subjectString.substr(position, startString.length) === startString;\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Splits `subject` into an array of characters.\n *\n * @function chars\n * @static\n * @since 1.0.0\n * @memberOf Split\n * @param {string} [subject=''] The string to split into characters.\n * @return {Array} Returns the array of characters.\n * @example\n * v.chars('cloud');\n * // => ['c', 'l', 'o', 'u', 'd']\n */\nexport default function chars(subject) {\n const subjectString = coerceToString(subject);\n return subjectString.split('');\n}","import codePointAt from 'chop/code_point_at';\nimport coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Returns an array of Unicode code point values from characters of `subject`.\n *\n * @function codePoints\n * @static\n * @since 1.0.0\n * @memberOf Split\n * @param {string} [subject=''] The string to extract from.\n * @return {Array} Returns an array of non-negative numbers less than or equal to `0x10FFFF`.\n * @example\n * v.codePoints('rain');\n * // => [114, 97, 105, 110], or\n * // [0x72, 0x61, 0x69, 0x6E]\n *\n * v.codePoints('\\uD83D\\uDE00 smile'); // or '😀 smile'\n * // => [128512, 32, 115, 109, 105, 108, 101], or\n * // [0x1F600, 0x20, 0x73, 0x6D, 0x69, 0x6C, 0x65]\n */\nexport default function codePoints(subject) {\n const subjectString = coerceToString(subject);\n const subjectStringLength = subjectString.length;\n const codePointArray = [];\n let index = 0;\n let codePointNumber;\n while (index < subjectStringLength) {\n codePointNumber = codePointAt(subjectString, index);\n codePointArray.push(codePointNumber);\n index += codePointNumber > 0xFFFF ? 2 : 1;\n }\n return codePointArray;\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport nilDefault from 'helper/undefined/nil_default';\nimport { REGEXP_UNICODE_CHARACTER } from 'helper/reg_exp/const';\n\n/**\n * Splits `subject` into an array of graphemes taking care of\n * surrogate pairs and\n * combining marks.\n *\n * @function graphemes\n * @static\n * @since 1.0.0\n * @memberOf Split\n * @param {string} [subject=''] The string to split into characters.\n * @return {Array} Returns the array of graphemes.\n * @example\n * v.graphemes('\\uD835\\uDC00\\uD835\\uDC01'); // or '𝐀𝐁'\n * // => ['\\uD835\\uDC00', '\\uD835\\uDC01'], or\n * // ['𝐀', '𝐁']\n *\n * v.graphemes('cafe\\u0301'); // or 'café'\n * // => ['c', 'a', 'f', 'e\\u0301'], or\n * // ['c', 'a', 'f', 'é']\n */\nexport default function graphemes(subject) {\n const subjectString = coerceToString(subject);\n return nilDefault(subjectString.match(REGEXP_UNICODE_CHARACTER), []);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Splits `subject` into an array of chunks by `separator`.\n *\n * @function split\n * @static\n * @since 1.0.0\n * @memberOf Split\n * @param {string} [subject=''] The string to split into characters.\n * @param {string|RegExp} [separator] The pattern to match the separator.\n * @param {number} [limit] Limit the number of chunks to be found.\n * @return {Array} Returns the array of chunks.\n * @example\n * v.split('rage against the dying of the light', ' ');\n * // => ['rage', 'against', 'the', 'dying', 'of', 'the', 'light']\n *\n * v.split('the dying of the light', /\\s/, 3);\n * // => ['the', 'dying', 'of']\n */\nexport default function split(subject, separator, limit) {\n const subjectString = coerceToString(subject);\n return subjectString.split(separator, limit);\n}","/**\n * Checks whether `subject` contains substring at specific `index`.\n *\n * @ignore\n * @param {string} subject The subject to search in.\n * @param {string} substring The substring to search/\n * @param {number} index The index to search substring.\n * @param {boolean} lookBehind Whether to look behind (true) or ahead (false).\n * @return {boolean} Returns a boolean whether the substring exists.\n */\nexport default function hasSubstringAtIndex(subject, substring, index, lookBehind = true) {\n let indexOffset = 0;\n if (lookBehind) {\n indexOffset = - substring.length + 1;\n }\n const extractedSubstring = subject.substr(index + indexOffset, substring.length);\n return extractedSubstring.toLowerCase() === substring;\n}","import { REGEXP_TAG_LIST } from 'helper/reg_exp/const';\n\n/**\n * Parses the tags from the string '...'.\n *\n * @ignore\n * @param {string} tags The string that contains the tags.\n * @return {string[]} Returns the array of tag names.\n */\nexport default function parseTagList(tags) {\n const tagsList = [];\n let match;\n while ((match = REGEXP_TAG_LIST.exec(tags)) !== null) {\n tagsList.push(match[1]);\n }\n return tagsList;\n}","import { REGEXP_WHITESPACE } from 'helper/reg_exp/const';\n\nconst STATE_START_TAG = 0;\nconst STATE_NON_WHITESPACE = 1;\nconst STATE_DONE = 2;\n\n/**\n * Parses the tag name from html content\n *\n * @param {string} tagContent The tag content\n * @return {string} Returns the tag name\n */\nexport default function parseTagName(tagContent) {\n let state = STATE_START_TAG;\n let tagName = '';\n let index = 0;\n while (state !== STATE_DONE) {\n let char = tagContent[index++].toLowerCase();\n switch (char) {\n case '<':\n break;\n case '>':\n state = STATE_DONE;\n break;\n default:\n if (REGEXP_WHITESPACE.test(char)) {\n if (state === STATE_NON_WHITESPACE) {\n state = STATE_DONE;\n }\n } else {\n if (state === STATE_START_TAG) {\n state = STATE_NON_WHITESPACE;\n }\n if (char !== '/') {\n tagName += char;\n }\n }\n break;\n }\n }\n return tagName;\n}","/* eslint-disable */\nimport coerceToString from 'helper/string/coerce_to_string';\nimport hasSubstringAtIndex from 'helper/string/has_substring_at_index';\nimport parseTagList from 'helper/strip/parse_tag_list';\nimport parseTagName from 'helper/strip/parse_tag_name';\n\nconst STATE_OUTPUT = 0;\nconst STATE_HTML = 1;\nconst STATE_EXCLAMATION = 2;\nconst STATE_COMMENT = 3;\n\n/**\n * Strips subject tags from `subject`.\n *\n * @function stripTags\n * @static\n * @since 1.1.0\n * @memberOf Strip\n * @param {string} [subject=''] The string to strip.\n * @param {string|Array} [allowableTags] The string or array of tags that should not be stripped.\n * @param {string} [replacement=''] The string to replace the stripped tag.\n * @return {string} Returns the stripped string.\n * @example\n * v.trim(' Mother nature ');\n * // => 'Mother nature'\n *\n * v.trim('--Earth--', '-');\n * // => 'Earth'\n */\nexport default function trim(subject, allowableTags, replacement) {\n subject = coerceToString(subject);\n if (subject === '') {\n return '';\n }\n if (!Array.isArray(allowableTags)) {\n const allowableTagsString = coerceToString(allowableTags);\n allowableTags = allowableTagsString === '' ? [] : parseTagList(allowableTagsString);\n }\n const replacementString = coerceToString(replacement);\n const length = subject.length;\n const hasAllowableTags = allowableTags.length > 0;\n const hasSubstring = hasSubstringAtIndex.bind(null, subject);\n let state = STATE_OUTPUT;\n let depth = 0;\n let output = '';\n let tagContent = '';\n let quote = null;\n for (let index = 0; index < length; index++) {\n const char = subject[index];\n let advance = false;\n switch (char) {\n case '<':\n if (quote) {\n break;\n }\n if (hasSubstring('< ', index, false)) {\n advance = true;\n break;\n }\n if (state === STATE_OUTPUT) {\n advance = true;\n state = STATE_HTML;\n break;\n }\n if (state === STATE_HTML) {\n depth++;\n break;\n }\n advance = true;\n break;\n case '!':\n if (state === STATE_HTML && hasSubstring('':\n if (depth > 0) {\n depth--;\n break;\n }\n if (quote) {\n break;\n }\n if (state === STATE_HTML) {\n quote = null;\n state = STATE_OUTPUT;\n if (hasAllowableTags) {\n tagContent += '>';\n let tagName = parseTagName(tagContent);\n if (allowableTags.indexOf(tagName.toLowerCase()) !== -1) {\n output += tagContent;\n }\n tagContent = '';\n } else {\n tagContent += replacementString;\n }\n break;\n }\n if (state === STATE_EXCLAMATION || state === STATE_COMMENT && hasSubstring('-->', index)) {\n quote = null;\n state = STATE_OUTPUT;\n tagContent = '';\n break;\n }\n advance = true;\n break;\n default:\n advance = true;\n }\n if (advance) {\n switch (state) {\n case STATE_OUTPUT:\n output += char;\n break;\n case STATE_HTML:\n if (hasAllowableTags) {\n tagContent += char;\n }\n break;\n }\n }\n }\n\n return output;\n}","let globalObject = null;\n\nfunction getGlobalObject() {\n if (globalObject !== null) {\n return globalObject;\n }\n /* istanbul ignore next */\n // It's hard to mock the global variables. This code surely works fine. I hope :)\n if (typeof global === 'object' && global.Object === Object) {\n // NodeJS global object\n globalObject = global;\n } else if (typeof self === 'object' && self.Object === Object) {\n // self property from Window object\n globalObject = self;\n } else {\n // Other cases. Function constructor always has the context as global object\n globalObject = new Function('return this')();\n }\n return globalObject;\n}\n\nexport default getGlobalObject;","import getGlobalObject from 'helper/object/get_global';\n\nconst globalObject = getGlobalObject();\nconst previousV = globalObject.v;\n\n/**\n * Restores `v` variable to previous value and returns Voca library instance.\n *\n * @function noConflict\n * @static\n * @since 1.0.0\n * @memberOf Util\n * @return {Object} Returns Voca library instance.\n * @example\n * var voca = v.noConflict();\n * voca.isAlhpa('Hello');\n * // => true\n */\nexport default function noConflict() {\n if (this === globalObject.v) {\n globalObject.v = previousV;\n }\n return this;\n}","import functions from 'functions';\n\n\n/**\n * The chain wrapper constructor.\n *\n * @ignore\n * @param {string} subject The string to be wrapped.\n * @param {boolean} [explicitChain=false] A boolean that indicates if the chain sequence is explicit or implicit.\n * @return {ChainWrapper} Returns a new instance of `ChainWrapper`\n * @constructor\n */\nfunction ChainWrapper(subject, explicitChain) {\n this._wrappedValue = subject;\n this._explicitChain = explicitChain;\n}\n\n/**\n * Unwraps the chain sequence wrapped value.\n *\n * @memberof Chain\n * @since 1.0.0\n * @function __proto__value\n * @return {*} Returns the unwrapped value.\n * @example\n * v\n * .chain('Hello world')\n * .replace('Hello', 'Hi')\n * .lowerCase()\n * .slugify()\n * .value()\n * // => 'hi-world'\n *\n * v(' Space travel ')\n * .trim()\n * .truncate(8)\n * .value()\n * // => 'Space...'\n */\nChainWrapper.prototype.value = function() {\n return this._wrappedValue;\n};\n\n/**\n * Override the default object valueOf().\n *\n * @ignore\n * @return {*} Returns the wrapped value.\n */\nChainWrapper.prototype.valueOf = function() {\n return this.value();\n};\n\n/**\n * Returns the wrapped value to be used in JSON.stringify().\n *\n * @ignore\n * @return {*} Returns the wrapped value.\n */\nChainWrapper.prototype.toJSON = function() {\n return this.value();\n};\n\n/**\n * Returns the string representation of the wrapped value.\n *\n * @ignore\n * @return {string} Returns the string representation.\n */\nChainWrapper.prototype.toString = function() {\n return String(this.value());\n};\n\n/**\n * Creates a new chain object that enables explicit chain sequences.\n * Use `v.prototype.value()` to unwrap the result.
\n * Does not modify the wrapped value.\n *\n * @memberof Chain\n * @since 1.0.0\n * @function __proto__chain\n * @return {Object} Returns the wrapper in explicit mode.\n * @example\n * v('Back to School')\n * .chain()\n * .lowerCase()\n * .words()\n * .value()\n * // => ['back', 'to', 'school']\n *\n * v(\" Back to School \")\n * .chain()\n * .trim()\n * .truncate(7)\n * .value()\n * // => 'Back...'\n */\nChainWrapper.prototype.chain = function() {\n return new ChainWrapper(this._wrappedValue, true);\n};\n\n/**\n * Modifies the wrapped value with the invocation result of `changer` function. The current wrapped value is the\n * argument of `changer` invocation.\n *\n * @memberof Chain\n * @since 1.0.0\n * @function __proto__thru\n * @param {Function} changer The function to invoke.\n * @return {Object} Returns the new wrapper that wraps the invocation result of `changer`.\n * @example\n * v\n * .chain('sun is shining')\n * .words()\n * .thru(function(words) {\n * return words[0];\n * })\n * .value()\n * // => 'sun'\n *\n */\nChainWrapper.prototype.thru = function(changer) {\n if (typeof changer === 'function') {\n return new ChainWrapper(changer(this._wrappedValue), this._explicitChain);\n }\n return this;\n};\n\n/**\n * A boolean that indicates if the chain sequence is explicit or implicit.\n * @ignore\n * @type {boolean}\n * @private\n */\nChainWrapper.prototype._explicitChain = true;\n\n/**\n * Make a voca function chainable.\n *\n * @ignore\n * @param {Function} functionInstance The function to make chainable\n * @return {Function} Returns the chainable function\n */\nfunction makeFunctionChainable(functionInstance) {\n return function(...args) {\n const result = functionInstance(this._wrappedValue, ...args);\n if (this._explicitChain || typeof result === 'string') {\n return new ChainWrapper(result, this._explicitChain);\n } else {\n return result;\n }\n };\n}\n\nObject.keys(functions).forEach(function(name) {\n ChainWrapper.prototype[name] = makeFunctionChainable(functions[name]);\n});\n\n\nexport default ChainWrapper;","import ChainWrapper from 'chain/wrapper';\n\n/**\n * Creates a chain object that wraps `subject`, enabling explicit chain sequences.
\n * Use `v.prototype.value()` to unwrap the result.\n *\n * @memberOf Chain\n * @since 1.0.0\n * @function chain\n * @param {string} subject The string to wrap.\n * @return {Object} Returns the new wrapper object.\n * @example\n * v\n * .chain('Back to School')\n * .lowerCase()\n * .words()\n * .value()\n * // => ['back', 'to', 'school']\n */\nexport default function chain(subject) {\n return new ChainWrapper(subject, true);\n}","import chain from './chain/chain'; // include chain here to resolve af circular reference\nimport ChainWrapper from './chain/wrapper';\nimport functions from './functions';\n\n/**\n * Creates a chain object that wraps `subject`, enabling implicit chain sequences.
\n * A function that returns `number`, `boolean` or `array` type terminates the chain sequence and returns the unwrapped value.\n * Otherwise use `v.prototype.value()` to unwrap the result.\n *\n * @memberOf Chain\n * @since 1.0.0\n * @function v\n * @param {string} subject The string to wrap.\n * @return {Object} Returns the new wrapper object.\n * @example\n * v('Back to School')\n * .lowerCase()\n * .words()\n * // => ['back', 'to', 'school']\n *\n * v(\" Back to School \")\n * .trim()\n * .truncate(7)\n * .value()\n * // => 'Back...'\n */\nfunction Voca(subject) {\n return new ChainWrapper(subject, false);\n}\n\nObject.assign(Voca, functions, {\n chain: chain\n});\n\nexport default Voca;","/**\n * A regular expression string matching digits\n *\n * @type {string}\n * @ignore\n */\nexport const digit = '\\\\d';\n\n/**\n * A regular expression string matching whitespace\n *\n * @type {string}\n * @ignore\n */\nexport const whitespace = '\\\\s\\\\uFEFF\\\\xA0';\n\n/**\n * A regular expression string matching high surrogate\n *\n * @type {string}\n * @ignore\n */\nexport const highSurrogate = '\\\\uD800-\\\\uDBFF';\n\n/**\n * A regular expression string matching low surrogate\n *\n * @type {string}\n * @ignore\n */\nexport const lowSurrogate = '\\\\uDC00-\\\\uDFFF';\n\n/**\n * A regular expression string matching diacritical mark\n *\n * @type {string}\n * @ignore\n */\nexport const diacriticalMark = '\\\\u0300-\\\\u036F\\\\u1AB0-\\\\u1AFF\\\\u1DC0-\\\\u1DFF\\\\u20D0-\\\\u20FF\\\\uFE20-\\\\uFE2F';\n\n/**\n * A regular expression to match the base character for a combining mark\n *\n * @type {string}\n * @ignore\n */\nexport const base = '\\\\0-\\\\u02FF\\\\u0370-\\\\u1AAF\\\\u1B00-\\\\u1DBF\\\\u1E00-\\\\u20CF\\\\u2100-\\\\uD7FF\\\\uE000-\\\\uFE1F\\\\uFE30-\\\\uFFFF';\n\n/**\n * Regular expression to match combining marks\n *\n * @see http://unicode.org/faq/char_combmark.html\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_COMBINING_MARKS = new RegExp('([' + base + ']|[' + highSurrogate + '][' + lowSurrogate + ']|[' + highSurrogate + '](?![' + lowSurrogate + '])|(?:[^' + highSurrogate + ']|^)[' + lowSurrogate + '])([' + diacriticalMark + ']+)', 'g');\n\n/**\n * Regular expression to match surrogate pairs\n *\n * @see http://www.unicode.org/faq/utf_bom.html#utf16-2\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_SURROGATE_PAIRS = new RegExp('([' + highSurrogate + '])([' + lowSurrogate + '])', 'g');\n\n/**\n * Regular expression to match an unicode character\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_UNICODE_CHARACTER = new RegExp(\n'((?:[' + base + ']|[' + highSurrogate + '][' + lowSurrogate + ']|[' + highSurrogate + '](?![' + lowSurrogate + '])|(?:[^' + highSurrogate + ']|^)[' + lowSurrogate + '])(?:[' + diacriticalMark + ']+))|\\\n([' + highSurrogate + '][' + lowSurrogate + '])|\\\n([\\\\n\\\\r\\\\u2028\\\\u2029])|\\\n(.)', 'g');\n\n/**\n * Regular expression to match whitespaces\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_WHITESPACE = new RegExp('[' + whitespace + ']');\n\n/**\n * Regular expression to match whitespaces from the left side\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_TRIM_LEFT = new RegExp('^[' + whitespace + ']+');\n\n/**\n * Regular expression to match whitespaces from the right side\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_TRIM_RIGHT = new RegExp('[' + whitespace + ']+$');\n\n/**\n * Regular expression to match digit characters\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_DIGIT = new RegExp('^' + digit + '+$');\n\n/**\n * Regular expression to match regular expression special characters\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_SPECIAL_CHARACTERS = /[-[\\]{}()*+!<=:?.\\/\\\\^$|#,]/g;\n\n/**\n * Regular expression to match not latin characters\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_NON_LATIN = /[^A-Za-z0-9]/g;\n\n/**\n * Regular expression to match HTML special characters.\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_HTML_SPECIAL_CHARACTERS = /[<>&\"'`]/g;\n\n/**\n * Regular expression to match sprintf format string\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_CONVERSION_SPECIFICATION = /(%{1,2})(?:(\\d+)\\$)?(\\+)?([ 0]|'.{1})?(-)?(\\d+)?(?:\\.(\\d+))?([bcdiouxXeEfgGs])?/g;\n\n/**\n * Regular expression to match trailing zeros in a number\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_TRAILING_ZEROS = /\\.?0+$/g;\n\n/**\n * Regular expression to match flags from a regular expression.\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_FLAGS = /[gimuy]*$/;\n\n/**\n * Regular expression to match a list of tags.\n *\n * @see https://html.spec.whatwg.org/multipage/syntax.html#syntax-tag-name\n * @type {RegExp}\n * @ignore\n */\n\nexport const REGEXP_TAG_LIST = /<([A-Za-z0-9]+)>/g;","import { diacriticalMark, digit, whitespace } from 'helper/reg_exp/const';\n\n/**\n * A regular expression to match the General Punctuation Unicode block\n *\n * @type {string}\n * @ignore\n */\nconst generalPunctuationBlock = '\\\\u2000-\\\\u206F';\n\n/**\n * A regular expression to match non characters from from Basic Latin and Latin-1 Supplement Unicode blocks\n *\n * @type {string}\n * @ignore\n */\nconst nonCharacter = '\\\\x00-\\\\x2F\\\\x3A-\\\\x40\\\\x5B-\\\\x60\\\\x7b-\\\\xBF\\\\xD7\\\\xF7';\n\n/**\n * A regular expression to match the dingbat Unicode block\n *\n * @type {string}\n * @ignore\n */\nconst dingbatBlock = '\\\\u2700-\\\\u27BF';\n\n/**\n * A regular expression string that matches lower case letters: LATIN\n *\n * @type {string}\n * @ignore\n */\nconst lowerCaseLetter = 'a-z\\\\xB5\\\\xDF-\\\\xF6\\\\xF8-\\\\xFF\\\\u0101\\\\u0103\\\\u0105\\\\u0107\\\\u0109\\\\u010B\\\\u010D\\\\u010F\\\\u0111\\\\u0113\\\\u0115\\\\u0117\\\\u0119\\\\u011B\\\\u011D\\\\u011F\\\\u0121\\\\u0123\\\\u0125\\\\u0127\\\\u0129\\\\u012B\\\\u012D\\\\u012F\\\\u0131\\\\u0133\\\\u0135\\\\u0137\\\\u0138\\\\u013A\\\\u013C\\\\u013E\\\\u0140\\\\u0142\\\\u0144\\\\u0146\\\\u0148\\\\u0149\\\\u014B\\\\u014D\\\\u014F\\\\u0151\\\\u0153\\\\u0155\\\\u0157\\\\u0159\\\\u015B\\\\u015D\\\\u015F\\\\u0161\\\\u0163\\\\u0165\\\\u0167\\\\u0169\\\\u016B\\\\u016D\\\\u016F\\\\u0171\\\\u0173\\\\u0175\\\\u0177\\\\u017A\\\\u017C\\\\u017E-\\\\u0180\\\\u0183\\\\u0185\\\\u0188\\\\u018C\\\\u018D\\\\u0192\\\\u0195\\\\u0199-\\\\u019B\\\\u019E\\\\u01A1\\\\u01A3\\\\u01A5\\\\u01A8\\\\u01AA\\\\u01AB\\\\u01AD\\\\u01B0\\\\u01B4\\\\u01B6\\\\u01B9\\\\u01BA\\\\u01BD-\\\\u01BF\\\\u01C6\\\\u01C9\\\\u01CC\\\\u01CE\\\\u01D0\\\\u01D2\\\\u01D4\\\\u01D6\\\\u01D8\\\\u01DA\\\\u01DC\\\\u01DD\\\\u01DF\\\\u01E1\\\\u01E3\\\\u01E5\\\\u01E7\\\\u01E9\\\\u01EB\\\\u01ED\\\\u01EF\\\\u01F0\\\\u01F3\\\\u01F5\\\\u01F9\\\\u01FB\\\\u01FD\\\\u01FF\\\\u0201\\\\u0203\\\\u0205\\\\u0207\\\\u0209\\\\u020B\\\\u020D\\\\u020F\\\\u0211\\\\u0213\\\\u0215\\\\u0217\\\\u0219\\\\u021B\\\\u021D\\\\u021F\\\\u0221\\\\u0223\\\\u0225\\\\u0227\\\\u0229\\\\u022B\\\\u022D\\\\u022F\\\\u0231\\\\u0233-\\\\u0239\\\\u023C\\\\u023F\\\\u0240\\\\u0242\\\\u0247\\\\u0249\\\\u024B\\\\u024D\\\\u024F';\n\n/**\n * A regular expression string that matches upper case letters: LATIN\n *\n * @type {string}\n * @ignore\n */\nconst upperCaseLetter = '\\\\x41-\\\\x5a\\\\xc0-\\\\xd6\\\\xd8-\\\\xde\\\\u0100\\\\u0102\\\\u0104\\\\u0106\\\\u0108\\\\u010a\\\\u010c\\\\u010e\\\\u0110\\\\u0112\\\\u0114\\\\u0116\\\\u0118\\\\u011a\\\\u011c\\\\u011e\\\\u0120\\\\u0122\\\\u0124\\\\u0126\\\\u0128\\\\u012a\\\\u012c\\\\u012e\\\\u0130\\\\u0132\\\\u0134\\\\u0136\\\\u0139\\\\u013b\\\\u013d\\\\u013f\\\\u0141\\\\u0143\\\\u0145\\\\u0147\\\\u014a\\\\u014c\\\\u014e\\\\u0150\\\\u0152\\\\u0154\\\\u0156\\\\u0158\\\\u015a\\\\u015c\\\\u015e\\\\u0160\\\\u0162\\\\u0164\\\\u0166\\\\u0168\\\\u016a\\\\u016c\\\\u016e\\\\u0170\\\\u0172\\\\u0174\\\\u0176\\\\u0178\\\\u0179\\\\u017b\\\\u017d\\\\u0181\\\\u0182\\\\u0184\\\\u0186\\\\u0187\\\\u0189-\\\\u018b\\\\u018e-\\\\u0191\\\\u0193\\\\u0194\\\\u0196-\\\\u0198\\\\u019c\\\\u019d\\\\u019f\\\\u01a0\\\\u01a2\\\\u01a4\\\\u01a6\\\\u01a7\\\\u01a9\\\\u01ac\\\\u01ae\\\\u01af\\\\u01b1-\\\\u01b3\\\\u01b5\\\\u01b7\\\\u01b8\\\\u01bc\\\\u01c4\\\\u01c5\\\\u01c7\\\\u01c8\\\\u01ca\\\\u01cb\\\\u01cd\\\\u01cf\\\\u01d1\\\\u01d3\\\\u01d5\\\\u01d7\\\\u01d9\\\\u01db\\\\u01de\\\\u01e0\\\\u01e2\\\\u01e4\\\\u01e6\\\\u01e8\\\\u01ea\\\\u01ec\\\\u01ee\\\\u01f1\\\\u01f2\\\\u01f4\\\\u01f6-\\\\u01f8\\\\u01fa\\\\u01fc\\\\u01fe\\\\u0200\\\\u0202\\\\u0204\\\\u0206\\\\u0208\\\\u020a\\\\u020c\\\\u020e\\\\u0210\\\\u0212\\\\u0214\\\\u0216\\\\u0218\\\\u021a\\\\u021c\\\\u021e\\\\u0220\\\\u0222\\\\u0224\\\\u0226\\\\u0228\\\\u022a\\\\u022c\\\\u022e\\\\u0230\\\\u0232\\\\u023a\\\\u023b\\\\u023d\\\\u023e\\\\u0241\\\\u0243-\\\\u0246\\\\u0248\\\\u024a\\\\u024c\\\\u024e';\n\n\n/**\n * Regular expression to match Unicode words\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_WORD = new RegExp(\n '(?:[' + upperCaseLetter + '][' + diacriticalMark + ']*)?(?:[' + lowerCaseLetter + '][' + diacriticalMark + ']*)+|\\\n(?:[' + upperCaseLetter + '][' + diacriticalMark + ']*)+(?![' + lowerCaseLetter + '])|\\\n[' + digit + ']+|\\\n[' + dingbatBlock + ']|\\\n[^' + nonCharacter + generalPunctuationBlock + whitespace + ']+', 'g');\n\n/**\n * Regular expression to match words from Basic Latin and Latin-1 Supplement blocks\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_LATIN_WORD = /[A-Z\\xC0-\\xD6\\xD8-\\xDE]?[a-z\\xDF-\\xF6\\xF8-\\xFF]+|[A-Z\\xC0-\\xD6\\xD8-\\xDE]+(?![a-z\\xDF-\\xF6\\xF8-\\xFF])|\\d+/g;\n\n/**\n * Regular expression to match alpha characters\n *\n * @see http://stackoverflow.com/a/22075070/1894471\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_ALPHA = new RegExp('^(?:[' + lowerCaseLetter + upperCaseLetter + '][' + diacriticalMark + ']*)+$');\n\n/**\n * Regular expression to match alpha and digit characters\n *\n * @see http://stackoverflow.com/a/22075070/1894471\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_ALPHA_DIGIT = new RegExp('^((?:[' + lowerCaseLetter + upperCaseLetter + '][' + diacriticalMark + ']*)|[' + digit + '])+$');\n\n/**\n * Regular expression to match Extended ASCII characters, i.e. the first 255\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_EXTENDED_ASCII = /^[\\x00-\\xFF]*$/;","/**\n * Max save integer value\n *\n * @ignore\n * @type {number}\n */\nexport const MAX_SAFE_INTEGER = 0x1fffffffffffff;","export default Object.freeze({\n // Type specifiers\n TYPE_INTEGER : 'i',\n TYPE_INTEGER_BINARY : 'b',\n TYPE_INTEGER_ASCII_CHARACTER : 'c',\n TYPE_INTEGER_DECIMAL : 'd',\n TYPE_INTEGER_OCTAL : 'o',\n TYPE_INTEGER_UNSIGNED_DECIMAL : 'u',\n TYPE_INTEGER_HEXADECIMAL : 'x',\n TYPE_INTEGER_HEXADECIMAL_UPPERCASE : 'X',\n TYPE_FLOAT_SCIENTIFIC : 'e',\n TYPE_FLOAT_SCIENTIFIC_UPPERCASE : 'E',\n TYPE_FLOAT : 'f',\n TYPE_FLOAT_SHORT : 'g',\n TYPE_FLOAT_SHORT_UPPERCASE : 'G',\n TYPE_STRING : 's',\n\n // Simple literals\n LITERAL_PERCENT : '%',\n LITERAL_SINGLE_QUOTE : \"'\",\n LITERAL_PLUS : '+',\n LITERAL_MINUS : '-',\n LITERAL_PERCENT_SPECIFIER : '%%',\n\n // Radix constants to format numbers\n RADIX_BINARY : 2,\n RADIX_OCTAL : 8,\n RADIX_DECIMAL : 10,\n RADIX_HEXADECIMAL : 16\n});","/**\n * A property that contains the library semantic version number.\n * @name version\n * @static\n * @since 1.0.0\n * @memberOf Util\n * @type string\n * @example\n * v.version\n * // => '1.0.0'\n */\nconst version = '1.0.0';\n\nexport default version;"],"names":["isNil","value","undefined","coerceToBoolean","defaultValue","Boolean","isString","subject","coerceToString","String","capitalize","restToLower","subjectString","restToLowerCaseBoolean","toLowerCase","substr","toUpperCase","lowerCase","nilDefault","toString","words","pattern","flags","patternRegExp","REGEXP_EXTENDED_ASCII","test","REGEXP_LATIN_WORD","REGEXP_WORD","RegExp","flagsString","match","wordToCamel","word","index","camelCase","map","join","decapitalize","kebabCase","snakeCase","upperCase","clipNumber","downLimit","upLimit","toInteger","Infinity","MAX_SAFE_INTEGER","truncate","length","end","lengthInt","endString","charAt","position","isHighSurrogate","codePoint","HIGH_SURROGATE_START","HIGH_SURROGATE_END","isLowSurrogate","LOW_SURROGATE_START","LOW_SURROGATE_END","getAstralNumberFromSurrogatePair","highSurrogate","lowSurrogate","coerceToNumber","Number","nanDefault","codePointAt","subjectStringLength","positionNumber","firstCodePoint","charCodeAt","secondCodePoint","first","graphemeAt","graphemeMatch","graphemeMatchIndex","REGEXP_UNICODE_CHARACTER","exec","lastIndex","last","prune","truncatedLength","replace","offset","wordInsertLength","slice","start","substring","count","countGrapheme","REGEXP_COMBINING_MARKS","REGEXP_SURROGATE_PAIRS","countSubstrings","substringString","substringLength","matchIndex","indexOf","countWhere","predicate","context","predicateWithContext","bind","reduce","call","countTruthy","character","countWords","ReplacementIndex","repeat","times","timesInt","repeatString","buildPadding","padCharacters","padStringRepeat","padStringRest","padLeft","pad","padString","padRight","alignAndPad","conversion","width","padType","alignmentSpecifier","Const","LITERAL_MINUS","getPaddingCharacter","addSignToFormattedNumber","replacementNumber","formattedReplacement","signSpecifier","LITERAL_PLUS","float","replacement","parseFloat","isNaN","precision","typeSpecifier","TYPE_FLOAT","toFixed","TYPE_FLOAT_SCIENTIFIC","toExponential","TYPE_FLOAT_SCIENTIFIC_UPPERCASE","TYPE_FLOAT_SHORT","TYPE_FLOAT_SHORT_UPPERCASE","formatFloatAsShort","nonZeroPrecision","toPrecision","REGEXP_TRAILING_ZEROS","integerBase","integer","parseInt","TYPE_INTEGER_ASCII_CHARACTER","fromCharCode","TYPE_INTEGER_BINARY","RADIX_BINARY","TYPE_INTEGER_OCTAL","RADIX_OCTAL","TYPE_INTEGER_HEXADECIMAL","RADIX_HEXADECIMAL","TYPE_INTEGER_HEXADECIMAL_UPPERCASE","integerDecimal","stringFormat","compute","formatFunction","TYPE_STRING","formatString","TYPE_INTEGER_DECIMAL","TYPE_INTEGER","formatIntegerDecimal","TYPE_INTEGER_UNSIGNED_DECIMAL","formatIntegerBase","formatFloat","formattedString","ConversionSpecification","properties","percent","paddingSpecifier","validate","replacementsLength","Error","replacementIndex","replacements","conversionSpecification","widthSpecifier","precisionSpecifier","isPercentLiteral","actualReplacementIndex","getIndexByPosition","incrementOnEmptyPosition","computeReplacement","sprintf","format","boundReplacementMatch","replacementMatch","REGEXP_CONVERSION_SPECIFICATION","vprintf","replaceSpecialCharacter","escapeCharactersMap","escapeHtml","REGEXP_HTML_SPECIAL_CHARACTERS","escapeRegExp","REGEXP_SPECIAL_CHARACTERS","reduceUnescapedString","string","key","unescapeCharactersMap","unescapeHtml","characters","search","fromIndex","lastIndexOf","fromIndexNumber","insert","toInsert","toInsertString","getDiacriticsMap","diacriticsMap","keys","diacritics","forEach","getLatinCharacter","characterWithoutDiacritic","removeCombiningMarks","cleanCharacter","latinise","REGEXP_NON_LATIN","paddingLength","paddingSideLength","paddingSideRemainingLength","getRegExpFlags","regExp","REGEXP_FLAGS","includes","searchString","appendFlagToRegExp","appendFlag","regularExpressionFlags","source","replaceAll","global","appendFlagToRegularExpression","reverse","split","reverseGrapheme","$0","$1","$2","reversedString","slugify","cleanSubjectString","splice","deleteCount","toAdd","toAddString","startPosition","deleteCountNumber","trimLeft","whitespace","whitespaceString","REGEXP_TRIM_LEFT","whitespaceLength","matchWhitespace","totalWhitespaceLength","trimRight","REGEXP_TRIM_RIGHT","subjectLength","trim","determineOptions","options","OPTION_WIDTH","OPTION_NEW_LINE","OPTION_INDENT","OPTION_CUT","wordWrap","newLine","indent","cut","wrappedLine","spaceToWrapAt","endsWith","isAlpha","REGEXP_ALPHA","isAlphaDigit","REGEXP_ALPHA_DIGIT","isBlank","isDigit","REGEXP_DIGIT","isEmpty","isLowerCase","valueString","isNumeric","valueNumeric","isUpperCase","matches","patternString","startsWith","startString","chars","codePoints","codePointArray","codePointNumber","push","graphemes","separator","limit","hasSubstringAtIndex","lookBehind","indexOffset","extractedSubstring","parseTagList","tags","tagsList","REGEXP_TAG_LIST","parseTagName","tagContent","state","STATE_START_TAG","tagName","STATE_DONE","char","REGEXP_WHITESPACE","STATE_NON_WHITESPACE","allowableTags","Array","isArray","allowableTagsString","replacementString","hasAllowableTags","hasSubstring","STATE_OUTPUT","depth","output","quote","advance","STATE_HTML","STATE_EXCLAMATION","STATE_COMMENT","getGlobalObject","globalObject","Object","self","Function","noConflict","this","v","previousV","ChainWrapper","explicitChain","_wrappedValue","_explicitChain","makeFunctionChainable","functionInstance","args","result","chain","Voca","digit","diacriticalMark","base","generalPunctuationBlock","nonCharacter","dingbatBlock","lowerCaseLetter","upperCaseLetter","prototype","increment","freeze","LITERAL_PERCENT_SPECIFIER","paddingCharacter","LITERAL_SINGLE_QUOTE","version","valueOf","toJSON","thru","changer","functions","name","_extends"],"mappings":"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ACC,WACA,WACA,YACA,aACA,aACA,UEPDQ,QACC,oCACA,oCACA,qCACA,sCACA,6BACA,0BAEDE,GAAaoI,OAAO1H,KAAKZ,IKHzBa,MACC,OACA,OACA,0CACA,gBACA,kBACA,sBACA,uCACA,aACA,uBACA,sBACA,8BACA,WACA,qBACA,yBACA,eACA,uBACA,mDACA,iBACA,WACA,wBACA,wBACA,sBACA,yCACA,cACA,iBACA,WACA,wBACA,qBACA,2CACA,gBACA,mBACA,sBACA,wCACA,aACA,uBACA,uBACA,+BACA,YACA,qBACA,0BACA,eACA,wBACA,mDACA,iBACA,WACA,wBACA,0BACA,uBACA,yCACA,cACA,kBACA,WACA,0BACA,sBACC,QACA,QACA,SACA,SACA,OACA,OACA,OACA,QACA,QACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACF,QACE,OACA,OACA,OACA,OACA,QACA,OACA,OACA,OACA,OACA,KAGJF,GAAgB,KenHdqD,GAAe,QACfC,GAAkB,UAClBC,GAAgB,SAChBC,GAAa,MkBLb4C,GAAkB,EAClBK,GAAuB,EACvBH,GAAa,ECEbW,GAAe,EACfK,GAAa,EACbC,GAAoB,EACpBC,GAAgB,ECTlBE,GAAe,KCEbA,GAAeD,KACfQ,GAAYP,GAAaM,EQQzB0B,GAAU,qyBP4BhBxB,IAAakB,UAAU9W,MAAQ,iBACtByV,MAAKK,eASdF,GAAakB,UAAUO,QAAU,iBACxB5B,MAAKzV,SASd4V,GAAakB,UAAUQ,OAAS,iBACvB7B,MAAKzV,SASd4V,GAAakB,UAAU5V,SAAW,iBACzBV,QAAOiV,KAAKzV,UA2BrB4V,GAAakB,UAAUV,MAAQ,iBACtB,IAAIR,IAAaH,KAAKK,eAAe,IAuB9CF,GAAakB,UAAUS,KAAO,SAASC,SACd,kBAAZA,GACF,GAAI5B,IAAa4B,EAAQ/B,KAAKK,eAAgBL,KAAKM,gBAErDN,MASTG,GAAakB,UAAUf,gBAAiB,EAoBxCV,OAAO1H,KAAK8J,IAAW5J,QAAQ,SAAS6J,MACzBZ,UAAUY,GAAQ1B,GAAsByB,GAAUC,qLE7HjEC,IAActB,GAAMoB,UACXrB"} \ No newline at end of file +{"version":3,"file":null,"sources":["../src/helper/object/is_nil.js","../src/helper/boolean/coerce_to_boolean.js","../src/query/is_string.js","../src/helper/string/coerce_to_string.js","../src/case/capitalize.js","../src/case/lower_case.js","../src/helper/undefined/nil_default.js","../src/helper/string/to_string.js","../src/split/words.js","../src/case/camel_case.js","../src/case/decapitalize.js","../src/case/kebab_case.js","../src/case/snake_case.js","../src/case/upper_case.js","../src/helper/number/clip_number.js","../src/helper/number/to_integer.js","../src/chop/truncate.js","../src/chop/char_at.js","../src/helper/string/surrogate_pair.js","../src/helper/number/coerce_to_number.js","../src/helper/number/nan_default.js","../src/chop/code_point_at.js","../src/chop/first.js","../src/chop/grapheme_at.js","../src/chop/last.js","../src/chop/prune.js","../src/chop/slice.js","../src/chop/substr.js","../src/chop/substring.js","../src/count/count.js","../src/count/count_graphemes.js","../src/count/count_substrings.js","../src/count/count_where.js","../src/count/count_words.js","../src/helper/format/replacement/index.js","../src/manipulate/repeat.js","../src/helper/string/build_padding.js","../src/manipulate/pad_left.js","../src/manipulate/pad_right.js","../src/helper/format/align_and_pad.js","../src/helper/format/type_format/add_sign_to_formatted_number.js","../src/helper/format/type_format/float.js","../src/helper/format/type_format/integer_base.js","../src/helper/format/type_format/integer_decimal.js","../src/helper/format/type_format/string.js","../src/helper/format/replacement/compute.js","../src/helper/format/conversion_specification.js","../src/helper/format/replacement/validate.js","../src/helper/format/replacement/match.js","../src/format/sprintf.js","../src/format/vprintf.js","../src/escape/escape_html.js","../src/escape/escape_reg_exp.js","../src/escape/unescape_html.js","../src/index/index_of.js","../src/index/last_index_of.js","../src/index/search.js","../src/manipulate/insert.js","../src/helper/string/diacritics_map.js","../src/manipulate/latinise.js","../src/manipulate/pad.js","../src/manipulate/replace.js","../src/helper/reg_exp/get_reg_exp_flags.js","../src/query/includes.js","../src/helper/reg_exp/append_flag_to_reg_exp.js","../src/manipulate/replace_all.js","../src/manipulate/reverse.js","../src/manipulate/reverse_grapheme.js","../src/manipulate/slugify.js","../src/manipulate/splice.js","../src/manipulate/trim_left.js","../src/manipulate/trim_right.js","../src/manipulate/trim.js","../src/manipulate/word_wrap.js","../src/query/ends_with.js","../src/query/is_alpha.js","../src/query/is_alpha_digit.js","../src/query/is_blank.js","../src/query/is_digit.js","../src/query/is_empty.js","../src/query/is_lower_case.js","../src/query/is_numeric.js","../src/query/is_upper_case.js","../src/query/matches.js","../src/query/starts_with.js","../src/split/chars.js","../src/split/code_points.js","../src/split/graphemes.js","../src/split/split.js","../src/helper/string/has_substring_at_index.js","../src/helper/strip/parse_tag_list.js","../src/helper/strip/parse_tag_name.js","../src/strip/strip_tags.js","../src/helper/object/get_global.js","../src/util/no_conflict.js","../src/chain/wrapper.js","../src/chain/chain.js","../src/index.js","../src/helper/reg_exp/const.js","../src/helper/reg_exp/const_extended.js","../src/helper/number/const.js","../src/helper/format/const.js","../src/util/version.js"],"sourcesContent":["/**\n * Checks if `value` is `null` or `undefined`\n *\n * @ignore\n * @function isNil\n * @param {*} value The object to check\n * @return {boolean} Returns `true` is `value` is `undefined` or `null`, `false` otherwise\n */\nexport default function isNil(value) {\n return value === undefined || value === null;\n}","import isNil from 'helper/object/is_nil';\n\n/**\n * Converts the `value` to a boolean. If `value` is `undefined` or `null`, returns `defaultValue`.\n *\n * @ignore\n * @function toBoolean\n * @param {*} value The value to convert.\n * @param {boolean} [defaultValue=false] The default value.\n * @return {boolean} Returns the coercion to boolean.\n */\nexport default function coerceToBoolean(value, defaultValue = false) {\n if (isNil(value)) {\n return defaultValue;\n }\n return Boolean(value);\n}","/**\n * Checks whether `subject` is a string primitive type.\n *\n * @function isString\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} subject The value to verify.\n * @return {boolean} Returns `true` if `subject` is string primitive type or `false` otherwise.\n * @example\n * v.isString('vacation');\n * // => true\n *\n * v.isString(560);\n * // => false\n */\nexport default function isString(subject) {\n return typeof subject === 'string';\n}","import isNil from 'helper/object/is_nil';\nimport isString from 'query/is_string';\n\n/**\n * Get the string representation of the `value`.\n * Converts the `value` to string.\n * If `value` is `null` or `undefined`, return `defaultValue`.\n *\n * @ignore\n * @function toString\n * @param {*} value The value to convert.\n * @param {*} [defaultValue=''] The default value to return.\n * @return {string|null} Returns the string representation of `value`. Returns `defaultValue` if `value` is\n * `null` or `undefined`.\n */\nexport default function coerceToString(value, defaultValue = '') {\n if (isNil(value)) {\n return defaultValue;\n }\n if (isString(value)) {\n return value;\n }\n return String(value);\n}","import coerceToBoolean from 'helper/boolean/coerce_to_boolean';\nimport coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Converts the first character of `subject` to upper case. If `restToLower` is `true`, convert the rest of\n * `subject` to lower case.\n *\n * @function capitalize\n * @static\n * @since 1.0.0\n * @memberOf Case\n * @param {string} [subject=''] The string to capitalize.\n * @param {boolean} [restToLower=false] Convert the rest of `subject` to lower case.\n * @return {string} Returns the capitalized string.\n * @example\n * v.capitalize('apple');\n * // => 'Apple'\n *\n * v.capitalize('aPPle', true);\n * // => 'Apple'\n */\nexport default function capitalize(subject, restToLower) {\n let subjectString = coerceToString(subject);\n const restToLowerCaseBoolean = coerceToBoolean(restToLower);\n if (subjectString === '') {\n return '';\n }\n if (restToLowerCaseBoolean) {\n subjectString = subjectString.toLowerCase();\n }\n return subjectString.substr(0, 1).toUpperCase() + subjectString.substr(1);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Converts the `subject` to lower case.\n *\n * @function lowerCase\n * @static\n * @since 1.0.0\n * @memberOf Case\n * @param {string} [subject=''] The string to convert to lower case.\n * @return {string} Returns the lower case string.\n * @example\n * v.lowerCase('Green');\n * // => 'green'\n *\n * v.lowerCase('BLUE');\n * // => 'blue'\n */\nexport default function lowerCase(subject) {\n const subjectString = coerceToString(subject, '');\n return subjectString.toLowerCase();\n}\n","/**\n * Verifies if `value` is `undefined` or `null` and returns `defaultValue`. In other case returns `value`.\n *\n * @ignore\n * @function nilDefault\n * @param {*} value The value to verify.\n * @param {*} defaultValue The default value.\n * @return {*} Returns `defaultValue` if `value` is `undefined` or `null`, otherwise `defaultValue`.\n */\nexport default function nilDefault(value, defaultValue) {\n return value == null ? defaultValue : value;\n}","import isNil from 'helper/object/is_nil';\nimport isString from 'query/is_string';\n\n/**\n * Get the string representation of the `value`.\n * Converts the `value` to string.\n *\n * @ignore\n * @function toString\n * @param {*} value The value to convert.\n * @return {string|null} Returns the string representation of `value`.\n */\nexport default function toString(value) {\n if (isNil(value)) {\n return null;\n }\n if (isString(value)) {\n return value;\n }\n return String(value);\n}","import { REGEXP_EXTENDED_ASCII, REGEXP_LATIN_WORD, REGEXP_WORD } from 'helper/reg_exp/const_extended';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport nilDefault from 'helper/undefined/nil_default';\nimport toString from 'helper/string/to_string';\n\n/**\n * Splits `subject` into an array of words.\n *\n * @function words\n * @static\n * @since 1.0.0\n * @memberOf Split\n * @param {string} [subject=''] The string to split into words.\n * @param {string|RegExp} [pattern] The pattern to watch words. If `pattern` is not RegExp, it is transformed to `new RegExp(pattern, flags)`.\n * @param {string} [flags=''] The regular expression flags. Applies when `pattern` is string type.\n * @return {Array} Returns the array of words.\n * @example\n * v.words('gravity can cross dimensions');\n * // => ['gravity', 'can', 'cross', 'dimensions']\n *\n * v.words('GravityCanCrossDimensions');\n * // => ['Gravity', 'Can', 'Cross', 'Dimensions']\n *\n * v.words('Gravity - can cross dimensions!');\n * // => ['Gravity', 'can', 'cross', 'dimensions']\n *\n * v.words('Earth gravity', /[^\\s]+/g);\n * // => ['Earth', 'gravity']\n */\nexport default function words(subject, pattern, flags) {\n const subjectString = coerceToString(subject);\n let patternRegExp;\n if (isNil(pattern)) {\n patternRegExp = REGEXP_EXTENDED_ASCII.test(subjectString) ? REGEXP_LATIN_WORD : REGEXP_WORD;\n } else if (pattern instanceof RegExp) {\n patternRegExp = pattern;\n } else {\n const flagsString = toString(nilDefault(flags, ''));\n patternRegExp = new RegExp(toString(pattern), flagsString);\n }\n return nilDefault(subjectString.match(patternRegExp), []);\n}","import capitalize from 'case/capitalize';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport lowerCase from 'case/lower_case';\nimport words from 'split/words';\n\n/**\n * Transforms the `word` into camel case chunk.\n *\n * @param {string} word The word string\n * @param {number} index The index of the word in phrase.\n * @return {string} The transformed word.\n * @ignore\n */\nfunction wordToCamel(word, index) {\n return index === 0 ? lowerCase(word) : capitalize(word, true);\n}\n\n/**\n * Converts the `subject` to camel case.\n *\n * @function camelCase\n * @static\n * @since 1.0.0\n * @memberOf Case\n * @param {string} [subject=''] The string to convert to camel case.\n * @return {string} The camel case string.\n * @example\n * v.camelCase('bird flight');\n * // => 'birdFlight'\n *\n * v.camelCase('BirdFlight');\n * // => 'birdFlight'\n *\n * v.camelCase('-BIRD-FLIGHT-');\n * // => 'birdFlight'\n */\nexport default function camelCase(subject) {\n const subjectString = coerceToString(subject);\n if (subjectString === '') {\n return '';\n }\n return words(subjectString).map(wordToCamel).join('');\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Converts the first character of `subject` to lower case.\n *\n * @function decapitalize\n * @static\n * @since 1.0.0\n * @memberOf Case\n * @param {string} [subject=''] The string to decapitalize.\n * @return {string} Returns the decapitalized string.\n * @example\n * v.decapitalize('Sun');\n * // => 'sun'\n *\n * v.decapitalize('moon');\n * // => 'moon'\n */\nexport default function decapitalize(subject) {\n const subjectString = coerceToString(subject);\n if (subjectString === '') {\n return subjectString;\n }\n return subjectString.substr(0, 1).toLowerCase() + subjectString.substr(1);\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport lowerCase from 'case/lower_case';\nimport words from 'split/words';\n\n/**\n * Converts the `subject` to kebab case,\n * also called spinal case or lisp case.\n *\n * @function kebabCase\n * @static\n * @since 1.0.0\n * @memberOf Case\n * @param {string} [subject=''] The string to convert to kebab case.\n * @return {string} Returns the kebab case string.\n * @example\n * v.kebabCase('goodbye blue sky');\n * // => 'goodbye-blue-sky'\n *\n * v.kebabCase('GoodbyeBlueSky');\n * // => 'goodbye-blue-sky'\n *\n * v.kebabCase('-Goodbye-Blue-Sky-');\n * // => 'goodbye-blue-sky'\n */\nexport default function kebabCase(subject) {\n const subjectString = coerceToString(subject);\n if (subjectString === '') {\n return '';\n }\n return words(subjectString).map(lowerCase).join('-');\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport lowerCase from 'case/lower_case';\nimport words from 'split/words';\n\n/**\n * Converts the `subject` to snake case.\n *\n * @function snakeCase\n * @static\n * @since 1.0.0\n * @memberOf Case\n * @param {string} [subject=''] The string to convert to snake case.\n * @return {string} Returns the snake case string.\n * @example\n * v.snakeCase('learning to fly');\n * // => 'learning_to_fly'\n *\n * v.snakeCase('LearningToFly');\n * // => 'learning_to_fly'\n *\n * v.snakeCase('-Learning-To-Fly-');\n * // => 'learning_to_fly'\n */\nexport default function snakeCase(subject) {\n const subjectString = coerceToString(subject);\n if (subjectString === '') {\n return '';\n }\n return words(subjectString).map(lowerCase).join('_');\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Converts the `subject` to upper case.\n *\n * @function upperCase\n * @static\n * @since 1.0.0\n * @memberOf Case\n * @param {string} [subject=''] The string to convert to upper case.\n * @return {string} Returns the upper case string.\n * @example\n * v.upperCase('school');\n * // => 'SCHOOL'\n */\nexport default function upperCase(subject) {\n const subjectString = coerceToString(subject);\n return subjectString.toUpperCase();\n}","/**\n * Clip the number to interval `downLimit` to `upLimit`.\n *\n * @ignore\n * @function clipNumber\n * @param {number} value The number to clip\n * @param {number} downLimit The down limit\n * @param {number} upLimit The upper limit\n * @return {number} The clipped number\n */\nexport default function clipNumber(value, downLimit, upLimit) {\n if (value <= downLimit) {\n return downLimit;\n }\n if (value >= upLimit) {\n return upLimit;\n }\n return value;\n}","import { MAX_SAFE_INTEGER } from 'helper/number/const';\n\n/**\n * Transforms `value` to an integer.\n *\n * @ignore\n * @function toInteger\n * @param {number} value The number to transform.\n * @returns {number} Returns the transformed integer.\n */\nexport default function toInteger(value) {\n if (value === Infinity) {\n return MAX_SAFE_INTEGER;\n }\n if (value === -Infinity) {\n return - MAX_SAFE_INTEGER;\n }\n return ~~value;\n}","import clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { MAX_SAFE_INTEGER } from 'helper/number/const';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Truncates `subject` to a new `length`.\n *\n * @function truncate\n * @static\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to truncate.\n * @param {int} length The length to truncate the string.\n * @param {string} [end='...'] The string to be added at the end.\n * @return {string} Returns the truncated string.\n * @example\n * v.truncate('Once upon a time', 7);\n * // => 'Once...'\n *\n * v.truncate('Good day, Little Red Riding Hood', 14, ' (...)');\n * // => 'Good day (...)'\n *\n * v.truncate('Once upon', 10);\n * // => 'Once upon'\n */\nexport default function truncate(subject, length, end) {\n const subjectString = coerceToString(subject);\n const lengthInt = isNil(length) ? subjectString.length : clipNumber(toInteger(length), 0, MAX_SAFE_INTEGER);\n const endString = coerceToString(end, '...');\n if (lengthInt >= subjectString.length) {\n return subjectString;\n }\n return subjectString.substr(0, length - endString.length) + endString;\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Access a character from `subject` at specified `position`.\n *\n * @function charAt\n * @static\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to extract from.\n * @param {numbers} position The position to get the character.\n * @return {string} Returns the character at specified position.\n * @example\n * v.charAt('helicopter', 0);\n * // => 'h'\n *\n * v.charAt('helicopter', 1);\n * // => 'e'\n */\nexport default function charAt(subject, position) {\n const subjectString = coerceToString(subject);\n return subjectString.charAt(position);\n}","const HIGH_SURROGATE_START = 0xD800;\nconst HIGH_SURROGATE_END = 0xDBFF;\nconst LOW_SURROGATE_START = 0xDC00;\nconst LOW_SURROGATE_END = 0xDFFF;\n\n/**\n * Checks if `codePoint` is a high-surrogate number from range 0xD800 to 0xDBFF.\n *\n * @ignore\n * @param {number} codePoint The code point number to be verified\n * @return {boolean} Returns a boolean whether `codePoint` is a high-surrogate number.\n */\nexport function isHighSurrogate(codePoint) {\n return codePoint >= HIGH_SURROGATE_START && codePoint <= HIGH_SURROGATE_END;\n}\n\n/**\n * Checks if `codePoint` is a low-surrogate number from range 0xDC00 to 0xDFFF.\n *\n * @ignore\n * @param {number} codePoint The code point number to be verified\n * @return {boolean} Returns a boolean whether `codePoint` is a low-surrogate number.\n */\nexport function isLowSurrogate(codePoint) {\n return codePoint >= LOW_SURROGATE_START && codePoint <= LOW_SURROGATE_END;\n}\n\n/**\n * Get the astral code point number based on surrogate pair numbers.\n *\n * @ignore\n * @param {number} highSurrogate The high-surrogate code point number.\n * @param {number} lowSurrogate The low-surrogate code point number.\n * @return {number} Returns the astral symbol number.\n */\nexport function getAstralNumberFromSurrogatePair(highSurrogate, lowSurrogate) {\n return (highSurrogate - HIGH_SURROGATE_START) * 0x400 + lowSurrogate - LOW_SURROGATE_START + 0x10000;\n}","import isNil from 'helper/object/is_nil';\n\n/**\n * Get the number representation of the `value`.\n * Converts the `value` to number.\n * If `value` is `null` or `undefined`, return `defaultValue`.\n *\n * @ignore\n * @function toString\n * @param {*} value The value to convert.\n * @param {*} [defaultValue=''] The default value to return.\n * @return {number|null} Returns the number representation of `value`. Returns `defaultValue` if `value` is\n * `null` or `undefined`.\n */\nexport default function coerceToNumber(value, defaultValue = 0) {\n if (isNil(value)) {\n return defaultValue;\n }\n if (typeof value === 'number') {\n return value;\n }\n return Number(value);\n}","/**\n * If `value` is `NaN`, return `defaultValue`. In other case returns `value`.\n *\n * @ignore\n * @function nanDefault\n * @param {*} value The value to verify.\n * @param {*} defaultValue The default value.\n * @return {*} Returns `defaultValue` if `value` is `NaN`, otherwise `defaultValue`.\n */\nexport default function nanDefault(value, defaultValue) {\n return value !== value ? defaultValue : value;\n}","import { getAstralNumberFromSurrogatePair, isHighSurrogate, isLowSurrogate } from 'helper/string/surrogate_pair';\nimport coerceToNumber from 'helper/number/coerce_to_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport nanDefault from 'helper/number/nan_default';\n\n/**\n * Get the Unicode code point value of the character at `position`.
\n * If a valid UTF-16 \n * surrogate pair starts at `position`, the\n * astral code point\n * value at `position` is returned.\n *\n * @function codePointAt\n * @static\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to extract from.\n * @param {number} position The position to get the code point number.\n * @return {number} Returns a non-negative number less than or equal to `0x10FFFF`.\n * @example\n * v.codePointAt('rain', 1);\n * // => 97, or 0x0061\n *\n * v.codePointAt('\\uD83D\\uDE00 is smile', 0); // or '😀 is smile'\n * // => 128512, or 0x1F600\n */\nexport default function codePointAt(subject, position) {\n const subjectString = coerceToString(subject);\n const subjectStringLength = subjectString.length;\n let positionNumber = coerceToNumber(position);\n positionNumber = nanDefault(positionNumber, 0);\n if (positionNumber < 0 || positionNumber >= subjectStringLength) {\n return undefined;\n }\n const firstCodePoint = subjectString.charCodeAt(positionNumber);\n let secondCodePoint;\n if (isHighSurrogate(firstCodePoint) && subjectStringLength > positionNumber + 1) {\n secondCodePoint = subjectString.charCodeAt(positionNumber + 1);\n if (isLowSurrogate(secondCodePoint)) {\n return getAstralNumberFromSurrogatePair(firstCodePoint, secondCodePoint);\n }\n }\n return firstCodePoint;\n}","import clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { MAX_SAFE_INTEGER } from 'helper/number/const';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Extracts the first `length` characters from `subject`.\n *\n * @function first\n * @static\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to extract from.\n * @param {int} [length=1] The number of characters to extract.\n * @return {string} Returns the first characters string.\n * @example\n * v.first('helicopter');\n * // => 'h'\n *\n * v.first('vehicle', 2);\n * // => 've'\n *\n * v.first('car', 5);\n * // => 'car'\n */\nexport default function first(subject, length) {\n const subjectString = coerceToString(subject);\n const lengthInt = isNil(length) ? 1 : clipNumber(toInteger(length), 0, MAX_SAFE_INTEGER);\n if (subjectString.length <= lengthInt) {\n return subjectString;\n }\n return subjectString.substr(0, lengthInt);\n}","import coerceToNumber from 'helper/number/coerce_to_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport nanDefault from 'helper/number/nan_default';\nimport { REGEXP_UNICODE_CHARACTER } from 'helper/reg_exp/const';\n\n/**\n * Get a grapheme from `subject` at specified `position` taking care of\n * surrogate pairs and\n * combining marks.\n *\n * @function graphemeAt\n * @static\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to extract from.\n * @param {number} position The position to get the grapheme.\n * @return {string} Returns the grapheme at specified position.\n * @example\n * v.graphemeAt('\\uD835\\uDC00\\uD835\\uDC01', 0); // or '𝐀𝐁'\n * // => 'A'\n *\n * v.graphemeAt('cafe\\u0301', 3); // or 'café'\n * // => 'é'\n */\nexport default function graphemeAt(subject, position) {\n const subjectString = coerceToString(subject);\n let positionNumber = coerceToNumber(position);\n let graphemeMatch;\n let graphemeMatchIndex = 0;\n positionNumber = nanDefault(positionNumber, 0);\n while ((graphemeMatch = REGEXP_UNICODE_CHARACTER.exec(subjectString)) !== null) {\n if (graphemeMatchIndex === positionNumber) {\n REGEXP_UNICODE_CHARACTER.lastIndex = 0;\n return graphemeMatch[0];\n }\n graphemeMatchIndex++;\n }\n return '';\n}","import clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { MAX_SAFE_INTEGER } from 'helper/number/const';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Extracts the last `length` characters from `subject`.\n *\n * @function last\n * @static\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to extract from.\n * @param {int} [length=1] The number of characters to extract.\n * @return {string} Returns the last characters string.\n * @example\n * v.last('helicopter');\n * // => 'r'\n *\n * v.last('vehicle', 2);\n * // => 'le'\n *\n * v.last('car', 5);\n * // => 'car'\n */\nexport default function last(subject, length) {\n const subjectString = coerceToString(subject);\n const lengthInt = isNil(length) ? 1 : clipNumber(toInteger(length), 0, MAX_SAFE_INTEGER);\n if (subjectString.length <= lengthInt) {\n return subjectString;\n }\n return subjectString.substr(subjectString.length - lengthInt, lengthInt);\n}","import { REGEXP_EXTENDED_ASCII, REGEXP_LATIN_WORD, REGEXP_WORD } from 'helper/reg_exp/const_extended';\nimport clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { MAX_SAFE_INTEGER } from 'helper/number/const';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Truncates `subject` to a new `length` and does not break the words. Guarantees that the truncated string is no longer\n * than `length`.\n *\n * @static\n * @function prune\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to prune.\n * @param {int} length The length to prune the string.\n * @param {string} [end='...'] The string to be added at the end.\n * @return {string} Returns the pruned string.\n * @example\n * v.prune('Once upon a time', 7);\n * // => 'Once...'\n *\n * v.prune('Good day, Little Red Riding Hood', 16, ' (more)');\n * // => 'Good day (more)'\n *\n * v.prune('Once upon', 10);\n * // => 'Once upon'\n */\nexport default function prune(subject, length, end) {\n const subjectString = coerceToString(subject);\n const lengthInt = isNil(length) ? subjectString.length : clipNumber(toInteger(length), 0, MAX_SAFE_INTEGER);\n const endString = coerceToString(end, '...');\n if (lengthInt >= subjectString.length) {\n return subjectString;\n }\n const pattern = REGEXP_EXTENDED_ASCII.test(subjectString) ? REGEXP_LATIN_WORD : REGEXP_WORD;\n let truncatedLength = 0;\n subjectString.replace(pattern, function(word, offset) {\n const wordInsertLength = offset + word.length;\n if (wordInsertLength <= lengthInt - endString.length) {\n truncatedLength = wordInsertLength;\n }\n });\n return subjectString.substr(0, truncatedLength) + endString;\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Extracts from `subject` a string from `start` position up to `end` position. The character at `end` position is not\n * included.\n *\n * @function slice\n * @static\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to extract from.\n * @param {number} start The position to start extraction. If negative use `subject.length + start`.\n * @param {number} [end=subject.length] The position to end extraction. If negative use `subject.length + end`.\n * @return {string} Returns the extracted string.\n * @note Uses native `String.prototype.slice()`\n * @example\n * v.slice('miami', 1);\n * // => 'iami'\n *\n * v.slice('florida', -4);\n * // => 'rida'\n *\n * v.slice('florida', 1, 4);\n * // => \"lor\"\n */\nexport default function slice(subject, start, end) {\n return coerceToString(subject).slice(start, end);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Extracts from `subject` a string from `start` position a number of `length` characters.\n *\n * @function substr\n * @static\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to extract from.\n * @param {number} start The position to start extraction.\n * @param {number} [length=subject.endOfString] The number of characters to extract. If omitted, extract to the end of `subject`.\n * @return {string} Returns the extracted string.\n * @note Uses native `String.prototype.substr()`\n * @example\n * v.substr('infinite loop', 9);\n * // => 'loop'\n *\n * v.substr('dreams', 2, 2);\n * // => 'ea'\n */\nexport default function substr(subject, start, length) {\n return coerceToString(subject).substr(start, length);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Extracts from `subject` a string from `start` position up to `end` position. The character at `end` position is not\n * included.\n *\n * @function substring\n * @static\n * @since 1.0.0\n * @memberOf Chop\n * @param {string} [subject=''] The string to extract from.\n * @param {number} start The position to start extraction.\n * @param {number} [end=subject.length] The position to end extraction.\n * @return {string} Returns the extracted string.\n * @note Uses native `String.prototype.substring()`\n * @example\n * v.substring('beach', 1);\n * // => 'each'\n *\n * v.substring('ocean', 1, 3);\n * // => 'ea'\n */\nexport default function substring(subject, start, end) {\n return coerceToString(subject).substring(start, end);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Counts the characters in `subject`.
\n *\n * @function count\n * @static\n * @since 1.0.0\n * @memberOf Count\n * @param {string} [subject=''] The string to count characters.\n * @return {number} Returns the number of characters in `subject`.\n * @example\n * v.count('rain');\n * // => 4\n */\nexport default function count(subject) {\n return coerceToString(subject).length;\n}","import { REGEXP_COMBINING_MARKS, REGEXP_SURROGATE_PAIRS } from 'helper/reg_exp/const';\nimport coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Counts the graphemes in `subject` taking care of\n * surrogate pairs and\n * combining marks.\n *\n * @function countGraphemes\n * @static\n * @since 1.0.0\n * @memberOf Count\n * @param {string} [subject=''] The string to count graphemes.\n * @return {number} Returns the number of graphemes in `subject`.\n * @example\n * v.countGraphemes('cafe\\u0301'); // or 'café'\n * // => 4\n *\n * v.countGraphemes('\\uD835\\uDC00\\uD835\\uDC01'); // or '𝐀𝐁'\n * // => 2\n *\n * v.countGraphemes('rain');\n * // => 4\n */\nexport default function countGrapheme(subject) {\n return coerceToString(subject)\n .replace(REGEXP_COMBINING_MARKS, '*')\n .replace(REGEXP_SURROGATE_PAIRS, '*')\n .length;\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Counts the number of `substring` appearances in `subject`.\n *\n * @function countSubstrings\n * @static\n * @since 1.0.0\n * @memberOf Count\n * @param {string} [subject=''] The string where to count.\n * @param {string} substring The substring to be counted.\n * @return {number} Returns the number of `substring` appearances.\n * @example\n * v.countSubstrings('bad boys, bad boys whatcha gonna do?', 'boys');\n * // => 2\n *\n * v.countSubstrings('every dog has its day', 'cat');\n * // => 0\n */\nexport default function countSubstrings(subject, substring) {\n const subjectString = coerceToString(subject);\n const substringString = coerceToString(substring);\n const substringLength = substringString.length;\n let count = 0;\n let matchIndex = 0;\n if (subjectString === '' || substringString === '') {\n return count;\n }\n do {\n matchIndex = subjectString.indexOf(substringString, matchIndex);\n if (matchIndex !== -1) {\n count++;\n matchIndex += substringLength;\n }\n } while (matchIndex !== -1);\n return count;\n}","import coerceToString from 'helper/string/coerce_to_string';\n\nconst reduce = Array.prototype.reduce;\n\n/**\n * Counts the characters in `subject` for which `predicate` returns truthy.\n *\n * @function countWhere\n * @static\n * @since 1.0.0\n * @memberOf Count\n * @param {string} [subject=''] The string to count characters.\n * @param {Function} predicate The predicate function invoked on each character with parameters `(character, index, string)`.\n * @param {Object} [context] The context to invoke the `predicate`.\n * @return {number} Returns the number of characters for which `predicate` returns truthy.\n * @example\n * v.countWhere('hola!', v.isAlpha);\n * // => 4\n *\n * v.countWhere('2022', function(character, index, str) {\n * return character === '2';\n * });\n * // => 3\n */\nexport default function countWhere(subject, predicate, context) {\n const subjectString = coerceToString(subject);\n if (subjectString === '' || typeof predicate !== 'function') {\n return 0;\n }\n const predicateWithContext = predicate.bind(context);\n return reduce.call(subjectString, function(countTruthy, character, index) {\n return predicateWithContext(character, index, subjectString) ? countTruthy + 1 : countTruthy;\n }, 0);\n}","import words from 'split/words';\n\n/**\n * Counts the number of words in `subject`.\n *\n * @function countWords\n * @static\n * @since 1.0.0\n * @memberOf Count\n * @param {string} [subject=''] The string to split into words.\n * @param {string|RegExp} [pattern] The pattern to watch words. If `pattern` is not RegExp, it is transformed to `new RegExp(pattern, flags)`.\n * @param {string} [flags=''] The regular expression flags. Applies when `pattern` is string type.\n * @return {number} Returns the number of words.\n * @example\n * v.countWords('gravity can cross dimensions');\n * // => 4\n *\n * v.countWords('GravityCanCrossDimensions');\n * // => 4\n *\n * v.countWords('Gravity - can cross dimensions!');\n * // => 4\n *\n * v.words('Earth gravity', /[^\\s]+/g);\n * // => 2\n */\nexport default function countWords(subject, pattern, flags) {\n return words(subject, pattern, flags).length;\n}","import isNil from 'helper/object/is_nil';\n\n/**\n * The current index.\n *\n * @ignore\n * @name ReplacementIndex#index\n * @type {number}\n * @return {ReplacementIndex} ReplacementIndex instance.\n */\nfunction ReplacementIndex() {\n this.index = 0;\n}\n\n/**\n * Increment the current index.\n *\n * @ignore\n * @return {undefined}\n */\nReplacementIndex.prototype.increment = function() {\n this.index++;\n};\n\n/**\n * Increment the current index by position.\n *\n * @ignore\n * @param {number} [position] The replacement position.\n * @return {undefined}\n */\nReplacementIndex.prototype.incrementOnEmptyPosition = function(position) {\n if (isNil(position)) {\n this.increment();\n }\n};\n\n/**\n * Get the replacement index by position.\n *\n * @ignore\n * @param {number} [position] The replacement position.\n * @return {number} The replacement index.\n */\nReplacementIndex.prototype.getIndexByPosition = function(position) {\n return isNil(position) ? this.index : position - 1;\n};\n\nexport default ReplacementIndex;","import clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { MAX_SAFE_INTEGER } from 'helper/number/const';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Repeats the `subject` number of `times`.\n *\n * @function repeat\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to repeat.\n * @param {number} [times=1] The number of times to repeat.\n * @return {string} Returns the repeated string.\n * @example\n * v.repeat('w', 3);\n * // => 'www'\n *\n * v.repeat('world', 0);\n * // => ''\n */\nexport default function repeat(subject, times) {\n let subjectString = coerceToString(subject);\n let timesInt = isNil(times) ? 1 : clipNumber(toInteger(times), 0, MAX_SAFE_INTEGER);\n let repeatString = '';\n while (timesInt) {\n if (timesInt & 1) {\n repeatString += subjectString;\n }\n if (timesInt > 1) {\n subjectString += subjectString;\n }\n timesInt >>= 1;\n }\n return repeatString;\n}","import repeat from 'manipulate/repeat';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Creates the padding string.\n *\n * @ignore\n * @param {string} padCharacters The characters to create padding string.\n * @param {number} length The padding string length.\n * @return {string} The padding string.\n */\nexport default function buildPadding(padCharacters, length) {\n const padStringRepeat = toInteger(length / padCharacters.length);\n const padStringRest = length % padCharacters.length;\n return repeat(padCharacters, padStringRepeat + padStringRest).substr(0, length);\n}","import buildPadding from 'helper/string/build_padding';\nimport clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { MAX_SAFE_INTEGER } from 'helper/number/const';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Pads `subject` from left to a new `length`.\n *\n * @function padLeft\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to pad.\n * @param {int} [length=0] The length to left pad the string. No changes are made if `length` is less than `subject.length`.\n * @param {string} [pad=' '] The string to be used for padding.\n * @return {string} Returns the left padded string.\n * @example\n * v.padLeft('dog', 5);\n * // => ' dog'\n *\n * v.padLeft('bird', 6, '-');\n * // => '--bird'\n *\n * v.padLeft('cat', 6, '-=');\n * // => '-=-cat'\n */\nexport default function padLeft(subject, length, pad) {\n const subjectString = coerceToString(subject);\n const lengthInt = isNil(length) ? 0 : clipNumber(toInteger(length), 0, MAX_SAFE_INTEGER);\n const padString = coerceToString(pad, ' ');\n if (lengthInt <= subjectString.length) {\n return subjectString;\n }\n return buildPadding(padString, lengthInt - subjectString.length) + subjectString;\n}","import buildPadding from 'helper/string/build_padding';\nimport clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { MAX_SAFE_INTEGER } from 'helper/number/const';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Pads `subject` from right to a new `length`.\n *\n * @function padRight\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to pad.\n * @param {int} [length=0] The length to right pad the string. No changes are made if `length` is less than `subject.length`.\n * @param {string} [pad=' '] The string to be used for padding.\n * @return {string} Returns the right padded string.\n * @example\n * v.padRight('dog', 5);\n * // => 'dog '\n *\n * v.padRight('bird', 6, '-');\n * // => 'bird--'\n *\n * v.padRight('cat', 6, '-=');\n * // => 'cat-=-'\n */\nexport default function padRight(subject, length, pad) {\n const subjectString = coerceToString(subject);\n const lengthInt = isNil(length) ? 0 : clipNumber(toInteger(length), 0, MAX_SAFE_INTEGER);\n const padString = coerceToString(pad, ' ');\n if (lengthInt <= subjectString.length) {\n return subjectString;\n }\n return subjectString + buildPadding(padString, lengthInt - subjectString.length);\n}","import Const from 'helper/format/const';\nimport isNil from 'helper/object/is_nil';\nimport padLeft from 'manipulate/pad_left';\nimport padRight from 'manipulate/pad_right';\n\n/**\n * Aligns and pads `subject` string.\n *\n * @ignore\n * @param {string} subject The subject string.\n * @param {ConversionSpecification} conversion The conversion specification object.\n * @return {string} Returns the aligned and padded string.\n */\nexport default function alignAndPad(subject, conversion) {\n const width = conversion.width;\n if (isNil(width) || subject.length >= width) {\n return subject;\n }\n const padType = conversion.alignmentSpecifier === Const.LITERAL_MINUS ? padRight : padLeft;\n return padType(subject, width, conversion.getPaddingCharacter());\n}","import Const from 'helper/format/const';\n\n/**\n * Add sign to the formatted number.\n *\n * @ignore\n * @name addSignToFormattedNumber\n * @param {number} replacementNumber The number to be replaced.\n * @param {string} formattedReplacement The formatted version of number.\n * @param {ConversionSpecification} conversion The conversion specification object.\n * @return {string} Returns the formatted number string with a sign.\n */\nexport default function addSignToFormattedNumber(replacementNumber, formattedReplacement, conversion) {\n if (conversion.signSpecifier === Const.LITERAL_PLUS && replacementNumber >= 0) {\n formattedReplacement = Const.LITERAL_PLUS + formattedReplacement;\n }\n return formattedReplacement;\n}","import addSignToFormattedNumber from 'helper/format/type_format/add_sign_to_formatted_number';\nimport coerceToNumber from 'helper/number/coerce_to_number';\nimport Const from 'helper/format/const';\nimport { REGEXP_TRAILING_ZEROS } from 'helper/reg_exp/const';\nimport toString from 'helper/string/coerce_to_string';\n\n/**\n * Formats a float type according to specifiers.\n *\n * @ignore\n * @param {string} replacement The string to be formatted.\n * @param {ConversionSpecification} conversion The conversion specification object.\n * @return {string} Returns the formatted string.\n */\n\nexport default function float(replacement, conversion) {\n let replacementNumber = parseFloat(replacement);\n let formattedReplacement;\n if (isNaN(replacementNumber)) {\n replacementNumber = 0;\n }\n const precision = coerceToNumber(conversion.precision, 6);\n switch (conversion.typeSpecifier) {\n case Const.TYPE_FLOAT:\n formattedReplacement = replacementNumber.toFixed(precision);\n break;\n case Const.TYPE_FLOAT_SCIENTIFIC:\n formattedReplacement = replacementNumber.toExponential(precision);\n break;\n case Const.TYPE_FLOAT_SCIENTIFIC_UPPERCASE:\n formattedReplacement = replacementNumber.toExponential(precision).toUpperCase();\n break;\n case Const.TYPE_FLOAT_SHORT:\n case Const.TYPE_FLOAT_SHORT_UPPERCASE:\n formattedReplacement = formatFloatAsShort(replacementNumber, precision, conversion);\n break;\n }\n formattedReplacement = addSignToFormattedNumber(replacementNumber, formattedReplacement, conversion);\n return toString(formattedReplacement);\n}\n\n/**\n * Formats the short float.\n *\n * @ignore\n * @param {number} replacementNumber The number to format.\n * @param {number} precision The precision to format the float.\n * @param {ConversionSpecification} conversion The conversion specification object.\n * @return {string} Returns the formatted short float.\n */\nfunction formatFloatAsShort(replacementNumber, precision, conversion) {\n if (replacementNumber === 0) {\n return '0';\n }\n const nonZeroPrecision = precision === 0 ? 1 : precision;\n let formattedReplacement = replacementNumber\n .toPrecision(nonZeroPrecision)\n .replace(REGEXP_TRAILING_ZEROS, '');\n if (conversion.typeSpecifier === Const.TYPE_FLOAT_SHORT_UPPERCASE) {\n formattedReplacement = formattedReplacement.toUpperCase();\n }\n return formattedReplacement;\n}","import Const from 'helper/format/const';\nimport toString from 'helper/string/coerce_to_string';\n\n/**\n * Formats an integer type according to specifiers.\n *\n * @ignore\n * @param {string} replacement The string to be formatted.\n * @param {ConversionSpecification} conversion The conversion specification object.\n * @return {string} Returns the formatted string.\n */\n\nexport default function integerBase(replacement, conversion) {\n let integer = parseInt(replacement);\n if (isNaN(integer)) {\n integer = 0;\n }\n integer = integer >>> 0;\n switch (conversion.typeSpecifier) {\n case Const.TYPE_INTEGER_ASCII_CHARACTER:\n integer = String.fromCharCode(integer);\n break;\n case Const.TYPE_INTEGER_BINARY:\n integer = integer.toString(Const.RADIX_BINARY);\n break;\n case Const.TYPE_INTEGER_OCTAL:\n integer = integer.toString(Const.RADIX_OCTAL);\n break;\n case Const.TYPE_INTEGER_HEXADECIMAL:\n integer = integer.toString(Const.RADIX_HEXADECIMAL);\n break;\n case Const.TYPE_INTEGER_HEXADECIMAL_UPPERCASE:\n integer = integer.toString(Const.RADIX_HEXADECIMAL).toUpperCase();\n break;\n }\n return toString(integer);\n}","import addSignToFormattedNumber from 'helper/format/type_format/add_sign_to_formatted_number';\nimport toString from 'helper/string/to_string';\n\n/**\n * Formats a decimal integer type according to specifiers.\n *\n * @ignore\n * @param {string} replacement The string to be formatted.\n * @param {ConversionSpecification} conversion The conversion specification object.\n * @return {string} Returns the formatted string.\n */\n\nexport default function integerDecimal(replacement, conversion) {\n let integer = parseInt(replacement);\n if (isNaN(integer)) {\n integer = 0;\n }\n return addSignToFormattedNumber(integer, toString(integer), conversion);\n}","import isNil from 'helper/object/is_nil';\nimport truncate from 'chop/truncate';\n\n/**\n * Formats a string type according to specifiers.\n *\n * @ignore\n * @param {string} replacement The string to be formatted.\n * @param {ConversionSpecification} conversion The conversion specification object.\n * @return {string} Returns the formatted string.\n */\nexport default function stringFormat(replacement, conversion) {\n let formattedReplacement = replacement;\n const precision = conversion.precision;\n if (!isNil(precision) && formattedReplacement.length > precision) {\n formattedReplacement = truncate(formattedReplacement, precision, '');\n }\n return formattedReplacement;\n}","import alignAndPad from 'helper/format/align_and_pad';\nimport Const from 'helper/format/const';\nimport formatFloat from 'helper/format/type_format/float';\nimport formatIntegerBase from 'helper/format/type_format/integer_base';\nimport formatIntegerDecimal from 'helper/format/type_format/integer_decimal';\nimport formatString from 'helper/format/type_format/string';\n\n/**\n * Returns the computed string based on format specifiers.\n *\n * @ignore\n * @name computeReplacement\n * @param {string} replacement The replacement value.\n * @param {ConversionSpecification} conversion The conversion specification object.\n * @return {string} Returns the computed string.\n */\nexport default function compute(replacement, conversion) {\n let formatFunction;\n switch (conversion.typeSpecifier) {\n case Const.TYPE_STRING:\n formatFunction = formatString;\n break;\n case Const.TYPE_INTEGER_DECIMAL:\n case Const.TYPE_INTEGER:\n formatFunction = formatIntegerDecimal;\n break;\n case Const.TYPE_INTEGER_ASCII_CHARACTER:\n case Const.TYPE_INTEGER_BINARY:\n case Const.TYPE_INTEGER_OCTAL:\n case Const.TYPE_INTEGER_HEXADECIMAL:\n case Const.TYPE_INTEGER_HEXADECIMAL_UPPERCASE:\n case Const.TYPE_INTEGER_UNSIGNED_DECIMAL:\n formatFunction = formatIntegerBase;\n break;\n case Const.TYPE_FLOAT:\n case Const.TYPE_FLOAT_SCIENTIFIC:\n case Const.TYPE_FLOAT_SCIENTIFIC_UPPERCASE:\n case Const.TYPE_FLOAT_SHORT:\n case Const.TYPE_FLOAT_SHORT_UPPERCASE:\n formatFunction = formatFloat;\n break;\n }\n const formattedString = formatFunction(replacement, conversion);\n return alignAndPad(formattedString, conversion);\n}","import Const from 'helper/format/const';\nimport nilDefault from 'helper/undefined/nil_default';\n\n/**\n * Construct the new conversion specification object.\n *\n * @ignore\n * @param {Object} properties An object with properties to initialize.\n * @return {ConversionSpecification} ConversionSpecification instance.\n */\nfunction ConversionSpecification(properties) {\n\n /**\n * The percent characters from conversion specification.\n *\n * @ignore\n * @name ConversionSpecification#percent\n * @type {string}\n */\n this.percent = properties.percent;\n\n /**\n * The sign specifier to force a sign to be used on a number.\n *\n * @ignore\n * @name ConversionSpecification#signSpecifier\n * @type {string}\n */\n this.signSpecifier = properties.signSpecifier;\n\n /**\n * The padding specifier that says what padding character will be used.\n *\n * @ignore\n * @name ConversionSpecification#paddingSpecifier\n * @type {string}\n */\n this.paddingSpecifier = properties.paddingSpecifier;\n\n /**\n * The alignment specifier that says if the result should be left-justified or right-justified.\n *\n * @ignore\n * @name ConversionSpecification#alignmentSpecifier\n * @type {string}\n */\n this.alignmentSpecifier = properties.alignmentSpecifier;\n\n /**\n * The width specifier how many characters this conversion should result in.\n *\n * @ignore\n * @name ConversionSpecification#width\n * @type {number}\n */\n this.width = properties.width;\n\n /**\n * The precision specifier says how many decimal digits should be displayed for floating-point numbers.\n *\n * @ignore\n * @name ConversionSpecification#precision\n * @type {number}\n */\n this.precision = properties.precision;\n\n /**\n * The type specifier says what type the argument data should be treated as.\n *\n * @ignore\n * @name ConversionSpecification#typeSpecifier\n * @type {string}\n */\n this.typeSpecifier = properties.typeSpecifier;\n}\n\n\n/**\n * Check if the conversion specification is a percent literal \"%%\".\n *\n * @ignore\n * @return {boolean} Returns true if the conversion is a percent literal, false otherwise.\n */\nConversionSpecification.prototype.isPercentLiteral = function() {\n return Const.LITERAL_PERCENT_SPECIFIER === this.percent;\n};\n\n/**\n * Get the padding character from padding specifier.\n *\n * @ignore\n * @returns {string} Returns the padding character.\n */\nConversionSpecification.prototype.getPaddingCharacter = function() {\n let paddingCharacter = nilDefault(this.paddingSpecifier, ' ');\n if (paddingCharacter.length === 2 && paddingCharacter[0] === Const.LITERAL_SINGLE_QUOTE) {\n paddingCharacter = paddingCharacter[1];\n }\n return paddingCharacter;\n};\n\nexport default ConversionSpecification;","import isNil from 'helper/object/is_nil';\n\n/**\n * Validates the specifier type and replacement position.\n *\n * @ignore\n * @throws {Error} Throws an exception on insufficient arguments or unknown specifier.\n * @param {number} index The index of the matched specifier.\n * @param {number} replacementsLength The number of replacements.\n * @param {ConversionSpecification} conversion The conversion specification object.\n * @return {undefined}\n */\nexport default function validate(index, replacementsLength, conversion) {\n if (isNil(conversion.typeSpecifier)) {\n throw new Error('sprintf(): Unknown type specifier');\n }\n if (index > replacementsLength - 1) {\n throw new Error('sprintf(): Too few arguments');\n }\n if (index < 0) {\n throw new Error('sprintf(): Argument number must be greater than zero');\n }\n}","import coerceToNumber from 'helper/number/coerce_to_number';\nimport computeReplacement from 'helper/format/replacement/compute';\nimport ConversionSpecification from 'helper/format/conversion_specification';\nimport validateReplacement from 'helper/format/replacement/validate';\n\n/**\n * Return the replacement for regular expression match of the conversion specification.\n *\n * @ignore\n * @name matchReplacement\n * @param {ReplacementIndex} replacementIndex The replacement index object.\n * @param {string[]} replacements The array of replacements.\n * @param {string} conversionSpecification The conversion specification.\n * @param {string} percent The percent characters from conversion specification.\n * @param {string} position The position to insert the replacement.\n * @param {string} signSpecifier The sign specifier to force a sign to be used on a number.\n * @param {string} paddingSpecifier The padding specifier that says what padding character will be used.\n * @param {string} alignmentSpecifier The alignment specifier that says if the result should be left-justified or right-justified.\n * @param {string} widthSpecifier The width specifier how many characters this conversion should result in.\n * @param {string} precisionSpecifier The precision specifier says how many decimal digits should be displayed for floating-point numbers.\n * @param {string} typeSpecifier The type specifier says what type the argument data should be treated as.\n * @return {string} Returns the computed replacement.\n */\nexport default function match(replacementIndex, replacements, conversionSpecification, percent, position, signSpecifier,\n paddingSpecifier, alignmentSpecifier, widthSpecifier, precisionSpecifier, typeSpecifier) {\n const conversion = new ConversionSpecification({\n percent,\n signSpecifier,\n paddingSpecifier,\n alignmentSpecifier,\n width: coerceToNumber(widthSpecifier, null),\n precision: coerceToNumber(precisionSpecifier, null),\n typeSpecifier\n });\n if (conversion.isPercentLiteral()) {\n return conversionSpecification.slice(1);\n }\n const actualReplacementIndex = replacementIndex.getIndexByPosition(position);\n replacementIndex.incrementOnEmptyPosition(position);\n validateReplacement(actualReplacementIndex, replacements.length, conversion);\n return computeReplacement(replacements[actualReplacementIndex], conversion);\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport { REGEXP_CONVERSION_SPECIFICATION } from 'helper/reg_exp/const';\nimport ReplacementIndex from 'helper/format/replacement/index';\nimport replacementMatch from 'helper/format/replacement/match';\n\n/**\n * Produces a string according to `format`.\n *\n *
\n * `format` string is composed of zero or more directives: ordinary characters (not %), which are copied unchanged\n * to the output string and conversion specifications, each of which results in fetching zero or more subsequent\n * arguments.

\n *\n * Each conversion specification is introduced by the character %, and ends with a conversion\n * specifier. In between there may be (in this order) zero or more flags, an optional minimum field width\n * and an optional precision.
\n * The syntax is: ConversionSpecification = \"%\" { Flags }\n * [ MinimumFieldWidth ] [ Precision ] ConversionSpecifier, where curly braces { } denote repetition\n * and square brackets [ ] optionality.

\n *\n * By default, the arguments are used in the given order.
\n * For argument numbering and swapping, `%m$` (where `m` is a number indicating the argument order)\n * is used instead of `%` to specify explicitly which argument is taken. For instance `%1$s` fetches the 1st argument,\n * `%2$s` the 2nd and so on, no matter what position the conversion specification has in `format`.\n *

\n *\n * The flags
\n * The character % is followed by zero or more of the following flags:
\n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n *
+\n * A sign (+ or -) should always be placed before a number produced by a\n * signed conversion. By default a sign is used only for negative numbers.\n *
0The value should be zero padded.
(a space) The value should be space padded.
'Indicates alternate padding character, specified by prefixing it with a single quote '.
-The converted value is to be left adjusted on the field boundary (the default is right justification).
\n *\n * The minimum field width
\n * An optional decimal digit string (with nonzero first digit) specifying a minimum field width. If the converted\n * value has fewer characters than the field width, it will be padded with spaces on the left (or right, if the\n * left-adjustment flag has been given).

\n *\n * The precision
\n * An optional precision, in the form of a period `.` followed by an optional decimal digit string.
\n * This gives the number of digits to appear after the radix character for `e`, `E`, `f` and `F` conversions, the\n * maximum number of significant digits for `g` and `G` conversions or the maximum number of characters to be printed\n * from a string for `s` conversion.

\n *\n * The conversion specifier
\n * A specifier that mentions what type the argument should be treated as:\n *\n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n * \n *\n *
`s`The string argument is treated as and presented as a string.
`d` `i`The integer argument is converted to signed decimal notation.
`b`The unsigned integer argument is converted to unsigned binary.
`c`The unsigned integer argument is converted to an ASCII character with that number.
`o`The unsigned integer argument is converted to unsigned octal.
`u`The unsigned integer argument is converted to unsigned decimal.
`x` `X`The unsigned integer argument is converted to unsigned hexadecimal. The letters `abcdef` are used for `x`\n * conversions; the letters `ABCDEF` are used for `X` conversions.
`f`\n * The float argument is rounded and converted to decimal notation in the style `[-]ddd.ddd`, where the number of\n * digits after the decimal-point character is equal to the precision specification. If the precision is missing,\n * it is taken as 6; if the precision is explicitly zero, no decimal-point character appears.\n * If a decimal point appears, at least one digit appears before it.\n *
`e` `E`\n * The float argument is rounded and converted in the style `[-]d.ddde±dd`, where there is one digit\n * before the decimal-point character and the number of digits after it is equal to the precision. If\n * the precision is missing, it is taken as `6`; if the precision is zero, no decimal-point character\n * appears. An `E` conversion uses the letter `E` (rather than `e`) to introduce the exponent.\n *
`g` `G`\n * The float argument is converted in style `f` or `e` (or `F` or `E` for `G` conversions). The precision specifies\n * the number of significant digits. If the precision is missing, `6` digits are given; if the\n * precision is zero, it is treated as `1`. Style `e` is used if the exponent from its conversion is less\n * than `-6` or greater than or equal to the precision. Trailing zeros are removed from the fractional\n * part of the result; a decimal point appears only if it is followed by at least one digit.\n *
`%`A literal `%` is written. No argument is converted. The complete conversion specification is `%%`.
\n *
\n *\n * @function sprintf\n * @static\n * @since 1.0.0\n * @memberOf Format\n * @param {string} [format=''] The format string.\n * @param {...*} replacements The replacements to produce the string.\n * @return {string} Returns the produced string.\n * @example\n * v.sprintf('%s, %s!', 'Hello', 'World');\n * // => 'Hello World!'\n *\n * v.sprintf('%s costs $%d', 'coffee', 2);\n * // => 'coffee costs $2'\n *\n * v.sprintf('%1$s %2$s %1$s %2$s, watcha gonna %3$s', 'bad', 'boys', 'do')\n * // => 'bad boys bad boys, watcha gonna do'\n *\n * v.sprintf('% 6s', 'bird');\n * // => ' bird'\n *\n * v.sprintf('% -6s', 'crab');\n * // => 'crab '\n *\n * v.sprintf(\"%'*5s\", 'cat');\n * // => '**cat'\n *\n * v.sprintf(\"%'*-6s\", 'duck');\n * // => 'duck**'\n *\n * v.sprintf('%d %i %+d', 15, -2, 25);\n * // => '15 -2 +25'\n *\n * v.sprintf(\"%06d\", 15);\n * // => '000015'\n *\n * v.sprintf('0b%b 0o%o 0x%X', 12, 9, 155);\n * // => '0b1100 0o11 0x9B'\n *\n * v.sprintf('%.2f', 10.469);\n * // => '10.47'\n *\n * v.sprintf('%.2e %g', 100.5, 0.455);\n * // => '1.01e+2 0.455'\n * \n */\nexport default function sprintf(format, ...replacements) {\n const formatString = coerceToString(format);\n if (formatString === '') {\n return formatString;\n }\n const boundReplacementMatch = replacementMatch.bind(undefined, new ReplacementIndex(), replacements);\n return formatString.replace(REGEXP_CONVERSION_SPECIFICATION, boundReplacementMatch);\n}","import nilDefault from 'helper/undefined/nil_default';\nimport sprintf from 'format/sprintf';\n\n/**\n * Produces a string according to `format`. Works exactly like sprintf(),\n * with the only difference that accepts the formatting arguments in an array `values`.
\n * See here `format` string specifications.\n *\n * @function vprintf\n * @static\n * @since 1.0.0\n * @memberOf Format\n * @param {string} format=''] The format string.\n * @param {Array} replacements The array of replacements to produce the string.\n * @return {string} Returns the produced string.\n * @example\n * v.vprintf('%s', ['Welcome'])\n * // => 'Welcome'\n *\n * v.vprintf('%s has %d apples', ['Alexandra', 3]);\n * // => 'Alexandra has 3 apples'\n */\nexport default function vprintf(format, replacements) {\n return sprintf(format, ...nilDefault(replacements, []));\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport { REGEXP_HTML_SPECIAL_CHARACTERS } from 'helper/reg_exp/const';\n\nconst escapeCharactersMap = {\n '<': '<',\n '>': '>',\n '&': '&',\n '\"': '"',\n \"'\": ''',\n '`': '`'\n};\n\n/**\n * Return the escaped version of `character`.\n *\n * @ignore\n * @param {string} character The character to be escape.\n * @return {string} The escaped version of character.\n */\nfunction replaceSpecialCharacter(character) {\n return escapeCharactersMap[character];\n}\n\n/**\n * Escapes HTML special characters < > & ' \" ` in subject.\n *\n * @function escapeHtml\n * @static\n * @since 1.0.0 \n * @memberOf Escape\n * @param {string} [subject=''] The string to escape.\n * @return {string} Returns the escaped string.\n * @example\n * v.escapeHtml('

wonderful world

');\n * // => '<p>wonderful world</p>'\n */\nexport default function escapeHtml(subject) {\n return coerceToString(subject).replace(REGEXP_HTML_SPECIAL_CHARACTERS, replaceSpecialCharacter);\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport { REGEXP_SPECIAL_CHARACTERS } from 'helper/reg_exp/const';\n\n/**\n * Escapes the regular expression special characters `- [ ] / { } ( ) * + ? . \\ ^ $ |` in `subject`.\n *\n * @function escapeRegExp\n * @static\n * @since 1.0.0\n * @memberOf Escape\n * @param {string} [subject=''] The string to escape.\n * @return {string} Returns the escaped string.\n * @example\n * v.escapeRegExp('(hours)[minutes]{seconds}');\n * // => '\\(hours\\)\\[minutes\\]\\{seconds\\}'\n */\nexport default function escapeRegExp(subject) {\n return coerceToString(subject).replace(REGEXP_SPECIAL_CHARACTERS, '\\\\$&');\n}","import coerceToString from 'helper/string/coerce_to_string';\n\nconst unescapeCharactersMap = {\n '<': /(<)|(�*3c;)|(�*60;)/gi,\n '>': /(>)|(�*3e;)|(�*62;)/gi,\n '&': /(&)|(�*26;)|(�*38;)/gi,\n '\"': /(")|(�*22;)|(�*34;)/gi,\n \"'\": /(�*27;)|(�*39;)/gi,\n '`': /(�*60;)|(�*96;)/gi\n};\nconst characters = Object.keys(unescapeCharactersMap);\n\n/**\n * Replaces the HTML entities with corresponding characters.\n *\n * @ignore\n * @param {string} string The accumulator string.\n * @param {string} key The character.\n * @return {string} The string with replaced HTML entity\n */\nfunction reduceUnescapedString(string, key) {\n return string.replace(unescapeCharactersMap[key], key);\n}\n\n/**\n * Unescapes HTML special characters from &lt; &gt; &amp; &quot; &#x27; &#x60;\n * to corresponding < > & ' \" ` in subject.\n *\n * @function unescapeHtml\n * @static\n * @since 1.0.0\n * @memberOf Escape\n * @param {string} [subject=''] The string to unescape.\n * @return {string} Returns the unescaped string.\n * @example\n * v.unescapeHtml('<p>wonderful world</p>');\n * // => '

wonderful world

'\n */\nexport default function unescapeHtml(subject) {\n const subjectString = coerceToString(subject);\n return characters.reduce(reduceUnescapedString, subjectString);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Returns the first occurrence index of `search` in `subject`.\n *\n * @function indexOf\n * @static\n * @since 1.0.0\n * @memberOf Index\n * @param {string} [subject=''] The string where to search.\n * @param {string} search The string to search.\n * @param {number} [fromIndex=0] The index to start searching.\n * @return {number} Returns the first occurrence index or `-1` if not found.\n * @example\n * v.indexOf('morning', 'n');\n * // => 3\n *\n * v.indexOf('evening', 'o');\n * // => -1\n */\nexport default function indexOf(subject, search, fromIndex) {\n const subjectString = coerceToString(subject);\n return subjectString.indexOf(search, fromIndex);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Returns the last occurrence index of `search` in `subject`.\n *\n * @function lastIndexOf\n * @static\n * @since 1.0.0\n * @memberOf Index\n * @param {string} [subject=''] The string where to search.\n * @param {string} search The string to search.\n * @param {number} [fromIndex=subject.length - 1] The index to start searching backward in the string.\n * @return {number} Returns the last occurrence index or `-1` if not found.\n * @example\n * v.lastIndexOf('morning', 'n');\n * // => 5\n *\n * v.lastIndexOf('evening', 'o');\n * // => -1\n */\nexport default function lastIndexOf(subject, search, fromIndex) {\n const subjectString = coerceToString(subject);\n return subjectString.lastIndexOf(search, fromIndex);\n}","import clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Returns the first index of a `pattern` match in `subject`.\n *\n * @function search\n * @static\n * @since 1.0.0\n * @memberOf Index\n * @param {string} [subject=''] The string where to search.\n * @param {string|RegExp} pattern The pattern to match. If `pattern` is not RegExp, it is transformed to `new RegExp(pattern)`.\n * @param {number} [fromIndex=0] The index to start searching.\n * @return {number} Returns the first match index or `-1` if not found.\n * @example\n * v.search('morning', /rn/);\n * // => 2\n *\n * v.search('evening', '/\\d/');\n * // => -1\n */\nexport default function search(subject, pattern, fromIndex) {\n const subjectString = coerceToString(subject);\n const fromIndexNumber = isNil(fromIndex) ? 0 : clipNumber(toInteger(fromIndex), 0, subjectString.length);\n let matchIndex = subjectString.substr(fromIndexNumber).search(pattern);\n if (matchIndex !== -1 && !isNaN(fromIndexNumber)) {\n matchIndex += fromIndexNumber;\n }\n return matchIndex;\n}","import coerceToNumber from 'helper/number/coerce_to_number';\nimport coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Inserts into `subject` a string `toInsert` at specified `position`.\n *\n * @function insert\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string where to insert.\n * @param {string} [toInsert=''] The string to be inserted.\n * @param {number} [position=0] The position to insert.\n * @return {string} Returns the string after insertion.\n * @example\n * v.insert('ct', 'a', 1);\n * // => 'cat'\n *\n * v.insert('sunny', ' day', 5);\n * // => 'sunny day'\n */\nexport default function insert(subject, toInsert, position) {\n const subjectString = coerceToString(subject);\n const toInsertString = coerceToString(toInsert);\n const positionNumber = coerceToNumber(position);\n if (positionNumber < 0 || positionNumber > subjectString.length || toInsertString === '') {\n return subjectString;\n }\n return subjectString.slice(0, positionNumber) + toInsertString + subjectString.slice(positionNumber);\n}","/**\n * Generated diacritics map. See bellow the base code.\n * @ignore\n * @see http://stackoverflow.com/a/18391901/1894471\n * @type Object\n */\n\nconst diacritics = {\n \"3\": \"\\u039e\\u03be\",\n \"8\": \"\\u0398\\u03b8\",\n \"A\": \"\\x41\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\u0100\\u0102\\u0104\\u01cd\\u01de\\u01e0\\u01fa\\u0200\\u0202\\u0226\\u023a\\u1e00\\u1ea0\\u1ea2\\u1ea4\\u1ea6\\u1ea8\\u1eaa\\u1eac\\u1eae\\u1eb0\\u1eb2\\u1eb4\\u1eb6\\u24b6\\u2c6f\\uff21\\u0386\\u0391\\u0410\",\n \"B\": \"\\x42\\u0181\\u0182\\u0243\\u1e02\\u1e04\\u1e06\\u24b7\\uff22\\u0392\\u0411\",\n \"C\": \"\\x43\\xc7\\u0106\\u0108\\u010a\\u010c\\u0187\\u023b\\u1e08\\u24b8\\ua73e\\uff23\\u0426\",\n \"D\": \"\\x44\\u010e\\u0110\\u0189\\u018a\\u018b\\u1e0a\\u1e0c\\u1e0e\\u1e10\\u1e12\\u24b9\\ua779\\uff24\\xd0\\u0394\\u0414\",\n \"E\": \"\\x45\\xc8\\xc9\\xca\\xcb\\u0112\\u0114\\u0116\\u0118\\u011a\\u018e\\u0190\\u0204\\u0206\\u0228\\u1e14\\u1e16\\u1e18\\u1e1a\\u1e1c\\u1eb8\\u1eba\\u1ebc\\u1ebe\\u1ec0\\u1ec2\\u1ec4\\u1ec6\\u24ba\\uff25\\u0388\\u0395\\u0415\\u042d\",\n \"F\": \"\\x46\\u0191\\u1e1e\\u24bb\\ua77b\\uff26\\u03a6\\u0424\",\n \"G\": \"\\x47\\u011c\\u011e\\u0120\\u0122\\u0193\\u01e4\\u01e6\\u01f4\\u1e20\\u24bc\\ua77d\\ua77e\\ua7a0\\uff27\\u0393\\u0413\\u0490\",\n \"H\": \"\\x48\\u0124\\u0126\\u021e\\u1e22\\u1e24\\u1e26\\u1e28\\u1e2a\\u24bd\\u2c67\\u2c75\\ua78d\\uff28\\u0389\\u0397\\u0425\",\n \"I\": \"\\x49\\xcc\\xcd\\xce\\xcf\\u0128\\u012a\\u012c\\u012e\\u0130\\u0197\\u01cf\\u0208\\u020a\\u1e2c\\u1e2e\\u1ec8\\u1eca\\u24be\\uff29\\u038a\\u0399\\u03aa\\u0406\\u0418\",\n \"J\": \"\\x4a\\u0134\\u0248\\u24bf\\uff2a\\u0419\",\n \"K\": \"\\x4b\\u0136\\u0198\\u01e8\\u1e30\\u1e32\\u1e34\\u24c0\\u2c69\\ua740\\ua742\\ua744\\ua7a2\\uff2b\\u039a\\u041a\",\n \"L\": \"\\x4c\\u0139\\u013b\\u013d\\u013f\\u0141\\u023d\\u1e36\\u1e38\\u1e3a\\u1e3c\\u24c1\\u2c60\\u2c62\\ua746\\ua748\\ua780\\uff2c\\u039b\\u041b\",\n \"M\": \"\\x4d\\u019c\\u1e3e\\u1e40\\u1e42\\u24c2\\u2c6e\\uff2d\\u039c\\u041c\",\n \"N\": \"\\x4e\\xd1\\u0143\\u0145\\u0147\\u019d\\u01f8\\u0220\\u1e44\\u1e46\\u1e48\\u1e4a\\u24c3\\ua790\\ua7a4\\uff2e\\u039d\\u041d\",\n \"O\": \"\\x4f\\xd2\\xd3\\xd4\\xd5\\xd6\\xd8\\u014c\\u014e\\u0150\\u0186\\u019f\\u01a0\\u01d1\\u01ea\\u01ec\\u01fe\\u020c\\u020e\\u022a\\u022c\\u022e\\u0230\\u1e4c\\u1e4e\\u1e50\\u1e52\\u1ecc\\u1ece\\u1ed0\\u1ed2\\u1ed4\\u1ed6\\u1ed8\\u1eda\\u1edc\\u1ede\\u1ee0\\u1ee2\\u24c4\\ua74a\\ua74c\\uff2f\\u038c\\u039f\\u041e\",\n \"P\": \"\\x50\\u01a4\\u1e54\\u1e56\\u24c5\\u2c63\\ua750\\ua752\\ua754\\uff30\\u03a0\\u041f\",\n \"Q\": \"\\x51\\u024a\\u24c6\\ua756\\ua758\\uff31\",\n \"R\": \"\\x52\\u0154\\u0156\\u0158\\u0210\\u0212\\u024c\\u1e58\\u1e5a\\u1e5c\\u1e5e\\u24c7\\u2c64\\ua75a\\ua782\\ua7a6\\uff32\\u03a1\\u0420\",\n \"S\": \"\\x53\\u015a\\u015c\\u015e\\u0160\\u0218\\u1e60\\u1e62\\u1e64\\u1e66\\u1e68\\u1e9e\\u24c8\\u2c7e\\ua784\\ua7a8\\uff33\\u03a3\\u0421\",\n \"T\": \"\\x54\\u0162\\u0164\\u0166\\u01ac\\u01ae\\u021a\\u023e\\u1e6a\\u1e6c\\u1e6e\\u1e70\\u24c9\\ua786\\uff34\\u03a4\\u0422\",\n \"U\": \"\\x55\\xd9\\xda\\xdb\\xdc\\u0168\\u016a\\u016c\\u016e\\u0170\\u0172\\u01af\\u01d3\\u01d5\\u01d7\\u01d9\\u01db\\u0214\\u0216\\u0244\\u1e72\\u1e74\\u1e76\\u1e78\\u1e7a\\u1ee4\\u1ee6\\u1ee8\\u1eea\\u1eec\\u1eee\\u1ef0\\u24ca\\uff35\\u0423\\u042a\",\n \"V\": \"\\x56\\u01b2\\u0245\\u1e7c\\u1e7e\\u24cb\\ua75e\\uff36\\u0412\",\n \"W\": \"\\x57\\u0174\\u1e80\\u1e82\\u1e84\\u1e86\\u1e88\\u24cc\\u2c72\\uff37\\u038f\\u03a9\",\n \"X\": \"\\x58\\u1e8a\\u1e8c\\u24cd\\uff38\\u03a7\",\n \"Y\": \"\\x59\\xdd\\u0176\\u0178\\u01b3\\u0232\\u024e\\u1e8e\\u1ef2\\u1ef4\\u1ef6\\u1ef8\\u1efe\\u24ce\\uff39\\u038e\\u03a5\\u03ab\\u042b\",\n \"Z\": \"\\x5a\\u0179\\u017b\\u017d\\u01b5\\u0224\\u1e90\\u1e92\\u1e94\\u24cf\\u2c6b\\u2c7f\\ua762\\uff3a\\u0396\\u0417\",\n \"a\": \"\\x61\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\u0101\\u0103\\u0105\\u01ce\\u01df\\u01e1\\u01fb\\u0201\\u0203\\u0227\\u0250\\u1e01\\u1e9a\\u1ea1\\u1ea3\\u1ea5\\u1ea7\\u1ea9\\u1eab\\u1ead\\u1eaf\\u1eb1\\u1eb3\\u1eb5\\u1eb7\\u24d0\\u2c65\\uff41\\u03ac\\u03b1\\u0430\",\n \"b\": \"\\x62\\u0180\\u0183\\u0253\\u1e03\\u1e05\\u1e07\\u24d1\\uff42\\u03b2\\u0431\",\n \"c\": \"\\x63\\xe7\\u0107\\u0109\\u010b\\u010d\\u0188\\u023c\\u1e09\\u2184\\u24d2\\ua73f\\uff43\\u0446\",\n \"d\": \"\\x64\\u010f\\u0111\\u018c\\u0256\\u0257\\u1e0b\\u1e0d\\u1e0f\\u1e11\\u1e13\\u24d3\\ua77a\\uff44\\xf0\\u03b4\\u0434\",\n \"e\": \"\\x65\\xe8\\xe9\\xea\\xeb\\u0113\\u0115\\u0117\\u0119\\u011b\\u01dd\\u0205\\u0207\\u0229\\u0247\\u025b\\u1e15\\u1e17\\u1e19\\u1e1b\\u1e1d\\u1eb9\\u1ebb\\u1ebd\\u1ebf\\u1ec1\\u1ec3\\u1ec5\\u1ec7\\u24d4\\uff45\\u03ad\\u03b5\\u0435\\u044d\",\n \"f\": \"\\x66\\u0192\\u1e1f\\u24d5\\ua77c\\uff46\\u03c6\\u0444\",\n \"g\": \"\\x67\\u011d\\u011f\\u0121\\u0123\\u01e5\\u01e7\\u01f5\\u0260\\u1d79\\u1e21\\u24d6\\ua77f\\ua7a1\\uff47\\u03b3\\u0433\\u0491\",\n \"h\": \"\\x68\\u0125\\u0127\\u021f\\u0265\\u1e23\\u1e25\\u1e27\\u1e29\\u1e2b\\u1e96\\u24d7\\u2c68\\u2c76\\uff48\\u03ae\\u03b7\\u0445\",\n \"i\": \"\\x69\\xec\\xed\\xee\\xef\\u0129\\u012b\\u012d\\u012f\\u0131\\u01d0\\u0209\\u020b\\u0268\\u1e2d\\u1e2f\\u1ec9\\u1ecb\\u24d8\\uff49\\u0390\\u03af\\u03b9\\u03ca\\u0438\\u0456\",\n \"j\": \"\\x6a\\u0135\\u01f0\\u0249\\u24d9\\uff4a\\u0439\",\n \"k\": \"\\x6b\\u0137\\u0199\\u01e9\\u1e31\\u1e33\\u1e35\\u24da\\u2c6a\\ua741\\ua743\\ua745\\ua7a3\\uff4b\\u03ba\\u043a\",\n \"l\": \"\\x6c\\u013a\\u013c\\u013e\\u0140\\u0142\\u017f\\u019a\\u026b\\u1e37\\u1e39\\u1e3b\\u1e3d\\u24db\\u2c61\\ua747\\ua749\\ua781\\uff4c\\u03bb\\u043b\",\n \"m\": \"\\x6d\\u026f\\u0271\\u1e3f\\u1e41\\u1e43\\u24dc\\uff4d\\u03bc\\u043c\",\n \"n\": \"\\x6e\\xf1\\u0144\\u0146\\u0148\\u0149\\u019e\\u01f9\\u0272\\u1e45\\u1e47\\u1e49\\u1e4b\\u24dd\\ua791\\ua7a5\\uff4e\\u03bd\\u043d\",\n \"o\": \"\\x6f\\xf2\\xf3\\xf4\\xf5\\xf6\\xf8\\u014d\\u014f\\u0151\\u01a1\\u01d2\\u01eb\\u01ed\\u01ff\\u020d\\u020f\\u022b\\u022d\\u022f\\u0231\\u0254\\u0275\\u1e4d\\u1e4f\\u1e51\\u1e53\\u1ecd\\u1ecf\\u1ed1\\u1ed3\\u1ed5\\u1ed7\\u1ed9\\u1edb\\u1edd\\u1edf\\u1ee1\\u1ee3\\u24de\\ua74b\\ua74d\\uff4f\\u03bf\\u03cc\\u043e\",\n \"p\": \"\\x70\\u01a5\\u1d7d\\u1e55\\u1e57\\u24df\\ua751\\ua753\\ua755\\uff50\\u03c0\\u043f\",\n \"q\": \"\\x71\\u024b\\u24e0\\ua757\\ua759\\uff51\",\n \"r\": \"\\x72\\u0155\\u0157\\u0159\\u0211\\u0213\\u024d\\u027d\\u1e59\\u1e5b\\u1e5d\\u1e5f\\u24e1\\ua75b\\ua783\\ua7a7\\uff52\\u03c1\\u0440\",\n \"s\": \"\\x73\\xdf\\u015b\\u015d\\u015f\\u0161\\u0219\\u023f\\u1e61\\u1e63\\u1e65\\u1e67\\u1e69\\u1e9b\\u24e2\\ua785\\ua7a9\\uff53\\u03c2\\u03c3\\u0441\",\n \"t\": \"\\x74\\u0163\\u0165\\u0167\\u01ad\\u021b\\u0288\\u1e6b\\u1e6d\\u1e6f\\u1e71\\u1e97\\u24e3\\u2c66\\ua787\\uff54\\u03c4\\u0442\",\n \"u\": \"\\x75\\xf9\\xfa\\xfb\\xfc\\u0169\\u016b\\u016d\\u016f\\u0171\\u0173\\u01b0\\u01d4\\u01d6\\u01d8\\u01da\\u01dc\\u0215\\u0217\\u0289\\u1e73\\u1e75\\u1e77\\u1e79\\u1e7b\\u1ee5\\u1ee7\\u1ee9\\u1eeb\\u1eed\\u1eef\\u1ef1\\u24e4\\uff55\\u0443\\u044a\",\n \"v\": \"\\x76\\u028b\\u028c\\u1e7d\\u1e7f\\u24e5\\ua75f\\uff56\\u0432\",\n \"w\": \"\\x77\\u0175\\u1e81\\u1e83\\u1e85\\u1e87\\u1e89\\u1e98\\u24e6\\u2c73\\uff57\\u03c9\\u03ce\",\n \"x\": \"\\x78\\u1e8b\\u1e8d\\u24e7\\uff58\\u03c7\",\n \"y\": \"\\x79\\xfd\\xff\\u0177\\u01b4\\u0233\\u024f\\u1e8f\\u1e99\\u1ef3\\u1ef5\\u1ef7\\u1ef9\\u1eff\\u24e8\\uff59\\u03b0\\u03c5\\u03cb\\u03cd\\u044b\",\n \"z\": \"\\x7a\\u017a\\u017c\\u017e\\u01b6\\u0225\\u0240\\u1e91\\u1e93\\u1e95\\u24e9\\u2c6c\\ua763\\uff5a\\u03b6\\u0437\",\n \"OE\": \"\\x8c\\u0152\",\n \"oe\": \"\\x9c\\u0153\",\n \"AE\": \"\\xc6\\u01e2\\u01fc\",\n \"ae\": \"\\xe6\\u01e3\\u01fd\",\n \"hv\": \"\\u0195\",\n \"OI\": \"\\u01a2\",\n \"oi\": \"\\u01a3\",\n \"DZ\": \"\\u01c4\\u01f1\",\n \"Dz\": \"\\u01c5\\u01f2\",\n \"dz\": \"\\u01c6\\u01f3\",\n \"LJ\": \"\\u01c7\",\n \"Lj\": \"\\u01c8\",\n \"lj\": \"\\u01c9\",\n \"NJ\": \"\\u01ca\",\n \"Nj\": \"\\u01cb\",\n \"nj\": \"\\u01cc\",\n \"OU\": \"\\u0222\",\n \"ou\": \"\\u0223\",\n \"TZ\": \"\\ua728\",\n \"tz\": \"\\ua729\",\n \"AA\": \"\\ua732\",\n \"aa\": \"\\ua733\",\n \"AO\": \"\\ua734\",\n \"ao\": \"\\ua735\",\n \"AU\": \"\\ua736\",\n \"au\": \"\\ua737\",\n \"AV\": \"\\ua738\\ua73a\",\n \"av\": \"\\ua739\\ua73b\",\n \"AY\": \"\\ua73c\",\n \"ay\": \"\\ua73d\",\n \"OO\": \"\\ua74e\",\n \"oo\": \"\\ua74f\",\n \"VY\": \"\\ua760\",\n \"vy\": \"\\ua761\",\n \"TH\": \"\\xde\",\n \"th\": \"\\xfe\",\n \"PS\": \"\\u03a8\",\n \"ps\": \"\\u03c8\",\n \"Yo\": \"\\u0401\",\n \"Ye\": \"\\u0404\",\n \"Yi\": \"\\u0407\",\n \"Zh\": \"\\u0416\",\n \"Ch\": \"\\u0427\",\n \"Sh\": \"\\u0428\\u0429\",\n \"\": \"\\u042c\\u044c\",\n \"Yu\": \"\\u042e\",\n \"Ya\": \"\\u042f\",\n \"zh\": \"\\u0436\",\n \"ch\": \"\\u0447\",\n \"sh\": \"\\u0448\\u0449\",\n \"yu\": \"\\u044e\",\n \"ya\": \"\\u044f\",\n \"yo\": \"\\u0451\",\n \"ye\": \"\\u0454\",\n \"yi\": \"\\u0457\"\n};\n\nlet diacriticsMap = null;\n\n/**\n * Creates a map of the diacritics.\n *\n * @ignore\n * @returns {Object} Returns the diacritics map.\n */\nfunction getDiacriticsMap() {\n if (diacriticsMap !== null) {\n return diacriticsMap;\n }\n diacriticsMap = {};\n Object.keys(diacritics).forEach(function(key) {\n const characters = diacritics[key];\n for (let index = 0; index < characters.length; index++) {\n const character = characters[index];\n diacriticsMap[character] = key;\n }\n });\n return diacriticsMap;\n}\n\n/**\n * Get the latin character from character with diacritics.\n *\n * @ignore\n * @param {string} character The character with diacritics.\n * @returns {string} Returns the character without diacritics.\n */\nexport function getLatinCharacter(character) {\n const characterWithoutDiacritic = getDiacriticsMap()[character];\n return characterWithoutDiacritic ? characterWithoutDiacritic : character;\n}","import { REGEXP_COMBINING_MARKS, REGEXP_NON_LATIN } from 'helper/reg_exp/const';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport { getLatinCharacter } from 'helper/string/diacritics_map';\n\n/**\n * Returns the `cleanCharacter` from combining marks regular expression match.\n *\n * @ignore\n * @param {string} character The character with combining marks\n * @param {string} cleanCharacter The character without combining marks.\n * @return {string} The character without combining marks.\n */\nfunction removeCombiningMarks(character, cleanCharacter) {\n return cleanCharacter;\n}\n\n/**\n * Latinises the `subject` by removing diacritic characters.\n *\n * @function latinise\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to latinise.\n * @return {string} Returns the latinised string.\n * @example\n * v.latinise('cafe\\u0301'); // or 'café'\n * // => 'cafe'\n *\n * v.latinise('août décembre');\n * // => 'aout decembre'\n *\n * v.latinise('как прекрасен этот мир');\n * // => 'kak prekrasen etot mir'\n */\nexport default function latinise(subject) {\n const subjectString = coerceToString(subject);\n if (subjectString === '') {\n return subjectString;\n }\n return subjectString\n .replace(REGEXP_NON_LATIN, getLatinCharacter)\n .replace(REGEXP_COMBINING_MARKS, removeCombiningMarks);\n}","import buildPadding from 'helper/string/build_padding';\nimport clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { MAX_SAFE_INTEGER } from 'helper/number/const';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Pads `subject` to a new `length`.\n *\n * @function pad\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to pad.\n * @param {int} [length=0] The length to pad the string. No changes are made if `length` is less than `subject.length`.\n * @param {string} [pad=' '] The string to be used for padding.\n * @return {string} Returns the padded string.\n * @example\n * v.pad('dog', 5);\n * // => ' dog '\n *\n * v.pad('bird', 6, '-');\n * // => '-bird-'\n *\n * v.pad('cat', 6, '-=');\n * // => '-cat-='\n */\nexport default function pad(subject, length, pad) {\n const subjectString = coerceToString(subject);\n const lengthInt = isNil(length) ? 0 : clipNumber(toInteger(length), 0, MAX_SAFE_INTEGER);\n const padString = coerceToString(pad, ' ');\n if (lengthInt <= subjectString.length) {\n return subjectString;\n }\n const paddingLength = lengthInt - subjectString.length;\n const paddingSideLength = toInteger(paddingLength / 2);\n const paddingSideRemainingLength = paddingLength % 2;\n return buildPadding(padString, paddingSideLength) + subjectString +\n buildPadding(padString, paddingSideLength + paddingSideRemainingLength);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Returns a new string where the matches of `pattern` are replaced with `replacement`.
\n *\n * @function replace\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to verify.\n * @param {string|RegExp} pattern The pattern which match is replaced. If `pattern` is a string,\n * a simple string match is evaluated and only the first occurrence replaced.\n * @param {string|Function} replacement The string or function which invocation result replaces `pattern` match.\n * @return {string} Returns the replacement result.\n * @example\n * v.replace('swan', 'wa', 'u');\n * // => 'sun'\n *\n * v.replace('domestic duck', /domestic\\s/, '');\n * // => 'duck'\n *\n * v.replace('nice duck', /(nice)(duck)/, function(match, nice, duck) {\n * return 'the ' + duck + ' is ' + nice;\n * });\n * // => 'the duck is nice'\n */\nexport default function replace(subject, pattern, replacement) {\n const subjectString = coerceToString(subject);\n return subjectString.replace(pattern, replacement);\n}","import { REGEXP_FLAGS } from 'helper/reg_exp/const';\n\n/**\n * Get the flags string from a regular expression object.\n *\n * @ignore\n * @param {RegExp} regExp The regular expression object.\n * @return {string} Returns the string with flags chars.\n */\nexport default function getRegExpFlags(regExp) {\n return regExp.toString().match(REGEXP_FLAGS)[0];\n}","import clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport toInteger from 'helper/number/to_integer';\nimport toString from 'helper/string/to_string';\n\n/**\n * Checks whether `subject` includes `search` starting from `position`.\n *\n * @function includes\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string where to search.\n * @param {string} search The string to search.\n * @param {number} [position=0] The position to start searching.\n * @return {boolean} Returns `true` if `subject` includes `search` or `false` otherwise.\n * @example\n * v.includes('starship', 'star');\n * // => true\n *\n * v.includes('galaxy', 'g', 1);\n * // => false\n */\nexport default function includes(subject, search, position) {\n const subjectString = coerceToString(subject);\n const searchString = toString(search);\n if (searchString === null) {\n return false;\n }\n if (searchString === '') {\n return true;\n }\n position = isNil(position) ? 0 : clipNumber(toInteger(position), 0, subjectString.length);\n return subjectString.indexOf(searchString, position) !== -1;\n}","import getRegExpFlags from 'helper/reg_exp/get_reg_exp_flags';\nimport includes from 'query/includes';\n\n/**\n * Append flag to a regular expression.\n *\n * @ignore\n * @param {RegExp} pattern The pattern to coerce.\n * @param {string} appendFlag The flag to append to regular expression.\n * @return {RegExp} The regular expression with added flag.\n */\nexport default function appendFlagToRegExp(pattern, appendFlag) {\n const regularExpressionFlags = getRegExpFlags(pattern);\n if (!includes(regularExpressionFlags, appendFlag)) {\n return new RegExp(pattern.source, regularExpressionFlags + appendFlag);\n }\n return pattern;\n}","import appendFlagToRegularExpression from 'helper/reg_exp/append_flag_to_reg_exp';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport escapeRegExp from 'escape/escape_reg_exp';\n\n/**\n * Returns a new string where all matches of `pattern` are replaced with `replacement`.
\n *\n * @function replaceAll\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to verify.\n * @param {string|RegExp} pattern The pattern which match is replaced. If `pattern` is a string, a simple string match is evaluated.\n * All matches are replaced.\n * @param {string|Function} replacement The string or function which invocation result replaces `pattern` match.\n * @return {string} Returns the replacement result.\n * @example\n * v.replaceAll('good morning', 'o', '*');\n * // => 'g**d m*rning'\n * v.replaceAll('evening', /n/, 's');\n * // => 'evesisg'\n *\n */\nexport default function replaceAll(subject, pattern, replacement) {\n const subjectString = coerceToString(subject);\n let regExp = pattern;\n if (!(pattern instanceof RegExp)) {\n regExp = new RegExp(escapeRegExp(pattern), 'g');\n } else if (!pattern.global) {\n regExp = appendFlagToRegularExpression(pattern, 'g');\n }\n return subjectString.replace(regExp, replacement);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Reverses the `subject`.\n *\n * @function reverse\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to reverse.\n * @return {string} Returns the reversed string.\n * @example\n * v.reverse('winter');\n * // => 'retniw'\n */\nexport default function reverse(subject) {\n const subjectString = coerceToString(subject);\n return subjectString.split('').reverse().join('');\n}","import { REGEXP_COMBINING_MARKS, REGEXP_SURROGATE_PAIRS } from 'helper/reg_exp/const';\nimport coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Reverses the `subject` taking care of\n * surrogate pairs and\n * combining marks.\n *\n * @function reverseGrapheme\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to reverse.\n * @return {string} Returns the reversed string.\n * @example\n * v.reverseGrapheme('summer');\n * // => 'remmus'\n *\n * v.reverseGrapheme('𝌆 bar mañana mañana');\n * // => 'anañam anañam rab 𝌆'\n */\nexport default function reverseGrapheme(subject) {\n let subjectString = coerceToString(subject);\n /**\n * @see https://github.com/mathiasbynens/esrever\n */\n subjectString = subjectString\n .replace(REGEXP_COMBINING_MARKS, function($0, $1, $2) {\n return reverseGrapheme($2) + $1;\n })\n .replace(REGEXP_SURROGATE_PAIRS, '$2$1');\n let reversedString = '';\n let index = subjectString.length;\n while (index--) {\n reversedString += subjectString.charAt(index);\n }\n return reversedString;\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport kebabCase from 'case/kebab_case';\nimport latinise from 'manipulate/latinise';\nimport { REGEXP_NON_LATIN } from 'helper/reg_exp/const';\n\n/**\n * Slugifies the `subject`. Cleans the `subject` by replacing diacritics with corresponding latin characters.\n *\n * @function slugify\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to slugify.\n * @return {string} Returns the slugified string.\n * @example\n * v.slugify('Italian cappuccino drink');\n * // => 'italian-cappuccino-drink'\n *\n * v.slugify('caffé latté');\n * // => 'caffe-latte'\n *\n * v.slugify('хорошая погода');\n * // => 'horoshaya-pogoda'\n */\nexport default function slugify(subject) {\n const subjectString = coerceToString(subject);\n if (subjectString === '') {\n return '';\n }\n const cleanSubjectString = latinise(subjectString).replace(REGEXP_NON_LATIN, '-');\n return kebabCase(cleanSubjectString);\n}","import coerceToNumber from 'helper/number/coerce_to_number';\nimport coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Changes `subject` by deleting `deleteCount` of characters starting at position `start`. Places a new string\n * `toAdd` instead of deleted characters.\n *\n * @function splice\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string where to insert.\n * @param {string} start The position to start changing the string. For a negative position will start from the end of\n * the string.\n * @param {number} [deleteCount=subject.length-start] The number of characters to delete from string.\n * @param {string} [toAdd=''] The string to be added instead of deleted characters.\n * @return {string} Returns the modified string.\n * @example\n * v.splice('new year', 0, 4);\n * // => 'year'\n *\n * v.splice('new year', 0, 3, 'happy');\n * // => 'happy year'\n *\n * v.splice('new year', -4, 4, 'day');\n * // => 'new day'\n */\nexport default function splice(subject, start, deleteCount, toAdd) {\n const subjectString = coerceToString(subject);\n const toAddString = coerceToString(toAdd);\n let startPosition = coerceToNumber(start);\n if (startPosition < 0) {\n startPosition = subjectString.length + startPosition;\n if (startPosition < 0) {\n startPosition = 0;\n }\n } else if (startPosition > subjectString.length) {\n startPosition = subjectString.length;\n }\n let deleteCountNumber = coerceToNumber(deleteCount, subjectString.length - startPosition);\n if (deleteCountNumber < 0) {\n deleteCountNumber = 0;\n }\n return subjectString.slice(0, startPosition) + toAddString + subjectString.slice(startPosition + deleteCountNumber);\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { REGEXP_TRIM_LEFT } from 'helper/reg_exp/const';\nimport toString from 'helper/string/to_string';\n\n/**\n * Removes whitespaces from the left side of the `subject`.\n *\n * @function trimLeft\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to trim.\n * @param {string} [whitespace=whitespace] The whitespace characters to trim.\n * @return {string} Returns the trimmed string.\n * @example\n * v.trimLeft(' Starship Troopers');\n * // => 'Starship Troopers'\n *\n * v.trimLeft('***Mobile Infantry', '*');\n * // => 'Mobile Infantry'\n */\nexport default function trimLeft(subject, whitespace) {\n const subjectString = coerceToString(subject);\n if (whitespace === '' || subjectString === '') {\n return subjectString;\n }\n const whitespaceString = toString(whitespace);\n if (isNil(whitespaceString)) {\n return subjectString.replace(REGEXP_TRIM_LEFT, '');\n }\n const whitespaceLength = whitespaceString.length;\n let matchWhitespace = true;\n let totalWhitespaceLength = 0;\n while (matchWhitespace) {\n if (subjectString.indexOf(whitespaceString, totalWhitespaceLength) === totalWhitespaceLength) {\n totalWhitespaceLength += whitespaceLength;\n } else {\n matchWhitespace = false;\n }\n }\n return subjectString.substring(totalWhitespaceLength);\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport { REGEXP_TRIM_RIGHT } from 'helper/reg_exp/const';\nimport toString from 'helper/string/to_string';\n\n/**\n * Removes whitespaces from the right side of the `subject`.\n *\n * @function trimRight\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to trim.\n * @param {string} [whitespace=whitespace] The whitespace characters to trim.\n * @return {string} Returns the trimmed string.\n * @example\n * v.trimRight('the fire rises ');\n * // => 'the fire rises'\n *\n * v.trimRight('do you feel in charge?!!!', '!');\n * // => 'do you feel in charge?'\n */\nexport default function trimRight(subject, whitespace) {\n const subjectString = coerceToString(subject);\n if (whitespace === '' || subjectString === '') {\n return subjectString;\n }\n const whitespaceString = toString(whitespace);\n if (isNil(whitespaceString)) {\n return subjectString.replace(REGEXP_TRIM_RIGHT, '');\n }\n const whitespaceLength = whitespaceString.length;\n const subjectLength = subjectString.length;\n let matchWhitespace = true;\n let totalWhitespaceLength = 0;\n let position;\n while (matchWhitespace) {\n position = subjectLength - totalWhitespaceLength - whitespaceLength;\n if (subjectString.indexOf(whitespaceString, position) === position) {\n totalWhitespaceLength += whitespaceLength;\n } else {\n matchWhitespace = false;\n }\n }\n return subjectString.substring(0, subjectLength - totalWhitespaceLength);\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport toString from 'helper/string/to_string';\nimport trimLeft from 'manipulate/trim_left';\nimport trimRight from 'manipulate/trim_right';\n\n/**\n * Removes whitespaces from left and right sides of the `subject`.\n *\n * @function trim\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to trim.\n * @param {string} [whitespace=whitespace] The whitespace characters to trim.\n * @return {string} Returns the trimmed string.\n * @example\n * v.trim(' Mother nature ');\n * // => 'Mother nature'\n *\n * v.trim('--Earth--', '-');\n * // => 'Earth'\n */\nexport default function trim(subject, whitespace) {\n const subjectString = coerceToString(subject);\n if (whitespace === '' || subjectString === '') {\n return subjectString;\n }\n const whitespaceString = toString(whitespace);\n if (isNil(whitespaceString)) {\n return subjectString.trim();\n }\n return trimRight(trimLeft(subjectString, whitespaceString), whitespaceString);\n}","import coerceToBoolean from 'helper/boolean/coerce_to_boolean';\nimport coerceToNumber from 'helper/number/coerce_to_number';\nimport coerceToString from 'helper/string/coerce_to_string';\n\nconst OPTION_WIDTH = 'width';\nconst OPTION_NEW_LINE = 'newLine';\nconst OPTION_INDENT = 'indent';\nconst OPTION_CUT = 'cut';\n\n/**\n * Determine the word wrap options. The missing values are filled with defaults.\n *\n * @param {Object} options The options object.\n * @return {Object} The word wrap options, with default settings if necessary.\n * @ignore\n */\nfunction determineOptions(options) {\n return {\n width: coerceToNumber(options[OPTION_WIDTH], 75),\n newLine: coerceToString(options[OPTION_NEW_LINE], '\\n'),\n indent: coerceToString(options[OPTION_INDENT], ''),\n cut: coerceToBoolean(options[OPTION_CUT], false)\n };\n}\n\n/**\n * Wraps `subject` to a given number of characters using a string break character.\n *\n * @function wordWrap\n * @static\n * @since 1.0.0\n * @memberOf Manipulate\n * @param {string} [subject=''] The string to wrap.\n * @param {Object} [options={}] The wrap options.\n * @param {number} [options.width=75] The number of characters at which to wrap.\n * @param {string} [options.newLine='\\n'] The string to add at the end of line.\n * @param {string} [options.indent=''] The string to intend the line.\n * @param {boolean} [options.cut=false] When `false` (default) does not split the word even if word length is bigger than `width`.
\n * When `true` breaks the word that has length bigger than `width`.\n *\n * @return {string} Returns wrapped string.\n * @example\n * v.wordWrap('Hello world', {\n * width: 5\n * });\n * // => 'Hello\\nworld'\n *\n * v.wordWrap('Hello world', {\n * width: 5,\n * newLine: '
',\n * indent: '__'\n * });\n * // => '__Hello
__world'\n *\n * v.wordWrap('Wonderful world', {\n * width: 5,\n * cut: true\n * });\n * // => 'Wonde\\nrful\\nworld'\n *\n */\nexport default function wordWrap(subject, options = {}) {\n const subjectString = coerceToString(subject);\n const { width, newLine, indent, cut } = determineOptions(options);\n if (subjectString === '' || width <= 0) {\n return indent;\n }\n const subjectLength = subjectString.length;\n const substring = subjectString.substring.bind(subjectString);\n let offset = 0;\n let wrappedLine = '';\n while ((subjectLength - offset) > width) {\n if (subjectString[offset] === ' ') {\n offset++;\n continue;\n }\n let spaceToWrapAt = subjectString.lastIndexOf(' ', width + offset);\n if (spaceToWrapAt >= offset) {\n wrappedLine += indent + substring(offset, spaceToWrapAt) + newLine;\n offset = spaceToWrapAt + 1;\n } else {\n if (cut) {\n wrappedLine += indent + substring(offset, width + offset) + newLine;\n offset += width;\n } else {\n spaceToWrapAt = subjectString.indexOf(' ', width + offset);\n if (spaceToWrapAt >= 0) {\n wrappedLine += indent + substring(offset, spaceToWrapAt) + newLine;\n offset = spaceToWrapAt + 1;\n } else {\n wrappedLine += indent + substring(offset);\n offset = subjectLength;\n }\n }\n }\n }\n if (offset < subjectLength) {\n wrappedLine += indent + substring(offset);\n }\n return wrappedLine;\n}","import clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport toInteger from 'helper/number/to_integer';\n\n/**\n * Checks whether `subject` ends with `end`.\n *\n * @function endsWith\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @param {string} end The ending string.\n * @param {number} [position=subject.length] Search within `subject` as if the string were only `position` long.\n * @return {boolean} Returns `true` if `subject` ends with `end` or `false` otherwise.\n * @example\n * v.endsWith('red alert', 'alert');\n * // => true\n *\n * v.endsWith('metro south', 'metro');\n * // => false\n *\n * v.endsWith('Murphy', 'ph', 5);\n * // => true\n */\nexport default function endsWith(subject, end, position) {\n if (isNil(end)) {\n return false;\n }\n const subjectString = coerceToString(subject);\n const endString = coerceToString(end);\n if (endString === '') {\n return true;\n }\n position = isNil(position) ? subjectString.length : clipNumber(toInteger(position), 0, subjectString.length);\n position -= endString.length;\n const lastIndex = subjectString.indexOf(endString, position);\n return lastIndex !== -1 && lastIndex === position;\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport { REGEXP_ALPHA } from 'helper/reg_exp/const_extended';\n\n/**\n * Checks whether `subject` contains only alpha characters.\n *\n * @function isAlpha\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @return {boolean} Returns `true` if `subject` contains only alpha characters or `false` otherwise.\n * @example\n * v.isAlpha('bart');\n * // => true\n *\n * v.isAlpha('lisa!');\n * // => false\n *\n * v.isAlpha('lisa and bart');\n * // => false\n */\nexport default function isAlpha(subject) {\n const subjectString = coerceToString(subject);\n return REGEXP_ALPHA.test(subjectString);\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport { REGEXP_ALPHA_DIGIT } from 'helper/reg_exp/const_extended';\n\n/**\n * Checks whether `subject` contains only alpha and digit characters.\n *\n * @function isAlphaDigit\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @return {boolean} Returns `true` if `subject` contains only alpha and digit characters or `false` otherwise.\n * @example\n * v.isAlphaDigit('year2020');\n * // => true\n *\n * v.isAlphaDigit('1448');\n * // => true\n *\n * v.isAlphaDigit('40-20');\n * // => false\n */\nexport default function isAlphaDigit(subject) {\n const subjectString = coerceToString(subject);\n return REGEXP_ALPHA_DIGIT.test(subjectString);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Checks whether `subject` is empty or contains only whitespaces.\n *\n * @function isBlank\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @return {boolean} Returns `true` if `subject` is empty or contains only whitespaces or `false` otherwise.\n * @example\n * v.isBlank('');\n * // => true\n *\n * v.isBlank(' ');\n * // => true\n *\n * v.isBlank('World');\n * // => false\n */\nexport default function isBlank(subject) {\n const subjectString = coerceToString(subject);\n return subjectString.trim().length === 0;\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport { REGEXP_DIGIT } from 'helper/reg_exp/const';\n\n/**\n * Checks whether `subject` contains only digit characters.\n *\n * @function isDigit\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @return {boolean} Returns `true` if `subject` contains only digit characters or `false` otherwise.\n * @example\n * v.isDigit('35');\n * // => true\n *\n * v.isDigit('1.5');\n * // => false\n *\n * v.isDigit('ten');\n * // => false\n */\nexport default function isDigit(subject) {\n const subjectString = coerceToString(subject);\n return REGEXP_DIGIT.test(subjectString);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Checks whether `subject` is empty.\n *\n * @function isEmpty\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @return {boolean} Returns `true` if `subject` is empty or `false` otherwise\n * @example\n * v.isEmpty('');\n * // => true\n *\n * v.isEmpty(' ');\n * // => false\n *\n * v.isEmpty('sun');\n * // => false\n */\nexport default function isEmpty(subject) {\n const subjectString = coerceToString(subject);\n return subjectString.length === 0;\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport isAlpha from 'query/is_alpha';\n\n/**\n * Checks whether `subject` has only lower case characters.\n *\n * @function isLowerCase\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @return {boolean} Returns `true` if `subject` is lower case or `false` otherwise.\n * @example\n * v.isLowerCase('motorcycle');\n * // => true\n *\n * v.isLowerCase('John');\n * // => false\n *\n * v.isLowerCase('T1000');\n * // => false\n */\nexport default function isLowerCase(subject) {\n const valueString = coerceToString(subject);\n return isAlpha(valueString) && valueString.toLowerCase() === valueString;\n}","import isNil from 'helper/object/is_nil';\n\n/**\n * Checks whether `subject` is numeric.\n *\n * @function isNumeric\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @return {boolean} Returns `true` if `subject` is numeric or `false` otherwise.\n * @example\n * v.isNumeric('350');\n * // => true\n *\n * v.isNumeric('-20.5');\n * // => true\n *\n * v.isNumeric('1.5E+2');\n * // => true\n *\n * v.isNumeric('five');\n * // => false\n */\nexport default function isNumeric(subject) {\n const valueNumeric = typeof subject === 'object' && !isNil(subject) ? Number(subject) : subject;\n return (typeof valueNumeric === 'number' || typeof valueNumeric === 'string')\n && !isNaN(valueNumeric - parseFloat(valueNumeric));\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport isAlpha from 'query/is_alpha';\n\n/**\n * Checks whether `subject` contains only upper case characters.\n *\n * @function isUpperCase\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @return {boolean} Returns `true` if `subject` is upper case or `false` otherwise.\n * @example\n * v.isUpperCase('ACDC');\n * // => true\n *\n * v.isUpperCase('Morning');\n * // => false\n */\nexport default function isUpperCase(subject) {\n const subjectString = coerceToString(subject);\n return isAlpha(subjectString) && subjectString.toUpperCase() === subjectString;\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport toString from 'helper/string/to_string';\n\n/**\n * Checks whether `subject` matches the regular expression `pattern`.\n *\n * @function matches\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @param {RegExp|string} pattern The pattern to match. If `pattern` is not RegExp, it is transformed to `new RegExp(pattern, flags)`.\n * @param {string} [flags=''] The regular expression flags. Applies when `pattern` is string type.\n * @return {boolean} Returns `true` if `subject` matches `pattern` or `false` otherwise.\n * @example\n * v.matches('pluto', /plu.{2}/);\n * // => true\n *\n * v.matches('sun', 'S', 'i');\n * // => true\n *\n * v.matches('apollo 11', '\\\\d{3}');\n * // => false\n */\nexport default function matches(subject, pattern, flags) {\n const subjectString = coerceToString(subject);\n const flagsString = coerceToString(flags);\n let patternString;\n if (!(pattern instanceof RegExp)) {\n patternString = toString(pattern);\n if (patternString === null) {\n return false;\n }\n pattern = new RegExp(patternString, flagsString);\n }\n return pattern.test(subjectString);\n}","import clipNumber from 'helper/number/clip_number';\nimport coerceToString from 'helper/string/coerce_to_string';\nimport isNil from 'helper/object/is_nil';\nimport toInteger from 'helper/number/to_integer';\nimport toString from 'helper/string/to_string';\n\n/**\n * Checks whether `subject` starts with `start`.\n *\n * @function startsWith\n * @static\n * @since 1.0.0\n * @memberOf Query\n * @param {string} [subject=''] The string to verify.\n * @param {string} start The starting string.\n * @param {number} [position=0] The position to start searching.\n * @return {boolean} Returns `true` if `subject` starts with `start` or `false` otherwise.\n * @example\n * v.startsWith('say hello to my little friend', 'say hello');\n * // => true\n *\n * v.startsWith('tony', 'on', 1);\n * // => true\n *\n * v.startsWith('the world is yours', 'world');\n * // => false\n */\nexport default function startsWith(subject, start, position) {\n const subjectString = coerceToString(subject);\n const startString = toString(start);\n if (startString === null) {\n return false;\n }\n if (startString === '') {\n return true;\n }\n position = isNil(position) ? 0 : clipNumber(toInteger(position), 0, subjectString.length);\n return subjectString.substr(position, startString.length) === startString;\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Splits `subject` into an array of characters.\n *\n * @function chars\n * @static\n * @since 1.0.0\n * @memberOf Split\n * @param {string} [subject=''] The string to split into characters.\n * @return {Array} Returns the array of characters.\n * @example\n * v.chars('cloud');\n * // => ['c', 'l', 'o', 'u', 'd']\n */\nexport default function chars(subject) {\n const subjectString = coerceToString(subject);\n return subjectString.split('');\n}","import codePointAt from 'chop/code_point_at';\nimport coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Returns an array of Unicode code point values from characters of `subject`.\n *\n * @function codePoints\n * @static\n * @since 1.0.0\n * @memberOf Split\n * @param {string} [subject=''] The string to extract from.\n * @return {Array} Returns an array of non-negative numbers less than or equal to `0x10FFFF`.\n * @example\n * v.codePoints('rain');\n * // => [114, 97, 105, 110], or\n * // [0x72, 0x61, 0x69, 0x6E]\n *\n * v.codePoints('\\uD83D\\uDE00 smile'); // or '😀 smile'\n * // => [128512, 32, 115, 109, 105, 108, 101], or\n * // [0x1F600, 0x20, 0x73, 0x6D, 0x69, 0x6C, 0x65]\n */\nexport default function codePoints(subject) {\n const subjectString = coerceToString(subject);\n const subjectStringLength = subjectString.length;\n const codePointArray = [];\n let index = 0;\n let codePointNumber;\n while (index < subjectStringLength) {\n codePointNumber = codePointAt(subjectString, index);\n codePointArray.push(codePointNumber);\n index += codePointNumber > 0xFFFF ? 2 : 1;\n }\n return codePointArray;\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport nilDefault from 'helper/undefined/nil_default';\nimport { REGEXP_UNICODE_CHARACTER } from 'helper/reg_exp/const';\n\n/**\n * Splits `subject` into an array of graphemes taking care of\n * surrogate pairs and\n * combining marks.\n *\n * @function graphemes\n * @static\n * @since 1.0.0\n * @memberOf Split\n * @param {string} [subject=''] The string to split into characters.\n * @return {Array} Returns the array of graphemes.\n * @example\n * v.graphemes('\\uD835\\uDC00\\uD835\\uDC01'); // or '𝐀𝐁'\n * // => ['\\uD835\\uDC00', '\\uD835\\uDC01'], or\n * // ['𝐀', '𝐁']\n *\n * v.graphemes('cafe\\u0301'); // or 'café'\n * // => ['c', 'a', 'f', 'e\\u0301'], or\n * // ['c', 'a', 'f', 'é']\n */\nexport default function graphemes(subject) {\n const subjectString = coerceToString(subject);\n return nilDefault(subjectString.match(REGEXP_UNICODE_CHARACTER), []);\n}","import coerceToString from 'helper/string/coerce_to_string';\n\n/**\n * Splits `subject` into an array of chunks by `separator`.\n *\n * @function split\n * @static\n * @since 1.0.0\n * @memberOf Split\n * @param {string} [subject=''] The string to split into characters.\n * @param {string|RegExp} [separator] The pattern to match the separator.\n * @param {number} [limit] Limit the number of chunks to be found.\n * @return {Array} Returns the array of chunks.\n * @example\n * v.split('rage against the dying of the light', ' ');\n * // => ['rage', 'against', 'the', 'dying', 'of', 'the', 'light']\n *\n * v.split('the dying of the light', /\\s/, 3);\n * // => ['the', 'dying', 'of']\n */\nexport default function split(subject, separator, limit) {\n const subjectString = coerceToString(subject);\n return subjectString.split(separator, limit);\n}","/**\n * Checks whether `subject` contains substring at specific `index`.\n *\n * @ignore\n * @param {string} subject The subject to search in.\n * @param {string} substring The substring to search/\n * @param {number} index The index to search substring.\n * @param {boolean} lookBehind Whether to look behind (true) or ahead (false).\n * @return {boolean} Returns a boolean whether the substring exists.\n */\nexport default function hasSubstringAtIndex(subject, substring, index, lookBehind = true) {\n let indexOffset = 0;\n if (lookBehind) {\n indexOffset = - substring.length + 1;\n }\n const extractedSubstring = subject.substr(index + indexOffset, substring.length);\n return extractedSubstring.toLowerCase() === substring;\n}","import { REGEXP_TAG_LIST } from 'helper/reg_exp/const';\n\n/**\n * Parses the tags from the string '...'.\n *\n * @ignore\n * @param {string} tags The string that contains the tags.\n * @return {string[]} Returns the array of tag names.\n */\nexport default function parseTagList(tags) {\n const tagsList = [];\n let match;\n while ((match = REGEXP_TAG_LIST.exec(tags)) !== null) {\n tagsList.push(match[1]);\n }\n return tagsList;\n}","import { REGEXP_WHITESPACE } from 'helper/reg_exp/const';\n\nconst STATE_START_TAG = 0;\nconst STATE_NON_WHITESPACE = 1;\nconst STATE_DONE = 2;\n\n/**\n * Parses the tag name from html content\n *\n * @param {string} tagContent The tag content\n * @return {string} Returns the tag name\n */\nexport default function parseTagName(tagContent) {\n let state = STATE_START_TAG;\n let tagName = '';\n let index = 0;\n while (state !== STATE_DONE) {\n const char = tagContent[index++].toLowerCase();\n switch (char) {\n case '<':\n break;\n case '>':\n state = STATE_DONE;\n break;\n default:\n if (REGEXP_WHITESPACE.test(char)) {\n if (state === STATE_NON_WHITESPACE) {\n state = STATE_DONE;\n }\n } else {\n if (state === STATE_START_TAG) {\n state = STATE_NON_WHITESPACE;\n }\n if (char !== '/') {\n tagName += char;\n }\n }\n break;\n }\n }\n return tagName;\n}","import coerceToString from 'helper/string/coerce_to_string';\nimport hasSubstringAtIndex from 'helper/string/has_substring_at_index';\nimport parseTagList from 'helper/strip/parse_tag_list';\nimport parseTagName from 'helper/strip/parse_tag_name';\n\nconst STATE_OUTPUT = 0;\nconst STATE_HTML = 1;\nconst STATE_EXCLAMATION = 2;\nconst STATE_COMMENT = 3;\n\n/**\n * Strips subject tags from `subject`.\n *\n * @function stripTags\n * @static\n * @since 1.1.0\n * @memberOf Strip\n * @param {string} [subject=''] The string to strip from.\n * @param {string|Array} [allowableTags] The string `''` or array `['tag1', 'tag2']` of tags that should not be stripped.\n * @param {string} [replacement=''] The string to replace the stripped tag.\n * @return {string} Returns the stripped string.\n * @example\n *\n * v.stripTags('Summer is nice');\n * // => 'Summer is nice'\n *\n * v.stripTags('Winter is cold', ['b', 'i']);\n * // => 'Winter is cold'\n *\n * v.stripTags('Sun
set', '', '-');\n * // => 'Sun-set'\n */\nexport default function trim(subject, allowableTags, replacement) {\n subject = coerceToString(subject);\n if (subject === '') {\n return '';\n }\n if (!Array.isArray(allowableTags)) {\n const allowableTagsString = coerceToString(allowableTags);\n allowableTags = allowableTagsString === '' ? [] : parseTagList(allowableTagsString);\n }\n const replacementString = coerceToString(replacement);\n const length = subject.length;\n const hasAllowableTags = allowableTags.length > 0;\n const hasSubstring = hasSubstringAtIndex.bind(null, subject);\n let state = STATE_OUTPUT;\n let depth = 0;\n let output = '';\n let tagContent = '';\n let quote = null;\n for (let index = 0; index < length; index++) {\n const char = subject[index];\n let advance = false;\n switch (char) {\n case '<':\n if (quote) {\n break;\n }\n if (hasSubstring('< ', index, false)) {\n advance = true;\n break;\n }\n if (state === STATE_OUTPUT) {\n advance = true;\n state = STATE_HTML;\n break;\n }\n if (state === STATE_HTML) {\n depth++;\n break;\n }\n advance = true;\n break;\n case '!':\n if (state === STATE_HTML && hasSubstring('':\n if (depth > 0) {\n depth--;\n break;\n }\n if (quote) {\n break;\n }\n if (state === STATE_HTML) {\n quote = null;\n state = STATE_OUTPUT;\n if (hasAllowableTags) {\n tagContent += '>';\n const tagName = parseTagName(tagContent);\n if (allowableTags.indexOf(tagName.toLowerCase()) !== -1) {\n output += tagContent;\n } else {\n output += replacementString;\n }\n tagContent = '';\n } else {\n output += replacementString;\n }\n break;\n }\n if (state === STATE_EXCLAMATION || state === STATE_COMMENT && hasSubstring('-->', index)) {\n quote = null;\n state = STATE_OUTPUT;\n tagContent = '';\n break;\n }\n advance = true;\n break;\n default:\n advance = true;\n }\n if (advance) {\n switch (state) {\n case STATE_OUTPUT:\n output += char;\n break;\n case STATE_HTML:\n if (hasAllowableTags) {\n tagContent += char;\n }\n break;\n }\n }\n }\n\n return output;\n}","let globalObject = null;\n\nfunction getGlobalObject() {\n if (globalObject !== null) {\n return globalObject;\n }\n /* istanbul ignore next */\n // It's hard to mock the global variables. This code surely works fine. I hope :)\n if (typeof global === 'object' && global.Object === Object) {\n // NodeJS global object\n globalObject = global;\n } else if (typeof self === 'object' && self.Object === Object) {\n // self property from Window object\n globalObject = self;\n } else {\n // Other cases. Function constructor always has the context as global object\n globalObject = new Function('return this')();\n }\n return globalObject;\n}\n\nexport default getGlobalObject;","import getGlobalObject from 'helper/object/get_global';\n\nconst globalObject = getGlobalObject();\nconst previousV = globalObject.v;\n\n/**\n * Restores `v` variable to previous value and returns Voca library instance.\n *\n * @function noConflict\n * @static\n * @since 1.0.0\n * @memberOf Util\n * @return {Object} Returns Voca library instance.\n * @example\n * var voca = v.noConflict();\n * voca.isAlpha('Hello');\n * // => true\n */\nexport default function noConflict() {\n if (this === globalObject.v) {\n globalObject.v = previousV;\n }\n return this;\n}\n","import functions from 'functions';\n\n\n/**\n * The chain wrapper constructor.\n *\n * @ignore\n * @param {string} subject The string to be wrapped.\n * @param {boolean} [explicitChain=false] A boolean that indicates if the chain sequence is explicit or implicit.\n * @return {ChainWrapper} Returns a new instance of `ChainWrapper`\n * @constructor\n */\nfunction ChainWrapper(subject, explicitChain) {\n this._wrappedValue = subject;\n this._explicitChain = explicitChain;\n}\n\n/**\n * Unwraps the chain sequence wrapped value.\n *\n * @memberof Chain\n * @since 1.0.0\n * @function __proto__value\n * @return {*} Returns the unwrapped value.\n * @example\n * v\n * .chain('Hello world')\n * .replace('Hello', 'Hi')\n * .lowerCase()\n * .slugify()\n * .value()\n * // => 'hi-world'\n *\n * v(' Space travel ')\n * .trim()\n * .truncate(8)\n * .value()\n * // => 'Space...'\n */\nChainWrapper.prototype.value = function() {\n return this._wrappedValue;\n};\n\n/**\n * Override the default object valueOf().\n *\n * @ignore\n * @return {*} Returns the wrapped value.\n */\nChainWrapper.prototype.valueOf = function() {\n return this.value();\n};\n\n/**\n * Returns the wrapped value to be used in JSON.stringify().\n *\n * @ignore\n * @return {*} Returns the wrapped value.\n */\nChainWrapper.prototype.toJSON = function() {\n return this.value();\n};\n\n/**\n * Returns the string representation of the wrapped value.\n *\n * @ignore\n * @return {string} Returns the string representation.\n */\nChainWrapper.prototype.toString = function() {\n return String(this.value());\n};\n\n/**\n * Creates a new chain object that enables explicit chain sequences.\n * Use `v.prototype.value()` to unwrap the result.
\n * Does not modify the wrapped value.\n *\n * @memberof Chain\n * @since 1.0.0\n * @function __proto__chain\n * @return {Object} Returns the wrapper in explicit mode.\n * @example\n * v('Back to School')\n * .chain()\n * .lowerCase()\n * .words()\n * .value()\n * // => ['back', 'to', 'school']\n *\n * v(\" Back to School \")\n * .chain()\n * .trim()\n * .truncate(7)\n * .value()\n * // => 'Back...'\n */\nChainWrapper.prototype.chain = function() {\n return new ChainWrapper(this._wrappedValue, true);\n};\n\n/**\n * Modifies the wrapped value with the invocation result of `changer` function. The current wrapped value is the\n * argument of `changer` invocation.\n *\n * @memberof Chain\n * @since 1.0.0\n * @function __proto__thru\n * @param {Function} changer The function to invoke.\n * @return {Object} Returns the new wrapper that wraps the invocation result of `changer`.\n * @example\n * v\n * .chain('sun is shining')\n * .words()\n * .thru(function(words) {\n * return words[0];\n * })\n * .value()\n * // => 'sun'\n *\n */\nChainWrapper.prototype.thru = function(changer) {\n if (typeof changer === 'function') {\n return new ChainWrapper(changer(this._wrappedValue), this._explicitChain);\n }\n return this;\n};\n\n/**\n * A boolean that indicates if the chain sequence is explicit or implicit.\n * @ignore\n * @type {boolean}\n * @private\n */\nChainWrapper.prototype._explicitChain = true;\n\n/**\n * Make a voca function chainable.\n *\n * @ignore\n * @param {Function} functionInstance The function to make chainable\n * @return {Function} Returns the chainable function\n */\nfunction makeFunctionChainable(functionInstance) {\n return function(...args) {\n const result = functionInstance(this._wrappedValue, ...args);\n if (this._explicitChain || typeof result === 'string') {\n return new ChainWrapper(result, this._explicitChain);\n } else {\n return result;\n }\n };\n}\n\nObject.keys(functions).forEach(function(name) {\n ChainWrapper.prototype[name] = makeFunctionChainable(functions[name]);\n});\n\n\nexport default ChainWrapper;","import ChainWrapper from 'chain/wrapper';\n\n/**\n * Creates a chain object that wraps `subject`, enabling explicit chain sequences.
\n * Use `v.prototype.value()` to unwrap the result.\n *\n * @memberOf Chain\n * @since 1.0.0\n * @function chain\n * @param {string} subject The string to wrap.\n * @return {Object} Returns the new wrapper object.\n * @example\n * v\n * .chain('Back to School')\n * .lowerCase()\n * .words()\n * .value()\n * // => ['back', 'to', 'school']\n */\nexport default function chain(subject) {\n return new ChainWrapper(subject, true);\n}","import chain from './chain/chain'; // include chain here to resolve af circular reference\nimport ChainWrapper from './chain/wrapper';\nimport functions from './functions';\n\n/**\n * Creates a chain object that wraps `subject`, enabling implicit chain sequences.
\n * A function that returns `number`, `boolean` or `array` type terminates the chain sequence and returns the unwrapped value.\n * Otherwise use `v.prototype.value()` to unwrap the result.\n *\n * @memberOf Chain\n * @since 1.0.0\n * @function v\n * @param {string} subject The string to wrap.\n * @return {Object} Returns the new wrapper object.\n * @example\n * v('Back to School')\n * .lowerCase()\n * .words()\n * // => ['back', 'to', 'school']\n *\n * v(\" Back to School \")\n * .trim()\n * .truncate(7)\n * .value()\n * // => 'Back...'\n */\nfunction Voca(subject) {\n return new ChainWrapper(subject, false);\n}\n\nObject.assign(Voca, functions, {\n chain: chain\n});\n\nexport default Voca;","/**\n * A regular expression string matching digits\n *\n * @type {string}\n * @ignore\n */\nexport const digit = '\\\\d';\n\n/**\n * A regular expression string matching whitespace\n *\n * @type {string}\n * @ignore\n */\nexport const whitespace = '\\\\s\\\\uFEFF\\\\xA0';\n\n/**\n * A regular expression string matching high surrogate\n *\n * @type {string}\n * @ignore\n */\nexport const highSurrogate = '\\\\uD800-\\\\uDBFF';\n\n/**\n * A regular expression string matching low surrogate\n *\n * @type {string}\n * @ignore\n */\nexport const lowSurrogate = '\\\\uDC00-\\\\uDFFF';\n\n/**\n * A regular expression string matching diacritical mark\n *\n * @type {string}\n * @ignore\n */\nexport const diacriticalMark = '\\\\u0300-\\\\u036F\\\\u1AB0-\\\\u1AFF\\\\u1DC0-\\\\u1DFF\\\\u20D0-\\\\u20FF\\\\uFE20-\\\\uFE2F';\n\n/**\n * A regular expression to match the base character for a combining mark\n *\n * @type {string}\n * @ignore\n */\nexport const base = '\\\\0-\\\\u02FF\\\\u0370-\\\\u1AAF\\\\u1B00-\\\\u1DBF\\\\u1E00-\\\\u20CF\\\\u2100-\\\\uD7FF\\\\uE000-\\\\uFE1F\\\\uFE30-\\\\uFFFF';\n\n/**\n * Regular expression to match combining marks\n *\n * @see http://unicode.org/faq/char_combmark.html\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_COMBINING_MARKS = new RegExp('([' + base + ']|[' + highSurrogate + '][' + lowSurrogate + ']|[' + highSurrogate + '](?![' + lowSurrogate + '])|(?:[^' + highSurrogate + ']|^)[' + lowSurrogate + '])([' + diacriticalMark + ']+)', 'g');\n\n/**\n * Regular expression to match surrogate pairs\n *\n * @see http://www.unicode.org/faq/utf_bom.html#utf16-2\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_SURROGATE_PAIRS = new RegExp('([' + highSurrogate + '])([' + lowSurrogate + '])', 'g');\n\n/**\n * Regular expression to match an unicode character\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_UNICODE_CHARACTER = new RegExp(\n'((?:[' + base + ']|[' + highSurrogate + '][' + lowSurrogate + ']|[' + highSurrogate + '](?![' + lowSurrogate + '])|(?:[^' + highSurrogate + ']|^)[' + lowSurrogate + '])(?:[' + diacriticalMark + ']+))|\\\n([' + highSurrogate + '][' + lowSurrogate + '])|\\\n([\\\\n\\\\r\\\\u2028\\\\u2029])|\\\n(.)', 'g');\n\n/**\n * Regular expression to match whitespaces\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_WHITESPACE = new RegExp('[' + whitespace + ']');\n\n/**\n * Regular expression to match whitespaces from the left side\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_TRIM_LEFT = new RegExp('^[' + whitespace + ']+');\n\n/**\n * Regular expression to match whitespaces from the right side\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_TRIM_RIGHT = new RegExp('[' + whitespace + ']+$');\n\n/**\n * Regular expression to match digit characters\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_DIGIT = new RegExp('^' + digit + '+$');\n\n/**\n * Regular expression to match regular expression special characters\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_SPECIAL_CHARACTERS = /[-[\\]{}()*+!<=:?.\\/\\\\^$|#,]/g;\n\n/**\n * Regular expression to match not latin characters\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_NON_LATIN = /[^A-Za-z0-9]/g;\n\n/**\n * Regular expression to match HTML special characters.\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_HTML_SPECIAL_CHARACTERS = /[<>&\"'`]/g;\n\n/**\n * Regular expression to match sprintf format string\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_CONVERSION_SPECIFICATION = /(%{1,2})(?:(\\d+)\\$)?(\\+)?([ 0]|'.{1})?(-)?(\\d+)?(?:\\.(\\d+))?([bcdiouxXeEfgGs])?/g;\n\n/**\n * Regular expression to match trailing zeros in a number\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_TRAILING_ZEROS = /\\.?0+$/g;\n\n/**\n * Regular expression to match flags from a regular expression.\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_FLAGS = /[gimuy]*$/;\n\n/**\n * Regular expression to match a list of tags.\n *\n * @see https://html.spec.whatwg.org/multipage/syntax.html#syntax-tag-name\n * @type {RegExp}\n * @ignore\n */\n\nexport const REGEXP_TAG_LIST = /<([A-Za-z0-9]+)>/g;","import { diacriticalMark, digit, whitespace } from 'helper/reg_exp/const';\n\n/**\n * A regular expression to match the General Punctuation Unicode block\n *\n * @type {string}\n * @ignore\n */\nconst generalPunctuationBlock = '\\\\u2000-\\\\u206F';\n\n/**\n * A regular expression to match non characters from from Basic Latin and Latin-1 Supplement Unicode blocks\n *\n * @type {string}\n * @ignore\n */\nconst nonCharacter = '\\\\x00-\\\\x2F\\\\x3A-\\\\x40\\\\x5B-\\\\x60\\\\x7b-\\\\xBF\\\\xD7\\\\xF7';\n\n/**\n * A regular expression to match the dingbat Unicode block\n *\n * @type {string}\n * @ignore\n */\nconst dingbatBlock = '\\\\u2700-\\\\u27BF';\n\n/**\n * A regular expression string that matches lower case letters: LATIN\n *\n * @type {string}\n * @ignore\n */\nconst lowerCaseLetter = 'a-z\\\\xB5\\\\xDF-\\\\xF6\\\\xF8-\\\\xFF\\\\u0101\\\\u0103\\\\u0105\\\\u0107\\\\u0109\\\\u010B\\\\u010D\\\\u010F\\\\u0111\\\\u0113\\\\u0115\\\\u0117\\\\u0119\\\\u011B\\\\u011D\\\\u011F\\\\u0121\\\\u0123\\\\u0125\\\\u0127\\\\u0129\\\\u012B\\\\u012D\\\\u012F\\\\u0131\\\\u0133\\\\u0135\\\\u0137\\\\u0138\\\\u013A\\\\u013C\\\\u013E\\\\u0140\\\\u0142\\\\u0144\\\\u0146\\\\u0148\\\\u0149\\\\u014B\\\\u014D\\\\u014F\\\\u0151\\\\u0153\\\\u0155\\\\u0157\\\\u0159\\\\u015B\\\\u015D\\\\u015F\\\\u0161\\\\u0163\\\\u0165\\\\u0167\\\\u0169\\\\u016B\\\\u016D\\\\u016F\\\\u0171\\\\u0173\\\\u0175\\\\u0177\\\\u017A\\\\u017C\\\\u017E-\\\\u0180\\\\u0183\\\\u0185\\\\u0188\\\\u018C\\\\u018D\\\\u0192\\\\u0195\\\\u0199-\\\\u019B\\\\u019E\\\\u01A1\\\\u01A3\\\\u01A5\\\\u01A8\\\\u01AA\\\\u01AB\\\\u01AD\\\\u01B0\\\\u01B4\\\\u01B6\\\\u01B9\\\\u01BA\\\\u01BD-\\\\u01BF\\\\u01C6\\\\u01C9\\\\u01CC\\\\u01CE\\\\u01D0\\\\u01D2\\\\u01D4\\\\u01D6\\\\u01D8\\\\u01DA\\\\u01DC\\\\u01DD\\\\u01DF\\\\u01E1\\\\u01E3\\\\u01E5\\\\u01E7\\\\u01E9\\\\u01EB\\\\u01ED\\\\u01EF\\\\u01F0\\\\u01F3\\\\u01F5\\\\u01F9\\\\u01FB\\\\u01FD\\\\u01FF\\\\u0201\\\\u0203\\\\u0205\\\\u0207\\\\u0209\\\\u020B\\\\u020D\\\\u020F\\\\u0211\\\\u0213\\\\u0215\\\\u0217\\\\u0219\\\\u021B\\\\u021D\\\\u021F\\\\u0221\\\\u0223\\\\u0225\\\\u0227\\\\u0229\\\\u022B\\\\u022D\\\\u022F\\\\u0231\\\\u0233-\\\\u0239\\\\u023C\\\\u023F\\\\u0240\\\\u0242\\\\u0247\\\\u0249\\\\u024B\\\\u024D\\\\u024F';\n\n/**\n * A regular expression string that matches upper case letters: LATIN\n *\n * @type {string}\n * @ignore\n */\nconst upperCaseLetter = '\\\\x41-\\\\x5a\\\\xc0-\\\\xd6\\\\xd8-\\\\xde\\\\u0100\\\\u0102\\\\u0104\\\\u0106\\\\u0108\\\\u010a\\\\u010c\\\\u010e\\\\u0110\\\\u0112\\\\u0114\\\\u0116\\\\u0118\\\\u011a\\\\u011c\\\\u011e\\\\u0120\\\\u0122\\\\u0124\\\\u0126\\\\u0128\\\\u012a\\\\u012c\\\\u012e\\\\u0130\\\\u0132\\\\u0134\\\\u0136\\\\u0139\\\\u013b\\\\u013d\\\\u013f\\\\u0141\\\\u0143\\\\u0145\\\\u0147\\\\u014a\\\\u014c\\\\u014e\\\\u0150\\\\u0152\\\\u0154\\\\u0156\\\\u0158\\\\u015a\\\\u015c\\\\u015e\\\\u0160\\\\u0162\\\\u0164\\\\u0166\\\\u0168\\\\u016a\\\\u016c\\\\u016e\\\\u0170\\\\u0172\\\\u0174\\\\u0176\\\\u0178\\\\u0179\\\\u017b\\\\u017d\\\\u0181\\\\u0182\\\\u0184\\\\u0186\\\\u0187\\\\u0189-\\\\u018b\\\\u018e-\\\\u0191\\\\u0193\\\\u0194\\\\u0196-\\\\u0198\\\\u019c\\\\u019d\\\\u019f\\\\u01a0\\\\u01a2\\\\u01a4\\\\u01a6\\\\u01a7\\\\u01a9\\\\u01ac\\\\u01ae\\\\u01af\\\\u01b1-\\\\u01b3\\\\u01b5\\\\u01b7\\\\u01b8\\\\u01bc\\\\u01c4\\\\u01c5\\\\u01c7\\\\u01c8\\\\u01ca\\\\u01cb\\\\u01cd\\\\u01cf\\\\u01d1\\\\u01d3\\\\u01d5\\\\u01d7\\\\u01d9\\\\u01db\\\\u01de\\\\u01e0\\\\u01e2\\\\u01e4\\\\u01e6\\\\u01e8\\\\u01ea\\\\u01ec\\\\u01ee\\\\u01f1\\\\u01f2\\\\u01f4\\\\u01f6-\\\\u01f8\\\\u01fa\\\\u01fc\\\\u01fe\\\\u0200\\\\u0202\\\\u0204\\\\u0206\\\\u0208\\\\u020a\\\\u020c\\\\u020e\\\\u0210\\\\u0212\\\\u0214\\\\u0216\\\\u0218\\\\u021a\\\\u021c\\\\u021e\\\\u0220\\\\u0222\\\\u0224\\\\u0226\\\\u0228\\\\u022a\\\\u022c\\\\u022e\\\\u0230\\\\u0232\\\\u023a\\\\u023b\\\\u023d\\\\u023e\\\\u0241\\\\u0243-\\\\u0246\\\\u0248\\\\u024a\\\\u024c\\\\u024e';\n\n\n/**\n * Regular expression to match Unicode words\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_WORD = new RegExp(\n '(?:[' + upperCaseLetter + '][' + diacriticalMark + ']*)?(?:[' + lowerCaseLetter + '][' + diacriticalMark + ']*)+|\\\n(?:[' + upperCaseLetter + '][' + diacriticalMark + ']*)+(?![' + lowerCaseLetter + '])|\\\n[' + digit + ']+|\\\n[' + dingbatBlock + ']|\\\n[^' + nonCharacter + generalPunctuationBlock + whitespace + ']+', 'g');\n\n/**\n * Regular expression to match words from Basic Latin and Latin-1 Supplement blocks\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_LATIN_WORD = /[A-Z\\xC0-\\xD6\\xD8-\\xDE]?[a-z\\xDF-\\xF6\\xF8-\\xFF]+|[A-Z\\xC0-\\xD6\\xD8-\\xDE]+(?![a-z\\xDF-\\xF6\\xF8-\\xFF])|\\d+/g;\n\n/**\n * Regular expression to match alpha characters\n *\n * @see http://stackoverflow.com/a/22075070/1894471\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_ALPHA = new RegExp('^(?:[' + lowerCaseLetter + upperCaseLetter + '][' + diacriticalMark + ']*)+$');\n\n/**\n * Regular expression to match alpha and digit characters\n *\n * @see http://stackoverflow.com/a/22075070/1894471\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_ALPHA_DIGIT = new RegExp('^((?:[' + lowerCaseLetter + upperCaseLetter + '][' + diacriticalMark + ']*)|[' + digit + '])+$');\n\n/**\n * Regular expression to match Extended ASCII characters, i.e. the first 255\n *\n * @type {RegExp}\n * @ignore\n */\nexport const REGEXP_EXTENDED_ASCII = /^[\\x00-\\xFF]*$/;","/**\n * Max save integer value\n *\n * @ignore\n * @type {number}\n */\nexport const MAX_SAFE_INTEGER = 0x1fffffffffffff;","export default Object.freeze({\n // Type specifiers\n TYPE_INTEGER : 'i',\n TYPE_INTEGER_BINARY : 'b',\n TYPE_INTEGER_ASCII_CHARACTER : 'c',\n TYPE_INTEGER_DECIMAL : 'd',\n TYPE_INTEGER_OCTAL : 'o',\n TYPE_INTEGER_UNSIGNED_DECIMAL : 'u',\n TYPE_INTEGER_HEXADECIMAL : 'x',\n TYPE_INTEGER_HEXADECIMAL_UPPERCASE : 'X',\n TYPE_FLOAT_SCIENTIFIC : 'e',\n TYPE_FLOAT_SCIENTIFIC_UPPERCASE : 'E',\n TYPE_FLOAT : 'f',\n TYPE_FLOAT_SHORT : 'g',\n TYPE_FLOAT_SHORT_UPPERCASE : 'G',\n TYPE_STRING : 's',\n\n // Simple literals\n LITERAL_PERCENT : '%',\n LITERAL_SINGLE_QUOTE : \"'\",\n LITERAL_PLUS : '+',\n LITERAL_MINUS : '-',\n LITERAL_PERCENT_SPECIFIER : '%%',\n\n // Radix constants to format numbers\n RADIX_BINARY : 2,\n RADIX_OCTAL : 8,\n RADIX_DECIMAL : 10,\n RADIX_HEXADECIMAL : 16\n});","/**\n * A property that contains the library semantic version number.\n * @name version\n * @static\n * @since 1.0.0\n * @memberOf Util\n * @type string\n * @example\n * v.version\n * // => '1.1.0'\n */\nconst version = '1.1.0';\n\nexport default version;"],"names":["isNil","value","undefined","coerceToBoolean","defaultValue","Boolean","isString","subject","coerceToString","String","capitalize","restToLower","subjectString","restToLowerCaseBoolean","toLowerCase","substr","toUpperCase","lowerCase","nilDefault","toString","words","pattern","flags","patternRegExp","REGEXP_EXTENDED_ASCII","test","REGEXP_LATIN_WORD","REGEXP_WORD","RegExp","flagsString","match","wordToCamel","word","index","camelCase","map","join","decapitalize","kebabCase","snakeCase","upperCase","clipNumber","downLimit","upLimit","toInteger","Infinity","MAX_SAFE_INTEGER","truncate","length","end","lengthInt","endString","charAt","position","isHighSurrogate","codePoint","HIGH_SURROGATE_START","HIGH_SURROGATE_END","isLowSurrogate","LOW_SURROGATE_START","LOW_SURROGATE_END","getAstralNumberFromSurrogatePair","highSurrogate","lowSurrogate","coerceToNumber","Number","nanDefault","codePointAt","subjectStringLength","positionNumber","firstCodePoint","charCodeAt","secondCodePoint","first","graphemeAt","graphemeMatch","graphemeMatchIndex","REGEXP_UNICODE_CHARACTER","exec","lastIndex","last","prune","truncatedLength","replace","offset","wordInsertLength","slice","start","substring","count","countGrapheme","REGEXP_COMBINING_MARKS","REGEXP_SURROGATE_PAIRS","countSubstrings","substringString","substringLength","matchIndex","indexOf","countWhere","predicate","context","predicateWithContext","bind","reduce","call","countTruthy","character","countWords","ReplacementIndex","repeat","times","timesInt","repeatString","buildPadding","padCharacters","padStringRepeat","padStringRest","padLeft","pad","padString","padRight","alignAndPad","conversion","width","padType","alignmentSpecifier","Const","LITERAL_MINUS","getPaddingCharacter","addSignToFormattedNumber","replacementNumber","formattedReplacement","signSpecifier","LITERAL_PLUS","float","replacement","parseFloat","isNaN","precision","typeSpecifier","TYPE_FLOAT","toFixed","TYPE_FLOAT_SCIENTIFIC","toExponential","TYPE_FLOAT_SCIENTIFIC_UPPERCASE","TYPE_FLOAT_SHORT","TYPE_FLOAT_SHORT_UPPERCASE","formatFloatAsShort","nonZeroPrecision","toPrecision","REGEXP_TRAILING_ZEROS","integerBase","integer","parseInt","TYPE_INTEGER_ASCII_CHARACTER","fromCharCode","TYPE_INTEGER_BINARY","RADIX_BINARY","TYPE_INTEGER_OCTAL","RADIX_OCTAL","TYPE_INTEGER_HEXADECIMAL","RADIX_HEXADECIMAL","TYPE_INTEGER_HEXADECIMAL_UPPERCASE","integerDecimal","stringFormat","compute","formatFunction","TYPE_STRING","formatString","TYPE_INTEGER_DECIMAL","TYPE_INTEGER","formatIntegerDecimal","TYPE_INTEGER_UNSIGNED_DECIMAL","formatIntegerBase","formatFloat","formattedString","ConversionSpecification","properties","percent","paddingSpecifier","validate","replacementsLength","Error","replacementIndex","replacements","conversionSpecification","widthSpecifier","precisionSpecifier","isPercentLiteral","actualReplacementIndex","getIndexByPosition","incrementOnEmptyPosition","computeReplacement","sprintf","format","boundReplacementMatch","replacementMatch","REGEXP_CONVERSION_SPECIFICATION","vprintf","replaceSpecialCharacter","escapeCharactersMap","escapeHtml","REGEXP_HTML_SPECIAL_CHARACTERS","escapeRegExp","REGEXP_SPECIAL_CHARACTERS","reduceUnescapedString","string","key","unescapeCharactersMap","unescapeHtml","characters","search","fromIndex","lastIndexOf","fromIndexNumber","insert","toInsert","toInsertString","getDiacriticsMap","diacriticsMap","keys","diacritics","forEach","getLatinCharacter","characterWithoutDiacritic","removeCombiningMarks","cleanCharacter","latinise","REGEXP_NON_LATIN","paddingLength","paddingSideLength","paddingSideRemainingLength","getRegExpFlags","regExp","REGEXP_FLAGS","includes","searchString","appendFlagToRegExp","appendFlag","regularExpressionFlags","source","replaceAll","global","appendFlagToRegularExpression","reverse","split","reverseGrapheme","$0","$1","$2","reversedString","slugify","cleanSubjectString","splice","deleteCount","toAdd","toAddString","startPosition","deleteCountNumber","trimLeft","whitespace","whitespaceString","REGEXP_TRIM_LEFT","whitespaceLength","matchWhitespace","totalWhitespaceLength","trimRight","REGEXP_TRIM_RIGHT","subjectLength","trim","determineOptions","options","OPTION_WIDTH","OPTION_NEW_LINE","OPTION_INDENT","OPTION_CUT","wordWrap","newLine","indent","cut","wrappedLine","spaceToWrapAt","endsWith","isAlpha","REGEXP_ALPHA","isAlphaDigit","REGEXP_ALPHA_DIGIT","isBlank","isDigit","REGEXP_DIGIT","isEmpty","isLowerCase","valueString","isNumeric","valueNumeric","isUpperCase","matches","patternString","startsWith","startString","chars","codePoints","codePointArray","codePointNumber","push","graphemes","separator","limit","hasSubstringAtIndex","lookBehind","indexOffset","extractedSubstring","parseTagList","tags","tagsList","REGEXP_TAG_LIST","parseTagName","tagContent","state","STATE_START_TAG","tagName","STATE_DONE","char","REGEXP_WHITESPACE","STATE_NON_WHITESPACE","allowableTags","Array","isArray","allowableTagsString","replacementString","hasAllowableTags","hasSubstring","STATE_OUTPUT","depth","output","quote","advance","STATE_HTML","STATE_EXCLAMATION","STATE_COMMENT","getGlobalObject","globalObject","Object","self","Function","noConflict","this","v","previousV","ChainWrapper","explicitChain","_wrappedValue","_explicitChain","makeFunctionChainable","functionInstance","args","result","chain","Voca","digit","diacriticalMark","base","generalPunctuationBlock","nonCharacter","dingbatBlock","lowerCaseLetter","upperCaseLetter","prototype","increment","freeze","LITERAL_PERCENT_SPECIFIER","paddingCharacter","LITERAL_SINGLE_QUOTE","version","valueOf","toJSON","thru","changer","functions","name","_extends"],"mappings":"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AM3K,SACC,WACA,WACA,YACA,aACA,aACA,UEPDQ,QACC,oCACA,oCACA,qCACA,sCACA,6BACA,0BAEDE,GAAaoI,OAAO1H,KAAKZ,IKHzBa,MACC,OACA,OACA,0CACA,gBACA,kBACA,sBACA,uCACA,aACA,uBACA,sBACA,8BACA,WACA,qBACA,yBACA,eACA,uBACA,mDACA,iBACA,WACA,wBACA,wBACA,sBACA,yCACA,cACA,iBACA,WACA,wBACA,qBACA,2CACA,gBACA,mBACA,sBACA,wCACA,aACA,uBACA,uBACA,+BACA,YACA,qBACA,0BACA,eACA,wBACA,mDACA,iBACA,WACA,wBACA,0BACA,uBACA,yCACA,cACA,kBACA,WACA,0BACA,sBACC,QACA,QACA,SACA,SACA,OACA,OACA,OACA,QACA,QACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACF,QACE,OACA,OACA,OACA,OACA,QACA,OACA,OACA,OACA,OACA,KAGJF,GAAgB,KenHdqD,GAAe,QACfC,GAAkB,UAClBC,GAAgB,SAChBC,GAAa,MkBLb4C,GAAkB,EAClBK,GAAuB,EACvBH,GAAa,ECCbW,GAAe,EACfK,GAAa,EACbC,GAAoB,EACpBC,GAAgB,ECRlBE,GAAe,KCEbA,GAAeD,KACfQ,GAAYP,GAAaM,EQQzB0B,GAAU,qyBP4BhBxB,IAAakB,UAAU9W,MAAQ,iBACtByV,MAAKK,eASdF,GAAakB,UAAUO,QAAU,iBACxB5B,MAAKzV,SASd4V,GAAakB,UAAUQ,OAAS,iBACvB7B,MAAKzV,SASd4V,GAAakB,UAAU5V,SAAW,iBACzBV,QAAOiV,KAAKzV,UA2BrB4V,GAAakB,UAAUV,MAAQ,iBACtB,IAAIR,IAAaH,KAAKK,eAAe,IAuB9CF,GAAakB,UAAUS,KAAO,SAASC,SACd,kBAAZA,GACF,GAAI5B,IAAa4B,EAAQ/B,KAAKK,eAAgBL,KAAKM,gBAErDN,MASTG,GAAakB,UAAUf,gBAAiB,EAoBxCV,OAAO1H,KAAK8J,IAAW5J,QAAQ,SAAS6J,MACzBZ,UAAUY,GAAQ1B,GAAsByB,GAAUC,qLE7HjEC,IAActB,GAAMoB,UACXrB"} \ No newline at end of file diff --git a/jsdoc/template/tmpl/introduction.tmpl b/jsdoc/template/tmpl/introduction.tmpl index 18200ee..420d8ee 100644 --- a/jsdoc/template/tmpl/introduction.tmpl +++ b/jsdoc/template/tmpl/introduction.tmpl @@ -117,11 +117,11 @@ slugify('caffé latté'); // => 'caffe-latte' diff --git a/jsdoc/template/tmpl/layout.tmpl b/jsdoc/template/tmpl/layout.tmpl index dd59686..ddcac0c 100644 --- a/jsdoc/template/tmpl/layout.tmpl +++ b/jsdoc/template/tmpl/layout.tmpl @@ -69,7 +69,7 @@ - v1.0.0 + v1.1.0 diff --git a/package.json b/package.json index 393df2a..ca0cd91 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "voca", - "version": "1.0.0", + "version": "1.1.0", "description": "The ultimate JavaScript string library", "homepage": "https://vocajs.com", "author": { diff --git a/src/util/version.js b/src/util/version.js index fe68687..a8c690d 100644 --- a/src/util/version.js +++ b/src/util/version.js @@ -7,8 +7,8 @@ * @type string * @example * v.version - * // => '1.0.0' + * // => '1.1.0' */ -const version = '1.0.0'; +const version = '1.1.0'; export default version; \ No newline at end of file diff --git a/test_runner/test_bundle.js b/test_runner/test_bundle.js index 31e9940..5f70f74 100644 --- a/test_runner/test_bundle.js +++ b/test_runner/test_bundle.js @@ -3273,7 +3273,6 @@ function parseTagName(tagContent) { return tagName; } -/* eslint-disable */ var STATE_OUTPUT = 0; var STATE_HTML = 1; var STATE_EXCLAMATION = 2; @@ -3286,16 +3285,20 @@ var STATE_COMMENT = 3; * @static * @since 1.1.0 * @memberOf Strip - * @param {string} [subject=''] The string to strip. - * @param {string|Array} [allowableTags] The string or array of tags that should not be stripped. + * @param {string} [subject=''] The string to strip from. + * @param {string|Array} [allowableTags] The string `''` or array `['tag1', 'tag2']` of tags that should not be stripped. * @param {string} [replacement=''] The string to replace the stripped tag. * @return {string} Returns the stripped string. * @example - * v.trim(' Mother nature '); - * // => 'Mother nature' * - * v.trim('--Earth--', '-'); - * // => 'Earth' + * v.stripTags('Summer is nice'); + * // => 'Summer is nice' + * + * v.stripTags('Winter is cold', ['b', 'i']); + * // => 'Winter is cold' + * + * v.stripTags('Sun
set', '', '-'); + * // => 'Sun-set' */ function trim$1(subject, allowableTags, replacement) { subject = coerceToString(subject); @@ -3387,10 +3390,12 @@ function trim$1(subject, allowableTags, replacement) { var tagName = parseTagName(tagContent); if (allowableTags.indexOf(tagName.toLowerCase()) !== -1) { output += tagContent; + } else { + output += replacementString; } tagContent = ''; } else { - tagContent += replacementString; + output += replacementString; } break; } @@ -3456,7 +3461,7 @@ var previousV = globalObject.v; * @return {Object} Returns Voca library instance. * @example * var voca = v.noConflict(); - * voca.isAlhpa('Hello'); + * voca.isAlpha('Hello'); * // => true */ function noConflict() { @@ -3475,9 +3480,9 @@ function noConflict() { * @type string * @example * v.version - * // => '1.0.0' + * // => '1.1.0' */ -var version = '1.0.0'; +var version = '1.1.0'; /* eslint sort-imports: "off" */ @@ -7329,7 +7334,6 @@ describe('words', function () { }); }); -/* eslint-disable */ describe('stripTags', function () { it('should strip tags', function () { @@ -7343,6 +7347,29 @@ describe('stripTags', function () { chai.expect(Voca.stripTags('hello

world

')).to.be.equal('helloworld'); }); + it('should strip potential xss tags', function () { + /** + * @see https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet + */ + chai.expect(Voca.stripTags('')).to.be.equal('evil();'); + chai.expect(Voca.stripTags('')).to.be.equal(''); + chai.expect(Voca.stripTags('">')).to.be.equal(''); + chai.expect(Voca.stripTags('')).to.be.equal(''); + chai.expect(Voca.stripTags('')).to.be.equal(''); + chai.expect(Voca.stripTags('')).to.be.equal(''); + chai.expect(Voca.stripTags('<')).to.be.equal(''); + chai.expect(Voca.stripTags('')).to.be.equal(''); + chai.expect(Voca.stripTags('')).to.be.equal(''); + chai.expect(Voca.stripTags('')).to.be.equal(''); + chai.expect(Voca.stripTags('')).to.be.equal(''); + chai.expect(Voca.stripTags('')).to.be.equal('` SRC="httx://xss.rocks/xss.js">'); + chai.expect(Voca.stripTags('')).to.be.equal(''); + chai.expect(Voca.stripTags('PT SRC="httx://xss.rocks/xss.js">')).to.be.equal('document.write("'); + }); + it('should strip tags which attributes contain < or > ', function () { var helloWorld = 'hello world'; chai.expect(Voca.stripTags('hello world')).to.be.equal(helloWorld); @@ -7353,10 +7380,7 @@ describe('stripTags', function () { }); it('should strip tags on multiple lines', function () { - var multilineHtml = `This's a string with quotes: -"strings in double quote"; -'strings in single quote'; -this\line is single quoted /with\slashes `; + var multilineHtml = 'This\'s a string with quotes:\n"strings in double quote";\n\'strings in single quote\';\nthis\line is single quoted /with\slashes '; chai.expect(Voca.stripTags(multilineHtml, '')).to.be.equal(multilineHtml); }); @@ -7385,6 +7409,12 @@ describe('stripTags', function () { chai.expect(Voca.stripTags('')).to.be.equal(''); }); + it('should add instead of stripped tags a special string', function () { + chai.expect(Voca.stripTags('
  • Recently improved articles
  • ', '', '*')).to.be.equal('***Recently improved articles***'); + chai.expect(Voca.stripTags('HelloWorld', '', ' ')).to.be.equal(' Hello World '); + chai.expect(Voca.stripTags('Line
    break', ['i'], ' ')).to.be.equal('Line break'); + }); + it('should treat especially broken or invalid tags', function () { chai.expect(Voca.stripTags('< html >')).to.be.equal('< html >'); chai.expect(Voca.stripTags('<<>>')).to.be.equal(''); @@ -7395,7 +7425,14 @@ describe('stripTags', function () { chai.expect(Voca.stripTags('hello \t\tworld... strip_tags_test', allowableTags)).to.be.equal('hello \t\tworld... strip_tags_test'); }); - it('should strip tags from a string representation of an object', function () {}); + it('should strip tags from a string representation of an object', function () { + chai.expect(Voca.stripTags('
    Hello')).to.equal('Hello'); + chai.expect(Voca.stripTags({ + toString: function () { + return 'Hello'; + } + }, '')).to.equal('Hello'); + }); it('should return empty string for null or undefined', function () { chai.expect(Voca.stripTags(null)).to.be.equal(''); @@ -7446,4 +7483,3 @@ describe('version', function () { //util }(chai)); -//# sourceMappingURL=test_bundle.js.map