@foxford/den 3.2.3 → 3.2.5

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
@@ -177,16 +177,18 @@ describeDocument(): DocumentContribution {
177
177
 
178
178
  Рантайм вокруг дескриптора отдаёт три ручки:
179
179
 
180
- | Ручка | Ответ |
181
- | --- | --- |
182
- | `GET /_render?url=<path+search>` | `200` + ответ `renderApp` телом |
183
- | `GET /_routes` | `200` + массив regex-строк заявки на адреса |
184
- | `GET /_health` | `200 ok` |
180
+ | Ручка | Ответ |
181
+ | -------------------------------- | ------------------------------------------- |
182
+ | `GET /_render?url=<path+search>` | `200` + ответ `renderApp` телом |
183
+ | `GET /_routes` | `200` + массив regex-строк заявки на адреса |
184
+ | `GET /_health` | `200 ok` |
185
185
 
186
186
  **Статус HTTP описывает транспорт, а исход страницы едет полем `status` в теле.** `200` значит
187
187
  «приложение ответило» — хоть `404`, хоть редиректом. Всё остальное значит «до приложения не
188
188
  дошли»: `400` — сломанный запрос, `404` — неизвестная ручка или путь вне заявки, `500` — рендер
189
- упал. Так `404` от приложения не путается с `404` от неверно настроенного прокси.
189
+ упал. Так `404` от приложения не путается с `404` от неверно настроенного прокси. Упавший
190
+ рендер уходит как `reply.send(error)`: Fastify зовёт `onError` у потребителя с исходным
191
+ исключением; тело — стандартный JSON ошибки Fastify.
190
192
 
191
193
  Браузерные заголовки рантайм читает только из `X-Forwarded-*` и кладёт в `RequestContextToken`;
192
194
  `Cookie` — обычным именем.
@@ -262,6 +264,7 @@ export default defineAppConfig({
262
264
  render: (tree, render) => ({ head: sheet.getStyleTags(), html: render(sheet.collectStyles(tree)) }),
263
265
  container: (c) => c.bind(HttpConfigToken).toValue({ baseUrl: process.env.API_ORIGIN }),
264
266
  configure: (instance) => Sentry.setupFastifyErrorHandler(instance),
267
+ external: ['@foxford/den-sentry'],
265
268
  noExternal: ['@foxford/ui', 'styled-components'],
266
269
  },
267
270
  })
