Merge ca44c5c52a into a07806cd15
				
					
				
			This commit is contained in:
		
						commit
						c08e191ad2
					
				
							
								
								
									
										47
									
								
								components.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										47
									
								
								components.d.ts
									
									
									
									
										vendored
									
									
								
							@ -70,6 +70,7 @@ declare module '@vue/runtime-core' {
 | 
				
			|||||||
    DiffViewer: typeof import('./src/tools/json-diff/diff-viewer/diff-viewer.vue')['default']
 | 
					    DiffViewer: typeof import('./src/tools/json-diff/diff-viewer/diff-viewer.vue')['default']
 | 
				
			||||||
    DockerRunToDockerComposeConverter: typeof import('./src/tools/docker-run-to-docker-compose-converter/docker-run-to-docker-compose-converter.vue')['default']
 | 
					    DockerRunToDockerComposeConverter: typeof import('./src/tools/docker-run-to-docker-compose-converter/docker-run-to-docker-compose-converter.vue')['default']
 | 
				
			||||||
    DynamicValues: typeof import('./src/tools/benchmark-builder/dynamic-values.vue')['default']
 | 
					    DynamicValues: typeof import('./src/tools/benchmark-builder/dynamic-values.vue')['default']
 | 
				
			||||||
 | 
					    Ed25519KeyPairGenerator: typeof import('./src/tools/ed25519-key-pair-generator/ed25519-key-pair-generator.vue')['default']
 | 
				
			||||||
    Editor: typeof import('./src/tools/html-wysiwyg-editor/editor/editor.vue')['default']
 | 
					    Editor: typeof import('./src/tools/html-wysiwyg-editor/editor/editor.vue')['default']
 | 
				
			||||||
    EmojiCard: typeof import('./src/tools/emoji-picker/emoji-card.vue')['default']
 | 
					    EmojiCard: typeof import('./src/tools/emoji-picker/emoji-card.vue')['default']
 | 
				
			||||||
    EmojiGrid: typeof import('./src/tools/emoji-picker/emoji-grid.vue')['default']
 | 
					    EmojiGrid: typeof import('./src/tools/emoji-picker/emoji-grid.vue')['default']
 | 
				
			||||||
@ -88,28 +89,9 @@ declare module '@vue/runtime-core' {
 | 
				
			|||||||
    HttpStatusCodes: typeof import('./src/tools/http-status-codes/http-status-codes.vue')['default']
 | 
					    HttpStatusCodes: typeof import('./src/tools/http-status-codes/http-status-codes.vue')['default']
 | 
				
			||||||
    IbanValidatorAndParser: typeof import('./src/tools/iban-validator-and-parser/iban-validator-and-parser.vue')['default']
 | 
					    IbanValidatorAndParser: typeof import('./src/tools/iban-validator-and-parser/iban-validator-and-parser.vue')['default']
 | 
				
			||||||
    'IconMdi:brushVariant': typeof import('~icons/mdi/brush-variant')['default']
 | 
					    'IconMdi:brushVariant': typeof import('~icons/mdi/brush-variant')['default']
 | 
				
			||||||
    'IconMdi:contentCopy': typeof import('~icons/mdi/content-copy')['default']
 | 
					 | 
				
			||||||
    'IconMdi:kettleSteamOutline': typeof import('~icons/mdi/kettle-steam-outline')['default']
 | 
					    'IconMdi:kettleSteamOutline': typeof import('~icons/mdi/kettle-steam-outline')['default']
 | 
				
			||||||
    IconMdiArrowDown: typeof import('~icons/mdi/arrow-down')['default']
 | 
					 | 
				
			||||||
    IconMdiArrowRightBottom: typeof import('~icons/mdi/arrow-right-bottom')['default']
 | 
					 | 
				
			||||||
    IconMdiCamera: typeof import('~icons/mdi/camera')['default']
 | 
					 | 
				
			||||||
    IconMdiChevronDown: typeof import('~icons/mdi/chevron-down')['default']
 | 
					 | 
				
			||||||
    IconMdiChevronRight: typeof import('~icons/mdi/chevron-right')['default']
 | 
					 | 
				
			||||||
    IconMdiClose: typeof import('~icons/mdi/close')['default']
 | 
					 | 
				
			||||||
    IconMdiContentCopy: typeof import('~icons/mdi/content-copy')['default']
 | 
					    IconMdiContentCopy: typeof import('~icons/mdi/content-copy')['default']
 | 
				
			||||||
    IconMdiDeleteOutline: typeof import('~icons/mdi/delete-outline')['default']
 | 
					 | 
				
			||||||
    IconMdiDownload: typeof import('~icons/mdi/download')['default']
 | 
					 | 
				
			||||||
    IconMdiEye: typeof import('~icons/mdi/eye')['default']
 | 
					 | 
				
			||||||
    IconMdiEyeOff: typeof import('~icons/mdi/eye-off')['default']
 | 
					 | 
				
			||||||
    IconMdiHeart: typeof import('~icons/mdi/heart')['default']
 | 
					 | 
				
			||||||
    IconMdiPause: typeof import('~icons/mdi/pause')['default']
 | 
					 | 
				
			||||||
    IconMdiPlay: typeof import('~icons/mdi/play')['default']
 | 
					 | 
				
			||||||
    IconMdiRecord: typeof import('~icons/mdi/record')['default']
 | 
					 | 
				
			||||||
    IconMdiRefresh: typeof import('~icons/mdi/refresh')['default']
 | 
					 | 
				
			||||||
    IconMdiSearch: typeof import('~icons/mdi/search')['default']
 | 
					 | 
				
			||||||
    IconMdiTranslate: typeof import('~icons/mdi/translate')['default']
 | 
					    IconMdiTranslate: typeof import('~icons/mdi/translate')['default']
 | 
				
			||||||
    IconMdiTriangleDown: typeof import('~icons/mdi/triangle-down')['default']
 | 
					 | 
				
			||||||
    IconMdiVideo: typeof import('~icons/mdi/video')['default']
 | 
					 | 
				
			||||||
    InputCopyable: typeof import('./src/components/InputCopyable.vue')['default']
 | 
					    InputCopyable: typeof import('./src/components/InputCopyable.vue')['default']
 | 
				
			||||||
    IntegerBaseConverter: typeof import('./src/tools/integer-base-converter/integer-base-converter.vue')['default']
 | 
					    IntegerBaseConverter: typeof import('./src/tools/integer-base-converter/integer-base-converter.vue')['default']
 | 
				
			||||||
    Ipv4AddressConverter: typeof import('./src/tools/ipv4-address-converter/ipv4-address-converter.vue')['default']
 | 
					    Ipv4AddressConverter: typeof import('./src/tools/ipv4-address-converter/ipv4-address-converter.vue')['default']
 | 
				
			||||||
@ -136,39 +118,12 @@ declare module '@vue/runtime-core' {
 | 
				
			|||||||
    MenuLayout: typeof import('./src/components/MenuLayout.vue')['default']
 | 
					    MenuLayout: typeof import('./src/components/MenuLayout.vue')['default']
 | 
				
			||||||
    MetaTagGenerator: typeof import('./src/tools/meta-tag-generator/meta-tag-generator.vue')['default']
 | 
					    MetaTagGenerator: typeof import('./src/tools/meta-tag-generator/meta-tag-generator.vue')['default']
 | 
				
			||||||
    MimeTypes: typeof import('./src/tools/mime-types/mime-types.vue')['default']
 | 
					    MimeTypes: typeof import('./src/tools/mime-types/mime-types.vue')['default']
 | 
				
			||||||
    NAlert: typeof import('naive-ui')['NAlert']
 | 
					 | 
				
			||||||
    NavbarButtons: typeof import('./src/components/NavbarButtons.vue')['default']
 | 
					    NavbarButtons: typeof import('./src/components/NavbarButtons.vue')['default']
 | 
				
			||||||
    NCheckbox: typeof import('naive-ui')['NCheckbox']
 | 
					 | 
				
			||||||
    NCode: typeof import('naive-ui')['NCode']
 | 
					 | 
				
			||||||
    NCollapseTransition: typeof import('naive-ui')['NCollapseTransition']
 | 
					 | 
				
			||||||
    NColorPicker: typeof import('naive-ui')['NColorPicker']
 | 
					 | 
				
			||||||
    NConfigProvider: typeof import('naive-ui')['NConfigProvider']
 | 
					    NConfigProvider: typeof import('naive-ui')['NConfigProvider']
 | 
				
			||||||
    NDatePicker: typeof import('naive-ui')['NDatePicker']
 | 
					 | 
				
			||||||
    NDivider: typeof import('naive-ui')['NDivider']
 | 
					 | 
				
			||||||
    NDynamicInput: typeof import('naive-ui')['NDynamicInput']
 | 
					 | 
				
			||||||
    NEllipsis: typeof import('naive-ui')['NEllipsis']
 | 
					    NEllipsis: typeof import('naive-ui')['NEllipsis']
 | 
				
			||||||
    NForm: typeof import('naive-ui')['NForm']
 | 
					 | 
				
			||||||
    NFormItem: typeof import('naive-ui')['NFormItem']
 | 
					 | 
				
			||||||
    NGi: typeof import('naive-ui')['NGi']
 | 
					 | 
				
			||||||
    NGrid: typeof import('naive-ui')['NGrid']
 | 
					 | 
				
			||||||
    NH1: typeof import('naive-ui')['NH1']
 | 
					    NH1: typeof import('naive-ui')['NH1']
 | 
				
			||||||
    NH2: typeof import('naive-ui')['NH2']
 | 
					 | 
				
			||||||
    NH3: typeof import('naive-ui')['NH3']
 | 
					    NH3: typeof import('naive-ui')['NH3']
 | 
				
			||||||
    NIcon: typeof import('naive-ui')['NIcon']
 | 
					    NIcon: typeof import('naive-ui')['NIcon']
 | 
				
			||||||
    NImage: typeof import('naive-ui')['NImage']
 | 
					 | 
				
			||||||
    NInputGroup: typeof import('naive-ui')['NInputGroup']
 | 
					 | 
				
			||||||
    NInputGroupLabel: typeof import('naive-ui')['NInputGroupLabel']
 | 
					 | 
				
			||||||
    NInputNumber: typeof import('naive-ui')['NInputNumber']
 | 
					 | 
				
			||||||
    NLayout: typeof import('naive-ui')['NLayout']
 | 
					 | 
				
			||||||
    NLayoutSider: typeof import('naive-ui')['NLayoutSider']
 | 
					 | 
				
			||||||
    NMenu: typeof import('naive-ui')['NMenu']
 | 
					 | 
				
			||||||
    NProgress: typeof import('naive-ui')['NProgress']
 | 
					 | 
				
			||||||
    NScrollbar: typeof import('naive-ui')['NScrollbar']
 | 
					 | 
				
			||||||
    NSlider: typeof import('naive-ui')['NSlider']
 | 
					 | 
				
			||||||
    NStatistic: typeof import('naive-ui')['NStatistic']
 | 
					 | 
				
			||||||
    NSwitch: typeof import('naive-ui')['NSwitch']
 | 
					 | 
				
			||||||
    NTable: typeof import('naive-ui')['NTable']
 | 
					 | 
				
			||||||
    NTag: typeof import('naive-ui')['NTag']
 | 
					 | 
				
			||||||
    NumeronymGenerator: typeof import('./src/tools/numeronym-generator/numeronym-generator.vue')['default']
 | 
					    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']
 | 
					    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']
 | 
					    PasswordStrengthAnalyser: typeof import('./src/tools/password-strength-analyser/password-strength-analyser.vue')['default']
 | 
				
			||||||
 | 
				
			|||||||
@ -41,6 +41,7 @@
 | 
				
			|||||||
    "@tiptap/pm": "2.1.6",
 | 
					    "@tiptap/pm": "2.1.6",
 | 
				
			||||||
    "@tiptap/starter-kit": "2.1.6",
 | 
					    "@tiptap/starter-kit": "2.1.6",
 | 
				
			||||||
    "@tiptap/vue-3": "2.0.3",
 | 
					    "@tiptap/vue-3": "2.0.3",
 | 
				
			||||||
 | 
					    "@types/sshpk": "^1.17.4",
 | 
				
			||||||
    "@vicons/material": "^0.12.0",
 | 
					    "@vicons/material": "^0.12.0",
 | 
				
			||||||
    "@vicons/tabler": "^0.12.0",
 | 
					    "@vicons/tabler": "^0.12.0",
 | 
				
			||||||
    "@vueuse/core": "^10.3.0",
 | 
					    "@vueuse/core": "^10.3.0",
 | 
				
			||||||
@ -79,6 +80,7 @@
 | 
				
			|||||||
    "plausible-tracker": "^0.3.8",
 | 
					    "plausible-tracker": "^0.3.8",
 | 
				
			||||||
    "qrcode": "^1.5.1",
 | 
					    "qrcode": "^1.5.1",
 | 
				
			||||||
    "sql-formatter": "^13.0.0",
 | 
					    "sql-formatter": "^13.0.0",
 | 
				
			||||||
 | 
					    "sshpk": "^1.18.0",
 | 
				
			||||||
    "ua-parser-js": "^1.0.35",
 | 
					    "ua-parser-js": "^1.0.35",
 | 
				
			||||||
    "ulid": "^2.3.0",
 | 
					    "ulid": "^2.3.0",
 | 
				
			||||||
    "unicode-emoji-json": "^0.4.0",
 | 
					    "unicode-emoji-json": "^0.4.0",
 | 
				
			||||||
@ -108,6 +110,7 @@
 | 
				
			|||||||
    "@types/node": "^18.15.11",
 | 
					    "@types/node": "^18.15.11",
 | 
				
			||||||
    "@types/node-forge": "^1.3.2",
 | 
					    "@types/node-forge": "^1.3.2",
 | 
				
			||||||
    "@types/qrcode": "^1.5.0",
 | 
					    "@types/qrcode": "^1.5.0",
 | 
				
			||||||
 | 
					    "@types/sshpk": "^1.17.4",
 | 
				
			||||||
    "@types/ua-parser-js": "^0.7.36",
 | 
					    "@types/ua-parser-js": "^0.7.36",
 | 
				
			||||||
    "@types/uuid": "^9.0.0",
 | 
					    "@types/uuid": "^9.0.0",
 | 
				
			||||||
    "@unocss/eslint-config": "^0.57.0",
 | 
					    "@unocss/eslint-config": "^0.57.0",
 | 
				
			||||||
@ -129,6 +132,7 @@
 | 
				
			|||||||
    "unplugin-icons": "^0.17.0",
 | 
					    "unplugin-icons": "^0.17.0",
 | 
				
			||||||
    "unplugin-vue-components": "^0.25.0",
 | 
					    "unplugin-vue-components": "^0.25.0",
 | 
				
			||||||
    "vite": "^4.4.9",
 | 
					    "vite": "^4.4.9",
 | 
				
			||||||
 | 
					    "vite-plugin-node-polyfills": "^0.21.0",
 | 
				
			||||||
    "vite-plugin-pwa": "^0.16.0",
 | 
					    "vite-plugin-pwa": "^0.16.0",
 | 
				
			||||||
    "vite-plugin-vue-markdown": "^0.23.5",
 | 
					    "vite-plugin-vue-markdown": "^0.23.5",
 | 
				
			||||||
    "vite-svg-loader": "^4.0.0",
 | 
					    "vite-svg-loader": "^4.0.0",
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										637
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										637
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -16,6 +16,7 @@ const props = withDefaults(
 | 
				
			|||||||
    language?: string
 | 
					    language?: string
 | 
				
			||||||
    copyPlacement?: 'top-right' | 'bottom-right' | 'outside' | 'none'
 | 
					    copyPlacement?: 'top-right' | 'bottom-right' | 'outside' | 'none'
 | 
				
			||||||
    copyMessage?: string
 | 
					    copyMessage?: string
 | 
				
			||||||
 | 
					    wordWrap?: boolean
 | 
				
			||||||
  }>(),
 | 
					  }>(),
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    followHeightOf: null,
 | 
					    followHeightOf: null,
 | 
				
			||||||
@ -47,7 +48,7 @@ const tooltipText = computed(() => isJustCopied.value ? 'Copied!' : copyMessage.
 | 
				
			|||||||
        :style="height ? `min-height: ${height - 40 /* card padding */ + 10 /* negative margin compensation */}px` : ''"
 | 
					        :style="height ? `min-height: ${height - 40 /* card padding */ + 10 /* negative margin compensation */}px` : ''"
 | 
				
			||||||
      >
 | 
					      >
 | 
				
			||||||
        <n-config-provider :hljs="hljs">
 | 
					        <n-config-provider :hljs="hljs">
 | 
				
			||||||
          <n-code :code="value" :language="language" :trim="false" data-test-id="area-content" />
 | 
					          <n-code :code="value" :language="language" :word-wrap="wordWrap" :trim="false" data-test-id="area-content" />
 | 
				
			||||||
        </n-config-provider>
 | 
					        </n-config-provider>
 | 
				
			||||||
      </n-scrollbar>
 | 
					      </n-scrollbar>
 | 
				
			||||||
      <div absolute right-10px top-10px>
 | 
					      <div absolute right-10px top-10px>
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					import sshpk from 'sshpk';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { generateKeyPair };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function generateKeyPair(config: {
 | 
				
			||||||
 | 
					  password?: string
 | 
				
			||||||
 | 
					  format?: sshpk.PrivateKeyFormatType
 | 
				
			||||||
 | 
					  comment?: string
 | 
				
			||||||
 | 
					} = {}) {
 | 
				
			||||||
 | 
					  const privKey = sshpk.generatePrivateKey('ed25519');
 | 
				
			||||||
 | 
					  privKey.comment = config?.comment;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const pubFormat = config.format ?? 'ssh';
 | 
				
			||||||
 | 
					  let privFormat: sshpk.PrivateKeyFormatType = config.format ?? 'ssh';
 | 
				
			||||||
 | 
					  if (privFormat === 'ssh') {
 | 
				
			||||||
 | 
					    privFormat = 'ssh-private';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  const pubKey = privKey.toPublic();
 | 
				
			||||||
 | 
					  return {
 | 
				
			||||||
 | 
					    publicKey: pubKey.toString(pubFormat),
 | 
				
			||||||
 | 
					    privateKey: config?.password
 | 
				
			||||||
 | 
					      ? privKey.toString(privFormat,
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          passphrase: config?.password,
 | 
				
			||||||
 | 
					          comment: config?.comment,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					      : privKey.toString(privFormat, { comment: config?.comment }),
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,80 @@
 | 
				
			|||||||
 | 
					<script setup lang="ts">
 | 
				
			||||||
 | 
					import type sshpk from 'sshpk';
 | 
				
			||||||
 | 
					import { generateKeyPair } from './ed25519-key-pair-generator.service';
 | 
				
			||||||
 | 
					import TextareaCopyable from '@/components/TextareaCopyable.vue';
 | 
				
			||||||
 | 
					import { withDefaultOnErrorAsync } from '@/utils/defaults';
 | 
				
			||||||
 | 
					import { computedRefreshableAsync } from '@/composable/computedRefreshable';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const password = ref('');
 | 
				
			||||||
 | 
					const comment = ref('');
 | 
				
			||||||
 | 
					const emptyCerts = { publicKey: '', privateKey: '' };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const format = useStorage('ed25519-key-pair-generator:format', 'ssh');
 | 
				
			||||||
 | 
					const formatOptions = [
 | 
				
			||||||
 | 
					  { value: 'pem', label: 'PEM' },
 | 
				
			||||||
 | 
					  { value: 'pkcs8', label: 'PKCS#8' },
 | 
				
			||||||
 | 
					  { value: 'ssh', label: 'OpenSSH Standard' },
 | 
				
			||||||
 | 
					  { value: 'openssh', label: 'OpenSSH New' },
 | 
				
			||||||
 | 
					  { value: 'putty', label: 'PuTTY' },
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const supportsPassphrase = computed(() => format.value === 'ssh');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const [certs, refreshCerts] = computedRefreshableAsync(
 | 
				
			||||||
 | 
					  () => withDefaultOnErrorAsync(() => generateKeyPair(
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      password: password.value,
 | 
				
			||||||
 | 
					      format: format.value as sshpk.PrivateKeyFormatType,
 | 
				
			||||||
 | 
					      comment: comment.value,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  ), emptyCerts),
 | 
				
			||||||
 | 
					  emptyCerts,
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div>
 | 
				
			||||||
 | 
					    <n-space mb-2>
 | 
				
			||||||
 | 
					      <c-select
 | 
				
			||||||
 | 
					        v-model:value="format"
 | 
				
			||||||
 | 
					        label-position="left"
 | 
				
			||||||
 | 
					        label="Format:"
 | 
				
			||||||
 | 
					        :options="formatOptions"
 | 
				
			||||||
 | 
					        placeholder="Select a key format"
 | 
				
			||||||
 | 
					      />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <n-form-item v-if="supportsPassphrase" label="Passphrase :" label-placement="left">
 | 
				
			||||||
 | 
					        <n-input
 | 
				
			||||||
 | 
					          v-model:value="password"
 | 
				
			||||||
 | 
					          type="password"
 | 
				
			||||||
 | 
					          show-password-on="mousedown"
 | 
				
			||||||
 | 
					          placeholder="Passphrase"
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					      </n-form-item>
 | 
				
			||||||
 | 
					    </n-space>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <n-space mb-2>
 | 
				
			||||||
 | 
					      <n-form-item label="Comment :" label-placement="left">
 | 
				
			||||||
 | 
					        <n-input
 | 
				
			||||||
 | 
					          v-model:value="comment"
 | 
				
			||||||
 | 
					          type="text"
 | 
				
			||||||
 | 
					          placeholder="Comment"
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					      </n-form-item>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <c-button @click="refreshCerts">
 | 
				
			||||||
 | 
					        Refresh key-pair
 | 
				
			||||||
 | 
					      </c-button>
 | 
				
			||||||
 | 
					    </n-space>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div>
 | 
				
			||||||
 | 
					      <h3>Public key</h3>
 | 
				
			||||||
 | 
					      <TextareaCopyable :value="certs.publicKey" :word-wrap="true" />
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div>
 | 
				
			||||||
 | 
					      <h3>Private key</h3>
 | 
				
			||||||
 | 
					      <TextareaCopyable :value="certs.privateKey" />
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
							
								
								
									
										12
									
								
								src/tools/ed25519-key-pair-generator/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/tools/ed25519-key-pair-generator/index.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					import { Certificate } from '@vicons/tabler';
 | 
				
			||||||
 | 
					import { defineTool } from '../tool';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const tool = defineTool({
 | 
				
			||||||
 | 
					  name: 'Ed25519 key pair generator',
 | 
				
			||||||
 | 
					  path: '/ed25519-key-pair-generator',
 | 
				
			||||||
 | 
					  description: 'Generate new random Ed25519 private and public keys (with or without passphrase).',
 | 
				
			||||||
 | 
					  keywords: ['ed25519', 'key', 'pair', 'generator', 'public', 'private', 'secret', 'ssh', 'pem', 'passphrase', 'password'],
 | 
				
			||||||
 | 
					  component: () => import('./ed25519-key-pair-generator.vue'),
 | 
				
			||||||
 | 
					  icon: Certificate,
 | 
				
			||||||
 | 
					  createdAt: new Date('2024-02-14'),
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
@ -2,6 +2,7 @@ import { tool as base64FileConverter } from './base64-file-converter';
 | 
				
			|||||||
import { tool as base64StringConverter } from './base64-string-converter';
 | 
					import { tool as base64StringConverter } from './base64-string-converter';
 | 
				
			||||||
import { tool as basicAuthGenerator } from './basic-auth-generator';
 | 
					import { tool as basicAuthGenerator } from './basic-auth-generator';
 | 
				
			||||||
import { tool as textToUnicode } from './text-to-unicode';
 | 
					import { tool as textToUnicode } from './text-to-unicode';
 | 
				
			||||||
 | 
					import { tool as ed25519KeyPairGenerator } from './ed25519-key-pair-generator';
 | 
				
			||||||
import { tool as pdfSignatureChecker } from './pdf-signature-checker';
 | 
					import { tool as pdfSignatureChecker } from './pdf-signature-checker';
 | 
				
			||||||
import { tool as numeronymGenerator } from './numeronym-generator';
 | 
					import { tool as numeronymGenerator } from './numeronym-generator';
 | 
				
			||||||
import { tool as macAddressGenerator } from './mac-address-generator';
 | 
					import { tool as macAddressGenerator } from './mac-address-generator';
 | 
				
			||||||
@ -81,7 +82,20 @@ import { tool as yamlViewer } from './yaml-viewer';
 | 
				
			|||||||
export const toolsByCategory: ToolCategory[] = [
 | 
					export const toolsByCategory: ToolCategory[] = [
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    name: 'Crypto',
 | 
					    name: 'Crypto',
 | 
				
			||||||
    components: [tokenGenerator, hashText, bcrypt, uuidGenerator, ulidGenerator, cypher, bip39, hmacGenerator, rsaKeyPairGenerator, passwordStrengthAnalyser, pdfSignatureChecker],
 | 
					    components: [
 | 
				
			||||||
 | 
					      tokenGenerator,
 | 
				
			||||||
 | 
					      hashText,
 | 
				
			||||||
 | 
					      bcrypt,
 | 
				
			||||||
 | 
					      uuidGenerator,
 | 
				
			||||||
 | 
					      ulidGenerator,
 | 
				
			||||||
 | 
					      cypher,
 | 
				
			||||||
 | 
					      bip39,
 | 
				
			||||||
 | 
					      hmacGenerator,
 | 
				
			||||||
 | 
					      rsaKeyPairGenerator,
 | 
				
			||||||
 | 
					      ed25519KeyPairGenerator,
 | 
				
			||||||
 | 
					      passwordStrengthAnalyser,
 | 
				
			||||||
 | 
					      pdfSignatureChecker,
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    name: 'Converter',
 | 
					    name: 'Converter',
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,6 @@
 | 
				
			|||||||
import { resolve } from 'node:path';
 | 
					import { resolve } from 'node:path';
 | 
				
			||||||
import { URL, fileURLToPath } from 'node:url';
 | 
					import { URL, fileURLToPath } from 'node:url';
 | 
				
			||||||
 | 
					import { nodePolyfills } from 'vite-plugin-node-polyfills';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import VueI18n from '@intlify/unplugin-vue-i18n/vite';
 | 
					import VueI18n from '@intlify/unplugin-vue-i18n/vite';
 | 
				
			||||||
import vue from '@vitejs/plugin-vue';
 | 
					import vue from '@vitejs/plugin-vue';
 | 
				
			||||||
@ -97,6 +98,7 @@ export default defineConfig({
 | 
				
			|||||||
      resolvers: [NaiveUiResolver(), IconsResolver({ prefix: 'icon' })],
 | 
					      resolvers: [NaiveUiResolver(), IconsResolver({ prefix: 'icon' })],
 | 
				
			||||||
    }),
 | 
					    }),
 | 
				
			||||||
    Unocss(),
 | 
					    Unocss(),
 | 
				
			||||||
 | 
					    nodePolyfills(),
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  base: baseUrl,
 | 
					  base: baseUrl,
 | 
				
			||||||
  resolve: {
 | 
					  resolve: {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user