Skip to content

Commit fe4dc60

Browse files
committed
Merge branch 'fix/token-generator' into chore/all-my-stuffs
# Conflicts: # components.d.ts
2 parents 084a97d + 473c9cc commit fe4dc60

File tree

6 files changed

+78
-53
lines changed

6 files changed

+78
-53
lines changed

components.d.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,10 +129,8 @@ declare module '@vue/runtime-core' {
129129
MenuLayout: typeof import('./src/components/MenuLayout.vue')['default']
130130
MetaTagGenerator: typeof import('./src/tools/meta-tag-generator/meta-tag-generator.vue')['default']
131131
MimeTypes: typeof import('./src/tools/mime-types/mime-types.vue')['default']
132-
NA: typeof import('naive-ui')['NA']
133132
NavbarButtons: typeof import('./src/components/NavbarButtons.vue')['default']
134-
NButton: typeof import('naive-ui')['NButton']
135-
NCode: typeof import('naive-ui')['NCode']
133+
NCheckbox: typeof import('naive-ui')['NCheckbox']
136134
NCollapseTransition: typeof import('naive-ui')['NCollapseTransition']
137135
NConfigProvider: typeof import('naive-ui')['NConfigProvider']
138136
NDivider: typeof import('naive-ui')['NDivider']
@@ -143,8 +141,7 @@ declare module '@vue/runtime-core' {
143141
NLayout: typeof import('naive-ui')['NLayout']
144142
NLayoutSider: typeof import('naive-ui')['NLayoutSider']
145143
NMenu: typeof import('naive-ui')['NMenu']
146-
NScrollbar: typeof import('naive-ui')['NScrollbar']
147-
NSpin: typeof import('naive-ui')['NSpin']
144+
NSpace: typeof import('naive-ui')['NSpace']
148145
NTable: typeof import('naive-ui')['NTable']
149146
NumeronymGenerator: typeof import('./src/tools/numeronym-generator/numeronym-generator.vue')['default']
150147
OtpCodeGeneratorAndValidator: typeof import('./src/tools/otp-code-generator-and-validator/otp-code-generator-and-validator.vue')['default']

locales/en.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,4 +391,4 @@ tools:
391391

392392
text-to-binary:
393393
title: Text to ASCII binary
394-
description: Convert text to its ASCII binary representation and vice-versa.
394+
description: Convert text to its ASCII binary representation and vice-versa.

pnpm-lock.yaml

Lines changed: 1 addition & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/tools/token-generator/token-generator.service.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,5 +94,19 @@ describe('token-generator', () => {
9494
expect(token).toHaveLength(256);
9595
expect(token).toMatch(/^[a-zA-Z]+$/);
9696
});
97+
98+
it('should generate a random string with just numbers except 1 and 2 if only withNumbers is set and deniedChars contains 1 and 2', () => {
99+
const token = createToken({
100+
withLowercase: false,
101+
withUppercase: false,
102+
withNumbers: true,
103+
withSymbols: false,
104+
length: 256,
105+
deniedChars: '12',
106+
});
107+
108+
expect(token).toHaveLength(256);
109+
expect(token).toMatch(/^[03456789]+$/);
110+
});
97111
});
98112
});

src/tools/token-generator/token-generator.service.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,25 @@ export function createToken({
55
withLowercase = true,
66
withNumbers = true,
77
withSymbols = false,
8+
deniedChars = '',
89
length = 64,
910
alphabet,
1011
}: {
1112
withUppercase?: boolean
1213
withLowercase?: boolean
1314
withNumbers?: boolean
1415
withSymbols?: boolean
16+
deniedChars?: string
1517
length?: number
1618
alphabet?: string
1719
}) {
18-
const allAlphabet = alphabet ?? [
19-
withUppercase ? 'ABCDEFGHIJKLMOPQRSTUVWXYZ' : '',
20-
withLowercase ? 'abcdefghijklmopqrstuvwxyz' : '',
21-
withNumbers ? '0123456789' : '',
22-
withSymbols ? '.,;:!?./-"\'#{([-|\\@)]=}*+' : '',
23-
].join('');
20+
const allAlphabet = (alphabet ?? (
21+
(withUppercase ? 'ABCDEFGHIJKLMOPQRSTUVWXYZ' : '')
22+
+ (withLowercase ? 'abcdefghijklmopqrstuvwxyz' : '')
23+
+ (withNumbers ? '0123456789' : '')
24+
+ (withSymbols ? '.,;:!?./-"\'#{([-|\\@)]=}*+' : '')
25+
)).split('').filter(c => !(deniedChars?.includes(c))).join('');
2426

25-
return shuffleString(allAlphabet.repeat(length)).substring(0, length);
27+
const len = length < 1 ? 1 : length;
28+
return shuffleString(allAlphabet.repeat(len)).substring(0, len);
2629
}

src/tools/token-generator/token-generator.tool.vue