@@ -270,11 +273,11 @@ export default defineAppConfig({
270
273
  `den build [--root <каталог>] [--base <префикс>]` выпускает три выхода, `den dev` — то же плюс
271
274
  подъём процесса и пересборка на изменение исходников:
272
275
 
273
- | Выход | Что внутри | Кто потребляет |
274
- | --- | --- | --- |
275
- | `build/client` | браузерный бандл и манифест | браузер, по ссылкам из ответа рендера |
276
- | `build/server` | дескриптор с вплавленными серверными кусками конфига | хост, импортом в своём процессе |
277
- | `build/server.mjs` | тот же дескриптор под сетевым рантаймом | `node build/server.mjs` |
276
+ | Выход | Что внутри | Кто потребляет |
277
+ | ------------------ | ---------------------------------------------------- | ------------------------------------- |
278
+ | `build/client` | браузерный бандл и манифест | браузер, по ссылкам из ответа рендера |
279
+ | `build/server` | дескриптор с вплавленными серверными кусками конфига | хост, импортом в своём процессе |
280
+ | `build/server.mjs` | тот же дескриптор под сетевым рантаймом | `node build/server.mjs` |
278
281
 
279
282
  **Про фреймворк команда не знает.** Чем собирать и чем оживлять, приносит пресет из пакета
280
283
  адаптера, поэтому приложение на другом фреймворке подключается своим пресетом и в командах не
@@ -297,12 +300,12 @@ export default defineAppConfig({
297
300
 
298
301
  ## Подпути
299
302
 
300
- | Подпуть | Что там |
301
- | --- | --- |
302
- | `@foxford/den` | рантайм, `define*`, менеджеры контейнеров и состояния |
303
- | `@foxford/den/define` | те же `define*` без сайд-эффекта установки резолвера |
304
- | `@foxford/den/adapter` | шов резолва для адаптеров хостов |
305
- | `@foxford/den/island` | остров: жизненный цикл, шов `renderApp`, порт `ViewAdapter` |
306
- | `@foxford/den/serve` | сетевой транспорт: `serveApp`, `appPlugin` |
307
- | `@foxford/den/build` | конфиг приложения и сборка: `defineAppConfig`, `buildApp` |
308
- | `@foxford/den/bin` | точка входа команды `den` |
303
+ | Подпуть | Что там |
304
+ | ---------------------- | ----------------------------------------------------------- |
305
+ | `@foxford/den` | рантайм, `define*`, менеджеры контейнеров и состояния |
306
+ | `@foxford/den/define` | те же `define*` без сайд-эффекта установки резолвера |
307
+ | `@foxford/den/adapter` | шов резолва для адаптеров хостов |
308
+ | `@foxford/den/island` | остров: жизненный цикл, шов `renderApp`, порт `ViewAdapter` |
309
+ | `@foxford/den/serve` | сетевой транспорт: `serveApp`, `appPlugin` |
310
+ | `@foxford/den/build` | конфиг приложения и сборка: `defineAppConfig`, `buildApp` |
311
+ | `@foxford/den/bin` | точка входа команды `den` |
package/bin/den.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
 
4
- var _chunk3X4WVHUUcjs = require('../chunk-3X4WVHUU.cjs');
4
+ var _chunkG6RT4EBOcjs = require('../chunk-G6RT4EBO.cjs');
5
5
  require('../chunk-KQAB6C6Q.cjs');
6
6
  require('../chunk-A6ZPAM6Z.cjs');
7
7
 
@@ -70,11 +70,11 @@ function run(argv) {
70
70
  }
71
71
  const target = { base: options["base"], root: (_a = options["root"]) != null ? _a : process.cwd() };
72
72
  if (command === "build") {
73
- yield _chunk3X4WVHUUcjs.buildApp.call(void 0, target);
73
+ yield _chunkG6RT4EBOcjs.buildApp.call(void 0, target);
74
74
  return;
75
75
  }
76
76
  if (command === "dev") {
77
- yield _chunk3X4WVHUUcjs.devApp.call(void 0, target);
77
+ yield _chunkG6RT4EBOcjs.devApp.call(void 0, target);
78
78
  return;
79
79
  }
80
80
  fail(`\u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043A\u043E\u043C\u0430\u043D\u0434\u0430 \xAB${command}\xBB`);
package/bin/den.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  buildApp,
3
3
  devApp
4
- } from "../chunk-XU5HUIPK.js";
4
+ } from "../chunk-4XR6EUOW.js";
5
5
  import "../chunk-RG7ZV5BD.js";
6
6
  import "../chunk-TPBI6TOU.js";
7
7
  import {
package/builder/index.cjs CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- var _chunk3X4WVHUUcjs = require('../chunk-3X4WVHUU.cjs');
5
+ var _chunkG6RT4EBOcjs = require('../chunk-G6RT4EBO.cjs');
6
6
  require('../chunk-KQAB6C6Q.cjs');
7
7
  require('../chunk-A6ZPAM6Z.cjs');
8
8
  require('../chunk-T5QVCXVB.cjs');
@@ -10,4 +10,4 @@ require('../chunk-T5QVCXVB.cjs');
10
10
 
11
11
 
12
12
 
13
- exports.buildApp = _chunk3X4WVHUUcjs.buildApp; exports.defineAppConfig = _chunk3X4WVHUUcjs.defineAppConfig; exports.devApp = _chunk3X4WVHUUcjs.devApp;
13
+ exports.buildApp = _chunkG6RT4EBOcjs.buildApp; exports.defineAppConfig = _chunkG6RT4EBOcjs.defineAppConfig; exports.devApp = _chunkG6RT4EBOcjs.devApp;
@@ -75,6 +75,16 @@ interface AppServerConfig {
75
75
  * default-экспорта разъезжается, и вместо фабрики приходит пространство имён модуля.
76
76
  */
77
77
  noExternal?: Array<string | RegExp>;
78
+ /**
79
+ * Зависимости, которые серверный выход обязан оставить ВНЕШНИМИ, а не вплавить в бандл.
80
+ *
81
+ * Типичный случай — `@foxford/den-sentry`: вместе с ним в бандл уезжают `@sentry/node` и
82
+ * хуки `require`, а внутри `server.mjs` с top-level await их голый `require` даёт
83
+ * `ERR_AMBIGUOUS_MODULE_SYNTAX`. Пакет из npm остаётся снаружи целиком — транзитив
84
+ * грузится уже из его `node_modules`. Должен резолвиться из корня приложения (прямая
85
+ * зависимость в `package.json`).
86
+ */
87
+ external?: Array<string | RegExp>;
78
88
  }
79
89
  /** Конфиг приложения. */
80
90
  interface AppConfig {
@@ -75,6 +75,16 @@ interface AppServerConfig {
75
75
  * default-экспорта разъезжается, и вместо фабрики приходит пространство имён модуля.
76
76
  */
77
77
  noExternal?: Array<string | RegExp>;
78
+ /**
79
+ * Зависимости, которые серверный выход обязан оставить ВНЕШНИМИ, а не вплавить в бандл.
80
+ *
81
+ * Типичный случай — `@foxford/den-sentry`: вместе с ним в бандл уезжают `@sentry/node` и
82
+ * хуки `require`, а внутри `server.mjs` с top-level await их голый `require` даёт
83
+ * `ERR_AMBIGUOUS_MODULE_SYNTAX`. Пакет из npm остаётся снаружи целиком — транзитив
84
+ * грузится уже из его `node_modules`. Должен резолвиться из корня приложения (прямая
85
+ * зависимость в `package.json`).
86
+ */
87
+ external?: Array<string | RegExp>;
78
88
  }
79
89
  /** Конфиг приложения. */
80
90
  interface AppConfig {
package/builder/index.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  buildApp,
3
3
  defineAppConfig,
4
4
  devApp
5
- } from "../chunk-XU5HUIPK.js";
5
+ } from "../chunk-4XR6EUOW.js";
6
6
  import "../chunk-RG7ZV5BD.js";
7
7
  import "../chunk-TPBI6TOU.js";
8
8
  import "../chunk-6FNC3XMI.js";
@@ -203,9 +203,10 @@ function dependenciesOf(root) {
203
203
  return [...Object.keys((_a = manifest.dependencies) != null ? _a : {}), ...Object.keys((_b = manifest.devDependencies) != null ? _b : {})];
204
204
  }
205
205
  function viteConfigFor(options) {
206
- var _a, _b, _c, _d, _e;
206
+ var _a, _b, _c, _d, _e, _f, _g;
207
207
  const { assets, base, config, configPath, entryFileNames, input, mode, outDir, root, target } = options;
208
208
  const entry = (_a = config.entry) != null ? _a : "src/index.ts";
209
+ const external = (_c = (_b = config.server) == null ? void 0 : _b.external) != null ? _c : [];
209
210
  const composed = {
210
211
  // Сборщику относительный префикс, если своего нет: ленивые чанки тогда грузятся от адреса
211
212
  // уже загруженного чанка, и подмена CDN уводит за собой и их
@@ -220,7 +221,7 @@ function viteConfigFor(options) {
220
221
  // к файлу, а входы у нас виртуальные — их резолвит плагин
221
222
  rollupOptions: __spreadValues(__spreadValues({
222
223
  input
223
- }, target === "server" ? { external: [ENGINE] } : {}), entryFileNames === void 0 ? {} : { output: { entryFileNames } }),
224
+ }, target === "server" ? { external: [ENGINE, ...external] } : {}), entryFileNames === void 0 ? {} : { output: { entryFileNames } }),
224
225
  ssr: target === "server"
225
226
  },
226
227
  configFile: false,
@@ -228,11 +229,14 @@ function viteConfigFor(options) {
228
229
  // программный вызов он иначе не доедет.
229
230
  mode,
230
231
  plugins: [
231
- ...(_c = (_b = config.preset) == null ? void 0 : _b.plugins) != null ? _c : [],
232
+ ...(_e = (_d = config.preset) == null ? void 0 : _d.plugins) != null ? _e : [],
232
233
  denAppModules({ assets, base, config, configPath, entry: path2.join(root, entry), mode })
233
234
  ],
234
235
  root,
235
- ssr: { noExternal: (_e = (_d = config.server) == null ? void 0 : _d.noExternal) != null ? _e : [] }
236
+ ssr: {
237
+ external,
238
+ noExternal: (_g = (_f = config.server) == null ? void 0 : _f.noExternal) != null ? _g : []
239
+ }
236
240
  };
237
241
  return config.vite ? config.vite(composed, target) : composed;
238
242
  }
@@ -203,9 +203,10 @@ function dependenciesOf(root) {
203
203
  return [...Object.keys((_a = manifest.dependencies) != null ? _a : {}), ...Object.keys((_b = manifest.devDependencies) != null ? _b : {})];
204
204
  }
205
205
  function viteConfigFor(options) {
206
- var _a, _b, _c, _d, _e;
206
+ var _a, _b, _c, _d, _e, _f, _g;
207
207
  const { assets, base, config, configPath, entryFileNames, input, mode, outDir, root, target } = options;
208
208
  const entry = (_a = config.entry) != null ? _a : "src/index.ts";
209
+ const external = (_c = (_b = config.server) == null ? void 0 : _b.external) != null ? _c : [];
209
210
  const composed = {
210
211
  // Сборщику относительный префикс, если своего нет: ленивые чанки тогда грузятся от адреса
211
212
  // уже загруженного чанка, и подмена CDN уводит за собой и их
@@ -220,7 +221,7 @@ function viteConfigFor(options) {
220
221
  // к файлу, а входы у нас виртуальные — их резолвит плагин
221
222
  rollupOptions: _chunkT5QVCXVBcjs.__spreadValues.call(void 0, _chunkT5QVCXVBcjs.__spreadValues.call(void 0, {
222
223
  input
223
- }, target === "server" ? { external: [ENGINE] } : {}), entryFileNames === void 0 ? {} : { output: { entryFileNames } }),
224
+ }, target === "server" ? { external: [ENGINE, ...external] } : {}), entryFileNames === void 0 ? {} : { output: { entryFileNames } }),
224
225
  ssr: target === "server"
225
226
  },
