@escapenavigator/utils 1.10.156 → 1.10.157

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.
@@ -1,7 +1,15 @@
1
1
  /** Совпадает ли текст сообщения с сигнатурой протухшего чанка. */
2
2
  export declare function isStaleChunkMessage(message?: string | null): boolean;
3
+ /** Совпадает ли текст сообщения с сигнатурой обрезанного скрипта. */
4
+ export declare function isTruncatedScriptMessage(message?: string | null): boolean;
3
5
  /**
4
6
  * Проверка ошибки целиком: смотрим `message`, `name` (ChunkLoadError) и
5
7
  * вложенный `cause` (новые браузеры заворачивают исходную ошибку).
6
8
  */
7
9
  export declare function isStaleChunkError(error: unknown): boolean;
10
+ /**
11
+ * «Лечится ли ошибка `import()` перезагрузкой»: протухший чанк после деплоя
12
+ * ИЛИ обрезанный файл чанка. Использовать только для ошибок, пришедших из
13
+ * динамического `import()` — см. комментарий к TRUNCATED_SCRIPT_RE.
14
+ */
15
+ export declare function isRecoverableImportError(error: unknown): boolean;
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isStaleChunkMessage = isStaleChunkMessage;
4
+ exports.isTruncatedScriptMessage = isTruncatedScriptMessage;
4
5
  exports.isStaleChunkError = isStaleChunkError;
6
+ exports.isRecoverableImportError = isRecoverableImportError;
5
7
  /**
6
8
  * Распознавание «протухшего чанка» (stale chunk) — общий matcher для всех
7
9
  * фронтов (app / orders / widget).
@@ -27,23 +29,51 @@ function isStaleChunkMessage(message) {
27
29
  return !!message && STALE_CHUNK_RE.test(message);
28
30
  }
29
31
  /**
30
- * Проверка ошибки целиком: смотрим `message`, `name` (ChunkLoadError) и
31
- * вложенный `cause` (новые браузеры заворачивают исходную ошибку).
32
+ * Обрезанный скрипт: браузер получил неполный файл чанка (флап сети,
33
+ * прерванная загрузка, Safari закешировал частичный ответ) и падает на parse:
34
+ * - Safari: "SyntaxError: Unexpected end of script"
35
+ * - Chrome: "SyntaxError: Unexpected end of input"
36
+ *
37
+ * ВАЖНО: матчер НЕ входит в общий STALE_CHUNK_RE — "Unexpected end of input"
38
+ * встречается и вне загрузки чанков (JSON.parse, сторонние скрипты хост-сайта).
39
+ * Глобальные перехватчики (recovery виджета) на него реагировать не должны —
40
+ * используем только там, где ошибка гарантированно пришла из `import()`
41
+ * (lazyWithRetry).
32
42
  */
33
- function isStaleChunkError(error) {
43
+ const TRUNCATED_SCRIPT_RE = /Unexpected end of (script|input)/i;
44
+ /** Совпадает ли текст сообщения с сигнатурой обрезанного скрипта. */
45
+ function isTruncatedScriptMessage(message) {
46
+ return !!message && TRUNCATED_SCRIPT_RE.test(message);
47
+ }
48
+ function matchesError(error, matcher) {
34
49
  if (!error)
35
50
  return false;
36
51
  if (typeof error === 'string')
37
- return isStaleChunkMessage(error);
52
+ return matcher(error);
38
53
  const { message, name, cause } = error;
39
- if (isStaleChunkMessage(message))
54
+ if (matcher(message))
40
55
  return true;
41
- if (isStaleChunkMessage(name))
56
+ if (matcher(name))
42
57
  return true;
43
58
  if (cause && cause !== error) {
44
59
  const causeMessage = typeof cause === 'string' ? cause : cause?.message;
45
- if (isStaleChunkMessage(causeMessage))
60
+ if (matcher(causeMessage))
46
61
  return true;
47
62
  }
48
63
  return false;
49
64
  }
65
+ /**
66
+ * Проверка ошибки целиком: смотрим `message`, `name` (ChunkLoadError) и
67
+ * вложенный `cause` (новые браузеры заворачивают исходную ошибку).
68
+ */
69
+ function isStaleChunkError(error) {
70
+ return matchesError(error, isStaleChunkMessage);
71
+ }
72
+ /**
73
+ * «Лечится ли ошибка `import()` перезагрузкой»: протухший чанк после деплоя
74
+ * ИЛИ обрезанный файл чанка. Использовать только для ошибок, пришедших из
75
+ * динамического `import()` — см. комментарий к TRUNCATED_SCRIPT_RE.
76
+ */
77
+ function isRecoverableImportError(error) {
78
+ return matchesError(error, isStaleChunkMessage) || matchesError(error, isTruncatedScriptMessage);
79
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@escapenavigator/utils",
3
- "version": "1.10.156",
3
+ "version": "1.10.157",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -28,5 +28,5 @@
28
28
  "ts-jest": "^29.1.1",
29
29
  "typescript": "^5.6"
30
30
  },
31
- "gitHead": "a7a449f109ee8966f501a0b3fdabaca03439df53"
31
+ "gitHead": "6ba35e576b925e6345c5f2114185de04e3d072e0"
32
32
  }