@foxford/den 3.1.0 → 3.1.2

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.
Files changed (58) hide show
  1. package/README.mdx +66 -15
  2. package/adapter.cjs +1 -1
  3. package/adapter.d.cts +1 -1
  4. package/adapter.d.ts +1 -1
  5. package/adapter.js +1 -1
  6. package/bin/den.cjs +88 -0
  7. package/bin/den.d.cts +2 -0
  8. package/bin/den.d.ts +2 -0
  9. package/bin/den.js +88 -0
  10. package/builder/index.cjs +12 -0
  11. package/builder/index.d.cts +124 -0
  12. package/builder/index.d.ts +124 -0
  13. package/builder/index.js +12 -0
  14. package/{chunk-KJ6NDOOL.js → chunk-3RX2OSUL.js} +1 -25
  15. package/{chunk-HJO26HIQ.js → chunk-6FNC3XMI.js} +4 -0
  16. package/{chunk-CZVYVNLI.cjs → chunk-6QV4L6R2.cjs} +1 -25
  17. package/chunk-A6ZPAM6Z.cjs +26 -0
  18. package/chunk-LW7IN57F.cjs +358 -0
  19. package/chunk-MCMYOVGT.js +358 -0
  20. package/{chunk-PZVUKTZG.js → chunk-MCN4GFEQ.js} +4 -2
  21. package/{chunk-XHYR3SGG.cjs → chunk-T5QVCXVB.cjs} +5 -1
  22. package/chunk-TPBI6TOU.js +26 -0
  23. package/{chunk-7M5OAOQ4.js → chunk-TPHJUDHG.js} +20 -4
  24. package/{chunk-P4QJCHMM.cjs → chunk-Z5BL4DJA.cjs} +11 -9
  25. package/{chunk-6ZFVV3AV.cjs → chunk-ZOU6W6ZQ.cjs} +31 -15
  26. package/{define-repository-MDEWHqM7.d.cts → define-repository-CwAXed2X.d.cts} +1 -1
  27. package/{define-repository-Ca62_YCy.d.ts → define-repository-q_T4hqeP.d.ts} +1 -1
  28. package/{define-slot-Dil8Kr1A.d.ts → define-slot-Cngzae6i.d.ts} +1 -1
  29. package/{define-slot-BKvArA02.d.cts → define-slot-DYNCLDJY.d.cts} +1 -1
  30. package/define.cjs +6 -4
  31. package/define.d.cts +3 -3
  32. package/define.d.ts +3 -3
  33. package/define.js +6 -4
  34. package/den.js +60 -0
  35. package/{descriptor-DZDNH7R5.d.ts → descriptor-DQ6Gi7A_.d.ts} +31 -3
  36. package/{descriptor-h0JE9jFx.d.cts → descriptor-Dujg_1on.d.cts} +31 -3
  37. package/index.cjs +23 -22
  38. package/index.d.cts +7 -6
  39. package/index.d.ts +7 -6
  40. package/index.js +4 -3
  41. package/island/index.cjs +6 -5
  42. package/island/index.d.cts +13 -6
  43. package/island/index.d.ts +13 -6
  44. package/island/index.js +4 -3
  45. package/package.json +52 -26
  46. package/{routes-CWpIqVAM.d.ts → routes-0uXJ0fux.d.ts} +1 -1
  47. package/{routes-BqIoqbt1.d.cts → routes-B0hDrkiF.d.cts} +1 -1
  48. package/serve/index.cjs +11 -10
  49. package/serve/index.d.cts +4 -4
  50. package/serve/index.d.ts +4 -4
  51. package/serve/index.js +4 -3
  52. package/server-render-CocWXQKC.d.cts +48 -0
  53. package/server-render-CocWXQKC.d.ts +48 -0
  54. package/{types-COwVwgzE.d.cts → types-Dx5qGiwk.d.cts} +1 -1
  55. package/{types-COwVwgzE.d.ts → types-Dx5qGiwk.d.ts} +1 -1
  56. package/{view-adapter-CPI8056c.d.ts → view-adapter-B4gEb-ms.d.ts} +4 -50
  57. package/{view-adapter-D2597RJZ.d.cts → view-adapter-DJ7yB6Ml.d.cts} +4 -50
  58. package/den-serve.js +0 -146
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foxford/den",
3
- "version": "3.1.0",
3
+ "version": "3.1.2",
4
4
  "description": "Den — декларативный метафреймворк Foxford (core runtime)",
5
5
  "keywords": [
6
6
  "foxford",
@@ -20,12 +20,20 @@
20
20
  ],
21
21
  "type": "module",
22
22
  "bin": {
23
- "den-serve": "./den-serve.js"
23
+ "den": "./den.js"
24
24
  },
