Skip to content

Commit 3bc667f

Browse files
committed
Merge branch 'feat/passphrase-generator' into chore/all-my-stuffs
# Conflicts: # components.d.ts # package.json # pnpm-lock.yaml # src/tools/index.ts
2 parents b187d58 + f52b42d commit 3bc667f

File tree

5 files changed

+116
-1
lines changed

5 files changed

+116
-1
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@
184184
"sshpk": "^1.18.0",
185185
"turndown": "^7.1.2",
186186
"roboto-base64": "^0.1.2",
187+
"silly-password-generator": "^1.0.28",
187188
"sql-formatter": "^13.0.0",
188189
"svg2png-wasm": "^1.4.1",
189190
"svg-to-url": "^4.0.0",

pnpm-lock.yaml

Lines changed: 15 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/tools/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { tool as maliciousLinksTester } from './malicious-links-tester';
2929
import { tool as mathFormatsConverter } from './math-formats-converter';
3030
import { tool as mathOcr } from './math-ocr';
3131
import { tool as markdownTocGenerator } from './markdown-toc-generator';
32+
import { tool as passphraseGenerator } from './passphrase-generator';
3233

3334
import { tool as cssXpathConverter } from './css-xpath-converter';
3435
import { tool as cssSelectorsMemo } from './css-selectors-memo';
@@ -157,6 +158,8 @@ export const toolsByCategory: ToolCategory[] = [
157158
hashText,
158159
crcCalculator,
159160
fileHasher,
161+
passphraseGenerator,
162+
hashText,
160163
bcrypt,
161164
uuidGenerator,
162165
ulidGenerator,
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { ArrowsShuffle } from '@vicons/tabler';
2+
import { defineTool } from '../tool';
3+
4+
export const tool = defineTool({
5+
name: 'Passphrase Generator',
6+
path: '/passphrase-generator',
7+
description: 'Generate random memoizable Passphrases',
8+
keywords: ['passphrase', 'random', 'password', 'generator'],
9+
component: () => import('./passphrase-generator.vue'),
10+
icon: ArrowsShuffle,
11+
createdAt: new Date('2024-08-15'),
12+
});
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
<script setup lang="ts">
2+
import { generateSillyPassword } from 'silly-password-generator';
3+
import { useCopy } from '@/composable/copy';
4+
import { useQueryParamOrStorage } from '@/composable/queryParams';
5+
import { computedRefreshable } from '@/composable/computedRefreshable';
6+
7+
const count = useQueryParamOrStorage({ name: 'count', storageName: 'pass-generator:count', defaultValue: 1 });
8+
const words = useQueryParamOrStorage({ name: 'words', storageName: 'pass-generator:words', defaultValue: 5 });
9+
const capitalize = useQueryParamOrStorage({ name: 'capitalize', storageName: 'pass-generator:capitalize', defaultValue: false });
10+
const saltChars = useQueryParamOrStorage({ name: 'salt', storageName: 'pass-generator:salt', defaultValue: '' });
11+
const separator = useQueryParamOrStorage({ name: 'sep', storageName: 'pass-generator:sep', defaultValue: '-' });
12+
13+
const [passphrases, refreshPassphrases] = computedRefreshable(() =>
14+
Array.from({ length: count.value },
15+
() => generateSillyPassword({
16+
capitalize: capitalize.value,
17+
wordCount: words.value,
18+
salt: saltChars.value,
19+
}).replace(/\s+/g, separator.value)).join('\n'),
20+
);
21+
22+
const { copy } = useCopy({ source: passphrases, text: 'Passphrase(s) copied to clipboard!' });
23+
</script>
24+
25+
<template>
26+
<div>
27+
<c-card>
28+
<n-form-item :label="`Words (${words})`" label-placement="left">
29+
<n-slider v-model:value="words" :step="1" :min="1" :max="512" mr-2 />
30+
<n-input-number v-model:value="words" size="small" />
31+
</n-form-item>
32+
33+
<n-space>
34+
<n-form-item label="Capitalize" label-placement="left">
35+
<n-switch v-model:value="capitalize" />
36+
</n-form-item>
37+
<n-form-item label="Separator" label-placement="left">
38+
<c-input-text
39+
v-model:value="separator"
40+
placeholder="Put separator char"
41+
/>
42+
</n-form-item>
43+
</n-space>
44+
45+
<n-form-item label="Ending Salt Chars" label-placement="left">
46+
<c-input-text
47+
v-model:value="saltChars"
48+
placeholder="Put characters to appended to end of passphrase"
49+
/>
50+
</n-form-item>
51+
52+
<n-form-item label="Number of passphrase to generate" label-placement="left">
53+
<n-input-number v-model:value="count" size="small" />
54+
</n-form-item>
55+
56+
<c-input-text
57+
v-model:value="passphrases"
58+
multiline
59+
placeholder="Passphrase..."
60+
readonly
61+
rows="3"
62+
autosize
63+
class="passphrase-display"
64+
word-wrap
65+
/>
66+
67+
<div mt-5 flex justify-center gap-3>
68+
<c-button @click="copy()">
69+
Copy
70+
</c-button>
71+
<c-button @click="refreshPassphrases">
72+
Refresh
73+
</c-button>
74+
</div>
75+
</c-card>
76+
</div>
77+
</template>
78+
79+
<style scoped lang="less">
80+
::v-deep(.passphrase-display) {
81+
textarea {
82+
text-align: center;
83+
}
84+
}
85+
</style>

0 commit comments

Comments
 (0)