@foxford/den 3.2.5 → 3.3.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/README.mdx CHANGED
@@ -305,7 +305,9 @@ export default defineAppConfig({
305
305
  | `@foxford/den` | рантайм, `define*`, менеджеры контейнеров и состояния |
306
306
  | `@foxford/den/define` | те же `define*` без сайд-эффекта установки резолвера |
307
307
  | `@foxford/den/adapter` | шов резолва для адаптеров хостов |
308
- | `@foxford/den/island` | остров: жизненный цикл, шов `renderApp`, порт `ViewAdapter` |
308
+ | `@foxford/den/island` | остров: жизненный цикл, шов `renderApp`, порт `ViewAdapter`, очередь клиентских падений (`reportIslandError`) |
309
+
310
+
309
311
  | `@foxford/den/serve` | сетевой транспорт: `serveApp`, `appPlugin` |
310
312
  | `@foxford/den/build` | конфиг приложения и сборка: `defineAppConfig`, `buildApp` |
311
313
  | `@foxford/den/bin` | точка входа команды `den` |
package/island/index.cjs CHANGED
@@ -23,6 +23,21 @@ require('../chunk-A6ZPAM6Z.cjs');
23
23
 
24
24
  var _chunkT5QVCXVBcjs = require('../chunk-T5QVCXVB.cjs');
25
25
 
26
+ // src/island/errors.ts
27
+ var ISLAND_ERRORS_KEY = "__DEN_ISLAND_ERRORS__";
28
+ function reportIslandError(error, context) {
29
+ var _a;
30
+ if (typeof window === "undefined") {
31
+ return;
32
+ }
33
+ const w = window;
34
+ const queue = (_a = w[ISLAND_ERRORS_KEY]) != null ? _a : [];
35
+ if (w[ISLAND_ERRORS_KEY] === void 0) {
36
+ w[ISLAND_ERRORS_KEY] = queue;
37
+ }
38
+ queue.push({ context, error });
39
+ }
40
+
26
41
  // src/island/navigate.ts
27
42
  var NAVIGATE_EVENT = "den:navigate";
28
43
  function navigateIsland(node, route) {
@@ -122,4 +137,6 @@ function describeIsland(descriptor, denState) {
122
137
 
123
138
 
124
139
 
125
- exports.DOCUMENT_EVENT = DOCUMENT_EVENT; exports.NAVIGATE_EVENT = NAVIGATE_EVENT; exports.ViewLayerToken = _chunkXOJ2VWX4cjs.ViewLayerToken; exports.activateIslandViewModels = _chunkXDM6J4LJcjs.activateIslandViewModels; exports.collectDocumentContribution = _chunkXDM6J4LJcjs.collectDocumentContribution; exports.collectIslandState = _chunkXDM6J4LJcjs.collectIslandState; exports.createIslandContainer = _chunkXDM6J4LJcjs.createIslandContainer; exports.describeIsland = describeIsland; exports.getAppContainer = _chunkXDM6J4LJcjs.getAppContainer; exports.getIslandsSnapshot = getIslandsSnapshot; exports.hydrateIslandState = _chunkXDM6J4LJcjs.hydrateIslandState; exports.isDocumentSource = _chunkXDM6J4LJcjs.isDocumentSource; exports.matchRoute = _chunkXDM6J4LJcjs.matchRoute; exports.navigateIsland = navigateIsland; exports.normalizeRoutes = _chunkXDM6J4LJcjs.normalizeRoutes; exports.onIslandDocument = onIslandDocument; exports.onIslandNavigate = onIslandNavigate; exports.pathPattern = _chunkXDM6J4LJcjs.pathPattern; exports.publishIslandDocument = publishIslandDocument; exports.registerIsland = registerIsland; exports.renderApp = _chunkXDM6J4LJcjs.renderApp; exports.resolveEagerUnits = _chunkXDM6J4LJcjs.resolveEagerUnits; exports.resolveViewAdapter = _chunkXOJ2VWX4cjs.resolveViewAdapter; exports.slotAddress = slotAddress; exports.subscribeIslands = subscribeIslands; exports.viewAdapterOf = _chunkXOJ2VWX4cjs.viewAdapterOf;
140
+
141
+
142
+ exports.DOCUMENT_EVENT = DOCUMENT_EVENT; exports.ISLAND_ERRORS_KEY = ISLAND_ERRORS_KEY; exports.NAVIGATE_EVENT = NAVIGATE_EVENT; exports.ViewLayerToken = _chunkXOJ2VWX4cjs.ViewLayerToken; exports.activateIslandViewModels = _chunkXDM6J4LJcjs.activateIslandViewModels; exports.collectDocumentContribution = _chunkXDM6J4LJcjs.collectDocumentContribution; exports.collectIslandState = _chunkXDM6J4LJcjs.collectIslandState; exports.createIslandContainer = _chunkXDM6J4LJcjs.createIslandContainer; exports.describeIsland = describeIsland; exports.getAppContainer = _chunkXDM6J4LJcjs.getAppContainer; exports.getIslandsSnapshot = getIslandsSnapshot; exports.hydrateIslandState = _chunkXDM6J4LJcjs.hydrateIslandState; exports.isDocumentSource = _chunkXDM6J4LJcjs.isDocumentSource; exports.matchRoute = _chunkXDM6J4LJcjs.matchRoute; exports.navigateIsland = navigateIsland; exports.normalizeRoutes = _chunkXDM6J4LJcjs.normalizeRoutes; exports.onIslandDocument = onIslandDocument; exports.onIslandNavigate = onIslandNavigate; exports.pathPattern = _chunkXDM6J4LJcjs.pathPattern; exports.publishIslandDocument = publishIslandDocument; exports.registerIsland = registerIsland; exports.renderApp = _chunkXDM6J4LJcjs.renderApp; exports.reportIslandError = reportIslandError; exports.resolveEagerUnits = _chunkXDM6J4LJcjs.resolveEagerUnits; exports.resolveViewAdapter = _chunkXOJ2VWX4cjs.resolveViewAdapter; exports.slotAddress = slotAddress; exports.subscribeIslands = subscribeIslands; exports.viewAdapterOf = _chunkXOJ2VWX4cjs.viewAdapterOf;
@@ -69,6 +69,38 @@ interface DocumentSource {
69
69
  */
70
70
  declare function isDocumentSource(value: unknown): value is DocumentSource;
71
71
 
72
+ /**
73
+ * Клиентские падения острова между бандлами.
74
+ *
75
+ * Сетевое приложение оживает своим бандлом, хост — своим. У каждого своя копия модулей,
76
+ * module-level очередь в одной не видна в другой. Шина — массив на `window`.
77
+ *
78
+ * Остров кладёт исходное исключение через {@link reportIslandError}. Хост после Sentry.init
79
+ * сам сливает backlog и при необходимости перехватывает `.push` того же массива. Обёртки
80
+ * нет: стек и тип остаются приложению.
81
+ */
82
+ /** Фаза, на которой остров упал. */
83
+ type IslandErrorPhase = 'render' | 'hydrate' | 'navigate';
84
+ /** Контекст падения острова. */
85
+ interface IslandErrorContext {
86
+ /** Имя приложения из дескриптора. */
87
+ appName: string;
88
+ phase: IslandErrorPhase;
89
+ }
90
+ /** Одна запись очереди: исходное исключение и контекст. */
91
+ interface IslandErrorReport {
92
+ error: unknown;
93
+ context: IslandErrorContext;
94
+ }
95
+ /** Ключ массива на `window` — обязан совпадать у хоста и remote. */
96
+ declare const ISLAND_ERRORS_KEY = "__DEN_ISLAND_ERRORS__";
97
+ /**
98
+ * Кладёт исходное исключение в очередь на `window`.
99
+ *
100
+ * Хост разгребает массив сам (после инициализации наблюдаемости).
101
+ */
102
+ declare function reportIslandError(error: unknown, context: IslandErrorContext): void;
103
+
72
104
  /**
73
105
  * Адрес, по которому рендерится остров.
74
106
  *
@@ -324,4 +356,4 @@ declare function getAppContainer(): Container;
324
356
  */
325
357
  declare function slotAddress(app: string, slot: string): string;
326
358
 
327
- export { AppAssets, type CreateIslandContainerOptions, DOCUMENT_EVENT, type DocumentContribution, type DocumentHead, type DocumentSource, IslandDescriptor, type IslandRecord, type IslandRoute, NAVIGATE_EVENT, type RenderAppRequest, type RenderAppResult, activateIslandViewModels, collectDocumentContribution, collectIslandState, createIslandContainer, describeIsland, getAppContainer, getIslandsSnapshot, hydrateIslandState, isDocumentSource, navigateIsland, onIslandDocument, onIslandNavigate, publishIslandDocument, registerIsland, renderApp, resolveEagerUnits, slotAddress, subscribeIslands };
359
+ export { AppAssets, type CreateIslandContainerOptions, DOCUMENT_EVENT, type DocumentContribution, type DocumentHead, type DocumentSource, ISLAND_ERRORS_KEY, IslandDescriptor, type IslandErrorContext, type IslandErrorPhase, type IslandErrorReport, type IslandRecord, type IslandRoute, NAVIGATE_EVENT, type RenderAppRequest, type RenderAppResult, activateIslandViewModels, collectDocumentContribution, collectIslandState, createIslandContainer, describeIsland, getAppContainer, getIslandsSnapshot, hydrateIslandState, isDocumentSource, navigateIsland, onIslandDocument, onIslandNavigate, publishIslandDocument, registerIsland, renderApp, reportIslandError, resolveEagerUnits, slotAddress, subscribeIslands };
package/island/index.d.ts CHANGED
@@ -69,6 +69,38 @@ interface DocumentSource {
69
69
  */
70
70
  declare function isDocumentSource(value: unknown): value is DocumentSource;
71
71
 
72
+ /**
73
+ * Клиентские падения острова между бандлами.
74
+ *
75
+ * Сетевое приложение оживает своим бандлом, хост — своим. У каждого своя копия модулей,
76
+ * module-level очередь в одной не видна в другой. Шина — массив на `window`.
77
+ *
78
+ * Остров кладёт исходное исключение через {@link reportIslandError}. Хост после Sentry.init
79
+ * сам сливает backlog и при необходимости перехватывает `.push` того же массива. Обёртки
80
+ * нет: стек и тип остаются приложению.
81
+ */
82
+ /** Фаза, на которой остров упал. */
83
+ type IslandErrorPhase = 'render' | 'hydrate' | 'navigate';
84
+ /** Контекст падения острова. */
85
+ interface IslandErrorContext {
86
+ /** Имя приложения из дескриптора. */
87
+ appName: string;
88
+ phase: IslandErrorPhase;
89
+ }
90
+ /** Одна запись очереди: исходное исключение и контекст. */
91
+ interface IslandErrorReport {
92
+ error: unknown;
93
+ context: IslandErrorContext;
94
+ }
95
+ /** Ключ массива на `window` — обязан совпадать у хоста и remote. */
96
+ declare const ISLAND_ERRORS_KEY = "__DEN_ISLAND_ERRORS__";
97
+ /**
98
+ * Кладёт исходное исключение в очередь на `window`.
99
+ *
100
+ * Хост разгребает массив сам (после инициализации наблюдаемости).
101
+ */
102
+ declare function reportIslandError(error: unknown, context: IslandErrorContext): void;
103
+
72
104
  /**
73
105
  * Адрес, по которому рендерится остров.
74
106
  *
@@ -324,4 +356,4 @@ declare function getAppContainer(): Container;
324
356
  */
325
357
  declare function slotAddress(app: string, slot: string): string;
326
358
 
327
- export { AppAssets, type CreateIslandContainerOptions, DOCUMENT_EVENT, type DocumentContribution, type DocumentHead, type DocumentSource, IslandDescriptor, type IslandRecord, type IslandRoute, NAVIGATE_EVENT, type RenderAppRequest, type RenderAppResult, activateIslandViewModels, collectDocumentContribution, collectIslandState, createIslandContainer, describeIsland, getAppContainer, getIslandsSnapshot, hydrateIslandState, isDocumentSource, navigateIsland, onIslandDocument, onIslandNavigate, publishIslandDocument, registerIsland, renderApp, resolveEagerUnits, slotAddress, subscribeIslands };
359
+ export { AppAssets, type CreateIslandContainerOptions, DOCUMENT_EVENT, type DocumentContribution, type DocumentHead, type DocumentSource, ISLAND_ERRORS_KEY, IslandDescriptor, type IslandErrorContext, type IslandErrorPhase, type IslandErrorReport, type IslandRecord, type IslandRoute, NAVIGATE_EVENT, type RenderAppRequest, type RenderAppResult, activateIslandViewModels, collectDocumentContribution, collectIslandState, createIslandContainer, describeIsland, getAppContainer, getIslandsSnapshot, hydrateIslandState, isDocumentSource, navigateIsland, onIslandDocument, onIslandNavigate, publishIslandDocument, registerIsland, renderApp, reportIslandError, resolveEagerUnits, slotAddress, subscribeIslands };
package/island/index.js CHANGED
@@ -23,6 +23,21 @@ import {
23
23
  __spreadValues
24
24
  } from "../chunk-6FNC3XMI.js";
25
25
 
26
+ // src/island/errors.ts
27
+ var ISLAND_ERRORS_KEY = "__DEN_ISLAND_ERRORS__";
28
+ function reportIslandError(error, context) {
29
+ var _a;
30
+ if (typeof window === "undefined") {
31
+ return;
32
+ }
33
+ const w = window;
34
+ const queue = (_a = w[ISLAND_ERRORS_KEY]) != null ? _a : [];
35
+ if (w[ISLAND_ERRORS_KEY] === void 0) {
36
+ w[ISLAND_ERRORS_KEY] = queue;
37
+ }
38
+ queue.push({ context, error });
39
+ }
40
+
26
41
  // src/island/navigate.ts
27
42
  var NAVIGATE_EVENT = "den:navigate";
28
43
  function navigateIsland(node, route) {
@@ -97,6 +112,7 @@ function describeIsland(descriptor, denState) {
97
112
  }
98
113
  export {
99
114
  DOCUMENT_EVENT,
115
+ ISLAND_ERRORS_KEY,
100
116
  NAVIGATE_EVENT,
101
117
  ViewLayerToken,
102
118
  activateIslandViewModels,
@@ -117,6 +133,7 @@ export {
117
133
  publishIslandDocument,
118
134
  registerIsland,
119
135
  renderApp,
136
+ reportIslandError,
120
137
  resolveEagerUnits,
121
138
  resolveViewAdapter,
122
139
  slotAddress,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foxford/den",
3
- "version": "3.2.5",
3
+ "version": "3.3.0",
4
4
  "description": "Den — декларативный метафреймворк Foxford (core runtime)",
5
5
  "keywords": [
6
6
  "foxford",
@@ -134,6 +134,6 @@
134
134
  "view-adapter-BV62bdhM.d.ts",
135
135
  "view-adapter-DF1me25J.d.cts"
136
136
  ],
137
- "sha": "25ef468",
137
+ "sha": "28782dc",
138
138
  "scripts": {}
139
139
  }