25
25
  "dependencies": {
26
26
  "fastify": "^5.11.2",
27
- "@foxford/logger": "^1.2.2",
28
- "@foxford/ioc": "^1.1.2"
27
+ "@foxford/ioc": "^1.1.2",
28
+ "@foxford/logger": "^1.2.2"
29
+ },
30
+ "peerDependencies": {
31
+ "vite": ">=5.0.0"
32
+ },
33
+ "peerDependenciesMeta": {
34
+ "vite": {
35
+ "optional": true
36
+ }
29
37
  },
30
38
  "main": "./index.cjs",
31
39
  "module": "./index.js",
@@ -40,6 +48,16 @@
40
48
  "require": "./adapter.cjs",
41
49
  "types": "./adapter.d.ts"
42
50
  },
51
+ "./bin": {
52
+ "import": "./bin/den.js",
53
+ "require": "./bin/den.cjs",
54
+ "types": "./bin/den.d.ts"
55
+ },
56
+ "./build": {
57
+ "import": "./builder/index.js",
58
+ "require": "./builder/index.cjs",
59
+ "types": "./builder/index.d.ts"
60
+ },
43
61
  "./define": {
44
62
  "import": "./define.js",
45
63
  "require": "./define.cjs",
@@ -62,43 +80,51 @@
62
80
  "adapter.d.cts",
63
81
  "adapter.d.ts",
64
82
  "adapter.js",
65
- "chunk-6ZFVV3AV.cjs",
66
- "chunk-7M5OAOQ4.js",
83
+ "bin",
84
+ "builder",
85
+ "chunk-3RX2OSUL.js",
86
+ "chunk-6FNC3XMI.js",
87
+ "chunk-6QV4L6R2.cjs",
88
+ "chunk-A6ZPAM6Z.cjs",
67
89
  "chunk-C7BM4DGX.cjs",
68
- "chunk-CZVYVNLI.cjs",
69
90
  "chunk-E23E2VUC.js",
70
- "chunk-HJO26HIQ.js",
71
- "chunk-KJ6NDOOL.js",
72
- "chunk-P4QJCHMM.cjs",
73
- "chunk-PZVUKTZG.js",
91
+ "chunk-LW7IN57F.cjs",
92
+ "chunk-MCMYOVGT.js",
93
+ "chunk-MCN4GFEQ.js",
94
+ "chunk-T5QVCXVB.cjs",
95
+ "chunk-TPBI6TOU.js",
96
+ "chunk-TPHJUDHG.js",
74
97
  "chunk-WBHHHICS.js",
75
- "chunk-XHYR3SGG.cjs",
76
98
  "chunk-XOJ2VWX4.cjs",
77
- "define-repository-Ca62_YCy.d.ts",
78
- "define-repository-MDEWHqM7.d.cts",
79
- "define-slot-BKvArA02.d.cts",
80
- "define-slot-Dil8Kr1A.d.ts",
99
+ "chunk-Z5BL4DJA.cjs",
100
+ "chunk-ZOU6W6ZQ.cjs",
101
+ "define-repository-CwAXed2X.d.cts",
102
+ "define-repository-q_T4hqeP.d.ts",
103
+ "define-slot-Cngzae6i.d.ts",
104
+ "define-slot-DYNCLDJY.d.cts",
81
105
  "define.cjs",
82
106
  "define.d.cts",
83
107
  "define.d.ts",
84
108
  "define.js",
85
- "den-serve.js",
86
- "descriptor-DZDNH7R5.d.ts",
87
- "descriptor-h0JE9jFx.d.cts",
109
+ "den.js",
110
+ "descriptor-DQ6Gi7A_.d.ts",
111
+ "descriptor-Dujg_1on.d.cts",
88
112
  "index.cjs",
89
113
  "index.d.cts",
90
114
  "index.d.ts",
91
115
  "index.js",
92
116
  "island",
93
117
  "package.json",
94
- "routes-BqIoqbt1.d.cts",
95
- "routes-CWpIqVAM.d.ts",
118
+ "routes-0uXJ0fux.d.ts",
119
+ "routes-B0hDrkiF.d.cts",
96
120
  "serve",
97
- "types-COwVwgzE.d.cts",
98
- "types-COwVwgzE.d.ts",
99
- "view-adapter-CPI8056c.d.ts",
100
- "view-adapter-D2597RJZ.d.cts"
121
+ "server-render-CocWXQKC.d.cts",
122
+ "server-render-CocWXQKC.d.ts",
123
+ "types-Dx5qGiwk.d.cts",
124
+ "types-Dx5qGiwk.d.ts",
125
+ "view-adapter-B4gEb-ms.d.ts",
126
+ "view-adapter-DJ7yB6Ml.d.cts"
101
127
  ],
102
- "sha": "46356bf",
128
+ "sha": "a734341",
103
129
  "scripts": {}
104
130
  }
