stringweaver 1.2.2 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Bundle/index.min.js +5 -5
- package/Bundle/index.min.js.map +3 -3
- package/README.md +1 -0
- package/package.json +30 -30
- package/src/Factories/interpolateFactory.js +23 -17
- package/src/Factories/randomStringFactory.js +13 -15
- package/src/Factories/regExpFromMultilineStringFactory.js +2 -5
- package/src/genericMethods.js +56 -26
- package/src/instanceMethods.js +8 -41
- package/tests/UnitTests.js +150 -30
package/Bundle/index.min.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*© KooiInc 2025-2030*/
|
|
2
|
-
var{randomString:
|
|
3
|
-
RegExp error message: "${n.message}"`}}function _(...e){return e.length>0?Array.isArray(e.slice(-1))?e.pop().join(""):e.join(""):""}function
|
|
4
|
-
`).map(o=>o.replace(/\s|\/\/.*$/g,"").trim().replace(/(@s!)/g," ")).join(""),n)}function
|
|
5
|
-
`).trim():n.filter(
|
|
6
|
-
`)})}function
|
|
2
|
+
var{randomString:F,uuid4:U}=oe();function oe(){let e=S(),t=()=>e?[...crypto.getRandomValues(new Uint32Array(1))].shift()/2**32:Math.random(),n=({min:a=0,max:s=Number.MAX_SAFE_INTEGER}={})=>Math.floor(t()*(s-a+1)+a),r=(a=0,s=10,m)=>(m||[])instanceof Function?[...Array(s)].map((C,O)=>a+O).map(m):[...Array(s)].map((C,O)=>a+O),o=a=>String.fromCharCode(a),u="!?@#$%^&*=+_;-".split(""),d=RegExp(`[${u.map(a=>`\\${a}`).join("")}]`,"g"),g=a=>{let s=a.length;for(;s--;){let m=n({max:s});[a[s],a[m]]=[a[m],a[s]]}return a},y=g(r(65,26,o)),$=g(r(97,26,o)),i={UCLC:g(y.concat($)),UC:y,LC:$,Nrs:g(r()),Sym:g(u)},l=a=>Object.entries(a).reduce((s,[m,C])=>C?[...s,...i[m]]:s,$);function S(){try{return window&&"crypto"in window}catch{return!1}}function c(){return e&&crypto.randomUUID?crypto.randomUUID():[...new Uint8Array(16)].map(a=>n({max:255})).map((a,s)=>`${(s===8?a&63|128:s===6?a&15|64:a).toString(16).padStart(2,"0")}${~[3,5,7,9].indexOf(s)?"-":""}`).join("")}function f(a,s,m){return/[a-z]/i.test(a)&&(s&&m?/\d/.test(a)&&d.test(a):s?/\d/.test(a):m?d.test(a):!0)}function h(a){let s=[...a],m=s.findIndex(C=>/[a-z]/i.test(C));return[s[0],s[m]]=[s[m],s[0]],s.join("")}function L({len:a=12,includeUppercase:s=!0,includeNumbers:m,includeSymbols:C,startAlphabetic:O}={}){a=a<6?6:a;let x=g(l({UC:s,Nrs:m,Sym:C}));for(;x.length<a;)x=[...x,...g(x)];let v=x.slice(0,a).join("");if(!(m||C))return v;for(let A=0;A<x.length;A+=1)if(v=x.slice(A,A+a).join(""),f(v,m,C))return O&&!/^[a-z]/i.test(v)?h(v):v;return L({len:a,includeUppercase:s,includeNumbers:m,includeSymbols:C,startAlphabetic:O})}return{randomString:L,uuid4:c}}var R=ue();function ue(e=""){return e=e?.constructor===String?e:"",function(i,...l){return I(i,y(l))};function t(i,l){return l&&e.length>0?String(e):`{${i}}`}function n(i){return i?.constructor===String||i?.constructor===Number&&!Number.isNaN(i)}function r(i,l){let S=i in l;return S&&n(l[i])?String(l[i]):t(i,S)}function o(i){return(...l)=>{let S=l.find(c=>c.key);return r(S?S.key:"_",i)}}function u(i,l){return i.replace(/\{(?<key>[a-z_\d]+)}/gim,o(l))}function d(i){let l=[];return Object.entries(i).forEach(([S,c])=>{c.forEach((f,h)=>(l[h]??={},l[h][S]=f))}),l}function g(i){return i.length===1&&Object.values(i[0]).every(Array.isArray)}function y(i){return g(i)?d(i[0]):i}function $(i){return!Array.isArray(i)&&i?.constructor===Object&&Object.entries(i)?.length>0}function I(i,l){return l?.length?l.filter(S=>S).map((S,c)=>$(S)?u(i,{...S,index:c+1}):"").join(""):i}}var P=ce;function ce(e,...t){t=e.raw?t:[t];try{return le(e,...t)}catch(n){let r=_();return`Error creating Regular Expression from string "${e.raw||e}" with flags ${r}
|
|
3
|
+
RegExp error message: "${n.message}"`}}function _(...e){return e.length>0?Array.isArray(e.slice(-1))?e.pop().join(""):e.join(""):""}function le(e,...t){let n=_(...t);t=[];let r=e.raw||[e];return new RegExp((t.length&&r.reduce((o,u,d)=>o.concat(t[d-1]||"").concat(u),"")||r?.join("")).split(`
|
|
4
|
+
`).map(o=>o.replace(/\s|\/\/.*$/g,"").trim().replace(/(@s!)/g," ")).join(""),n)}function j(e,t,n){return e=p(e),e.length>0?t(e):n||e}function D(e){return j(e,()=>`${e[0].toUpperCase()}${e.slice(1)}`)}function Z(e,...t){return j(e,()=>`${R(e,...t)}`)}function M(e,t,n){return!t&&!n?e:([t,n]=N(String,[t,n??""])?[t,n]:["",""],`${t}${e}${n||t}`)}function z(e){return j(e,()=>e.replace(/\s/g,"").replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`).replace(/-{2,}/g,"-").replace(/[^a-z-]/g,"").replace(/^-|-$/,""))}function Y(e){return j(e,()=>e.replace(/\s/g,"").replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/_{2,}/g,"_").replace(/[^a-z_]/g,"").replace(/^_|_$/,""))}function T(e){return j(e,()=>[...e.toLowerCase()].slice(1).reduce((t,n)=>t+(/\p{L}|[-']/u.test(t.at(-1))?n.toLowerCase():n.toUpperCase()),e[0].toUpperCase()))}function K(e){return j(e,()=>e.toLowerCase().trim().split(/[- ]/).filter(t=>t&&t.length>0).map((t,n)=>n>0&&`${D(t)}`||t).join(""))}function ae(e){return[...e.matchAll(/\p{Pe}|\p{Z}/gu)].at(-1)?.index??e.length}function X(e,{at:t,html:n=!1,wordBoundary:r=!1}={}){return n=n?.constructor===Boolean&&n||!1,r=r?.constructor===Boolean&&r||!1,j(e,()=>{if(e.length<=t)return e;let o=e.slice(0,t-1),u=n?"…":"...",d=r?ae(o):o.length;return(r?o.slice(0,d+1).trim():o)+u})}function W(e,t=!1){return t=t?.constructor===Boolean&&t||!1,j(e,()=>{let n=e.replace(/\n/gm,"#LF#").split(/#LF#/).map(r=>r.trim().replace(/\s{2,}/g,o=>o[0]));return t?n.join("#LF#").replace(/#LF#/g,`
|
|
5
|
+
`).trim():n.filter(r=>r.length>0).join(`
|
|
6
|
+
`)})}function Q(e,{replacements:t={},caseSensitive:n=!1}={}){e=p(e);let r=Object.entries(t).flat(),o=N(String,r)&&n?.constructor===Boolean,u=`g${n?"":"i"}`;if(!o)return e;for(;r.length;){let[d,g]=[r.shift(),r.shift()],y=re(d,u);e=e.replace(y,g)}return e}function J(e,t,n=0){e=p(e),n=V(n)&&n||0;let r=e.indexOf(t,n||0);return r<0?void 0:r}function k(e,t,n=0){e=p(e),n=V(n)&&n||e.length;let r=e.lastIndexOf(t,n);return r<0?void 0:r}function B(e,{value:t,values:n,at:r=0}={}){e=p(e),r=V(r)&&r||0;let o=p(n);return n=p(t).length?t:o.length?o:N(String,n)?n.map(u=>p(u)).join(""):[],n.length<=1?e:e.length===0?`${n}${e}`:`${e.slice(0,r)}${n}${e.slice(r)}`}function ee(e,...t){return t=N(String,t)&&t,t?B(p(e),{values:t,at:0}):p(e)}function te(e,...t){return t=N(String,t)&&t,t&&t.length>0?`${p(e)}`.concat(t.join("")):p(e)}var ne=se,ie=/symbol|anchor|big|blink|bold|fixed|fontsize|fontcolor|italics|link|small|strike|sup|sub/i;function se({initialstring:e}={}){let t={},n=new Proxy(t,d(t)),r=p(e),o=[r],u={configurable:!1,enumerable:!1};return Object.defineProperties(t,{append:{...u,value(...c){return l(te(r,...c))}},enclose:{...u,value(c,f){return l(M(r,c,f))}},format:{...u,value(...c){return l(Z(r,...c))}},indexOf:{...u,value(c){return J(r,c)}},interpolate:{...u,value(...c){return l(Z(r,...c))}},insert:{...u,value({value:c,values:f,at:h}={}){return l(B(r,{value:c,values:f,at:h}))}},lastIndexOf:{...u,value(c){return k(r,c)}},prefix:{...u,value(...c){return l(ee(r,...c))}},replaceWords:{...u,value({caseSensitive:c=!1,replacements:f={}}={}){return l(Q(r,{replacements:f??{},caseSensitive:c}))}},toString:{...u,value(){return r}},truncate:{...u,value({at:c,html:f=!1,wordBoundary:h=!1}={}){return l(X(r,{at:c,html:f,wordBoundary:h}))}},valueOf:{...u,value(){return r}},undoLast:{...u,value(c){return I(c)}},camelCase:{...u,get(){return l(K(p(r)))}},clone:{...u,get(){return H(n,E)}},firstUp:{...u,get(){return l(D(p(r)))}},history:{...u,get(){return o},set(c){o=c}},empty:{...u,get(){return r.length<1}},notEmpty:{...u,get(){return r.length<1?void 0:n}},kebabCase:{...u,get(){return l(z(p(r)))}},quote:q(n,l),snakeCase:{...u,get(){return l(Y(p(r)))}},trimAll:{...u,get(){return l(W(r))}},trimAllKeepLF:{...u,get(){return l(W(r,!0))}},undoAll:{...u,get(){return $()}},undo:{...u,get(){return i()}},wordsUCFirst:{...u,get(){return l(T(p(r)))}},value:{...u,get(){return r},set(c){let f=p(c);f.length&&(r=f,o.push(f))}}}),S(E),n;function d(c){return{get(f,h){return h in c?c[h]:g(String(h))?y(h):void 0}}}function g(c){return!ie.test(c)&&c in String.prototype}function y(c){return r[c]instanceof Function?function(...f){let h=r[c](...f);return h?.constructor===String?l(r[c](...f)):h}:r[c]}function $(){for(;o.length>1;)o.pop();return r=o.at(-1),l(r,!1)}function I(c){if(!V(c))return l(r,!1);let f=o.length;return c>=f||c<1?(o=o.slice(0,1),r=o.at(-1),l(o.at(-1),!1)):(o=o.slice(0,f-c),r=o.at(-1),l(r,!1))}function i(){return o.length===1?l(o[0]):(o.pop(),r=o.at(-1),l(r,!1))}function l(c,f=!0){return r!==c&&f&&o.push(c),r=c,n}function S(c){Object.entries(c).forEach(([f,h])=>{let{enumerable:L,method:a,isGetter:s}=h,m=!1;Object.defineProperty(t,f,s?{get(){return l(a(n).value)},enumerable:L,configurable:m}:{value(...O){return l(a(n,...O).value)},enumerable:L,configurable:m})})}}var E={},b=he();be(w,E);function w(e,...t){let n=ne({initialstring:fe(e,...t)});return Object.defineProperty(n,"constructor",{get(){return w},enumerable:!1}),Object.freeze(n)}function fe(e,...t){return e?.raw?String.raw({raw:e},...t):p(e).length?e:""}function N(e,t,n=!0){return Array.isArray(t)&&t.length>0&&!t.find(r=>Se(e,r,n))}function H(e){let t=w(e.value);return t.history=[...e.history],t}function p(e){return e?.value||e?.constructor===String&&e||""}function V(e){return e?.constructor===Number&&!Number.isNaN(e)}function re(e,t){return new RegExp(e.replace(/\p{S}|\p{P}/gu,n=>`\\${n}`),t)}function ge(e){return e.replace(/\p{S}|\p{P}/gu,t=>`\\${t}`)}function G(e,t){return`${e} (${t})`}function pe(){return{value:"getter/setter",clone:"chainable getter",notEmpty:"chainable getter|undefined",quote:"Object. See [constructor].quoteInfo"}}function me(e){let t=w(de()),n=pe();return t.split(/\n/).concat(Object.entries(Object.getOwnPropertyDescriptors(t)).sort(([r],[o])=>r.localeCompare(o)).map(([r,o])=>{let u=!e.find(c=>c===r),d="get"in o,g="value"in o,y=r in String.prototype,$=!y&&r in n,I=r in E?" *custom*":"",i=d&&u?`chainable getter${I}`:"getter",l=g&&u?`chainable method${I}`:"method",S=y&&`${o.get?"getter":"method"} (override)`;switch(!0){case $:return G(r,n[r]);case y:return G(r,S);case g:return G(r,l);case d:return G(r,i)}}))}function q(e,t){return t=t??function(n){return n},{value:{get backtick(){return e.enclose(...b.backtick)},get bracket(){return e.enclose(...b.bracket)},get curlyDouble(){return e.enclose(...b.curlyDouble)},get curlyDoubleInward(){return e.enclose(...b.curlyDoubleInward)},get curlyDoubleEqual(){return e.enclose(...b.curlyDoubleEqual)},get curlyLHDoubleInward(){return e.enclose(...b.curlyLHDoubleInward)},get curlyLHSingle(){return e.enclose(...b.curlyLHSingle)},get curlyLHSingleInward(){return e.enclose(...b.curlyLHSingleInward)},get curlySingle(){return e.enclose(...b.curlySingle)},get curlySingleEqual(){return e.enclose(...b.curlySingleEqual)},get curlySingleInward(){return e.enclose(...b.curlySingleInward)},get custom(){return(n,r)=>e.enclose(n,r??n)},get double(){return e.enclose(...b.double)},get guillemets(){return e.enclose(...b.guillemets)},get guillemetsInward(){return e.enclose(...b.guillemetsInward)},get guillemetsSingle(){return e.enclose(...b.guillemetsSingle)},get guillemetsSingleInward(){return e.enclose(...b.guillemetsSingleInward)},get remove(){return t(`${e.value.replace(b.re,"")}`)},get single(){return e.enclose(...b.single)},get squareBrackets(){return e.enclose(...b.squareBrackets)}},enumerable:!1,configurable:!1}}function de(){return atob`Rm9yIHRoZSByZWNvcmQ6CltjbV0gY2hhaW5hYmxlIGdldHRlcnMvbWV0aG9kcyBtb2RpZnkgdGhlIGluc3RhbmNlIHN0cmluZwpbY21dIGluZGV4T2Ygb3ZlcnJpZGVzIHJldHVybnMgW3VuZGVmaW5lZF0gaWYgbm90aGluZyB3YXMgZm91bmQgKHNvIG9uZSBjYW4gdXNlIFtsYXN0SV1pbmRleE9mKFtzb21lIHN0cmluZyB2YWx1ZV0pID8/IDAKW2NtXSBpbmNsdWRlcyBpbmZvcm1hdGlvbiBmb3IgY3VzdG9tIG1ldGhvZHMvZ2V0dGVycyBpZiBhcHBsaWNhYmxl`.replace(/\[cm]/g,"\u2714")}function he(){let e={backtick:["`","`"],bracket:["{","}"],curlyDoubleInward:["\u201D","\u201C"],curlyDouble:["\u201C","\u201D"],curlyDoubleEqual:["\u201C","\u201C"],curlyLHDouble:["\u201E","\u201D"],curlyLHDoubleInward:["\u201E","\u201C"],curlyLHSingle:["\u201A","\u2019"],curlyLHSingleInward:["\u201A","\u2018"],curlySingle:["\u201B","\u2019"],curlySingleEqual:["\u201B","\u201B"],curlySingleInward:["\u2019","\u201B"],double:['"','"'],guillemets:["\xAB","\xBB"],guillemetsInward:["\xBB","\xAB"],guillemetsSingle:["\u2039","\u203A"],guillemetsSingleInward:["\u203A","\u2039"],single:["'","'"],squareBrackets:["[","]"]},t=ge([...new Set(Object.values(e).filter(n=>Array.isArray(n)).flat())].join(""));return e.re=RegExp(`^[${t}]|[${t}]$`,"g"),e}function be(e,t){let n=q(e());Symbol.toSB=Symbol.for("toStringBuilder"),Object.defineProperty(String.prototype,Symbol.toSB,{get(){return e(this)},enumerable:!1,configurable:!1});let r="constructor,history,indexOf,toString,value,valueOf,empty".split(",");return Object.defineProperties(e,{create:{get(){return e()},enumerable:!1},constructor:{get(){return e},enumerable:!1},format:{value(o,...u){return w(o).format(...u)}},addCustom:{value({name:o,method:u,enumerable:d=!1,isGetter:g=!1}={}){if(w``[o])return console.error(`addCustom: the property "${o}" exists and can not be redefined`),`addCustom: the property "${o}" exists and can not be redefined`;if(o?.constructor===String&&u?.constructor===Function&&u.length>0)return t[o]={method:u,enumerable:d,isGetter:g},`addCustom: the ${g?"getter":"method"} named "${o}" is added`}},info:{get(){return me(r)}},keys:{get(){return Object.keys(Object.getOwnPropertyDescriptors(w``)).sort((o,u)=>o.localeCompare(u)).map(o=>!/constructor|toString|valueOf/.test(o)&&o in t?`${o} *custom*`:o)}},quoteInfo:{get(){return Object.entries(Object.getOwnPropertyDescriptors(n.value)).sort((o,u)=>o[0].localeCompare(u[0])).reduce((o,[u,d])=>{if(u==="remove")return[...o,"[instance].quote.remove (only predefined)"];if(u==="custom")return[...o,"[instance].quote.custom(start:string, end:string)"];let g=e(" [instance] ").quote[u];return[...o,`[instance].quote.${u} (${g})`]},[])}},uuid4:{get(){return w(U())}},randomString:{value:function({len:o,includeUppercase:u,includeNumbers:d,includeSymbols:g,startAlphabetic:y}={}){return w(F({len:o,includeUppercase:u,includeNumbers:d,includeSymbols:g,startAlphabetic:y}))}},regExp:{value:P}}),e}function Se(e,t,n){return e===String&&n?t?.constructor!==w&&t?.constructor!==e:t?.constructor!==e}var Ae=w;export{w as CustomStringConstructor,Ae as default};
|
|
7
7
|
//# sourceMappingURL=index.min.js.map
|
package/Bundle/index.min.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/Factories/randomStringFactory.js", "../src/Factories/interpolateFactory.js", "../src/Factories/regExpFromMultilineStringFactory.js", "../src/instanceMethods.js", "../src/extensions.js", "../src/genericMethods.js", "../index.js"],
|
|
4
|
-
"sourcesContent": ["/* node:coverage disable */\r\n/* For StringWeaver tests we are not interested in coverage for this file */\r\nconst { randomString, uuid4 } = randomStringGeneratorFactory();\r\nexport { randomString as default, randomString, uuid4 };\r\n\r\nfunction randomStringGeneratorFactory() {\r\n const hasCrypto = checkBrowserCrypto();\r\n const getRandomValue = () => hasCrypto\r\n ? [...crypto.getRandomValues(new Uint32Array(1))].shift() / 2**32\r\n : Math.random();\r\n const randomNr = ({min = 0, max = Number.MAX_SAFE_INTEGER} = {}) =>\r\n Math.floor( getRandomValue() * (max - min + 1) + min );\r\n const range = (start = 0, len = 10, reMap) => (reMap || []) instanceof Function\r\n ? [...Array(len)].map((_, i) => start + i).map(reMap)\r\n : [...Array(len)].map((_, i) => start + i);\r\n const map2Chrs = v => String.fromCharCode(v);\r\n const symbols = `!?@#$%^&*=+_;-`.split(``);\r\n const symRE = RegExp(`[${symbols.map(v => `\\\\${v}`).join(``)}]`, `g`);\r\n const shuffle = array => {\r\n let i = array.length;\r\n while (i--) {\r\n const ri = randomNr( { max: i } );\r\n [array[i], array[ri]] = [array[ri], array[i]];\r\n }\r\n \r\n return array;\r\n };\r\n const UC = shuffle(range(65, 26, map2Chrs));\r\n const LC = shuffle(range(97, 26, map2Chrs));\r\n const UCLC = shuffle(UC.concat(LC));\r\n const allChars = { UCLC, UC, LC, Nrs: shuffle(range()), Sym: shuffle(symbols), };\r\n const getChars2Use = use => Object.entries(use)\r\n .reduce( (acc, [key, value]) => value ? [...acc, ...allChars[key]] : acc, LC );\r\n \r\n function checkBrowserCrypto() {\r\n try { return window && `crypto` in window }\r\n catch(_) { return false; }\r\n }\r\n \r\n function uuid4() {\r\n // Note: randomUUID only in secure context (https)\r\n return hasCrypto && crypto.randomUUID\r\n ? crypto.randomUUID()\r\n : [...new Uint8Array(16)]\r\n .map(_ => randomNr({max: 255}))\r\n .map( (v, i) => `${\r\n (i === 8 ? v & 0b00111111 | 0b10000000 : i === 6 ? v & 0b00001111 | 0b01000000 : v)\r\n .toString(16).padStart(2, `0`)}${~[3,5,7,9].indexOf(i) ? `-` : ``}` )\r\n .join(``);\r\n }\r\n \r\n function strTest(strFound, numbers, symbols) {\r\n return /[a-z]/i.test(strFound) && (\r\n numbers && symbols ? /\\d/.test(strFound) && symRE.test(strFound)\r\n : numbers ? /\\d/.test(strFound)\r\n : symbols ? symRE.test(strFound)\r\n : true);\r\n }\r\n \r\n function alphaSwap(strFound) {\r\n const chars = [...strFound];\r\n const idx = chars.findIndex(v => /[a-z]/i.test(v));\r\n [chars[0], chars[idx]] = [chars[idx], chars[0]];\r\n return chars.join(``);\r\n }\r\n \r\n function randomString( {len = 12, includeUppercase = true, includeNumbers, includeSymbols, startAlphabetic} = {} ) {\r\n len = len < 6 ? 6 : len;\r\n let chrs2Use = shuffle( getChars2Use( { UC: includeUppercase, Nrs: includeNumbers, Sym: includeSymbols } ) );\r\n \r\n while (chrs2Use.length < len) { chrs2Use = [...chrs2Use, ...shuffle(chrs2Use)]; }\r\n \r\n let strFound = chrs2Use.slice(0, len).join(``);\r\n \r\n if (!(includeNumbers || includeSymbols)) { return strFound; }\r\n \r\n for (let i = 0; i < chrs2Use.length; i += 1) {\r\n strFound = chrs2Use.slice(i, i + len).join(``);\r\n \r\n if (strTest(strFound, includeNumbers, includeSymbols)) {\r\n return startAlphabetic && !/^[a-z]/i.test(strFound) ? alphaSwap(strFound) : strFound;\r\n }\r\n }\r\n \r\n return randomString({len, includeUppercase, includeNumbers, includeSymbols, startAlphabetic});\r\n }\r\n \r\n return { randomString, uuid4 };\r\n}\r\n", "/* node:coverage disable */\r\n/* For StringWeaver tests we are not interested in coverage for this file */\r\n\r\nconst defaultInterpolator = interpolateFactory();\r\nexport {defaultInterpolator as default, interpolateFactory};\r\n\r\n/**\r\n * Factory function to create an interpolate function with a default replacer.\r\n * @param {string} defaultReplacer - Default value to use for missing tokens.\r\n * @returns {Function} - The interpolation function.\r\n */\r\nfunction interpolateFactory(defaultReplacer = \"\") {\r\n defaultReplacer = defaultReplacer?.constructor === String ? defaultReplacer : \"\";\r\n \r\n /**\r\n * Main interpolation function.\r\n * @param {string} str - The string with placeholders.\r\n * @param {...object} tokens - Objects containing replacement values.\r\n * @returns {string} - The interpolated string.\r\n */\r\n return function(str, ...tokens) {\r\n return interpolate(str, processTokens(tokens));\r\n }\r\n \r\n /**\r\n * Handle invalid keys by returning the default replacer or the key in braces.\r\n * @param {string} key - The placeholder key.\r\n * @param {boolean} keyExists - Flag indicating if the key exists in the token.\r\n * @returns {string} - The replacement value.\r\n */\r\n function invalidate(key, keyExists) {\r\n if (keyExists && defaultReplacer.length > 0) {\r\n return String(defaultReplacer);\r\n }\r\n \r\n return `{${key}}`;\r\n }\r\n \r\n /**\r\n * determine if [value] is a String or Number\r\n * @param {any} value\r\n * @returns {boolean}\r\n */\r\n function isStringOrNumber(value ) {\r\n return value?.constructor === String || value?.constructor === Number && !Number.isNaN(value);\r\n }\r\n \r\n /**\r\n * Get the replacement value for a key from the token.\r\n * @param {string} key - The placeholder key.\r\n * @param {object} token - The token object containing replacement values.\r\n * @returns {string} - The replacement value.\r\n */\r\n function replacement(key, token) {\r\n const isValid = key in token;\r\n return isValid && isStringOrNumber(token[key]) ? String(token[key]) : invalidate(key, isValid);\r\n }\r\n \r\n /**\r\n * Create a lambda function for replacing placeholders in the string.\r\n * @param {object<string, string>} token - The token object containing replacement values.\r\n * @returns {Function} - The replacer lambda function.\r\n */\r\n function getReplacerLambda(token) {\r\n return (...args) => {\r\n const replacementObject = args.find(a => a.key);\r\n return replacement((replacementObject ? replacementObject.key : `_`), token);\r\n };\r\n }\r\n \r\n /**\r\n * Replace placeholders in the string with values from the token.\r\n * @param {string} str - The string with placeholders.\r\n * @param {object} token - The token object containing replacement values.\r\n * @returns {string} - The interpolated string.\r\n */\r\n function replace(str, token) {\r\n return str.replace(/\\{(?<key>[a-z_\\d]+)}/gim, getReplacerLambda(token));\r\n }\r\n \r\n /**\r\n * Convert token object to array of token Objects\r\n * when it's values are arrays of values.\r\n * @param {object} tokenObject - The token object containing arrays of values.\r\n * @returns {object[]} - Array of token objects.\r\n */\r\n /* node:coverage disable (internal method, not covered by tests)*/\r\n function convertTokensFromArrayValues(tokenObject) {\r\n const converted = [];\r\n \r\n Object.entries(tokenObject).forEach(([key, value]) => {\r\n value.forEach((v, i) => (converted[i] ??= {}, converted[i][key] = v));\r\n });\r\n \r\n return converted;\r\n }\r\n \r\n /**\r\n * Check if single token and its values are arrays.\r\n * @param {object[]} tokens - The tokens to check.\r\n * @returns {boolean} - True if tokens contains one Object\r\n * and all it's values are of type Array.\r\n */\r\n function isMultiLineWithArrays(tokens) {\r\n return tokens.length === 1 && Object.values(tokens[0]).every(Array.isArray);\r\n }\r\n \r\n /**\r\n * Process tokens to handle multi-line formats.\r\n * @param {object[]} tokens - The tokens to process.\r\n * @returns {object[]} - Processed tokens.\r\n */\r\n function processTokens(tokens) {\r\n return isMultiLineWithArrays(tokens) ? convertTokensFromArrayValues(tokens[0]) : tokens;\r\n }\r\n \r\n /**\r\n * Interpolate the string with the given tokens.\r\n * @param {string} str - The string with placeholders.\r\n * @param {object[]} tokens - The tokens containing replacement values.\r\n * @returns {string} - The interpolated string.\r\n */\r\n function interpolate(str, tokens) {\r\n return !tokens?.length ? str : tokens\r\n .filter(token => token)\r\n .map(token => token?.constructor === Object ? replace(str, token) : ``)\r\n .join(``);\r\n }\r\n}\r\n", "/* node:coverage disable */\r\n/* For StringWeaver tests we are not interested in coverage for this file */\r\n\r\nexport default createRegExp\r\n\r\nfunction createRegExp(str, ...args) {\r\n args = !str.raw ? [args] : args;\r\n try {\r\n return regExp(str, ...args);\r\n } catch (err) {\r\n const flags = resolveFlags();\r\n const raw = str.raw || str; \r\n return `Error creating Regular Expression from string \"${raw}\" with flags ${flags}` +\r\n `\\nRegExp error message: \"${err.message}\"`;\r\n }\r\n}\r\n\r\nfunction resolveFlags(...args) {\r\n return args.length > 0\r\n ? Array.isArray(args.slice(-1))\r\n ? args.pop().join(``) : args.join(``) : ``;\r\n}\r\n\r\nfunction regExp(regexStr, ...args) {\r\n const flags = resolveFlags(...args);\r\n args = [];\r\n const raw = regexStr.raw || [regexStr];\r\n \r\n return new RegExp(\r\n (args.length &&\r\n raw.reduce( (a, v, i ) => a.concat(args[i-1] || ``).concat(v), ``) ||\r\n raw?.join(``))\r\n .split(`\\n`)\r\n .map( line => line.replace(/\\s|\\/\\/.*$/g, ``).trim().replace(/(@s!)/g, ` `) )\r\n .join(``), flags);\r\n}\r\n", "import {\r\n isArrayOf,\r\n isNumber,\r\n quotingStyles,\r\n getStringValue,\r\n escapeRE,\r\n customMethods,\r\n interpolate,\r\n clone } from \"./genericMethods.js\";\r\n\r\nexport {\r\n format,\r\n ucFirst,\r\n truncate,\r\n trimAll,\r\n replaceWords,\r\n indexOf,\r\n lastIndexOf,\r\n insert,\r\n append,\r\n isNumber,\r\n prefix,\r\n getStringValue,\r\n toCamelcase,\r\n wordsFirstUp,\r\n toDashedNotation,\r\n quotGetters,\r\n surroundWith,\r\n toSnakeCase,\r\n customMethods,\r\n clone,\r\n};\r\n\r\nfunction checkAndRun(string, fn, or) {\r\n string = getStringValue(string);\r\n return string.length > 0 ? fn(string) : or || string;\r\n}\r\n\r\nfunction ucFirst(string) {\r\n return checkAndRun(string, () => `${string[0].toUpperCase()}${string.slice(1)}`);\r\n}\r\n\r\nfunction format(string, ...tokens) {\r\n return checkAndRun(string, () => `${interpolate(string, ...tokens)}`);\r\n}\r\n\r\nfunction surroundWith(string, start, end) {\r\n if (!start && !end) {\r\n return string;\r\n }\r\n [start, end] = isArrayOf(String, [start, end ?? ``]) ? [start, end] : [``, ``];\r\n return `${start}${string}${end || start}`;\r\n}\r\n\r\nfunction toDashedNotation(string) {\r\n return checkAndRun(string, () =>\r\n string\r\n .replace(/\\s/g, '')\r\n .replace(/[A-Z]/g, a => `-${a.toLowerCase()}`)\r\n .replace(/-{2,}/g, `-`)\r\n .replace(/[^a-z-]/g, ``)\r\n .replace(/^-|-$/, ``)\r\n );\r\n}\r\n\r\nfunction toSnakeCase(string) {\r\n return checkAndRun(string, () =>\r\n string\r\n .replace(/\\s/g, '')\r\n .replace(/[A-Z]/g, a => `_${a.toLowerCase()}`)\r\n .replace(/_{2,}/g, `_`)\r\n .replace(/[^a-z_]/g, ``)\r\n .replace(/^_|_$/, ``)\r\n );\r\n}\r\n\r\nfunction wordsFirstUp(string) {\r\n return checkAndRun(string, () => [...string.toLowerCase()].slice(1).reduce( (acc, v) =>\r\n acc + ( !/\\p{L}|[-']/u.test(acc.at(-1)) ? v.toUpperCase() : v.toLowerCase() ),\r\n string[0].toUpperCase()\r\n ));\r\n}\r\n\r\nfunction toCamelcase(string) {\r\n return checkAndRun(string, () =>\r\n string.toLowerCase()\r\n .trim()\r\n .split(/[- ]/)\r\n .filter(l => l && l.length > 0)\r\n .map( (str, i) => i > 0 && `${ucFirst(str)}`|| str)\r\n .join(``)\r\n );\r\n}\r\n\r\nfunction getBoundary(string) {\r\n const match = [...string.matchAll(/\\p{Pe}|\\p{Z}/gu)].at(-1);\r\n return match?.index ?? string.length;\r\n}\r\n\r\nfunction truncate(string, {at, html = false, wordBoundary = false} = {} ) {\r\n html = html?.constructor === Boolean && html || false;\r\n wordBoundary = wordBoundary?.constructor === Boolean && wordBoundary || false;\r\n return checkAndRun(string, () => {\r\n if (string.length <= at) { return string; }\r\n\r\n const subString = string.slice(0, at - 1);\r\n const endwith = html ? \"…\" : `...`;\r\n const boundary = wordBoundary\r\n ? getBoundary(subString)\r\n : subString.length;\r\n\r\n return (wordBoundary\r\n ? subString.slice(0, boundary+1).trim()\r\n : subString) + endwith;\r\n }\r\n );\r\n}\r\n\r\nfunction trimAll(string, keepLines = false) {\r\n keepLines = keepLines?.constructor === Boolean && keepLines || false;\r\n return checkAndRun(string, () => {\r\n const lines = string.replace(/\\n/gm, `#LF#`)\r\n .split(/#LF#/)\r\n .map(line => line.trim().replace(/\\s{2,}/g, a => a[0]) );\r\n return keepLines\r\n ? lines.join(`#LF#`).replace(/#LF#/g, `\\n`).trim()\r\n : lines.filter(l => l.length > 0).join(`\\n`);\r\n });\r\n}\r\n\r\nfunction replaceWords(string, { replacements = {}, caseSensitive = false} = {}) {\r\n string = getStringValue(string);\r\n let replacements2Array = Object.entries(replacements).flat();\r\n const cando = isArrayOf(String, replacements2Array) && caseSensitive?.constructor === Boolean;\r\n const modifiers = `g${!caseSensitive ? 'i' : ''}`;\r\n\r\n if (cando) {\r\n replacements2Array = replacements2Array.map(v => getStringValue(v)).filter(v => replacements2Array.length > 0);\r\n\r\n if (replacements2Array.length) {\r\n while (replacements2Array.length) {\r\n const [initial, replacement] = [replacements2Array.shift(), replacements2Array.shift()];\r\n const re = escapeRE(initial, modifiers);\r\n string = string.replace(re, replacement);\r\n }\r\n }\r\n }\r\n\r\n return string;\r\n}\r\n\r\n// SEE https://youtu.be/99Zacm7SsWQ?t=2101\r\nfunction indexOf(string, findMe, fromIndex = 0) {\r\n string = getStringValue(string);\r\n fromIndex = isNumber(fromIndex) && fromIndex || 0;\r\n const index = string.indexOf(findMe, fromIndex || 0);\r\n return index < 0 ? undefined : index;\r\n}\r\n\r\nfunction lastIndexOf(string, findMe, beforeIndex = 0) {\r\n string = getStringValue(string);\r\n beforeIndex = isNumber(beforeIndex) && beforeIndex || string.length;\r\n const index = string.lastIndexOf(findMe, beforeIndex);\r\n return index < 0 ? undefined : index;\r\n}\r\n\r\nfunction insert(string, { value, values, at = 0 } = {}) {\r\n string = getStringValue(string);\r\n at = isNumber(at) && at || 0;\r\n const valuesMaybeValue = getStringValue(values);\r\n values = getStringValue(value).length\r\n ? value\r\n : valuesMaybeValue.length\r\n ? valuesMaybeValue\r\n : isArrayOf(String, values)\r\n ? values.map(v => getStringValue(v)).join(``)\r\n : [];\r\n\r\n return values.length <= 1\r\n ? string\r\n : string.length === 0\r\n ? `${values}${string}`\r\n : `${string.slice(0, at)}${values}${string.slice(at)}`;\r\n}\r\n\r\nfunction prefix(string, ...strings) {\r\n strings = isArrayOf(String, strings) && strings;\r\n return strings ? insert(getStringValue(string), {values: strings, at: 0}) : getStringValue(string);\r\n}\r\n\r\nfunction append(string, ...strings2Append) {\r\n strings2Append = isArrayOf(String, strings2Append) && strings2Append;\r\n\r\n if (strings2Append && strings2Append.length > 0) {\r\n return `${getStringValue(string)}`.concat(strings2Append.join(``))\r\n }\r\n\r\n return getStringValue(string);\r\n}\r\n\r\nfunction quotGetters(instance, wrap) {\r\n return {\r\n value: {\r\n get backtick() { return instance.enclose(...quotingStyles.backtick); },\r\n get bracket() { return instance.enclose(...quotingStyles.bracket); },\r\n get curlyDouble() { return instance.enclose(...quotingStyles.curlyDouble); },\r\n get curlyDoubleInward() { return instance.enclose(...quotingStyles.curlyDoubleInward); },\r\n get curlyDoubleEqual() { return instance.enclose(...quotingStyles.curlyDoubleEqual); },\r\n get curlyLHDoubleInward() { return instance.enclose(...quotingStyles.curlyLHDoubleInward); },\r\n get curlyLHSingle() { return instance.enclose(...quotingStyles.curlyLHSingle); },\r\n get curlyLHSingleInward() { return instance.enclose(...quotingStyles.curlyLHSingleInward); },\r\n get curlySingle() { return instance.enclose(...quotingStyles.curlySingle); },\r\n get curlySingleEqual() { return instance.enclose(...quotingStyles.curlySingleEqual); },\r\n get curlySingleInward() { return instance.enclose(...quotingStyles.curlySingleInward); },\r\n custom(start, end) { return instance.enclose(...[start, end ?? start]); },\r\n get double() { return instance.enclose(...quotingStyles.double); },\r\n get guillemets() { return instance.enclose(...quotingStyles.guillemets); },\r\n get guillemetsInward() { return instance.enclose(...quotingStyles.guillemetsInward); },\r\n get guillemetsSingle() { return instance.enclose(...quotingStyles.guillemetsSingle); },\r\n get guillemetsSingleInward() { return instance.enclose(...quotingStyles.guillemetsSingleInward); },\r\n get remove() { return wrap(`${instance.value.replace(quotingStyles.re, ``)}`); },\r\n get single() { return instance.enclose(...quotingStyles.single); },\r\n get squareBrackets() { return instance.enclose(...quotingStyles.squareBrackets); },\r\n },\r\n enumerable: false,\r\n configurable: false,\r\n };\r\n}\r\n", "import {\r\n format,\r\n ucFirst,\r\n truncate,\r\n trimAll,\r\n replaceWords,\r\n indexOf,\r\n lastIndexOf,\r\n insert,\r\n append,\r\n prefix,\r\n getStringValue,\r\n quotGetters,\r\n surroundWith,\r\n toCamelcase,\r\n wordsFirstUp,\r\n toDashedNotation,\r\n toSnakeCase,\r\n customMethods,\r\n isNumber,\r\n clone,\r\n} from \"./instanceMethods.js\";\r\n\r\nexport default instanceCreator;\r\n\r\nconst deprecatedRE = /symbol|anchor|big|blink|bold|fixed|fontsize|fontcolor|italics|link|small|strike|sup|sub/i\r\n\r\nfunction instanceCreator({initialstring} = {}) {\r\n let customStringExtensions = { };\r\n let instance = new Proxy(customStringExtensions, getTraps(customStringExtensions));\r\n let actualValue = getStringValue(initialstring);\r\n let history = [actualValue];\r\n const descriptorProps = {configurable: false, enumerable: false};\r\n \r\n Object.defineProperties( customStringExtensions, {\r\n append: { ...descriptorProps, value(...strings) { return wrap(append(actualValue, ...strings)); } },\r\n enclose: { ...descriptorProps, value(start, end) { return wrap(surroundWith(actualValue, start, end)); } },\r\n format: { ...descriptorProps, value(...tokens) { return wrap(format(actualValue, ...tokens)); } },\r\n indexOf: { ...descriptorProps, value(str) { return indexOf(actualValue, str); } },\r\n interpolate: { ...descriptorProps, value(...tokens) { return wrap(format(actualValue, ...tokens)); } },\r\n insert: { ...descriptorProps, value({ value, values, at } = {}) { \r\n return wrap(insert(actualValue, { value, values, at })); \r\n } \r\n },\r\n lastIndexOf: { ...descriptorProps, value(str) { return lastIndexOf(actualValue, str); } },\r\n prefix: { ...descriptorProps, value(...strings) { return wrap(prefix(actualValue, ...strings)); } },\r\n replaceWords: { ...descriptorProps, value({caseSensitive = false, replacements = {}} = {}) {\r\n return wrap(replaceWords(actualValue, { replacements: replacements ?? {}, caseSensitive }));\r\n } },\r\n toString: { ...descriptorProps, value() { return actualValue; } },\r\n truncate: { ...descriptorProps, value({at, html = false, wordBoundary = false} = {}) {\r\n return wrap(truncate(actualValue, {at, html, wordBoundary})); } },\r\n valueOf: { ...descriptorProps, value() { return actualValue; } },\r\n undoLast: { ...descriptorProps, value(nSteps) { return undoSteps(nSteps); } },\r\n\r\n camelCase: { ...descriptorProps, get() { return wrap(toCamelcase(getStringValue(actualValue))); } }, \r\n clone: { ...descriptorProps, get() { return clone(instance, customMethods); } },\r\n firstUp: { ...descriptorProps, get() { return wrap(ucFirst(getStringValue(actualValue))); } },\r\n history: { ...descriptorProps, get() { return history; }, set(value) { history = value; } },\r\n empty: { ...descriptorProps, get() { return actualValue.length < 1; } },\r\n notEmpty: { ...descriptorProps, get() { return actualValue.length < 1 ? undefined: instance; } },\r\n kebabCase: { ...descriptorProps, get() { return wrap(toDashedNotation(getStringValue(actualValue))); } },\r\n quote: quotGetters(instance, wrap),\r\n snakeCase: { ...descriptorProps, get() { return wrap(toSnakeCase(getStringValue(actualValue))); } },\r\n trimAll: { ...descriptorProps, get() { return wrap(trimAll(actualValue)); } },\r\n trimAllKeepLF: { ...descriptorProps, get() { return wrap(trimAll(actualValue, true)); } },\r\n undoAll: { ...descriptorProps, get() { return undoAll(); } },\r\n undo: { ...descriptorProps, get() { return undoLast(); } },\r\n wordsUCFirst: { ...descriptorProps, get() { return wrap(wordsFirstUp(getStringValue(actualValue))); } },\r\n value: { ...descriptorProps, \r\n get() { return actualValue; }, \r\n set(value) {\r\n const nwValue = getStringValue(value);\r\n if (nwValue.length) {\r\n actualValue = nwValue;\r\n history.push(nwValue); \r\n }\r\n }\r\n },\r\n });\r\n \r\n injectCustomMethods(customMethods);\r\n \r\n return instance;\r\n \r\n function getTraps(extensions) {\r\n return {\r\n get( target, key ) {\r\n return key in extensions\r\n ? extensions[key]\r\n : canWrapNative(String(key))\r\n ? wrapNative(key)\r\n : undefined;\r\n },\r\n };\r\n }\r\n \r\n function canWrapNative(key) {\r\n return !deprecatedRE.test(key)\r\n && key in String.prototype;\r\n }\r\n \r\n function wrapNative(key) {\r\n return actualValue[key] instanceof Function\r\n ? function(...args) {\r\n const result = actualValue[key](...args); \r\n return result?.constructor === String ? wrap(actualValue[key](...args)) : result; \r\n } : actualValue[key];\r\n }\r\n \r\n function undoAll() {\r\n while(history.length > 1) { history.pop(); }\r\n actualValue = history.at(-1);\r\n return wrap(actualValue, false);\r\n }\r\n \r\n function undoSteps(steps) {\r\n if (!isNumber(steps)) {\r\n return wrap(actualValue, false); \r\n }\r\n \r\n const historyLen = history.length;\r\n \r\n if (steps >= historyLen || steps < 1) {\r\n history = history.slice(0, 1);\r\n actualValue = history.at(-1); \r\n return wrap(history.at(-1), false); \r\n }\r\n \r\n history = history.slice(0, historyLen - steps);\r\n \r\n actualValue = history.at(-1);\r\n return wrap(actualValue, false);\r\n }\r\n \r\n function undoLast() {\r\n if (history.length === 1) {\r\n return wrap(history[0]);\r\n }\r\n \r\n history.pop();\r\n actualValue = history.at(-1);\r\n return wrap(actualValue, false);\r\n }\r\n \r\n function wrap(result, pushHistory = true) {\r\n const changed = actualValue !== result;\r\n changed && pushHistory && history.push(result);\r\n actualValue = result;\r\n return instance;\r\n }\r\n \r\n function injectCustomMethods(customMethods) {\r\n Object.entries(customMethods).forEach(([methodName, methodContainer]) => {\r\n const {enumerable, method, isGetter} = methodContainer;\r\n const configurable = false\r\n const descriptor = isGetter\r\n ? { get() { return wrap(method(instance).value); }, enumerable, configurable }\r\n : { value(...args) { return wrap(method(instance, ...args).value); }, enumerable, configurable };\r\n \r\n Object.defineProperty(customStringExtensions, methodName, descriptor);\r\n });\r\n }\r\n}\r\n", "import {default as randomString, uuid4} from \"./Factories/randomStringFactory.js\";\r\nimport interpolate from \"./Factories/interpolateFactory.js\";\r\nimport createRegExp from \"./Factories/regExpFromMultilineStringFactory.js\";\r\nimport createInstance from \"./extensions.js\";\r\nconst customMethods = {};\r\nconst quotingStyles = defineQuotingStyles();\r\n\r\nexport {\r\n customMethods,\r\n CustomStringConstructor,\r\n isNumber, \r\n isArrayOf,\r\n defineQuotingStyles,\r\n getStringValue,\r\n escapeRE,\r\n resolveTemplateString,\r\n clone,\r\n interpolate,\r\n quotingStyles,\r\n};\r\n\r\ncreateExtendedCTOR(CustomStringConstructor, customMethods);\r\n\r\nfunction CustomStringConstructor(str, ...args) {\r\n const instance = createInstance({initialstring: resolveTemplateString(str, ...args)});\r\n Object.defineProperty( instance, \r\n `constructor`, { get() { return CustomStringConstructor; }, enumerable: false}\r\n );\r\n return Object.freeze(instance);\r\n}\r\n\r\nfunction resolveTemplateString(str, ...args) {\r\n return str?.raw\r\n ? String.raw({ raw: str }, ...args)\r\n : getStringValue(str).length ? str : \"\";\r\n}\r\n\r\nfunction checkType(type, item, includeInstances) {\r\n return type === String && includeInstances\r\n ? item?.constructor !== CustomStringConstructor && item?.constructor !== type\r\n : item?.constructor !== type;\r\n}\r\n\r\nfunction isArrayOf(type, value, includeInstances = true) {\r\n return Array.isArray(value) && value.length > 0 && !value.find(v => checkType(type, v, includeInstances));\r\n}\r\n\r\nfunction clone(instance) {\r\n const newInstance = CustomStringConstructor(instance.value);\r\n newInstance.history = [...instance.history];\r\n return newInstance;\r\n}\r\n\r\nfunction getStringValue(string) {\r\n return string?.value || (string?.constructor === String && string) || ``;\r\n}\r\n\r\nfunction isNumber(value) {\r\n return value?.constructor === Number && !Number.isNaN(value);\r\n}\r\n\r\nfunction escapeRE(reString, modifiers) {\r\n return new RegExp(reString.replace(/\\p{S}|\\p{P}/gu, a => `\\\\${a}`), modifiers);\r\n}\r\n\r\nfunction escape4RE(reString) {\r\n return reString.replace(/\\p{S}|\\p{P}/gu, a => `\\\\${a}`);\r\n}\r\n\r\nfunction infoValue(key, infoValue) {\r\n return `${key} (${infoValue})`;\r\n}\r\n\r\nfunction getPlainValues() {\r\n return {\r\n value: `getter/setter`,\r\n clone: `chainable getter`,\r\n notEmpty: `chainable getter|undefined`,\r\n quote: `Object. See [constructor].quoteInfo`,\r\n };\r\n}\r\n\r\nfunction getSWInformation(notChainable) {\r\n const firstLines = CustomStringConstructor(decode());\r\n const plainValues = getPlainValues();\r\n \r\n return firstLines.split(/\\n/)\r\n .concat(\r\n Object.entries(Object.getOwnPropertyDescriptors(firstLines))\r\n .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))\r\n .map(([key, descriptr]) => {\r\n const isChainable = !notChainable.find(k => k === key);\r\n const isGetter = 'get' in descriptr;\r\n const isMethod = 'value' in descriptr;\r\n const isNative = key in String.prototype;\r\n const isPlainValue = !isNative && key in plainValues;\r\n const custom = key in customMethods ? ` *custom*` : ``;\r\n const getter = isGetter && isChainable ? `chainable getter${custom}` : `getter`;\r\n const method = isMethod && isChainable ? `chainable method${custom}` : `method`;\r\n const native = isNative && `${descriptr.get ? `getter` : `method`} (override)`;\r\n \r\n switch (true) {\r\n case isPlainValue: return infoValue(key, plainValues[key]);\r\n case isNative: return infoValue(key, native);\r\n case isMethod: return infoValue(key, method);\r\n case isGetter: return infoValue(key, getter); \r\n }\r\n }\r\n )\r\n );\r\n}\r\n\r\nfunction decode() {\r\n return atob`Rm9yIHRoZSByZWNvcmQ6CltjbV0gY2hhaW5hYmxlIGdldHRlcnMvbWV0aG9kcyBtb2RpZnkgdGhlIGluc3RhbmNlIHN0cmluZwpbY21dIGluZGV4T2Ygb3ZlcnJpZGVzIHJldHVybnMgW3VuZGVmaW5lZF0gaWYgbm90aGluZyB3YXMgZm91bmQgKHNvIG9uZSBjYW4gdXNlIFtsYXN0SV1pbmRleE9mKFtzb21lIHN0cmluZyB2YWx1ZV0pID8/IDAKW2NtXSBpbmNsdWRlcyBpbmZvcm1hdGlvbiBmb3IgY3VzdG9tIG1ldGhvZHMvZ2V0dGVycyBpZiBhcHBsaWNhYmxl`.replace(/\\[cm]/g, `\\u2714`);\r\n}\r\n\r\nfunction defineQuotingStyles() {\r\n // see https://en.wikipedia.org/wiki/Quotation_mark\r\n const quots = {\r\n backtick: [\"`\", \"`\"],\r\n bracket: [`{`, `}`],\r\n curlyDoubleInward: [`\u201D`, `\u201C`],\r\n curlyDouble: [`\u201C`, `\u201D`],\r\n curlyDoubleEqual: [`\u201C`, `\u201C`],\r\n curlyLHDouble: [`\u201E`, `\u201D`],\r\n curlyLHDoubleInward: [`\u201E`, `\u201C`],\r\n curlyLHSingle: [`\u201A`, `\u2019`],\r\n curlyLHSingleInward: [`\u201A`, `\u2018`],\r\n curlySingle: [`\u201B`, `\u2019`],\r\n curlySingleEqual: [`\u201B`, `\u201B`],\r\n curlySingleInward: [`\u2019`, `\u201B`],\r\n double: [`\"`, `\"`],\r\n guillemets: [`\u00AB`, `\u00BB`],\r\n guillemetsInward: [`\u00BB`, `\u00AB`],\r\n guillemetsSingle: [`\u2039`, `\u203A`],\r\n guillemetsSingleInward: [`\u203A`, `\u2039`],\r\n single: [`'`, `'`],\r\n squareBrackets: [`[`, `]`],\r\n };\r\n const regExpValues = escape4RE([...new Set(\r\n Object.values(quots)\r\n .filter(v => Array.isArray(v))\r\n .flat())].join(``));\r\n quots.re = RegExp(`^[${regExpValues}]|[${regExpValues}]$`, \"g\");\r\n\r\n return quots;\r\n}\r\n\r\n/* this function is not (directly) tested */\r\n/* node:coverage disable */\r\nfunction createExtendedCTOR(ctor, customMethods) {\r\n Symbol.toSB = Symbol.for(`toStringBuilder`);\r\n Object.defineProperty(String.prototype, Symbol.toSB, { \r\n get() { return ctor(this); }, \r\n enumerable: false,\r\n configurable: false });\r\n const notChainable = `constructor,history,indexOf,toString,value,valueOf,empty`.split(`,`);\r\n Object.defineProperties(ctor, {\r\n create: {\r\n get() { return ctor(); },\r\n enumerable: false\r\n },\r\n constructor: {\r\n get() { return ctor; },\r\n enumerable: false,\r\n },\r\n format: {\r\n value(str, ...tokens) {\r\n return CustomStringConstructor(str).format(...tokens);\r\n }\r\n },\r\n addCustom: {\r\n value( { name, method, enumerable = false, isGetter = false } = {} ) {\r\n if (CustomStringConstructor``[name]) {\r\n console.error(`addCustom: the property \"${name}\" exists and can not be redefined`);\r\n return `addCustom: the property \"${name}\" exists and can not be redefined`;\r\n }\r\n \r\n if (name?.constructor === String && method?.constructor === Function && method.length > 0) {\r\n customMethods[name] = {method, enumerable, isGetter};\r\n return `addCustom: the ${isGetter ? `getter` : `method`} named \"${name}\" is added`;\r\n }\r\n }\r\n },\r\n info: {\r\n get() { return getSWInformation(notChainable); }\r\n },\r\n keys: {\r\n get() { \r\n return Object.keys(Object.getOwnPropertyDescriptors(CustomStringConstructor``)).sort( (a,b) => a.localeCompare(b) )\r\n .map(v => !/constructor|toString|valueOf/.test(v) && v in customMethods ? `${v} *custom*` : v); \r\n }\r\n },\r\n quoteInfo: {\r\n get() {\r\n const qStyles = {...defineQuotingStyles()};\r\n delete qStyles.re;\r\n return Object.entries(qStyles)\r\n .sort( (a,b) => a[0].localeCompare(b[0]) )\r\n .reduce((acc, [k, v]) => {\r\n const val = v.constructor === Function ? `(start:string[, end:string])` : ` (${v.join(` [instance value] `)})`;\r\n return [...acc, `[instance].quote.${k}${val}`];\r\n }, []);\r\n }\r\n },\r\n uuid4: {\r\n get() { return CustomStringConstructor(uuid4()); }\r\n },\r\n randomString: {\r\n value: function({len, includeUppercase, includeNumbers, includeSymbols, startAlphabetic} = {}) {\r\n return CustomStringConstructor(randomString({len, includeUppercase, includeNumbers, includeSymbols, startAlphabetic})); \r\n }\r\n },\r\n regExp: { value: createRegExp }\r\n });\r\n \r\n return ctor;\r\n}\r\n/* node:coverage enable */\r\n", "import { CustomStringConstructor } from \"./src/genericMethods.js\";\r\nconst defaultStringCTOR = CustomStringConstructor;\r\n\r\nexport {defaultStringCTOR as default, CustomStringConstructor};\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["randomString", "uuid4", "randomStringGeneratorFactory", "randomStringGeneratorFactory", "hasCrypto", "checkBrowserCrypto", "getRandomValue", "randomNr", "min", "max", "range", "start", "len", "reMap", "_", "i", "map2Chrs", "v", "symbols", "symRE", "shuffle", "array", "ri", "UC", "LC", "allChars", "getChars2Use", "use", "acc", "key", "value", "uuid4", "strTest", "strFound", "numbers", "alphaSwap", "chars", "idx", "randomString", "includeUppercase", "includeNumbers", "includeSymbols", "startAlphabetic", "chrs2Use", "defaultInterpolator", "interpolateFactory", "interpolateFactory", "defaultReplacer", "str", "tokens", "interpolate", "processTokens", "invalidate", "key", "keyExists", "isStringOrNumber", "value", "replacement", "token", "isValid", "getReplacerLambda", "args", "replacementObject", "a", "replace", "convertTokensFromArrayValues", "tokenObject", "converted", "v", "i", "isMultiLineWithArrays", "regExpFromMultilineStringFactory_default", "createRegExp", "str", "args", "regExp", "err", "flags", "resolveFlags", "regexStr", "raw", "a", "v", "i", "line", "checkAndRun", "string", "fn", "or", "getStringValue", "ucFirst", "format", "tokens", "defaultInterpolator", "surroundWith", "start", "end", "isArrayOf", "toDashedNotation", "a", "toSnakeCase", "wordsFirstUp", "acc", "v", "toCamelcase", "l", "str", "i", "
|
|
4
|
+
"sourcesContent": ["const { randomString, uuid4 } = randomStringGeneratorFactory();\r\nexport { randomString as default, randomString, uuid4 };\r\n\r\nfunction randomStringGeneratorFactory() {\r\n const hasCrypto = checkBrowserCrypto();\r\n const getRandomValue = () => hasCrypto\r\n ? [...crypto.getRandomValues(new Uint32Array(1))].shift() / 2**32\r\n : Math.random();\r\n const randomNr = ({min = 0, max = Number.MAX_SAFE_INTEGER} = {}) =>\r\n Math.floor( getRandomValue() * (max - min + 1) + min );\r\n const range = (start = 0, len = 10, reMap) => (reMap || []) instanceof Function\r\n ? [...Array(len)].map((_, i) => start + i).map(reMap)\r\n : [...Array(len)].map((_, i) => start + i);\r\n const map2Chrs = v => String.fromCharCode(v);\r\n const symbols = `!?@#$%^&*=+_;-`.split(``);\r\n const symRE = RegExp(`[${symbols.map(v => `\\\\${v}`).join(``)}]`, `g`);\r\n const shuffle = array => {\r\n let i = array.length;\r\n while (i--) {\r\n const ri = randomNr( { max: i } );\r\n [array[i], array[ri]] = [array[ri], array[i]];\r\n }\r\n\r\n return array;\r\n };\r\n const UC = shuffle(range(65, 26, map2Chrs));\r\n const LC = shuffle(range(97, 26, map2Chrs));\r\n const UCLC = shuffle(UC.concat(LC));\r\n const allChars = { UCLC, UC, LC, Nrs: shuffle(range()), Sym: shuffle(symbols), };\r\n const getChars2Use = use => Object.entries(use)\r\n .reduce( (acc, [key, value]) => value ? [...acc, ...allChars[key]] : acc, LC );\r\n\r\n function checkBrowserCrypto() {\r\n try { return window && `crypto` in window }\r\n catch(_) { return false; }\r\n }\r\n\r\n function uuid4() {\r\n // Note: randomUUID only in secure context (https)\r\n return hasCrypto && crypto.randomUUID\r\n ? crypto.randomUUID()\r\n : [...new Uint8Array(16)]\r\n .map(_ => randomNr({max: 255}))\r\n .map( (v, i) => `${\r\n (i === 8 ? v & 0b00111111 | 0b10000000 : i === 6 ? v & 0b00001111 | 0b01000000 : v)\r\n .toString(16).padStart(2, `0`)}${~[3,5,7,9].indexOf(i) ? `-` : ``}` )\r\n .join(``);\r\n }\r\n\r\n function strTest(strFound, numbers, symbols) {\r\n return /[a-z]/i.test(strFound) && (\r\n numbers && symbols ? /\\d/.test(strFound) && symRE.test(strFound)\r\n : numbers ? /\\d/.test(strFound)\r\n : symbols ? symRE.test(strFound)\r\n : true);\r\n }\r\n\r\n function alphaSwap(strFound) {\r\n const chars = [...strFound];\r\n const idx = chars.findIndex(v => /[a-z]/i.test(v));\r\n [chars[0], chars[idx]] = [chars[idx], chars[0]];\r\n return chars.join(``);\r\n }\r\n\r\n function randomString( {len = 12, includeUppercase = true, includeNumbers, includeSymbols, startAlphabetic} = {} ) {\r\n len = len < 6 ? 6 : len;\r\n let chrs2Use = shuffle( getChars2Use( { UC: includeUppercase, Nrs: includeNumbers, Sym: includeSymbols } ) );\r\n\r\n while (chrs2Use.length < len) { chrs2Use = [...chrs2Use, ...shuffle(chrs2Use)]; }\r\n\r\n let strFound = chrs2Use.slice(0, len).join(``);\r\n\r\n if (!(includeNumbers || includeSymbols)) { return strFound; }\r\n\r\n for (let i = 0; i < chrs2Use.length; i += 1) {\r\n strFound = chrs2Use.slice(i, i + len).join(``);\r\n\r\n if (strTest(strFound, includeNumbers, includeSymbols)) {\r\n return startAlphabetic && !/^[a-z]/i.test(strFound) ? alphaSwap(strFound) : strFound;\r\n }\r\n }\r\n\r\n return randomString({len, includeUppercase, includeNumbers, includeSymbols, startAlphabetic});\r\n }\r\n\r\n return { randomString, uuid4 };\r\n}\r\n", "const defaultInterpolator = interpolateFactory();\r\nexport {defaultInterpolator as default, interpolateFactory};\r\n\r\n/**\r\n * Factory function to create an interpolate function with a default replacer.\r\n * @param {string} defaultReplacer - Default value to use for missing tokens.\r\n * @returns {Function} - The interpolation function.\r\n */\r\nfunction interpolateFactory(defaultReplacer = \"\") {\r\n defaultReplacer = defaultReplacer?.constructor === String ? defaultReplacer : \"\";\r\n\r\n /**\r\n * Main interpolation function.\r\n * @param {string} str - The string with placeholders.\r\n * @param {...object} tokens - Objects containing replacement values.\r\n * @returns {string} - The interpolated string.\r\n */\r\n return function(str, ...tokens) {\r\n return interpolate(str, processTokens(tokens));\r\n }\r\n\r\n /**\r\n * Handle invalid keys by returning the default replacer or the key in braces.\r\n * @param {string} key - The placeholder key.\r\n * @param {boolean} keyExists - Flag indicating if the key exists in the token.\r\n * @returns {string} - The replacement value.\r\n */\r\n function invalidate(key, keyExists) {\r\n if (keyExists && defaultReplacer.length > 0) {\r\n return String(defaultReplacer);\r\n }\r\n\r\n return `{${key}}`;\r\n }\r\n\r\n /**\r\n * determine if [value] is a String or Number\r\n * @param {any} value\r\n * @returns {boolean}\r\n */\r\n function isStringOrNumber(value ) {\r\n return value?.constructor === String || value?.constructor === Number && !Number.isNaN(value);\r\n }\r\n\r\n /**\r\n * Get the replacement value for a key from the token.\r\n * @param {string} key - The placeholder key.\r\n * @param {object} token - The token object containing replacement values.\r\n * @returns {string} - The replacement value.\r\n */\r\n function replacement(key, token) {\r\n const isValid = key in token;\r\n return isValid && isStringOrNumber(token[key]) ? String(token[key]) : invalidate(key, isValid);\r\n }\r\n\r\n /**\r\n * Create a lambda function for replacing placeholders in the string.\r\n * @param {object<string, string>} token - The token object containing replacement values.\r\n * @returns {Function} - The replacer lambda function.\r\n */\r\n function getReplacerLambda(token) {\r\n return (...args) => {\r\n const replacementObject = args.find(a => a.key);\r\n return replacement((replacementObject ? replacementObject.key : `_`), token);\r\n };\r\n }\r\n\r\n /**\r\n * Replace placeholders in the string with values from the token.\r\n * @param {string} str - The string with placeholders.\r\n * @param {object} token - The token object containing replacement values.\r\n * @returns {string} - The interpolated string.\r\n */\r\n function replace(str, token) {\r\n return str.replace(/\\{(?<key>[a-z_\\d]+)}/gim, getReplacerLambda(token));\r\n }\r\n\r\n /**\r\n * Convert token object to array of token Objects\r\n * when it's values are arrays of values.\r\n * @param {object} tokenObject - The token object containing arrays of values.\r\n * @returns {object[]} - Array of token objects.\r\n */\r\n /* node:coverage disable (internal method, not covered by tests)*/\r\n function convertTokensFromArrayValues(tokenObject) {\r\n const converted = [];\r\n\r\n Object.entries(tokenObject).forEach(([key, value]) => {\r\n value.forEach((v, i) => (converted[i] ??= {}, converted[i][key] = v));\r\n });\r\n\r\n return converted;\r\n }\r\n\r\n /**\r\n * Check if single token and its values are arrays.\r\n * @param {object[]} tokens - The tokens to check.\r\n * @returns {boolean} - True if tokens contains one Object\r\n * and all it's values are of type Array.\r\n */\r\n function isMultiLineWithArrays(tokens) {\r\n return tokens.length === 1 && Object.values(tokens[0]).every(Array.isArray);\r\n }\r\n\r\n /**\r\n * Process tokens to handle multi-line formats.\r\n * @param {object[]} tokens - The tokens to process.\r\n * @returns {object[]} - Processed tokens.\r\n */\r\n function processTokens(tokens) {\r\n return isMultiLineWithArrays(tokens) ? convertTokensFromArrayValues(tokens[0]) : tokens;\r\n }\r\n\r\n /**\r\n * Determine [value] is a real Object and contains keys and values\r\n * @param {any} value\r\n * @returns {boolean}\r\n */\r\n function isKeyValueObject(value) {\r\n return !Array.isArray(value) && value?.constructor === Object && Object.entries(value)?.length > 0;\r\n }\r\n\r\n /**\r\n * Interpolate the string with the given tokens.\r\n * @param {string} str - The string with placeholders.\r\n * @param {object[]} tokens - The tokens containing replacement values.\r\n * @returns {string} - The interpolated string.\r\n */\r\n function interpolate(str, tokens) {\r\n return !tokens?.length ? str : tokens\r\n .filter(token => token)\r\n .map((token, i) => isKeyValueObject(token) ? replace(str, {...token, index: i+1}) : ``)\r\n .join(``);\r\n }\r\n}\r\n", "export default createRegExp\r\n\r\nfunction createRegExp(str, ...args) {\r\n args = !str.raw ? [args] : args;\r\n try {\r\n return regExp(str, ...args);\r\n } catch (err) {\r\n const flags = resolveFlags();\r\n const raw = str.raw || str;\r\n return `Error creating Regular Expression from string \"${raw}\" with flags ${flags}` +\r\n `\\nRegExp error message: \"${err.message}\"`;\r\n }\r\n}\r\n\r\nfunction resolveFlags(...args) {\r\n return args.length > 0\r\n ? Array.isArray(args.slice(-1))\r\n ? args.pop().join(``) : args.join(``) : ``;\r\n}\r\n\r\nfunction regExp(regexStr, ...args) {\r\n const flags = resolveFlags(...args);\r\n args = [];\r\n const raw = regexStr.raw || [regexStr];\r\n\r\n return new RegExp(\r\n (args.length &&\r\n raw.reduce( (a, v, i ) => a.concat(args[i-1] || ``).concat(v), ``) ||\r\n raw?.join(``))\r\n .split(`\\n`)\r\n .map( line => line.replace(/\\s|\\/\\/.*$/g, ``).trim().replace(/(@s!)/g, ` `) )\r\n .join(``), flags);\r\n}\r\n", "import {\r\n isArrayOf,\r\n isNumber,\r\n quotGetters4Instance as quotGetters,\r\n getStringValue,\r\n escapeRE,\r\n customMethods,\r\n interpolate,\r\n clone } from \"./genericMethods.js\";\r\n\r\nexport {\r\n format,\r\n ucFirst,\r\n truncate,\r\n trimAll,\r\n replaceWords,\r\n indexOf,\r\n lastIndexOf,\r\n insert,\r\n append,\r\n isNumber,\r\n prefix,\r\n getStringValue,\r\n toCamelcase,\r\n wordsFirstUp,\r\n toDashedNotation,\r\n quotGetters,\r\n surroundWith,\r\n toSnakeCase,\r\n customMethods,\r\n clone,\r\n};\r\n\r\nfunction checkAndRun(string, fn, or) {\r\n string = getStringValue(string);\r\n return string.length > 0 ? fn(string) : or || string;\r\n}\r\n\r\nfunction ucFirst(string) {\r\n return checkAndRun(string, () => `${string[0].toUpperCase()}${string.slice(1)}`);\r\n}\r\n\r\nfunction format(string, ...tokens) {\r\n return checkAndRun(string, () => `${interpolate(string, ...tokens)}`);\r\n}\r\n\r\nfunction surroundWith(string, start, end) {\r\n if (!start && !end) {\r\n return string;\r\n }\r\n [start, end] = isArrayOf(String, [start, end ?? ``]) ? [start, end] : [``, ``];\r\n return `${start}${string}${end || start}`;\r\n}\r\n\r\nfunction toDashedNotation(string) {\r\n return checkAndRun(string, () =>\r\n string\r\n .replace(/\\s/g, '')\r\n .replace(/[A-Z]/g, a => `-${a.toLowerCase()}`)\r\n .replace(/-{2,}/g, `-`)\r\n .replace(/[^a-z-]/g, ``)\r\n .replace(/^-|-$/, ``)\r\n );\r\n}\r\n\r\nfunction toSnakeCase(string) {\r\n return checkAndRun(string, () =>\r\n string\r\n .replace(/\\s/g, '')\r\n .replace(/[A-Z]/g, a => `_${a.toLowerCase()}`)\r\n .replace(/_{2,}/g, `_`)\r\n .replace(/[^a-z_]/g, ``)\r\n .replace(/^_|_$/, ``)\r\n );\r\n}\r\n\r\nfunction wordsFirstUp(string) {\r\n return checkAndRun(string, () => [...string.toLowerCase()].slice(1).reduce( (acc, v) =>\r\n acc + ( !/\\p{L}|[-']/u.test(acc.at(-1)) ? v.toUpperCase() : v.toLowerCase() ),\r\n string[0].toUpperCase()\r\n ));\r\n}\r\n\r\nfunction toCamelcase(string) {\r\n return checkAndRun(string, () =>\r\n string.toLowerCase()\r\n .trim()\r\n .split(/[- ]/)\r\n .filter(l => l && l.length > 0)\r\n .map( (str, i) => i > 0 && `${ucFirst(str)}`|| str)\r\n .join(``)\r\n );\r\n}\r\n\r\nfunction getWordBoundary(string) {\r\n const match = [...string.matchAll(/\\p{Pe}|\\p{Z}/gu)].at(-1);\r\n return match?.index ?? string.length;\r\n}\r\n\r\nfunction truncate(string, {at, html = false, wordBoundary = false} = {} ) {\r\n html = html?.constructor === Boolean && html || false;\r\n wordBoundary = wordBoundary?.constructor === Boolean && wordBoundary || false;\r\n return checkAndRun(string, () => {\r\n if (string.length <= at) { return string; }\r\n\r\n const subString = string.slice(0, at - 1);\r\n const endwith = html ? \"…\" : `...`;\r\n const boundary = wordBoundary\r\n ? getWordBoundary(subString)\r\n : subString.length;\r\n\r\n return (wordBoundary\r\n ? subString.slice(0, boundary+1).trim()\r\n : subString) + endwith;\r\n }\r\n );\r\n}\r\n\r\nfunction trimAll(string, keepLines = false) {\r\n keepLines = keepLines?.constructor === Boolean && keepLines || false;\r\n return checkAndRun(string, () => {\r\n const lines = string.replace(/\\n/gm, `#LF#`)\r\n .split(/#LF#/)\r\n .map(line => line.trim().replace(/\\s{2,}/g, a => a[0]) );\r\n return keepLines\r\n ? lines.join(`#LF#`).replace(/#LF#/g, `\\n`).trim()\r\n : lines.filter(l => l.length > 0).join(`\\n`);\r\n });\r\n}\r\n\r\nfunction replaceWords(string, { replacements = {}, caseSensitive = false} = {}) {\r\n string = getStringValue(string);\r\n let replacements2Array = Object.entries(replacements).flat();\r\n const cando = isArrayOf(String, replacements2Array) && caseSensitive?.constructor === Boolean;\r\n const modifiers = `g${!caseSensitive ? 'i' : ''}`;\r\n\r\n if (!cando) { return string; }\r\n\r\n while (replacements2Array.length) {\r\n const [initial, replacement] = [replacements2Array.shift(), replacements2Array.shift()];\r\n const re = escapeRE(initial, modifiers);\r\n string = string.replace(re, replacement);\r\n }\r\n\r\n return string;\r\n}\r\n\r\n// SEE https://youtu.be/99Zacm7SsWQ?t=2101\r\nfunction indexOf(string, findMe, fromIndex = 0) {\r\n string = getStringValue(string);\r\n fromIndex = isNumber(fromIndex) && fromIndex || 0;\r\n const index = string.indexOf(findMe, fromIndex || 0);\r\n return index < 0 ? undefined : index;\r\n}\r\n\r\nfunction lastIndexOf(string, findMe, beforeIndex = 0) {\r\n string = getStringValue(string);\r\n beforeIndex = isNumber(beforeIndex) && beforeIndex || string.length;\r\n const index = string.lastIndexOf(findMe, beforeIndex);\r\n return index < 0 ? undefined : index;\r\n}\r\n\r\nfunction insert(string, { value, values, at = 0 } = {}) {\r\n string = getStringValue(string);\r\n at = isNumber(at) && at || 0;\r\n const valuesMaybeValue = getStringValue(values);\r\n values = getStringValue(value).length\r\n ? value\r\n : valuesMaybeValue.length\r\n ? valuesMaybeValue\r\n : isArrayOf(String, values)\r\n ? values.map(v => getStringValue(v)).join(``)\r\n : [];\r\n\r\n return values.length <= 1\r\n ? string\r\n : string.length === 0\r\n ? `${values}${string}`\r\n : `${string.slice(0, at)}${values}${string.slice(at)}`;\r\n}\r\n\r\nfunction prefix(string, ...strings) {\r\n strings = isArrayOf(String, strings) && strings;\r\n return strings ? insert(getStringValue(string), {values: strings, at: 0}) : getStringValue(string);\r\n}\r\n\r\nfunction append(string, ...strings2Append) {\r\n strings2Append = isArrayOf(String, strings2Append) && strings2Append;\r\n\r\n if (strings2Append && strings2Append.length > 0) {\r\n return `${getStringValue(string)}`.concat(strings2Append.join(``))\r\n }\r\n\r\n return getStringValue(string);\r\n}\r\n", "import {\r\n format,\r\n ucFirst,\r\n truncate,\r\n trimAll,\r\n replaceWords,\r\n indexOf,\r\n lastIndexOf,\r\n insert,\r\n append,\r\n prefix,\r\n getStringValue,\r\n quotGetters,\r\n surroundWith,\r\n toCamelcase,\r\n wordsFirstUp,\r\n toDashedNotation,\r\n toSnakeCase,\r\n customMethods,\r\n isNumber,\r\n clone,\r\n} from \"./instanceMethods.js\";\r\n\r\nexport default instanceCreator;\r\n\r\nconst deprecatedRE = /symbol|anchor|big|blink|bold|fixed|fontsize|fontcolor|italics|link|small|strike|sup|sub/i\r\n\r\nfunction instanceCreator({initialstring} = {}) {\r\n let customStringExtensions = { };\r\n let instance = new Proxy(customStringExtensions, getTraps(customStringExtensions));\r\n let actualValue = getStringValue(initialstring);\r\n let history = [actualValue];\r\n const descriptorProps = {configurable: false, enumerable: false};\r\n \r\n Object.defineProperties( customStringExtensions, {\r\n append: { ...descriptorProps, value(...strings) { return wrap(append(actualValue, ...strings)); } },\r\n enclose: { ...descriptorProps, value(start, end) { return wrap(surroundWith(actualValue, start, end)); } },\r\n format: { ...descriptorProps, value(...tokens) { return wrap(format(actualValue, ...tokens)); } },\r\n indexOf: { ...descriptorProps, value(str) { return indexOf(actualValue, str); } },\r\n interpolate: { ...descriptorProps, value(...tokens) { return wrap(format(actualValue, ...tokens)); } },\r\n insert: { ...descriptorProps, value({ value, values, at } = {}) { \r\n return wrap(insert(actualValue, { value, values, at })); \r\n } \r\n },\r\n lastIndexOf: { ...descriptorProps, value(str) { return lastIndexOf(actualValue, str); } },\r\n prefix: { ...descriptorProps, value(...strings) { return wrap(prefix(actualValue, ...strings)); } },\r\n replaceWords: { ...descriptorProps, value({caseSensitive = false, replacements = {}} = {}) {\r\n return wrap(replaceWords(actualValue, { replacements: replacements ?? {}, caseSensitive }));\r\n } },\r\n toString: { ...descriptorProps, value() { return actualValue; } },\r\n truncate: { ...descriptorProps, value({at, html = false, wordBoundary = false} = {}) {\r\n return wrap(truncate(actualValue, {at, html, wordBoundary})); } },\r\n valueOf: { ...descriptorProps, value() { return actualValue; } },\r\n undoLast: { ...descriptorProps, value(nSteps) { return undoSteps(nSteps); } },\r\n\r\n camelCase: { ...descriptorProps, get() { return wrap(toCamelcase(getStringValue(actualValue))); } }, \r\n clone: { ...descriptorProps, get() { return clone(instance, customMethods); } },\r\n firstUp: { ...descriptorProps, get() { return wrap(ucFirst(getStringValue(actualValue))); } },\r\n history: { ...descriptorProps, get() { return history; }, set(value) { history = value; } },\r\n empty: { ...descriptorProps, get() { return actualValue.length < 1; } },\r\n notEmpty: { ...descriptorProps, get() { return actualValue.length < 1 ? undefined: instance; } },\r\n kebabCase: { ...descriptorProps, get() { return wrap(toDashedNotation(getStringValue(actualValue))); } },\r\n quote: quotGetters(instance, wrap),\r\n snakeCase: { ...descriptorProps, get() { return wrap(toSnakeCase(getStringValue(actualValue))); } },\r\n trimAll: { ...descriptorProps, get() { return wrap(trimAll(actualValue)); } },\r\n trimAllKeepLF: { ...descriptorProps, get() { return wrap(trimAll(actualValue, true)); } },\r\n undoAll: { ...descriptorProps, get() { return undoAll(); } },\r\n undo: { ...descriptorProps, get() { return undoLast(); } },\r\n wordsUCFirst: { ...descriptorProps, get() { return wrap(wordsFirstUp(getStringValue(actualValue))); } },\r\n value: { ...descriptorProps, \r\n get() { return actualValue; }, \r\n set(value) {\r\n const nwValue = getStringValue(value);\r\n if (nwValue.length) {\r\n actualValue = nwValue;\r\n history.push(nwValue); \r\n }\r\n }\r\n },\r\n });\r\n \r\n injectCustomMethods(customMethods);\r\n \r\n return instance;\r\n \r\n function getTraps(extensions) {\r\n return {\r\n get( target, key ) {\r\n return key in extensions\r\n ? extensions[key]\r\n : canWrapNative(String(key))\r\n ? wrapNative(key)\r\n : undefined;\r\n },\r\n };\r\n }\r\n \r\n function canWrapNative(key) {\r\n return !deprecatedRE.test(key)\r\n && key in String.prototype;\r\n }\r\n \r\n function wrapNative(key) {\r\n return actualValue[key] instanceof Function\r\n ? function(...args) {\r\n const result = actualValue[key](...args); \r\n return result?.constructor === String ? wrap(actualValue[key](...args)) : result; \r\n } : actualValue[key];\r\n }\r\n \r\n function undoAll() {\r\n while(history.length > 1) { history.pop(); }\r\n actualValue = history.at(-1);\r\n return wrap(actualValue, false);\r\n }\r\n \r\n function undoSteps(steps) {\r\n if (!isNumber(steps)) {\r\n return wrap(actualValue, false); \r\n }\r\n \r\n const historyLen = history.length;\r\n \r\n if (steps >= historyLen || steps < 1) {\r\n history = history.slice(0, 1);\r\n actualValue = history.at(-1); \r\n return wrap(history.at(-1), false); \r\n }\r\n \r\n history = history.slice(0, historyLen - steps);\r\n \r\n actualValue = history.at(-1);\r\n return wrap(actualValue, false);\r\n }\r\n \r\n function undoLast() {\r\n if (history.length === 1) {\r\n return wrap(history[0]);\r\n }\r\n \r\n history.pop();\r\n actualValue = history.at(-1);\r\n return wrap(actualValue, false);\r\n }\r\n \r\n function wrap(result, pushHistory = true) {\r\n const changed = actualValue !== result;\r\n changed && pushHistory && history.push(result);\r\n actualValue = result;\r\n return instance;\r\n }\r\n \r\n function injectCustomMethods(customMethods) {\r\n Object.entries(customMethods).forEach(([methodName, methodContainer]) => {\r\n const {enumerable, method, isGetter} = methodContainer;\r\n const configurable = false\r\n const descriptor = isGetter\r\n ? { get() { return wrap(method(instance).value); }, enumerable, configurable }\r\n : { value(...args) { return wrap(method(instance, ...args).value); }, enumerable, configurable };\r\n \r\n Object.defineProperty(customStringExtensions, methodName, descriptor);\r\n });\r\n }\r\n}\r\n", "import {default as randomString, uuid4} from \"./Factories/randomStringFactory.js\";\r\nimport interpolate from \"./Factories/interpolateFactory.js\";\r\nimport createRegExp from \"./Factories/regExpFromMultilineStringFactory.js\";\r\nimport createInstance from \"./extensions.js\";\r\nconst customMethods = {};\r\nconst quotingStyles = defineQuotingStyles();\r\n\r\nexport {\r\n customMethods,\r\n CustomStringConstructor,\r\n isNumber,\r\n isArrayOf,\r\n defineQuotingStyles,\r\n quotGetters4Instance,\r\n getStringValue,\r\n escapeRE,\r\n resolveTemplateString,\r\n clone,\r\n interpolate,\r\n quotingStyles,\r\n};\r\n\r\ncreateExtendedCTOR(CustomStringConstructor, customMethods);\r\n\r\nfunction CustomStringConstructor(str, ...args) {\r\n const instance = createInstance({initialstring: resolveTemplateString(str, ...args)});\r\n Object.defineProperty( instance,\r\n `constructor`, { get() { return CustomStringConstructor; }, enumerable: false}\r\n );\r\n return Object.freeze(instance);\r\n}\r\n\r\nfunction resolveTemplateString(str, ...args) {\r\n return str?.raw\r\n ? String.raw({ raw: str }, ...args)\r\n : getStringValue(str).length ? str : \"\";\r\n}\r\n\r\nfunction isArrayOf(type, value, includeInstances = true) {\r\n return Array.isArray(value) && value.length > 0 && !value.find(v => checkType(type, v, includeInstances));\r\n}\r\n\r\nfunction clone(instance) {\r\n const newInstance = CustomStringConstructor(instance.value);\r\n newInstance.history = [...instance.history];\r\n return newInstance;\r\n}\r\n\r\nfunction getStringValue(string) {\r\n return string?.value || (string?.constructor === String && string) || ``;\r\n}\r\n\r\nfunction isNumber(value) {\r\n return value?.constructor === Number && !Number.isNaN(value);\r\n}\r\n\r\nfunction escapeRE(reString, modifiers) {\r\n return new RegExp(reString.replace(/\\p{S}|\\p{P}/gu, a => `\\\\${a}`), modifiers);\r\n}\r\n\r\nfunction escape4RE(reString) {\r\n return reString.replace(/\\p{S}|\\p{P}/gu, a => `\\\\${a}`);\r\n}\r\n\r\nfunction infoValue(key, infoValue) {\r\n return `${key} (${infoValue})`;\r\n}\r\n\r\nfunction getPlainValues() {\r\n return {\r\n value: `getter/setter`,\r\n clone: `chainable getter`,\r\n notEmpty: `chainable getter|undefined`,\r\n quote: `Object. See [constructor].quoteInfo`,\r\n };\r\n}\r\n\r\nfunction getSWInformation(notChainable) {\r\n const firstLines = CustomStringConstructor(decode());\r\n const plainValues = getPlainValues();\r\n\r\n return firstLines.split(/\\n/)\r\n .concat(\r\n Object.entries(Object.getOwnPropertyDescriptors(firstLines))\r\n .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))\r\n .map(([key, descriptr]) => {\r\n const isChainable = !notChainable.find(k => k === key);\r\n const isGetter = 'get' in descriptr;\r\n const isMethod = 'value' in descriptr;\r\n const isNative = key in String.prototype;\r\n const isPlainValue = !isNative && key in plainValues;\r\n const custom = key in customMethods ? ` *custom*` : ``;\r\n const getter = isGetter && isChainable ? `chainable getter${custom}` : `getter`;\r\n const method = isMethod && isChainable ? `chainable method${custom}` : `method`;\r\n const native = isNative && `${descriptr.get ? `getter` : `method`} (override)`;\r\n\r\n switch (true) {\r\n case isPlainValue: return infoValue(key, plainValues[key]);\r\n case isNative: return infoValue(key, native);\r\n case isMethod: return infoValue(key, method);\r\n case isGetter: return infoValue(key, getter);\r\n }\r\n }\r\n )\r\n );\r\n}\r\n\r\nfunction quotGetters4Instance(instance, wrap) {\r\n wrap = wrap ?? function(me) { return me; };\r\n return {\r\n value: {\r\n get backtick() { return instance.enclose(...quotingStyles.backtick); },\r\n get bracket() { return instance.enclose(...quotingStyles.bracket); },\r\n get curlyDouble() { return instance.enclose(...quotingStyles.curlyDouble); },\r\n get curlyDoubleInward() { return instance.enclose(...quotingStyles.curlyDoubleInward); },\r\n get curlyDoubleEqual() { return instance.enclose(...quotingStyles.curlyDoubleEqual); },\r\n get curlyLHDoubleInward() { return instance.enclose(...quotingStyles.curlyLHDoubleInward); },\r\n get curlyLHSingle() { return instance.enclose(...quotingStyles.curlyLHSingle); },\r\n get curlyLHSingleInward() { return instance.enclose(...quotingStyles.curlyLHSingleInward); },\r\n get curlySingle() { return instance.enclose(...quotingStyles.curlySingle); },\r\n get curlySingleEqual() { return instance.enclose(...quotingStyles.curlySingleEqual); },\r\n get curlySingleInward() { return instance.enclose(...quotingStyles.curlySingleInward); },\r\n get custom() { return (start, end) => instance.enclose(...[start, end ?? start]); },\r\n get double() { return instance.enclose(...quotingStyles.double); },\r\n get guillemets() { return instance.enclose(...quotingStyles.guillemets); },\r\n get guillemetsInward() { return instance.enclose(...quotingStyles.guillemetsInward); },\r\n get guillemetsSingle() { return instance.enclose(...quotingStyles.guillemetsSingle); },\r\n get guillemetsSingleInward() { return instance.enclose(...quotingStyles.guillemetsSingleInward); },\r\n get remove() { return wrap(`${instance.value.replace(quotingStyles.re, ``)}`); },\r\n get single() { return instance.enclose(...quotingStyles.single); },\r\n get squareBrackets() { return instance.enclose(...quotingStyles.squareBrackets); },\r\n },\r\n enumerable: false,\r\n configurable: false,\r\n };\r\n}\r\n\r\nfunction decode() {\r\n return atob`Rm9yIHRoZSByZWNvcmQ6CltjbV0gY2hhaW5hYmxlIGdldHRlcnMvbWV0aG9kcyBtb2RpZnkgdGhlIGluc3RhbmNlIHN0cmluZwpbY21dIGluZGV4T2Ygb3ZlcnJpZGVzIHJldHVybnMgW3VuZGVmaW5lZF0gaWYgbm90aGluZyB3YXMgZm91bmQgKHNvIG9uZSBjYW4gdXNlIFtsYXN0SV1pbmRleE9mKFtzb21lIHN0cmluZyB2YWx1ZV0pID8/IDAKW2NtXSBpbmNsdWRlcyBpbmZvcm1hdGlvbiBmb3IgY3VzdG9tIG1ldGhvZHMvZ2V0dGVycyBpZiBhcHBsaWNhYmxl`.replace(/\\[cm]/g, `\\u2714`);\r\n}\r\n\r\nfunction defineQuotingStyles() {\r\n // see https://en.wikipedia.org/wiki/Quotation_mark\r\n const quots = {\r\n backtick: [\"`\", \"`\"],\r\n bracket: [`{`, `}`],\r\n curlyDoubleInward: [`\u201D`, `\u201C`],\r\n curlyDouble: [`\u201C`, `\u201D`],\r\n curlyDoubleEqual: [`\u201C`, `\u201C`],\r\n curlyLHDouble: [`\u201E`, `\u201D`],\r\n curlyLHDoubleInward: [`\u201E`, `\u201C`],\r\n curlyLHSingle: [`\u201A`, `\u2019`],\r\n curlyLHSingleInward: [`\u201A`, `\u2018`],\r\n curlySingle: [`\u201B`, `\u2019`],\r\n curlySingleEqual: [`\u201B`, `\u201B`],\r\n curlySingleInward: [`\u2019`, `\u201B`],\r\n double: [`\"`, `\"`],\r\n guillemets: [`\u00AB`, `\u00BB`],\r\n guillemetsInward: [`\u00BB`, `\u00AB`],\r\n guillemetsSingle: [`\u2039`, `\u203A`],\r\n guillemetsSingleInward: [`\u203A`, `\u2039`],\r\n single: [`'`, `'`],\r\n squareBrackets: [`[`, `]`],\r\n };\r\n const regExpValues = escape4RE([...new Set(\r\n Object.values(quots)\r\n .filter(v => Array.isArray(v))\r\n .flat())].join(``));\r\n quots.re = RegExp(`^[${regExpValues}]|[${regExpValues}]$`, \"g\");\r\n\r\n return quots;\r\n}\r\n\r\nfunction createExtendedCTOR(ctor, customMethods) {\r\n const instanceQuotGetters4Info = quotGetters4Instance(ctor());\r\n Symbol.toSB = Symbol.for(`toStringBuilder`);\r\n Object.defineProperty(String.prototype, Symbol.toSB, {\r\n get() { return ctor(this); },\r\n enumerable: false,\r\n configurable: false });\r\n const notChainable = `constructor,history,indexOf,toString,value,valueOf,empty`.split(`,`);\r\n Object.defineProperties(ctor, {\r\n create: {\r\n get() { return ctor(); },\r\n enumerable: false\r\n },\r\n constructor: {\r\n get() { return ctor; },\r\n enumerable: false,\r\n },\r\n format: {\r\n value(str, ...tokens) {\r\n return CustomStringConstructor(str).format(...tokens);\r\n }\r\n },\r\n addCustom: {\r\n value( { name, method, enumerable = false, isGetter = false } = {} ) {\r\n if (CustomStringConstructor``[name]) {\r\n console.error(`addCustom: the property \"${name}\" exists and can not be redefined`);\r\n return `addCustom: the property \"${name}\" exists and can not be redefined`;\r\n }\r\n\r\n if (name?.constructor === String && method?.constructor === Function && method.length > 0) {\r\n customMethods[name] = {method, enumerable, isGetter};\r\n return `addCustom: the ${isGetter ? `getter` : `method`} named \"${name}\" is added`;\r\n }\r\n }\r\n },\r\n info: {\r\n get() { return getSWInformation(notChainable); }\r\n },\r\n keys: {\r\n get() {\r\n return Object.keys(Object.getOwnPropertyDescriptors(CustomStringConstructor``)).sort( (a,b) => a.localeCompare(b) )\r\n .map(v => !/constructor|toString|valueOf/.test(v) && v in customMethods ? `${v} *custom*` : v);\r\n }\r\n },\r\n quoteInfo: {\r\n get() {\r\n return Object.entries(Object.getOwnPropertyDescriptors(instanceQuotGetters4Info.value))\r\n .sort( (a,b) => a[0].localeCompare(b[0]) )\r\n .reduce((acc, [k, v]) => {\r\n if (k === `remove`) { return [...acc, `[instance].quote.remove (only predefined)`]; }\r\n if (k === `custom`) { return [...acc, `[instance].quote.custom(start:string, end:string)`]; }\r\n\r\n const val = ctor(` [instance] `).quote[k];\r\n return [...acc, `[instance].quote.${k} (${val})`];\r\n }, []);\r\n }\r\n },\r\n uuid4: {\r\n get() { return CustomStringConstructor(uuid4()); }\r\n },\r\n randomString: {\r\n value: function({len, includeUppercase, includeNumbers, includeSymbols, startAlphabetic} = {}) {\r\n return CustomStringConstructor(randomString({len, includeUppercase, includeNumbers, includeSymbols, startAlphabetic}));\r\n }\r\n },\r\n regExp: { value: createRegExp }\r\n });\r\n\r\n return ctor;\r\n}\r\n\r\nfunction checkType(type, item, includeInstances) {\r\n return type === String && includeInstances\r\n ? item?.constructor !== CustomStringConstructor && item?.constructor !== type\r\n : item?.constructor !== type;\r\n}\r\n", "import { CustomStringConstructor } from \"./src/genericMethods.js\";\r\nconst defaultStringCTOR = CustomStringConstructor;\r\n\r\nexport {defaultStringCTOR as default, CustomStringConstructor};\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["randomString", "uuid4", "randomStringGeneratorFactory", "randomStringGeneratorFactory", "hasCrypto", "checkBrowserCrypto", "getRandomValue", "randomNr", "min", "max", "range", "start", "len", "reMap", "_", "i", "map2Chrs", "v", "symbols", "symRE", "shuffle", "array", "ri", "UC", "LC", "allChars", "getChars2Use", "use", "acc", "key", "value", "uuid4", "strTest", "strFound", "numbers", "alphaSwap", "chars", "idx", "randomString", "includeUppercase", "includeNumbers", "includeSymbols", "startAlphabetic", "chrs2Use", "defaultInterpolator", "interpolateFactory", "interpolateFactory", "defaultReplacer", "str", "tokens", "interpolate", "processTokens", "invalidate", "key", "keyExists", "isStringOrNumber", "value", "replacement", "token", "isValid", "getReplacerLambda", "args", "replacementObject", "a", "replace", "convertTokensFromArrayValues", "tokenObject", "converted", "v", "i", "isMultiLineWithArrays", "isKeyValueObject", "regExpFromMultilineStringFactory_default", "createRegExp", "str", "args", "regExp", "err", "flags", "resolveFlags", "regexStr", "raw", "a", "v", "i", "line", "checkAndRun", "string", "fn", "or", "getStringValue", "ucFirst", "format", "tokens", "defaultInterpolator", "surroundWith", "start", "end", "isArrayOf", "toDashedNotation", "a", "toSnakeCase", "wordsFirstUp", "acc", "v", "toCamelcase", "l", "str", "i", "getWordBoundary", "truncate", "at", "html", "wordBoundary", "subString", "endwith", "boundary", "trimAll", "keepLines", "lines", "line", "replaceWords", "replacements", "caseSensitive", "replacements2Array", "cando", "modifiers", "initial", "replacement", "re", "escapeRE", "indexOf", "findMe", "fromIndex", "isNumber", "index", "lastIndexOf", "beforeIndex", "insert", "value", "values", "valuesMaybeValue", "prefix", "strings", "append", "strings2Append", "extensions_default", "instanceCreator", "deprecatedRE", "initialstring", "customStringExtensions", "instance", "getTraps", "actualValue", "getStringValue", "history", "descriptorProps", "strings", "wrap", "append", "start", "end", "surroundWith", "tokens", "format", "str", "indexOf", "value", "values", "at", "insert", "lastIndexOf", "prefix", "caseSensitive", "replacements", "replaceWords", "html", "wordBoundary", "truncate", "nSteps", "undoSteps", "toCamelcase", "clone", "customMethods", "ucFirst", "toDashedNotation", "quotGetters4Instance", "toSnakeCase", "trimAll", "undoAll", "undoLast", "wordsFirstUp", "nwValue", "injectCustomMethods", "extensions", "target", "key", "canWrapNative", "wrapNative", "args", "result", "steps", "isNumber", "historyLen", "pushHistory", "methodName", "methodContainer", "enumerable", "method", "isGetter", "configurable", "customMethods", "quotingStyles", "defineQuotingStyles", "createExtendedCTOR", "CustomStringConstructor", "customMethods", "str", "args", "instance", "extensions_default", "resolveTemplateString", "getStringValue", "isArrayOf", "type", "value", "includeInstances", "v", "checkType", "clone", "newInstance", "string", "isNumber", "escapeRE", "reString", "modifiers", "a", "escape4RE", "infoValue", "key", "getPlainValues", "getSWInformation", "notChainable", "firstLines", "decode", "plainValues", "keyA", "keyB", "descriptr", "isChainable", "k", "isGetter", "isMethod", "isNative", "isPlainValue", "custom", "getter", "method", "native", "quotGetters4Instance", "wrap", "me", "quotingStyles", "start", "end", "defineQuotingStyles", "quots", "regExpValues", "ctor", "instanceQuotGetters4Info", "tokens", "name", "enumerable", "b", "acc", "val", "uuid4", "len", "includeUppercase", "includeNumbers", "includeSymbols", "startAlphabetic", "randomString", "regExpFromMultilineStringFactory_default", "item", "defaultStringCTOR", "CustomStringConstructor"]
|
|
7
7
|
}
|
package/README.md
CHANGED
|
@@ -16,6 +16,7 @@ A constructor to create *mutable* strings.
|
|
|
16
16
|
- retains history of changes
|
|
17
17
|
- no external dependencies
|
|
18
18
|
- instances can use/chain native String getters/methods (e.g. `length`, `split`)
|
|
19
|
+
- 100% test coverage
|
|
19
20
|
|
|
20
21
|
**<a target="_blank" href="https://kooiinc.github.io/js-stringweaver/Examples">Demonstration / Documentation</a>**
|
|
21
22
|
|
package/package.json
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "stringweaver",
|
|
3
|
-
"type": "module",
|
|
4
|
-
"version": "1.2.
|
|
5
|
-
"private": false,
|
|
6
|
-
"main": "./index.js",
|
|
7
|
-
"sideEffects": false,
|
|
8
|
-
"description": "A JS stringbuilder utility",
|
|
9
|
-
"keywords": [
|
|
10
|
-
"JS",
|
|
11
|
-
"ES20xx",
|
|
12
|
-
"String",
|
|
13
|
-
"Stringbuilder",
|
|
14
|
-
"String",
|
|
15
|
-
"Utilities",
|
|
16
|
-
"Classfree Object Oriented"
|
|
17
|
-
],
|
|
18
|
-
"scripts": {
|
|
19
|
-
"test": "@node --test --experimental-test-coverage
|
|
20
|
-
},
|
|
21
|
-
"author": "KooiInc",
|
|
22
|
-
"license": "MIT",
|
|
23
|
-
"repository": {
|
|
24
|
-
"type": "git",
|
|
25
|
-
"url": "git+https://github.com/KooiInc/js-stringweaver.git"
|
|
26
|
-
},
|
|
27
|
-
"bugs": {
|
|
28
|
-
"url": "https://github.com/KooiInc/js-stringweaver/issues"
|
|
29
|
-
}
|
|
30
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "stringweaver",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "1.2.4",
|
|
5
|
+
"private": false,
|
|
6
|
+
"main": "./index.js",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"description": "A JS stringbuilder utility",
|
|
9
|
+
"keywords": [
|
|
10
|
+
"JS",
|
|
11
|
+
"ES20xx",
|
|
12
|
+
"String",
|
|
13
|
+
"Stringbuilder",
|
|
14
|
+
"String",
|
|
15
|
+
"Utilities",
|
|
16
|
+
"Classfree Object Oriented"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"test": "@node --test --experimental-test-coverage --test-coverage-include src/*.js --test-reporter tap tests/UnitTests.js"
|
|
20
|
+
},
|
|
21
|
+
"author": "KooiInc",
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "git+https://github.com/KooiInc/js-stringweaver.git"
|
|
26
|
+
},
|
|
27
|
+
"bugs": {
|
|
28
|
+
"url": "https://github.com/KooiInc/js-stringweaver/issues"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
/* node:coverage disable */
|
|
2
|
-
/* For StringWeaver tests we are not interested in coverage for this file */
|
|
3
|
-
|
|
4
1
|
const defaultInterpolator = interpolateFactory();
|
|
5
2
|
export {defaultInterpolator as default, interpolateFactory};
|
|
6
3
|
|
|
@@ -11,7 +8,7 @@ export {defaultInterpolator as default, interpolateFactory};
|
|
|
11
8
|
*/
|
|
12
9
|
function interpolateFactory(defaultReplacer = "") {
|
|
13
10
|
defaultReplacer = defaultReplacer?.constructor === String ? defaultReplacer : "";
|
|
14
|
-
|
|
11
|
+
|
|
15
12
|
/**
|
|
16
13
|
* Main interpolation function.
|
|
17
14
|
* @param {string} str - The string with placeholders.
|
|
@@ -21,7 +18,7 @@ function interpolateFactory(defaultReplacer = "") {
|
|
|
21
18
|
return function(str, ...tokens) {
|
|
22
19
|
return interpolate(str, processTokens(tokens));
|
|
23
20
|
}
|
|
24
|
-
|
|
21
|
+
|
|
25
22
|
/**
|
|
26
23
|
* Handle invalid keys by returning the default replacer or the key in braces.
|
|
27
24
|
* @param {string} key - The placeholder key.
|
|
@@ -32,10 +29,10 @@ function interpolateFactory(defaultReplacer = "") {
|
|
|
32
29
|
if (keyExists && defaultReplacer.length > 0) {
|
|
33
30
|
return String(defaultReplacer);
|
|
34
31
|
}
|
|
35
|
-
|
|
32
|
+
|
|
36
33
|
return `{${key}}`;
|
|
37
34
|
}
|
|
38
|
-
|
|
35
|
+
|
|
39
36
|
/**
|
|
40
37
|
* determine if [value] is a String or Number
|
|
41
38
|
* @param {any} value
|
|
@@ -44,7 +41,7 @@ function interpolateFactory(defaultReplacer = "") {
|
|
|
44
41
|
function isStringOrNumber(value ) {
|
|
45
42
|
return value?.constructor === String || value?.constructor === Number && !Number.isNaN(value);
|
|
46
43
|
}
|
|
47
|
-
|
|
44
|
+
|
|
48
45
|
/**
|
|
49
46
|
* Get the replacement value for a key from the token.
|
|
50
47
|
* @param {string} key - The placeholder key.
|
|
@@ -55,7 +52,7 @@ function interpolateFactory(defaultReplacer = "") {
|
|
|
55
52
|
const isValid = key in token;
|
|
56
53
|
return isValid && isStringOrNumber(token[key]) ? String(token[key]) : invalidate(key, isValid);
|
|
57
54
|
}
|
|
58
|
-
|
|
55
|
+
|
|
59
56
|
/**
|
|
60
57
|
* Create a lambda function for replacing placeholders in the string.
|
|
61
58
|
* @param {object<string, string>} token - The token object containing replacement values.
|
|
@@ -67,7 +64,7 @@ function interpolateFactory(defaultReplacer = "") {
|
|
|
67
64
|
return replacement((replacementObject ? replacementObject.key : `_`), token);
|
|
68
65
|
};
|
|
69
66
|
}
|
|
70
|
-
|
|
67
|
+
|
|
71
68
|
/**
|
|
72
69
|
* Replace placeholders in the string with values from the token.
|
|
73
70
|
* @param {string} str - The string with placeholders.
|
|
@@ -77,7 +74,7 @@ function interpolateFactory(defaultReplacer = "") {
|
|
|
77
74
|
function replace(str, token) {
|
|
78
75
|
return str.replace(/\{(?<key>[a-z_\d]+)}/gim, getReplacerLambda(token));
|
|
79
76
|
}
|
|
80
|
-
|
|
77
|
+
|
|
81
78
|
/**
|
|
82
79
|
* Convert token object to array of token Objects
|
|
83
80
|
* when it's values are arrays of values.
|
|
@@ -87,14 +84,14 @@ function interpolateFactory(defaultReplacer = "") {
|
|
|
87
84
|
/* node:coverage disable (internal method, not covered by tests)*/
|
|
88
85
|
function convertTokensFromArrayValues(tokenObject) {
|
|
89
86
|
const converted = [];
|
|
90
|
-
|
|
87
|
+
|
|
91
88
|
Object.entries(tokenObject).forEach(([key, value]) => {
|
|
92
89
|
value.forEach((v, i) => (converted[i] ??= {}, converted[i][key] = v));
|
|
93
90
|
});
|
|
94
|
-
|
|
91
|
+
|
|
95
92
|
return converted;
|
|
96
93
|
}
|
|
97
|
-
|
|
94
|
+
|
|
98
95
|
/**
|
|
99
96
|
* Check if single token and its values are arrays.
|
|
100
97
|
* @param {object[]} tokens - The tokens to check.
|
|
@@ -104,7 +101,7 @@ function interpolateFactory(defaultReplacer = "") {
|
|
|
104
101
|
function isMultiLineWithArrays(tokens) {
|
|
105
102
|
return tokens.length === 1 && Object.values(tokens[0]).every(Array.isArray);
|
|
106
103
|
}
|
|
107
|
-
|
|
104
|
+
|
|
108
105
|
/**
|
|
109
106
|
* Process tokens to handle multi-line formats.
|
|
110
107
|
* @param {object[]} tokens - The tokens to process.
|
|
@@ -113,7 +110,16 @@ function interpolateFactory(defaultReplacer = "") {
|
|
|
113
110
|
function processTokens(tokens) {
|
|
114
111
|
return isMultiLineWithArrays(tokens) ? convertTokensFromArrayValues(tokens[0]) : tokens;
|
|
115
112
|
}
|
|
116
|
-
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Determine [value] is a real Object and contains keys and values
|
|
116
|
+
* @param {any} value
|
|
117
|
+
* @returns {boolean}
|
|
118
|
+
*/
|
|
119
|
+
function isKeyValueObject(value) {
|
|
120
|
+
return !Array.isArray(value) && value?.constructor === Object && Object.entries(value)?.length > 0;
|
|
121
|
+
}
|
|
122
|
+
|
|
117
123
|
/**
|
|
118
124
|
* Interpolate the string with the given tokens.
|
|
119
125
|
* @param {string} str - The string with placeholders.
|
|
@@ -123,7 +129,7 @@ function interpolateFactory(defaultReplacer = "") {
|
|
|
123
129
|
function interpolate(str, tokens) {
|
|
124
130
|
return !tokens?.length ? str : tokens
|
|
125
131
|
.filter(token => token)
|
|
126
|
-
.map(token => token
|
|
132
|
+
.map((token, i) => isKeyValueObject(token) ? replace(str, {...token, index: i+1}) : ``)
|
|
127
133
|
.join(``);
|
|
128
134
|
}
|
|
129
135
|
}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/* node:coverage disable */
|
|
2
|
-
/* For StringWeaver tests we are not interested in coverage for this file */
|
|
3
1
|
const { randomString, uuid4 } = randomStringGeneratorFactory();
|
|
4
2
|
export { randomString as default, randomString, uuid4 };
|
|
5
3
|
|
|
@@ -22,7 +20,7 @@ function randomStringGeneratorFactory() {
|
|
|
22
20
|
const ri = randomNr( { max: i } );
|
|
23
21
|
[array[i], array[ri]] = [array[ri], array[i]];
|
|
24
22
|
}
|
|
25
|
-
|
|
23
|
+
|
|
26
24
|
return array;
|
|
27
25
|
};
|
|
28
26
|
const UC = shuffle(range(65, 26, map2Chrs));
|
|
@@ -31,12 +29,12 @@ function randomStringGeneratorFactory() {
|
|
|
31
29
|
const allChars = { UCLC, UC, LC, Nrs: shuffle(range()), Sym: shuffle(symbols), };
|
|
32
30
|
const getChars2Use = use => Object.entries(use)
|
|
33
31
|
.reduce( (acc, [key, value]) => value ? [...acc, ...allChars[key]] : acc, LC );
|
|
34
|
-
|
|
32
|
+
|
|
35
33
|
function checkBrowserCrypto() {
|
|
36
34
|
try { return window && `crypto` in window }
|
|
37
35
|
catch(_) { return false; }
|
|
38
36
|
}
|
|
39
|
-
|
|
37
|
+
|
|
40
38
|
function uuid4() {
|
|
41
39
|
// Note: randomUUID only in secure context (https)
|
|
42
40
|
return hasCrypto && crypto.randomUUID
|
|
@@ -48,7 +46,7 @@ function randomStringGeneratorFactory() {
|
|
|
48
46
|
.toString(16).padStart(2, `0`)}${~[3,5,7,9].indexOf(i) ? `-` : ``}` )
|
|
49
47
|
.join(``);
|
|
50
48
|
}
|
|
51
|
-
|
|
49
|
+
|
|
52
50
|
function strTest(strFound, numbers, symbols) {
|
|
53
51
|
return /[a-z]/i.test(strFound) && (
|
|
54
52
|
numbers && symbols ? /\d/.test(strFound) && symRE.test(strFound)
|
|
@@ -56,34 +54,34 @@ function randomStringGeneratorFactory() {
|
|
|
56
54
|
: symbols ? symRE.test(strFound)
|
|
57
55
|
: true);
|
|
58
56
|
}
|
|
59
|
-
|
|
57
|
+
|
|
60
58
|
function alphaSwap(strFound) {
|
|
61
59
|
const chars = [...strFound];
|
|
62
60
|
const idx = chars.findIndex(v => /[a-z]/i.test(v));
|
|
63
61
|
[chars[0], chars[idx]] = [chars[idx], chars[0]];
|
|
64
62
|
return chars.join(``);
|
|
65
63
|
}
|
|
66
|
-
|
|
64
|
+
|
|
67
65
|
function randomString( {len = 12, includeUppercase = true, includeNumbers, includeSymbols, startAlphabetic} = {} ) {
|
|
68
66
|
len = len < 6 ? 6 : len;
|
|
69
67
|
let chrs2Use = shuffle( getChars2Use( { UC: includeUppercase, Nrs: includeNumbers, Sym: includeSymbols } ) );
|
|
70
|
-
|
|
68
|
+
|
|
71
69
|
while (chrs2Use.length < len) { chrs2Use = [...chrs2Use, ...shuffle(chrs2Use)]; }
|
|
72
|
-
|
|
70
|
+
|
|
73
71
|
let strFound = chrs2Use.slice(0, len).join(``);
|
|
74
|
-
|
|
72
|
+
|
|
75
73
|
if (!(includeNumbers || includeSymbols)) { return strFound; }
|
|
76
|
-
|
|
74
|
+
|
|
77
75
|
for (let i = 0; i < chrs2Use.length; i += 1) {
|
|
78
76
|
strFound = chrs2Use.slice(i, i + len).join(``);
|
|
79
|
-
|
|
77
|
+
|
|
80
78
|
if (strTest(strFound, includeNumbers, includeSymbols)) {
|
|
81
79
|
return startAlphabetic && !/^[a-z]/i.test(strFound) ? alphaSwap(strFound) : strFound;
|
|
82
80
|
}
|
|
83
81
|
}
|
|
84
|
-
|
|
82
|
+
|
|
85
83
|
return randomString({len, includeUppercase, includeNumbers, includeSymbols, startAlphabetic});
|
|
86
84
|
}
|
|
87
|
-
|
|
85
|
+
|
|
88
86
|
return { randomString, uuid4 };
|
|
89
87
|
}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
/* node:coverage disable */
|
|
2
|
-
/* For StringWeaver tests we are not interested in coverage for this file */
|
|
3
|
-
|
|
4
1
|
export default createRegExp
|
|
5
2
|
|
|
6
3
|
function createRegExp(str, ...args) {
|
|
@@ -9,7 +6,7 @@ function createRegExp(str, ...args) {
|
|
|
9
6
|
return regExp(str, ...args);
|
|
10
7
|
} catch (err) {
|
|
11
8
|
const flags = resolveFlags();
|
|
12
|
-
const raw = str.raw || str;
|
|
9
|
+
const raw = str.raw || str;
|
|
13
10
|
return `Error creating Regular Expression from string "${raw}" with flags ${flags}` +
|
|
14
11
|
`\nRegExp error message: "${err.message}"`;
|
|
15
12
|
}
|
|
@@ -25,7 +22,7 @@ function regExp(regexStr, ...args) {
|
|
|
25
22
|
const flags = resolveFlags(...args);
|
|
26
23
|
args = [];
|
|
27
24
|
const raw = regexStr.raw || [regexStr];
|
|
28
|
-
|
|
25
|
+
|
|
29
26
|
return new RegExp(
|
|
30
27
|
(args.length &&
|
|
31
28
|
raw.reduce( (a, v, i ) => a.concat(args[i-1] || ``).concat(v), ``) ||
|
package/src/genericMethods.js
CHANGED
|
@@ -8,9 +8,10 @@ const quotingStyles = defineQuotingStyles();
|
|
|
8
8
|
export {
|
|
9
9
|
customMethods,
|
|
10
10
|
CustomStringConstructor,
|
|
11
|
-
isNumber,
|
|
11
|
+
isNumber,
|
|
12
12
|
isArrayOf,
|
|
13
13
|
defineQuotingStyles,
|
|
14
|
+
quotGetters4Instance,
|
|
14
15
|
getStringValue,
|
|
15
16
|
escapeRE,
|
|
16
17
|
resolveTemplateString,
|
|
@@ -23,7 +24,7 @@ createExtendedCTOR(CustomStringConstructor, customMethods);
|
|
|
23
24
|
|
|
24
25
|
function CustomStringConstructor(str, ...args) {
|
|
25
26
|
const instance = createInstance({initialstring: resolveTemplateString(str, ...args)});
|
|
26
|
-
Object.defineProperty( instance,
|
|
27
|
+
Object.defineProperty( instance,
|
|
27
28
|
`constructor`, { get() { return CustomStringConstructor; }, enumerable: false}
|
|
28
29
|
);
|
|
29
30
|
return Object.freeze(instance);
|
|
@@ -35,12 +36,6 @@ function resolveTemplateString(str, ...args) {
|
|
|
35
36
|
: getStringValue(str).length ? str : "";
|
|
36
37
|
}
|
|
37
38
|
|
|
38
|
-
function checkType(type, item, includeInstances) {
|
|
39
|
-
return type === String && includeInstances
|
|
40
|
-
? item?.constructor !== CustomStringConstructor && item?.constructor !== type
|
|
41
|
-
: item?.constructor !== type;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
39
|
function isArrayOf(type, value, includeInstances = true) {
|
|
45
40
|
return Array.isArray(value) && value.length > 0 && !value.find(v => checkType(type, v, includeInstances));
|
|
46
41
|
}
|
|
@@ -83,7 +78,7 @@ function getPlainValues() {
|
|
|
83
78
|
function getSWInformation(notChainable) {
|
|
84
79
|
const firstLines = CustomStringConstructor(decode());
|
|
85
80
|
const plainValues = getPlainValues();
|
|
86
|
-
|
|
81
|
+
|
|
87
82
|
return firstLines.split(/\n/)
|
|
88
83
|
.concat(
|
|
89
84
|
Object.entries(Object.getOwnPropertyDescriptors(firstLines))
|
|
@@ -98,18 +93,48 @@ function getSWInformation(notChainable) {
|
|
|
98
93
|
const getter = isGetter && isChainable ? `chainable getter${custom}` : `getter`;
|
|
99
94
|
const method = isMethod && isChainable ? `chainable method${custom}` : `method`;
|
|
100
95
|
const native = isNative && `${descriptr.get ? `getter` : `method`} (override)`;
|
|
101
|
-
|
|
96
|
+
|
|
102
97
|
switch (true) {
|
|
103
98
|
case isPlainValue: return infoValue(key, plainValues[key]);
|
|
104
99
|
case isNative: return infoValue(key, native);
|
|
105
100
|
case isMethod: return infoValue(key, method);
|
|
106
|
-
case isGetter: return infoValue(key, getter);
|
|
101
|
+
case isGetter: return infoValue(key, getter);
|
|
107
102
|
}
|
|
108
103
|
}
|
|
109
104
|
)
|
|
110
105
|
);
|
|
111
106
|
}
|
|
112
107
|
|
|
108
|
+
function quotGetters4Instance(instance, wrap) {
|
|
109
|
+
wrap = wrap ?? function(me) { return me; };
|
|
110
|
+
return {
|
|
111
|
+
value: {
|
|
112
|
+
get backtick() { return instance.enclose(...quotingStyles.backtick); },
|
|
113
|
+
get bracket() { return instance.enclose(...quotingStyles.bracket); },
|
|
114
|
+
get curlyDouble() { return instance.enclose(...quotingStyles.curlyDouble); },
|
|
115
|
+
get curlyDoubleInward() { return instance.enclose(...quotingStyles.curlyDoubleInward); },
|
|
116
|
+
get curlyDoubleEqual() { return instance.enclose(...quotingStyles.curlyDoubleEqual); },
|
|
117
|
+
get curlyLHDoubleInward() { return instance.enclose(...quotingStyles.curlyLHDoubleInward); },
|
|
118
|
+
get curlyLHSingle() { return instance.enclose(...quotingStyles.curlyLHSingle); },
|
|
119
|
+
get curlyLHSingleInward() { return instance.enclose(...quotingStyles.curlyLHSingleInward); },
|
|
120
|
+
get curlySingle() { return instance.enclose(...quotingStyles.curlySingle); },
|
|
121
|
+
get curlySingleEqual() { return instance.enclose(...quotingStyles.curlySingleEqual); },
|
|
122
|
+
get curlySingleInward() { return instance.enclose(...quotingStyles.curlySingleInward); },
|
|
123
|
+
get custom() { return (start, end) => instance.enclose(...[start, end ?? start]); },
|
|
124
|
+
get double() { return instance.enclose(...quotingStyles.double); },
|
|
125
|
+
get guillemets() { return instance.enclose(...quotingStyles.guillemets); },
|
|
126
|
+
get guillemetsInward() { return instance.enclose(...quotingStyles.guillemetsInward); },
|
|
127
|
+
get guillemetsSingle() { return instance.enclose(...quotingStyles.guillemetsSingle); },
|
|
128
|
+
get guillemetsSingleInward() { return instance.enclose(...quotingStyles.guillemetsSingleInward); },
|
|
129
|
+
get remove() { return wrap(`${instance.value.replace(quotingStyles.re, ``)}`); },
|
|
130
|
+
get single() { return instance.enclose(...quotingStyles.single); },
|
|
131
|
+
get squareBrackets() { return instance.enclose(...quotingStyles.squareBrackets); },
|
|
132
|
+
},
|
|
133
|
+
enumerable: false,
|
|
134
|
+
configurable: false,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
113
138
|
function decode() {
|
|
114
139
|
return atob`Rm9yIHRoZSByZWNvcmQ6CltjbV0gY2hhaW5hYmxlIGdldHRlcnMvbWV0aG9kcyBtb2RpZnkgdGhlIGluc3RhbmNlIHN0cmluZwpbY21dIGluZGV4T2Ygb3ZlcnJpZGVzIHJldHVybnMgW3VuZGVmaW5lZF0gaWYgbm90aGluZyB3YXMgZm91bmQgKHNvIG9uZSBjYW4gdXNlIFtsYXN0SV1pbmRleE9mKFtzb21lIHN0cmluZyB2YWx1ZV0pID8/IDAKW2NtXSBpbmNsdWRlcyBpbmZvcm1hdGlvbiBmb3IgY3VzdG9tIG1ldGhvZHMvZ2V0dGVycyBpZiBhcHBsaWNhYmxl`.replace(/\[cm]/g, `\u2714`);
|
|
115
140
|
}
|
|
@@ -146,12 +171,11 @@ function defineQuotingStyles() {
|
|
|
146
171
|
return quots;
|
|
147
172
|
}
|
|
148
173
|
|
|
149
|
-
/* this function is not (directly) tested */
|
|
150
|
-
/* node:coverage disable */
|
|
151
174
|
function createExtendedCTOR(ctor, customMethods) {
|
|
175
|
+
const instanceQuotGetters4Info = quotGetters4Instance(ctor());
|
|
152
176
|
Symbol.toSB = Symbol.for(`toStringBuilder`);
|
|
153
|
-
Object.defineProperty(String.prototype, Symbol.toSB, {
|
|
154
|
-
get() { return ctor(this); },
|
|
177
|
+
Object.defineProperty(String.prototype, Symbol.toSB, {
|
|
178
|
+
get() { return ctor(this); },
|
|
155
179
|
enumerable: false,
|
|
156
180
|
configurable: false });
|
|
157
181
|
const notChainable = `constructor,history,indexOf,toString,value,valueOf,empty`.split(`,`);
|
|
@@ -175,7 +199,7 @@ function createExtendedCTOR(ctor, customMethods) {
|
|
|
175
199
|
console.error(`addCustom: the property "${name}" exists and can not be redefined`);
|
|
176
200
|
return `addCustom: the property "${name}" exists and can not be redefined`;
|
|
177
201
|
}
|
|
178
|
-
|
|
202
|
+
|
|
179
203
|
if (name?.constructor === String && method?.constructor === Function && method.length > 0) {
|
|
180
204
|
customMethods[name] = {method, enumerable, isGetter};
|
|
181
205
|
return `addCustom: the ${isGetter ? `getter` : `method`} named "${name}" is added`;
|
|
@@ -186,20 +210,21 @@ function createExtendedCTOR(ctor, customMethods) {
|
|
|
186
210
|
get() { return getSWInformation(notChainable); }
|
|
187
211
|
},
|
|
188
212
|
keys: {
|
|
189
|
-
get() {
|
|
213
|
+
get() {
|
|
190
214
|
return Object.keys(Object.getOwnPropertyDescriptors(CustomStringConstructor``)).sort( (a,b) => a.localeCompare(b) )
|
|
191
|
-
.map(v => !/constructor|toString|valueOf/.test(v) && v in customMethods ? `${v} *custom*` : v);
|
|
215
|
+
.map(v => !/constructor|toString|valueOf/.test(v) && v in customMethods ? `${v} *custom*` : v);
|
|
192
216
|
}
|
|
193
217
|
},
|
|
194
218
|
quoteInfo: {
|
|
195
219
|
get() {
|
|
196
|
-
|
|
197
|
-
delete qStyles.re;
|
|
198
|
-
return Object.entries(qStyles)
|
|
220
|
+
return Object.entries(Object.getOwnPropertyDescriptors(instanceQuotGetters4Info.value))
|
|
199
221
|
.sort( (a,b) => a[0].localeCompare(b[0]) )
|
|
200
222
|
.reduce((acc, [k, v]) => {
|
|
201
|
-
|
|
202
|
-
return [...acc, `[instance].quote
|
|
223
|
+
if (k === `remove`) { return [...acc, `[instance].quote.remove (only predefined)`]; }
|
|
224
|
+
if (k === `custom`) { return [...acc, `[instance].quote.custom(start:string, end:string)`]; }
|
|
225
|
+
|
|
226
|
+
const val = ctor(` [instance] `).quote[k];
|
|
227
|
+
return [...acc, `[instance].quote.${k} (${val})`];
|
|
203
228
|
}, []);
|
|
204
229
|
}
|
|
205
230
|
},
|
|
@@ -208,12 +233,17 @@ function createExtendedCTOR(ctor, customMethods) {
|
|
|
208
233
|
},
|
|
209
234
|
randomString: {
|
|
210
235
|
value: function({len, includeUppercase, includeNumbers, includeSymbols, startAlphabetic} = {}) {
|
|
211
|
-
return CustomStringConstructor(randomString({len, includeUppercase, includeNumbers, includeSymbols, startAlphabetic}));
|
|
236
|
+
return CustomStringConstructor(randomString({len, includeUppercase, includeNumbers, includeSymbols, startAlphabetic}));
|
|
212
237
|
}
|
|
213
238
|
},
|
|
214
239
|
regExp: { value: createRegExp }
|
|
215
240
|
});
|
|
216
|
-
|
|
241
|
+
|
|
217
242
|
return ctor;
|
|
218
243
|
}
|
|
219
|
-
|
|
244
|
+
|
|
245
|
+
function checkType(type, item, includeInstances) {
|
|
246
|
+
return type === String && includeInstances
|
|
247
|
+
? item?.constructor !== CustomStringConstructor && item?.constructor !== type
|
|
248
|
+
: item?.constructor !== type;
|
|
249
|
+
}
|
package/src/instanceMethods.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isArrayOf,
|
|
3
3
|
isNumber,
|
|
4
|
-
|
|
4
|
+
quotGetters4Instance as quotGetters,
|
|
5
5
|
getStringValue,
|
|
6
6
|
escapeRE,
|
|
7
7
|
customMethods,
|
|
@@ -92,7 +92,7 @@ function toCamelcase(string) {
|
|
|
92
92
|
);
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
function
|
|
95
|
+
function getWordBoundary(string) {
|
|
96
96
|
const match = [...string.matchAll(/\p{Pe}|\p{Z}/gu)].at(-1);
|
|
97
97
|
return match?.index ?? string.length;
|
|
98
98
|
}
|
|
@@ -106,7 +106,7 @@ function truncate(string, {at, html = false, wordBoundary = false} = {} ) {
|
|
|
106
106
|
const subString = string.slice(0, at - 1);
|
|
107
107
|
const endwith = html ? "…" : `...`;
|
|
108
108
|
const boundary = wordBoundary
|
|
109
|
-
?
|
|
109
|
+
? getWordBoundary(subString)
|
|
110
110
|
: subString.length;
|
|
111
111
|
|
|
112
112
|
return (wordBoundary
|
|
@@ -134,16 +134,12 @@ function replaceWords(string, { replacements = {}, caseSensitive = false} = {})
|
|
|
134
134
|
const cando = isArrayOf(String, replacements2Array) && caseSensitive?.constructor === Boolean;
|
|
135
135
|
const modifiers = `g${!caseSensitive ? 'i' : ''}`;
|
|
136
136
|
|
|
137
|
-
if (cando) {
|
|
138
|
-
replacements2Array = replacements2Array.map(v => getStringValue(v)).filter(v => replacements2Array.length > 0);
|
|
137
|
+
if (!cando) { return string; }
|
|
139
138
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
string = string.replace(re, replacement);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
139
|
+
while (replacements2Array.length) {
|
|
140
|
+
const [initial, replacement] = [replacements2Array.shift(), replacements2Array.shift()];
|
|
141
|
+
const re = escapeRE(initial, modifiers);
|
|
142
|
+
string = string.replace(re, replacement);
|
|
147
143
|
}
|
|
148
144
|
|
|
149
145
|
return string;
|
|
@@ -197,32 +193,3 @@ function append(string, ...strings2Append) {
|
|
|
197
193
|
|
|
198
194
|
return getStringValue(string);
|
|
199
195
|
}
|
|
200
|
-
|
|
201
|
-
function quotGetters(instance, wrap) {
|
|
202
|
-
return {
|
|
203
|
-
value: {
|
|
204
|
-
get backtick() { return instance.enclose(...quotingStyles.backtick); },
|
|
205
|
-
get bracket() { return instance.enclose(...quotingStyles.bracket); },
|
|
206
|
-
get curlyDouble() { return instance.enclose(...quotingStyles.curlyDouble); },
|
|
207
|
-
get curlyDoubleInward() { return instance.enclose(...quotingStyles.curlyDoubleInward); },
|
|
208
|
-
get curlyDoubleEqual() { return instance.enclose(...quotingStyles.curlyDoubleEqual); },
|
|
209
|
-
get curlyLHDoubleInward() { return instance.enclose(...quotingStyles.curlyLHDoubleInward); },
|
|
210
|
-
get curlyLHSingle() { return instance.enclose(...quotingStyles.curlyLHSingle); },
|
|
211
|
-
get curlyLHSingleInward() { return instance.enclose(...quotingStyles.curlyLHSingleInward); },
|
|
212
|
-
get curlySingle() { return instance.enclose(...quotingStyles.curlySingle); },
|
|
213
|
-
get curlySingleEqual() { return instance.enclose(...quotingStyles.curlySingleEqual); },
|
|
214
|
-
get curlySingleInward() { return instance.enclose(...quotingStyles.curlySingleInward); },
|
|
215
|
-
custom(start, end) { return instance.enclose(...[start, end ?? start]); },
|
|
216
|
-
get double() { return instance.enclose(...quotingStyles.double); },
|
|
217
|
-
get guillemets() { return instance.enclose(...quotingStyles.guillemets); },
|
|
218
|
-
get guillemetsInward() { return instance.enclose(...quotingStyles.guillemetsInward); },
|
|
219
|
-
get guillemetsSingle() { return instance.enclose(...quotingStyles.guillemetsSingle); },
|
|
220
|
-
get guillemetsSingleInward() { return instance.enclose(...quotingStyles.guillemetsSingleInward); },
|
|
221
|
-
get remove() { return wrap(`${instance.value.replace(quotingStyles.re, ``)}`); },
|
|
222
|
-
get single() { return instance.enclose(...quotingStyles.single); },
|
|
223
|
-
get squareBrackets() { return instance.enclose(...quotingStyles.squareBrackets); },
|
|
224
|
-
},
|
|
225
|
-
enumerable: false,
|
|
226
|
-
configurable: false,
|
|
227
|
-
};
|
|
228
|
-
}
|
package/tests/UnitTests.js
CHANGED
|
@@ -3,10 +3,82 @@
|
|
|
3
3
|
import assert from 'node:assert';
|
|
4
4
|
import {describe, it} from 'node:test';
|
|
5
5
|
import {default as $S, CustomStringConstructor} from "../index.js";
|
|
6
|
-
import {quotingStyles} from "../src/genericMethods.js";
|
|
6
|
+
import {quotingStyles, isArrayOf, quotGetters4Instance} from "../src/genericMethods.js";
|
|
7
7
|
|
|
8
8
|
describe(`Basics constructor`, () => {
|
|
9
9
|
describe(`Instantiation`, () => {
|
|
10
|
+
it(`Constructor keys are not enumerable`, () => {
|
|
11
|
+
const keys = Object.keys($S);
|
|
12
|
+
assert.strictEqual(keys.length, 0);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it(`Constructor is extended`, () => {
|
|
16
|
+
const extensions = Object.entries(Object.getOwnPropertyDescriptors($S)).reduce( (a, [k, v]) => {
|
|
17
|
+
return {...a, ...{[k]: {isGetter: !!v.get, isValue: !!v.value}}}
|
|
18
|
+
}, {});
|
|
19
|
+
assert.deepStrictEqual(
|
|
20
|
+
extensions, {
|
|
21
|
+
"length": {
|
|
22
|
+
"isGetter": false,
|
|
23
|
+
"isValue": true
|
|
24
|
+
},
|
|
25
|
+
"name": {
|
|
26
|
+
"isGetter": false,
|
|
27
|
+
"isValue": true
|
|
28
|
+
},
|
|
29
|
+
"prototype": {
|
|
30
|
+
"isGetter": false,
|
|
31
|
+
"isValue": true
|
|
32
|
+
},
|
|
33
|
+
"create": {
|
|
34
|
+
"isGetter": true,
|
|
35
|
+
"isValue": false
|
|
36
|
+
},
|
|
37
|
+
"constructor": {
|
|
38
|
+
"isGetter": true,
|
|
39
|
+
"isValue": false
|
|
40
|
+
},
|
|
41
|
+
"format": {
|
|
42
|
+
"isGetter": false,
|
|
43
|
+
"isValue": true
|
|
44
|
+
},
|
|
45
|
+
"addCustom": {
|
|
46
|
+
"isGetter": false,
|
|
47
|
+
"isValue": true
|
|
48
|
+
},
|
|
49
|
+
"info": {
|
|
50
|
+
"isGetter": true,
|
|
51
|
+
"isValue": false
|
|
52
|
+
},
|
|
53
|
+
"keys": {
|
|
54
|
+
"isGetter": true,
|
|
55
|
+
"isValue": false
|
|
56
|
+
},
|
|
57
|
+
"quoteInfo": {
|
|
58
|
+
"isGetter": true,
|
|
59
|
+
"isValue": false
|
|
60
|
+
},
|
|
61
|
+
"uuid4": {
|
|
62
|
+
"isGetter": true,
|
|
63
|
+
"isValue": false
|
|
64
|
+
},
|
|
65
|
+
"randomString": {
|
|
66
|
+
"isGetter": false,
|
|
67
|
+
"isValue": true
|
|
68
|
+
},
|
|
69
|
+
"regExp": {
|
|
70
|
+
"isGetter": false,
|
|
71
|
+
"isValue": true
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it(`Symbolic String extension in place`, () => {
|
|
77
|
+
const test = `hello world`[Symbol.toSB];
|
|
78
|
+
assert.strictEqual(test.constructor, CustomStringConstructor);
|
|
79
|
+
assert.strictEqual(test.value, `hello world`);
|
|
80
|
+
});
|
|
81
|
+
|
|
10
82
|
it(`constructor can be used as regular function`, () => {
|
|
11
83
|
const hi = $S(`Hello world`);
|
|
12
84
|
assert.strictEqual(String(hi), `Hello world`);
|
|
@@ -87,6 +159,10 @@ describe(`Basics constructor`, () => {
|
|
|
87
159
|
});
|
|
88
160
|
|
|
89
161
|
describe(`Constructor static methods`, () => {
|
|
162
|
+
it(`$S.constructor as expected`, () => {
|
|
163
|
+
assert.strictEqual($S.constructor, CustomStringConstructor);
|
|
164
|
+
});
|
|
165
|
+
|
|
90
166
|
it(`$S.keys delivers all keys`, () => {
|
|
91
167
|
const keysShouldbe = [
|
|
92
168
|
'append',
|
|
@@ -160,28 +236,37 @@ describe(`Basics constructor`, () => {
|
|
|
160
236
|
assert.deepStrictEqual(info.slice(info.findIndex(v => v.startsWith(`append`))), keysShouldbe);
|
|
161
237
|
});
|
|
162
238
|
|
|
239
|
+
it(`$S.keys for custom getter => *custom* displayed`, () => {
|
|
240
|
+
$S.addCustom({
|
|
241
|
+
name: `tested`,
|
|
242
|
+
method: me => {return me.toUpperCase().quote.curlyDouble; },
|
|
243
|
+
enumerable: true,
|
|
244
|
+
isGetter: true});
|
|
245
|
+
assert.strictEqual($S.keys.find(v => v.startsWith(`tested`)), `tested *custom*`, $S.keys);
|
|
246
|
+
})
|
|
247
|
+
|
|
163
248
|
it(`$S.keys.quoteInfo as expected`, () => {
|
|
164
249
|
const shouldBe = [
|
|
165
|
-
'[instance].quote.backtick (` [instance
|
|
166
|
-
'[instance].quote.bracket ({ [instance
|
|
167
|
-
'[instance].quote.curlyDouble (“ [instance
|
|
168
|
-
'[instance].quote.curlyDoubleEqual (“ [instance
|
|
169
|
-
'[instance].quote.curlyDoubleInward (” [instance
|
|
170
|
-
'[instance].quote.
|
|
171
|
-
'[instance].quote.
|
|
172
|
-
'[instance].quote.
|
|
173
|
-
'[instance].quote.
|
|
174
|
-
'[instance].quote.
|
|
175
|
-
'[instance].quote.
|
|
176
|
-
'[instance].quote.
|
|
177
|
-
'[instance].quote.double (" [instance
|
|
178
|
-
'[instance].quote.guillemets (« [instance
|
|
179
|
-
'[instance].quote.guillemetsInward (» [instance
|
|
180
|
-
'[instance].quote.guillemetsSingle (‹ [instance
|
|
181
|
-
'[instance].quote.guillemetsSingleInward (› [instance
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
250
|
+
'[instance].quote.backtick (` [instance] `)',
|
|
251
|
+
'[instance].quote.bracket ({ [instance] })',
|
|
252
|
+
'[instance].quote.curlyDouble (“ [instance] ”)',
|
|
253
|
+
'[instance].quote.curlyDoubleEqual (“ [instance] “)',
|
|
254
|
+
'[instance].quote.curlyDoubleInward (” [instance] “)',
|
|
255
|
+
'[instance].quote.curlyLHDoubleInward („ [instance] “)',
|
|
256
|
+
'[instance].quote.curlyLHSingle (‚ [instance] ’)',
|
|
257
|
+
'[instance].quote.curlyLHSingleInward (‚ [instance] ‘)',
|
|
258
|
+
'[instance].quote.curlySingle (‛ [instance] ’)',
|
|
259
|
+
'[instance].quote.curlySingleEqual (‛ [instance] ‛)',
|
|
260
|
+
'[instance].quote.curlySingleInward (’ [instance] ‛)',
|
|
261
|
+
'[instance].quote.custom(start:string, end:string)',
|
|
262
|
+
'[instance].quote.double (" [instance] ")',
|
|
263
|
+
'[instance].quote.guillemets (« [instance] »)',
|
|
264
|
+
'[instance].quote.guillemetsInward (» [instance] «)',
|
|
265
|
+
'[instance].quote.guillemetsSingle (‹ [instance] ›)',
|
|
266
|
+
'[instance].quote.guillemetsSingleInward (› [instance] ‹)',
|
|
267
|
+
'[instance].quote.remove (only predefined)',
|
|
268
|
+
"[instance].quote.single (' [instance] ')",
|
|
269
|
+
'[instance].quote.squareBrackets ([ [instance] ])' ];
|
|
185
270
|
assert.deepStrictEqual($S.quoteInfo, shouldBe);
|
|
186
271
|
});
|
|
187
272
|
|
|
@@ -219,14 +304,6 @@ describe(`Basics constructor`, () => {
|
|
|
219
304
|
`addCustom: the property "upperQuoted" exists and can not be redefined`);
|
|
220
305
|
});
|
|
221
306
|
|
|
222
|
-
it(`non enumerable custom getter NOT in instance keys`, () => {
|
|
223
|
-
assert.strictEqual(Object.keys($S``).find(v => v === `lowerQuotSingle`), undefined );
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
it(`custom enumerable getter in instance keys`, () => {
|
|
227
|
-
assert.strictEqual(Object.keys($S``).find(v => v === `upperQuoted`), `upperQuoted` );
|
|
228
|
-
})
|
|
229
|
-
|
|
230
307
|
it(`$S.format works as expected`, () => {
|
|
231
308
|
const mymy = $S.format(`hello {wrld}`, {wrld: `there - `}, {wrld: `world`});
|
|
232
309
|
assert.strictEqual(mymy.value, `hello there - hello world`);
|
|
@@ -299,6 +376,41 @@ describe(`Basics constructor`, () => {
|
|
|
299
376
|
assert.strictEqual(/^[a-z]/.test(rs), true, rs + `lowercase only, symbols, startalphabetic`);
|
|
300
377
|
});
|
|
301
378
|
});
|
|
379
|
+
|
|
380
|
+
describe(`Miscellaneous`, () => {
|
|
381
|
+
it(`isArrayOf (strings)`, () => {
|
|
382
|
+
const arrOfString = [`a`, `b`];
|
|
383
|
+
assert.strictEqual(isArrayOf(String, arrOfString), true);
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
it(`isArrayOf (Map)`, () => {
|
|
387
|
+
const arrOfMaps = [new Map(), new Map()];
|
|
388
|
+
assert.strictEqual(isArrayOf(Map, arrOfMaps), true);
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
it(`isArrayOf (numbers)`, () => {
|
|
392
|
+
const arrOfNumbers = [1, 2, 3];
|
|
393
|
+
assert.strictEqual(isArrayOf(Number, arrOfNumbers), true);
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
it(`isArrayOf (number, not all numbers)`, () => {
|
|
397
|
+
const arrOfNumbers = [1, 2, `3`];
|
|
398
|
+
assert.strictEqual(isArrayOf(Number, arrOfNumbers), false);
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
it(`non enumerable custom getter NOT in instance keys`, () => {
|
|
402
|
+
assert.strictEqual(Object.keys($S``).find(v => v === `lowerQuotSingle`), undefined );
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
it(`custom enumerable getter in instance keys`, () => {
|
|
406
|
+
assert.strictEqual(Object.keys($S``).find(v => v === `upperQuoted`), `upperQuoted` );
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
it(`quotGetters4Instance with dummy wrapper`, () => {
|
|
410
|
+
const quotes4Instance = quotGetters4Instance($S``);
|
|
411
|
+
assert.strictEqual(quotes4Instance.value.remove, ``);
|
|
412
|
+
})
|
|
413
|
+
});
|
|
302
414
|
});
|
|
303
415
|
|
|
304
416
|
describe(`Instance methods, setters & getters (alphabetically ordered)`, () => {
|
|
@@ -666,7 +778,8 @@ describe(`Instance methods, setters & getters (alphabetically ordered)`, () => {
|
|
|
666
778
|
describe(`quoting`, () => {
|
|
667
779
|
it(`[instance].quote[quotingStyle] for all possibilities as expected`, () => {
|
|
668
780
|
const testme = Object.keys($S.create.quote).map((key) => {
|
|
669
|
-
if (
|
|
781
|
+
if (key === "remove") { return $S`${key}: ` + $S(`quoting`).quote.double.quote.remove; }
|
|
782
|
+
if (key === "custom") { return $S`${key}: ` + $S(`quoting`).quote[key](`!!`); }
|
|
670
783
|
return $S`${key}: ` + $S(`quoting`).quote[key];
|
|
671
784
|
}).filter(k => k);
|
|
672
785
|
|
|
@@ -682,11 +795,13 @@ describe(`Instance methods, setters & getters (alphabetically ordered)`, () => {
|
|
|
682
795
|
"curlySingle: ‛quoting’",
|
|
683
796
|
"curlySingleEqual: ‛quoting‛",
|
|
684
797
|
"curlySingleInward: ’quoting‛",
|
|
798
|
+
"custom: !!quoting!!",
|
|
685
799
|
"double: \"quoting\"",
|
|
686
800
|
"guillemets: «quoting»",
|
|
687
801
|
"guillemetsInward: »quoting«",
|
|
688
802
|
"guillemetsSingle: ‹quoting›",
|
|
689
803
|
"guillemetsSingleInward: ›quoting‹",
|
|
804
|
+
"remove: quoting",
|
|
690
805
|
"single: 'quoting'",
|
|
691
806
|
"squareBrackets: [quoting]"
|
|
692
807
|
]);
|
|
@@ -777,6 +892,11 @@ describe(`Instance methods, setters & getters (alphabetically ordered)`, () => {
|
|
|
777
892
|
assert.strictEqual(hi.truncate({at: 8, wordBoundary: true}).value, `Hello,...`);
|
|
778
893
|
});
|
|
779
894
|
|
|
895
|
+
it(`truncate (no wordBoundaries, wordBoundary true) as expected`, () => {
|
|
896
|
+
const hi = $S`Hellouniversesaynomore`;
|
|
897
|
+
assert.strictEqual(hi.truncate({at: 8, wordBoundary: true}).value, `Helloun...`);
|
|
898
|
+
});
|
|
899
|
+
|
|
780
900
|
it(`truncate (html entity) as expected`, () => {
|
|
781
901
|
const hi = $S`Hello universe say no more`;
|
|
782
902
|
assert.strictEqual(hi.truncate({at: 8, html: true}).value, `Hello u…`);
|