Lines changed: 50 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,88 @@
11
<script setup lang="ts">
22
import { createToken } from './token-generator.service';
33
import { useCopy } from '@/composable/copy';
4-
import { useQueryParam } from '@/composable/queryParams';
4+
import { useQueryParamOrStorage } from '@/composable/queryParams';
55
import { computedRefreshable } from '@/composable/computedRefreshable';
66
7-
const length = useQueryParam({ name: 'length', defaultValue: 64 });
8-
const withUppercase = useQueryParam({ name: 'uppercase', defaultValue: true });
9-
const withLowercase = useQueryParam({ name: 'lowercase', defaultValue: true });
10-
const withNumbers = useQueryParam({ name: 'numbers', defaultValue: true });
11-
const withSymbols = useQueryParam({ name: 'symbols', defaultValue: false });
7+
const count = useQueryParamOrStorage({ name: 'count', storageName: 'token-generator:count', defaultValue: 1 });
8+
const length = useQueryParamOrStorage({ name: 'length', storageName: 'token-generator:length', defaultValue: 64 });
9+
const withUppercase = useQueryParamOrStorage({ name: 'uppercase', storageName: 'token-generator:uppercase', defaultValue: true });
10+
const withLowercase = useQueryParamOrStorage({ name: 'lowercase', storageName: 'token-generator:lowercase', defaultValue: true });
11+
const withNumbers = useQueryParamOrStorage({ name: 'numbers', storageName: 'token-generator:numbers', defaultValue: true });
12+
const withSymbols = useQueryParamOrStorage({ name: 'symbols', storageName: 'token-generator:symbols', defaultValue: false });
13+
const deniedChars = useQueryParamOrStorage({ name: 'deny', storageName: 'token-generator:deny', defaultValue: '' });
1214
const { t } = useI18n();
1315
14-
const [token, refreshToken] = computedRefreshable(() =>
15-
createToken({
16-
length: length.value,
17-
withUppercase: withUppercase.value,
18-
withLowercase: withLowercase.value,
19-
withNumbers: withNumbers.value,
20-
withSymbols: withSymbols.value,
21-
}),
16+
const [tokens, refreshTokens] = computedRefreshable(() =>
17+
Array.from({ length: count.value < 1 ? 1 : count.value },
18+
() => createToken({
19+
length: length.value,
20+
withUppercase: withUppercase.value,
21+
withLowercase: withLowercase.value,
22+
withNumbers: withNumbers.value,
23+
withSymbols: withSymbols.value,
24+
deniedChars: deniedChars.value,
25+
})).join('\n'),
2226
);
2327
24-
const { copy } = useCopy({ source: token, text: t('tools.token-generator.copied') });
28+
const { copy } = useCopy({ source: tokens, text: t('tools.token-generator.copied') });
2529
</script>
2630

2731
<template>
2832
<div>
2933
<c-card>
3034
<n-form label-placement="left" label-width="140">
31-
<div flex justify-center>
32-
<div>
33-
<n-form-item :label="t('tools.token-generator.uppercase')">
34-
<n-switch v-model:value="withUppercase" />
35-
</n-form-item>
35+
<n-space justify="center">
36+
<n-form-item :label="t('tools.token-generator.uppercase')">
37+
<n-switch v-model:value="withUppercase" />
38+
</n-form-item>
3639

37-
<n-form-item :label="t('tools.token-generator.lowercase')">
38-
<n-switch v-model:value="withLowercase" />
39-
</n-form-item>
40-
</div>
40+
<n-form-item :label="t('tools.token-generator.lowercase')">
41+
<n-switch v-model:value="withLowercase" />
42+
</n-form-item>
43+
<n-form-item :label="t('tools.token-generator.numbers')">
44+
<n-switch v-model:value="withNumbers" />
45+
</n-form-item>
4146

42-
<div>
43-
<n-form-item :label="t('tools.token-generator.numbers')">
44-
<n-switch v-model:value="withNumbers" />
45-
</n-form-item>
46-
47-
<n-form-item :label="t('tools.token-generator.symbols')">
48-
<n-switch v-model:value="withSymbols" />
49-
</n-form-item>
50-
</div>
51-
</div>
47+
<n-form-item :label="t('tools.token-generator.symbols')">
48+
<n-switch v-model:value="withSymbols" />
49+
</n-form-item>
50+
</n-space>
5251
</n-form>
5352

53+
<n-form-item label="Denied Characters (ie, visually similar { oO01lI } or punctuations)" label-placement="top">
54+
<c-input-text
55+
v-model:value="deniedChars"
56+
placeholder="Put characters to deny from token"
57+
/>
58+
</n-form-item>
59+
5460
<n-form-item :label="`${t('tools.token-generator.length')} (${length})`" label-placement="left">
55-
<n-slider v-model:value="length" :step="1" :min="1" :max="512" />
61+
<n-slider v-model:value="length" :step="1" :min="1" :max="512" mr-2 />
62+
<n-input-number v-model:value="length" :min="1" :max="512" size="small" />
63+
</n-form-item>
64+
65+
<n-form-item label="Number of token to generate" label-placement="left">
66+
<n-slider v-model:value="count" :step="1" :min="1" mr-2 />
67+
<n-input-number v-model:value="count" :min="1" size="small" />
5668
</n-form-item>
5769

5870
<c-input-text
59-
v-model:value="token"
71+
v-model:value="tokens"
6072
multiline
6173
:placeholder="t('tools.token-generator.tokenPlaceholder')"
6274
readonly
6375
rows="3"
6476
autosize
6577
class="token-display"
78+
word-wrap
6679
/>
6780

6881
<div mt-5 flex justify-center gap-3>
6982
<c-button @click="copy()">
7083
{{ t('tools.token-generator.button.copy') }}
7184
</c-button>
72-
<c-button @click="refreshToken">
85+
<c-button @click="refreshTokens">
7386
{{ t('tools.token-generator.button.refresh') }}
7487
</c-button>
7588
</div>

0 commit comments

Comments
 (0)