@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 +2 -1
- package/island/index.cjs +8 -38
- package/island/index.d.cts +10 -23
- package/island/index.d.ts +10 -23
- package/island/index.js +7 -37
- package/package.json +2 -2
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`
|
|
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
|
-
|
|
42
|
-
if (
|
|
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
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
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;
|
package/island/index.d.cts
CHANGED
|
@@ -73,46 +73,33 @@ declare function isDocumentSource(value: unknown): value is DocumentSource;
|
|
|
73
73
|
* Клиентские падения острова между бандлами.
|
|
74
74
|
*
|
|
75
75
|
* Сетевое приложение оживает своим бандлом, хост — своим. У каждого своя копия модулей,
|
|
76
|
-
* module-level очередь в одной не видна в другой. Шина —
|
|
76
|
+
* module-level очередь в одной не видна в другой. Шина — массив на `window`.
|
|
77
77
|
*
|
|
78
|
-
* Остров
|
|
79
|
-
*
|
|
80
|
-
*
|
|
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
|
-
/**
|
|
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
|
-
* Кладёт исходное исключение в
|
|
98
|
+
* Кладёт исходное исключение в очередь на `window`.
|
|
106
99
|
*
|
|
107
|
-
*
|
|
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
|
|
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 очередь в одной не видна в другой. Шина —
|
|
76
|
+
* module-level очередь в одной не видна в другой. Шина — массив на `window`.
|
|
77
77
|
*
|
|
78
|
-
* Остров
|
|
79
|
-
*
|
|
80
|
-
*
|
|
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
|
-
/**
|
|
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
|
-
* Кладёт исходное исключение в
|
|
98
|
+
* Кладёт исходное исключение в очередь на `window`.
|
|
106
99
|
*
|
|
107
|
-
*
|
|
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
|
|
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
|
-
|
|
42
|
-
if (
|
|
29
|
+
var _a;
|
|
30
|
+
if (typeof window === "undefined") {
|
|
43
31
|
return;
|
|
44
32
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
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.
|
|
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": "
|
|
137
|
+
"sha": "28782dc",
|
|
138
138
|
"scripts": {}
|
|
139
139
|
}
|