8000 fix(Token Generator): multi token, last settings, length input, denied chars by sharevb · Pull Request #913 · CorentinTh/it-tools · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

fix(Token Generator): multi token, last settings, length input, denied chars #913

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 13 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions components.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,10 @@ declare module '@vue/runtime-core' {
NLayout: typeof import('naive-ui')['NLayout']
NLayoutSider: typeof import('naive-ui')['NLayoutSider']
NMenu: typeof import('naive-ui')['NMenu']
NSpace: typeof import('naive-ui')['NSpace']
NTable: typeof import('naive-ui')['NTable']
NP: typeof import('naive-ui')['NP']
NScrollbar: typeof import('naive-ui')['NScrollbar']
NSlider: typeof import('naive-ui')['NSlider']
NSwitch: typeof import('naive-ui')['NSwitch']
NumeronymGenerator: typeof import('./src/tools/numeronym-generator/numeronym-generator.vue')['default']
OtpCodeGeneratorAndValidator: typeof import('./src/tools/otp-code-generator-and-validator/otp-code-generator-and-validator.vue')['default']
PasswordStrengthAnalyser: typeof import('./src/tools/password-strength-analyser/password-strength-analyser.vue')['default']
Expand Down
2 changes: 1 addition & 1 deletion locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -390,4 +390,4 @@ tools:

text-to-binary:
title: Text to ASCII binary
description: Convert text to its ASCII binary representation and vice-versa.
description: Convert text to its ASCII binary representation and vice-versa.
14 changes: 14 additions & 0 deletions src/tools/token-generator/token-generator.service.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,5 +94,19 @@ describe('token-generator', () => {
expect(token).toHaveLength(256);
expect(token).toMatch(/^[a-zA-Z]+$/);
});

it('should generate a random string with just numbers except 1 and 2 if only withNumbers is set and deniedChars contains 1 and 2', () => {
const token = createToken({
withLowercase: false,
withUppercase: false,
withNumbers: true,
withSymbols: false,
length: 256,
deniedChars: '12',
});

expect(token).toHaveLength(256);
expect(token).toMatch(/^[03456789]+$/);
});
});
});
17 changes: 10 additions & 7 deletions src/tools/token-generator/token-generator.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,25 @@ export function createToken({
withLowercase = true,
withNumbers = true,
withSymbols = false,
deniedChars = '',
length = 64,
alphabet,
}: {
withUppercase?: boolean
withLowercase?: boolean
withNumbers?: boolean
withSymbols?: boolean
deniedChars?: string
length?: number
alphabet?: string
}) {
const allAlphabet = alphabet ?? [
withUppercase ? 'ABCDEFGHIJKLMOPQRSTUVWXYZ' : '',
withLowercase ? 'abcdefghijklmopqrstuvwxyz' : '',
withNumbers ? '0123456789' : '',
withSymbols ? '.,;:!?./-"\'#{([-|\\@)]=}*+' : '',
].join('');
const allAlphabet = (alphabet ?? (
(withUppercase ? 'ABCDEFGHIJKLMOPQRSTUVWXYZ' : '')
+ (withLowercase ? 'abcdefghijklmopqrstuvwxyz' : '')
+ (withNumbers ? '0123456789' : '')
+ (withSymbols ? '.,;:!?./-"\'#{([-|\\@)]=}*+' : '')
)).split('').filter(c => !(deniedChars?.includes(c))).join('');

return shuffleString(allAlphabet.repeat(length)).substring(0, length);
const len = length < 1 ? 1 : length;
return shuffleString(allAlphabet.repeat(len)).substring(0, len);
}
87 changes: 50 additions & 37 deletions src/tools/token-generator/token-generator.tool.vue
Original file line number Diff line number Diff line change
@@ -1,75 +1,88 @@
<script setup lang="ts">
import { createToken } from './token-generator.service';
import { useCopy } from '@/composable/copy';
import { useQueryParam } from '@/composable/queryParams';
import { useQueryParamOrStorage } from '@/composable/queryParams';
import { computedRefreshable } from '@/composable/computedRefreshable';

