generate-ip 2.4.9 โ†’ 2.5.0

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/README.md CHANGED
@@ -10,12 +10,12 @@
10
10
 
11
11
  <a href="#%EF%B8%8F-mit-license">
12
12
  <img height=31 src="https://img.shields.io/badge/License-MIT-orange.svg?logo=internetarchive&logoColor=white&labelColor=464646&style=for-the-badge"></a>
13
- <a href="https://github.com/adamlui/js-utils/releases/tag/generate-ip-2.4.9">
14
- <img height=31 src="https://img.shields.io/badge/Latest_Build-2.4.9-44cc11.svg?logo=icinga&logoColor=white&labelColor=464646&style=for-the-badge"></a>
13
+ <a href="https://github.com/adamlui/js-utils/releases/tag/generate-ip-2.5.0">
14
+ <img height=31 src="https://img.shields.io/badge/Latest_Build-2.5.0-44cc11.svg?logo=icinga&logoColor=white&labelColor=464646&style=for-the-badge"></a>
15
15
  <a href="https://www.npmjs.com/package/generate-ip?activeTab=code">
16
16
  <img height=31 src="https://img.shields.io/npm/unpacked-size/generate-ip?style=for-the-badge&logo=ebox&logoColor=white&labelColor=464646&color=blue"></a>
17
- <a href="https://github.com/adamlui/js-utils/blob/generate-ip-2.4.9/generate-ip/dist/generate-ip.min.js">
18
- <img height=31 src="https://img.shields.io/github/size/adamlui/js-utils/generate-ip/dist/generate-ip.min.js?branch=generate-ip-2.4.9&label=Minified%20Size&logo=databricks&logoColor=white&labelColor=464646&color=ff69b4&style=for-the-badge"></a>
17
+ <a href="https://github.com/adamlui/js-utils/blob/generate-ip-2.5.0/generate-ip/dist/generate-ip.min.js">
18
+ <img height=31 src="https://img.shields.io/github/size/adamlui/js-utils/generate-ip/dist/generate-ip.min.js?branch=generate-ip-2.5.0&label=Minified%20Size&logo=databricks&logoColor=white&labelColor=464646&color=ff69b4&style=for-the-badge"></a>
19
19
  <a href="https://sonarcloud.io/component_measures?metric=new_vulnerabilities&id=adamlui_js-utils:generate-ip/src/generate-ip.js">
20
20
  <img height=31 src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fsonarcloud.io%2Fapi%2Fmeasures%2Fcomponent%3Fcomponent%3Dadamlui_js-utils%3Agenerate-ip%2Fsrc%2Fgenerate-ip.js%26metricKeys%3Dvulnerabilities&query=%24.component.measures.0.value&style=for-the-badge&logo=sonarcloud&logoColor=white&labelColor=464646&label=Vulnerabilities&color=gold"></a>
21
21
  <a href="https://github.com/toolleeo/cli-apps#networking">
@@ -71,7 +71,7 @@ $ npm install generate-ip
71
71
  #### ECMAScript*:
72
72
 
73
73
  ```js
74
- import { ipv4, ipv6, mac } from 'generate-ip';
74
+ import { ipv4, ipv6, mac } from 'generate-ip'
75
75
  ```
76
76
 
77
77
  #### CommonJS:
@@ -87,14 +87,14 @@ const { ipv4, ipv6, mac } = require('generate-ip')
87
87
  #### <> HTML script tag:
88
88
 
89
89
  ```html
90
- <script src="https://cdn.jsdelivr.net/npm/generate-ip@2.4.9/dist/generate-ip.min.js"></script>
90
+ <script src="https://cdn.jsdelivr.net/npm/generate-ip@2.5.0/dist/generate-ip.min.js"></script>
91
91
  ```
92
92
 
93
93
  #### ES6:
94
94
 
95
95
  ```js
96
96
  (async () => {
97
- await import('https://cdn.jsdelivr.net/npm/generate-ip@2.4.9/dist/generate-ip.min.js')
97
+ await import('https://cdn.jsdelivr.net/npm/generate-ip@2.5.0/dist/generate-ip.min.js')
98
98
  // Your code here...
99
99
  })()
100
100
  ```
@@ -103,7 +103,7 @@ const { ipv4, ipv6, mac } = require('generate-ip')
103
103
 
104
104
  ```js
105
105
  ...
106
- // @require https://cdn.jsdelivr.net/npm/generate-ip@2.4.9/dist/generate-ip.min.js
106
+ // @require https://cdn.jsdelivr.net/npm/generate-ip@2.5.0/dist/generate-ip.min.js
107
107
  // ==/UserScript==
108
108
 
109
109
  // Your code here...
@@ -111,7 +111,7 @@ const { ipv4, ipv6, mac } = require('generate-ip')
111
111
 
112
112
  <br>
113
113
 
114
- ๐Ÿ“ **Note:** To always import the latest version (not recommended in production!) remove the `@2.4.9` version tag from the jsDelivr URL: `https://cdn.jsdelivr.net/npm/generate-ip/dist/generate-ip.min.js`
114
+ ๐Ÿ“ **Note:** To always import the latest version (not recommended in production!) remove the `@2.5.0` version tag from the jsDelivr URL: `https://cdn.jsdelivr.net/npm/generate-ip/dist/generate-ip.min.js`
115
115
 
116
116
  <br>
117
117
 
@@ -369,17 +369,38 @@ Sample output:
369
369
  ```
370
370
  Parameter options:
371
371
  --qty=n Generate n IP address(es).
372
+ --config="path/to/file" Load custom config file.
372
373
 
373
374
  Boolean options:
374
375
  -6, --ipv6 Generate IPv6 address.
375
376
  -m, --mac Generate MAC address.
376
377
  -q, --quiet Suppress all logging except errors.
377
378
 
378
- Info commands:
379
+ Commands:
380
+ -i, --init Create config file (in project root).
379
381
  -h, --help Display help screen.
380
382
  -v, --version Show version number.
381
383
  ```
382
384
 
385
+ #
386
+
387
+ ### Configuration file
388
+
389
+ **generate-ip** can be customized using a `generate-ip.config.mjs` or `generate-ip.config.js` placed in your project root.
390
+
391
+ Example defaults:
392
+
393
+ ```js
394
+ export default {
395
+ qty: 5, // # of IPs to generate
396
+ ipv6mode: false, // Generate IPv6 address(es)
397
+ macMode: false, // Generate MAC address(es)
398
+ quietMode: true // Suppress all logging except errors
399
+ }
400
+ ```
401
+
402
+ ๐Ÿ’ก Run `generate-ip init` to generate a template `generate-ip.config.mjs` in your project root.
403
+
383
404
  <br>
384
405
 
385
406
  <img height=6px width="100%" src="https://assets.js-utils.org/images/separators/aqua-gradient.png?v=0d36e26">
@@ -1,12 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * ยฉ 2024โ€“2026 Adam Lui & contributors under the MIT license.
4
- * Source: https://github.com/adamlui/js-utils/tree/main/generate-ip/src
5
- * Documentation: https://github.com/adamlui/js-utils/tree/main/generate-ip/docs
3
+ * ยฉ 2024โ€“2026 Adam Lui & contributors under the MIT license.
4
+ * Source: https://github.com/adamlui/js-utils/tree/main/generate-ip/src
5
+ * Documentation: https://github.com/adamlui/js-utils/tree/main/generate-ip/docs
6
6
  */
