@foxford/den 3.2.5-beta-3141d32-20260904 → 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,8 @@ 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`, очередь клиентских падений (`reportIslandError` / `installIslandErrorDrain`) |
308
+ | `@foxford/den/island` | остров: жизненный цикл, шов `renderApp`, порт `ViewAdapter`, очередь клиентских падений (`reportIslandError`) |
309
+
309
310
 
310
311
  | `@foxford/den/serve` | сетевой транспорт: `serveApp`, `appPlugin` |
311
312
  | `@foxford/den/build` | конфиг приложения и сборка: `defineAppConfig`, `buildApp` |
package/island/index.cjs CHANGED
@@ -25,46 +25,17 @@ var _chunkT5QVCXVBcjs = require('../chunk-T5QVCXVB.cjs');
25
25
 
26
26
  // src/island/errors.ts
27
27
  var ISLAND_ERRORS_KEY = "__DEN_ISLAND_ERRORS__";
28
- function denWindow() {
29
- return typeof window === "undefined" ? void 0 : window;
30
- }
31
- function errorsSlot(w) {
32
- const existing = w[ISLAND_ERRORS_KEY];
33
- if (existing !== void 0) {
34
- return existing;
35
- }
36
- const created = [];
37
- w[ISLAND_ERRORS_KEY] = created;
38
- return created;
39
- }
40
28
  function reportIslandError(error, context) {
41
- const w = denWindow();
42
- if (w === void 0) {
43
- return;
44
- }
45
- errorsSlot(w).push({ context, error });
46
- }
47
- function installIslandErrorDrain(drain) {
48
- const w = denWindow();
49
- if (w === void 0) {
50
- return;
51
- }
52
- if (drain === null) {
53
- const empty = [];
54
- w[ISLAND_ERRORS_KEY] = empty;
29
+ var _a;
30
+ if (typeof window === "undefined") {
55
31
  return;
56
32
  }
57
- const current = w[ISLAND_ERRORS_KEY];
58
- const pending = Array.isArray(current) ? current : [];
59
- for (const report of pending) {
60
- drain(report.error, report.context);
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;
61
37
  }
62
- w[ISLAND_ERRORS_KEY] = {
63
- push(report) {
64
- drain(report.error, report.context);
65
- return 1;
66
- }
67
- };
38
+ queue.push({ context, error });
68
39
  }
69
40
 
70
41
  // src/island/navigate.ts
@@ -168,5 +139,4 @@ function describeIsland(descriptor, denState) {
168
139
 
169
140
 
170
141
 
171
-
172
- 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.installIslandErrorDrain = installIslandErrorDrain; 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;
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;
@@ -73,46 +73,33 @@ declare function isDocumentSource(value: unknown): value is DocumentSource;
73
73
  * Клиентские падения острова между бандлами.
74
74
  *
75
75
  * Сетевое приложение оживает своим бандлом, хост — своим. У каждого своя копия модулей,
76
- * module-level очередь в одной не видна в другой. Шина — один ключ на `window`.
76
+ * module-level очередь в одной не видна в другой. Шина — массив на `window`.
77
77
  *
78
- * Остров всегда делает `.push({ error, context })` ({@link reportIslandError}). Пока хоста
79
- * нет — это обычный массив. Хост после Sentry.init зовёт {@link installIslandErrorDrain}:
80
- * сливает backlog и подменяет значение объектом с тем же `.push` — дальше ошибки идут
81
- * сразу в приёмник. Обёртки нет: стек и тип остаются приложению.
78
+ * Остров кладёт исходное исключение через {@link reportIslandError}. Хост после Sentry.init
79
+ * сам сливает backlog и при необходимости перехватывает `.push` того же массива. Обёртки
80
+ * нет: стек и тип остаются приложению.
82
81
  */
83
82
  /** Фаза, на которой остров упал. */
84
83
  type IslandErrorPhase = 'render' | 'hydrate' | 'navigate';
85
- /** Контекст падения острова для приёмника. */
84
+ /** Контекст падения острова. */
86
85
  interface IslandErrorContext {
87
86
  /** Имя приложения из дескриптора. */
88
87
  appName: string;
89
88
  phase: IslandErrorPhase;
90
89
  }
91
- /** Одна запись: исходное исключение и контекст. */
90
+ /** Одна запись очереди: исходное исключение и контекст. */
92
91
  interface IslandErrorReport {
93
92
  error: unknown;
94
93
  context: IslandErrorContext;
95
94
  }
96
- /** Приёмник: хост шлёт в Sentry (или куда угодно). */
97
- type IslandErrorDrain = (error: unknown, context: IslandErrorContext) => void;
98
- /**
99
- * Ключ на `window` — обязан совпадать у хоста и remote.
100
- *
101
- * Значение: массив (до приёмника) либо объект с `push` (после {@link installIslandErrorDrain}).
102
- */
95
+ /** Ключ массива на `window` — обязан совпадать у хоста и remote. */
103
96
  declare const ISLAND_ERRORS_KEY = "__DEN_ISLAND_ERRORS__";
104
97
  /**
105
- * Кладёт исходное исключение в шину на `window`.
98
+ * Кладёт исходное исключение в очередь на `window`.
106
99
  *
107
- * До приёмника — в массив; после — сразу в drain (тот же `.push`).
100
+ * Хост разгребает массив сам (после инициализации наблюдаемости).
108
101
  */
109
102
  declare function reportIslandError(error: unknown, context: IslandErrorContext): void;
110
- /**
111
- * Сливает накопленное и подменяет слот drain-объектом с `.push`.
112
- *
113
- * Зовёт хост после инициализации наблюдаемости. `null` — снимает: снова обычный массив.
114
- */
115
- declare function installIslandErrorDrain(drain: IslandErrorDrain | null): void;
116
103
 
117
104
  /**
118
105
  * Адрес, по которому рендерится остров.
@@ -369,4 +356,4 @@ declare function getAppContainer(): Container;
369
356
  */
370
357
  declare function slotAddress(app: string, slot: string): string;
371
358
 
372
- export { AppAssets, type CreateIslandContainerOptions, DOCUMENT_EVENT, type DocumentContribution, type DocumentHead, type DocumentSource, ISLAND_ERRORS_KEY, IslandDescriptor, type IslandErrorContext, type IslandErrorDrain, type IslandErrorPhase, type IslandErrorReport, type IslandRecord, type IslandRoute, NAVIGATE_EVENT, type RenderAppRequest, type RenderAppResult, activateIslandViewModels, collectDocumentContribution, collectIslandState, createIslandContainer, describeIsland, getAppContainer, getIslandsSnapshot, hydrateIslandState, installIslandErrorDrain, isDocumentSource, navigateIsland, onIslandDocument, onIslandNavigate, publishIslandDocument, registerIsland, renderApp, reportIslandError, 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
@@ -73,46 +73,33 @@ declare function isDocumentSource(value: unknown): value is DocumentSource;
73
73
  * Клиентские падения острова между бандлами.
74
74
  *
75
75
  * Сетевое приложение оживает своим бандлом, хост — своим. У каждого своя копия модулей,
76
- * module-level очередь в одной не видна в другой. Шина — один ключ на `window`.
76
+ * module-level очередь в одной не видна в другой. Шина — массив на `window`.
77
77
  *
78
- * Остров всегда делает `.push({ error, context })` ({@link reportIslandError}). Пока хоста
79
- * нет — это обычный массив. Хост после Sentry.init зовёт {@link installIslandErrorDrain}:
80
- * сливает backlog и подменяет значение объектом с тем же `.push` — дальше ошибки идут
81
- * сразу в приёмник. Обёртки нет: стек и тип остаются приложению.
78
+ * Остров кладёт исходное исключение через {@link reportIslandError}. Хост после Sentry.init
79
+ * сам сливает backlog и при необходимости перехватывает `.push` того же массива. Обёртки
80
+ * нет: стек и тип остаются приложению.
82
81
  */
83
82
  /** Фаза, на которой остров упал. */
84
83
  type IslandErrorPhase = 'render' | 'hydrate' | 'navigate';
85
- /** Контекст падения острова для приёмника. */
84
+ /** Контекст падения острова. */
86
85
  interface IslandErrorContext {
87
86
  /** Имя приложения из дескриптора. */
88
87
  appName: string;
89
88
  phase: IslandErrorPhase;
90
89
  }
91
- /** Одна запись: исходное исключение и контекст. */
90
+ /** Одна запись очереди: исходное исключение и контекст. */
92
91
  interface IslandErrorReport {
93
92
  error: unknown;
94
93
  context: IslandErrorContext;
95
94
  }
96
- /** Приёмник: хост шлёт в Sentry (или куда угодно). */
97
- type IslandErrorDrain = (error: unknown, context: IslandErrorContext) => void;
98
- /**
99
- * Ключ на `window` — обязан совпадать у хоста и remote.
100
- *
101
- * Значение: массив (до приёмника) либо объект с `push` (после {@link installIslandErrorDrain}).
102
- */
95
+ /** Ключ массива на `window` — обязан совпадать у хоста и remote. */
103
96
  declare const ISLAND_ERRORS_KEY = "__DEN_ISLAND_ERRORS__";
104
97
  /**
105
- * Кладёт исходное исключение в шину на `window`.
98
+ * Кладёт исходное исключение в очередь на `window`.
106
99
  *
107
- * До приёмника — в массив; после — сразу в drain (тот же `.push`).
100
+ * Хост разгребает массив сам (после инициализации наблюдаемости).
108
101
  */
109
102
  declare function reportIslandError(error: unknown, context: IslandErrorContext): void;
110
- /**
111
- * Сливает накопленное и подменяет слот drain-объектом с `.push`.
112
- *
113
- * Зовёт хост после инициализации наблюдаемости. `null` — снимает: снова обычный массив.
114
- */
115
- declare function installIslandErrorDrain(drain: IslandErrorDrain | null): void;
116
103
 
117
104
  /**
118
105
  * Адрес, по которому рендерится остров.
@@ -369,4 +356,4 @@ declare function getAppContainer(): Container;
369
356
  */
370
357
  declare function slotAddress(app: string, slot: string): string;
371
358
 
372
- export { AppAssets, type CreateIslandContainerOptions, DOCUMENT_EVENT, type DocumentContribution, type DocumentHead, type DocumentSource, ISLAND_ERRORS_KEY, IslandDescriptor, type IslandErrorContext, type IslandErrorDrain, type IslandErrorPhase, type IslandErrorReport, type IslandRecord, type IslandRoute, NAVIGATE_EVENT, type RenderAppRequest, type RenderAppResult, activateIslandViewModels, collectDocumentContribution, collectIslandState, createIslandContainer, describeIsland, getAppContainer, getIslandsSnapshot, hydrateIslandState, installIslandErrorDrain, isDocumentSource, navigateIsland, onIslandDocument, onIslandNavigate, publishIslandDocument, registerIsland, renderApp, reportIslandError, 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
@@ -25,46 +25,17 @@ import {
25
25
 
26
26
  // src/island/errors.ts
27
27
  var ISLAND_ERRORS_KEY = "__DEN_ISLAND_ERRORS__";
28
- function denWindow() {
29
- return typeof window === "undefined" ? void 0 : window;
30
- }
31
- function errorsSlot(w) {
32
- const existing = w[ISLAND_ERRORS_KEY];
33
- if (existing !== void 0) {
34
- return existing;
35
- }
36
- const created = [];
37
- w[ISLAND_ERRORS_KEY] = created;
38
- return created;
39
- }
40
28
  function reportIslandError(error, context) {
41
- const w = denWindow();
42
- if (w === void 0) {
29
+ var _a;
30
+ if (typeof window === "undefined") {
43
31
  return;
44
32
  }
45
- errorsSlot(w).push({ context, error });
46
- }
47
- function installIslandErrorDrain(drain) {
48
- const w = denWindow();
49
- if (w === void 0) {
50
- return;
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;
51
37
  }
52
- if (drain === null) {
53
- const empty = [];
54
- w[ISLAND_ERRORS_KEY] = empty;
55
- return;
56
- }
57
- const current = w[ISLAND_ERRORS_KEY];
58
- const pending = Array.isArray(current) ? current : [];
59
- for (const report of pending) {
60
- drain(report.error, report.context);
61
- }
62
- w[ISLAND_ERRORS_KEY] = {
63
- push(report) {
64
- drain(report.error, report.context);
65
- return 1;
66
- }
67
- };
38
+ queue.push({ context, error });
68
39
  }
69
40
 
70
41
  // src/island/navigate.ts
@@ -152,7 +123,6 @@ export {
152
123
  getAppContainer,
153
124
  getIslandsSnapshot,
154
125
  hydrateIslandState,
155
- installIslandErrorDrain,
156
126
  isDocumentSource,
157
127
  matchRoute,
158
128
  navigateIsland,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foxford/den",
3
- "version": "3.2.5-beta-3141d32-20260904",
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": "3141d32",
137
+ "sha": "28782dc",
138
138
  "scripts": {}
139
139
  }