@foxford/den 3.2.0 → 3.2.2-beta-cb8f0c1-20260825
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 +35 -0
- package/bin/den.cjs +4 -3
- package/bin/den.js +2 -1
- package/builder/index.cjs +3 -2
- package/builder/index.d.cts +8 -3
- package/builder/index.d.ts +8 -3
- package/builder/index.js +2 -1
- package/{chunk-RRR2DJMN.cjs → chunk-3X4WVHUU.cjs} +43 -15
- package/{chunk-MCN4GFEQ.js → chunk-E56BKBQZ.js} +2 -1
- package/{chunk-Z5BL4DJA.cjs → chunk-H5DKRHHQ.cjs} +2 -1
- package/chunk-KQAB6C6Q.cjs +15 -0
- package/chunk-RG7ZV5BD.js +15 -0
- package/{chunk-TPHJUDHG.js → chunk-SOH2TL2N.js} +35 -20
- package/{chunk-ZOU6W6ZQ.cjs → chunk-XDM6J4LJ.cjs} +35 -20
- package/{chunk-BMI5HNGE.js → chunk-XU5HUIPK.js} +43 -15
- package/{define-slot-DYNCLDJY.d.cts → define-slot-DouHW8RK.d.cts} +14 -1
- package/{define-slot-Cngzae6i.d.ts → define-slot-TkqbLySB.d.ts} +14 -1
- package/define.cjs +2 -2
- package/define.d.cts +1 -1
- package/define.d.ts +1 -1
- package/define.js +1 -1
- package/{descriptor-DQ6Gi7A_.d.ts → descriptor-tWPa9j-x.d.ts} +17 -7
- package/{descriptor-Dujg_1on.d.cts → descriptor-w8oxeIAe.d.cts} +17 -7
- package/index.cjs +2 -2
- package/index.d.cts +3 -3
- package/index.d.ts +3 -3
- package/index.js +1 -1
- package/island/index.cjs +2 -2
- package/island/index.d.cts +14 -7
- package/island/index.d.ts +14 -7
- package/island/index.js +1 -1
- package/package.json +25 -16
- package/serve/index.cjs +9 -5
- package/serve/index.d.cts +12 -3
- package/serve/index.d.ts +12 -3
- package/serve/index.js +5 -1
- package/{view-adapter-B4gEb-ms.d.ts → view-adapter-BV62bdhM.d.ts} +1 -1
- package/{view-adapter-DJ7yB6Ml.d.cts → view-adapter-DF1me25J.d.cts} +1 -1
package/README.mdx
CHANGED
|
@@ -125,6 +125,41 @@ export class ContentPageVM extends ViewModel<State> {
|
|
|
125
125
|
|
|
126
126
|
Редирект объявляется там же: `{ redirect: '/user/login' }` — без статуса это `302`.
|
|
127
127
|
|
|
128
|
+
### Приложение без рендера
|
|
129
|
+
|
|
130
|
+
`view` и `viewLayer` объявляются парой либо не объявляются вовсе. Приложение без них сообщает
|
|
131
|
+
документу данные, а свой кусок страницы рисует кто-то другой — например, клиент монолита.
|
|
132
|
+
|
|
133
|
+
```ts
|
|
134
|
+
export default {
|
|
135
|
+
name: 'spa-portal',
|
|
136
|
+
units: [],
|
|
137
|
+
viewModels: [shellVm], // describeDocument отдаёт данные документа и артефакты адреса
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
```ts
|
|
142
|
+
describeDocument(): DocumentContribution {
|
|
143
|
+
const { shell } = this.state.get()
|
|
144
|
+
|
|
145
|
+
return {
|
|
146
|
+
// состав знает шаблон документа хоста, ядру перечислять его нечем
|
|
147
|
+
data: { containerId: shell.containerId, manifest: shell.manifest },
|
|
148
|
+
// чанки зависят от адреса, поэтому их знает рендер, а не сборка
|
|
149
|
+
assets: { css: shell.css, js: shell.js, scripts: 'classic' },
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Жизненный цикл у такого приложения тот же — контейнер, единицы, активация VM, вклад в документ, —
|
|
155
|
+
укорачивается ровно отрисовка: `html` в ответе пустой, `state` посчитан как обычно. `den build`
|
|
156
|
+
собирает его так же: `den.config.ts` без пресета означает, что клиентского выхода не бывает,
|
|
157
|
+
и остаются серверный дескриптор с точкой входа процесса.
|
|
158
|
+
|
|
159
|
+
`scripts: 'classic'` нужен там, где чанки собраны не ES-модулями: вид скрипта знает сборка, а
|
|
160
|
+
теги печатает хост, и выбрать между `type="module"` и обычным `defer` он может только по этому
|
|
161
|
+
признаку.
|
|
162
|
+
|
|
128
163
|
## Сетевой транспорт: то же самое по HTTP
|
|
129
164
|
|
|
130
165
|
Приложение поднимается отдельным сервисом **без единой строки своего серверного кода** —
|
package/bin/den.cjs
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunk3X4WVHUUcjs = require('../chunk-3X4WVHUU.cjs');
|
|
5
|
+
require('../chunk-KQAB6C6Q.cjs');
|
|
5
6
|
require('../chunk-A6ZPAM6Z.cjs');
|
|
6
7
|
|
|
7
8
|
|
|
@@ -69,11 +70,11 @@ function run(argv) {
|
|
|
69
70
|
}
|
|
70
71
|
const target = { base: options["base"], root: (_a = options["root"]) != null ? _a : process.cwd() };
|
|
71
72
|
if (command === "build") {
|
|
72
|
-
yield
|
|
73
|
+
yield _chunk3X4WVHUUcjs.buildApp.call(void 0, target);
|
|
73
74
|
return;
|
|
74
75
|
}
|
|
75
76
|
if (command === "dev") {
|
|
76
|
-
yield
|
|
77
|
+
yield _chunk3X4WVHUUcjs.devApp.call(void 0, target);
|
|
77
78
|
return;
|
|
78
79
|
}
|
|
79
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
package/builder/index.cjs
CHANGED
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var _chunk3X4WVHUUcjs = require('../chunk-3X4WVHUU.cjs');
|
|
6
|
+
require('../chunk-KQAB6C6Q.cjs');
|
|
6
7
|
require('../chunk-A6ZPAM6Z.cjs');
|
|
7
8
|
require('../chunk-T5QVCXVB.cjs');
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
|
|
12
|
-
exports.buildApp =
|
|
13
|
+
exports.buildApp = _chunk3X4WVHUUcjs.buildApp; exports.defineAppConfig = _chunk3X4WVHUUcjs.defineAppConfig; exports.devApp = _chunk3X4WVHUUcjs.devApp;
|
package/builder/index.d.cts
CHANGED
|
@@ -80,13 +80,18 @@ interface AppServerConfig {
|
|
|
80
80
|
interface AppConfig {
|
|
81
81
|
/** Модуль дескриптора; по умолчанию `src/index.ts`. */
|
|
82
82
|
entry?: string;
|
|
83
|
-
/**
|
|
84
|
-
|
|
83
|
+
/**
|
|
84
|
+
* Пресет фреймворка — из пакета адаптера.
|
|
85
|
+
*
|
|
86
|
+
* Не объявлен — приложение своего фрагмента не рисует (дескриптор без `view`), и клиентского
|
|
87
|
+
* выхода у него не бывает: собирать нечем и оживлять нечего.
|
|
88
|
+
*/
|
|
89
|
+
preset?: AppBuildPreset;
|
|
85
90
|
server?: AppServerConfig;
|
|
86
91
|
/**
|
|
87
92
|
* Последнее слово за приложением: правит собранный конфиг сборщика перед запуском.
|
|
88
93
|
*
|
|
89
|
-
* Щель на случай, когда
|
|
94
|
+
* Щель на случай, когда умолчаний сборки не хватило. Зовётся отдельно для каждого выхода, поэтому
|
|
90
95
|
* правка адресуется тому, кому предназначена.
|
|
91
96
|
*/
|
|
92
97
|
vite?: (config: Record<string, unknown>, target: 'server' | 'client') => Record<string, unknown>;
|
package/builder/index.d.ts
CHANGED
|
@@ -80,13 +80,18 @@ interface AppServerConfig {
|
|
|
80
80
|
interface AppConfig {
|
|
81
81
|
/** Модуль дескриптора; по умолчанию `src/index.ts`. */
|
|
82
82
|
entry?: string;
|
|
83
|
-
/**
|
|
84
|
-
|
|
83
|
+
/**
|
|
84
|
+
* Пресет фреймворка — из пакета адаптера.
|
|
85
|
+
*
|
|
86
|
+
* Не объявлен — приложение своего фрагмента не рисует (дескриптор без `view`), и клиентского
|
|
87
|
+
* выхода у него не бывает: собирать нечем и оживлять нечего.
|
|
88
|
+
*/
|
|
89
|
+
preset?: AppBuildPreset;
|
|
85
90
|
server?: AppServerConfig;
|
|
86
91
|
/**
|
|
87
92
|
* Последнее слово за приложением: правит собранный конфиг сборщика перед запуском.
|
|
88
93
|
*
|
|
89
|
-
* Щель на случай, когда
|
|
94
|
+
* Щель на случай, когда умолчаний сборки не хватило. Зовётся отдельно для каждого выхода, поэтому
|
|
90
95
|
* правка адресуется тому, кому предназначена.
|
|
91
96
|
*/
|
|
92
97
|
vite?: (config: Record<string, unknown>, target: 'server' | 'client') => Record<string, unknown>;
|
package/builder/index.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
2
2
|
|
|
3
|
+
var _chunkKQAB6C6Qcjs = require('./chunk-KQAB6C6Q.cjs');
|
|
4
|
+
|
|
5
|
+
|
|
3
6
|
var _chunkA6ZPAM6Zcjs = require('./chunk-A6ZPAM6Z.cjs');
|
|
4
7
|
|
|
5
8
|
|
|
@@ -92,7 +95,9 @@ import config from ${JSON.stringify(configPath)}
|
|
|
92
95
|
const server = config.server ?? {}
|
|
93
96
|
|
|
94
97
|
async function setup() {
|
|
95
|
-
|
|
98
|
+
if (app.viewLayer) {
|
|
99
|
+
viewAdapterOf(app.viewLayer).installResolver()
|
|
100
|
+
}
|
|
96
101
|
server.container?.(getAppContainer())
|
|
97
102
|
await server.setup?.()
|
|
98
103
|
}
|
|
@@ -109,11 +114,16 @@ export default descriptor
|
|
|
109
114
|
function generateServerProcess(configPath, base, mode) {
|
|
110
115
|
const assets = mode === "development" ? ` assets: { base: ${JSON.stringify(base)}, dir: fileURLToPath(new URL('./client', import.meta.url)) },
|
|
111
116
|
` : "";
|
|
112
|
-
return
|
|
117
|
+
return `import { fileURLToPath } from 'node:url'
|
|
118
|
+
|
|
119
|
+
import { loadAppEnv, serveApp } from '@foxford/den/serve'
|
|
113
120
|
|
|
114
121
|
import app from ${JSON.stringify(VIRTUAL_SERVER_APP)}
|
|
115
122
|
import config from ${JSON.stringify(configPath)}
|
|
116
123
|
|
|
124
|
+
// \u0423\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044F \u043E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u044F \u2014 \u0434\u043E \u043F\u0435\u0440\u0432\u043E\u0433\u043E \u0447\u0442\u0435\u043D\u0438\u044F: \u043F\u043E\u0440\u0442 \u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u0447\u0438\u0442\u0430\u044E\u0442\u0441\u044F \u043D\u0438\u0436\u0435
|
|
125
|
+
loadAppEnv(fileURLToPath(new URL('..', import.meta.url)))
|
|
126
|
+
|
|
117
127
|
await serveApp(app, {
|
|
118
128
|
${assets} configure: config.server?.configure,
|
|
119
129
|
host: process.env.HOST,
|
|
@@ -126,7 +136,14 @@ ${assets} configure: config.server?.configure,
|
|
|
126
136
|
function denAppModules(options) {
|
|
127
137
|
const { assets, base, config, configPath, entry, mode } = options;
|
|
128
138
|
const sources = {
|
|
129
|
-
|
|
139
|
+
// Клиентский вход спрашивают только у клиентского выхода, а его без пресета не собирают.
|
|
140
|
+
// Отказ здесь означает, что выход всё-таки запустили, — это ошибка команд, а не приложения
|
|
141
|
+
[VIRTUAL_CLIENT]: () => {
|
|
142
|
+
if (!config.preset) {
|
|
143
|
+
throw new Error("den: \u043A\u043B\u0438\u0435\u043D\u0442\u0441\u043A\u0438\u0439 \u0432\u0445\u043E\u0434 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D, \u043D\u043E \u043F\u0440\u0435\u0441\u0435\u0442 \u043D\u0435 \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D \u2014 \u043E\u0436\u0438\u0432\u043B\u044F\u0442\u044C \u043D\u0435\u0447\u0435\u043C");
|
|
144
|
+
}
|
|
145
|
+
return generateClientEntry(entry, config.preset.clientEntry);
|
|
146
|
+
},
|
|
130
147
|
[VIRTUAL_SERVER_APP]: () => generateServerApp(entry, configPath, assets),
|
|
131
148
|
[VIRTUAL_SERVER_PROCESS]: () => generateServerProcess(configPath, base, mode)
|
|
132
149
|
};
|
|
@@ -167,8 +184,8 @@ function loadAppConfig(root) {
|
|
|
167
184
|
try {
|
|
168
185
|
const loaded = yield server.ssrLoadModule(configPath);
|
|
169
186
|
const config = loaded.default;
|
|
170
|
-
if (!
|
|
171
|
-
throw new Error(`den: ${CONFIG_FILE} \u043D\u0435 \u043E\
|
|
187
|
+
if (!config) {
|
|
188
|
+
throw new Error(`den: ${CONFIG_FILE} \u043D\u0435 \u043E\u0442\u0434\u0430\u0451\u0442 \u043A\u043E\u043D\u0444\u0438\u0433 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u2014 \u0441\u043E\u0431\u0438\u0440\u0430\u0442\u044C \u043D\u0435\u0447\u0435\u043C`);
|
|
172
189
|
}
|
|
173
190
|
return { config, configPath };
|
|
174
191
|
} finally {
|
|
@@ -186,7 +203,7 @@ function dependenciesOf(root) {
|
|
|
186
203
|
return [...Object.keys((_a = manifest.dependencies) != null ? _a : {}), ...Object.keys((_b = manifest.devDependencies) != null ? _b : {})];
|
|
187
204
|
}
|
|
188
205
|
function viteConfigFor(options) {
|
|
189
|
-
var _a, _b, _c;
|
|
206
|
+
var _a, _b, _c, _d, _e;
|
|
190
207
|
const { assets, base, config, configPath, entryFileNames, input, mode, outDir, root, target } = options;
|
|
191
208
|
const entry = (_a = config.entry) != null ? _a : "src/index.ts";
|
|
192
209
|
const composed = {
|
|
@@ -211,34 +228,43 @@ function viteConfigFor(options) {
|
|
|
211
228
|
// программный вызов он иначе не доедет.
|
|
212
229
|
mode,
|
|
213
230
|
plugins: [
|
|
214
|
-
...config.preset.plugins,
|
|
231
|
+
...(_c = (_b = config.preset) == null ? void 0 : _b.plugins) != null ? _c : [],
|
|
215
232
|
denAppModules({ assets, base, config, configPath, entry: _path2.default.join(root, entry), mode })
|
|
216
233
|
],
|
|
217
234
|
root,
|
|
218
|
-
ssr: { noExternal: (
|
|
235
|
+
ssr: { noExternal: (_e = (_d = config.server) == null ? void 0 : _d.noExternal) != null ? _e : [] }
|
|
219
236
|
};
|
|
220
237
|
return config.vite ? config.vite(composed, target) : composed;
|
|
221
238
|
}
|
|
222
239
|
function buildApp(options) {
|
|
223
240
|
return _chunkT5QVCXVBcjs.__async.call(void 0, this, null, function* () {
|
|
224
|
-
var _a, _b, _c
|
|
241
|
+
var _a, _b, _c;
|
|
225
242
|
const { mode = "production" } = options;
|
|
226
243
|
process.env["NODE_ENV"] = mode;
|
|
227
244
|
const root = _path2.default.resolve(options.root);
|
|
245
|
+
_chunkKQAB6C6Qcjs.loadAppEnv.call(void 0, root);
|
|
228
246
|
const { config, configPath } = yield loadAppConfig(root);
|
|
229
247
|
const port = resolvePort((_a = config.server) == null ? void 0 : _a.port);
|
|
230
248
|
const base = (_b = options.base) != null ? _b : "";
|
|
231
|
-
const
|
|
249
|
+
const { preset } = config;
|
|
250
|
+
const refusal = (_c = preset == null ? void 0 : preset.validate) == null ? void 0 : _c.call(preset, dependenciesOf(root));
|
|
232
251
|
if (refusal !== void 0 && refusal !== null) {
|
|
233
252
|
throw new Error(`den: ${refusal}`);
|
|
234
253
|
}
|
|
235
254
|
const { build } = yield Promise.resolve().then(() => _interopRequireWildcard(require("vite")));
|
|
236
255
|
const shared = { base, config, configPath, mode, root };
|
|
237
256
|
const empty = { css: [], js: [] };
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
257
|
+
let assets = empty;
|
|
258
|
+
if (preset) {
|
|
259
|
+
_chunkA6ZPAM6Zcjs.logger.info(`\u0441\u0431\u043E\u0440\u043A\u0430 \u043A\u043B\u0438\u0435\u043D\u0442\u0441\u043A\u043E\u0433\u043E \u0432\u044B\u0445\u043E\u0434\u0430 (${preset.view})`);
|
|
260
|
+
yield build(
|
|
261
|
+
viteConfigFor(_chunkT5QVCXVBcjs.__spreadProps.call(void 0, _chunkT5QVCXVBcjs.__spreadValues.call(void 0, {}, shared), { assets: empty, input: VIRTUAL_CLIENT, outDir: OUT_CLIENT, target: "client" }))
|
|
262
|
+
);
|
|
263
|
+
assets = collectAssets(_path2.default.join(root, OUT_CLIENT), base);
|
|
264
|
+
_chunkA6ZPAM6Zcjs.logger.info(`\u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u044B: ${String(assets.js.length)} js, ${String(assets.css.length)} css`);
|
|
265
|
+
} else {
|
|
266
|
+
_chunkA6ZPAM6Zcjs.logger.info("\u043A\u043B\u0438\u0435\u043D\u0442\u0441\u043A\u043E\u0433\u043E \u0432\u044B\u0445\u043E\u0434\u0430 \u043D\u0435\u0442: \u043F\u0440\u0435\u0441\u0435\u0442 \u043D\u0435 \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D, \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0441\u0432\u043E\u0435\u0433\u043E \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430 \u043D\u0435 \u0440\u0438\u0441\u0443\u0435\u0442");
|
|
267
|
+
}
|
|
242
268
|
_chunkA6ZPAM6Zcjs.logger.info("\u0441\u0431\u043E\u0440\u043A\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043D\u043E\u0433\u043E \u0434\u0435\u0441\u043A\u0440\u0438\u043F\u0442\u043E\u0440\u0430");
|
|
243
269
|
yield build(
|
|
244
270
|
viteConfigFor(_chunkT5QVCXVBcjs.__spreadProps.call(void 0, _chunkT5QVCXVBcjs.__spreadValues.call(void 0, {}, shared), {
|
|
@@ -309,7 +335,9 @@ function bannerLines(facts2) {
|
|
|
309
335
|
`${label("\u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E")}http://localhost:${port}`,
|
|
310
336
|
...network === void 0 ? [] : [`${label("\u0432 \u0441\u0435\u0442\u0438")}http://${network}:${port}`],
|
|
311
337
|
`${label("\u0440\u0443\u0447\u043A\u0438")}${ENDPOINTS.join(" ")}`,
|
|
312
|
-
|
|
338
|
+
// Префикс печатается, только когда он есть: при относительной сборке артефакты идут с
|
|
339
|
+
// адреса самого приложения, а он уже назван строкой выше
|
|
340
|
+
...facts2.base === void 0 || facts2.base === "" ? [] : [`${label("\u043F\u0440\u0435\u0444\u0438\u043A\u0441")}${facts2.base}`],
|
|
313
341
|
`${label("\u0447\u0430\u043D\u043A\u0438")}${assetsSummary(facts2.assets)}`,
|
|
314
342
|
`${label("\u0432\u044B\u0445\u043E\u0434\u044B")}${OUTPUTS.join(", ")}`,
|
|
315
343
|
`${label("\u043F\u0440\u0430\u0432\u043A\u0438")}${facts2.watched.join(", ")}`,
|
|
@@ -177,9 +177,10 @@ function defineRepository(token, options) {
|
|
|
177
177
|
}
|
|
178
178
|
|
|
179
179
|
// src/define-slot.ts
|
|
180
|
-
function defineSlot({ view, units = [], viewLayer } = {}) {
|
|
180
|
+
function defineSlot({ note, view, units = [], viewLayer } = {}) {
|
|
181
181
|
return {
|
|
182
182
|
__type: "slot",
|
|
183
|
+
note,
|
|
183
184
|
register(container, name) {
|
|
184
185
|
const slotLog = unitLogger(container, `slot:${name}`);
|
|
185
186
|
for (const unit of units) {
|
|
@@ -177,9 +177,10 @@ function defineRepository(token, options) {
|
|
|
177
177
|
}
|
|
178
178
|
|
|
179
179
|
// src/define-slot.ts
|
|
180
|
-
function defineSlot({ view, units = [], viewLayer } = {}) {
|
|
180
|
+
function defineSlot({ note, view, units = [], viewLayer } = {}) {
|
|
181
181
|
return {
|
|
182
182
|
__type: "slot",
|
|
183
|
+
note,
|
|
183
184
|
register(container, name) {
|
|
184
185
|
const slotLog = _chunkA6ZPAM6Zcjs.unitLogger.call(void 0, container, `slot:${name}`);
|
|
185
186
|
for (const unit of units) {
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }// src/serve/env.ts
|
|
2
|
+
var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs);
|
|
3
|
+
var _path = require('path'); var _path2 = _interopRequireDefault(_path);
|
|
4
|
+
var ENV_FILE = ".env";
|
|
5
|
+
function loadAppEnv(root) {
|
|
6
|
+
const file = _path2.default.join(root, ENV_FILE);
|
|
7
|
+
if (!_fs2.default.existsSync(file)) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
process.loadEnvFile(file);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
exports.loadAppEnv = loadAppEnv;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// src/serve/env.ts
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
var ENV_FILE = ".env";
|
|
5
|
+
function loadAppEnv(root) {
|
|
6
|
+
const file = path.join(root, ENV_FILE);
|
|
7
|
+
if (!fs.existsSync(file)) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
process.loadEnvFile(file);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export {
|
|
14
|
+
loadAppEnv
|
|
15
|
+
};
|
|
@@ -35,29 +35,33 @@ function getAppContainer() {
|
|
|
35
35
|
import { log } from "@foxford/logger";
|
|
36
36
|
var EMPTY_ROUTE = { params: {}, pathname: "", search: "" };
|
|
37
37
|
var REDIRECT_FOUND = 302;
|
|
38
|
+
function registerIslandParts(container, descriptor, islandLog) {
|
|
39
|
+
var _a, _b, _c;
|
|
40
|
+
(_a = descriptor.viewLayer) == null ? void 0 : _a.register(container);
|
|
41
|
+
const viewModels = (_b = descriptor.viewModels) != null ? _b : [];
|
|
42
|
+
const slots = Object.entries((_c = descriptor.slots) != null ? _c : {});
|
|
43
|
+
islandLog.info(
|
|
44
|
+
`\u043E\u0441\u0442\u0440\u043E\u0432: \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440 \u0441\u043E\u0437\u0434\u0430\u043D (units=${descriptor.units.length}, vms=${viewModels.length}, slots=${slots.length})`
|
|
45
|
+
);
|
|
46
|
+
for (const unit of descriptor.units) {
|
|
47
|
+
unit.register(container);
|
|
48
|
+
}
|
|
49
|
+
for (const vm of viewModels) {
|
|
50
|
+
vm.register(container);
|
|
51
|
+
}
|
|
52
|
+
for (const [name, slot] of slots) {
|
|
53
|
+
slot.register(container, name);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
38
56
|
function createIslandContainer(descriptor, options = {}) {
|
|
39
|
-
var _a, _b, _c
|
|
57
|
+
var _a, _b, _c;
|
|
40
58
|
const { parent = getAppContainer() } = options;
|
|
41
59
|
const appLog = (_b = log.getLogger((_a = descriptor.name) != null ? _a : "app")) != null ? _b : logger;
|
|
42
60
|
const islandLog = (_c = appLog.getLogger("client")) != null ? _c : appLog;
|
|
43
61
|
try {
|
|
44
62
|
const container = parent.createChild();
|
|
45
63
|
container.bind(LoggerToken).toValue(islandLog);
|
|
46
|
-
|
|
47
|
-
const viewModels = (_d = descriptor.viewModels) != null ? _d : [];
|
|
48
|
-
const slots = Object.entries((_e = descriptor.slots) != null ? _e : {});
|
|
49
|
-
islandLog.info(
|
|
50
|
-
`\u043E\u0441\u0442\u0440\u043E\u0432: \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440 \u0441\u043E\u0437\u0434\u0430\u043D (units=${descriptor.units.length}, vms=${viewModels.length}, slots=${slots.length})`
|
|
51
|
-
);
|
|
52
|
-
for (const unit of descriptor.units) {
|
|
53
|
-
unit.register(container);
|
|
54
|
-
}
|
|
55
|
-
for (const vm of viewModels) {
|
|
56
|
-
vm.register(container);
|
|
57
|
-
}
|
|
58
|
-
for (const [name, slot] of slots) {
|
|
59
|
-
slot.register(container, name);
|
|
60
|
-
}
|
|
64
|
+
registerIslandParts(container, descriptor, islandLog);
|
|
61
65
|
return container;
|
|
62
66
|
} catch (error) {
|
|
63
67
|
islandLog.error("\u043E\u0441\u0442\u0440\u043E\u0432: \u0441\u0431\u043E\u0440\u043A\u0430 \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u0430 \u0443\u043F\u0430\u043B\u0430", error);
|
|
@@ -111,6 +115,12 @@ function collectDocumentContribution(container, descriptor) {
|
|
|
111
115
|
if (part.head) {
|
|
112
116
|
contribution.head = __spreadValues(__spreadValues({}, contribution.head), part.head);
|
|
113
117
|
}
|
|
118
|
+
if (part.data) {
|
|
119
|
+
contribution.data = __spreadValues(__spreadValues({}, contribution.data), part.data);
|
|
120
|
+
}
|
|
121
|
+
if (part.assets && contribution.assets === void 0) {
|
|
122
|
+
contribution.assets = part.assets;
|
|
123
|
+
}
|
|
114
124
|
const declared = part.status !== void 0 || part.redirect !== void 0;
|
|
115
125
|
if (declared && contribution.status === void 0) {
|
|
116
126
|
contribution.status = (_b = part.status) != null ? _b : REDIRECT_FOUND;
|
|
@@ -149,7 +159,7 @@ function setupOnce(descriptor) {
|
|
|
149
159
|
}
|
|
150
160
|
function renderApp(descriptor, request) {
|
|
151
161
|
return __async(this, null, function* () {
|
|
152
|
-
var _a, _b;
|
|
162
|
+
var _a, _b, _c;
|
|
153
163
|
yield setupOnce(descriptor);
|
|
154
164
|
const route = {
|
|
155
165
|
params: (_a = request.params) != null ? _a : {},
|
|
@@ -165,16 +175,21 @@ function renderApp(descriptor, request) {
|
|
|
165
175
|
container.bind(RequestContextToken).toValue(request.context);
|
|
166
176
|
}
|
|
167
177
|
yield activateIslandViewModels(container, descriptor, route);
|
|
168
|
-
const
|
|
178
|
+
const contribution = collectDocumentContribution(container, descriptor);
|
|
179
|
+
const { data, head, redirect, status = STATUS_OK } = contribution;
|
|
169
180
|
if (status !== STATUS_OK) {
|
|
170
|
-
return { head, html: "", redirect, state: {}, status };
|
|
181
|
+
return { data, head, html: "", redirect, state: {}, status };
|
|
171
182
|
}
|
|
183
|
+
const assets = (_c = contribution.assets) != null ? _c : descriptor.assets;
|
|
172
184
|
const state = collectIslandState(container, descriptor);
|
|
185
|
+
if (descriptor.view === void 0 || descriptor.viewLayer === void 0) {
|
|
186
|
+
return { assets, data, head, html: "", state, status };
|
|
187
|
+
}
|
|
173
188
|
const rendered = resolveViewAdapter(container).renderIsland(descriptor, {
|
|
174
189
|
container,
|
|
175
190
|
slots: request.slots
|
|
176
191
|
});
|
|
177
|
-
return { assets
|
|
192
|
+
return { assets, data, head, headHtml: rendered.head, html: rendered.html, state, status };
|
|
178
193
|
} finally {
|
|
179
194
|
yield container.dispose();
|
|
180
195
|
}
|
|
@@ -35,29 +35,33 @@ function getAppContainer() {
|
|
|
35
35
|
var _logger = require('@foxford/logger');
|
|
36
36
|
var EMPTY_ROUTE = { params: {}, pathname: "", search: "" };
|
|
37
37
|
var REDIRECT_FOUND = 302;
|
|
38
|
+
function registerIslandParts(container, descriptor, islandLog) {
|
|
39
|
+
var _a, _b, _c;
|
|
40
|
+
(_a = descriptor.viewLayer) == null ? void 0 : _a.register(container);
|
|
41
|
+
const viewModels = (_b = descriptor.viewModels) != null ? _b : [];
|
|
42
|
+
const slots = Object.entries((_c = descriptor.slots) != null ? _c : {});
|
|
43
|
+
islandLog.info(
|
|
44
|
+
`\u043E\u0441\u0442\u0440\u043E\u0432: \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440 \u0441\u043E\u0437\u0434\u0430\u043D (units=${descriptor.units.length}, vms=${viewModels.length}, slots=${slots.length})`
|
|
45
|
+
);
|
|
46
|
+
for (const unit of descriptor.units) {
|
|
47
|
+
unit.register(container);
|
|
48
|
+
}
|
|
49
|
+
for (const vm of viewModels) {
|
|
50
|
+
vm.register(container);
|
|
51
|
+
}
|
|
52
|
+
for (const [name, slot] of slots) {
|
|
53
|
+
slot.register(container, name);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
38
56
|
function createIslandContainer(descriptor, options = {}) {
|
|
39
|
-
var _a, _b, _c
|
|
57
|
+
var _a, _b, _c;
|
|
40
58
|
const { parent = getAppContainer() } = options;
|
|
41
59
|
const appLog = (_b = _logger.log.getLogger((_a = descriptor.name) != null ? _a : "app")) != null ? _b : _chunkA6ZPAM6Zcjs.logger;
|
|
42
60
|
const islandLog = (_c = appLog.getLogger("client")) != null ? _c : appLog;
|
|
43
61
|
try {
|
|
44
62
|
const container = parent.createChild();
|
|
45
63
|
container.bind(_chunkA6ZPAM6Zcjs.LoggerToken).toValue(islandLog);
|
|
46
|
-
|
|
47
|
-
const viewModels = (_d = descriptor.viewModels) != null ? _d : [];
|
|
48
|
-
const slots = Object.entries((_e = descriptor.slots) != null ? _e : {});
|
|
49
|
-
islandLog.info(
|
|
50
|
-
`\u043E\u0441\u0442\u0440\u043E\u0432: \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440 \u0441\u043E\u0437\u0434\u0430\u043D (units=${descriptor.units.length}, vms=${viewModels.length}, slots=${slots.length})`
|
|
51
|
-
);
|
|
52
|
-
for (const unit of descriptor.units) {
|
|
53
|
-
unit.register(container);
|
|
54
|
-
}
|
|
55
|
-
for (const vm of viewModels) {
|
|
56
|
-
vm.register(container);
|
|
57
|
-
}
|
|
58
|
-
for (const [name, slot] of slots) {
|
|
59
|
-
slot.register(container, name);
|
|
60
|
-
}
|
|
64
|
+
registerIslandParts(container, descriptor, islandLog);
|
|
61
65
|
return container;
|
|
62
66
|
} catch (error) {
|
|
63
67
|
islandLog.error("\u043E\u0441\u0442\u0440\u043E\u0432: \u0441\u0431\u043E\u0440\u043A\u0430 \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u0430 \u0443\u043F\u0430\u043B\u0430", error);
|
|
@@ -111,6 +115,12 @@ function collectDocumentContribution(container, descriptor) {
|
|
|
111
115
|
if (part.head) {
|
|
112
116
|
contribution.head = _chunkT5QVCXVBcjs.__spreadValues.call(void 0, _chunkT5QVCXVBcjs.__spreadValues.call(void 0, {}, contribution.head), part.head);
|
|
113
117
|
}
|
|
118
|
+
if (part.data) {
|
|
119
|
+
contribution.data = _chunkT5QVCXVBcjs.__spreadValues.call(void 0, _chunkT5QVCXVBcjs.__spreadValues.call(void 0, {}, contribution.data), part.data);
|
|
120
|
+
}
|
|
121
|
+
if (part.assets && contribution.assets === void 0) {
|
|
122
|
+
contribution.assets = part.assets;
|
|
123
|
+
}
|
|
114
124
|
const declared = part.status !== void 0 || part.redirect !== void 0;
|
|
115
125
|
if (declared && contribution.status === void 0) {
|
|
116
126
|
contribution.status = (_b = part.status) != null ? _b : REDIRECT_FOUND;
|
|
@@ -149,7 +159,7 @@ function setupOnce(descriptor) {
|
|
|
149
159
|
}
|
|
150
160
|
function renderApp(descriptor, request) {
|
|
151
161
|
return _chunkT5QVCXVBcjs.__async.call(void 0, this, null, function* () {
|
|
152
|
-
var _a, _b;
|
|
162
|
+
var _a, _b, _c;
|
|
153
163
|
yield setupOnce(descriptor);
|
|
154
164
|
const route = {
|
|
155
165
|
params: (_a = request.params) != null ? _a : {},
|
|
@@ -165,16 +175,21 @@ function renderApp(descriptor, request) {
|
|
|
165
175
|
container.bind(_chunk6QV4L6R2cjs.RequestContextToken).toValue(request.context);
|
|
166
176
|
}
|
|
167
177
|
yield activateIslandViewModels(container, descriptor, route);
|
|
168
|
-
const
|
|
178
|
+
const contribution = collectDocumentContribution(container, descriptor);
|
|
179
|
+
const { data, head, redirect, status = STATUS_OK } = contribution;
|
|
169
180
|
if (status !== STATUS_OK) {
|
|
170
|
-
return { head, html: "", redirect, state: {}, status };
|
|
181
|
+
return { data, head, html: "", redirect, state: {}, status };
|
|
171
182
|
}
|
|
183
|
+
const assets = (_c = contribution.assets) != null ? _c : descriptor.assets;
|
|
172
184
|
const state = collectIslandState(container, descriptor);
|
|
185
|
+
if (descriptor.view === void 0 || descriptor.viewLayer === void 0) {
|
|
186
|
+
return { assets, data, head, html: "", state, status };
|
|
187
|
+
}
|
|
173
188
|
const rendered = _chunkXOJ2VWX4cjs.resolveViewAdapter.call(void 0, container).renderIsland(descriptor, {
|
|
174
189
|
container,
|
|
175
190
|
slots: request.slots
|
|
176
191
|
});
|
|
177
|
-
return { assets
|
|
192
|
+
return { assets, data, head, headHtml: rendered.head, html: rendered.html, state, status };
|
|
178
193
|
} finally {
|
|
179
194
|
yield container.dispose();
|
|
180
195
|
}
|