diff --git a/node.js/dist/cli.min.js b/node.js/dist/cli.min.js index b85dc0c..2d18435 100644 --- a/node.js/dist/cli.min.js +++ b/node.js/dist/cli.min.js @@ -1,17 +1,18 @@ #!/usr/bin/env node -const e="https://docs.minify-js.org/#-command-line-usage",n=require(__dirname.match(/src/)?"./minify":"./minify.min"),o=require("fs"),s=require("path"),r="",t="",l="",i="",a={},c={flags:{dryRun:/^--?(?:n|dry-?run)$/,includeDotFolders:/^--?(?:dd?|(?:include-?)?dot-?(?:folder|dir(?:ector(?:y|ie))?)s?=?(?:true|1)?)$/,includeDotFiles:/^--?(?:df|D|(?:include-?)?dot-?files?=?(?:true|1)?)$/,noRecursion:/^--?(?:R|(?:disable|no)-?recursi(?:on|ve)|recursi(?:on|ve)=(?:false|0))$/,noMangle:/^--?(?:M|(?:disable|no)-?mangle|mangle=(?:false|0))$/,quietMode:/^--?q(?:uiet)?(?:-?mode)?$/},paramOptions:{comment:/^--?comments?(?:=.*|$)/},infoCmds:{help:/^--?h(?:elp)?$/,version:/^--?ve?r?s?i?o?n?$/}};if(process.argv.forEach(i=>{var e,n,o;i.startsWith("-")&&(e=Object.keys(c.paramOptions).find(e=>c.paramOptions[e].test(i)),o=Object.keys(c.flags).find(e=>c.flags[e].test(i)),n=Object.keys(c.infoCmds).find(e=>c.infoCmds[e].test(i)),o?a[o]=!0:e?(i.includes("=")||(console.error(` -${t}ERROR: Arg [--${i.replace(/-/g,"")}] requires '=' followed by a value.`+r),d(),process.exit(1)),o=i.split("=")[1],a[e]=parseInt(o)||o):n||(console.error(` -${t}ERROR: Arg [${i}] not recognized.`+r),console.info(` -${l}Valid arguments are below.`+r),m(["flags","paramOptions","infoCmds"]),d(),process.exit(1)))}),process.argv.some(e=>c.infoCmds.help.test(e)))m();else if(process.argv.some(e=>c.infoCmds.version.test(e)))console.info("v"+require("./package.json").version);else{const[u="",p=""]=process.argv.slice(2).filter(e=>!e.startsWith("-")).map(e=>e.replace(/^\/*/,"")),h=s.resolve(process.cwd(),u),g=(u&&!o.existsSync(h)&&(console.error(` -${t}Error: First argument can only be an existing file or directory.`+` -${h} does not exist.`+r+` +const pkgName="@adamlui/minify.js",docURL="https://docs.minify-js.org/#-command-line-usage",minifyJS=require(__dirname.match(/src/)?"./minify":"./minify.min"),fs=require("fs"),path=require("path"),execSync=require("child_process")["execSync"],nc="",br="",by="",bg="",config={},argRegex={flags:{dryRun:/^--?(?:n|dry-?run)$/,includeDotFolders:/^--?(?:dd?|(?:include-?)?dot-?(?:folder|dir(?:ector(?:y|ie))?)s?=?(?:true|1)?)$/,includeDotFiles:/^--?(?:df|D|(?:include-?)?dot-?files?=?(?:true|1)?)$/,noRecursion:/^--?(?:R|(?:disable|no)-?recursi(?:on|ve)|recursi(?:on|ve)=(?:false|0))$/,noMangle:/^--?(?:M|(?:disable|no)-?mangle|mangle=(?:false|0))$/,quietMode:/^--?q(?:uiet)?(?:-?mode)?$/},paramOptions:{comment:/^--?comments?(?:=.*|$)/},infoCmds:{help:/^--?h(?:elp)?$/,version:/^--?ve?r?s?i?o?n?$/}};if(process.argv.forEach(n=>{var e,i,o;n.startsWith("-")&&(e=Object.keys(argRegex.paramOptions).find(e=>argRegex.paramOptions[e].test(n)),o=Object.keys(argRegex.flags).find(e=>argRegex.flags[e].test(n)),i=Object.keys(argRegex.infoCmds).find(e=>argRegex.infoCmds[e].test(n)),o?config[o]=!0:e?(n.includes("=")||(console.error(` +${br}ERROR: Arg [--${n.replace(/-/g,"")}] requires '=' followed by a value.`+nc),printHelpCmdAndDocURL(),process.exit(1)),o=n.split("=")[1],config[e]=parseInt(o)||o):i||(console.error(` +${br}ERROR: Arg [${n}] not recognized.`+nc),console.info(` +${by}Valid arguments are below.`+nc),printHelpSections(["flags","paramOptions","infoCmds"]),printHelpCmdAndDocURL(),process.exit(1)))}),process.argv.some(e=>argRegex.infoCmds.help.test(e)))printHelpSections();else if(process.argv.some(e=>argRegex.infoCmds.version.test(e))){const k=execSync(`npm view ${pkgName} version`).toString().trim()||"none";let e,i=process.cwd();for(;"/"!==i;){const n=path.join(i,"package.json");if(fs.existsSync(n)){const o=require(n);e=(o.dependencies?.[pkgName]||o.devDependencies?.[pkgName])?.match(/(\d+\.\d+\.\d+)/)[0]||"none";break}i=path.dirname(i)}console.info(` +Global version: `+k),console.info("Local version: "+e)}else{const[p="",q=""]=process.argv.slice(2).filter(e=>!e.startsWith("-")).map(e=>e.replace(/^\/*/,"")),r=path.resolve(process.cwd(),p),s=(p&&!fs.existsSync(r)&&(console.error(` +${br}Error: First argument can only be an existing file or directory.`+` +${r} does not exist.`+nc+` -${i}Example valid command: -» minify-js . output.min.js`+r),d(),process.exit(1)),u.endsWith(".js")?[h]:n.findJS(h,{recursive:!a.noRecursion,verbose:!a.quietMode}));if(a.dryRun)0console.info(e))):console.info(l+` -No JS files will be minified.`+r);else{const v=[],y=g.map(e=>{var i=n.minify(e,{verbose:!a.quietMode,mangle:!a.noMangle,comment:a.comment});return i.error&&v.push(e),i}).filter(e=>!e.error);y?.forEach(({code:e,srcPath:i})=>{var n=s.join(s.dirname(i),(/so?u?rce?$/.test(s.dirname(i))?"../":"")+(p.endsWith(".js")?s.dirname(p):p||"min")),i=(p.endsWith(".js")&&u.endsWith(".js")?s.basename(p).replace(/(\.min)?\.js$/,""):s.basename(i,".js"))+".min.js",i=s.join(n,i);o.existsSync(n)||o.mkdirSync(n,{recursive:!0}),o.writeFileSync(i,e,"utf8")}),0f(e)))}}function m(e=["cmdFormat","pathArgs","flags","paramOptions","infoCmds"]){const i={cmdFormat:[` -${l}minify-js [inputPath] [outputPath] [options]`+r],pathArgs:["\nPath arguments:"," [inputPath] Path to JS file or directory containing JS files to be minified, relative to the current working directory."," [outputPath] Path to file or directory where minified files will be stored, relative to original file location (if not provided, min/ is used)."],flags:["\nBoolean options:"," -n, --dry-run Don't actually minify the file(s), just show if they will be processed."," -d, --include-dotfolders Include dotfolders in file search."," -D, --include-dotfiles Include dotfiles in file search."," -R, --no-recursion Disable recursive file searching."," -M, --no-mangle Disable mangling names."," -q, --quiet Suppress all logging except errors."],paramOptions:["\nParameter options:"," --comment=comment Prepend comment to minified code."],infoCmds:["\nInfo commands:"," -h, --help Display help screen."," -v, --version Show version number."]};e.forEach(e=>{i[e]?.forEach(e=>{{const o=process.stdout.columns||80,s=[],i=e.match(/\S+|\s+/g);let n="";i.forEach(e=>{var i=o-(0===s.length?0:29);n.length+e.length>i&&(s.push(0===s.length?n:n.trimStart()),n=""),n+=e}),s.push(0===s.length?n:n.trimStart()),s.forEach((e,i)=>console.info(0===i?e:" ".repeat(29)+e))}})})}function d(){console.info(` -${l}For more help, type 'minify-js --help' or visit -`+(e+r))}function f(e){a.quietMode||console.info(e)} \ No newline at end of file +${bg}Example valid command: +» minify-js . output.min.js`+nc),printHelpCmdAndDocURL(),process.exit(1)),p.endsWith(".js")?[r]:minifyJS.findJS(r,{recursive:!config.noRecursion,verbose:!config.quietMode}));if(config.dryRun)0console.info(e))):console.info(by+` +No JS files will be minified.`+nc);else{const w=[],x=s.map(e=>{var n=minifyJS.minify(e,{verbose:!config.quietMode,mangle:!config.noMangle,comment:config.comment});return n.error&&w.push(e),n}).filter(e=>!e.error);x?.forEach(({code:e,srcPath:n})=>{var i=path.join(path.dirname(n),(/so?u?rce?$/.test(path.dirname(n))?"../":"")+(q.endsWith(".js")?path.dirname(q):q||"min")),n=(q.endsWith(".js")&&p.endsWith(".js")?path.basename(q).replace(/(\.min)?\.js$/,""):path.basename(n,".js"))+".min.js",n=path.join(i,n);fs.existsSync(i)||fs.mkdirSync(i,{recursive:!0}),fs.writeFileSync(n,e,"utf8")}),0printIfNotQuiet(e)))}}function printHelpSections(e=["cmdFormat","pathArgs","flags","paramOptions","infoCmds"]){const n={cmdFormat:[` +${by}minify-js [inputPath] [outputPath] [options]`+nc],pathArgs:["\nPath arguments:"," [inputPath] Path to JS file or directory containing JS files to be minified, relative to the current working directory."," [outputPath] Path to file or directory where minified files will be stored, relative to original file location (if not provided, min/ is used)."],flags:["\nBoolean options:"," -n, --dry-run Don't actually minify the file(s), just show if they will be processed."," -d, --include-dotfolders Include dotfolders in file search."," -D, --include-dotfiles Include dotfiles in file search."," -R, --no-recursion Disable recursive file searching."," -M, --no-mangle Disable mangling names."," -q, --quiet Suppress all logging except errors."],paramOptions:["\nParameter options:"," --comment=comment Prepend comment to minified code."],infoCmds:["\nInfo commands:"," -h, --help Display help screen."," -v, --version Show version number."]};e.forEach(e=>{n[e]?.forEach(e=>{{const o=process.stdout.columns||80,t=[],n=e.match(/\S+|\s+/g);let i="";n.forEach(e=>{var n=o-(0===t.length?0:29);i.length+e.length>n&&(t.push(0===t.length?i:i.trimStart()),i=""),i+=e}),t.push(0===t.length?i:i.trimStart()),t.forEach((e,n)=>console.info(0===n?e:" ".repeat(29)+e))}})})}function printHelpCmdAndDocURL(){console.info(` +${by}For more help, type 'minify-js --help' or visit +`+(docURL+nc))}function printIfNotQuiet(e){config.quietMode||console.info(e)} \ No newline at end of file diff --git a/node.js/dist/minify.min.js b/node.js/dist/minify.min.js index caf1bd8..c23a20b 100644 --- a/node.js/dist/minify.min.js +++ b/node.js/dist/minify.min.js @@ -1,5 +1,5 @@ #!/usr/bin/env node -const c=require("fs"),l=require("path"),t=require("uglify-js");function f(r,i={}){var e="https://docs.minify-js.org/#findjssearchdir-options",o={recursive:!0,verbose:!0,dotFolders:!1,dotFiles:!1};if("string"!=typeof r)console.error("findJS() » ERROR: 1st arg must be a string."),console.info("findJS() » For more help, please visit "+e);else{var n=l.resolve(process.cwd(),r);if(c.existsSync(n)){if(m(i,o,e,"findJS('assets/js', { verbose: false, dotFoldes: true })")){i={...o,...i};const s=c.readdirSync(r),t=[];return i.verbose&&!i.isRecursing&&console.info("findJS() » Searching for unminified JS files..."),s.forEach(e=>{var o=l.resolve(r,e);c.statSync(o).isDirectory()&&"node_modules"!=e&&(i.dotFolders||!e.startsWith("."))&&i.recursive?t.push(...f(o,{...i,isRecursing:!0})):!/\.js(?e.includes("gulp"))||/cli(?:\.min)?\.js$/.test(require.main.filename)||console.info("findJS() » Check returned array.")),i.isRecursing||0 must be an existing directory."),console.error(`findJS() » ${n} does not exist.`),console.info("findJS() » For more help, please visit "+e)}}function e(e,r={}){var o="https://docs.minify-js.org/#minifyinput-options",i={recursive:!0,verbose:!0,dotFolders:!1,dotFiles:!1,mangle:!0,comment:""};if("string"!=typeof e)console.error("minify() » ERROR: 1st arg must be a string."),console.info("minify() » For more help, please visit "+o);else if(m(r,i,o,"minify('assets/js', { recursive: false, mangle: false })")){const s={mangle:!!(r={...i,...r}).mangle&&{toplevel:!0}};return c.existsSync(e)?e.endsWith(".js")?(r.verbose&&console.info(`minify() » Minifying ${e}...`),o=t.minify(c.readFileSync(e,"utf8"),s),r.comment&&(o.code=n(o.code)),o.error?console.error("minify() » ERROR: "+o.error.message):!r.verbose||process.argv.some(e=>e.includes("gulp"))||/cli(?:\.min)?\.js$/.test(require.main.filename)||console.info("minify() » Minification complete. Check returned object."),{code:o.code,srcPath:l.resolve(process.cwd(),e),error:o.error}):(i=f(e,{recursive:r.recursive,verbose:r.verbose,dotFolders:r.dotFolders,dotFiles:r.dotFiles})?.map(e=>{r.verbose&&console.info(`minify() » Minifying ${e}...`);var o=c.readFileSync(e,"utf8"),o=t.minify(o,s);return r.comment&&(o.code=n(o.code)),o.error&&console.error("minify() » ERROR: "+o.error.message),{code:o.code,srcPath:e,error:o.error}}).filter(e=>!e.error),r.verbose&&(0e.includes("gulp"))&&console.info("minify() » Minifying passed source code..."),o=t.minify(e,s),r.comment&&(o.code=n(o.code)),o.error?console.error("minify() » ERROR: "+o.error.message):r.verbose&&!process.argv.some(e=>e.includes("gulp"))&&console.info("minify() » Minification complete. Check returned object."),{code:o.code,srcPath:void 0,error:o.error});function n(e){return`/* - ${r.comment} +const fs=require("fs"),path=require("path"),uglifyJS=require("uglify-js");function findJS(i,r={}){var e="https://docs.minify-js.org/#findjssearchdir-options",o={recursive:!0,verbose:!0,dotFolders:!1,dotFiles:!1};if("string"!=typeof i)console.error("findJS() » ERROR: 1st arg must be a string."),console.info("findJS() » For more help, please visit "+e);else{var n=path.resolve(process.cwd(),i);if(fs.existsSync(n)){if(validateOptions(r,o,e,"findJS('assets/js', { verbose: false, dotFoldes: true })")){r={...o,...r};const s=fs.readdirSync(i),t=[];return r.verbose&&!r.isRecursing&&console.info("findJS() » Searching for unminified JS files..."),s.forEach(e=>{var o=path.resolve(i,e);fs.statSync(o).isDirectory()&&"node_modules"!=e&&(r.dotFolders||!e.startsWith("."))&&r.recursive?t.push(...findJS(o,{...r,isRecursing:!0})):!/\.js(?e.includes("gulp"))||/cli(?:\.min)?\.js$/.test(require.main.filename)||console.info("findJS() » Check returned array.")),r.isRecursing||0 must be an existing directory."),console.error(`findJS() » ${n} does not exist.`),console.info("findJS() » For more help, please visit "+e)}}function minify(e,i={}){var o="https://docs.minify-js.org/#minifyinput-options",r={recursive:!0,verbose:!0,dotFolders:!1,dotFiles:!1,mangle:!0,comment:""};if("string"!=typeof e)console.error("minify() » ERROR: 1st arg must be a string."),console.info("minify() » For more help, please visit "+o);else if(validateOptions(i,r,o,"minify('assets/js', { recursive: false, mangle: false })")){const s={mangle:(i={...r,...i}).mangle};return fs.existsSync(e)?e.endsWith(".js")?(i.verbose&&console.info(`minify() » Minifying ${e}...`),o=uglifyJS.minify(fs.readFileSync(e,"utf8"),s),i.comment&&(o.code=n(o.code)),o.error?console.error("minify() » ERROR: "+o.error.message):!i.verbose||process.argv.some(e=>e.includes("gulp"))||/cli(?:\.min)?\.js$/.test(require.main.filename)||console.info("minify() » Minification complete. Check returned object."),{code:o.code,srcPath:path.resolve(process.cwd(),e),error:o.error}):(r=findJS(e,{recursive:i.recursive,verbose:i.verbose,dotFolders:i.dotFolders,dotFiles:i.dotFiles})?.map(e=>{i.verbose&&console.info(`minify() » Minifying ${e}...`);var o=fs.readFileSync(e,"utf8"),o=uglifyJS.minify(o,s);return i.comment&&(o.code=n(o.code)),o.error&&console.error("minify() » ERROR: "+o.error.message),{code:o.code,srcPath:e,error:o.error}}).filter(e=>!e.error),i.verbose&&(0e.includes("gulp"))&&console.info("minify() » Minifying passed source code..."),o=uglifyJS.minify(e,s),i.comment&&(o.code=n(o.code)),o.error?console.error("minify() » ERROR: "+o.error.message):i.verbose&&!process.argv.some(e=>e.includes("gulp"))&&console.info("minify() » Minification complete. Check returned object."),{code:o.code,srcPath:void 0,error:o.error});function n(e){return`/* + ${i.comment} */ -`+e}}}function m(e,o,r,i){const n=JSON.stringify(o,null,2).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'").replace(/\n\s*/g," "),s=Object.keys(o).join(", "),t=Object.keys(o).filter(e=>"boolean"==typeof o[e]),c=Object.keys(o).filter(e=>Number.isInteger(o[e])),l=(m.caller?.name||"validateOptions")+"() » ";var f=()=>{console.info(l+`Valid options: [ ${s} ]`),console.info(l+"If omitted, default settings are: "+n)},a=()=>{console.info(l+"For more help, please visit "+r)};if("object"!=typeof e)return console.error(l+"ERROR: [options] can only be an object of key/values."),console.info(l+"Example valid call: "+i),f(),a(),!1;for(const d in e){if("isRecursing"!=d&&!Object.prototype.hasOwnProperty.call(o,d))return console.error(l+`ERROR: \`${d}\` is an invalid option.`),f(),a(),!1;if(t.includes(d)&&"boolean"!=typeof e[d])return console.error(l+`ERROR: [${d}] option can only be \`true\` or \`false\`.`),a(),!1;if(c.includes(d)&&(e[d]=parseInt(e[d],10),isNaN(e[d])||e[d]<1))return console.error(l+`ERROR: [${d}] option can only be an integer > 0.`),a(),!1}return!0}module.exports={minify:e,find:f,findJS:f}; \ No newline at end of file +`+e}}}function validateOptions(e,o,i,r){const n=JSON.stringify(o,null,2).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'").replace(/\n\s*/g," "),s=Object.keys(o).join(", "),t=Object.keys(o).filter(e=>"boolean"==typeof o[e]),l=Object.keys(o).filter(e=>Number.isInteger(o[e])),c=(validateOptions.caller?.name||"validateOptions")+"() » ";var f=()=>{console.info(c+`Valid options: [ ${s} ]`),console.info(c+"If omitted, default settings are: "+n)},a=()=>{console.info(c+"For more help, please visit "+i)};if("object"!=typeof e)return console.error(c+"ERROR: [options] can only be an object of key/values."),console.info(c+"Example valid call: "+r),f(),a(),!1;for(const m in e){if("isRecursing"!=m&&!Object.prototype.hasOwnProperty.call(o,m))return console.error(c+`ERROR: \`${m}\` is an invalid option.`),f(),a(),!1;if(t.includes(m)){if("mangle"==m){var d=()=>console.error(c+"ERROR: [mangle] option can only be `true`, `false`, or an object w/ key [toplevel] set to `true` or `false`.");if("object"==typeof e.mangle){for(const u in e.mangle)if(!["toplevel"].includes(u)||"boolean"!=typeof e.mangle[u])return d(),a(),!1}else if("boolean"!=typeof e.mangle)return d(),a(),!1}else if("boolean"!=typeof e[m])return console.error(c+`ERROR: [${m}] option can only be \`true\` or \`false\`.`),a(),!1}else if(l.includes(m)&&(e[m]=parseInt(e[m],10),isNaN(e[m])||e[m]<1))return console.error(c+`ERROR: [${m}] option can only be an integer > 0.`),a(),!1}return!0}module.exports={minify:minify,find:findJS,findJS:findJS}; \ No newline at end of file