diff --git a/package.json b/package.json index d03c9099..8592ce2c 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,7 @@ "randombytes": "^2.1.0", "sql-formatter": "^8.2.0", "ts-pattern": "^4.2.2", + "ua-parser-js": "^1.0.35", "uuid": "^8.3.2", "vue": "^3.2.47", "vue-router": "^4.1.6" @@ -85,6 +86,7 @@ "@types/prettier": "^2.7.2", "@types/qrcode": "^1.5.0", "@types/randombytes": "^2.0.0", + "@types/ua-parser-js": "^0.7.36", "@types/uuid": "^8.3.4", "@typescript-eslint/parser": "^5.57.0", "@vitejs/plugin-vue": "^2.3.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cce11327..4aace326 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -109,6 +109,9 @@ dependencies: ts-pattern: specifier: ^4.2.2 version: 4.2.2 + ua-parser-js: + specifier: ^1.0.35 + version: 1.0.35 uuid: specifier: ^8.3.2 version: 8.3.2 @@ -156,6 +159,9 @@ devDependencies: '@types/randombytes': specifier: ^2.0.0 version: 2.0.0 + '@types/ua-parser-js': + specifier: ^0.7.36 + version: 0.7.36 '@types/uuid': specifier: ^8.3.4 version: 8.3.4 @@ -2218,6 +2224,10 @@ packages: resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} dev: true + /@types/ua-parser-js@0.7.36: + resolution: {integrity: sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==} + dev: true + /@types/uuid@8.3.4: resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} dev: true @@ -7511,6 +7521,10 @@ packages: engines: {node: '>=4.2.0'} hasBin: true + /ua-parser-js@1.0.35: + resolution: {integrity: sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==} + dev: false + /uc.micro@1.0.6: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} diff --git a/src/tools/index.ts b/src/tools/index.ts index 29d32422..94c6f168 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -2,6 +2,7 @@ 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 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'; @@ -79,6 +80,7 @@ export const toolsByCategory: ToolCategory[] = [ keycodeInfo, slugifyString, htmlWysiwygEditor, + userAgentParser, ], }, { diff --git a/src/tools/user-agent-parser/index.ts b/src/tools/user-agent-parser/index.ts new file mode 100644 index 00000000..1ae05d14 --- /dev/null +++ b/src/tools/user-agent-parser/index.ts @@ -0,0 +1,12 @@ +import { Browser } from '@vicons/tabler'; +import { defineTool } from '../tool'; + +export const tool = defineTool({ + name: 'User-agent parser', + path: '/user-agent-parser', + description: 'Detect and parse Browser, Engine, OS, CPU, and Device type/model from an user-agent string.', + keywords: ['user', 'agent', 'parser', 'browser', 'engine', 'os', 'cpu', 'device', 'user-agent', 'client'], + component: () => import('./user-agent-parser.vue'), + icon: Browser, + createdAt: new Date('2023-04-06'), +}); diff --git a/src/tools/user-agent-parser/user-agent-parser.types.ts b/src/tools/user-agent-parser/user-agent-parser.types.ts new file mode 100644 index 00000000..f84719fc --- /dev/null +++ b/src/tools/user-agent-parser/user-agent-parser.types.ts @@ -0,0 +1,12 @@ +import type { Component } from 'vue'; +import { UAParser } from 'ua-parser-js'; + +export type UserAgentResultSection = { + heading: string; + icon?: Component; + content: { + label: string; + getValue: (blocks: UAParser.IResult) => string | undefined; + undefinedFallback?: string; + }[]; +}; diff --git a/src/tools/user-agent-parser/user-agent-parser.vue b/src/tools/user-agent-parser/user-agent-parser.vue new file mode 100644 index 00000000..a256ec6a --- /dev/null +++ b/src/tools/user-agent-parser/user-agent-parser.vue @@ -0,0 +1,120 @@ + + + + + + + + + + + + + diff --git a/src/tools/user-agent-parser/user-agent-result-cards.vue b/src/tools/user-agent-parser/user-agent-result-cards.vue new file mode 100644 index 00000000..d79a5283 --- /dev/null +++ b/src/tools/user-agent-parser/user-agent-result-cards.vue @@ -0,0 +1,50 @@ + + + + + + + + {{ heading }} + + + + + + + + + + + + + + {{ getValue(userAgentInfo) }} + + + {{ label }} + + + + + + {{ undefinedFallback }} + + + + + + + + +