feat(tools): add category to various tools for better organization
This commit is contained in:
		
							parent
							
								
									06422fba4a
								
							
						
					
					
						commit
						5c335c556d
					
				
							
								
								
									
										10
									
								
								components.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								components.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -131,17 +131,27 @@ declare module '@vue/runtime-core' { | ||||
|     MimeTypes: typeof import('./src/tools/mime-types/mime-types.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'] | ||||
|     NDivider: typeof import('naive-ui')['NDivider'] | ||||
|     NEllipsis: typeof import('naive-ui')['NEllipsis'] | ||||
|     NFormItem: typeof import('naive-ui')['NFormItem'] | ||||
|     NGi: typeof import('naive-ui')['NGi'] | ||||
|     NGrid: typeof import('naive-ui')['NGrid'] | ||||
|     NH1: typeof import('naive-ui')['NH1'] | ||||
|     NH3: typeof import('naive-ui')['NH3'] | ||||
|     NIcon: typeof import('naive-ui')['NIcon'] | ||||
|     NInputNumber: typeof import('naive-ui')['NInputNumber'] | ||||
|     NLayout: typeof import('naive-ui')['NLayout'] | ||||
|     NLayoutSider: typeof import('naive-ui')['NLayoutSider'] | ||||
|     NMenu: typeof import('naive-ui')['NMenu'] | ||||
|     NScrollbar: typeof import('naive-ui')['NScrollbar'] | ||||
|     NSlider: typeof import('naive-ui')['NSlider'] | ||||
|     NSpace: typeof import('naive-ui')['NSpace'] | ||||
|     NSpin: typeof import('naive-ui')['NSpin'] | ||||
|     NSwitch: typeof import('naive-ui')['NSwitch'] | ||||
|     NTable: typeof import('naive-ui')['NTable'] | ||||
|     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'] | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./ascii-text-drawer.vue'), | ||||
|   icon: Artboard, | ||||
|   createdAt: new Date('2024-03-03'), | ||||
|   category: 'Text', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['base64', 'converter', 'upload', 'image', 'file', 'conversion', 'web', 'data', 'format'], | ||||
|   component: () => import('./base64-file-converter.vue'), | ||||
|   icon: FileDigit, | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./base64-string-converter.vue'), | ||||
|   icon: FileDigit, | ||||
|   redirectFrom: ['/file-to-base64', '/base64-converter'], | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -19,4 +19,5 @@ export const tool = defineTool({ | ||||
|   ], | ||||
|   component: () => import('./basic-auth-generator.vue'), | ||||
|   icon: PasswordRound, | ||||
|   category: 'Web', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['bcrypt', 'hash', 'compare', 'password', 'salt', 'round', 'storage', 'crypto'], | ||||
|   component: () => import('./bcrypt.vue'), | ||||
|   icon: LockSquare, | ||||
|   category: 'Crypto', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./benchmark-builder.vue'), | ||||
|   icon: SpeedFilled, | ||||
|   createdAt: new Date('2023-04-05'), | ||||
|   category: 'Measurement', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['BIP39', 'passphrase', 'generator', 'mnemonic', 'entropy'], | ||||
|   component: () => import('./bip39-generator.vue'), | ||||
|   icon: AlignJustified, | ||||
|   category: 'Crypto', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./camera-recorder.vue'), | ||||
|   icon: Camera, | ||||
|   createdAt: new Date('2023-05-15'), | ||||
|   category: 'Images and videos', | ||||
| }); | ||||
|  | ||||
| @ -23,4 +23,5 @@ export const tool = defineTool({ | ||||
|   ], | ||||
|   component: () => import('./case-converter.vue'), | ||||
|   icon: LetterCaseToggle, | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -20,4 +20,5 @@ export const tool = defineTool({ | ||||
|   ], | ||||
|   component: () => import('./chmod-calculator.vue'), | ||||
|   icon: FileInvoice, | ||||
|   category: 'Development', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['chronometer', 'time', 'lap', 'duration', 'measure', 'pause', 'resume', 'stopwatch'], | ||||
|   component: () => import('./chronometer.vue'), | ||||
|   icon: TimerOutlined, | ||||
|   category: 'Measurement', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./color-converter.vue'), | ||||
|   icon: Palette, | ||||
|   redirectFrom: ['/color-picker-converter'], | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -23,4 +23,5 @@ export const tool = defineTool({ | ||||
|   ], | ||||
|   component: () => import('./crontab-generator.vue'), | ||||
|   icon: Alarm, | ||||
|   category: 'Development', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['date', 'time', 'converter', 'iso', 'utc', 'timezone', 'year', 'month', 'day', 'minute', 'seconde'], | ||||
|   component: () => import('./date-time-converter.vue'), | ||||
|   icon: Calendar, | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -21,4 +21,5 @@ export const tool = defineTool({ | ||||
|   ], | ||||
|   component: () => import('./device-information.vue'), | ||||
|   icon: DeviceDesktop, | ||||
|   category: 'Web', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['docker', 'run', 'compose', 'yaml', 'yml', 'convert', 'deamon'], | ||||
|   component: () => import('./docker-run-to-docker-compose-converter.vue'), | ||||
|   icon: BrandDocker, | ||||
|   category: 'Development', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./email-normalizer.vue'), | ||||
|   icon: Mail, | ||||
|   createdAt: new Date('2024-08-15'), | ||||
|   category: 'Development', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./emoji-picker.vue'), | ||||
|   icon: MoodSmile, | ||||
|   createdAt: new Date('2023-08-07'), | ||||
|   category: 'Text', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./encryption.vue'), | ||||
|   icon: Lock, | ||||
|   redirectFrom: ['/cypher'], | ||||
|   category: 'Crypto', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['eta', 'calculator', 'estimated', 'time', 'arrival', 'average'], | ||||
|   component: () => import('./eta-calculator.vue'), | ||||
|   icon: Hourglass, | ||||
|   category: 'Math', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['git', 'push', 'force', 'pull', 'commit', 'amend', 'rebase', 'merge', 'reset', 'soft', 'hard', 'lease'], | ||||
|   component: () => import('./git-memo.vue'), | ||||
|   icon: BrandGit, | ||||
|   category: 'Development', | ||||
| }); | ||||
|  | ||||
| @ -24,4 +24,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./hash-text.vue'), | ||||
|   icon: EyeOff, | ||||
|   redirectFrom: ['/hash'], | ||||
|   category: 'Crypto', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['hmac', 'generator', 'MD5', 'SHA1', 'SHA256', 'SHA224', 'SHA512', 'SHA384', 'SHA3', 'RIPEMD160'], | ||||
|   component: () => import('./hmac-generator.vue'), | ||||
|   icon: ShortTextRound, | ||||
|   category: 'Crypto', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['html', 'entities', 'escape', 'unescape', 'special', 'characters', 'tags'], | ||||
|   component: () => import('./html-entities.vue'), | ||||
|   icon: Code, | ||||
|   category: 'Web', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['html', 'wysiwyg', 'editor', 'p', 'ul', 'ol', 'converter', 'live'], | ||||
|   component: () => import('./html-wysiwyg-editor.vue'), | ||||
|   icon: Edit, | ||||
|   category: 'Web', | ||||
| }); | ||||
|  | ||||
| @ -17,4 +17,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./http-status-codes.vue'), | ||||
|   icon: HttpRound, | ||||
|   createdAt: new Date('2023-04-13'), | ||||
|   category: 'Web', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./iban-validator-and-parser.vue'), | ||||
|   icon: Bank, | ||||
|   createdAt: new Date('2023-08-26'), | ||||
|   category: 'Data', | ||||
| }); | ||||
|  | ||||
| @ -1,196 +1,19 @@ | ||||
| import { tool as base64FileConverter } from './base64-file-converter'; | ||||
| import { tool as base64StringConverter } from './base64-string-converter'; | ||||
| import { tool as basicAuthGenerator } from './basic-auth-generator'; | ||||
| import { tool as emailNormalizer } from './email-normalizer'; | ||||
| import type { ToolCategory, ToolWithCategory } from './tools.types'; | ||||
| 
 | ||||