226
227
  configFile: false,
@@ -228,11 +229,14 @@ function viteConfigFor(options) {
228
229
  // программный вызов он иначе не доедет.
229
230
  mode,
230
231
  plugins: [
231
- ...(_c = (_b = config.preset) == null ? void 0 : _b.plugins) != null ? _c : [],
232
+ ...(_e = (_d = config.preset) == null ? void 0 : _d.plugins) != null ? _e : [],
232
233
  denAppModules({ assets, base, config, configPath, entry: _path2.default.join(root, entry), mode })
233
234
  ],
234
235
  root,
235
- ssr: { noExternal: (_e = (_d = config.server) == null ? void 0 : _d.noExternal) != null ? _e : [] }
236
+ ssr: {
237
+ external,
238
+ noExternal: (_g = (_f = config.server) == null ? void 0 : _f.noExternal) != null ? _g : []
239
+ }
236
240
  };
237
241
  return config.vite ? config.vite(composed, target) : composed;
238
242
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foxford/den",
3
- "version": "3.2.3",
3
+ "version": "3.2.5",
4
4
  "description": "Den — декларативный метафреймворк Foxford (core runtime)",
5
5
  "keywords": [
6
6
  "foxford",
@@ -90,13 +90,14 @@
90
90
  "bin",
91
91
  "builder",
92
92
  "chunk-3RX2OSUL.js",
93
- "chunk-3X4WVHUU.cjs",
93
+ "chunk-4XR6EUOW.js",
94
94
  "chunk-6FNC3XMI.js",
95
95
  "chunk-6QV4L6R2.cjs",
96
96
  "chunk-A6ZPAM6Z.cjs",
97
97
  "chunk-C7BM4DGX.cjs",
98
98
  "chunk-E23E2VUC.js",
99
99
  "chunk-E56BKBQZ.js",
100
+ "chunk-G6RT4EBO.cjs",
100
101
  "chunk-H5DKRHHQ.cjs",
101
102
  "chunk-KQAB6C6Q.cjs",
102
103
  "chunk-RG7ZV5BD.js",
@@ -106,7 +107,6 @@
106
107
  "chunk-WBHHHICS.js",
107
108
  "chunk-XDM6J4LJ.cjs",
108
109
  "chunk-XOJ2VWX4.cjs",
109
- "chunk-XU5HUIPK.js",
110
110
  "define-repository-CwAXed2X.d.cts",
111
111
  "define-repository-q_T4hqeP.d.ts",
112
112
  "define-slot-DouHW8RK.d.cts",
@@ -134,6 +134,6 @@
134
134
  "view-adapter-BV62bdhM.d.ts",
135
135
  "view-adapter-DF1me25J.d.cts"
136
136
  ],
