Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
94698cea50 | ||
|
|
8294cd68da | ||
|
|
7c9b8ac178 | ||
|
|
5d8f46abf8 | ||
|
|
35a3760771 | ||
|
|
4ef25887b9 | ||
|
|
7f229959d6 | ||
|
|
d3a2936979 | ||
|
|
5f16885923 | ||
|
|
ea5e7a7fc7 | ||
|
|
7de6c86f9e | ||
|
|
83da6b7ee9 | ||
|
|
737319edf1 |
23
CHANGELOG.md
23
CHANGELOG.md
@@ -2,6 +2,29 @@
|
||||
|
||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||
|
||||
## [2.13.0](https://github.com/CorentinTh/it-tools/compare/v2.11.0...v2.13.0) (2022-11-14)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **config:** added tsx to allowed extension ([ea5e7a7](https://github.com/CorentinTh/it-tools/commit/ea5e7a7fc7df1a3a912193912a6ab80a8a36a256))
|
||||
* **date-converter:** added mongodb objectID format ([4ef2588](https://github.com/CorentinTh/it-tools/commit/4ef25887b9d874b8789bf8dbabd8aab92b4b1b03))
|
||||
* **new-tool:** added otp generator ([5f16885](https://github.com/CorentinTh/it-tools/commit/5f168859238e9c3a8b8bbaf6b550c4b9bd163e00))
|
||||
* **new-tool:** mime type to extension converter ([7c9b8ac](https://github.com/CorentinTh/it-tools/commit/7c9b8ac178967151a4f921ac26e8c2fe8d23b886))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **ui:** remove icon transparency overlap ([35a3760](https://github.com/CorentinTh/it-tools/commit/35a376077116dd65b21f9a0786d2ecfc14db6051))
|
||||
|
||||
|
||||
### Refactors
|
||||
|
||||
* **otp-generator:** changed url ([7f22995](https://github.com/CorentinTh/it-tools/commit/7f229959d64b7a932f32753e3838d87a819a9192))
|
||||
* token generator can use a custom alphabet ([83da6b7](https://github.com/CorentinTh/it-tools/commit/83da6b7ee9db29e40faf288f9627257aa7124038))
|
||||
* **ui:** change sponsor button location and caption ([5d8f46a](https://github.com/CorentinTh/it-tools/commit/5d8f46abf8d5a10cc4650efc87b12a9a6c537fe5))
|
||||
* **useQRCode:** switched args to MaybeRef ([7de6c86](https://github.com/CorentinTh/it-tools/commit/7de6c86f9ead8d7315614cc508dfee4fed90e9c2))
|
||||
|
||||
## [2.12.0](https://github.com/CorentinTh/it-tools/compare/v2.10.3...v2.12.0) (2022-08-23)
|
||||
|
||||
|
||||
|
||||
34
package.json
34
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "it-tools",
|
||||
"version": "2.12.0",
|
||||
"version": "2.13.0",
|
||||
"description": "Collection of handy online tools for developers, with great UX. ",
|
||||
"keywords": [
|
||||
"productivity",
|
||||
@@ -36,52 +36,52 @@
|
||||
"@vicons/material": "^0.12.0",
|
||||
"@vicons/tabler": "^0.12.0",
|
||||
"@vueuse/core": "^8.9.4",
|
||||
"@vueuse/head": "^0.7.9",
|
||||
"@vueuse/head": "^0.7.13",
|
||||
"bcryptjs": "^2.4.3",
|
||||
"change-case": "^4.1.2",
|
||||
"colord": "^2.9.3",
|
||||
"cron-validator": "^1.3.1",
|
||||
"cronstrue": "^2.11.0",
|
||||
"cronstrue": "^2.15.0",
|
||||
"crypto-js": "^4.1.1",
|
||||
"date-fns": "^2.29.1",
|
||||
"date-fns": "^2.29.3",
|
||||
"figue": "^1.2.0",
|
||||
"highlight.js": "^11.6.0",
|
||||
"json5": "^2.2.1",
|
||||
"lodash": "^4.17.21",
|
||||
"mathjs": "^10.6.4",
|
||||
"mime-types": "^2.1.35",
|
||||
"naive-ui": "^2.32.1",
|
||||
"pinia": "^2.0.18",
|
||||
"naive-ui": "^2.33.5",
|
||||
"pinia": "^2.0.23",
|
||||
"plausible-tracker": "^0.3.8",
|
||||
"qrcode": "^1.5.1",
|
||||
"randombytes": "^2.1.0",
|
||||
"sql-formatter": "^8.2.0",
|
||||
"uuid": "^8.3.2",
|
||||
"vue": "^3.2.37",
|
||||
"vue-router": "^4.1.3"
|
||||
"vue": "^3.2.45",
|
||||
"vue-router": "^4.1.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@rushstack/eslint-patch": "^1.1.4",
|
||||
"@rushstack/eslint-patch": "^1.2.0",
|
||||
"@types/bcryptjs": "^2.4.2",
|
||||
"@types/crypto-js": "^4.1.1",
|
||||
"@types/jsdom": "^16.2.15",
|
||||
"@types/lodash": "^4.14.183",
|
||||
"@types/lodash": "^4.14.188",
|
||||
"@types/mime-types": "^2.1.1",
|
||||
"@types/node": "^16.11.49",
|
||||
"@types/qrcode": "^1.4.3",
|
||||
"@types/node": "^16.18.3",
|
||||
"@types/qrcode": "^1.5.0",
|
||||
"@types/randombytes": "^2.0.0",
|
||||
"@types/uuid": "^8.3.4",
|
||||
"@typescript-eslint/parser": "^5.33.1",
|
||||
"@typescript-eslint/parser": "^5.42.1",
|
||||
"@vitejs/plugin-vue": "^2.3.4",
|
||||
"@vitejs/plugin-vue-jsx": "^1.3.10",
|
||||
"@vue/eslint-config-prettier": "^7.0.0",
|
||||
"@vue/eslint-config-typescript": "^10.0.0",
|
||||
"@vue/test-utils": "^2.0.2",
|
||||
"@vue/test-utils": "^2.2.2",
|
||||
"@vue/tsconfig": "^0.1.3",
|
||||
"c8": "^7.12.0",
|
||||
"eslint": "^8.22.0",
|
||||
"eslint": "^8.27.0",
|
||||
"eslint-config-prettier": "^8.5.0",
|
||||
"eslint-import-resolver-typescript": "^3.4.2",
|
||||
"eslint-import-resolver-typescript": "^3.5.2",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-plugin-vue": "^8.7.1",
|
||||
"jsdom": "^19.0.0",
|
||||
@@ -93,7 +93,7 @@
|
||||
"vite": "^2.9.15",
|
||||
"vite-plugin-md": "^0.12.4",
|
||||
"vite-plugin-pwa": "^0.11.13",
|
||||
"vite-svg-loader": "^3.4.0",
|
||||
"vite-svg-loader": "^3.6.0",
|
||||
"vitest": "^0.13.1",
|
||||
"vue-tsc": "^0.31.4",
|
||||
"workbox-window": "^6.5.4"
|
||||
|
||||
2190
pnpm-lock.yaml
generated
2190
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -49,7 +49,8 @@ a {
|
||||
}
|
||||
|
||||
.icon {
|
||||
opacity: 0.7;
|
||||
opacity: 0.6;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.title {
|
||||
@@ -57,7 +58,8 @@ a {
|
||||
}
|
||||
|
||||
.description {
|
||||
opacity: 0.7;
|
||||
opacity: 0.6;
|
||||
color: #ffffff;
|
||||
margin: 5px 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -134,23 +134,24 @@ const menuOptions: MenuGroupOption[] = toolsByCategory.map((category) => ({
|
||||
|
||||
<search-bar />
|
||||
|
||||
<navbar-buttons v-if="!styleStore.isSmallScreen" />
|
||||
|
||||
<n-tooltip trigger="hover">
|
||||
<template #trigger>
|
||||
<n-button
|
||||
round
|
||||
type="primary"
|
||||
tag="a"
|
||||
href="https://github.com/sponsors/CorentinTh"
|
||||
rel="noopener"
|
||||
target="_blank"
|
||||
>
|
||||
<n-icon v-if="!styleStore.isSmallScreen" :component="Heart" style="margin-right: 5px" />
|
||||
Sponsor
|
||||
Buy me a coffee
|
||||
<n-icon v-if="!styleStore.isSmallScreen" :component="Heart" style="margin-left: 5px" />
|
||||
</n-button>
|
||||
</template>
|
||||
❤ Support IT Tools development !
|
||||
</n-tooltip>
|
||||
|
||||
<navbar-buttons v-if="!styleStore.isSmallScreen" />
|
||||
</div>
|
||||
<slot />
|
||||
</template>
|
||||
|
||||
@@ -30,4 +30,9 @@ export const darkThemeOverrides: GlobalThemeOverrides = {
|
||||
color: '#1e1e1e',
|
||||
borderColor: 'transparent',
|
||||
},
|
||||
|
||||
Table: {
|
||||
tdColor: '#1e1e1e',
|
||||
thColor: '#353535',
|
||||
},
|
||||
};
|
||||
|
||||
@@ -132,5 +132,10 @@ const formats: Format[] = [
|
||||
fromDate: (date) => date.toUTCString(),
|
||||
toDate,
|
||||
},
|
||||
{
|
||||
name: 'Mongo ObjectID',
|
||||
fromDate: (date) => Math.floor(date.getTime() / 1000).toString(16) + '0000000000000000',
|
||||
toDate: (objectId) => new Date(parseInt(objectId.substring(0, 8), 16) * 1000),
|
||||
},
|
||||
];
|
||||
</script>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { LockOpen } from '@vicons/tabler';
|
||||
import type { ToolCategory } from './tool';
|
||||
|
||||
import { tool as mimeTypes } from './mime-types';
|
||||
import { tool as otpCodeGeneratorAndValidator } from './otp-code-generator-and-validator';
|
||||
import { tool as base64FileConverter } from './base64-file-converter';
|
||||
import { tool as base64StringConverter } from './base64-string-converter';
|
||||
@@ -65,6 +66,7 @@ export const toolsByCategory: ToolCategory[] = [
|
||||
basicAuthGenerator,
|
||||
metaTagGenerator,
|
||||
otpCodeGeneratorAndValidator,
|
||||
mimeTypes,
|
||||
],
|
||||
},
|
||||
{
|
||||
|
||||
11
src/tools/mime-types/index.ts
Normal file
11
src/tools/mime-types/index.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import { World } from '@vicons/tabler';
|
||||
import { defineTool } from '../tool';
|
||||
|
||||
export const tool = defineTool({
|
||||
name: 'Mime types',
|
||||
path: '/mime-types',
|
||||
description: 'Convert mime types to extensions and vice-versa.',
|
||||
keywords: ['mime', 'types', 'extension', 'content', 'type'],
|
||||
component: () => import('./mime-types.vue'),
|
||||
icon: World,
|
||||
});
|
||||
99
src/tools/mime-types/mime-types.vue
Normal file
99
src/tools/mime-types/mime-types.vue
Normal file
@@ -0,0 +1,99 @@
|
||||
<template>
|
||||
<n-card>
|
||||
<n-h2 style="margin-bottom: 0">Mime type to extension</n-h2>
|
||||
<div style="opacity: 0.8">Now witch file extensions are associated to a mime-type</div>
|
||||
<n-form-item>
|
||||
<n-select
|
||||
v-model:value="selectedMimeType"
|
||||
filterable
|
||||
:options="mimeToExtensionsOptions"
|
||||
size="large"
|
||||
placeholder="Select your mimetype here... (ex: application/pdf)"
|
||||
/>
|
||||
</n-form-item>
|
||||
|
||||
<div v-if="extensionsFound.length > 0">
|
||||
Extensions of files with the <n-tag round :bordered="false">{{ selectedMimeType }}</n-tag> mime-type:
|
||||
<div style="margin-top: 10px">
|
||||
<n-tag
|
||||
v-for="extension of extensionsFound"
|
||||
:key="extension"
|
||||
round
|
||||
:bordered="false"
|
||||
type="primary"
|
||||
style="margin-right: 10px"
|
||||
>
|
||||
.{{ extension }}
|
||||
</n-tag>
|
||||
</div>
|
||||
</div>
|
||||
</n-card>
|
||||
|
||||
<n-card>
|
||||
<n-h2 style="margin-bottom: 0">File extension to mime type</n-h2>
|
||||
<div style="opacity: 0.8">Now witch mime type is associated to a file extension</div>
|
||||
<n-form-item>
|
||||
<n-select
|
||||
v-model:value="selectedExtension"
|
||||
filterable
|
||||
:options="extensionToMimeTypeOptions"
|
||||
size="large"
|
||||
placeholder="Select your mimetype here... (ex: application/pdf)"
|
||||
/>
|
||||
</n-form-item>
|
||||
|
||||
<div v-if="selectedExtension">
|
||||
Mime type associated to the extension <n-tag round :bordered="false">{{ selectedExtension }}</n-tag> file
|
||||
extension:
|
||||
<div style="margin-top: 10px">
|
||||
<n-tag round :bordered="false" type="primary" style="margin-right: 10px">
|
||||
{{ mimeTypeFound }}
|
||||
</n-tag>
|
||||
</div>
|
||||
</div>
|
||||
</n-card>
|
||||
|
||||
<div>
|
||||
<n-table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Mime types</th>
|
||||
<th>Extensions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="{ mimeType, extensions } of mimeInfos" :key="mimeType">
|
||||
<td>{{ mimeType }}</td>
|
||||
<td>
|
||||
<n-tag v-for="extension of extensions" :key="extension" round :bordered="false" style="margin-right: 10px">
|
||||
.{{ extension }}
|
||||
</n-tag>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</n-table>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { types as extensionToMimeType, extensions as mimeTypeToExtension } from 'mime-types';
|
||||
import { computed, ref } from 'vue';
|
||||
|
||||
const mimeInfos = Object.entries(mimeTypeToExtension).map(([mimeType, extensions]) => ({ mimeType, extensions }));
|
||||
|
||||
const mimeToExtensionsOptions = Object.keys(mimeTypeToExtension).map((label) => ({ label, value: label }));
|
||||
const selectedMimeType = ref(undefined);
|
||||
|
||||
const extensionsFound = computed(() => (selectedMimeType.value ? mimeTypeToExtension[selectedMimeType.value] : []));
|
||||
|
||||
const extensionToMimeTypeOptions = Object.keys(extensionToMimeType).map((label) => {
|
||||
const extension = `.${label}`;
|
||||
|
||||
return { label: extension, value: label };
|
||||
});
|
||||
const selectedExtension = ref(undefined);
|
||||
|
||||
const mimeTypeFound = computed(() => (selectedExtension.value ? extensionToMimeType[selectedExtension.value] : []));
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped></style>
|
||||
@@ -3,7 +3,7 @@ import { defineTool } from '../tool';
|
||||
|
||||
export const tool = defineTool({
|
||||
name: 'OTP code generator',
|
||||
path: '/otp-code-generator-and-validator',
|
||||
path: '/otp-generator',
|
||||
description: 'Generate and validate time-based OTP (one time password) for multi-factor authentication.',
|
||||
keywords: [
|
||||
'otp',
|
||||
|
||||
Reference in New Issue
Block a user