| import { tool as asciiTextDrawer } from './ascii-text-drawer'; | ||||
| const modules = import.meta.glob<true, string, ToolWithCategory>('./*/index.ts', { eager: true, import: 'tool' }); | ||||
| 
 | ||||
| import { tool as textToUnicode } from './text-to-unicode'; | ||||
| import { tool as safelinkDecoder } from './safelink-decoder'; | ||||
| import { tool as xmlToJson } from './xml-to-json'; | ||||
| import { tool as jsonToXml } from './json-to-xml'; | ||||
| import { tool as regexTester } from './regex-tester'; | ||||
| import { tool as regexMemo } from './regex-memo'; | ||||
| import { tool as markdownToHtml } from './markdown-to-html'; | ||||
| import { tool as pdfSignatureChecker } from './pdf-signature-checker'; | ||||
| import { tool as numeronymGenerator } from './numeronym-generator'; | ||||
| import { tool as macAddressGenerator } from './mac-address-generator'; | ||||
| import { tool as textToBinary } from './text-to-binary'; | ||||
| import { tool as ulidGenerator } from './ulid-generator'; | ||||
| import { tool as ibanValidatorAndParser } from './iban-validator-and-parser'; | ||||
| import { tool as stringObfuscator } from './string-obfuscator'; | ||||
| import { tool as textDiff } from './text-diff'; | ||||
| import { tool as emojiPicker } from './emoji-picker'; | ||||
| import { tool as passwordStrengthAnalyser } from './password-strength-analyser'; | ||||
| import { tool as yamlToToml } from './yaml-to-toml'; | ||||
| import { tool as jsonToToml } from './json-to-toml'; | ||||
| import { tool as tomlToYaml } from './toml-to-yaml'; | ||||
| import { tool as tomlToJson } from './toml-to-json'; | ||||
| import { tool as jsonToCsv } from './json-to-csv'; | ||||
| import { tool as cameraRecorder } from './camera-recorder'; | ||||
| import { tool as listConverter } from './list-converter'; | ||||
| import { tool as phoneParserAndFormatter } from './phone-parser-and-formatter'; | ||||
| import { tool as jsonDiff } from './json-diff'; | ||||
| import { tool as ipv4RangeExpander } from './ipv4-range-expander'; | ||||
| import { tool as httpStatusCodes } from './http-status-codes'; | ||||
| import { tool as yamlToJson } from './yaml-to-json-converter'; | ||||
| import { tool as jsonToYaml } from './json-to-yaml-converter'; | ||||
| import { tool as ipv6UlaGenerator } from './ipv6-ula-generator'; | ||||
| import { tool as ipv4AddressConverter } from './ipv4-address-converter'; | ||||
| import { tool as benchmarkBuilder } from './benchmark-builder'; | ||||
| import { tool as userAgentParser } from './user-agent-parser'; | ||||
| import { tool as ipv4SubnetCalculator } from './ipv4-subnet-calculator'; | ||||
| import { tool as dockerRunToDockerComposeConverter } from './docker-run-to-docker-compose-converter'; | ||||
| import { tool as htmlWysiwygEditor } from './html-wysiwyg-editor'; | ||||
| import { tool as rsaKeyPairGenerator } from './rsa-key-pair-generator'; | ||||
| import { tool as textToNatoAlphabet } from './text-to-nato-alphabet'; | ||||
| import { tool as slugifyString } from './slugify-string'; | ||||
| import { tool as keycodeInfo } from './keycode-info'; | ||||
| import { tool as jsonMinify } from './json-minify'; | ||||
| import { tool as bcrypt } from './bcrypt'; | ||||
| import { tool as bip39 } from './bip39-generator'; | ||||
| import { tool as caseConverter } from './case-converter'; | ||||
| import { tool as chmodCalculator } from './chmod-calculator'; | ||||
| import { tool as chronometer } from './chronometer'; | ||||
| import { tool as colorConverter } from './color-converter'; | ||||
| import { tool as crontabGenerator } from './crontab-generator'; | ||||
| import { tool as dateTimeConverter } from './date-time-converter'; | ||||
| import { tool as deviceInformation } from './device-information'; | ||||
| import { tool as cypher } from './encryption'; | ||||
| import { tool as etaCalculator } from './eta-calculator'; | ||||
| import { tool as percentageCalculator } from './percentage-calculator'; | ||||
| import { tool as gitMemo } from './git-memo'; | ||||
| import { tool as hashText } from './hash-text'; | ||||
| import { tool as hmacGenerator } from './hmac-generator'; | ||||
| import { tool as htmlEntities } from './html-entities'; | ||||
| import { tool as baseConverter } from './integer-base-converter'; | ||||
| import { tool as jsonViewer } from './json-viewer'; | ||||
| import { tool as jwtParser } from './jwt-parser'; | ||||
| import { tool as loremIpsumGenerator } from './lorem-ipsum-generator'; | ||||
| import { tool as mathEvaluator } from './math-evaluator'; | ||||
| import { tool as metaTagGenerator } from './meta-tag-generator'; | ||||
| import { tool as mimeTypes } from './mime-types'; | ||||
| import { tool as otpCodeGeneratorAndValidator } from './otp-code-generator-and-validator'; | ||||
| import { tool as qrCodeGenerator } from './qr-code-generator'; | ||||
| import { tool as wifiQrCodeGenerator } from './wifi-qr-code-generator'; | ||||
| import { tool as randomPortGenerator } from './random-port-generator'; | ||||
| import { tool as romanNumeralConverter } from './roman-numeral-converter'; | ||||
| import { tool as sqlPrettify } from './sql-prettify'; | ||||
| import { tool as svgPlaceholderGenerator } from './svg-placeholder-generator'; | ||||
| import { tool as temperatureConverter } from './temperature-converter'; | ||||
| import { tool as textStatistics } from './text-statistics'; | ||||
| import { tool as tokenGenerator } from './token-generator'; | ||||
| import type { ToolCategory } from './tools.types'; | ||||
| import { tool as urlEncoder } from './url-encoder'; | ||||
| import { tool as urlParser } from './url-parser'; | ||||
| import { tool as uuidGenerator } from './uuid-generator'; | ||||
| import { tool as macAddressLookup } from './mac-address-lookup'; | ||||
| import { tool as xmlFormatter } from './xml-formatter'; | ||||
| import { tool as yamlViewer } from './yaml-viewer'; | ||||
| 
 | ||||
