generate-pw 1.3.0 → 1.3.1
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 +30 -8
- package/dist/generate-pw.min.js +10 -10
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
### Randomly generate cryptographically-secure passwords.
|
|
18
18
|
|
|
19
19
|
<a href="#%EF%B8%8F-mit-license"><img height=31 src="https://img.shields.io/badge/License-MIT-orange.svg?logo=internetarchive&logoColor=white&labelColor=464646&style=for-the-badge"></a>
|
|
20
|
-
<a href="https://github.com/adamlui/js-utils/releases/tag/generate-pw-1.3.
|
|
20
|
+
<a href="https://github.com/adamlui/js-utils/releases/tag/generate-pw-1.3.1"><img height=31 src="https://img.shields.io/badge/Latest_Build-1.3.1-44cc11.svg?logo=icinga&logoColor=white&labelColor=464646&style=for-the-badge"></a>
|
|
21
21
|
<a href="https://www.npmjs.com/package/generate-pw?activeTab=code"><img height=31 src="https://img.shields.io/npm/unpacked-size/generate-pw?style=for-the-badge&logo=ebox&logoColor=white&labelColor=464646&color=blue"></a>
|
|
22
22
|
<a href="https://sonarcloud.io/component_measures?metric=new_vulnerabilities&id=adamlui_js-utils:generate-pw/generate-pw.js"><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-pw%2Fgenerate-pw.js%26metricKeys%3Dvulnerabilities&query=%24.component.measures.0.value&style=for-the-badge&logo=sonarcloud&logoColor=white&labelColor=464646&label=Vulnerabilities&color=gold"></a>
|
|
23
23
|
|
|
@@ -68,7 +68,15 @@ Generates **one** password if `qty` option is not given, returning a string:
|
|
|
68
68
|
```js
|
|
69
69
|
const password = pw.generatePassword({ length: 11, numbers: true });
|
|
70
70
|
console.log(password);
|
|
71
|
-
|
|
71
|
+
|
|
72
|
+
/* sample output:
|
|
73
|
+
|
|
74
|
+
generatePassword() » Initializing character set...
|
|
75
|
+
generatePassword() » Generating password...
|
|
76
|
+
generatePassword() » Password generated!
|
|
77
|
+
generatePassword() » Check returned string.
|
|
78
|
+
'bAsZm3mq6Qn'
|
|
79
|
+
*/
|
|
72
80
|
```
|
|
73
81
|
|
|
74
82
|
...or **multiple** passwords if `qty` option is given, returning an array of strings:
|
|
@@ -76,7 +84,14 @@ console.log(password);
|
|
|
76
84
|
```js
|
|
77
85
|
const passwords = pw.generatePassword({ qty: 5, length: 8, symbols: true });
|
|
78
86
|
console.log(passwords);
|
|
79
|
-
|
|
87
|
+
|
|
88
|
+
/* sample output:
|
|
89
|
+
|
|
90
|
+
generatePassword() » Generating passwords...
|
|
91
|
+
generatePassword() » Passwords generated!
|
|
92
|
+
generatePassword() » Check returned array.
|
|
93
|
+
[ '!zSf@Q.s', '!,HT\\;m=', '?Lq&FV>^', 'gf}Y;}Ne', 'Stsx(GqE' ]
|
|
94
|
+
*/
|
|
80
95
|
```
|
|
81
96
|
|
|
82
97
|
**💡 Note:** If no options are passed, passwords will be 8-chars long, consisting of upper/lower cased letters.
|
|
@@ -92,7 +107,14 @@ Generates **multiple** passwords based on `qty` given, returning an array of str
|
|
|
92
107
|
```js
|
|
93
108
|
const passwords = pw.generatePasswords(5, { length: 3, uppercase: false });
|
|
94
109
|
console.log(passwords);
|
|
95
|
-
|
|
110
|
+
|
|
111
|
+
/* sample output:
|
|
112
|
+
|
|
113
|
+
generatePasswords() » Generating passwords...
|
|
114
|
+
generatePasswords() » Passwords generated!
|
|
115
|
+
generatePasswords() » Check returned array.
|
|
116
|
+
[ 'yilppxru', 'ckvkyjfp', 'zolcpyfb' ]
|
|
117
|
+
*/
|
|
96
118
|
```
|
|
97
119
|
|
|
98
120
|
**💡 Note:** If no `qty` arg is passed, just one password will be generated, returned as a string.
|
|
@@ -112,7 +134,8 @@ console.log(strictPW);
|
|
|
112
134
|
/* sample output:
|
|
113
135
|
|
|
114
136
|
strictify() » Strictifying password...
|
|
115
|
-
strictify() »
|
|
137
|
+
strictify() » Password is now strict!
|
|
138
|
+
strictify() » Check returned string.
|
|
116
139
|
a!c2ef
|
|
117
140
|
*/
|
|
118
141
|
```
|
|
@@ -139,9 +162,7 @@ Validates the strength of a password, returning an object containing:
|
|
|
139
162
|
Example:
|
|
140
163
|
|
|
141
164
|
```js
|
|
142
|
-
const
|
|
143
|
-
pwStrength = pw.validateStrength(password);
|
|
144
|
-
|
|
165
|
+
const pwStrength = pw.validateStrength('Aa?idsE');
|
|
145
166
|
console.log(pwStrength);
|
|
146
167
|
|
|
147
168
|
/* outputs:
|
|
@@ -174,6 +195,7 @@ Any of these can be passed into the options object for each `generate*()` functi
|
|
|
174
195
|
|
|
175
196
|
Name | Type | Description | Default Value
|
|
176
197
|
------------|---------|--------------------------------------------------------------------------------|---------------
|
|
198
|
+
`verbose` | Boolean | Enable logging. | `true`
|
|
177
199
|
`length` | Integer | Length of password(s). | `8`
|
|
178
200
|
`qty`* | Integer | Number of passwords to generate. | `1`
|
|
179
201
|
`charset` | String | Characters to include in password(s). | `''`
|
package/dist/generate-pw.min.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const
|
|
2
|
+
const g=require("crypto")["randomInt"],r=require("child_process")["execSync"],m={lower:"abcdefghijklmnopqrstuvwxyz",upper:"ABCDEFGHIJKLMNOPQRSTUVWXYZ",numbers:"0123456789",symbols:"!@#$%^&*()-_=+[]{}/\\|;:'\",.<>?"};function p(o={}){var e={verbose:!0,length:8,qty:1,charset:"",exclude:"",numbers:!1,symbols:!1,lowercase:!0,uppercase:!0,strict:!1};o={...e,...o};for(const r of Object.keys(o))if(!Object.prototype.hasOwnProperty.call(e,r))return console.error(`generatePassword() » ERROR: \`${r}\` is an invalid option.
|
|
3
3
|
`+`generatePassword() » Valid options:
|
|
4
|
-
[ ${Object.keys(
|
|
4
|
+
[ ${Object.keys(e).join(", ")} ]`);for(const s of["length","qty"])if(o[s]=parseInt(o[s],10),isNaN(o[s])||o[s]<1)return console.error(`generatePassword() » ERROR: [${s}] option can only be an integer > 0.`);for(const i of["numbers","symbols","lowercase","uppercase","strict"])if("boolean"!=typeof o[i])return console.error(`generatePassword() » ERROR: [${i}] option can only be \`true\` or \`false\`.`);if(1<o.qty){const{qty:l,...c}=o;return d(l,c)}{var t,n="generatePasswords"===p.caller.name;o.verbose&&!n&&console.info("generatePassword() » Initializing character set...");let r=o.charset||(o.numbers?m.numbers:"")+(o.symbols?m.symbols:"")+(o.lowercase?m.lower:"")+(o.uppercase?m.upper:""),s=(""===r&&(r=m.lower+m.upper),o.exclude&&(o.verbose&&!n&&console.info("generatePassword() » Removing excluded characters..."),r=r.replace(new RegExp(`[${o.exclude}]`,"g"),"")),o.verbose&&!n&&console.info("generatePassword() » Generating password..."),"");for(let e=0;e<o.length;e++){var a=g(0,r.length);s+=r.charAt(a)}return o.strict&&(o.verbose&&!n&&console.info("generatePassword() » Enforcing strict mode..."),t=["number","symbol","lower","upper"].filter(e=>o[e+"s"]||o[e+"case"]),s=f(s,t)),o.verbose&&!n&&console.info("generatePassword() » Password generated!"+(require.main!==module?"\ngeneratePassword() » Check returned string.":"")),s}}function d(r,s={}){var e={verbose:!0,length:8,charset:"",exclude:"",numbers:!1,symbols:!1,lowercase:!0,uppercase:!0,strict:!1};if(s={...e,...s},r=parseInt(r,10),isNaN(r)||r<1)return console.error("generatePasswords() » ERROR: 1st arg <qty> can only be an integer > 0.");for(const t of Object.keys(s))if(!Object.prototype.hasOwnProperty.call(e,t))return console.error(`generatePasswords() » ERROR: \`${t}\` is an invalid option.
|
|
5
5
|
`+`generatePasswords() » Valid options:
|
|
6
|
-
[ ${Object.keys(e).join(", ")} ]`);if(s.length=parseInt(s.length),isNaN(s.length)||s.length<1)return console.error("generatePasswords() » ERROR: [length] option can only be an integer > 0.");for(const n of["numbers","symbols","lowercase","uppercase","strict"])if("boolean"!=typeof s[n])return console.error(`generatePasswords() » ERROR: [${n}] option can only be \`true\` or \`false\`.`);var o=[];for(let e=0;e<r;e++)o.push(
|
|
7
|
-
`+`strictify() » Valid character types: [ ${t.join(", ")} ]`);for(const
|
|
8
|
-
`+`strictify() » Valid options: [ ${Object.keys(o).join(", ")} ]`);if("boolean"!=typeof e[
|
|
9
|
-
`+"strictify() » No modifications made.")),
|
|
10
|
-
`+`validateStrength() » Valid options: [ ${Object.keys(o).join(", ")} ]`);if("boolean"!=typeof r[
|
|
11
|
-
${
|
|
12
|
-
${i}Valid arguments are below.`+n),t(["paramOptions","flags","infoCmds"]),process.exit(1)))}),process.argv.some(e=>
|
|
13
|
-
${
|
|
6
|
+
[ ${Object.keys(e).join(", ")} ]`);if(s.length=parseInt(s.length),isNaN(s.length)||s.length<1)return console.error("generatePasswords() » ERROR: [length] option can only be an integer > 0.");for(const n of["numbers","symbols","lowercase","uppercase","strict"])if("boolean"!=typeof s[n])return console.error(`generatePasswords() » ERROR: [${n}] option can only be \`true\` or \`false\`.`);s.verbose&&console.info(`generatePasswords() » Generating password${1<r?"s":""}...`);var o=[];for(let e=0;e<r;e++)o.push(p(s));return s.verbose&&console.info(`generatePasswords() » Password${1<r?"s":""} generated!`+(require.main!==module?"\ngeneratePasswords() » Check returned array.":"")),o}function f(r,s=["number","symbol","lower","upper"],e={}){var o={verbose:!0};if(e={...o,...e},"string"!=typeof r)return console.error("strictify() » ERROR: 1st arg <password> must be a string.");var t=["number","symbol","lower","upper"];for(const p of s)if(!t.includes(p))return console.error(`strictify() » ERROR: \`${p}\` is an invalid character type.
|
|
7
|
+
`+`strictify() » Valid character types: [ ${t.join(", ")} ]`);for(const d of Object.keys(e)){if(!Object.prototype.hasOwnProperty.call(o,d))return console.error(`strictify() » ERROR: \`${d}\` is an invalid option.
|
|
8
|
+
`+`strictify() » Valid options: [ ${Object.keys(o).join(", ")} ]`);if("boolean"!=typeof e[d])return console.error(`strictify() » ERROR: [${d}] option can only be set to \`true\` or \`false\`.`)}for(const f of s)global["has"+f.charAt(0).toUpperCase()+f.slice(1)]=!1;for(let e=0;e<r.length;e++)for(const u of s)(m[u]||m[u+"s"]).includes(r.charAt(e))&&(global["has"+u.charAt(0).toUpperCase()+u.slice(1)]=!0);e.verbose&&console.info("strictify() » Strictifying password...");var n=Math.min(r.length,s.length),a=[];let i=0,l=r;for(const h of s)if(i<n&&!global["has"+h.charAt(0).toUpperCase()+h.slice(1)]){let e;for(;e=g(0,r.length),a.includes(e););a.push(e);var c=m[h]||m[h+"s"];l=l.substring(0,e)+c.charAt(g(0,c.length))+l.substring(e+1),i++}return e.verbose&&(0<i?console.info("strictify() » Password is now strict!\nstrictify() » Check returned string."):console.info(`strictify() » Password already includes ${s.join(" + ")} characters!
|
|
9
|
+
`+"strictify() » No modifications made.")),l}function e(e,r={}){var s={minLength:8,minLower:1,minUpper:1,minNumber:1,minSymbol:1},o={verbose:!0};if(r={...o,...r},"string"!=typeof e)return console.error("validateStrength() » ERROR: 1st arg <password> must be a string.");for(const i of Object.keys(r)){if(!Object.prototype.hasOwnProperty.call(o,i))return console.error(`validateStrength() » ERROR: \`${i}\` is an invalid option.
|
|
10
|
+
`+`validateStrength() » Valid options: [ ${Object.keys(o).join(", ")} ]`);if("boolean"!=typeof r[i])return console.error(`validateStrength() » ERROR: [${i}] option can only be set to \`true\` or \`false\`.`)}r.verbose&&console.info("validateStrength() » Validating password strength...");var t={lower:0,upper:0,number:0,symbol:0};for(const l of e)for(const c of Object.keys(t))(m[c]||m[c+"s"]).includes(l)&&t[c]++;var n=[];e.length<s.minLength&&n.push(`Make it at least ${s.minLength} characters long.`);for(const p of Object.keys(t))t[p]<s["min"+p.charAt(0).toUpperCase()+p.slice(1)]&&n.push("Include at least one "+p+`${["upper","lower"].includes(p)?"case letter":""}.`);let a=0;a+=e.length>=s.minLength?20:0;for(const d of Object.keys(t))a+=t[d]>=s["min"+d.charAt(0).toUpperCase()+d.slice(1)]?20:0;return r.verbose&&console.info("validateStrength() » Password strength validated!\n"+(require.main!==module?"validateStrength() » Check returned object for score/recommendations.":"")),{strengthScore:a,recommendations:n,isGood:80<=a}}if(require.main!==module)module.exports={generatePassword:p,generatePasswords:d,strictify:f,validateStrength:e};else{const n="[0m",a="[1;91m",i="[1;33m",l={},c={paramOptions:{length:/^--?length/,qty:/^--?qu?a?n?ti?t?y=.*$/,charset:/^--?chars/,excludeChars:/^--?exclude=/},flags:{includeNums:/^--?(?:n|(?:include-?)?num(?:ber)?s?=?(?:true|1)?)$/,includeSymbols:/^--?(?:s|(?:include-?)?symbols?=?(?:true|1)?)$/,excludeLowerChars:/^--?(?:L|(?:exclude|disable|no)-?lower-?(?:case)?|lower-?(?:case)?=(?:false|0))$/,excludeUpperChars:/^--?(?:U|(?:exclude|disable|no)-?upper-?(?:case)?|upper-?(?:case)?=(?:false|0))$/,strictMode:/^--?s(?:trict)?(?:-?mode)?$/},infoCmds:{help:/^--?h(?:elp)?$/,version:/^--?ve?r?s?i?o?n?$/}};if(process.argv.forEach(r=>{var e,s,o;r.startsWith("-")&&(e=Object.keys(c.paramOptions).find(e=>c.paramOptions[e].test(r)),o=Object.keys(c.flags).find(e=>c.flags[e].test(r)),s=Object.keys(c.infoCmds).find(e=>c.infoCmds[e].test(r)),o?l[o]=!0:e?(o=r.split("=")[1],l[e]=parseInt(o)||o):s||(console.error(`
|
|
11
|
+
${a}ERROR: Arg [${r}] not recognized.`+n),console.info(`
|
|
12
|
+
${i}Valid arguments are below.`+n),t(["paramOptions","flags","infoCmds"]),process.exit(1)))}),process.argv.some(e=>c.infoCmds.help.test(e)))t();else if(process.argv.some(e=>c.infoCmds.version.test(e)))console.info("v"+require("./package.json").version);else{for(const h of["length","qty"])l[h]&&(isNaN(l[h])||l[h]<1)&&(console.error(`
|
|
13
|
+
${a}Error: [${h}] argument can only be > 0.`+n),process.exit(1));const o={length:l.length||8,qty:l.qty||1,charset:l.charset,exclude:l.excludeChars,numbers:!!l.includeNums,symbols:!!l.includeSymbols,lowercase:!l.excludeLowerChars,uppercase:!l.excludeUpperChars,strict:!!l.strictMode},u=p(o);s(Array.isArray(u)?u.join("\n"):u)}function t(e=["cmdFormat","paramOptions","flags","infoCmds"]){const r={cmdFormat:[`
|
|
14
14
|
${i}generate-pw [options|commands]`+n],paramOptions:["\nParameter options:"," --length=n Generate password(s) of n length."," --qty=n Generate n password(s)."," --charset=chars Only include chars in password(s)."," --charset=chars Only include chars in password(s)."," --exclude=chars Exclude chars from password(s)."],flags:["\nBoolean options:"," -n, --include-numbers Allow numbers in password(s)."," -s, --include-symbols Allow symbols in password(s)."," -L, --no-lowercase Disallow lowercase letters in password(s)."," -U, --no-uppercase Disallow uppercase letters in password(s)."],infoCmds:["\nInfo commands:"," -h, --help Display help screen."," -v, --version Show version number."]};e.forEach(e=>{r[e]?.forEach(e=>{{const o=process.stdout.columns||80,t=[],r=e.match(/\S+|\s+/g);let s="";r.forEach(e=>{var r=o-(0===t.length?0:29);s.length+e.length>r&&(t.push(0===t.length?s:s.trimStart()),s=""),s+=e}),t.push(0===t.length?s:s.trimStart()),t.forEach((e,r)=>console.info(0===r?e:" ".repeat(29)+e))}})})}function s(e){e=e.replace(/\s+$/m,"").replace(/"/g,'""'),"darwin"===process.platform?r(`printf "${e}" | pbcopy`):"linux"===process.platform?r(`printf "${e}" | xclip -selection clipboard`):"win32"===process.platform&&r(`Set-Clipboard -Value "${e}"`,{shell:"powershell"})}}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "generate-pw",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"description": "Randomly generate cryptographically-secure passwords.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Adam Lui",
|
|
@@ -49,6 +49,6 @@
|
|
|
49
49
|
"url": "https://github.com/sponsors/adamlui"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
|
-
"@adamlui/minify.js": "^1.4.
|
|
52
|
+
"@adamlui/minify.js": "^1.4.7"
|
|
53
53
|
}
|
|
54
54
|
}
|