1
0
mirror of https://github.com/home-assistant/frontend.git synced 2026-04-02 00:27:49 +01:00

Replace ua-parser-js with simple regexs (#30355)

This commit is contained in:
Bram Kragten
2026-03-26 15:48:05 +01:00
parent cb6985eb7c
commit a6c4184054
3 changed files with 37 additions and 55 deletions

View File

@@ -129,7 +129,6 @@
"stacktrace-js": "2.0.2",
"superstruct": "2.0.2",
"tinykeys": "3.0.0",
"ua-parser-js": "2.0.9",
"weekstart": "2.0.0",
"workbox-cacheable-response": "7.4.0",
"workbox-core": "7.4.0",
@@ -169,7 +168,6 @@
"@types/qrcode": "1.5.6",
"@types/sortablejs": "1.15.9",
"@types/tar": "7.0.87",
"@types/ua-parser-js": "0.7.39",
"@types/webspeechapi": "0.0.29",
"@vitest/coverage-v8": "4.1.0",
"babel-loader": "10.1.1",

View File

@@ -1,11 +1,44 @@
import { fromError } from "stacktrace-js";
import { UAParser } from "ua-parser-js";
// URL paths to remove from filenames and max stack trace lines for brevity
const REMOVAL_PATHS =
/^\/(?:home-assistant\/frontend\/[^/]+|unknown|\/{2}\.)\//;
const MAX_STACK_FRAMES = 10;
// Order matters: more specific UA tokens must come before generic ones
const BROWSER_PATTERNS: [RegExp, string][] = [
[/Edg\/(\S+)/, "Edge"],
[/OPR\/(\S+)/, "Opera"],
[/Chrome\/(\S+)/, "Chrome"],
[/Firefox\/(\S+)/, "Firefox"],
[/Version\/(\S+).*Safari/, "Safari"],
];
const OS_PATTERNS: [RegExp, string][] = [
[/CrOS/, "Chrome OS"],
[/Windows NT ([\d.]+)/, "Windows"],
[/Android ([\d.]+)/, "Android"],
[/iPhone OS ([\d_.]+)/, "iOS"],
[/iPad; CPU OS ([\d_.]+)/, "iPadOS"],
[/Mac OS X ([\d_.]+)/, "macOS"],
[/Linux/, "Linux"],
];
const detectFromUA = (
ua: string,
patterns: [RegExp, string][],
fallback: string
): string => {
for (const [pattern, name] of patterns) {
const match = ua.match(pattern);
if (match) {
const version = match[1]?.replace(/_/g, ".");
return version ? `${name} ${version}` : name;
}
}
return fallback;
};
export const createLogMessage = async (
error: unknown,
intro?: string,
@@ -15,15 +48,9 @@ export const createLogMessage = async (
const lines: (string | undefined)[] = [];
// Append the originating browser/OS to any intro for easier identification
if (intro) {
const parser = new UAParser();
const {
name: browserName = "unknown browser",
version: browserVersion = "",
} = parser.getBrowser();
const { name: osName = "unknown OS", version: osVersion = "" } =
parser.getOS();
const browser = `${browserName} ${browserVersion}`.trim();
const os = `${osName} ${osVersion}`.trim();
const ua = navigator.userAgent;
const browser = detectFromUA(ua, BROWSER_PATTERNS, "unknown browser");
const os = detectFromUA(ua, OS_PATTERNS, "unknown OS");
lines.push(`${intro} from ${browser} on ${os}`);
}
// In most cases, an Error instance will be thrown, which can have many details to log:

View File

@@ -4862,13 +4862,6 @@ __metadata:
languageName: node
linkType: hard
"@types/ua-parser-js@npm:0.7.39":
version: 0.7.39
resolution: "@types/ua-parser-js@npm:0.7.39"
checksum: 10/8d173a79b37f9404cda49e848d82694c4854828ff20d94ddfba53bf9ccd9b4df16bf28f72786cf253a73305e9a54d2f2bb54ebfc144fca2496d3f3f025a79cb5
languageName: node
linkType: hard
"@types/webspeechapi@npm:0.0.29":
version: 0.0.29
resolution: "@types/webspeechapi@npm:0.0.29"
@@ -7006,13 +6999,6 @@ __metadata:
languageName: node
linkType: hard
"detect-europe-js@npm:^0.1.2":
version: 0.1.2
resolution: "detect-europe-js@npm:0.1.2"
checksum: 10/3d6dcf6ac451baa3050ff00e05cf1841e208bc4f27c69ec2c8df5fdf2375403cf2911f8059c9c18f258d7e176c8d308e4e0e8552500d0e30a9e95a514366ef13
languageName: node
linkType: hard
"detect-file@npm:^1.0.0":
version: 1.0.0
resolution: "detect-file@npm:1.0.0"
@@ -8941,7 +8927,6 @@ __metadata:
"@types/qrcode": "npm:1.5.6"
"@types/sortablejs": "npm:1.15.9"
"@types/tar": "npm:7.0.87"
"@types/ua-parser-js": "npm:0.7.39"
"@types/webspeechapi": "npm:0.0.29"
"@vibrant/color": "npm:4.0.4"
"@vitest/coverage-v8": "npm:4.1.0"
@@ -9026,7 +9011,6 @@ __metadata:
ts-lit-plugin: "npm:2.0.2"
typescript: "npm:5.9.3"
typescript-eslint: "npm:8.57.1"
ua-parser-js: "npm:2.0.9"
vite-tsconfig-paths: "npm:6.1.1"
vitest: "npm:4.1.0"
webpack-stats-plugin: "npm:1.1.3"
@@ -9779,13 +9763,6 @@ __metadata:
languageName: node
linkType: hard
"is-standalone-pwa@npm:^0.1.1":
version: 0.1.1
resolution: "is-standalone-pwa@npm:0.1.1"
checksum: 10/bbd2ee7cbea985139f66fe8785e7699f52311e9c14d74190659885222b79dd1e8845b02f69b9221a23a2b4b00e8d4bea0a5a2603b2f26cb6d2071d46093ccf84
languageName: node
linkType: hard
"is-stream@npm:^2.0.0":
version: 2.0.1
resolution: "is-stream@npm:2.0.1"
@@ -13964,26 +13941,6 @@ __metadata:
languageName: node
linkType: hard
"ua-is-frozen@npm:^0.1.2":
version: 0.1.2
resolution: "ua-is-frozen@npm:0.1.2"
checksum: 10/0113bed77d437a3752323175f01057dd01911506225e9d33799799188a89a230ab63d2445b096d4399ea8eb94e3163608f7ac2425fb8edd0844d891490607e14
languageName: node
linkType: hard
"ua-parser-js@npm:2.0.9":
version: 2.0.9
resolution: "ua-parser-js@npm:2.0.9"
dependencies:
detect-europe-js: "npm:^0.1.2"
is-standalone-pwa: "npm:^0.1.1"
ua-is-frozen: "npm:^0.1.2"
bin:
ua-parser-js: script/cli.js
checksum: 10/63e3404e16ade8a7d1b45bf2a871410193ab63620ab02ffa5308a507a984d2698bd74651ce260ac3e0cb9f8df89c71fa55a6beefbe269c12849c6d6cf0974407
languageName: node
linkType: hard
"ua-regexes-lite@npm:^1.2.1":
version: 1.2.1
resolution: "ua-regexes-lite@npm:1.2.1"