| export const toolsByCategory: ToolCategory[] = [ | ||||
|   { | ||||
|     name: 'Crypto', | ||||
|     components: [tokenGenerator, hashText, bcrypt, uuidGenerator, ulidGenerator, cypher, bip39, hmacGenerator, rsaKeyPairGenerator, passwordStrengthAnalyser, pdfSignatureChecker], | ||||
|   }, | ||||
|   { | ||||
|     name: 'Converter', | ||||
|     components: [ | ||||
|       dateTimeConverter, | ||||
|       baseConverter, | ||||
|       romanNumeralConverter, | ||||
|       base64StringConverter, | ||||
|       base64FileConverter, | ||||
|       colorConverter, | ||||
|       caseConverter, | ||||
|       textToNatoAlphabet, | ||||
|       textToBinary, | ||||
|       textToUnicode, | ||||
|       yamlToJson, | ||||
|       yamlToToml, | ||||
|       jsonToYaml, | ||||
|       jsonToToml, | ||||
|       listConverter, | ||||
|       tomlToJson, | ||||
|       tomlToYaml, | ||||
|       xmlToJson, | ||||
|       jsonToXml, | ||||
|       markdownToHtml, | ||||
|     ], | ||||
|   }, | ||||
|   { | ||||
|     name: 'Web', | ||||
|     components: [ | ||||
|       urlEncoder, | ||||
|       htmlEntities, | ||||
|       urlParser, | ||||
|       deviceInformation, | ||||
|       basicAuthGenerator, | ||||
|       metaTagGenerator, | ||||
|       otpCodeGeneratorAndValidator, | ||||
|       mimeTypes, | ||||
|       jwtParser, | ||||
|       keycodeInfo, | ||||
|       slugifyString, | ||||
|       htmlWysiwygEditor, | ||||
|       userAgentParser, | ||||
|       httpStatusCodes, | ||||
|       jsonDiff, | ||||
|       safelinkDecoder, | ||||
|     ], | ||||
|   }, | ||||
|   { | ||||
|     name: 'Images and videos', | ||||
|     components: [qrCodeGenerator, wifiQrCodeGenerator, svgPlaceholderGenerator, cameraRecorder], | ||||
|   }, | ||||
|   { | ||||
|     name: 'Development', | ||||
|     components: [ | ||||
|       gitMemo, | ||||
|       randomPortGenerator, | ||||
|       crontabGenerator, | ||||
|       jsonViewer, | ||||
|       jsonMinify, | ||||
|       jsonToCsv, | ||||
|       sqlPrettify, | ||||
|       chmodCalculator, | ||||
|       dockerRunToDockerComposeConverter, | ||||
|       xmlFormatter, | ||||
|       yamlViewer, | ||||
|       emailNormalizer, | ||||
|       regexTester, | ||||
|       regexMemo, | ||||
|     ], | ||||
|   }, | ||||
|   { | ||||
|     name: 'Network', | ||||
|     components: [ipv4SubnetCalculator, ipv4AddressConverter, ipv4RangeExpander, macAddressLookup, macAddressGenerator, ipv6UlaGenerator], | ||||
|   }, | ||||
|   { | ||||
|     name: 'Math', | ||||
|     components: [mathEvaluator, etaCalculator, percentageCalculator], | ||||
|   }, | ||||
|   { | ||||
|     name: 'Measurement', | ||||
|     components: [chronometer, temperatureConverter, benchmarkBuilder], | ||||
|   }, | ||||
|   { | ||||
|     name: 'Text', | ||||
|     components: [ | ||||
|       loremIpsumGenerator, | ||||
|       textStatistics, | ||||
|       emojiPicker, | ||||
|       stringObfuscator, | ||||
|       textDiff, | ||||
|       numeronymGenerator, | ||||
|       asciiTextDrawer, | ||||
|     ], | ||||
|   }, | ||||
|   { | ||||
|     name: 'Data', | ||||
|     components: [phoneParserAndFormatter, ibanValidatorAndParser], | ||||
|   }, | ||||
| ]; | ||||
| export const toolsByCategory = Object.values(modules).reduce((la, moduleDef) => { | ||||
|   let found = la.find(l => l.name === moduleDef.category); | ||||
|   if (!found) { | ||||
|     found = { | ||||
|       name: moduleDef.category, | ||||
|       components: [], | ||||
|     }; | ||||
|     la.push(found); | ||||
|   } | ||||
|   found.components.push(moduleDef); | ||||
|   return la; | ||||
| }, [] as ToolCategory[]); | ||||
| 
 | ||||