137
- "sha": "8ba3d93",
137
+ "sha": "25ef468",
138
138
  "scripts": {}
139
139
  }
package/serve/index.cjs CHANGED
@@ -140,7 +140,7 @@ var appPlugin = (instance, options) => {
140
140
  return result;
141
141
  } catch (error) {
142
142
  serveLog.error(`\u0440\u0435\u043D\u0434\u0435\u0440 \xAB${pathname}\xBB \u0443\u043F\u0430\u043B \u0437\u0430 ${String(Date.now() - startedAt)}\u043C\u0441`, error);
143
- return reply.code(500).send({ error: error instanceof Error ? error.message : String(error) });
143
+ return reply.send(error instanceof Error ? error : new Error(String(error)));
144
144
  }
145
145
  }));
146
146
  return Promise.resolve();
package/serve/index.js CHANGED
@@ -140,7 +140,7 @@ var appPlugin = (instance, options) => {
140
140
  return result;
141
141
  } catch (error) {
142
142
  serveLog.error(`\u0440\u0435\u043D\u0434\u0435\u0440 \xAB${pathname}\xBB \u0443\u043F\u0430\u043B \u0437\u0430 ${String(Date.now() - startedAt)}\u043C\u0441`, error);
143
- return reply.code(500).send({ error: error instanceof Error ? error.message : String(error) });
143
+ return reply.send(error instanceof Error ? error : new Error(String(error)));
144
144
  }
145
145
  }));
146
146
  return Promise.resolve();