7
- (async()=>{globalThis.env={devMode:__dirname.match(/[\\/]src/)};let e=require("node-clipboardy"),{getMsgs:p,getSysLang:o}=require(`./lib/language${env.devMode?"":".min"}.js`),{ipv4:r,ipv6:s,mac:a}=require(`../generate-ip${env.devMode?"":".min"}.js`),i=require(`./lib/print${env.devMode?"":".min"}.js`);var n;Object.assign(globalThis.app??={},require(`../${env.devMode?"../":"./data/"}app.json`)),app.urls.docs+="/#-command-line-usage",app.msgs=await p(o()),app.colors={nc:"",br:"",by:"",bg:"",bw:"",blk:"",tlBG:""},app.regex={paramOptions:{qty:/^--?qu?a?n?ti?t?y(?:=.*|$)/},flags:{ipv6mode:/^--?(?:ip)?v?6(?:-?mode)?$/,macMode:/^--?m(?:ac)?(?:-?mode)?$/,quietMode:/^--?q(?:uiet)?(?:-?mode)?$/},infoCmds:{help:/^--?h(?:elp)?$/,version:/^--?ve?r?s?i?o?n?$/},version:/^[~^>=]?\d+\.\d+\.\d+$/},app.config={},process.argv.forEach(p=>{var e,o,r;p.startsWith("-")&&(e=Object.keys(app.regex.paramOptions).find(e=>app.regex.paramOptions[e].test(p)),r=Object.keys(app.regex.flags).find(e=>app.regex.flags[e].test(p)),o=Object.keys(app.regex.infoCmds).find(e=>app.regex.infoCmds[e].test(p)),r?app.config[r]=!0:e?(/=.+/.test(p)||(console.error(`
8
- ${app.colors.br}${app.msgs.prefix_error}: Arg [--${p.replace(/-/g,"")}] ${app.msgs.error_noEqual}.`+app.colors.nc),i.helpCmdAndDocURL(),process.exit(1)),r=p.split("=")[1],app.config[e]=parseInt(r)||r):o||/ipv4/.test(p)||(console.error(`
9
- ${app.colors.br}${app.msgs.prefix_error}: Arg [${p}] ${app.msgs.error_notRecognized}.`+app.colors.nc),console.info(`
10
- ${app.colors.by}${app.msgs.info_validArgs}.`+app.colors.nc),i.help(["paramOptions","flags","infoCmds"]),process.exit(1)))}),app.config.qty&&(isNaN(app.config.qty)||app.config.qty<1)&&(console.error(`
11
- ${app.colors.br}${app.msgs.prefix_error}: [qty] ${app.msgs.error_nonPositiveNum}.`+app.colors.nc),i.helpCmdAndDocURL(),process.exit(1)),process.argv.some(e=>app.regex.infoCmds.help.test(e))?i.help():process.argv.some(e=>app.regex.infoCmds.version.test(e))?i.version():(n={qty:app.config.qty||1,verbose:!app.config.quietMode},n=(app.config.ipv6mode?s:app.config.macMode?a:r).generate(n),i.ifNotQuiet(`
12
- ${app.msgs.info_copying}...`),e.writeSync([].concat(n).join("\n")))})();
7
+ (async()=>{var e,i=process.argv.slice(2),n=(globalThis.env={debugMode:i.some(e=>/^--?debug(?:-?mode)?$/.test(e)),devMode:/[\\/]src(?:[\\/]|$)/i.test(__dirname)},require("node-clipboardy")),{generateRandomLang:o,getMsgs:r,getSysLang:s}=require(`./lib/language${env.devMode?"":".min"}.js`),{ipv4:t,ipv6:a,mac:g}=require(`../generate-ip${env.devMode?"":".min"}.js`),d=require(`./lib/log${env.devMode?"":".min"}.js`),p=require(`./lib/settings${env.devMode?"":".min"}.js`);Object.assign(globalThis.app??={},require(`../${env.devMode?"../":"./data/"}app.json`)),app.msgs=await r(env.debugMode?o({excludes:["en"]}):s()),app.urls.docs+="/#-command-line-usage";for(e of i){if(p.controls.init.regex.test(e))return p.initConfigFile();if(p.controls.help.regex.test(e))return d.help();if(p.controls.version.regex.test(e))return d.version()}p.load();r={qty:app.config.qty,verbose:!app.config.quietMode},o={ipv4:t,ipv6:a,mac:g}[app.config.mode||"ipv4"].generate(r);d.ifNotQuiet(`
8
+ ${app.msgs.info_copying}...`),n.writeSync([].concat(o).join("\n"))})();
@@ -1,6 +1,6 @@
1
1
  /**
2
- * ยฉ 2024โ€“2026 Adam Lui & contributors under the MIT license.
3
- * Source: https://github.com/adamlui/js-utils/tree/main/generate-ip/src
4
- * Documentation: https://github.com/adamlui/js-utils/tree/main/generate-ip/docs
2
+ * ยฉ 2024โ€“2026 Adam Lui & contributors under the MIT license.
3
+ * Source: https://github.com/adamlui/js-utils/tree/main/generate-ip/src
4
+ * Documentation: https://github.com/adamlui/js-utils/tree/main/generate-ip/docs
5
5
  */