const length = useQueryParam({ name: 'length', defaultValue: 64 });
const withUppercase = useQueryParam({ name: 'uppercase', defaultValue: true });
const withLowercase = useQueryParam({ name: 'lowercase', defaultValue: true });
const withNumbers = useQueryParam({ name: 'numbers', defaultValue: true });
const withSymbols = useQueryParam({ name: 'symbols', defaultValue: false });
const count = useQueryParamOrStorage({ name: 'count', storageName: 'token-generator:count', defaultValue: 1 });
const length = useQueryParamOrStorage({ name: 'length', storageName: 'token-generator:length', defaultValue: 64 });
const withUppercase = useQueryParamOrStorage({ name: 'uppercase', storageName: 'token-generator:uppercase', defaultValue: true });
const withLowercase = useQueryParamOrStorage({ name: 'lowercase', storageName: 'token-generator:lowercase', defaultValue: true });
const withNumbers = useQueryParamOrStorage({ name: 'numbers', storageName: 'token-generator:numbers', defaultValue: true });
const withSymbols = useQueryParamOrStorage({ name: 'symbols', storageName: 'token-generator:symbols', defaultValue: false });
const deniedChars = useQueryParamOrStorage({ name: 'deny', storageName: 'token-generator:deny', defaultValue: '' });
const { t } = useI18n();

const [token, refreshToken] = computedRefreshable(() =>
createToken({
length: length.value,
withUppercase: withUppercase.value,
withLowercase: withLowercase.value,
withNumbers: withNumbers.value,
withSymbols: withSymbols.value,
}),
const [tokens, refreshTokens] = computedRefreshable(() =>
Array.from({ length: count.value < 1 ? 1 : count.value },
() => createToken({
length: length.value,
withUppercase: withUppercase.value,
withLowercase: withLowercase.value,
withNumbers: withNumbers.value,
withSymbols: withSymbols.value,
deniedChars: deniedChars.value,
})).join('\n'),
);

const { copy } = useCopy({ source: token, text: t('tools.token-generator.copied') });
const { copy } = useCopy({ source: tokens, text: t('tools.token-generator.copied') });
</script>

<template>
<div>
<c-card>
<n-form label-placement="left" label-width="140">
<div flex justify-center>
<div>
<n-form-item :label="t('tools.token-generator.uppercase')">
<n-switch v-model:value="withUppercase" />
</n-form-item>
<n-space justify="center">
<n-form-item :label="t('tools.token-generator.uppercase')">
<n-switch v-model:value="withUppercase" />
</n-form-item>

<n-form-item :label="t('tools.token-generator.lowercase')">
<n-switch v-model:value="withLowercase" />
</n-form-item>
</div>
<n-form-item :label="t('tools.token-generator.lowercase')">
<n-switch v-model:value="withLowercase" />
</n-form-item>
<n-form-item :label="t('tools.token-generator.numbers')">
<n-switch v-model:value="withNumbers" />
</n-form-item>

<div>
<n-form-item :label="t('tools.token-generator.numbers')">
<n-switch v-model:value="withNumbers" />
</n-form-item>

<n-form-item :label="t('tools.token-generator.symbols')">
<n-switch v-model:value="withSymbols" />
</n-form-item>
</div>
</div>
<n-form-item :label="t('tools.token-generator.symbols')">
<n-switch v-model:value="withSymbols" />
</n-form-item>
</n-space>
</n-form>

<n-form-item label="Denied Characters (ie, visually similar { oO01lI } or punctuations)" label-placement="top">
<c-input-text
v-model:value="deniedChars"
placeholder="Put characters to deny from token"
/>
</n-form-item>

<n-form-item :label="`${t('tools.token-generator.length')} (${length})`" label-placement="left">
<n-slider v-model:value="length" :step="1" :min="1" :max="512" />
<n-slider v-model:value="length" :step="1" :min="1" :max="512" mr-2 />
<n-input-number v-model:value="length" :min="1" :max="512" size="small" />
</n-form-item>

<n-form-item label="Number of token to generate" label-placement="left">
<n-slider v-model:value="count" :step="1" :min="1" mr-2 />
<n-input-number v-model:value="count" :min="1" size="small" />
</n-form-item>

<c-input-text
v-model:value="token"
v-model:value="tokens"
multiline
:placeholder="t('tools.token-generator.tokenPlaceholder')"
readonly
rows="3"
autosize
class="token-display"
word-wrap
/>

<div mt-5 flex justify-center gap-3>
<c-button @click="copy()">
{{ t('tools.token-generator.button.copy') }}
</c-button>
<c-button @click="refreshToken">
<c-button @click="refreshTokens">
{{ t('tools.token-generator.button.refresh') }}
</c-button>
</div>
Expand Down
Loading
0