From 67d9b1f35fb13433a150eb5f240f41323ebcf4cf Mon Sep 17 00:00:00 2001 From: aramoh3ni Date: Mon, 4 Dec 2023 17:56:20 +0430 Subject: [PATCH 1/5] refactoring js-generate-password to type save --- .gitignore | 2 +- .npmignore | 14 ++++++ LICENSE | 2 +- dist/index.js | 36 +------------- dist/lib/check-options-error.js | 23 --------- dist/lib/generate-random-number.js | 8 --- dist/lib/password-generator.js | 64 ------------------------ dist/lib/process-options.js | 57 ---------------------- dist/lib/shuffle-string.js | 16 ------ dist/lib/types.js | 2 - package.json | 26 +++++++--- react-share-kit-demo.png | Bin 46825 -> 0 bytes rollup.config.js | 37 ++++++++++++++ src/index.ts | 35 +++++++------ src/lib/check-options-error.ts | 14 +++--- src/lib/password-generator.ts | 76 ++++++++++++++--------------- src/lib/process-options.ts | 42 ++++++++-------- src/lib/types.ts | 52 -------------------- src/{index.d.ts => types.d.ts} | 24 ++++----- tsconfig.json | 59 ++++++++++++++++++++++ 20 files changed, 227 insertions(+), 362 deletions(-) create mode 100644 .npmignore delete mode 100644 dist/lib/check-options-error.js delete mode 100644 dist/lib/generate-random-number.js delete mode 100644 dist/lib/password-generator.js delete mode 100644 dist/lib/process-options.js delete mode 100644 dist/lib/shuffle-string.js delete mode 100644 dist/lib/types.js delete mode 100644 react-share-kit-demo.png create mode 100644 rollup.config.js delete mode 100644 src/lib/types.ts rename src/{index.d.ts => types.d.ts} (75%) create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore index e2f0321..155990b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +/dist # Logs logs .vscode/ @@ -22,7 +23,6 @@ lib-cov # Coverage directory used by tools like istanbul coverage *.lcov -tsconfig.json # nyc test coverage .nyc_output diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..c06ff38 --- /dev/null +++ b/.npmignore @@ -0,0 +1,14 @@ +src +demo +docs +.tsconfig +.gitignore +.git +*.png +*.config.js +tsconfig.json +rollup.config.mjs +.eslintrc.js +.prettierrc +.editorconfig +.babelrc \ No newline at end of file diff --git a/LICENSE b/LICENSE index 97e4970..0c762c7 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 Mustafa Zahedi +Copyright (c) 2022 Ahmad Joya Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/dist/index.js b/dist/index.js index a4f8d5f..3cc48fd 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,35 +1 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.GeneratePassword = void 0; -const password_generator_1 = require("./lib/password-generator"); -const check_options_error_1 = require("./lib/check-options-error"); -const process_options_1 = require("./lib/process-options"); -function GeneratePassword(options) { - let pswd; - if (options) { - options = (0, process_options_1.processOption)(options); - (0, check_options_error_1.checkError)(options); - pswd = (0, password_generator_1.generatePswd)(options); - return pswd; - } - else { - let opt = { - length: 10, - lowercase: true, - uppercase: true, - numbers: true, - symbols: false, - exclude: "", - minLengthLowercase: 1, - minLengthUppercase: 1, - minLengthNumbers: 1, - minLengthSymbols: 0, - }; - options = (0, process_options_1.processOption)(opt); - (0, check_options_error_1.checkError)(options); - pswd = (0, password_generator_1.generatePswd)(options); - return pswd; - } -} -exports.GeneratePassword = GeneratePassword; -exports.default = { GeneratePassword }; +"use strict";var e=function(e){return Math.floor(Math.random()*e)},n=function(n){var t="",s="",o=n.length,a=n.lowercase,m=n.uppercase,h=n.numbers,i=n.symbols,l=n.minLengthLowercase,c=n.minLengthUppercase,g=n.minLengthNumbers,u=n.minLengthSymbols,L=n.exclude,p="abcdefghijklmnopqrstuvwxyz";p=r(p,L);var b="ABCDEFGHIJKLMNOPQRSTUVWXYZ";b=r(b,L);var d="0123456789";d=r(d,L);var v="!#$%&'()*+,-./:;<=>?@[]^_{|}~";v=r(v,L);for(var w=p.length,f=0;f0;r--){var t=Math.floor(Math.random()*(r+1)),s=n[r];n[r]=n[t],n[t]=s}return n.join("")}(s);var y="";y=a?y+p:y,y=m?y+b:y,y=h?y+d:y,y=i?y+v:y;var N=o-t.length;w=y.length;for(f=0;fn)throw new Error("Sum of Minimum Characters in the passwords greater than the length of the Password to be generated.");if(0==r&&0==t&&0==s&&0==o)throw new Error("Alphabets, Numbers and Symbols are all set to False. No valid Characters to generate the Password.")},s=function(e){return e.length=void 0===e.length?10:e.length,e.lowercase=void 0===e.lowercase||e.lowercase,e.uppercase=void 0===e.uppercase||e.uppercase,e.numbers=void 0===e.numbers||e.numbers,e.symbols=void 0!==e.symbols&&e.symbols,e.lowercase?e.minLengthLowercase=void 0===e.minLengthLowercase?1:e.minLengthLowercase:e.minLengthLowercase=0,e.uppercase?e.minLengthUppercase=void 0===e.minLengthUppercase?1:e.minLengthUppercase:e.minLengthUppercase=0,e.numbers?e.minLengthNumbers=void 0===e.minLengthNumbers?1:e.minLengthNumbers:e.minLengthNumbers=0,e.symbols?e.minLengthSymbols=void 0===e.minLengthSymbols?1:e.minLengthSymbols:e.minLengthSymbols=0,e.exclude=void 0===e.exclude?"":e.exclude,e};exports.GeneratePassword=function(e){return e?(e=s(e),t(e),n(e)):(e=s({length:10,lowercase:!0,uppercase:!0,numbers:!0,symbols:!1,exclude:"",minLengthLowercase:1,minLengthUppercase:1,minLengthNumbers:1,minLengthSymbols:0}),t(e),n(e))}; diff --git a/dist/lib/check-options-error.js b/dist/lib/check-options-error.js deleted file mode 100644 index 8ce7b45..0000000 --- a/dist/lib/check-options-error.js +++ /dev/null @@ -1,23 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.checkError = void 0; -const checkError = (options) => { - const { length, lowercase, uppercase, numbers, symbols, minLengthLowercase, minLengthUppercase, minLengthNumbers, minLengthSymbols, } = options; - //Checking if the sum of minimum characters of Lowercase, uppercase, numbers and special case is greater than the total password length. - if (minLengthLowercase + - minLengthUppercase + - minLengthNumbers + - minLengthSymbols > - length) { - throw new Error("Sum of Minimum Characters in the passwords greater than the length of the Password to be generated."); - } - //Checking if lowercase, uppercase , numbers and special characters have all been set to false. - if (lowercase == false && - uppercase == false && - numbers == false && - symbols == false) { - throw new Error("Alphabets, Numbers and Symbols are all set to False. No valid Characters to generate the Password."); - } -}; -exports.checkError = checkError; -// module.exports = checkError; diff --git a/dist/lib/generate-random-number.js b/dist/lib/generate-random-number.js deleted file mode 100644 index 724e616..0000000 --- a/dist/lib/generate-random-number.js +++ /dev/null @@ -1,8 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.generateRandomNumbers = void 0; -const generateRandomNumbers = (upperLimit) => { - return Math.floor(Math.random() * upperLimit); -}; -exports.generateRandomNumbers = generateRandomNumbers; -// module.exports = generateRandomNumbers; diff --git a/dist/lib/password-generator.js b/dist/lib/password-generator.js deleted file mode 100644 index 7c744b5..0000000 --- a/dist/lib/password-generator.js +++ /dev/null @@ -1,64 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.generatePswd = void 0; -// const generategenerateRandomNumberss = require("./generate-random-number"); -// const shuffleString = require("./shuffle-string"); -const generate_random_number_1 = require("./generate-random-number"); -const shuffle_string_1 = require("./shuffle-string"); -const generatePswd = (options) => { - let pswd = ""; - let minChar = ""; - let { length, lowercase, uppercase, numbers, symbols, minLengthLowercase, minLengthUppercase, minLengthNumbers, minLengthSymbols, exclude, } = options; - let lowercaseChar = "abcdefghijklmnopqrstuvwxyz"; - lowercaseChar = removeExceptions(lowercaseChar, exclude); - let uppercaseChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - uppercaseChar = removeExceptions(uppercaseChar, exclude); - let numberChar = "0123456789"; - numberChar = removeExceptions(numberChar, exclude); - let specialChar = "!#$%&'()*+,-./:;<=>?@[]^_{|}~"; - specialChar = removeExceptions(specialChar, exclude); - // Generating a minChar string that holds minimum number of characters on the User Option Selection. - // The minChar variable will store the minimum number of characters for each type - lowercase, uppercase, numbers, and symbols. - // Then, the minChar variable is shuffled to make the password random. - let upperLimit = lowercaseChar.length; - for (let i = 0; i < minLengthLowercase; i++) { - minChar += lowercaseChar.charAt((0, generate_random_number_1.generateRandomNumbers)(upperLimit)); - } - upperLimit = uppercaseChar.length; - for (let i = 0; i < minLengthUppercase; i++) { - minChar += uppercaseChar.charAt((0, generate_random_number_1.generateRandomNumbers)(upperLimit)); - } - upperLimit = numberChar.length; - for (let i = 0; i < minLengthNumbers; i++) { - minChar += numberChar.charAt((0, generate_random_number_1.generateRandomNumbers)(upperLimit)); - } - upperLimit = specialChar.length; - for (let i = 0; i < minLengthSymbols; i++) { - minChar += specialChar.charAt((0, generate_random_number_1.generateRandomNumbers)(upperLimit)); - } - //Shuffling the minChar to generate a password that holds minimum criteria. - pswd = pswd + (0, shuffle_string_1.shuffleString)(minChar); - let characterString = ""; - characterString = lowercase - ? characterString + lowercaseChar - : characterString; - characterString = uppercase - ? characterString + uppercaseChar - : characterString; - characterString = numbers ? characterString + numberChar : characterString; - characterString = symbols ? characterString + specialChar : characterString; - let remainingChar = length - pswd.length; - upperLimit = characterString.length; - for (let i = 0; i < remainingChar; i++) { - pswd += characterString.charAt((0, generate_random_number_1.generateRandomNumbers)(upperLimit)); - } - return pswd; -}; -exports.generatePswd = generatePswd; -const removeExceptions = (str, EXCEPTIONS) => { - EXCEPTIONS === null || EXCEPTIONS === void 0 ? void 0 : EXCEPTIONS.split("").forEach((char) => { - str = str.replace(char, ""); - }); - return str; -}; -// module.exports = generatePassword; diff --git a/dist/lib/process-options.js b/dist/lib/process-options.js deleted file mode 100644 index de3c3dc..0000000 --- a/dist/lib/process-options.js +++ /dev/null @@ -1,57 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.processOption = void 0; -const processOption = (options) => { - { - options.length = typeof options.length == "undefined" ? 10 : options.length; - options.lowercase = - typeof options.lowercase == "undefined" ? true : options.lowercase; - options.uppercase = - typeof options.uppercase == "undefined" ? true : options.uppercase; - options.numbers = - typeof options.numbers == "undefined" ? true : options.numbers; - options.symbols = - typeof options.symbols == "undefined" ? false : options.symbols; - if (options.lowercase) { - options.minLengthLowercase = - typeof options.minLengthLowercase == "undefined" - ? 1 - : options.minLengthLowercase; - } - else { - options.minLengthLowercase = 0; - } - if (options.uppercase) { - options.minLengthUppercase = - typeof options.minLengthUppercase == "undefined" - ? 1 - : options.minLengthUppercase; - } - else { - options.minLengthUppercase = 0; - } - if (options.numbers) { - options.minLengthNumbers = - typeof options.minLengthNumbers == "undefined" - ? 1 - : options.minLengthNumbers; - } - else { - options.minLengthNumbers = 0; - } - if (options.symbols) { - options.minLengthSymbols = - typeof options.minLengthSymbols == "undefined" - ? 1 - : options.minLengthSymbols; - } - else { - options.minLengthSymbols = 0; - } - options.exclude = - typeof options.exclude == "undefined" ? "" : options.exclude; - } - return options; -}; -exports.processOption = processOption; -// module.exports = processOption; diff --git a/dist/lib/shuffle-string.js b/dist/lib/shuffle-string.js deleted file mode 100644 index 98355e6..0000000 --- a/dist/lib/shuffle-string.js +++ /dev/null @@ -1,16 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.shuffleString = void 0; -const shuffleString = (str) => { - let arr = str.split(""); - let n = arr.length; - for (let i = n - 1; i > 0; i--) { - let j = Math.floor(Math.random() * (i + 1)); - let tmp = arr[i]; - arr[i] = arr[j]; - arr[j] = tmp; - } - return arr.join(""); -}; -exports.shuffleString = shuffleString; -// module.exports = shuffleString; diff --git a/dist/lib/types.js b/dist/lib/types.js deleted file mode 100644 index c8ad2e5..0000000 --- a/dist/lib/types.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/package.json b/package.json index ff7ec80..2d2d26c 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,11 @@ { "name": "js-generate-password", - "version": "0.1.9", + "version": "0.1.10", "private": false, - "description": "Password Generator for using in javascirpt/typscript based projects.", + "description": "Password Generator for using in javascript/typescript based projects.", "Author": "Ahmad Joya ", - "main": "./dist/index.js", - "bin": "./dist/index.js", - "types": "./src/index.d.ts", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "build": "rollup -c" }, "repository": { "type": "git", @@ -35,5 +32,20 @@ "bugs": { "url": "https://github.com/ahmadjoya/js-generate-password/issues" }, - "homepage": "https://github.com/ahmadjoya/js-generate-password#readme" + "homepage": "https://github.com/ahmadjoya/js-generate-password#readme", + "type": "module", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist" + ], + "bin": "./dist/index.js", + "devDependencies": { + "@rollup/plugin-commonjs": "^25.0.7", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-terser": "^0.4.4", + "rollup": "^4.6.1", + "rollup-plugin-dts": "^6.1.0", + "rollup-plugin-typescript2": "^0.36.0" + } } diff --git a/react-share-kit-demo.png b/react-share-kit-demo.png deleted file mode 100644 index 1a08c28efd9d5c4f9c7cdc94e6020b7b8b14f6a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46825 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
+@|%Y((aW9zFhPtId%5h5_wQ|O3E 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 diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..06871e1 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,37 @@ +import typescript from 'rollup-plugin-typescript2' +import commonjs from '@rollup/plugin-commonjs' +import terser from '@rollup/plugin-terser' +import dts from 'rollup-plugin-dts' + +import packageJSON from './package.json' assert { type: 'json' } + +export default [ + { + input: 'src/index.ts', + output: [ + { + file: packageJSON.main, + format: 'cjs', + exports: 'named', + }, + ], + plugins: [ + typescript({ + check: true, + tsconfig: './tsconfig.json', + }), + commonjs({ + extensions: ['.js', '.ts', '.tsx'], + }), + terser(), + ], + }, + { + input: 'src/types.d.ts', + output: { + file: 'dist/types.d.ts', + format: 'es', + }, + plugins: [dts()], + }, +] diff --git a/src/index.ts b/src/index.ts index d6c007c..dc20e60 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,17 +1,17 @@ -import { generatePswd } from "./lib/password-generator"; -import { checkError } from "./lib/check-options-error"; -import { processOption } from "./lib/process-options"; -import { GenerateOptions } from "./lib/types"; +import { generatePswd } from './lib/password-generator' +import { checkError } from './lib/check-options-error' +import { processOption } from './lib/process-options' +import { GenerateOptions } from './types' function GeneratePassword(options?: GenerateOptions) { - let pswd; + let pswd if (options) { - options = processOption(options); + options = processOption(options) - checkError(options); + checkError(options) - pswd = generatePswd(options); - return pswd; + pswd = generatePswd(options) + return pswd } else { let opt = { length: 10, @@ -19,21 +19,20 @@ function GeneratePassword(options?: GenerateOptions) { uppercase: true, numbers: true, symbols: false, - exclude: "", + exclude: '', minLengthLowercase: 1, minLengthUppercase: 1, minLengthNumbers: 1, minLengthSymbols: 0, - }; - options = processOption(opt); + } + options = processOption(opt) - checkError(options); + checkError(options) - pswd = generatePswd(options); - return pswd; + pswd = generatePswd(options) + return pswd } } -// console.log(GeneratePassword({ minLengthLowercase: 4 })); -export { GeneratePassword }; -export default { GeneratePassword }; +// Exporting GeneratePassword as the default export and a named export +export { GeneratePassword, type GenerateOptions } diff --git a/src/lib/check-options-error.ts b/src/lib/check-options-error.ts index b72fb2d..d15bfd4 100644 --- a/src/lib/check-options-error.ts +++ b/src/lib/check-options-error.ts @@ -1,4 +1,4 @@ -import { GenerateOptions } from "./types"; +import { GenerateOptions } from '../types' export const checkError = (options: GenerateOptions) => { const { @@ -11,7 +11,7 @@ export const checkError = (options: GenerateOptions) => { minLengthUppercase, minLengthNumbers, minLengthSymbols, - } = options; + } = options //Checking if the sum of minimum characters of Lowercase, uppercase, numbers and special case is greater than the total password length. if ( @@ -22,8 +22,8 @@ export const checkError = (options: GenerateOptions) => { length! ) { throw new Error( - "Sum of Minimum Characters in the passwords greater than the length of the Password to be generated." - ); + 'Sum of Minimum Characters in the passwords greater than the length of the Password to be generated.' + ) } //Checking if lowercase, uppercase , numbers and special characters have all been set to false. @@ -34,9 +34,9 @@ export const checkError = (options: GenerateOptions) => { symbols == false ) { throw new Error( - "Alphabets, Numbers and Symbols are all set to False. No valid Characters to generate the Password." - ); + 'Alphabets, Numbers and Symbols are all set to False. No valid Characters to generate the Password.' + ) } -}; +} // module.exports = checkError; diff --git a/src/lib/password-generator.ts b/src/lib/password-generator.ts index b5e0990..d0794a8 100644 --- a/src/lib/password-generator.ts +++ b/src/lib/password-generator.ts @@ -1,11 +1,11 @@ // const generategenerateRandomNumberss = require("./generate-random-number"); // const shuffleString = require("./shuffle-string"); -import { generateRandomNumbers } from "./generate-random-number"; -import { shuffleString } from "./shuffle-string"; -import { GenerateOptions } from "./types"; +import { generateRandomNumbers } from './generate-random-number' +import { shuffleString } from './shuffle-string' +import { GenerateOptions } from '../types' export const generatePswd = (options: GenerateOptions) => { - let pswd = ""; - let minChar = ""; + let pswd = '' + let minChar = '' let { length, lowercase, @@ -17,76 +17,76 @@ export const generatePswd = (options: GenerateOptions) => { minLengthNumbers, minLengthSymbols, exclude, - } = options; + } = options - let lowercaseChar = "abcdefghijklmnopqrstuvwxyz"; - lowercaseChar = removeExceptions(lowercaseChar, exclude!); + let lowercaseChar = 'abcdefghijklmnopqrstuvwxyz' + lowercaseChar = removeExceptions(lowercaseChar, exclude!) - let uppercaseChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - uppercaseChar = removeExceptions(uppercaseChar, exclude!); + let uppercaseChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + uppercaseChar = removeExceptions(uppercaseChar, exclude!) - let numberChar = "0123456789"; - numberChar = removeExceptions(numberChar, exclude!); + let numberChar = '0123456789' + numberChar = removeExceptions(numberChar, exclude!) - let specialChar = "!#$%&'()*+,-./:;<=>?@[]^_{|}~"; - specialChar = removeExceptions(specialChar, exclude!); + let specialChar = "!#$%&'()*+,-./:;<=>?@[]^_{|}~" + specialChar = removeExceptions(specialChar, exclude!) // Generating a minChar string that holds minimum number of characters on the User Option Selection. // The minChar variable will store the minimum number of characters for each type - lowercase, uppercase, numbers, and symbols. // Then, the minChar variable is shuffled to make the password random. - let upperLimit = lowercaseChar.length; + let upperLimit = lowercaseChar.length for (let i = 0; i < minLengthLowercase!; i++) { - minChar += lowercaseChar.charAt(generateRandomNumbers(upperLimit)); + minChar += lowercaseChar.charAt(generateRandomNumbers(upperLimit)) } - upperLimit = uppercaseChar.length; + upperLimit = uppercaseChar.length for (let i = 0; i < minLengthUppercase!; i++) { - minChar += uppercaseChar.charAt(generateRandomNumbers(upperLimit)); + minChar += uppercaseChar.charAt(generateRandomNumbers(upperLimit)) } - upperLimit = numberChar.length; + upperLimit = numberChar.length for (let i = 0; i < minLengthNumbers!; i++) { - minChar += numberChar.charAt(generateRandomNumbers(upperLimit)); + minChar += numberChar.charAt(generateRandomNumbers(upperLimit)) } - upperLimit = specialChar.length; + upperLimit = specialChar.length for (let i = 0; i < minLengthSymbols!; i++) { - minChar += specialChar.charAt(generateRandomNumbers(upperLimit)); + minChar += specialChar.charAt(generateRandomNumbers(upperLimit)) } //Shuffling the minChar to generate a password that holds minimum criteria. - pswd = pswd + shuffleString(minChar); + pswd = pswd + shuffleString(minChar) - let characterString = ""; + let characterString = '' characterString = lowercase ? characterString + lowercaseChar - : characterString; + : characterString characterString = uppercase ? characterString + uppercaseChar - : characterString; + : characterString - characterString = numbers ? characterString + numberChar : characterString; + characterString = numbers ? characterString + numberChar : characterString - characterString = symbols ? characterString + specialChar : characterString; + characterString = symbols ? characterString + specialChar : characterString - let remainingChar = length! - pswd.length; + let remainingChar = length! - pswd.length - upperLimit = characterString.length; + upperLimit = characterString.length for (let i = 0; i < remainingChar; i++) { - pswd += characterString.charAt(generateRandomNumbers(upperLimit)); + pswd += characterString.charAt(generateRandomNumbers(upperLimit)) } - return pswd; -}; + return pswd +} const removeExceptions = (str: string, EXCEPTIONS: string) => { - EXCEPTIONS?.split("").forEach((char) => { - str = str.replace(char, ""); - }); - return str; -}; + EXCEPTIONS?.split('').forEach(char => { + str = str.replace(char, '') + }) + return str +} // module.exports = generatePassword; diff --git a/src/lib/process-options.ts b/src/lib/process-options.ts index be6df1f..c438a82 100644 --- a/src/lib/process-options.ts +++ b/src/lib/process-options.ts @@ -1,61 +1,61 @@ -import { GenerateOptions } from "./types"; +import { GenerateOptions } from '../types' export const processOption = (options: GenerateOptions) => { { - options.length = typeof options.length == "undefined" ? 10 : options.length; + options.length = typeof options.length == 'undefined' ? 10 : options.length options.lowercase = - typeof options.lowercase == "undefined" ? true : options.lowercase; + typeof options.lowercase == 'undefined' ? true : options.lowercase options.uppercase = - typeof options.uppercase == "undefined" ? true : options.uppercase; + typeof options.uppercase == 'undefined' ? true : options.uppercase options.numbers = - typeof options.numbers == "undefined" ? true : options.numbers; + typeof options.numbers == 'undefined' ? true : options.numbers options.symbols = - typeof options.symbols == "undefined" ? false : options.symbols; + typeof options.symbols == 'undefined' ? false : options.symbols if (options.lowercase) { options.minLengthLowercase = - typeof options.minLengthLowercase == "undefined" + typeof options.minLengthLowercase == 'undefined' ? 1 - : options.minLengthLowercase; + : options.minLengthLowercase } else { - options.minLengthLowercase = 0; + options.minLengthLowercase = 0 } if (options.uppercase) { options.minLengthUppercase = - typeof options.minLengthUppercase == "undefined" + typeof options.minLengthUppercase == 'undefined' ? 1 - : options.minLengthUppercase; + : options.minLengthUppercase } else { - options.minLengthUppercase = 0; + options.minLengthUppercase = 0 } if (options.numbers) { options.minLengthNumbers = - typeof options.minLengthNumbers == "undefined" + typeof options.minLengthNumbers == 'undefined' ? 1 - : options.minLengthNumbers; + : options.minLengthNumbers } else { - options.minLengthNumbers = 0; + options.minLengthNumbers = 0 } if (options.symbols) { options.minLengthSymbols = - typeof options.minLengthSymbols == "undefined" + typeof options.minLengthSymbols == 'undefined' ? 1 - : options.minLengthSymbols; + : options.minLengthSymbols } else { - options.minLengthSymbols = 0; + options.minLengthSymbols = 0 } options.exclude = - typeof options.exclude == "undefined" ? "" : options.exclude; + typeof options.exclude == 'undefined' ? '' : options.exclude } - return options; -}; + return options +} // module.exports = processOption; diff --git a/src/lib/types.ts b/src/lib/types.ts deleted file mode 100644 index c7ca11b..0000000 --- a/src/lib/types.ts +++ /dev/null @@ -1,52 +0,0 @@ -export interface GenerateOptions { - /** - * lenght of the password - * @default 10 - */ - length?: number; - /** - * Should the password include lowercase characters - * @default true - */ - lowercase?: boolean; - /** - * Should the password include uppercase characters - * @default true - */ - uppercase?: boolean; - /** - * Should the password include numbers - * @default true - */ - numbers?: boolean; - /** - * Should the password include symbol characters - * @default false - */ - symbols?: boolean; - /** - * List of characters to be excluded from the password - * @default "" - */ - exclude?: string; - /** - * min lentgh of lowercase character - * @default 1 - */ - minLengthLowercase?: number; - /** - * min lentgh of uppercase character - * @default 1 - */ - minLengthUppercase?: number; - /** - * min length of numbers - * @default 1 - */ - minLengthNumbers?: number; - /** - * min length of symbols - * @default 0 - */ - minLengthSymbols?: number; -} diff --git a/src/index.d.ts b/src/types.d.ts similarity index 75% rename from src/index.d.ts rename to src/types.d.ts index ca263e1..3afc791 100644 --- a/src/index.d.ts +++ b/src/types.d.ts @@ -3,56 +3,56 @@ export interface GenerateOptions { * lenght of the password * @default 10 */ - length?: number; + length?: number /** * Should the password include lowercase characters * @default true */ - lowercase?: boolean; + lowercase?: boolean /** * Should the password include uppercase characters * @default true */ - uppercase?: boolean; + uppercase?: boolean /** * Should the password include numbers * @default true */ - numbers?: boolean; + numbers?: boolean /** * Should the password include symbol characters * @default false */ - symbols?: boolean; + symbols?: boolean /** * List of characters to be excluded from the password * @default "" */ - exclude?: string; + exclude?: string /** * min lentgh of lowercase character * @default 1 */ - minLengthLowercase?: number; + minLengthLowercase?: number /** * min lentgh of uppercase character * @default 1 */ - minLengthUppercase?: number; + minLengthUppercase?: number /** * min length of numbers * @default 1 */ - minLengthNumbers?: number; + minLengthNumbers?: number /** * min length of symbols * @default 0 */ - minLengthSymbols?: number; + minLengthSymbols?: number } declare namespace GeneratePassword {} -declare function GeneratePassword(options?: GenerateOptions): string; +declare function GeneratePassword(options?: GenerateOptions): string -export { GeneratePassword }; +export { GeneratePassword } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8c94846 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,59 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "es2015", + "lib": ["es2017", "es7", "es6", "es5", "dom"], + "allowJs": false, + "declaration": true, + "sourceMap": true, + "outDir": "./dist", + "rootDir": "src", + "noEmit": true, + "strict": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + }, + "exclude": [ + "node_modules", + "dist", + ] +} + +// { +// "compilerOptions": { +// "target": "es5", +// "module": "ES2015", // <-- Change this line +// "strict": true, +// "esModuleInterop": true, +// "skipLibCheck": true, +// "forceConsistentCasingInFileNames": true, +// "moduleResolution": "node", +// "isolatedModules": true, +// "noEmit": true, +// "declaration": true, +// "declarationDir": "./dist/types", +// }, +// "include": ["src/**/*.ts"], +// "exclude": ["node_modules", "dist", "build"], +// } + +// { +// "compilerOptions": { +// "target": "es2016", +// "module": "commonjs", +// "esModuleInterop": true, +// "forceConsistentCasingInFileNames": true, +// "strict": true, +// "skipLibCheck": true, +// "outDir": "./dist", +// "declaration": true +// }, +// "include": ["src/**/*.ts"], +// "exclude": ["node_modules"] +// } From e06ad827a5ad901642ae0aa3749f0b5bd41233e6 Mon Sep 17 00:00:00 2001 From: aramoh3ni Date: Mon, 4 Dec 2023 17:59:55 +0430 Subject: [PATCH 2/5] update readme.md file --- README.md | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index a4d4f19..8b6b4c6 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ # js-generate-password -js-generate-password is usable for every javascript and typescript based project like react, vue, node, etc. it used to generate passwords that may contain alphabets, number and symbols. The options parameter enables the user to enable or disable the characters that are used to generate random password. +js-generate-password is usable for every typescript and typescript based project like react, vue, node, etc. it used to generate passwords that may contain alphabets, number and symbols. The options parameter enables the user to enable or disable the characters that are used to generate random password. The characters that may be choosen from are @@ -56,28 +56,34 @@ The user may also specify the minimum number of character for each type. ## Installation -`npm install js-generate-password` +```bash +npm install js-generate-password +``` or -`yarn add js-generate-password` +```bash +yarn add js-generate-password +``` ## Usage For the password to be generated, **parameters** are able to pass as an optional **options** object. -```javascript +```typescript import { GeneratePassword } from "js-generate-password"; + const password = GeneratePassword({ length: 14, symbols: true, }); + console.log(password); ``` If no parameter is passed, the default parameter will be taken as : -```javascript +```typescript options = { length: 10, lowercase: true, @@ -115,7 +121,7 @@ Any of these can be passed into the options object for each function. - **No Options passed.** -```javscript +```typescript const {GeneratePassword} = require("js-generate-password"); const password = GeneratePassword(); console.log(password); @@ -123,26 +129,26 @@ console.log(password); In the above case, no parameter is passed as option. Therefore the default values will be taken - which will have alphabets, both upper and lower case, numbers, and will be of length 10 characters. -```javascript +```typescript xDU6izb3PV; ``` - **Length parameter passed.** -```javascript +```typescript const password = GeneratePassword({ length: 25 }); console.log(password); ``` The password generated is like this -```javascript +```typescript U4c3KpQP5UrbZgTcrqMgFeI3R; ``` - **exclude parameter passed.** -```javascript +```typescript options={ exclude : 'abc567XYZ'; } @@ -152,6 +158,6 @@ console.log(password); The generated password wouldn't has none of 'abc567XYZ' characters -```javascript +```typescript J9yCfttQNj; ``` From ef442dbdbf062c483e1ecec97b72a7fe3d294cda Mon Sep 17 00:00:00 2001 From: aramoh3ni Date: Mon, 4 Dec 2023 18:03:03 +0430 Subject: [PATCH 3/5] updating readme.md file --- README.md | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8b6b4c6..0842498 100644 --- a/README.md +++ b/README.md @@ -115,15 +115,17 @@ Any of these can be passed into the options object for each function. | minLengthNumbers | only if **numbers** is set to **true**, minLengthNumbers will create a password that will have minimum number of numbers in the password. | 1 | | minLengthSymbols | only if **symbols** is set to **true**, minLengthSymbols will create a password that will have minimum number of symbols in the password. | 1 | -\*At least one should be true. +* At least one should be true. ## Example - **No Options passed.** ```typescript -const {GeneratePassword} = require("js-generate-password"); +const { GeneratePassword } = "js-generate-password"; + const password = GeneratePassword(); + console.log(password); ``` @@ -149,10 +151,12 @@ U4c3KpQP5UrbZgTcrqMgFeI3R; - **exclude parameter passed.** ```typescript -options={ - exclude : 'abc567XYZ'; - } +options = { + exclude : 'abc567XYZ'; +} + password = GeneratePassword(options); + console.log(password); ``` @@ -161,3 +165,8 @@ The generated password wouldn't has none of 'abc567XYZ' characters ```typescript J9yCfttQNj; ``` + + +## License + +js-generate-password is licensed under the MIT License. See the [LICENSE](https://github.com/ahmadjoya/js-generate-password#readme) file for more details. \ No newline at end of file From a8fb85e3b9c3ae8a392d7482aa11c229e249841c Mon Sep 17 00:00:00 2001 From: aramoh3ni Date: Mon, 4 Dec 2023 18:11:22 +0430 Subject: [PATCH 4/5] update version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2d2d26c..710547e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "js-generate-password", - "version": "0.1.10", + "version": "1.0.0", "private": false, "description": "Password Generator for using in javascript/typescript based projects.", "Author": "Ahmad Joya ", From bec66524534ee81b53f1eb5afb086a1fa3692b89 Mon Sep 17 00:00:00 2001 From: aramoh3ni Date: Mon, 4 Dec 2023 18:28:42 +0430 Subject: [PATCH 5/5] updating .gitignore and .npmignore --- .gitignore | 120 +++++++++----------------------------------------- .npmignore | 3 +- dist/index.js | 1 - 3 files changed, 23 insertions(+), 101 deletions(-) delete mode 100644 dist/index.js diff --git a/.gitignore b/.gitignore index 155990b..d7ff18b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,107 +1,29 @@ -/dist -# Logs -logs -.vscode/ -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# TypeScript cache -*.tsbuildinfo +# See https://help.github.com/ignore-files/ for more about ignoring files. -# Optional npm cache directory -.npm +# dependencies +node_modules -# Optional eslint cache -.eslintcache +# builds +build +dist -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file +# misc +.DS_Store .env -.env.test - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# Next.js build output -.next - -# Nuxt.js build / generate output -.nuxt -# dist +.env.local +.env.development.local +.env.test.local +.env.production.local -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and *not* Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* -# DynamoDB Local files -.dynamodb/ +package-lock.json -# TernJS port file -.tern-port +/supports/create-react-app/node_modules +/supports/create-react-app/package-lock.json -package-lock.json \ No newline at end of file +/supports/create-next-app/node_modules +/supports/create-next-app/.next +/supports/create-next-app/package-lock.json \ No newline at end of file diff --git a/.npmignore b/.npmignore index c06ff38..73b8d02 100644 --- a/.npmignore +++ b/.npmignore @@ -11,4 +11,5 @@ rollup.config.mjs .eslintrc.js .prettierrc .editorconfig -.babelrc \ No newline at end of file +.babelrc +yarn.lock \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index 3cc48fd..0000000 --- a/dist/index.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";var e=function(e){return Math.floor(Math.random()*e)},n=function(n){var t="",s="",o=n.length,a=n.lowercase,m=n.uppercase,h=n.numbers,i=n.symbols,l=n.minLengthLowercase,c=n.minLengthUppercase,g=n.minLengthNumbers,u=n.minLengthSymbols,L=n.exclude,p="abcdefghijklmnopqrstuvwxyz";p=r(p,L);var b="ABCDEFGHIJKLMNOPQRSTUVWXYZ";b=r(b,L);var d="0123456789";d=r(d,L);var v="!#$%&'()*+,-./:;<=>?@[]^_{|}~";v=r(v,L);for(var w=p.length,f=0;f0;r--){var t=Math.floor(Math.random()*(r+1)),s=n[r];n[r]=n[t],n[t]=s}return n.join("")}(s);var y="";y=a?y+p:y,y=m?y+b:y,y=h?y+d:y,y=i?y+v:y;var N=o-t.length;w=y.length;for(f=0;fn)throw new Error("Sum of Minimum Characters in the passwords greater than the length of the Password to be generated.");if(0==r&&0==t&&0==s&&0==o)throw new Error("Alphabets, Numbers and Symbols are all set to False. No valid Characters to generate the Password.")},s=function(e){return e.length=void 0===e.length?10:e.length,e.lowercase=void 0===e.lowercase||e.lowercase,e.uppercase=void 0===e.uppercase||e.uppercase,e.numbers=void 0===e.numbers||e.numbers,e.symbols=void 0!==e.symbols&&e.symbols,e.lowercase?e.minLengthLowercase=void 0===e.minLengthLowercase?1:e.minLengthLowercase:e.minLengthLowercase=0,e.uppercase?e.minLengthUppercase=void 0===e.minLengthUppercase?1:e.minLengthUppercase:e.minLengthUppercase=0,e.numbers?e.minLengthNumbers=void 0===e.minLengthNumbers?1:e.minLengthNumbers:e.minLengthNumbers=0,e.symbols?e.minLengthSymbols=void 0===e.minLengthSymbols?1:e.minLengthSymbols:e.minLengthSymbols=0,e.exclude=void 0===e.exclude?"":e.exclude,e};exports.GeneratePassword=function(e){return e?(e=s(e),t(e),n(e)):(e=s({length:10,lowercase:!0,uppercase:!0,numbers:!0,symbols:!1,exclude:"",minLengthLowercase:1,minLengthUppercase:1,minLengthNumbers:1,minLengthSymbols:0}),t(e),n(e))};