6
- module.exports={fetch(n){return new Promise((t,e)=>{var r=n.match(/^([^:]+):\/\//)[1];/^https?$/.test(r)||e(new Error(app.msgs.error_invalidURL+".")),require(r).get(n,e=>{let r="";e.on("data",e=>r+=e),e.on("end",()=>t({json:()=>JSON.parse(r)}))}).on("error",e)})},flatten(e,{key:r="message"}={}){var t,n={};for(t in e)n[t]="object"==typeof e[t]&&r in e[t]?e[t][r]:e[t];return n}};
6
+ module.exports={atomicWrite(e,r,t="utf8"){var n=require("path"),a=require("fs"),n=n.join(n.dirname(e),`.${n.basename(e)}.tmp`);a.writeFileSync(n,r,t),a.renameSync(n,e)},fetch(n){return"undefined"==typeof fetch?new Promise((t,e)=>{var r=n.match(/^([^:]+):\/\//)[1];/^https?$/.test(r)||e(new Error(app.msgs.error_invalidURL+".")),require(r).get(n,e=>{let r="";e.on("data",e=>r+=e),e.on("end",()=>t({json:()=>JSON.parse(r)}))}).on("error",e)}):fetch(n)},flatten(e,{key:r="message"}={}){var t,n={};for(t in e)n[t]="object"==typeof e[t]&&r in e[t]?e[t][r]:e[t];return n}};
@@ -1,6 +1,8 @@
1
1
  /**
2
- * ยฉ 2024โ€“2026 Adam Lui & contributors under the MIT license.
3
- * Source: https://github.com/adamlui/js-utils/tree/main/generate-ip/src
4
- * Documentation: https://github.com/adamlui/js-utils/tree/main/generate-ip/docs
2
+ * ยฉ 2024โ€“2026 Adam Lui & contributors under the MIT license.
3
+ * Source: https://github.com/adamlui/js-utils/tree/main/generate-ip/src
4
+ * Documentation: https://github.com/adamlui/js-utils/tree/main/generate-ip/docs
5
5
  */
6
- module.exports={async getMsgs(r="en"){var e=require(`./data${env.devMode?"":".min"}.js`);let t=e.flatten(require(`../../${env.devMode?"../_locales/en/":"data/"}messages.json`),{key:"message"});if(!r.startsWith("en")){var n=`${app.urls.jsdelivr}@${app.commitHashes.locales}/${app.name}/_locales/`;let s=n+`${r?r.replace("-","_"):"en"}/`+"messages.json",a=0;for(;a<3;)try{t=e.flatten(await(await e.fetch(s)).json(),{key:"message"});break}catch(e){if(3==++a)break;s=r.includes("-")&&1==a?s.replace(/([^_]*)_[^/]*(\/.*)/,"$1$2"):n+"en/messages.json"}}return t},getSysLang(){var e;if("win32"!=process.platform)return((e=process.env).LANG||e.LANGUAGE||e.LC_ALL||e.LC_MESSAGES||e.LC_NAME||"en").split(".")[0];try{return require("child_process").execSync("(Get-Culture).TwoLetterISOLanguageName",{shell:"powershell",encoding:"utf-8"}).trim()}catch(e){return console.error("ERROR loading system language:",e.message),"en"}}};
6
+ let data=require(`./data${env.devMode?"":".min"}.js`),log=require(`./log${env.devMode?"":".min"}.js`);module.exports={generateRandomLang({includes:e=[],excludes:a=[]}={}){let t=require("fs"),s=require("path"),r=e.length?e:(()=>{var e=s.join(__dirname,"..",".cache"),a=s.join(e,"locales.json");if(t.existsSync(a))try{return JSON.parse(t.readFileSync(a,"utf8"))}catch(e){}var r=s.resolve(process.cwd(),"_locales");return t.existsSync(r)?(r=t.readdirSync(r,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>e.name).filter(e=>/^[a-z]{2}(?:_[A-Z]{2})?$/.test(e)),t.mkdirSync(e,{recursive:!0}),data.atomicWrite(a,JSON.stringify(r,null,2)),r):["en"]})(),n=new Set(a),l="en";return(r=r.filter(e=>!n.has(e))).length&&(l=r[Math.floor(Math.random()*r.length)]),log.debug(`
7
+ Random language: ${l}
8
+ `),l},async getMsgs(t="en"){let e=data.flatten(require(`../../${env.devMode?"../_locales/en/":"data/"}messages.json`),{key:"message"});if(!t.startsWith("en")){var s=`${app.urls.jsdelivr}@${app.commitHashes.locales}/${app.name}/_locales/`;let a=s+t.replace("-","_")+"/messages.json",r=0;for(;r<3;)try{log.debug(e=data.flatten(await(await data.fetch(a)).json(),{key:"message"}));break}catch(e){if(2<++r)break;a=t.includes("-")&&1==r?a.replace(/([^_]*)_[^/]*(\/.*)/,"$1$2"):s+"en/messages.json"}}return e},getSysLang(){var e;if("win32"!=process.platform)return((e=process.env).LANG||e.LANGUAGE||e.LC_ALL||e.LC_MESSAGES||e.LC_NAME||"en").split(".")[0];try{return require("child_process").execSync("(Get-Culture).TwoLetterISOLanguageName",{shell:"powershell",encoding:"utf-8"}).trim()}catch(e){return log.error("ERROR loading system language:",e.message),"en"}}};
@@ -0,0 +1,22 @@
1
+ /**
2
+ * ยฉ 2024โ€“2026 Adam Lui & contributors under the MIT license.
3
+ * Source: https://github.com/adamlui/js-utils/tree/main/generate-ip/src
4
+ * Documentation: https://github.com/adamlui/js-utils/tree/main/generate-ip/docs
5
+ */
6
+ module.exports={colors:{nc:"",br:"",by:"",bo:"",bg:"",bw:"",blk:"",tlBG:""},configURL(){this.info(`
7
+ ${app.msgs.info_exampleValidConfigFile}: `+app.urls.config)},configURLandExit(...s){this.error(...s),this.configURL(),process.exit(1)},data(s){console.log(`
8
+ `+this.colors.bw+s+this.colors.nc)},debug(s){env.debugMode&&console.log(s)},error(...s){console.error(`
9
+ ${this.colors.br}${app.msgs.prefix_error}:`,...s,this.colors.nc)},errorAndExit(...s){this.error(...s),this.helpCmdAndDocURL(),process.exit(1)},ifNotQuiet(s){app.config.quietMode||console.info(s)},info(s){console.info(`
10
+ `+this.colors.by+s+this.colors.nc)},tip(s){console.info(""+this.colors.by+app.msgs.prefix_tip+": "+s+this.colors.nc)},success(s){console.log(`
11
+ `+this.colors.bg+s+this.colors.nc)},warn(...s){console.warn(`
12
+ ${this.colors.bo}${app.msgs.prefix_warning}:`,...s,this.colors.nc)},help(s=["header","usage","params","flags","cmds"]){app.prefix=""+this.colors.tlBG+this.colors.blk+` ${app.name} ${this.colors.nc} `;let o={header:[`
13
+ โ”œ ${app.prefix}${app.msgs.appCopyright}.`,""+app.prefix+app.msgs.prefix_source+": "+app.urls.src],usage:[`
14
+ ${this.colors.bw}o ${app.msgs.helpSection_usage}:`+this.colors.nc,` ${this.colors.bw}ยป `+this.colors.bg+app.cmdFormat+this.colors.nc],params:[`
15
+ ${this.colors.bw}o ${app.msgs.helpSection_params}:`+this.colors.nc,` --qty=n ${app.msgs.optionDesc_qty}.`,` --config="path/to/file" ${app.msgs.optionDesc_config}.`],flags:[`
16
+ ${this.colors.bw}o ${app.msgs.helpSection_flags}:`+this.colors.nc,` -6, --ipv6 ${app.msgs.optionDesc_ipv6}.`,` -m, --mac ${app.msgs.optionDesc_mac}.`,` -q, --quiet ${app.msgs.optionDesc_quiet}.`],cmds:[`
17
+ ${this.colors.bw}o ${app.msgs.helpSection_cmds}:`+this.colors.nc,` -i, --init ${app.msgs.optionDesc_init}.`,` -h, --help ${app.msgs.optionDesc_help}.`,` -v, --version ${app.msgs.optionDesc_version}.`]};s.forEach(c=>o[c]?.forEach(o=>{{var r=/header|usage/.test(c)?1:29;let e=process.stdout.columns||80,s=o.match(/\S+|\s+/g),p=[],i="";s.forEach(s=>{var o=e-(p.length?r:0);i.length+"| ".length+s.length>o&&(p.push(p.length?i.trimStart():i),i=""),i+=s}),p.push(p.length?i.trimStart():i),p.forEach((s,o)=>console.info("| "+(0==o?s:" ".repeat(r)+s)))}})),console.info(`
18
+ ${app.msgs.info_moreHelp}, ${app.msgs.info_visit}: `+this.colors.bw+app.urls.docs+this.colors.nc)},helpCmdAndDocURL(){console.info(`
19
+ ${app.msgs.info_moreHelp}, ${app.msgs.info_type} ${app.name} --help' ${app.msgs.info_or} ${app.msgs.info_visit}
20
+ `+this.colors.bw+app.urls.docs+this.colors.nc)},version(){var s=require("child_process").execSync(`npm view ${JSON.stringify(app.name)} version`).toString().trim()||"none";let o="none";try{var e=require("path").resolve(process.cwd(),"node_modules",app.name,"package.json");require("fs").existsSync(e)&&(o=require(e).version||"none")}catch(s){this.error("Error reading local package version:",s.message)}console.info(`
21
+ ${app.msgs.prefix_globalVer}: ${s}
22
+ ${app.msgs.prefix_localVer}: `+o)}};
@@ -0,0 +1,8 @@
1
+ /**
2
+ * ยฉ 2024โ€“2026 Adam Lui & contributors under the MIT license.
3
+ * Source: https://github.com/adamlui/js-utils/tree/main/generate-ip/src
4
+ * Documentation: https://github.com/adamlui/js-utils/tree/main/generate-ip/docs
5
+ */
6
+ let fs=require("fs"),log=require(`./log${env.devMode?"":".min"}.js`),path=require("path");(globalThis.app??={}).config={},module.exports={configFilename:"generate-ip.config.mjs",controls:{qty:{type:"param",defaultVal:1,regex:/^--?qu?a?n?ti?t?y(?:=.*|$)/,parser:e=>parseInt(e,10)},config:{type:"param",regex:/^--?config(?:=.*|$)/},ipv6mode:{type:"flag",mode:!0,regex:/^--?(?:ip)?v?6(?:-?mode)?$/},macMode:{type:"flag",mode:!0,regex:/^--?m(?:ac)?(?:-?mode)?$/},quietMode:{type:"flag",regex:/^--?q(?:uiet)?(?:-?mode)?$/},init:{type:"cmd",regex:/^-{0,2}i(?:nit)?$/},help:{type:"cmd",regex:/^--?h(?:elp)?$/},version:{type:"cmd",regex:/^--?ve?r?s?i?o?n?$/}},async initConfigFile(o=this.configFilename){var e=path.resolve(process.cwd(),o);if(fs.existsSync(e))return log.warn(app.msgs.warn_configFileExists+":",e);var i=path.resolve(__dirname,"../../"+(env.devMode?"../":"./data/")+o);if(fs.existsSync(i))fs.copyFileSync(i,e);else{i=require(`./data${env.devMode?"":".min"}.js`),o=app.urls.jsdelivr+"/generate-ip/"+o;log.data(app.msgs.info_fetchingRemoteConfigFrom+` ${o}...`);try{var r=await i.fetch(o);if(!r.ok)return log.warn(`${app.msgs.warn_remoteConfigNotFound}: ${o} (${r.status})`);i.atomicWrite(e,await r.text())}catch(e){return log.warn(app.msgs.warn_remoteConfigFailed+`: ${o} `+e.message)}}log.success(app.msgs.info_configFileCreated+`: ${e}
7
+ `),log.tip(app.msgs.tip_editToSetDefaults+"."),log.tip(app.msgs.tip_cliArgsPrioritized+".")},load({args:e=process.argv.slice(2),ctrlKeys:t=Object.keys(this.controls)}={}){t.forEach(e=>{var o=this.controls[e];o.mode||"cmd"==o.type||(app.config[e]??=o.defaultVal??("flag"!=o.type&&""))});let o=null;var i=e.find(e=>this.controls.config.regex.test(e));if(i){/=/.test(i)||log.errorAndExit(`[${i}] `+app.msgs.error_mustIncludePath);i=i.split("=")[1];o=path.isAbsolute(i)?i:path.resolve(process.cwd(),i),fs.existsSync(o)||log.configURLandExit(app.msgs.error_configFileNotFound+":",o)}else for(var r of["mjs","cjs","js"]){r=path.resolve(process.cwd(),this.configFilename.replace(/\.[^.]+$/,"."+r));if(fs.existsSync(r)){o=r;break}}if(o)try{var s=require(o),a=s?.default??s;a&&"object"==typeof a||log.configURLandExit(app.msgs.error_invalidConfigFile+"."),Object.assign(app.config,a)}catch(e){log.configURLandExit(app.msgs.error_failedToLoadConfigFile+":",o,`
8
+ `+e.message)}return e.forEach(o=>{if(!/^[^-]|--?(?:config|debug)/.test(o)){var i=t.find(e=>this.controls[e]?.regex?.test(o)),r=(i||log.errorAndExit(`[${o}] ${app.msgs.error_notRecognized}.`),this.controls[i]);if("cmd"!=r.type){let e="param"!=r.type||o.split("=")[1]?.trim();r.mode?app.config.mode=i.replace(/mode$/i,"").toLowerCase():((r=r.parser)&&(e=r(e),isNaN(e)||e<1)&&log.errorAndExit(`[${i}] ${app.msgs.error_nonPositiveNum}.`),app.config[i]=e)}}}),app.config}};
@@ -5,6 +5,7 @@
5
5
  "copyrightYear": "2024โ€“2026",
6
6
  "cmdFormat": "generate-[ip|ipv6|mac] [options|commands]",
7
7
  "urls": {
8
+ "config": "https://github.com/adamlui/js-utils/blob/main/generate-ip/generate-ip.config.mjs",
8
9
  "docs": "https://github.com/adamlui/js-utils/tree/main/generate-ip/docs",
9
10
  "github": "https://github.com/adamlui/js-utils",
10
11
  "jsdelivr": "https://cdn.jsdelivr.net/gh/adamlui/js-utils",
@@ -12,6 +13,6 @@
12
13
  "src": "https://github.com/adamlui/js-utils/tree/main/generate-ip/src"
13
14
  },
14
15
  "commitHashes": {
15
- "locales": "0e30af1"
16
+ "locales": "198b91f"
16
17
  }
17
18
  }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * generate-ip.config.mjs
3
+ *
4
+ * Optional config file for the generate-ip CLI.
5
+ * Copy this file to your project root to set default options.
6
+ * CLI arguments always override these values.
7
+ *
8
+ * Docs: https://github.com/adamlui/js-utils/tree/main/generate-ip/#-command-line-usage
9
+ */
10
+
11
+ export default {
12
+ mode: 'ipv4', // <ipv4|ipv6|mac> type of address to generate
13
+ qty: 1, // # of IPs to generate
14
+ quietMode: false // suppress all logging except errors
15
+ }
@@ -2,6 +2,8 @@
2
2
  "appName": { "message": "generate-ip" },
3
3
  "appCopyright": { "message": "ยฉ 2024โ€“2026 Adam Lui & contributors under the MIT license" },
4
4
  "prefix_error": { "message": "ERROR" },
5
+ "prefix_tip": { "message": "TIP" },
6
+ "prefix_warning": { "message": "WARNING" },
5
7
  "prefix_globalVer": { "message": "Global version" },
6
8
  "prefix_localVer": { "message": "Local version" },
7
9
  "prefix_source": { "message": "Source" },
@@ -9,20 +11,33 @@
9
11
  "error_notRecognized": { "message": "not recognized" },
10
12
  "error_nonPositiveNum": { "message": "argument can only be > 0" },
11
13
  "error_invalidURL": { "message": "Invalid URL" },
12
- "info_validArgs": { "message": "Valid arguments are below" },
14
+ "error_invalidConfigFile": { "message": "Config file must export an object" },
15
+ "error_configFileNotFound": { "message": "Config file not found" },
16
+ "error_failedToLoadConfigFile": { "message": "Failed to load config file" },
17
+ "error_mustIncludePath": { "message": "must include =path" },
18
+ "warn_configFileExists": { "message": "Config file already exists" },
19
+ "info_exampleValidConfigFile": { "message": "Example valid config file" },
13
20
  "info_copying": { "message": "Copying to clipboard" },
14
21
  "info_moreHelp": { "message": "For more help" },
15
22
  "info_type": { "message": "type" },
16
23
  "info_or": { "message": "or" },
17
24
  "info_visit": { "message": "visit" },
25
+ "info_configFileCreated": { "message": "Config file created" },
26
+ "info_fetchingRemoteConfigFrom": { "message": "Fetching remote config file from" },
27
+ "warn_remoteConfigNotFound": { "message": "Remote config file not found" },
28
+ "warn_remoteConfigFailed": { "message": "Remote config file not found" },
29
+ "tip_editToSetDefaults": { "message": "Edit this file to customize defaults" },
30
+ "tip_cliArgsPrioritized": { "message": "CLI arguments always override these values" },
18
31
  "helpSection_usage": { "message": "Usage" },
19
- "helpSection_paramOptions": { "message": "Parameter options" },
32
+ "helpSection_params": { "message": "Parameter options" },
20
33
  "helpSection_flags": { "message": "Boolean options" },
21
- "helpSection_infoCmds": { "message": "Info commands" },
34
+ "helpSection_cmds": { "message": "Commands" },
22
35
  "optionDesc_qty": { "message": "Generate n IP address(es)" },
36
+ "optionDesc_config": { "message": "Load custom config file" },
23
37
  "optionDesc_ipv6": { "message": "Generate IPv6 address" },
24
38
  "optionDesc_mac": { "message": "Generate MAC address" },
25
39
  "optionDesc_quiet": { "message": "Suppress all logging except errors" },
40
+ "optionDesc_init": { "message": "Create config file (in project root)" },
26
41
  "optionDesc_help": { "message": "Display help screen" },
27
42
  "optionDesc_version": { "message": "Show version number" }
28
43
  }
@@ -1,6 +1,6 @@
1
1
  /**
2
- * ยฉ 2024โ€“2026 Adam Lui & contributors under the MIT license.
3
- * Source: https://github.com/adamlui/js-utils/tree/main/generate-ip/src
4
- * Documentation: https://github.com/adamlui/js-utils/tree/main/generate-ip/docs
2
+ * ยฉ 2024โ€“2026 Adam Lui & contributors under the MIT license.
3
+ * Source: https://github.com/adamlui/js-utils/tree/main/generate-ip/src
4
+ * Documentation: https://github.com/adamlui/js-utils/tree/main/generate-ip/docs
5
5
  */
6
- Object.assign(globalThis.app??={},{name:"generate-ip",aliases:{ipv4:["ipV4","IPv4","IPV4","Ipv4","IpV4","ip","IP","Ip"],ipv6:["ipV6","IPv6","IPV6","Ipv6","IpV6"],mac:["MAC","Mac","ethernet","Ethernet"]}});let ipv4={generate(t={}){var e={verbose:!0,qty:1};if(log.prefix="ipv4.generate()",validateOptions({options:t,defaultOptions:e,helpURL:"https://github.com/adamlui/js-utils/tree/main/generate-ip/docs/#ipv4generateoptions",exampleCall:"ipv4.generate({ verbose: false, qty: 3 })"})){(t={...e,...t}).verbose&&log.info(`Generating IPv4 address${1<t.qty?"es":""}...`);var o=[];if(1<t.qty)for(let e=0;e<t.qty;e++)o.push(this.generate({...t,qty:1,verbose:!1}));else{var i=[];for(let e=0;e<4;e++)i.push(random.int(0,256));o.push(i.join("."))}e=1<t.qty?o:o[0];return t.verbose&&(log.info(`IPv4 address${1<t.qty?"es":""} generated!`),log.info(1==t.qty?e:e.join(", "))),e}},validate(e,t={}){var o="https://github.com/adamlui/js-utils/tree/main/generate-ip/docs/#ipv4validateaddress-options",i={verbose:!0};return log.prefix="ipv4.validate()","string"!=typeof e?(log.error("1st arg <address> must be a string."),log.helpURL(o)):validateOptions({options:t,defaultOptions:i,helpURL:o,exampleCall:"ipv4.validate('0.0.255.255', { verbose: false })"})?((t={...i,...t}).verbose&&log.info(`Validating ${e}...`),i=!(4!=(o=e.split(".")).length||o.some(e=>!/^\d+$/.test(e)||parseInt(e,10)<0||255<parseInt(e,10))),t.verbose&&log.info(`IP is ${i?"":"in"}valid IPv4 address!`),i):void 0}},ipv6={generate(i={}){var e={verbose:!0,qty:1,leadingZeros:!1,doubleColon:!0};if(log.prefix="ipv6.generate()",validateOptions({options:i,defaultOptions:e,helpURL:"https://github.com/adamlui/js-utils/tree/main/generate-ip/docs/#ipv6generateoptions",exampleCall:"ipv6.generate({ leadingZeros: true, qty: 5 })"})){(i={...e,...i}).verbose&&log.info(`Generating IPv6 address${1<i.qty?"es":""}...`);var r=[];if(1<i.qty)for(let e=0;e<i.qty;e++)r.push(this.generate({...i,qty:1,verbose:!1}));else{let t=[],{qty:e,...o}=i;for(let e=0;e<8;e++)t.push(random.hex(4));r.push(this.format(t.join(":"),{...o,verbose:!1}))}e=1<i.qty?r:r[0];return i.verbose&&(log.info(`IPv6 address${1<i.qty?"es":""} generated!`),log.info(1==i.qty?e:e.join(", "))),e}},format(t,o={}){var i="https://github.com/adamlui/js-utils/tree/main/generate-ip/docs/#ipv6formatipv6address-options",r={verbose:!0,leadingZeros:!1,doubleColon:!0};if(log.prefix="ipv6.format()","string"!=typeof t)return log.error("1st arg <ipv6address> must be a string."),log.helpURL(i);if(!this.validate(t,{verbose:!1}))return log.error(t+" is not a valid IPv6 address."),log.helpURL(i);if(validateOptions({options:o,defaultOptions:r,helpURL:i,exampleCall:"ipv6.format('0d::ffff:192.1.56.10/96', { leadingZeros: true, doubleColon: false })"})){o={...r,...o};let e=t;if(e=o.doubleColon?(o.verbose&&log.info("Replacing zero series w/ '::'..."),e.replace(/:(?:0+:)+/,"::")):(o.verbose&&log.info("Expanding '::' into zero series..."),i=e.split(":").filter(Boolean).length,r=o.leadingZeros?"0000":"0",i=Array(8-i).fill(r).join(":"),e.replace("::",`:${i}:`)),o.leadingZeros){o.verbose&&log.info("Adding leading zeros...");var a=e.split(":");for(let e=0;e<a.length;e++)for(;a[e].length<4;)a[e]="0"+a[e];e=a.join(":")}else o.verbose&&log.info("Stripping leading zeros..."),e=t.replace(/(^|(?<=:))0+(?!:)/g,"$1");return o.verbose&&(e!=t?log.info("IP formatted successfully!"):log.info("IP already formatted to specs."),log.info(e)),e}},validate(o,i={}){var r="https://github.com/adamlui/js-utils/tree/main/generate-ip/docs/#ipv6validateaddress-options",a={verbose:!0};if(log.prefix="ipv6.validate()","string"!=typeof o)return log.error("1st arg <address> must be a string."),log.helpURL(r);if(validateOptions({options:i,defaultOptions:a,helpURL:r,exampleCall:"ipv6.validate('0:0:0:0:0:ffff:192.1.56.10/96', { verbose: false })"})){(i={...a,...i}).verbose&&log.info(`Validating ${o}...`);let e=o.split(/::?/),t=e[e.length-1];r=!(o.includes("::")&&2<o.split("::").length||/:{3,}/.test(o)||e.length<2||8<e.length||e.some(e=>!(/^[\da-f]{1,4}$/i.test(e)||e==t&&ipv4.validate(t.replace(/\/(?:12[0-8]|[1-9]?\d)$/,""),{verbose:!1}))));return i.verbose&&log.info(`IP is ${r?"":"in"}valid IPv6 address!`),r}}},mac={generate(t={}){var e={verbose:!0,qty:1};if(log.prefix="mac.generate()",validateOptions({options:t,defaultOptions:e,helpURL:"https://github.com/adamlui/js-utils/tree/main/generate-ip/docs/#macgenerateoptions",exampleCall:"mac.generate({ verbose: false, qty: 2 })"})){(t={...e,...t}).verbose&&log.info(`Generating MAC address${1<t.qty?"es":""}...`);var o=[];if(1<t.qty)for(let e=0;e<t.qty;e++)o.push(this.generate({...t,qty:1,verbose:!1}));else{var[e,i]=Array.from({length:2},()=>{var t=[];for(let e=0;e<3;e++)t.push(random.hex(2));return t.join(":")});o.push(e+":"+i)}e=1<t.qty?o:o[0];return t.verbose&&(log.info(`MAC address${1<t.qty?"es":""} generated!`),log.info(1==t.qty?e:e.join(", "))),e}},validate(e,t={}){var o="https://github.com/adamlui/js-utils/tree/main/generate-ip/docs/#macvalidateaddress-options",i={verbose:!0};return log.prefix="mac.validate()","string"!=typeof e?(log.error("1st arg <address> must be a string."),log.helpURL(o)):validateOptions({options:t,defaultOptions:i,helpURL:o,exampleCall:"mac.validate('00:1A:2B:3C:4D:5E', { verbose: false })"})?((t={...i,...t}).verbose&&log.info(`Validating ${e}...`),o=/^(?:[\da-f]{2}[:-]){5}[\da-f]{2}$/i.test(e),t.verbose&&log.info(`Address is ${o?"":"in"}valid MAC address!`),o):void 0}};function validateOptions({options:e,defaultOptions:t,helpURL:o,exampleCall:i}){var r,a,s=Object.keys(t).filter(e=>"boolean"==typeof t[e]),l=Object.keys(t).filter(e=>Number.isInteger(t[e]));if("object"!=typeof e)return r=i.split(",").findIndex(e=>e.trim().startsWith("{"))+1,r+=["st","nd","rd"][r-1]||"th",log.error(`${"0th"==r?"[O":r+" arg [o"}ptions] can only be an object of key/vals.`),log.info("Example valid call:",i),log.validOptions(t),log.helpURL(o),!1;for(a in e){if(!Object.prototype.hasOwnProperty.call(t,a))return log.error(`\`${a}\` is an invalid option.`),log.validOptions(t),log.helpURL(o),!1;if(s.includes(a)&&"boolean"!=typeof e[a])return log.error(`[${a}] option can only be \`true\` or \`false\`.`),log.helpURL(o),!1;if(l.includes(a)&&(e[a]=parseInt(e[a],10),isNaN(e[a])||e[a]<1))return log.error(`[${a}] option can only be an integer > 0.`),log.helpURL(o),!1}return!0}let random={int(e,t){var o;return"undefined"==typeof require?(o=(window.crypto||window.msCrypto)?.getRandomValues(new Uint32Array(1))[0]/4294967295||Math.random(),Math.floor(o*(t-e))+e):require("crypto").randomInt(e,t)},hex(t){let o="";for(let e=0;e<t;e++)o+=random.int(0,16).toString(16);return o}},log={prefix:app.name,error(...e){console.error(this.prefix+" ยป ERROR:",...e)},helpURL(e=app.urls?.docs){this.info("For more help, please visit",e)},info(...e){console.info(this.prefix+" ยป",...e)},validOptions(e){var t=Object.keys(e).join(", "),e=JSON.stringify(e,void 0,2).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'").replace(/\n\s*/g," ");this.info(`Valid options: [${t}]`),this.info("If omitted, default settings are: "+e)}};app.exports={ipv4:ipv4,ipv6:ipv6,mac:mac};try{module.exports={...app.exports}}catch(e){}try{Object.assign(window,app.exports)}catch(e){}for(let t in app.aliases)app.aliases[t].forEach(e=>{try{module.exports[e]=module.exports[t]}catch(e){}try{window[e]=window[t]}catch(e){}});
6
+ Object.assign(globalThis.app??={},{name:"generate-ip",aliases:{ipv4:["ipV4","IPv4","IPV4","Ipv4","IpV4","ip","IP","Ip"],ipv6:["ipV6","IPv6","IPV6","Ipv6","IpV6"],mac:["MAC","Mac","ethernet","Ethernet"]}});let ipv4={generate(t={}){var e={verbose:!0,qty:1};if(log.prefix="ipv4.generate()",validateOptions({options:t,defaultOptions:e,helpURL:"https://github.com/adamlui/js-utils/tree/main/generate-ip/docs/#ipv4generateoptions",exampleCall:"ipv4.generate({ verbose: false, qty: 3 })"})){(t={...e,...t}).verbose&&log.info(`Generating IPv4 address${1<t.qty?"es":""}...`);var o=[];if(1<t.qty)for(let e=0;e<t.qty;e++)o.push(this.generate({...t,qty:1,verbose:!1}));else{var i=[];for(let e=0;e<4;e++)i.push(random.int(0,256));o.push(i.join("."))}e=1<t.qty?o:o[0];return t.verbose&&(log.info(`IPv4 address${1<t.qty?"es":""} generated!`),log.info(1==t.qty?e:e.join(", "))),e}},validate(e,t={}){var o="https://github.com/adamlui/js-utils/tree/main/generate-ip/docs/#ipv4validateaddress-options",i={verbose:!0};return log.prefix="ipv4.validate()","string"!=typeof e?(log.error("1st arg <address> must be a string."),log.helpURL(o)):validateOptions({options:t,defaultOptions:i,helpURL:o,exampleCall:"ipv4.validate('0.0.255.255', { verbose: false })"})?((t={...i,...t}).verbose&&log.info(`Validating ${e}...`),i=!(4!=(o=e.split(".")).length||o.some(e=>!/^\d+$/.test(e)||parseInt(e,10)<0||255<parseInt(e,10))),t.verbose&&log.info(`IP is ${i?"":"in"}valid IPv4 address!`),i):void 0}},ipv6={generate(i={}){var e={verbose:!0,qty:1,leadingZeros:!1,doubleColon:!0};if(log.prefix="ipv6.generate()",validateOptions({options:i,defaultOptions:e,helpURL:"https://github.com/adamlui/js-utils/tree/main/generate-ip/docs/#ipv6generateoptions",exampleCall:"ipv6.generate({ leadingZeros: true, qty: 5 })"})){(i={...e,...i}).verbose&&log.info(`Generating IPv6 address${1<i.qty?"es":""}...`);var r=[];if(1<i.qty)for(let e=0;e<i.qty;e++)r.push(this.generate({...i,qty:1,verbose:!1}));else{let t=[],{qty:e,...o}=i;for(let e=0;e<8;e++)t.push(random.hex(4));r.push(this.format(t.join(":"),{...o,verbose:!1}))}e=1<i.qty?r:r[0];return i.verbose&&(log.info(`IPv6 address${1<i.qty?"es":""} generated!`),log.info(1==i.qty?e:e.join(", "))),e}},format(t,o={}){var i="https://github.com/adamlui/js-utils/tree/main/generate-ip/docs/#ipv6formatipv6address-options",r={verbose:!0,leadingZeros:!1,doubleColon:!0};if(log.prefix="ipv6.format()","string"!=typeof t)return log.error("1st arg <ipv6address> must be a string."),log.helpURL(i);if(!this.validate(t,{verbose:!1}))return log.error(t+" is not a valid IPv6 address."),log.helpURL(i);if(validateOptions({options:o,defaultOptions:r,helpURL:i,exampleCall:"ipv6.format('0d::ffff:192.1.56.10/96', { leadingZeros: true, doubleColon: false })"})){o={...r,...o};let e=t;if(e=o.doubleColon?(o.verbose&&log.info("Replacing zero series w/ '::'..."),e.replace(/:(?:0+:)+/,"::")):(o.verbose&&log.info("Expanding '::' into zero series..."),i=e.split(":").filter(Boolean).length,r=o.leadingZeros?"0000":"0",i=Array(8-i).fill(r).join(":"),e.replace("::",`:${i}:`)),o.leadingZeros){o.verbose&&log.info("Adding leading zeros...");var a=e.split(":");for(let e=0;e<a.length;e++)for(;a[e].length<4;)a[e]="0"+a[e];e=a.join(":")}else o.verbose&&log.info("Stripping leading zeros..."),e=t.replace(/(^|(?<=:))0+(?!:)/g,"$1");return o.verbose&&(e!=t?log.info("IP formatted successfully!"):log.info("IP already formatted to specs."),log.info(e)),e}},validate(o,i={}){var r="https://github.com/adamlui/js-utils/tree/main/generate-ip/docs/#ipv6validateaddress-options",a={verbose:!0};if(log.prefix="ipv6.validate()","string"!=typeof o)return log.error("1st arg <address> must be a string."),log.helpURL(r);if(validateOptions({options:i,defaultOptions:a,helpURL:r,exampleCall:"ipv6.validate('0:0:0:0:0:ffff:192.1.56.10/96', { verbose: false })"})){(i={...a,...i}).verbose&&log.info(`Validating ${o}...`);let e=o.split(/::?/),t=e[e.length-1];r=!(o.includes("::")&&2<o.split("::").length||/:{3,}/.test(o)||e.length<2||8<e.length||e.some(e=>!(/^[\da-f]{1,4}$/i.test(e)||e==t&&ipv4.validate(t.replace(/\/(?:12[0-8]|[1-9]?\d)$/,""),{verbose:!1}))));return i.verbose&&log.info(`IP is ${r?"":"in"}valid IPv6 address!`),r}}},mac={generate(t={}){var e={verbose:!0,qty:1};if(log.prefix="mac.generate()",validateOptions({options:t,defaultOptions:e,helpURL:"https://github.com/adamlui/js-utils/tree/main/generate-ip/docs/#macgenerateoptions",exampleCall:"mac.generate({ verbose: false, qty: 2 })"})){(t={...e,...t}).verbose&&log.info(`Generating MAC address${1<t.qty?"es":""}...`);var o=[];if(1<t.qty)for(let e=0;e<t.qty;e++)o.push(this.generate({...t,qty:1,verbose:!1}));else{var[e,i]=Array.from({length:2},()=>{var t=[];for(let e=0;e<3;e++)t.push(random.hex(2));return t.join(":")});o.push(e+":"+i)}e=1<t.qty?o:o[0];return t.verbose&&(log.info(`MAC address${1<t.qty?"es":""} generated!`),log.info(1==t.qty?e:e.join(", "))),e}},validate(e,t={}){var o="https://github.com/adamlui/js-utils/tree/main/generate-ip/docs/#macvalidateaddress-options",i={verbose:!0};return log.prefix="mac.validate()","string"!=typeof e?(log.error("1st arg <address> must be a string."),log.helpURL(o)):validateOptions({options:t,defaultOptions:i,helpURL:o,exampleCall:"mac.validate('00:1A:2B:3C:4D:5E', { verbose: false })"})?((t={...i,...t}).verbose&&log.info(`Validating ${e}...`),o=/^(?:[\da-f]{2}[:-]){5}[\da-f]{2}$/i.test(e),t.verbose&&log.info(`Address is ${o?"":"in"}valid MAC address!`),o):void 0}};function validateOptions({options:e,defaultOptions:t,helpURL:o,exampleCall:i}){var r,a,s=Object.keys(t).filter(e=>"boolean"==typeof t[e]),l=Object.keys(t).filter(e=>Number.isInteger(t[e]));if("object"!=typeof e)return r=i.split(",").findIndex(e=>e.trim().startsWith("{"))+1,r+=["st","nd","rd"][r-1]||"th",log.error(`${"0th"==r?"[O":r+" arg [o"}ptions] can only be an object of key/vals.`),log.info("Example valid call:",i),log.validOptions(t),log.helpURL(o),!1;for(a in e){if(!Object.prototype.hasOwnProperty.call(t,a))return log.error(`\`${a}\` is an invalid option.`),log.validOptions(t),log.helpURL(o),!1;if(s.includes(a)&&"boolean"!=typeof e[a])return log.error(`[${a}] option can only be \`true\` or \`false\`.`),log.helpURL(o),!1;if(l.includes(a)&&(e[a]=parseInt(e[a],10),isNaN(e[a])||e[a]<1))return log.error(`[${a}] option can only be an integer > 0.`),log.helpURL(o),!1}return!0}let random={int(e,t){var o;return"undefined"==typeof require?(o=(window.crypto||window.msCrypto)?.getRandomValues(new Uint32Array(1))[0]/4294967295||Math.random(),Math.floor(o*(t-e))+e):require("crypto").randomInt(e,t)},hex(t){let o="";for(let e=0;e<t;e++)o+=random.int(0,16).toString(16);return o}},log={prefix:app.name,error(...e){console.error(this.prefix+" ยป ERROR:",...e)},helpURL(e=app.urls?.docs){this.info("For more help, please visit",e)},info(...e){console.info(this.prefix+" ยป",...e)},validOptions(e){var t=Object.keys(e).join(", "),e=JSON.stringify(e,void 0,2).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'").replace(/\n\s*/g," ");this.info(`Valid options: [${t}]`),this.info("If omitted, default settings are: "+e)}};app.exports={ipv4:ipv4,ipv6:ipv6,mac:mac};try{module.exports={...app.exports}}catch(e){}try{Object.assign(window,app.exports)}catch(e){}for(let t in app.aliases)app.aliases[t].forEach(e=>{try{module.exports[e]??=module.exports[t]}catch(e){}try{window[e]??=window[t]}catch(e){}});
package/docs/README.md CHANGED
@@ -10,12 +10,12 @@
10
10
 
11
11
  <a href="#%EF%B8%8F-mit-license">
12
12
  <img height=31 src="https://img.shields.io/badge/License-MIT-orange.svg?logo=internetarchive&logoColor=white&labelColor=464646&style=for-the-badge"></a>
13
- <a href="https://github.com/adamlui/js-utils/releases/tag/generate-ip-2.4.9">
14
- <img height=31 src="https://img.shields.io/badge/Latest_Build-2.4.9-44cc11.svg?logo=icinga&logoColor=white&labelColor=464646&style=for-the-badge"></a>
13
+ <a href="https://github.com/adamlui/js-utils/releases/tag/generate-ip-2.5.0">
14
+ <img height=31 src="https://img.shields.io/badge/Latest_Build-2.5.0-44cc11.svg?logo=icinga&logoColor=white&labelColor=464646&style=for-the-badge"></a>
15
15
  <a href="https://www.npmjs.com/package/generate-ip?activeTab=code">
16
16
  <img height=31 src="https://img.shields.io/npm/unpacked-size/generate-ip?style=for-the-badge&logo=ebox&logoColor=white&labelColor=464646&color=blue"></a>
17
- <a href="https://github.com/adamlui/js-utils/blob/generate-ip-2.4.9/generate-ip/dist/generate-ip.min.js">
18
- <img height=31 src="https://img.shields.io/github/size/adamlui/js-utils/generate-ip/dist/generate-ip.min.js?branch=generate-ip-2.4.9&label=Minified%20Size&logo=databricks&logoColor=white&labelColor=464646&color=ff69b4&style=for-the-badge"></a>
17
+ <a href="https://github.com/adamlui/js-utils/blob/generate-ip-2.5.0/generate-ip/dist/generate-ip.min.js">
18
+ <img height=31 src="https://img.shields.io/github/size/adamlui/js-utils/generate-ip/dist/generate-ip.min.js?branch=generate-ip-2.5.0&label=Minified%20Size&logo=databricks&logoColor=white&labelColor=464646&color=ff69b4&style=for-the-badge"></a>
19
19
  <a href="https://sonarcloud.io/component_measures?metric=new_vulnerabilities&id=adamlui_js-utils:generate-ip/src/generate-ip.js">
20
20
  <img height=31 src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fsonarcloud.io%2Fapi%2Fmeasures%2Fcomponent%3Fcomponent%3Dadamlui_js-utils%3Agenerate-ip%2Fsrc%2Fgenerate-ip.js%26metricKeys%3Dvulnerabilities&query=%24.component.measures.0.value&style=for-the-badge&logo=sonarcloud&logoColor=white&labelColor=464646&label=Vulnerabilities&color=gold"></a>
21
21
  <a href="https://github.com/toolleeo/cli-apps#networking">
@@ -71,7 +71,7 @@ $ npm install generate-ip
71
71
  #### ECMAScript*:
72
72
 
73
73
  ```js
74
- import { ipv4, ipv6, mac } from 'generate-ip';
74
+ import { ipv4, ipv6, mac } from 'generate-ip'
75
75
  ```
76
76
 
77
77
  #### CommonJS:
@@ -87,14 +87,14 @@ const { ipv4, ipv6, mac } = require('generate-ip')
87
87
  #### <> HTML script tag:
88
88
 
89
89
  ```html
90
- <script src="https://cdn.jsdelivr.net/npm/generate-ip@2.4.9/dist/generate-ip.min.js"></script>
90
+ <script src="https://cdn.jsdelivr.net/npm/generate-ip@2.5.0/dist/generate-ip.min.js"></script>
91
91
  ```
92
92
 
93
93
  #### ES6:
94
94
 
95
95
  ```js
96
96
  (async () => {
97
- await import('https://cdn.jsdelivr.net/npm/generate-ip@2.4.9/dist/generate-ip.min.js')
97
+ await import('https://cdn.jsdelivr.net/npm/generate-ip@2.5.0/dist/generate-ip.min.js')
98
98
  // Your code here...
99
99
  })()
100
100
  ```
@@ -103,7 +103,7 @@ const { ipv4, ipv6, mac } = require('generate-ip')
103
103
 
104
104
  ```js
105
105
  ...
106
- // @require https://cdn.jsdelivr.net/npm/generate-ip@2.4.9/dist/generate-ip.min.js
106
+ // @require https://cdn.jsdelivr.net/npm/generate-ip@2.5.0/dist/generate-ip.min.js
107
107
  // ==/UserScript==
108
108
 
109
109
  // Your code here...
@@ -111,7 +111,7 @@ const { ipv4, ipv6, mac } = require('generate-ip')
111
111
 
112
112
  <br>
113
113
 
114
- ๐Ÿ“ **Note:** To always import the latest version (not recommended in production!) remove the `@2.4.9` version tag from the jsDelivr URL: `https://cdn.jsdelivr.net/npm/generate-ip/dist/generate-ip.min.js`
114
+ ๐Ÿ“ **Note:** To always import the latest version (not recommended in production!) remove the `@2.5.0` version tag from the jsDelivr URL: `https://cdn.jsdelivr.net/npm/generate-ip/dist/generate-ip.min.js`
115
115
 
116
116
  <br>
117
117
 
@@ -369,17 +369,38 @@ Sample output:
369
369
  ```
370
370
  Parameter options:
371
371
  --qty=n Generate n IP address(es).
372
+ --config="path/to/file" Load custom config file.
372
373
 
373
374
  Boolean options:
374
375
  -6, --ipv6 Generate IPv6 address.
375
376
  -m, --mac Generate MAC address.
376
377
  -q, --quiet Suppress all logging except errors.
377
378
 
378
- Info commands:
379
+ Commands:
380
+ -i, --init Create config file (in project root).
379
381
  -h, --help Display help screen.
380
382
  -v, --version Show version number.
381
383
  ```
382
384
 
385
+ #
386
+
387
+ ### Configuration file
388
+
389
+ **generate-ip** can be customized using `generate-ip.config.mjs` or `generate-ip.config.js` placed in your project root.
390
+
391
+ Example defaults:
392
+
393
+ ```js
394
+ export default {
395
+ qty: 5, // # of IPs to generate
396
+ ipv6mode: false, // Generate IPv6 address(es)
397
+ macMode: false, // Generate MAC address(es)
398
+ quietMode: true // Suppress all logging except errors
399
+ }
400
+ ```
401
+
402
+ ๐Ÿ’ก Use the `--init` command to generate a template `generate-ip.config.mjs` in your project root.
403
+
383
404
  <br>
384
405
 
385
406
  <img height=6px width="100%" src="https://assets.js-utils.org/images/separators/aqua-gradient.png?v=0d36e26">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "generate-ip",
3
- "version": "2.4.9",
3
+ "version": "2.5.0",
4
4
  "description": "Randomly generate, format, and validate IPv4 + IPv6 + MAC addresses.",
5
5
  "author": {
6
6
  "name": "Adam Lui",
@@ -38,7 +38,12 @@
38
38
  "doc": "./docs"
39
39
  },
40
40
  "scripts": {
41
- "build": "bash utils/build.sh",
41
+ "build": "node utils/build",
42
+ "build:js": "node utils/build --js",
43
+ "build:data": "node utils/build --data",
44
+ "build:json": "node utils/build --json",
45
+ "debug": "node src/cli --debug",
46
+ "translate": "py utils/translate-en-messages.py",
42
47
  "bump:patch": "bash utils/bump.sh patch",
43
48
  "bump:minor": "bash utils/bump.sh minor",
44
49
  "bump:major": "bash utils/bump.sh major"
@@ -66,6 +71,6 @@
66
71
  "node-clipboardy": "^1.0.3"
67
72
  },
68
73
  "devDependencies": {
69
- "@adamlui/minify.js": "^2.1.4"
74
+ "@adamlui/minify.js": "^2.2.0"
70
75
  }
71
76
  }
@@ -1,16 +0,0 @@
1
- /**
2
- * ยฉ 2024โ€“2026 Adam Lui & contributors under the MIT license.
3
- * Source: https://github.com/adamlui/js-utils/tree/main/generate-ip/src
4
- * Documentation: https://github.com/adamlui/js-utils/tree/main/generate-ip/docs
5
- */
6
- module.exports={helpCmdAndDocURL(){console.info(`
7
- ${app.msgs.info_moreHelp}, ${app.msgs.info_type} ${app.name} --help' ${app.msgs.info_or} ${app.msgs.info_visit}
8
- `+app.colors.bw+app.urls.docs+app.colors.nc)},help(p=["header","usage","paramOptions","flags","infoCmds"]){app.prefix=""+app.colors.tlBG+app.colors.blk+` ${app.name} ${app.colors.nc} `;let o={header:[`
9
- โ”œ ${app.prefix}${app.msgs.appCopyright||`ยฉ ${app.copyrightYear} ${app.author} under the ${app.license} license`}.`,""+app.prefix+app.msgs.prefix_source+": "+app.urls.src],usage:[`
10
- ${app.colors.bw}o ${app.msgs.helpSection_usage}:`+app.colors.nc,` ${app.colors.bw}ยป `+app.colors.bg+app.cmdFormat+app.colors.nc],paramOptions:[`
11
- ${app.colors.bw}o ${app.msgs.helpSection_paramOptions}:`+app.colors.nc,` --qty=n ${app.msgs.optionDesc_qty}.`],flags:[`
12
- ${app.colors.bw}o ${app.msgs.helpSection_flags}:`+app.colors.nc,` -6, --ipv6 ${app.msgs.optionDesc_ipv6}.`,` -m, --mac ${app.msgs.optionDesc_mac}.`,` -q, --quiet ${app.msgs.optionDesc_quiet}.`],infoCmds:[`
13
- ${app.colors.bw}o ${app.msgs.helpSection_infoCmds}:`+app.colors.nc," -h, --help "+app.msgs.optionDesc_help,` -v, --version ${app.msgs.optionDesc_version}.`]};p.forEach(n=>o[n]?.forEach(o=>{{var r=/header|usage/.test(n)?1:29;let s=process.stdout.columns||80,e=[],p=o.match(/\S+|\s+/g),a="";p.forEach(p=>{var o=s-(e.length?r:0);a.length+"| ".length+p.length>o&&(e.push(e.length?a.trimStart():a),a=""),a+=p}),e.push(e.length?a.trimStart():a),e.forEach((p,o)=>console.info("| "+(0==o?p:" ".repeat(r)+p)))}})),console.info(`
14
- ${app.msgs.info_moreHelp}, ${app.msgs.info_visit}: `+app.colors.bw+app.urls.docs+app.colors.nc)},ifNotQuiet(p){app.config.quietMode||console.info(p)},version(){var p=require("path"),o=require("child_process").execSync(`npm view ${JSON.stringify(app.name)} version`).toString().trim()||"none";let s,e=process.cwd();for(;"/"!=e;){var a=p.join(e,"package.json");if(require("fs").existsSync(a)){a=require(a);s=(a.dependencies?.[app.name]||a.devDependencies?.[app.name])?.match(/^[~^>=]?\d+\.\d+\.\d+$/)?.[1]||"none";break}e=p.dirname(e)}console.info(`
15
- ${app.msgs.prefix_globalVer}: ${o}
16
- ${app.msgs.prefix_localVer}: `+s)}};