From 3a3ee88b5e611a8618383c770f9521c282fe2062 Mon Sep 17 00:00:00 2001 From: Roy Revelt Date: Thu, 31 Dec 2020 20:24:25 +0000 Subject: [PATCH] feat: rewrite in TS --- packages/string-uglify/.npmignore | 3 +- .../coverage/coverage-summary.json | 2 +- .../string-uglify/dist/string-uglify.cjs.js | 89 +++- .../dist/string-uglify.dev.umd.js | 429 +++++++++--------- .../string-uglify/dist/string-uglify.esm.js | 161 ++++--- packages/string-uglify/dist/string-uglify.mjs | 10 + .../string-uglify/dist/string-uglify.umd.js | 2 +- packages/string-uglify/examples/_quickTake.js | 2 - packages/string-uglify/package.json | 62 ++- packages/string-uglify/perf/historical.json | 5 +- packages/string-uglify/rollup.config.js | 194 ++++++-- .../string-uglify/src/{main.js => main.ts} | 47 +- packages/string-uglify/tsconfig.json | 4 + packages/string-uglify/types/main.d.ts | 4 + 14 files changed, 609 insertions(+), 405 deletions(-) create mode 100644 packages/string-uglify/dist/string-uglify.mjs rename packages/string-uglify/src/{main.js => main.ts} (88%) create mode 100644 packages/string-uglify/tsconfig.json create mode 100644 packages/string-uglify/types/main.d.ts diff --git a/packages/string-uglify/.npmignore b/packages/string-uglify/.npmignore index 0153ad2b6e..a44d352ac7 100644 --- a/packages/string-uglify/.npmignore +++ b/packages/string-uglify/.npmignore @@ -1,4 +1,4 @@ -# .... generated using www.npmjs.com/package/lect .... +# generated using codsen.com/os/lect # # # __ ______ ______ ______ @@ -23,3 +23,4 @@ test .prettierignore rollup.config.js testStats.md +tsconfig.json diff --git a/packages/string-uglify/coverage/coverage-summary.json b/packages/string-uglify/coverage/coverage-summary.json index 0e6639e172..055e798fc4 100644 --- a/packages/string-uglify/coverage/coverage-summary.json +++ b/packages/string-uglify/coverage/coverage-summary.json @@ -1 +1 @@ -{"total":{"lines":{"total":74,"covered":70,"skipped":0,"pct":94.59},"statements":{"total":78,"covered":74,"skipped":0,"pct":94.87},"functions":{"total":8,"covered":8,"skipped":0,"pct":100},"branches":{"total":72,"covered":64,"skipped":0,"pct":88.89}}} \ No newline at end of file +{"total":{"lines":{"total":69,"covered":65,"skipped":0,"pct":94.2},"statements":{"total":77,"covered":73,"skipped":0,"pct":94.81},"functions":{"total":8,"covered":8,"skipped":0,"pct":100},"branches":{"total":75,"covered":66,"skipped":0,"pct":88}}} \ No newline at end of file diff --git a/packages/string-uglify/dist/string-uglify.cjs.js b/packages/string-uglify/dist/string-uglify.cjs.js index 8b701f71b8..6d77b9735a 100644 --- a/packages/string-uglify/dist/string-uglify.cjs.js +++ b/packages/string-uglify/dist/string-uglify.cjs.js @@ -13,10 +13,15 @@ Object.defineProperty(exports, '__esModule', { value: true }); var version = "1.3.4"; -var isArr = Array.isArray; function tellcp(str, idNum) { - return str.codePointAt(idNum); -} + if (idNum === void 0) { + idNum = 0; + } + + return str.codePointAt(idNum) || 0; +} // converts whole array into array uglified names + + function uglifyArr(arr) { var letters = "abcdefghijklmnopqrstuvwxyz"; var lettersAndNumbers = "abcdefghijklmnopqrstuvwxyz0123456789"; @@ -103,36 +108,52 @@ function uglifyArr(arr) { x: false, y: false, z: false - }; - var res = []; - if (!isArr(arr) || !arr.length) { + }; // final array we'll assemble and eventually return + + var res = []; // quick end + + if (!Array.isArray(arr) || !arr.length) { return arr; } + for (var id = 0, len = arr.length; id < len; id++) { + // insurance against duplicate reference array values if (arr.indexOf(arr[id]) < id) { + // push again the calculated value from "res": res.push(res[arr.indexOf(arr[id])]); continue; } + var prefix = ".#".includes(arr[id][0]) ? arr[id][0] : ""; var codePointSum = Array.from(arr[id]).reduce(function (acc, curr) { return acc + tellcp(curr); }, 0); + if (".#".includes(arr[id][0]) && arr[id].length < 4 || !".#".includes(arr[id][0]) && arr[id].length < 3) { var val = arr[id]; + if (!res.includes(val)) { - res.push(val); - if (val.startsWith(".") && val.length === 2 && !singleClasses[val.slice(1)]) { + res.push(val); // the first candidates for single-character value are 2-char long classes: + + if (val.startsWith(".") && val.length === 2 && singleClasses[val.slice(1)] === false) { + // mark the letter as used singleClasses[val.slice(1)] = true; - } else if (val.startsWith("#") && val.length === 2 && !singleIds[val.slice(1)]) { + } else if (val.startsWith("#") && val.length === 2 && singleIds[val.slice(1)] === false) { + // mark the letter as used singleIds[val.slice(1)] = true; - } else if (!val.startsWith(".") && !val.startsWith("#") && val.length === 1 && !singleNameonly[val]) { + } else if (!val.startsWith(".") && !val.startsWith("#") && val.length === 1 && singleNameonly[val] === false) { + // mark the letter as used singleNameonly[val] = true; } + continue; } } - var generated = "".concat(prefix).concat(letters[codePointSum % letters.length]).concat(lettersAndNumbers[codePointSum % lettersAndNumbers.length]); + + var generated = "" + prefix + letters[codePointSum % letters.length] + lettersAndNumbers[codePointSum % lettersAndNumbers.length]; + if (res.includes(generated)) { + // add more characters: var soFarWeveGot = generated; var counter = 0; var reducedCodePointSum = Array.from(arr[id]).reduce(function (acc, curr) { @@ -142,41 +163,62 @@ function uglifyArr(arr) { return tellcp(val); }).reduce(function (accum, curr) { var temp = accum + curr; + do { temp = String(temp).split("").reduce(function (acc, curr1) { return acc + Number.parseInt(curr1, 10); }, 0); } while (temp >= 10); + return temp; - }, 0); + }, 0); // console.log( + // `${`\u001b[${33}m${`magicNumber`}\u001b[${39}m`} = ${JSON.stringify( + // magicNumber, + // null, + // 4 + // )}` + // ); + while (res.includes(soFarWeveGot)) { counter += 1; soFarWeveGot += lettersAndNumbers[reducedCodePointSum * magicNumber * counter % lettersAndNumbers.length]; } + generated = soFarWeveGot; } + res.push(generated); - if (generated.startsWith(".") && generated.length === 2 && !singleClasses[generated.slice(1)]) { + + if (generated.startsWith(".") && generated.length === 2 && singleClasses[generated.slice(1)] === false) { singleClasses[generated.slice(1)] = true; - } else if (generated.startsWith("#") && generated.length === 2 && !singleIds[generated.slice(1)]) { + } else if (generated.startsWith("#") && generated.length === 2 && singleIds[generated.slice(1)] === false) { singleIds[generated.slice(1)] = true; - } else if (!generated.startsWith(".") && !generated.startsWith("#") && generated.length === 1 && !singleNameonly[generated]) { + } else if (!generated.startsWith(".") && !generated.startsWith("#") && generated.length === 1 && singleNameonly[generated] === false) { singleNameonly[generated] = true; } - } + } // loop through all uglified values again and if the one letter name that + // matches current name's first letter (considering it might be id, class or + // just name), shorten that value up to that single letter. + for (var i = 0, _len = res.length; i < _len; i++) { + if (res[i].startsWith(".")) { - if (!singleClasses[res[i].slice(1, 2)]) { + // if particular class name starts with a letter which hasn't been taken + if (singleClasses[res[i].slice(1, 2)] === false) { singleClasses[res[i].slice(1, 2)] = res[i]; res[i] = res[i].slice(0, 2); - } else if (singleClasses[res[i].slice(1, 2)] === res[i]) { + } else if (singleClasses[res[i].slice(1, 2)] === res[i]) { // This means, particular class name was repeated in the list and + // was shortened. We must shorten it to the same value. + res[i] = res[i].slice(0, 2); } } else if (res[i].startsWith("#")) { - if (!singleIds[res[i].slice(1, 2)]) { + if (singleIds[res[i].slice(1, 2)] === false) { singleIds[res[i].slice(1, 2)] = res[i]; res[i] = res[i].slice(0, 2); } else if (singleIds[res[i].slice(1, 2)] === res[i]) { + // This means, particular id name was repeated in the list and + // was shortened. We must shorten it to the same value. res[i] = res[i].slice(0, 2); } } else if (!res[i].startsWith(".") && !res[i].startsWith("#")) { @@ -184,15 +226,20 @@ function uglifyArr(arr) { singleNameonly[res[i].slice(0, 1)] = res[i]; res[i] = res[i].slice(0, 1); } else if (singleNameonly[res[i].slice(0, 1)] === res[i]) { + // This means, particular id name was repeated in the list and + // was shortened. We must shorten it to the same value. res[i] = res[i].slice(0, 1); } } } + return res; -} +} // main function - converts n-th string in a given reference array of strings + + function uglifyById(refArr, idNum) { return uglifyArr(refArr)[idNum]; -} +} // main export exports.uglifyArr = uglifyArr; exports.uglifyById = uglifyById; diff --git a/packages/string-uglify/dist/string-uglify.dev.umd.js b/packages/string-uglify/dist/string-uglify.dev.umd.js index f93e290c4f..d349758eac 100644 --- a/packages/string-uglify/dist/string-uglify.dev.umd.js +++ b/packages/string-uglify/dist/string-uglify.dev.umd.js @@ -8,240 +8,245 @@ */ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.stringUglify = {})); +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.stringUglify = {})); }(this, (function (exports) { 'use strict'; - var version = "1.3.4"; - - var isArr = Array.isArray; // tells code point of a given id number - - function tellcp(str, idNum) { - return str.codePointAt(idNum); - } // converts whole array into array uglified names - - - function uglifyArr(arr) { - var letters = "abcdefghijklmnopqrstuvwxyz"; - var lettersAndNumbers = "abcdefghijklmnopqrstuvwxyz0123456789"; - var singleClasses = { - a: false, - b: false, - c: false, - d: false, - e: false, - f: false, - g: false, - h: false, - i: false, - j: false, - k: false, - l: false, - m: false, - n: false, - o: false, - p: false, - q: false, - r: false, - s: false, - t: false, - u: false, - v: false, - w: false, - x: false, - y: false, - z: false - }; - var singleIds = { - a: false, - b: false, - c: false, - d: false, - e: false, - f: false, - g: false, - h: false, - i: false, - j: false, - k: false, - l: false, - m: false, - n: false, - o: false, - p: false, - q: false, - r: false, - s: false, - t: false, - u: false, - v: false, - w: false, - x: false, - y: false, - z: false - }; - var singleNameonly = { - a: false, - b: false, - c: false, - d: false, - e: false, - f: false, - g: false, - h: false, - i: false, - j: false, - k: false, - l: false, - m: false, - n: false, - o: false, - p: false, - q: false, - r: false, - s: false, - t: false, - u: false, - v: false, - w: false, - x: false, - y: false, - z: false - }; // final array we'll assemble and eventually return - - var res = []; // quick end - - if (!isArr(arr) || !arr.length) { - return arr; +var version = "1.3.4"; + +function tellcp(str, idNum) { + if (idNum === void 0) { + idNum = 0; + } + + return str.codePointAt(idNum) || 0; +} // converts whole array into array uglified names + + +function uglifyArr(arr) { + var letters = "abcdefghijklmnopqrstuvwxyz"; + var lettersAndNumbers = "abcdefghijklmnopqrstuvwxyz0123456789"; + var singleClasses = { + a: false, + b: false, + c: false, + d: false, + e: false, + f: false, + g: false, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + n: false, + o: false, + p: false, + q: false, + r: false, + s: false, + t: false, + u: false, + v: false, + w: false, + x: false, + y: false, + z: false + }; + var singleIds = { + a: false, + b: false, + c: false, + d: false, + e: false, + f: false, + g: false, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + n: false, + o: false, + p: false, + q: false, + r: false, + s: false, + t: false, + u: false, + v: false, + w: false, + x: false, + y: false, + z: false + }; + var singleNameonly = { + a: false, + b: false, + c: false, + d: false, + e: false, + f: false, + g: false, + h: false, + i: false, + j: false, + k: false, + l: false, + m: false, + n: false, + o: false, + p: false, + q: false, + r: false, + s: false, + t: false, + u: false, + v: false, + w: false, + x: false, + y: false, + z: false + }; // final array we'll assemble and eventually return + + var res = []; // quick end + + if (!Array.isArray(arr) || !arr.length) { + return arr; + } + + for (var id = 0, len = arr.length; id < len; id++) { + // insurance against duplicate reference array values + if (arr.indexOf(arr[id]) < id) { + // push again the calculated value from "res": + res.push(res[arr.indexOf(arr[id])]); + continue; } - for (var id = 0, len = arr.length; id < len; id++) { - // insurance against duplicate reference array values - if (arr.indexOf(arr[id]) < id) { - // push again the calculated value from "res": - res.push(res[arr.indexOf(arr[id])]); + var prefix = ".#".includes(arr[id][0]) ? arr[id][0] : ""; + var codePointSum = Array.from(arr[id]).reduce(function (acc, curr) { + return acc + tellcp(curr); + }, 0); + + if (".#".includes(arr[id][0]) && arr[id].length < 4 || !".#".includes(arr[id][0]) && arr[id].length < 3) { + var val = arr[id]; + + if (!res.includes(val)) { + res.push(val); // the first candidates for single-character value are 2-char long classes: + + if (val.startsWith(".") && val.length === 2 && singleClasses[val.slice(1)] === false) { + // mark the letter as used + singleClasses[val.slice(1)] = true; + } else if (val.startsWith("#") && val.length === 2 && singleIds[val.slice(1)] === false) { + // mark the letter as used + singleIds[val.slice(1)] = true; + } else if (!val.startsWith(".") && !val.startsWith("#") && val.length === 1 && singleNameonly[val] === false) { + // mark the letter as used + singleNameonly[val] = true; + } + continue; } + } + + var generated = "" + prefix + letters[codePointSum % letters.length] + lettersAndNumbers[codePointSum % lettersAndNumbers.length]; - var prefix = ".#".includes(arr[id][0]) ? arr[id][0] : ""; - var codePointSum = Array.from(arr[id]).reduce(function (acc, curr) { - return acc + tellcp(curr); + if (res.includes(generated)) { + // add more characters: + var soFarWeveGot = generated; + var counter = 0; + var reducedCodePointSum = Array.from(arr[id]).reduce(function (acc, curr) { + return acc < 200 ? acc + tellcp(curr) : (acc + tellcp(curr)) % lettersAndNumbers.length; }, 0); + var magicNumber = Array.from(arr[id]).map(function (val) { + return tellcp(val); + }).reduce(function (accum, curr) { + var temp = accum + curr; + + do { + temp = String(temp).split("").reduce(function (acc, curr1) { + return acc + Number.parseInt(curr1, 10); + }, 0); + } while (temp >= 10); + + return temp; + }, 0); // console.log( + // `${`\u001b[${33}m${`magicNumber`}\u001b[${39}m`} = ${JSON.stringify( + // magicNumber, + // null, + // 4 + // )}` + // ); + + while (res.includes(soFarWeveGot)) { + counter += 1; + soFarWeveGot += lettersAndNumbers[reducedCodePointSum * magicNumber * counter % lettersAndNumbers.length]; + } - if (".#".includes(arr[id][0]) && arr[id].length < 4 || !".#".includes(arr[id][0]) && arr[id].length < 3) { - var val = arr[id]; + generated = soFarWeveGot; + } - if (!res.includes(val)) { - res.push(val); + res.push(generated); - if (val.startsWith(".") && val.length === 2 && !singleClasses[val.slice(1)]) { - singleClasses[val.slice(1)] = true; - } else if (val.startsWith("#") && val.length === 2 && !singleIds[val.slice(1)]) { - singleIds[val.slice(1)] = true; - } else if (!val.startsWith(".") && !val.startsWith("#") && val.length === 1 && !singleNameonly[val]) { - singleNameonly[val] = true; - } + if (generated.startsWith(".") && generated.length === 2 && singleClasses[generated.slice(1)] === false) { + singleClasses[generated.slice(1)] = true; + } else if (generated.startsWith("#") && generated.length === 2 && singleIds[generated.slice(1)] === false) { + singleIds[generated.slice(1)] = true; + } else if (!generated.startsWith(".") && !generated.startsWith("#") && generated.length === 1 && singleNameonly[generated] === false) { + singleNameonly[generated] = true; + } + } // loop through all uglified values again and if the one letter name that + // matches current name's first letter (considering it might be id, class or + // just name), shorten that value up to that single letter. - continue; - } - } + for (var i = 0, _len = res.length; i < _len; i++) { - var generated = "".concat(prefix).concat(letters[codePointSum % letters.length]).concat(lettersAndNumbers[codePointSum % lettersAndNumbers.length]); - - if (res.includes(generated)) { - // add more characters: - var soFarWeveGot = generated; - var counter = 0; - var reducedCodePointSum = Array.from(arr[id]).reduce(function (acc, curr) { - return acc < 200 ? acc + tellcp(curr) : (acc + tellcp(curr)) % lettersAndNumbers.length; - }, 0); - var magicNumber = Array.from(arr[id]).map(function (val) { - return tellcp(val); - }).reduce(function (accum, curr) { - var temp = accum + curr; - - do { - temp = String(temp).split("").reduce(function (acc, curr1) { - return acc + Number.parseInt(curr1, 10); - }, 0); - } while (temp >= 10); - - return temp; - }, 0); // console.log( - // `${`\u001b[${33}m${`magicNumber`}\u001b[${39}m`} = ${JSON.stringify( - // magicNumber, - // null, - // 4 - // )}` - // ); - - while (res.includes(soFarWeveGot)) { - counter += 1; - soFarWeveGot += lettersAndNumbers[reducedCodePointSum * magicNumber * counter % lettersAndNumbers.length]; - } + if (res[i].startsWith(".")) { + // if particular class name starts with a letter which hasn't been taken + if (singleClasses[res[i].slice(1, 2)] === false) { + singleClasses[res[i].slice(1, 2)] = res[i]; + res[i] = res[i].slice(0, 2); + } else if (singleClasses[res[i].slice(1, 2)] === res[i]) { // This means, particular class name was repeated in the list and + // was shortened. We must shorten it to the same value. - generated = soFarWeveGot; + res[i] = res[i].slice(0, 2); } - - res.push(generated); - - if (generated.startsWith(".") && generated.length === 2 && !singleClasses[generated.slice(1)]) { - singleClasses[generated.slice(1)] = true; - } else if (generated.startsWith("#") && generated.length === 2 && !singleIds[generated.slice(1)]) { - singleIds[generated.slice(1)] = true; - } else if (!generated.startsWith(".") && !generated.startsWith("#") && generated.length === 1 && !singleNameonly[generated]) { - singleNameonly[generated] = true; + } else if (res[i].startsWith("#")) { + if (singleIds[res[i].slice(1, 2)] === false) { + singleIds[res[i].slice(1, 2)] = res[i]; + res[i] = res[i].slice(0, 2); + } else if (singleIds[res[i].slice(1, 2)] === res[i]) { + // This means, particular id name was repeated in the list and + // was shortened. We must shorten it to the same value. + res[i] = res[i].slice(0, 2); } - } // loop through all uglified values again and if the one letter name that - // matches current name's first letter (considering it might be id, class or - // just name), shorten that value up to that single letter. - - - for (var i = 0, _len = res.length; i < _len; i++) { - if (res[i].startsWith(".")) { - // if particular class name starts with a letter which hasn't been taken - if (!singleClasses[res[i].slice(1, 2)]) { - singleClasses[res[i].slice(1, 2)] = res[i]; - res[i] = res[i].slice(0, 2); - } else if (singleClasses[res[i].slice(1, 2)] === res[i]) { - // This means, particular class name was repeated in the list and - // was shortened. We must shorten it to the same value. - res[i] = res[i].slice(0, 2); - } - } else if (res[i].startsWith("#")) { - if (!singleIds[res[i].slice(1, 2)]) { - singleIds[res[i].slice(1, 2)] = res[i]; - res[i] = res[i].slice(0, 2); - } else if (singleIds[res[i].slice(1, 2)] === res[i]) { - // This means, particular id name was repeated in the list and - // was shortened. We must shorten it to the same value. - res[i] = res[i].slice(0, 2); - } - } else if (!res[i].startsWith(".") && !res[i].startsWith("#")) { - if (!singleNameonly[res[i].slice(0, 1)]) { - singleNameonly[res[i].slice(0, 1)] = res[i]; - res[i] = res[i].slice(0, 1); - } else if (singleNameonly[res[i].slice(0, 1)] === res[i]) { - // This means, particular id name was repeated in the list and - // was shortened. We must shorten it to the same value. - res[i] = res[i].slice(0, 1); - } + } else if (!res[i].startsWith(".") && !res[i].startsWith("#")) { + if (!singleNameonly[res[i].slice(0, 1)]) { + singleNameonly[res[i].slice(0, 1)] = res[i]; + res[i] = res[i].slice(0, 1); + } else if (singleNameonly[res[i].slice(0, 1)] === res[i]) { + // This means, particular id name was repeated in the list and + // was shortened. We must shorten it to the same value. + res[i] = res[i].slice(0, 1); } } + } - return res; - } // main function - converts n-th string in a given reference array of strings + return res; +} // main function - converts n-th string in a given reference array of strings - function uglifyById(refArr, idNum) { - return uglifyArr(refArr)[idNum]; - } // main export +function uglifyById(refArr, idNum) { + return uglifyArr(refArr)[idNum]; +} // main export - exports.uglifyArr = uglifyArr; - exports.uglifyById = uglifyById; - exports.version = version; +exports.uglifyArr = uglifyArr; +exports.uglifyById = uglifyById; +exports.version = version; - Object.defineProperty(exports, '__esModule', { value: true }); +Object.defineProperty(exports, '__esModule', { value: true }); }))); diff --git a/packages/string-uglify/dist/string-uglify.esm.js b/packages/string-uglify/dist/string-uglify.esm.js index 77299309ab..7894f589a7 100644 --- a/packages/string-uglify/dist/string-uglify.esm.js +++ b/packages/string-uglify/dist/string-uglify.esm.js @@ -9,10 +9,11 @@ var version = "1.3.4"; -const isArr = Array.isArray; -function tellcp(str, idNum) { - return str.codePointAt(idNum); -} +function tellcp(str, idNum = 0) { + return str.codePointAt(idNum) || 0; +} // converts whole array into array uglified names + + function uglifyArr(arr) { const letters = "abcdefghijklmnopqrstuvwxyz"; const lettersAndNumbers = "abcdefghijklmnopqrstuvwxyz0123456789"; @@ -42,7 +43,7 @@ function uglifyArr(arr) { w: false, x: false, y: false, - z: false, + z: false }; const singleIds = { a: false, @@ -70,7 +71,7 @@ function uglifyArr(arr) { w: false, x: false, y: false, - z: false, + z: false }; const singleNameonly = { a: false, @@ -98,121 +99,110 @@ function uglifyArr(arr) { w: false, x: false, y: false, - z: false, - }; - const res = []; - if (!isArr(arr) || !arr.length) { + z: false + }; // final array we'll assemble and eventually return + + const res = []; // quick end + + if (!Array.isArray(arr) || !arr.length) { return arr; } + for (let id = 0, len = arr.length; id < len; id++) { + // insurance against duplicate reference array values if (arr.indexOf(arr[id]) < id) { + // push again the calculated value from "res": res.push(res[arr.indexOf(arr[id])]); continue; } + const prefix = `.#`.includes(arr[id][0]) ? arr[id][0] : ""; - const codePointSum = Array.from(arr[id]).reduce( - (acc, curr) => acc + tellcp(curr), - 0 - ); - if ( - (`.#`.includes(arr[id][0]) && arr[id].length < 4) || - (!`.#`.includes(arr[id][0]) && arr[id].length < 3) - ) { + const codePointSum = Array.from(arr[id]).reduce((acc, curr) => acc + tellcp(curr), 0); + + if (`.#`.includes(arr[id][0]) && arr[id].length < 4 || !`.#`.includes(arr[id][0]) && arr[id].length < 3) { const val = arr[id]; + if (!res.includes(val)) { - res.push(val); - if ( - val.startsWith(".") && - val.length === 2 && - !singleClasses[val.slice(1)] - ) { + res.push(val); // the first candidates for single-character value are 2-char long classes: + + if (val.startsWith(".") && val.length === 2 && singleClasses[val.slice(1)] === false) { + // mark the letter as used singleClasses[val.slice(1)] = true; - } else if ( - val.startsWith("#") && - val.length === 2 && - !singleIds[val.slice(1)] - ) { + } else if (val.startsWith("#") && val.length === 2 && singleIds[val.slice(1)] === false) { + // mark the letter as used singleIds[val.slice(1)] = true; - } else if ( - !val.startsWith(".") && - !val.startsWith("#") && - val.length === 1 && - !singleNameonly[val] - ) { + } else if (!val.startsWith(".") && !val.startsWith("#") && val.length === 1 && singleNameonly[val] === false) { + // mark the letter as used singleNameonly[val] = true; } + continue; } } - let generated = `${prefix}${letters[codePointSum % letters.length]}${ - lettersAndNumbers[codePointSum % lettersAndNumbers.length] - }`; + + let generated = `${prefix}${letters[codePointSum % letters.length]}${lettersAndNumbers[codePointSum % lettersAndNumbers.length]}`; + if (res.includes(generated)) { + // add more characters: let soFarWeveGot = generated; let counter = 0; - const reducedCodePointSum = Array.from(arr[id]).reduce( - (acc, curr) => - acc < 200 - ? acc + tellcp(curr) - : (acc + tellcp(curr)) % lettersAndNumbers.length, - 0 - ); - const magicNumber = Array.from(arr[id]) - .map((val) => tellcp(val)) - .reduce((accum, curr) => { - let temp = accum + curr; - do { - temp = String(temp) - .split("") - .reduce((acc, curr1) => acc + Number.parseInt(curr1, 10), 0); - } while (temp >= 10); - return temp; - }, 0); + const reducedCodePointSum = Array.from(arr[id]).reduce((acc, curr) => acc < 200 ? acc + tellcp(curr) : (acc + tellcp(curr)) % lettersAndNumbers.length, 0); + const magicNumber = Array.from(arr[id]).map(val => tellcp(val)).reduce((accum, curr) => { + let temp = accum + curr; + + do { + temp = String(temp).split("").reduce((acc, curr1) => acc + Number.parseInt(curr1, 10), 0); + } while (temp >= 10); + + return temp; + }, 0); // console.log( + // `${`\u001b[${33}m${`magicNumber`}\u001b[${39}m`} = ${JSON.stringify( + // magicNumber, + // null, + // 4 + // )}` + // ); + while (res.includes(soFarWeveGot)) { counter += 1; - soFarWeveGot += - lettersAndNumbers[ - (reducedCodePointSum * magicNumber * counter) % - lettersAndNumbers.length - ]; + soFarWeveGot += lettersAndNumbers[reducedCodePointSum * magicNumber * counter % lettersAndNumbers.length]; } + generated = soFarWeveGot; } + res.push(generated); - if ( - generated.startsWith(".") && - generated.length === 2 && - !singleClasses[generated.slice(1)] - ) { + + if (generated.startsWith(".") && generated.length === 2 && singleClasses[generated.slice(1)] === false) { singleClasses[generated.slice(1)] = true; - } else if ( - generated.startsWith("#") && - generated.length === 2 && - !singleIds[generated.slice(1)] - ) { + } else if (generated.startsWith("#") && generated.length === 2 && singleIds[generated.slice(1)] === false) { singleIds[generated.slice(1)] = true; - } else if ( - !generated.startsWith(".") && - !generated.startsWith("#") && - generated.length === 1 && - !singleNameonly[generated] - ) { + } else if (!generated.startsWith(".") && !generated.startsWith("#") && generated.length === 1 && singleNameonly[generated] === false) { singleNameonly[generated] = true; } - } + } // loop through all uglified values again and if the one letter name that + // matches current name's first letter (considering it might be id, class or + // just name), shorten that value up to that single letter. + for (let i = 0, len = res.length; i < len; i++) { + if (res[i].startsWith(".")) { - if (!singleClasses[res[i].slice(1, 2)]) { + // if particular class name starts with a letter which hasn't been taken + if (singleClasses[res[i].slice(1, 2)] === false) { singleClasses[res[i].slice(1, 2)] = res[i]; res[i] = res[i].slice(0, 2); - } else if (singleClasses[res[i].slice(1, 2)] === res[i]) { + } else if (singleClasses[res[i].slice(1, 2)] === res[i]) { // This means, particular class name was repeated in the list and + // was shortened. We must shorten it to the same value. + res[i] = res[i].slice(0, 2); } } else if (res[i].startsWith("#")) { - if (!singleIds[res[i].slice(1, 2)]) { + if (singleIds[res[i].slice(1, 2)] === false) { singleIds[res[i].slice(1, 2)] = res[i]; res[i] = res[i].slice(0, 2); } else if (singleIds[res[i].slice(1, 2)] === res[i]) { + // This means, particular id name was repeated in the list and + // was shortened. We must shorten it to the same value. res[i] = res[i].slice(0, 2); } } else if (!res[i].startsWith(".") && !res[i].startsWith("#")) { @@ -220,14 +210,19 @@ function uglifyArr(arr) { singleNameonly[res[i].slice(0, 1)] = res[i]; res[i] = res[i].slice(0, 1); } else if (singleNameonly[res[i].slice(0, 1)] === res[i]) { + // This means, particular id name was repeated in the list and + // was shortened. We must shorten it to the same value. res[i] = res[i].slice(0, 1); } } } + return res; -} +} // main function - converts n-th string in a given reference array of strings + + function uglifyById(refArr, idNum) { return uglifyArr(refArr)[idNum]; -} +} // main export export { uglifyArr, uglifyById, version }; diff --git a/packages/string-uglify/dist/string-uglify.mjs b/packages/string-uglify/dist/string-uglify.mjs new file mode 100644 index 0000000000..3865b433fd --- /dev/null +++ b/packages/string-uglify/dist/string-uglify.mjs @@ -0,0 +1,10 @@ +/** + * string-uglify + * Shorten sets of strings deterministically, to be git-friendly + * Version: 1.3.4 + * Author: Roy Revelt, Codsen Ltd + * License: MIT + * Homepage: https://codsen.com/os/string-uglify/ + */ + +var t="1.3.4";function e(t,e=0){return t.codePointAt(e)||0}function s(t){const s="abcdefghijklmnopqrstuvwxyz",i="abcdefghijklmnopqrstuvwxyz0123456789",l={a:!1,b:!1,c:!1,d:!1,e:!1,f:!1,g:!1,h:!1,i:!1,j:!1,k:!1,l:!1,m:!1,n:!1,o:!1,p:!1,q:!1,r:!1,s:!1,t:!1,u:!1,v:!1,w:!1,x:!1,y:!1,z:!1},r={a:!1,b:!1,c:!1,d:!1,e:!1,f:!1,g:!1,h:!1,i:!1,j:!1,k:!1,l:!1,m:!1,n:!1,o:!1,p:!1,q:!1,r:!1,s:!1,t:!1,u:!1,v:!1,w:!1,x:!1,y:!1,z:!1},c={a:!1,b:!1,c:!1,d:!1,e:!1,f:!1,g:!1,h:!1,i:!1,j:!1,k:!1,l:!1,m:!1,n:!1,o:!1,p:!1,q:!1,r:!1,s:!1,t:!1,u:!1,v:!1,w:!1,x:!1,y:!1,z:!1},n=[];if(!Array.isArray(t)||!t.length)return t;for(let h=0,u=t.length;u>h;h++){if(t.indexOf(t[h])t+e(s)),0);if(".#".includes(t[h][0])&&4>t[h].length||!".#".includes(t[h][0])&&3>t[h].length){const e=t[h];if(!n.includes(e)){n.push(e),e.startsWith(".")&&2===e.length&&!1===l[e.slice(1)]?l[e.slice(1)]=!0:e.startsWith("#")&&2===e.length&&!1===r[e.slice(1)]?r[e.slice(1)]=!0:e.startsWith(".")||e.startsWith("#")||1!==e.length||!1!==c[e]||(c[e]=!0);continue}}let o=`${u}${s[a%26]}${i[a%36]}`;if(n.includes(o)){let s=o,l=0;const r=Array.from(t[h]).reduce(((t,s)=>200>t?t+e(s):(t+e(s))%36),0),c=Array.from(t[h]).map((t=>e(t))).reduce(((t,e)=>{let s=t+e;do{s=(s+"").split("").reduce(((t,e)=>t+Number.parseInt(e,10)),0)}while(s>=10);return s}),0);for(;n.includes(s);)l+=1,s+=i[r*c*l%36];o=s}n.push(o),o.startsWith(".")&&2===o.length&&!1===l[o.slice(1)]?l[o.slice(1)]=!0:o.startsWith("#")&&2===o.length&&!1===r[o.slice(1)]?r[o.slice(1)]=!0:o.startsWith(".")||o.startsWith("#")||1!==o.length||!1!==c[o]||(c[o]=!0)}for(let t=0,e=n.length;e>t;t++)n[t].startsWith(".")?!1===l[n[t].slice(1,2)]?(l[n[t].slice(1,2)]=n[t],n[t]=n[t].slice(0,2)):l[n[t].slice(1,2)]===n[t]&&(n[t]=n[t].slice(0,2)):n[t].startsWith("#")?!1===r[n[t].slice(1,2)]?(r[n[t].slice(1,2)]=n[t],n[t]=n[t].slice(0,2)):r[n[t].slice(1,2)]===n[t]&&(n[t]=n[t].slice(0,2)):n[t].startsWith(".")||n[t].startsWith("#")||(c[n[t].slice(0,1)]?c[n[t].slice(0,1)]===n[t]&&(n[t]=n[t].slice(0,1)):(c[n[t].slice(0,1)]=n[t],n[t]=n[t].slice(0,1)));return n}function i(t,e){return s(t)[e]}export{s as uglifyArr,i as uglifyById,t as version}; diff --git a/packages/string-uglify/dist/string-uglify.umd.js b/packages/string-uglify/dist/string-uglify.umd.js index 0def97a8e9..616b2e9f94 100644 --- a/packages/string-uglify/dist/string-uglify.umd.js +++ b/packages/string-uglify/dist/string-uglify.umd.js @@ -7,4 +7,4 @@ * Homepage: https://codsen.com/os/string-uglify/ */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).stringUglify={})}(this,(function(e){"use strict";var t=Array.isArray;function i(e,t){return e.codePointAt(t)}function n(e){var n="abcdefghijklmnopqrstuvwxyz",r="abcdefghijklmnopqrstuvwxyz0123456789",s={a:!1,b:!1,c:!1,d:!1,e:!1,f:!1,g:!1,h:!1,i:!1,j:!1,k:!1,l:!1,m:!1,n:!1,o:!1,p:!1,q:!1,r:!1,s:!1,t:!1,u:!1,v:!1,w:!1,x:!1,y:!1,z:!1},l={a:!1,b:!1,c:!1,d:!1,e:!1,f:!1,g:!1,h:!1,i:!1,j:!1,k:!1,l:!1,m:!1,n:!1,o:!1,p:!1,q:!1,r:!1,s:!1,t:!1,u:!1,v:!1,w:!1,x:!1,y:!1,z:!1},c={a:!1,b:!1,c:!1,d:!1,e:!1,f:!1,g:!1,h:!1,i:!1,j:!1,k:!1,l:!1,m:!1,n:!1,o:!1,p:!1,q:!1,r:!1,s:!1,t:!1,u:!1,v:!1,w:!1,x:!1,y:!1,z:!1},u=[];if(!t(e)||!e.length)return e;for(var f=0,o=e.length;f=10);return i}),0);u.includes(p);)p+=r[v*m*(y+=1)%r.length];g=p}u.push(g),g.startsWith(".")&&2===g.length&&!s[g.slice(1)]?s[g.slice(1)]=!0:g.startsWith("#")&&2===g.length&&!l[g.slice(1)]?l[g.slice(1)]=!0:g.startsWith(".")||g.startsWith("#")||1!==g.length||c[g]||(c[g]=!0)}for(var W=0,b=u.length;Wu;u++)if(e.indexOf(e[u])e[u].length||!".#".includes(e[u][0])&&3>e[u].length){var h=e[u];if(!c.includes(h)){c.push(h),h.startsWith(".")&&2===h.length&&!1===r[h.slice(1)]?r[h.slice(1)]=!0:h.startsWith("#")&&2===h.length&&!1===n[h.slice(1)]?n[h.slice(1)]=!0:h.startsWith(".")||h.startsWith("#")||1!==h.length||!1!==l[h]||(l[h]=!0);continue}}var d=""+o+i[a%26]+s[a%36];if(c.includes(d)){for(var g=d,p=0,y=Array.from(e[u]).reduce((function(e,i){return 200>e?e+t(i):(e+t(i))%36}),0),v=Array.from(e[u]).map((function(e){return t(e)})).reduce((function(e,t){var i=e+t;do{i=(i+"").split("").reduce((function(e,t){return e+Number.parseInt(t,10)}),0)}while(i>=10);return i}),0);c.includes(g);)g+=s[y*v*(p+=1)%36];d=g}c.push(d),d.startsWith(".")&&2===d.length&&!1===r[d.slice(1)]?r[d.slice(1)]=!0:d.startsWith("#")&&2===d.length&&!1===n[d.slice(1)]?n[d.slice(1)]=!0:d.startsWith(".")||d.startsWith("#")||1!==d.length||!1!==l[d]||(l[d]=!0)}for(var m=0,W=c.length;W>m;m++)c[m].startsWith(".")?!1===r[c[m].slice(1,2)]?(r[c[m].slice(1,2)]=c[m],c[m]=c[m].slice(0,2)):r[c[m].slice(1,2)]===c[m]&&(c[m]=c[m].slice(0,2)):c[m].startsWith("#")?!1===n[c[m].slice(1,2)]?(n[c[m].slice(1,2)]=c[m],c[m]=c[m].slice(0,2)):n[c[m].slice(1,2)]===c[m]&&(c[m]=c[m].slice(0,2)):c[m].startsWith(".")||c[m].startsWith("#")||(l[c[m].slice(0,1)]?l[c[m].slice(0,1)]===c[m]&&(c[m]=c[m].slice(0,1)):(l[c[m].slice(0,1)]=c[m],c[m]=c[m].slice(0,1)));return c}e.uglifyArr=i,e.uglifyById=function(e,t){return i(e)[t]},e.version="1.3.4",Object.defineProperty(e,"__esModule",{value:!0})})); diff --git a/packages/string-uglify/examples/_quickTake.js b/packages/string-uglify/examples/_quickTake.js index c6c59b6003..ef7e77811a 100644 --- a/packages/string-uglify/examples/_quickTake.js +++ b/packages/string-uglify/examples/_quickTake.js @@ -1,5 +1,3 @@ -/* eslint import/extensions:0, no-unused-vars:0 */ - // Quick Take import { strict as assert } from "assert"; diff --git a/packages/string-uglify/package.json b/packages/string-uglify/package.json index 4526d75346..982cced994 100644 --- a/packages/string-uglify/package.json +++ b/packages/string-uglify/package.json @@ -31,15 +31,17 @@ "main": "dist/string-uglify.cjs.js", "module": "dist/string-uglify.esm.js", "browser": "dist/string-uglify.umd.js", + "types": "types/main.d.ts", "scripts": { - "build": "rollup -c", + "build": "npm run clean_types -- --pt1 && rollup -c && npm run clean_types -- --pt2", "ci_test": "npm run build && npm run lint && tap --no-only --reporter=silent --output-file=testStats.md && npm run clean_cov && npm run format", "clean_cov": "../../scripts/leaveCoverageTotalOnly.js", - "dev": "rollup -c --dev", + "clean_types": "../../scripts/cleanTypes.js", + "dev": "npm run clean_types -- --pt1 && rollup -c --dev && npm run clean_types -- --pt2", "devunittest": "npm run dev && ./node_modules/.bin/tap --only -R 'base' && npm run tsd && npm run clean_cov", "format": "npm run lect && npm run prettier && npm run lint", "lect": "lect", - "lint": "../../node_modules/eslint/bin/eslint.js \"**/*.js\" --fix --config \"../../.eslintrc.json\" --quiet", + "lint": "../../node_modules/eslint/bin/eslint.js . --ext .js --ext .ts --fix --config \"../../.eslintrc.json\" --quiet", "perf": "node perf/check", "prepare": "npm run build", "prettier": "../../node_modules/prettier/bin-prettier.js '*.{js,css,scss,vue,md,ts}' --write --loglevel silent", @@ -48,15 +50,11 @@ "pretest": "npm run build", "test": "npm run lint && npm run unittest && npm run test:examples && npm run clean_cov && npm run format", "test:examples": "../../scripts/test-examples.js && npm run lect && npm run prettier", + "tsc": "tsc", "tsd": "test ! -f index.d.ts || tsd", - "unittest": "./node_modules/.bin/tap --no-only --output-file=testStats.md --reporter=terse && npm run tsd && npm run clean_cov && npm run perf", + "unittest": "./node_modules/.bin/tap --no-only --output-file=testStats.md --reporter=terse && tsc --noEmit && npm run tsd && npm run clean_cov && npm run perf", "version": "npm run build && git add ." }, - "husky": { - "hooks": { - "pre-commit": "npm run format && npm test" - } - }, "tap": { "coverage-report": [ "json-summary", @@ -69,53 +67,43 @@ "timeout": 0 }, "lect": { - "defaultExported": false, - "files": { - "delete": [], - "write_hard": [ - { - "contents": "", - "name": "" - } - ], - "write_soft": [ - { - "contents": "", - "name": "" - } - ] - }, "licence": { "extras": [ "" ] }, - "npmignore": { - "badFiles": [], - "badFolders": [], - "goodFiles": [], - "goodFolders": [] - }, "req": "{ uglifyById, uglifyArr, version }", "various": { - "devDependencies": [ - "@rollup/plugin-json" - ] + "devDependencies": [] } }, + "dependencies": { + "@babel/runtime": "^7.9.2" + }, "devDependencies": { + "@babel/cli": "^7.12.10", "@babel/core": "^7.12.10", + "@babel/node": "^7.12.10", + "@babel/plugin-external-helpers": "^7.12.1", "@babel/plugin-proposal-class-properties": "^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", "@babel/plugin-proposal-object-rest-spread": "^7.12.1", "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-transform-runtime": "^7.12.10", "@babel/preset-env": "^7.12.10", + "@babel/preset-typescript": "^7.12.7", + "@babel/register": "^7.12.10", "@rollup/plugin-babel": "^5.2.2", "@rollup/plugin-commonjs": "^17.0.0", "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-node-resolve": "^11.0.1", + "@rollup/plugin-replace": "^2.3.4", "@rollup/plugin-strip": "^2.0.0", - "benchmark": "^2.1.4", + "@rollup/plugin-typescript": "^8.1.0", + "@types/node": "^13.13.4", + "@types/tap": "^14.10.1", + "@typescript-eslint/eslint-plugin": "^4.11.0", + "@typescript-eslint/parser": "^4.11.0", "eslint": "^7.15.0", "lect": "^0.15.1", "rollup": "^2.35.1", @@ -124,6 +112,8 @@ "rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-terser": "^7.0.2", "tap": "^14.11.0", - "tsd": "^0.14.0" + "tsd": "^0.14.0", + "tslib": "^2.0.3", + "typescript": "^4.1.3" } } \ No newline at end of file diff --git a/packages/string-uglify/perf/historical.json b/packages/string-uglify/perf/historical.json index 8e67cc16ab..f1aa7f82bd 100644 --- a/packages/string-uglify/perf/historical.json +++ b/packages/string-uglify/perf/historical.json @@ -39,6 +39,7 @@ "1.2.40": 139343.52140535566, "1.2.44": 151340.46185523632, "1.3.3": 138622.4849986897, - "lastPublished": 138622.4849986897, - "lastRan": 138622.4849986897 + "1.3.4": 161337.95562839496, + "lastPublished": 161337.95562839496, + "lastRan": 161337.95562839496 } \ No newline at end of file diff --git a/packages/string-uglify/rollup.config.js b/packages/string-uglify/rollup.config.js index fa054d37d9..fdcd230a4e 100644 --- a/packages/string-uglify/rollup.config.js +++ b/packages/string-uglify/rollup.config.js @@ -1,6 +1,8 @@ -import resolve from "@rollup/plugin-node-resolve"; +import { nodeResolve } from "@rollup/plugin-node-resolve"; +import typescript from "@rollup/plugin-typescript"; import commonjs from "@rollup/plugin-commonjs"; import { terser } from "rollup-plugin-terser"; +import replace from "@rollup/plugin-replace"; import cleanup from "rollup-plugin-cleanup"; import banner from "rollup-plugin-banner"; import babel from "@rollup/plugin-babel"; @@ -15,86 +17,226 @@ Author: Roy Revelt, Codsen Ltd License: ${pkg.license} Homepage: ${pkg.homepage}`; +const extensions = [".mjs", ".js", ".json", ".node", ".ts"]; +const babelRuntimeVersion = pkg.dependencies["@babel/runtime"].replace( + /^[^0-9]*/, + "" +); + +const makeExternalPredicate = (externalArr) => { + if (externalArr.length === 0) { + return () => false; + } + const pattern = new RegExp(`^(${externalArr.join("|")})($|/)`); + return (id) => pattern.test(id); +}; + export default (commandLineArgs) => { const finalConfig = [ - // browser-friendly UMD build + // UMD Production { - input: "src/main.js", + input: "src/main.ts", output: { file: pkg.browser, format: "umd", name: "stringUglify", + indent: false, }, plugins: [ - !commandLineArgs.dev && - strip({ - sourceMap: false, - }), - resolve(), + nodeResolve({ + extensions, + }), json(), commonjs(), + typescript({ + tsconfig: "../../tsconfig.build.json", + declaration: false, + }), babel({ + extensions, + exclude: "node_modules/**", rootMode: "upward", + babelHelpers: "bundled", + }), + replace({ + "process.env.NODE_ENV": JSON.stringify("production"), + }), + !commandLineArgs.dev && + strip({ + sourceMap: false, + include: ["src/**/*.(js|ts)"], + functions: ["console.*"], + }), + terser({ + compress: { + pure_getters: true, + unsafe: true, + unsafe_comps: true, + warnings: false, + }, }), - terser(), banner(licensePiece), ], }, - // browser-friendly UMD build, non-minified, for dev purposes + // UMD development { - input: "src/main.js", + input: "src/main.ts", output: { file: `dist/${pkg.name}.dev.umd.js`, format: "umd", name: "stringUglify", + indent: false, }, plugins: [ - !commandLineArgs.dev && - strip({ - sourceMap: false, - }), - resolve(), + nodeResolve({ + extensions, + }), json(), + typescript({ + tsconfig: "../../tsconfig.build.json", + declaration: false, + }), commonjs(), babel({ + extensions, + exclude: "node_modules/**", rootMode: "upward", + babelHelpers: "bundled", + }), + replace({ + "process.env.NODE_ENV": JSON.stringify("development"), }), + !commandLineArgs.dev && + strip({ + sourceMap: false, + include: ["src/**/*.(js|ts)"], + functions: ["console.*"], + }), banner(licensePiece), ], }, - // CommonJS build (for Node) + // CommonJS { - input: "src/main.js", - output: [{ file: pkg.main, format: "cjs" }], - external: [], + input: "src/main.ts", + output: [ + { dir: "./", entryFileNames: pkg.main, format: "cjs", indent: false }, + ], + external: makeExternalPredicate([ + ...Object.keys(pkg.dependencies || {}), + ...Object.keys(pkg.peerDependencies || {}), + ]), plugins: [ + nodeResolve({ + extensions, + }), + json(), + typescript({ + tsconfig: "../../tsconfig.build.json", + declaration: true, + declarationDir: "./types", + }), + babel({ + extensions, + rootMode: "upward", + plugins: [ + [ + "@babel/plugin-transform-runtime", + { version: babelRuntimeVersion }, + ], + ], + babelHelpers: "runtime", + }), + cleanup({ comments: "istanbul" }), !commandLineArgs.dev && strip({ sourceMap: false, + include: ["src/**/*.(js|ts)"], + functions: ["console.*"], }), + banner(licensePiece), + ], + }, + + // ES + { + input: "src/main.ts", + output: [{ file: pkg.module, format: "es", indent: false }], + external: makeExternalPredicate([ + ...Object.keys(pkg.dependencies || {}), + ...Object.keys(pkg.peerDependencies || {}), + ]), + plugins: [ + nodeResolve({ + extensions, + }), json(), + typescript({ + tsconfig: "../../tsconfig.build.json", + declaration: false, + }), babel({ - rootMode: "upward", + extensions, + plugins: [ + [ + "@babel/plugin-transform-runtime", + { version: babelRuntimeVersion, useESModules: true }, + ], + ], + babelHelpers: "runtime", }), cleanup({ comments: "istanbul" }), + !commandLineArgs.dev && + strip({ + sourceMap: false, + include: ["src/**/*.(js|ts)"], + functions: ["console.*"], + }), banner(licensePiece), ], }, - // ES module build (for bundlers) + // ES for Browsers { - input: "src/main.js", - output: [{ file: pkg.module, format: "es" }], - external: [], + input: "src/main.ts", + output: [{ file: `dist/${pkg.name}.mjs`, format: "es", indent: false }], + external: makeExternalPredicate([ + ...Object.keys(pkg.dependencies || {}), + ...Object.keys(pkg.peerDependencies || {}), + ]), plugins: [ + nodeResolve({ + extensions, + }), + json(), + replace({ + "process.env.NODE_ENV": JSON.stringify("production"), + }), + typescript({ + tsconfig: "../../tsconfig.build.json", + declaration: false, + }), + babel({ + extensions, + exclude: "node_modules/**", + babelHelpers: "bundled", + }), !commandLineArgs.dev && strip({ sourceMap: false, + include: ["src/**/*.(js|ts)"], + functions: ["console.*"], }), - json(), cleanup({ comments: "istanbul" }), + terser({ + compress: { + pure_getters: true, + unsafe: true, + unsafe_comps: true, + warnings: false, + }, + }), banner(licensePiece), ], }, diff --git a/packages/string-uglify/src/main.js b/packages/string-uglify/src/main.ts similarity index 88% rename from packages/string-uglify/src/main.js rename to packages/string-uglify/src/main.ts index afacf6065a..ffa052e57a 100644 --- a/packages/string-uglify/src/main.js +++ b/packages/string-uglify/src/main.ts @@ -1,18 +1,20 @@ import { version } from "../package.json"; -const isArr = Array.isArray; - // tells code point of a given id number -function tellcp(str, idNum) { - return str.codePointAt(idNum); +function tellcp(str: string, idNum = 0): number { + return str.codePointAt(idNum) || 0; +} + +interface Obj { + [key: string]: any; } // converts whole array into array uglified names -function uglifyArr(arr) { +function uglifyArr(arr: string[]): string[] { const letters = "abcdefghijklmnopqrstuvwxyz"; const lettersAndNumbers = "abcdefghijklmnopqrstuvwxyz0123456789"; - const singleClasses = { + const singleClasses: Obj = { a: false, b: false, c: false, @@ -40,7 +42,7 @@ function uglifyArr(arr) { y: false, z: false, }; - const singleIds = { + const singleIds: Obj = { a: false, b: false, c: false, @@ -68,7 +70,7 @@ function uglifyArr(arr) { y: false, z: false, }; - const singleNameonly = { + const singleNameonly: Obj = { a: false, b: false, c: false, @@ -98,10 +100,10 @@ function uglifyArr(arr) { }; // final array we'll assemble and eventually return - const res = []; + const res: string[] = []; // quick end - if (!isArr(arr) || !arr.length) { + if (!Array.isArray(arr) || !arr.length) { return arr; } @@ -115,7 +117,7 @@ function uglifyArr(arr) { const prefix = `.#`.includes(arr[id][0]) ? arr[id][0] : ""; const codePointSum = Array.from(arr[id]).reduce( - (acc, curr) => acc + tellcp(curr), + (acc, curr) => acc + (tellcp(curr) as number), 0 ); @@ -126,24 +128,29 @@ function uglifyArr(arr) { const val = arr[id]; if (!res.includes(val)) { res.push(val); + + // the first candidates for single-character value are 2-char long classes: if ( val.startsWith(".") && val.length === 2 && - !singleClasses[val.slice(1)] + singleClasses[val.slice(1)] === false ) { + // mark the letter as used singleClasses[val.slice(1)] = true; } else if ( val.startsWith("#") && val.length === 2 && - !singleIds[val.slice(1)] + singleIds[val.slice(1)] === false ) { + // mark the letter as used singleIds[val.slice(1)] = true; } else if ( !val.startsWith(".") && !val.startsWith("#") && val.length === 1 && - !singleNameonly[val] + singleNameonly[val] === false ) { + // mark the letter as used singleNameonly[val] = true; } continue; @@ -200,20 +207,20 @@ function uglifyArr(arr) { if ( generated.startsWith(".") && generated.length === 2 && - !singleClasses[generated.slice(1)] + singleClasses[generated.slice(1)] === false ) { singleClasses[generated.slice(1)] = true; } else if ( generated.startsWith("#") && generated.length === 2 && - !singleIds[generated.slice(1)] + singleIds[generated.slice(1)] === false ) { singleIds[generated.slice(1)] = true; } else if ( !generated.startsWith(".") && !generated.startsWith("#") && generated.length === 1 && - !singleNameonly[generated] + singleNameonly[generated] === false ) { singleNameonly[generated] = true; } @@ -245,7 +252,7 @@ function uglifyArr(arr) { ); if (res[i].startsWith(".")) { // if particular class name starts with a letter which hasn't been taken - if (!singleClasses[res[i].slice(1, 2)]) { + if (singleClasses[res[i].slice(1, 2)] === false) { singleClasses[res[i].slice(1, 2)] = res[i]; console.log( `251 shortened ${`\u001b[${33}m${ @@ -272,7 +279,7 @@ function uglifyArr(arr) { res[i] = res[i].slice(0, 2); } } else if (res[i].startsWith("#")) { - if (!singleIds[res[i].slice(1, 2)]) { + if (singleIds[res[i].slice(1, 2)] === false) { singleIds[res[i].slice(1, 2)] = res[i]; console.log( `278 shortened ${`\u001b[${33}m${ @@ -312,7 +319,7 @@ function uglifyArr(arr) { } // main function - converts n-th string in a given reference array of strings -function uglifyById(refArr, idNum) { +function uglifyById(refArr: string[], idNum: number): string { return uglifyArr(refArr)[idNum]; } diff --git a/packages/string-uglify/tsconfig.json b/packages/string-uglify/tsconfig.json new file mode 100644 index 0000000000..b29a7b46c4 --- /dev/null +++ b/packages/string-uglify/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": {} +} diff --git a/packages/string-uglify/types/main.d.ts b/packages/string-uglify/types/main.d.ts new file mode 100644 index 0000000000..2482a1c84a --- /dev/null +++ b/packages/string-uglify/types/main.d.ts @@ -0,0 +1,4 @@ +import { version } from "../package.json"; +declare function uglifyArr(arr: string[]): string[]; +declare function uglifyById(refArr: string[], idNum: number): string; +export { uglifyById, uglifyArr, version };