@@ -1,4 +1,4 @@
1
- import { g as GuardDefinition } from './types-COwVwgzE.js';
1
+ import { G as GuardDefinition } from './types-Dx5qGiwk.js';
2
2
 
3
3
  /** Маршрут с политикой доступа. */
4
4
  interface RouteDeclaration {
@@ -1,4 +1,4 @@
1
- import { g as GuardDefinition } from './types-COwVwgzE.cjs';
1
+ import { G as GuardDefinition } from './types-Dx5qGiwk.cjs';
2
2
 
3
3
  /** Маршрут с политикой доступа. */
4
4
  interface RouteDeclaration {
package/serve/index.cjs CHANGED
@@ -2,14 +2,15 @@
2
2
 
3
3
 
4
4
 
5
- var _chunk6ZFVV3AVcjs = require('../chunk-6ZFVV3AV.cjs');
5
+ var _chunkZOU6W6ZQcjs = require('../chunk-ZOU6W6ZQ.cjs');
6
6
  require('../chunk-XOJ2VWX4.cjs');
7
+ require('../chunk-6QV4L6R2.cjs');
7
8
 
8
9
 
9
- var _chunkCZVYVNLIcjs = require('../chunk-CZVYVNLI.cjs');
10
+ var _chunkA6ZPAM6Zcjs = require('../chunk-A6ZPAM6Z.cjs');
10
11
 
11
12
 
12
- var _chunkXHYR3SGGcjs = require('../chunk-XHYR3SGG.cjs');
13
+ var _chunkT5QVCXVBcjs = require('../chunk-T5QVCXVB.cjs');
13
14
 
14
15
  // src/serve/index.ts
15
16
  var _fastify = require('fastify'); var _fastify2 = _interopRequireDefault(_fastify);
@@ -19,14 +20,14 @@ var _logger = require('@foxford/logger');
19
20
 
20
21
  var DEFAULT_SLOW_RENDER_MS = 1e3;
21
22
  function claim(app) {
22
- return _chunk6ZFVV3AVcjs.normalizeRoutes.call(void 0, app.routes).map((route) => route.source);
23
+ return _chunkZOU6W6ZQcjs.normalizeRoutes.call(void 0, app.routes).map((route) => route.source);
23
24
  }
24
25
  function matchClaim(app, pathname) {
25
26
  var _a, _b;
26
27
  if (claim(app).length === 0) {
27
28
  return {};
28
29
  }
29
- return (_b = (_a = _chunk6ZFVV3AVcjs.matchRoute.call(void 0, app.routes, pathname)) == null ? void 0 : _a.params) != null ? _b : null;
30
+ return (_b = (_a = _chunkZOU6W6ZQcjs.matchRoute.call(void 0, app.routes, pathname)) == null ? void 0 : _a.params) != null ? _b : null;
30
31
  }
31
32
  function parseCookies(header) {
32
33
  const cookies = {};
@@ -62,14 +63,14 @@ function browserContext(req) {
62
63
  var appPlugin = (instance, options) => {
63
64
  var _a, _b;
64
65
  const { app, slowRenderMs = DEFAULT_SLOW_RENDER_MS } = options;
65
- const appLog = (_a = _logger.log.getLogger(app.name)) != null ? _a : _chunkCZVYVNLIcjs.logger;
66
+ const appLog = (_a = _logger.log.getLogger(app.name)) != null ? _a : _chunkA6ZPAM6Zcjs.logger;
66
67
  const serveLog = (_b = appLog.getLogger("serve")) != null ? _b : appLog;
67
68
  instance.get("/_health", () => "ok");
68
69
  instance.get("/_routes", (_req, reply) => {
69
70
  void reply.header("cache-control", "no-store");
70
71
  return claim(app);
71
72
  });
72
- instance.get("/_render", (req, reply) => _chunkXHYR3SGGcjs.__async.call(void 0, null, null, function* () {
73
+ instance.get("/_render", (req, reply) => _chunkT5QVCXVBcjs.__async.call(void 0, null, null, function* () {
73
74
  const target = req.query.url;
74
75
  if (typeof target !== "string" || !target.startsWith("/")) {
75
76
  return reply.code(400).send({ error: "\u043D\u0435 \u043F\u0435\u0440\u0435\u0434\u0430\u043D \u0438\u043B\u0438 \u043D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 url" });
@@ -82,7 +83,7 @@ var appPlugin = (instance, options) => {
82
83
  }
83
84
  const startedAt = Date.now();
84
85
  try {
85
- const result = yield _chunk6ZFVV3AVcjs.renderApp.call(void 0, app, { context: browserContext(req), params, pathname, search });
86
+ const result = yield _chunkZOU6W6ZQcjs.renderApp.call(void 0, app, { context: browserContext(req), params, pathname, search });
86
87
  const elapsed = Date.now() - startedAt;
87
88
  if (elapsed >= slowRenderMs) {
88
89
  serveLog.warn(`\u043C\u0435\u0434\u043B\u0435\u043D\u043D\u044B\u0439 \u0440\u0435\u043D\u0434\u0435\u0440 \xAB${pathname}\xBB: ${String(elapsed)}\u043C\u0441`);
@@ -99,9 +100,9 @@ var appPlugin = (instance, options) => {
99
100
  // src/serve/index.ts
100
101
  var SHUTDOWN_SIGNALS = ["SIGTERM", "SIGINT"];
101
102
  function serveApp(_0) {
102
- return _chunkXHYR3SGGcjs.__async.call(void 0, this, arguments, function* (app, options = {}) {
103
+ return _chunkT5QVCXVBcjs.__async.call(void 0, this, arguments, function* (app, options = {}) {
103
104
  var _a, _b, _c, _d;
104
- const appLog = (_a = _logger.log.getLogger(app.name)) != null ? _a : _chunkCZVYVNLIcjs.logger;
105
+ const appLog = (_a = _logger.log.getLogger(app.name)) != null ? _a : _chunkA6ZPAM6Zcjs.logger;
105
106
  const serveLog = (_b = appLog.getLogger("serve")) != null ? _b : appLog;
106
107
  const instance = _fastify2.default.call(void 0, { logger: false });
107
108
  yield instance.register(appPlugin, { app, slowRenderMs: options.slowRenderMs });
package/serve/index.d.cts CHANGED
@@ -1,8 +1,8 @@
1
- import { I as IslandDescriptor } from '../descriptor-h0JE9jFx.cjs';
2
- import { A as AppRoute } from '../routes-BqIoqbt1.cjs';
1
+ import { I as IslandDescriptor } from '../descriptor-Dujg_1on.cjs';
2
+ import { A as AppRoute } from '../routes-B0hDrkiF.cjs';
3
3
  import { FastifyPluginAsync, FastifyInstance } from 'fastify';
4
- import '../define-slot-BKvArA02.cjs';
5
- import '../types-COwVwgzE.cjs';
4
+ import '../define-slot-DYNCLDJY.cjs';
5
+ import '../types-Dx5qGiwk.cjs';
6
6
  import '@foxford/ioc';
7
7
 
8
8
  /** Приложение, которое можно поднять сервисом: остров плюс его заявка на адреса. */
package/serve/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import { I as IslandDescriptor } from '../descriptor-DZDNH7R5.js';
2
- import { A as AppRoute } from '../routes-CWpIqVAM.js';
1
+ import { I as IslandDescriptor } from '../descriptor-DQ6Gi7A_.js';
2
+ import { A as AppRoute } from '../routes-0uXJ0fux.js';
3
3
  import { FastifyPluginAsync, FastifyInstance } from 'fastify';
4
- import '../define-slot-Dil8Kr1A.js';
5
- import '../types-COwVwgzE.js';
4
+ import '../define-slot-Cngzae6i.js';
5
+ import '../types-Dx5qGiwk.js';
6
6
  import '@foxford/ioc';
7
7
 
8
8
  /** Приложение, которое можно поднять сервисом: остров плюс его заявка на адреса. */
package/serve/index.js CHANGED
@@ -2,14 +2,15 @@ import {
2
2
  matchRoute,
3
3
  normalizeRoutes,
4
4
  renderApp
5
- } from "../chunk-7M5OAOQ4.js";
5
+ } from "../chunk-TPHJUDHG.js";
6
6
  import "../chunk-E23E2VUC.js";
7
+ import "../chunk-3RX2OSUL.js";
7
8
  import {
8
9
  logger
9
- } from "../chunk-KJ6NDOOL.js";
10
+ } from "../chunk-TPBI6TOU.js";
10
11
  import {
11
12
  __async
12
- } from "../chunk-HJO26HIQ.js";
13
+ } from "../chunk-6FNC3XMI.js";
13
14
 
14
15
  // src/serve/index.ts
15
16
  import Fastify from "fastify";
@@ -0,0 +1,48 @@
1
+ /** Что приложение отдало серверным рендером. */
2
+ interface ServerRenderResult {
3
+ /** Разметка дерева — результат переданного рендера. */
4
+ html: string;
5
+ /**
6
+ * Вклад в `<head>` ГОТОВОЙ разметкой: то, что рождается только во время рендера и
7
+ * данными не описывается.
8
+ *
9
+ * Таковы стили CSS-in-JS: стороннее представление у них одно — тег со служебными
10
+ * атрибутами, по которым клиентский рантайм узнаёт свои правила. Разобрав его на поля,
11
+ * потеряешь регидратацию, и стили впрыснутся вторым экземпляром. Поэтому вклад в документ
12
+ * ДАННЫМИ (`DocumentHead` у хостов) остаётся отдельным каналом, а это — разметка.
13
+ *
14
+ * Разметка приезжает в документ хоста ДОСЛОВНО, без экранирования — иначе служебные
15
+ * атрибуты не пережили бы вставку. Отвечает за содержимое приложение: у сетевого
16
+ * транспорта строка приходит из чужого процесса, и хост её не разбирает.
17
+ */
18
+ head?: string;
19
+ }
20
+ /** Рендер дерева в разметку. Его даёт тот, кто серверный рендер исполняет. */
21
+ type RenderTree<Tree = unknown> = (tree: Tree) => string;
22
+ /**
23
+ * Серверный рендер приложения: приложению дают его дерево и рендер, оно возвращает
24
+ * разметку и свой вклад в документ.
25
+ *
26
+ * Рендер приходит АРГУМЕНТОМ, потому что приложение им не владеет: страницу собирает тот,
27
+ * кто держит документ, и приложений на ней может быть несколько. Отдав рендер аргументом,
28
+ * приложение получает обычную функцию — состояние прохода живёт локальной переменной и
29
+ * между запросами не утекает.
30
+ *
31
+ * Подпись одна на оба транспорта, и в этом смысл: у приложения в процессе хоста рендер
32
+ * передаёт хост, у сетевого — его собственный сервер, а `html` и `head` едут ответом.
33
+ * Перевод приложения между транспортами эту часть не задевает.
34
+ *
35
+ * `Tree` — дерево view-фреймворка, для ядра непрозрачное. View-адаптер сужает параметр
36
+ * до своего типа (`ReactServerRender` в `@foxford/den-react`), и приложение пишет проход
37
+ * в терминах СВОЕГО фреймворка.
38
+ *
39
+ * @example
40
+ * serverRender: (tree, render) => {
41
+ * const sheet = new ServerStyleSheet()
42
+ *
43
+ * return { head: sheet.getStyleTags(), html: render(sheet.collectStyles(tree)) }
44
+ * }
45
+ */
46
+ type ServerRender<Tree = unknown> = (tree: Tree, render: RenderTree<Tree>) => ServerRenderResult;
47
+
48
+ export type { RenderTree as R, ServerRenderResult as S, ServerRender as a };
@@ -0,0 +1,48 @@
1
+ /** Что приложение отдало серверным рендером. */
2
+ interface ServerRenderResult {
3
+ /** Разметка дерева — результат переданного рендера. */
4
+ html: string;
5
+ /**
6
+ * Вклад в `<head>` ГОТОВОЙ разметкой: то, что рождается только во время рендера и
7
+ * данными не описывается.
8
+ *
9
+ * Таковы стили CSS-in-JS: стороннее представление у них одно — тег со служебными
10
+ * атрибутами, по которым клиентский рантайм узнаёт свои правила. Разобрав его на поля,
11
+ * потеряешь регидратацию, и стили впрыснутся вторым экземпляром. Поэтому вклад в документ
12
+ * ДАННЫМИ (`DocumentHead` у хостов) остаётся отдельным каналом, а это — разметка.
13
+ *
14
+ * Разметка приезжает в документ хоста ДОСЛОВНО, без экранирования — иначе служебные
15
+ * атрибуты не пережили бы вставку. Отвечает за содержимое приложение: у сетевого
16
+ * транспорта строка приходит из чужого процесса, и хост её не разбирает.
17
+ */
18
+ head?: string;
19
+ }
20
+ /** Рендер дерева в разметку. Его даёт тот, кто серверный рендер исполняет. */
21
+ type RenderTree<Tree = unknown> = (tree: Tree) => string;
22
+ /**
23
+ * Серверный рендер приложения: приложению дают его дерево и рендер, оно возвращает
24
+ * разметку и свой вклад в документ.
25
+ *
26
+ * Рендер приходит АРГУМЕНТОМ, потому что приложение им не владеет: страницу собирает тот,
27
+ * кто держит документ, и приложений на ней может быть несколько. Отдав рендер аргументом,
28
+ * приложение получает обычную функцию — состояние прохода живёт локальной переменной и
29
+ * между запросами не утекает.
30
+ *
31
+ * Подпись одна на оба транспорта, и в этом смысл: у приложения в процессе хоста рендер
32
+ * передаёт хост, у сетевого — его собственный сервер, а `html` и `head` едут ответом.
33
+ * Перевод приложения между транспортами эту часть не задевает.
34
+ *
35
+ * `Tree` — дерево view-фреймворка, для ядра непрозрачное. View-адаптер сужает параметр
36
+ * до своего типа (`ReactServerRender` в `@foxford/den-react`), и приложение пишет проход
37
+ * в терминах СВОЕГО фреймворка.
38
+ *
39
+ * @example
40
+ * serverRender: (tree, render) => {
41
+ * const sheet = new ServerStyleSheet()
42
+ *
43
+ * return { head: sheet.getStyleTags(), html: render(sheet.collectStyles(tree)) }
44
+ * }
45
+ */
46
+ type ServerRender<Tree = unknown> = (tree: Tree, render: RenderTree<Tree>) => ServerRenderResult;
47
+
48
+ export type { RenderTree as R, ServerRenderResult as S, ServerRender as a };
@@ -774,4 +774,4 @@ declare const ActivatableToken: Token<Activatable>;
774
774
  */
775
775
  declare const RequestContextToken: Token<RequestContext>;
776
776
 
777
- export { type ActionGuard as A, type RepositoryDefinition as B, type Core as C, type Disposable as D, type ExtensionConfig as E, RequestContextToken as F, type GuardRunner as G, type ServiceDefinition as H, type SlotEntry as I, SlotRegistry as J, SlotRegistryToken as K, type LeaveGuardResult as L, StateCache as M, type NavigationManager as N, type StateParticipant as O, StateRegistry as P, StateRegistryToken as Q, type RequestContext as R, type StateSerializer as S, StateSerializerToken as T, type ViewModelDefinition as V, type ContainerManager as a, type Guard as b, type GuardResult as c, type NavigationEntry as d, type NavigationInterceptor as e, type DefineGuardOptions as f, type GuardDefinition as g, type DefineExtensionOptions as h, type ExtensionDefinition as i, type DefineActionGuardOptions as j, type ActionGuardDefinition as k, type LayoutConfig as l, type DefineLayoutOptions as m, type LayoutDefinition as n, type LayerConfig as o, type DefineLayerOptions as p, type LayerDefinition as q, type Activatable as r, ActivatableToken as s, ContainerManagerToken as t, type DefineRepositoryOptions as u, type DefineServiceOptions as v, type DefineViewModelOptions as w, type Definition as x, GuardRunnerToken as y, NavigationManagerToken as z };
777
+ export { type ActionGuard as A, type Activatable as B, type Core as C, type DefineRepositoryOptions as D, type ExtensionConfig as E, ActivatableToken as F, type GuardDefinition as G, ContainerManagerToken as H, GuardRunnerToken as I, NavigationManagerToken as J, RequestContextToken as K, type LayerDefinition as L, StateCache as M, type NavigationManager as N, type StateParticipant as O, StateRegistry as P, StateRegistryToken as Q, type RequestContext as R, type ServiceDefinition as S, StateSerializerToken as T, type ViewModelDefinition as V, type DefineServiceOptions as a, type DefineViewModelOptions as b, type Definition as c, type RepositoryDefinition as d, type SlotEntry as e, SlotRegistry as f, SlotRegistryToken as g, type LayerConfig as h, type ContainerManager as i, type GuardRunner as j, type Guard as k, type GuardResult as l, type NavigationEntry as m, type NavigationInterceptor as n, type Disposable as o, type LeaveGuardResult as p, type StateSerializer as q, type DefineGuardOptions as r, type DefineExtensionOptions as s, type ExtensionDefinition as t, type DefineActionGuardOptions as u, type ActionGuardDefinition as v, type LayoutConfig as w, type DefineLayoutOptions as x, type LayoutDefinition as y, type DefineLayerOptions as z };
@@ -774,4 +774,4 @@ declare const ActivatableToken: Token<Activatable>;
774
774
  */
775
775
  declare const RequestContextToken: Token<RequestContext>;
776
776
 
777
- export { type ActionGuard as A, type RepositoryDefinition as B, type Core as C, type Disposable as D, type ExtensionConfig as E, RequestContextToken as F, type GuardRunner as G, type ServiceDefinition as H, type SlotEntry as I, SlotRegistry as J, SlotRegistryToken as K, type LeaveGuardResult as L, StateCache as M, type NavigationManager as N, type StateParticipant as O, StateRegistry as P, StateRegistryToken as Q, type RequestContext as R, type StateSerializer as S, StateSerializerToken as T, type ViewModelDefinition as V, type ContainerManager as a, type Guard as b, type GuardResult as c, type NavigationEntry as d, type NavigationInterceptor as e, type DefineGuardOptions as f, type GuardDefinition as g, type DefineExtensionOptions as h, type ExtensionDefinition as i, type DefineActionGuardOptions as j, type ActionGuardDefinition as k, type LayoutConfig as l, type DefineLayoutOptions as m, type LayoutDefinition as n, type LayerConfig as o, type DefineLayerOptions as p, type LayerDefinition as q, type Activatable as r, ActivatableToken as s, ContainerManagerToken as t, type DefineRepositoryOptions as u, type DefineServiceOptions as v, type DefineViewModelOptions as w, type Definition as x, GuardRunnerToken as y, NavigationManagerToken as z };
777
+ export { type ActionGuard as A, type Activatable as B, type Core as C, type DefineRepositoryOptions as D, type ExtensionConfig as E, ActivatableToken as F, type GuardDefinition as G, ContainerManagerToken as H, GuardRunnerToken as I, NavigationManagerToken as J, RequestContextToken as K, type LayerDefinition as L, StateCache as M, type NavigationManager as N, type StateParticipant as O, StateRegistry as P, StateRegistryToken as Q, type RequestContext as R, type ServiceDefinition as S, StateSerializerToken as T, type ViewModelDefinition as V, type DefineServiceOptions as a, type DefineViewModelOptions as b, type Definition as c, type RepositoryDefinition as d, type SlotEntry as e, SlotRegistry as f, SlotRegistryToken as g, type LayerConfig as h, type ContainerManager as i, type GuardRunner as j, type Guard as k, type GuardResult as l, type NavigationEntry as m, type NavigationInterceptor as n, type Disposable as o, type LeaveGuardResult as p, type StateSerializer as q, type DefineGuardOptions as r, type DefineExtensionOptions as s, type ExtensionDefinition as t, type DefineActionGuardOptions as u, type ActionGuardDefinition as v, type LayoutConfig as w, type DefineLayoutOptions as x, type LayoutDefinition as y, type DefineLayerOptions as z };
@@ -1,54 +1,8 @@
1
- import { I as IslandDescriptor } from './descriptor-DZDNH7R5.js';
2
- import { q as LayerDefinition, o as LayerConfig } from './types-COwVwgzE.js';
1
+ import { I as IslandDescriptor } from './descriptor-DQ6Gi7A_.js';
2
+ import { S as ServerRenderResult } from './server-render-CocWXQKC.js';
3
+ import { L as LayerDefinition, h as LayerConfig } from './types-Dx5qGiwk.js';
3
4
  import { Container, Token } from '@foxford/ioc';
4
5
 
5
- /** Что приложение отдало серверным рендером. */
6
- interface ServerRenderResult {
7
- /** Разметка дерева — результат переданного рендера. */
8
- html: string;
9
- /**
10
- * Вклад в `<head>` ГОТОВОЙ разметкой: то, что рождается только во время рендера и
11
- * данными не описывается.
12
- *
13
- * Таковы стили CSS-in-JS: стороннее представление у них одно — тег со служебными
14
- * атрибутами, по которым клиентский рантайм узнаёт свои правила. Разобрав его на поля,
15
- * потеряешь регидратацию, и стили впрыснутся вторым экземпляром. Поэтому вклад в документ
16
- * ДАННЫМИ (`DocumentHead` у хостов) остаётся отдельным каналом, а это — разметка.
17
- *
18
- * Разметка приезжает в документ хоста ДОСЛОВНО, без экранирования — иначе служебные
19
- * атрибуты не пережили бы вставку. Отвечает за содержимое приложение: у сетевого
20
- * транспорта строка приходит из чужого процесса, и хост её не разбирает.
21
- */
22
- head?: string;
23
- }
24
- /** Рендер дерева в разметку. Его даёт тот, кто серверный рендер исполняет. */
25
- type RenderTree<Tree = unknown> = (tree: Tree) => string;
26
- /**
27
- * Серверный рендер приложения: приложению дают его дерево и рендер, оно возвращает
28
- * разметку и свой вклад в документ.
29
- *
30
- * Рендер приходит АРГУМЕНТОМ, потому что приложение им не владеет: страницу собирает тот,
31
- * кто держит документ, и приложений на ней может быть несколько. Отдав рендер аргументом,
32
- * приложение получает обычную функцию — состояние прохода живёт локальной переменной и
33
- * между запросами не утекает.
34
- *
35
- * Подпись одна на оба транспорта, и в этом смысл: у приложения в процессе хоста рендер
36
- * передаёт хост, у сетевого — его собственный сервер, а `html` и `head` едут ответом.
37
- * Перевод приложения между транспортами эту часть не задевает.
38
- *
39
- * `Tree` — дерево view-фреймворка, для ядра непрозрачное. View-адаптер сужает параметр
40
- * до своего типа (`ReactServerRender` в `@foxford/den-react`), и приложение пишет проход
41
- * в терминах СВОЕГО фреймворка.
42
- *
43
- * @example
44
- * serverRender: (tree, render) => {
45
- * const sheet = new ServerStyleSheet()
46
- *
47
- * return { head: sheet.getStyleTags(), html: render(sheet.collectStyles(tree)) }
48
- * }
49
- */
50
- type ServerRender<Tree = unknown> = (tree: Tree, render: RenderTree<Tree>) => ServerRenderResult;
51
-
52
6
  /** Что нужно адаптеру, чтобы отрисовать остров на сервере. */
53
7
  interface RenderIslandOptions {
54
8
  /** Контейнер острова — уже собранный, с активированными VM. */
@@ -120,4 +74,4 @@ declare function viewAdapterOf(layer: ViewLayerDefinition): ViewAdapter;
120
74
  */
121
75
  declare function resolveViewAdapter(container: Container): ViewAdapter;
122
76
 
123
- export { type RenderIslandOptions as R, type ServerRender as S, type ViewAdapter as V, type ViewLayerDefinition as a, ViewLayerToken as b, type RenderTree as c, type ServerRenderResult as d, resolveViewAdapter as r, viewAdapterOf as v };
77
+ export { type RenderIslandOptions as R, type ViewAdapter as V, type ViewLayerDefinition as a, ViewLayerToken as b, resolveViewAdapter as r, viewAdapterOf as v };
@@ -1,54 +1,8 @@
1
- import { I as IslandDescriptor } from './descriptor-h0JE9jFx.cjs';
2
- import { q as LayerDefinition, o as LayerConfig } from './types-COwVwgzE.cjs';
1
+ import { I as IslandDescriptor } from './descriptor-Dujg_1on.cjs';
2
+ import { S as ServerRenderResult } from './server-render-CocWXQKC.cjs';
3
+ import { L as LayerDefinition, h as LayerConfig } from './types-Dx5qGiwk.cjs';
3
4
  import { Container, Token } from '@foxford/ioc';
4
5
 
5
- /** Что приложение отдало серверным рендером. */
6
- interface ServerRenderResult {
7
- /** Разметка дерева — результат переданного рендера. */
8
- html: string;
9
- /**
10
- * Вклад в `<head>` ГОТОВОЙ разметкой: то, что рождается только во время рендера и
11
- * данными не описывается.
12
- *
13
- * Таковы стили CSS-in-JS: стороннее представление у них одно — тег со служебными
14
- * атрибутами, по которым клиентский рантайм узнаёт свои правила. Разобрав его на поля,
15
- * потеряешь регидратацию, и стили впрыснутся вторым экземпляром. Поэтому вклад в документ
16
- * ДАННЫМИ (`DocumentHead` у хостов) остаётся отдельным каналом, а это — разметка.
17
- *
18
- * Разметка приезжает в документ хоста ДОСЛОВНО, без экранирования — иначе служебные
19
- * атрибуты не пережили бы вставку. Отвечает за содержимое приложение: у сетевого
20
- * транспорта строка приходит из чужого процесса, и хост её не разбирает.
21
- */
22
- head?: string;
23
- }
24
- /** Рендер дерева в разметку. Его даёт тот, кто серверный рендер исполняет. */
25
- type RenderTree<Tree = unknown> = (tree: Tree) => string;
26
- /**
27
- * Серверный рендер приложения: приложению дают его дерево и рендер, оно возвращает
28
- * разметку и свой вклад в документ.
29
- *
30
- * Рендер приходит АРГУМЕНТОМ, потому что приложение им не владеет: страницу собирает тот,
31
- * кто держит документ, и приложений на ней может быть несколько. Отдав рендер аргументом,
32
- * приложение получает обычную функцию — состояние прохода живёт локальной переменной и
33
- * между запросами не утекает.
34
- *
35
- * Подпись одна на оба транспорта, и в этом смысл: у приложения в процессе хоста рендер
36
- * передаёт хост, у сетевого — его собственный сервер, а `html` и `head` едут ответом.
37
- * Перевод приложения между транспортами эту часть не задевает.
38
- *
39
- * `Tree` — дерево view-фреймворка, для ядра непрозрачное. View-адаптер сужает параметр
40
- * до своего типа (`ReactServerRender` в `@foxford/den-react`), и приложение пишет проход
41
- * в терминах СВОЕГО фреймворка.
42
- *
43
- * @example
44
- * serverRender: (tree, render) => {
45
- * const sheet = new ServerStyleSheet()
46
- *
47
- * return { head: sheet.getStyleTags(), html: render(sheet.collectStyles(tree)) }
48
- * }
49
- */
50
- type ServerRender<Tree = unknown> = (tree: Tree, render: RenderTree<Tree>) => ServerRenderResult;
51
-
52
6
  /** Что нужно адаптеру, чтобы отрисовать остров на сервере. */
53
7
  interface RenderIslandOptions {
54
8
  /** Контейнер острова — уже собранный, с активированными VM. */
@@ -120,4 +74,4 @@ declare function viewAdapterOf(layer: ViewLayerDefinition): ViewAdapter;
120
74
  */
121
75
  declare function resolveViewAdapter(container: Container): ViewAdapter;
122
76
 
123
- export { type RenderIslandOptions as R, type ServerRender as S, type ViewAdapter as V, type ViewLayerDefinition as a, ViewLayerToken as b, type RenderTree as c, type ServerRenderResult as d, resolveViewAdapter as r, viewAdapterOf as v };
77
+ export { type RenderIslandOptions as R, type ViewAdapter as V, type ViewLayerDefinition as a, ViewLayerToken as b, resolveViewAdapter as r, viewAdapterOf as v };