hotelme-nuxt-logger 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/module.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "compatibility": {
5
5
  "nuxt": "^3.0.0 || ^4.0.0"
6
6
  },
7
- "version": "1.1.1",
7
+ "version": "1.2.0",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "0.8.4",
10
10
  "unbuild": "2.0.0"
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Помилки, що походять із браузерних розширень користувача, — не наші:
3
+ * ми не можемо їх виправити, а одне криве розширення здатне наспамити
4
+ * мільйони записів (реальний кейс: chrome-extension://eppioc… — 1.5 млн
5
+ * помилок від одного користувача, CU-86cb772n0).
6
+ *
7
+ * Фільтр застосовується ДВІЧІ: у браузерному плагіні (звіт взагалі не
8
+ * надсилається — економимо трафік і ручку) і в серверній ручці
9
+ * `/_logger/client-error` (страховка від старих закешованих бандлів без
10
+ * клієнтського фільтра).
11
+ */
12
+ /** URL-схеми розширень усіх основних браузерів. */
13
+ export declare const EXTENSION_URL_MARKERS: readonly ["chrome-extension:", "moz-extension:", "safari-extension:", "safari-web-extension:", "ms-browser-extension:"];
14
+ /**
15
+ * Чи походить звіт про помилку з браузерного розширення. Дивимось на
16
+ * stack trace і на `file` (window.onerror `filename`) — саме там сидить
17
+ * URL джерела; текст помилки навмисно не перевіряємо (легітимна помилка
18
+ * сторінки могла б згадувати схему в повідомленні).
19
+ */
20
+ export declare function isBrowserExtensionError(payload: {
21
+ stack?: unknown;
22
+ file?: unknown;
23
+ } | null | undefined): boolean;
@@ -0,0 +1,17 @@
1
+ export const EXTENSION_URL_MARKERS = [
2
+ "chrome-extension:",
3
+ "moz-extension:",
4
+ "safari-extension:",
5
+ "safari-web-extension:",
6
+ "ms-browser-extension:"
7
+ ];
8
+ export function isBrowserExtensionError(payload) {
9
+ if (!payload) return false;
10
+ for (const field of [payload.stack, payload.file]) {
11
+ if (typeof field !== "string" || !field) continue;
12
+ for (const marker of EXTENSION_URL_MARKERS) {
13
+ if (field.includes(marker)) return true;
14
+ }
15
+ }
16
+ return false;
17
+ }
@@ -1,5 +1,6 @@
1
1
  import { defineNuxtPlugin, useRequestEvent, useRuntimeConfig } from "#imports";
2
2
  import { logger } from "../logger.js";
3
+ import { isBrowserExtensionError } from "../browserExtensionFilter.js";
3
4
  export default defineNuxtPlugin((nuxtApp) => {
4
5
  if (import.meta.server) {
5
6
  const event = useRequestEvent();
@@ -28,6 +29,7 @@ export default defineNuxtPlugin((nuxtApp) => {
28
29
  }
29
30
  const endpoint = useRuntimeConfig().public.loggerClientErrorEndpoint || "/_logger/client-error";
30
31
  const post = (msg, payload) => {
32
+ if (isBrowserExtensionError(payload)) return;
31
33
  try {
32
34
  fetch(endpoint, {
33
35
  method: "POST",
@@ -1,8 +1,12 @@
1
1
  import { defineEventHandler, readBody } from "h3";
2
2
  import { logger } from "../../logger.js";
3
+ import { isBrowserExtensionError } from "../../browserExtensionFilter.js";
3
4
  export default defineEventHandler(async (event) => {
4
5
  const body = await readBody(event).catch(() => ({}));
5
6
  const { msg, ...rest } = body || {};
7
+ if (isBrowserExtensionError(rest)) {
8
+ return { ok: true };
9
+ }
6
10
  logger.error(typeof msg === "string" && msg ? msg : "client_error", {
7
11
  reqid: event.context.reqid,
8
12
  domain: event.node.req.headers.host,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hotelme-nuxt-logger",
3
- "version": "1.1.1",
3
+ "version": "1.2.0",
4
4
  "description": "Стандартний logger для Nuxt проектів з JSON виводом сумісним з бекенд-логами",
5
5
  "keywords": [
6
6
  "nuxt",