| export const tools = toolsByCategory.flatMap(({ components }) => components); | ||||
| export const toolsWithCategory = toolsByCategory.flatMap(({ components, name }) => | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['integer', 'number', 'base', 'conversion', 'decimal', 'hexadecimal', 'binary', 'octal', 'base64'], | ||||
|   component: () => import('./integer-base-converter.vue'), | ||||
|   icon: ArrowsLeftRight, | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./ipv4-address-converter.vue'), | ||||
|   icon: Binary, | ||||
|   createdAt: new Date('2023-04-08'), | ||||
|   category: 'Network', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./ipv4-range-expander.vue'), | ||||
|   icon: UnfoldMoreOutlined, | ||||
|   createdAt: new Date('2023-04-19'), | ||||
|   category: 'Network', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['ipv4', 'subnet', 'calculator', 'mask', 'network', 'cidr', 'netmask', 'bitmask', 'broadcast', 'address'], | ||||
|   component: () => import('./ipv4-subnet-calculator.vue'), | ||||
|   icon: RouterOutlined, | ||||
|   category: 'Network', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./ipv6-ula-generator.vue'), | ||||
|   icon: BuildingFactory, | ||||
|   createdAt: new Date('2023-04-09'), | ||||
|   category: 'Network', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./json-diff.vue'), | ||||
|   icon: CompareArrowsRound, | ||||
|   createdAt: new Date('2023-04-20'), | ||||
|   category: 'Web', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['json', 'minify', 'format'], | ||||
|   component: () => import('./json-minify.vue'), | ||||
|   icon: Braces, | ||||
|   category: 'Development', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./json-to-csv.vue'), | ||||
|   icon: List, | ||||
|   createdAt: new Date('2023-06-18'), | ||||
|   category: 'Development', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./json-to-toml.vue'), | ||||
|   icon: Braces, | ||||
|   createdAt: new Date('2023-06-23'), | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./json-to-xml.vue'), | ||||
|   icon: Braces, | ||||
|   createdAt: new Date('2024-08-09'), | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./json-to-yaml.vue'), | ||||
|   icon: Braces, | ||||
|   createdAt: new Date('2023-04-10'), | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./json-viewer.vue'), | ||||
|   icon: Braces, | ||||
|   redirectFrom: ['/json-viewer'], | ||||
|   category: 'Development', | ||||
| }); | ||||
|  | ||||
| @ -25,4 +25,5 @@ export const tool = defineTool({ | ||||
|   ], | ||||
|   component: () => import('./jwt-parser.vue'), | ||||
|   icon: Key, | ||||
|   category: 'Web', | ||||
| }); | ||||
|  | ||||
| @ -24,4 +24,5 @@ export const tool = defineTool({ | ||||
|   ], | ||||
|   component: () => import('./keycode-info.vue'), | ||||
|   icon: Keyboard, | ||||
|   category: 'Web', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./list-converter.vue'), | ||||
|   icon: List, | ||||
|   createdAt: new Date('2023-05-07'), | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['lorem', 'ipsum', 'dolor', 'sit', 'amet', 'placeholder', 'text', 'filler', 'random', 'generator'], | ||||
|   component: () => import('./lorem-ipsum-generator.vue'), | ||||
|   icon: AlignJustified, | ||||
|   category: 'Text', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./mac-address-generator.vue'), | ||||
|   icon: Devices, | ||||
|   createdAt: new Date('2023-11-31'), | ||||
|   category: 'Network', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./mac-address-lookup.vue'), | ||||
|   icon: Devices, | ||||
|   createdAt: new Date('2023-04-06'), | ||||
|   category: 'Network', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./markdown-to-html.vue'), | ||||
|   icon: Markdown, | ||||
|   createdAt: new Date('2024-08-25'), | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -41,4 +41,5 @@ export const tool = defineTool({ | ||||
|   ], | ||||
|   component: () => import('./math-evaluator.vue'), | ||||
|   icon: Math, | ||||
|   category: 'Math', | ||||
| }); | ||||
|  | ||||
| @ -23,4 +23,5 @@ export const tool = defineTool({ | ||||
|   ], | ||||
|   component: () => import('./meta-tag-generator.vue'), | ||||
|   icon: Tags, | ||||
|   category: 'Web', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['mime', 'types', 'extension', 'content', 'type'], | ||||
|   component: () => import('./mime-types.vue'), | ||||
|   icon: World, | ||||
|   category: 'Web', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./numeronym-generator.vue'), | ||||
|   icon: n7mIcon, | ||||
|   createdAt: new Date('2023-11-05'), | ||||
|   category: 'Text', | ||||
| }); | ||||
|  | ||||
| @ -25,4 +25,5 @@ export const tool = defineTool({ | ||||
|   ], | ||||
|   component: () => import('./otp-code-generator-and-validator.vue'), | ||||
|   icon: DeviceMobile, | ||||
|   category: 'Web', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./password-strength-analyser.vue'), | ||||
|   icon: PasswordIcon, | ||||
|   createdAt: new Date('2023-06-24'), | ||||
|   category: 'Crypto', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./pdf-signature-checker.vue'), | ||||
|   icon: FileCertIcon, | ||||
|   createdAt: new Date('2023-12-09'), | ||||
|   category: 'Crypto', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./percentage-calculator.vue'), | ||||
|   icon: Percentage, | ||||
|   createdAt: new Date('2023-06-18'), | ||||
|   category: 'Math', | ||||
| }); | ||||
|  | ||||
| @ -22,4 +22,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./phone-parser-and-formatter.vue'), | ||||
|   icon: Phone, | ||||
|   createdAt: new Date('2023-05-01'), | ||||
|   category: 'Data', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['qr', 'code', 'generator', 'square', 'color', 'link', 'low', 'medium', 'quartile', 'high', 'transparent'], | ||||
|   component: () => import('./qr-code-generator.vue'), | ||||
|   icon: Qrcode, | ||||
|   category: 'Images and videos', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['system', 'port', 'lan', 'generator', 'random', 'development', 'computer'], | ||||
|   component: () => import('./random-port-generator.vue'), | ||||
|   icon: Server, | ||||
|   category: 'Development', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./regex-memo.vue'), | ||||
|   icon: BrandJavascript, | ||||
|   createdAt: new Date('2024-09-20'), | ||||
|   category: 'Development', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./regex-tester.vue'), | ||||
|   icon: Language, | ||||
|   createdAt: new Date('2024-09-20'), | ||||
|   category: 'Development', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['roman', 'arabic', 'converter', 'X', 'I', 'V', 'L', 'C', 'D', 'M'], | ||||
|   component: () => import('./roman-numeral-converter.vue'), | ||||
|   icon: LetterX, | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['rsa', 'key', 'pair', 'generator', 'public', 'private', 'secret', 'ssh', 'pem'], | ||||
|   component: () => import('./rsa-key-pair-generator.vue'), | ||||
|   icon: Certificate, | ||||
|   category: 'Crypto', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./safelink-decoder.vue'), | ||||
|   icon: Mailbox, | ||||
|   createdAt: new Date('2024-03-11'), | ||||
|   category: 'Web', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['slugify', 'string', 'escape', 'emoji', 'special', 'character', 'space', 'trim'], | ||||
|   component: () => import('./slugify-string.vue'), | ||||
|   icon: AbcRound, | ||||
|   category: 'Web', | ||||
| }); | ||||
|  | ||||
| @ -24,4 +24,5 @@ export const tool = defineTool({ | ||||
|   ], | ||||
|   component: () => import('./sql-prettify.vue'), | ||||
|   icon: Database, | ||||
|   category: 'Development', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./string-obfuscator.vue'), | ||||
|   icon: EyeOff, | ||||
|   createdAt: new Date('2023-08-16'), | ||||
|   category: 'Text', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['svg', 'placeholder', 'generator', 'image', 'size', 'mockup'], | ||||
|   component: () => import('./svg-placeholder-generator.vue'), | ||||
|   icon: ImageOutlined, | ||||
|   category: 'Images and videos', | ||||
| }); | ||||
|  | ||||
| @ -21,4 +21,5 @@ export const tool = defineTool({ | ||||
|   ], | ||||
|   component: () => import('./temperature-converter.vue'), | ||||
|   icon: Temperature, | ||||
|   category: 'Measurement', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./text-diff.vue'), | ||||
|   icon: FileDiff, | ||||
|   createdAt: new Date('2023-08-16'), | ||||
|   category: 'Text', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./text-statistics.vue'), | ||||
|   icon: FileText, | ||||
|   redirectFrom: ['/text-stats'], | ||||
|   category: 'Text', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./text-to-binary.vue'), | ||||
|   icon: Binary, | ||||
|   createdAt: new Date('2023-10-15'), | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['string', 'nato', 'alphabet', 'phonetic', 'oral', 'transmission'], | ||||
|   component: () => import('./text-to-nato-alphabet.vue'), | ||||
|   icon: Speakerphone, | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./text-to-unicode.vue'), | ||||
|   icon: TextWrap, | ||||
|   createdAt: new Date('2024-01-31'), | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['token', 'random', 'string', 'alphanumeric', 'symbols', 'number', 'letters', 'lowercase', 'uppercase', 'password'], | ||||
|   component: () => import('./token-generator.tool.vue'), | ||||
|   icon: ArrowsShuffle, | ||||
|   category: 'Crypto', | ||||
| }); | ||||
|  | ||||
| @ -11,4 +11,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./toml-to-json.vue'), | ||||
|   icon: BracketIcon, | ||||
|   createdAt: new Date('2023-06-23'), | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./toml-to-yaml.vue'), | ||||
|   icon: BracketIcon, | ||||
|   createdAt: new Date('2023-06-23'), | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -1,9 +1,9 @@ | ||||
| import { isAfter, subWeeks } from 'date-fns'; | ||||
| import type { Tool } from './tools.types'; | ||||
| import type { ToolWithCategory } from './tools.types'; | ||||
| 
 | ||||
| type WithOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>; | ||||
| 
 | ||||
| export function defineTool(tool: WithOptional<Tool, 'isNew'>) { | ||||
| export function defineTool(tool: WithOptional<ToolWithCategory, 'isNew'>) { | ||||
|   const isNew = tool.createdAt ? isAfter(tool.createdAt, subWeeks(new Date(), 2)) : false; | ||||
| 
 | ||||
|   return { | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./ulid-generator.vue'), | ||||
|   icon: SortDescendingNumbers, | ||||
|   createdAt: new Date('2023-09-11'), | ||||
|   category: 'Crypto', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['url', 'encode', 'decode', 'percent', '%20', 'format'], | ||||
|   component: () => import('./url-encoder.vue'), | ||||
|   icon: Link, | ||||
|   category: 'Web', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['url', 'parser', 'protocol', 'origin', 'params', 'port', 'username', 'password', 'href'], | ||||
|   component: () => import('./url-parser.vue'), | ||||
|   icon: Unlink, | ||||
|   category: 'Web', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./user-agent-parser.vue'), | ||||
|   icon: Browser, | ||||
|   createdAt: new Date('2023-04-06'), | ||||
|   category: 'Web', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   keywords: ['uuid', 'v4', 'random', 'id', 'alphanumeric', 'identity', 'token', 'string', 'identifier', 'unique', 'v1', 'v3', 'v5', 'nil'], | ||||
|   component: () => import('./uuid-generator.vue'), | ||||
|   icon: Fingerprint, | ||||
|   category: 'Crypto', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./wifi-qr-code-generator.vue'), | ||||
|   icon: Qrcode, | ||||
|   createdAt: new Date('2023-09-06'), | ||||
|   category: 'Images and videos', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./xml-formatter.vue'), | ||||
|   icon: Code, | ||||
|   createdAt: new Date('2023-06-17'), | ||||
|   category: 'Development', | ||||
| }); | ||||
|  | ||||
| @ -9,4 +9,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./xml-to-json.vue'), | ||||
|   icon: Braces, | ||||
|   createdAt: new Date('2024-08-09'), | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./yaml-to-json.vue'), | ||||
|   icon: AlignJustified, | ||||
|   createdAt: new Date('2023-04-10'), | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./yaml-to-toml.vue'), | ||||
|   icon: AlignJustified, | ||||
|   createdAt: new Date('2023-06-23'), | ||||
|   category: 'Converter', | ||||
| }); | ||||
|  | ||||
| @ -10,4 +10,5 @@ export const tool = defineTool({ | ||||
|   component: () => import('./yaml-viewer.vue'), | ||||
|   icon: AlignJustified, | ||||
|   createdAt: new Date('2024-01-31'), | ||||
|   category: 'Development', | ||||
| }); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user