@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.
- package/README.mdx +66 -15
- package/adapter.cjs +1 -1
- package/adapter.d.cts +1 -1
- package/adapter.d.ts +1 -1
- package/adapter.js +1 -1
- package/bin/den.cjs +88 -0
- package/bin/den.d.cts +2 -0
- package/bin/den.d.ts +2 -0
- package/bin/den.js +88 -0
- package/builder/index.cjs +12 -0
- package/builder/index.d.cts +124 -0
- package/builder/index.d.ts +124 -0
- package/builder/index.js +12 -0
- package/{chunk-KJ6NDOOL.js → chunk-3RX2OSUL.js} +1 -25
- package/{chunk-HJO26HIQ.js → chunk-6FNC3XMI.js} +4 -0
- package/{chunk-CZVYVNLI.cjs → chunk-6QV4L6R2.cjs} +1 -25
- package/chunk-A6ZPAM6Z.cjs +26 -0
- package/chunk-LW7IN57F.cjs +358 -0
- package/chunk-MCMYOVGT.js +358 -0
- package/{chunk-PZVUKTZG.js → chunk-MCN4GFEQ.js} +4 -2
- package/{chunk-XHYR3SGG.cjs → chunk-T5QVCXVB.cjs} +5 -1
- package/chunk-TPBI6TOU.js +26 -0
- package/{chunk-7M5OAOQ4.js → chunk-TPHJUDHG.js} +20 -4
- package/{chunk-P4QJCHMM.cjs → chunk-Z5BL4DJA.cjs} +11 -9
- package/{chunk-6ZFVV3AV.cjs → chunk-ZOU6W6ZQ.cjs} +31 -15
- package/{define-repository-MDEWHqM7.d.cts → define-repository-CwAXed2X.d.cts} +1 -1
- package/{define-repository-Ca62_YCy.d.ts → define-repository-q_T4hqeP.d.ts} +1 -1
- package/{define-slot-Dil8Kr1A.d.ts → define-slot-Cngzae6i.d.ts} +1 -1
- package/{define-slot-BKvArA02.d.cts → define-slot-DYNCLDJY.d.cts} +1 -1
- package/define.cjs +6 -4
- package/define.d.cts +3 -3
- package/define.d.ts +3 -3
- package/define.js +6 -4
- package/den.js +60 -0
- package/{descriptor-DZDNH7R5.d.ts → descriptor-DQ6Gi7A_.d.ts} +31 -3
- package/{descriptor-h0JE9jFx.d.cts → descriptor-Dujg_1on.d.cts} +31 -3
- package/index.cjs +23 -22
- package/index.d.cts +7 -6
- package/index.d.ts +7 -6
- package/index.js +4 -3
- package/island/index.cjs +6 -5
- package/island/index.d.cts +13 -6
- package/island/index.d.ts +13 -6
- package/island/index.js +4 -3
- package/package.json +52 -26
- package/{routes-CWpIqVAM.d.ts → routes-0uXJ0fux.d.ts} +1 -1
- package/{routes-BqIoqbt1.d.cts → routes-B0hDrkiF.d.cts} +1 -1
- package/serve/index.cjs +11 -10
- package/serve/index.d.cts +4 -4
- package/serve/index.d.ts +4 -4
- package/serve/index.js +4 -3
- package/server-render-CocWXQKC.d.cts +48 -0
- package/server-render-CocWXQKC.d.ts +48 -0
- package/{types-COwVwgzE.d.cts → types-Dx5qGiwk.d.cts} +1 -1
- package/{types-COwVwgzE.d.ts → types-Dx5qGiwk.d.ts} +1 -1
- package/{view-adapter-CPI8056c.d.ts → view-adapter-B4gEb-ms.d.ts} +4 -50
- package/{view-adapter-D2597RJZ.d.cts → view-adapter-DJ7yB6Ml.d.cts} +4 -50
- package/den-serve.js +0 -146
package/den-serve.js
DELETED
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import { resolve } from 'node:path'
|
|
4
|
-
import { pathToFileURL } from 'node:url'
|
|
5
|
-
|
|
6
|
-
// Команда, поднимающая приложение сервисом. Ради неё потребителю не нужен свой серверный файл:
|
|
7
|
-
// он объявляет дескриптор через `defineApp` и запускает `den-serve` — сервер внутрь дескриптора
|
|
8
|
-
// при этом не заезжает.
|
|
9
|
-
//
|
|
10
|
-
// Внутрь его класть нельзя: `defineApp` импортирует ХОСТ, чтобы поднять приложение у себя в
|
|
11
|
-
// процессе, и вместе с дескриптором к нему приехали бы fastify и `node:http` — в серверный
|
|
12
|
-
// бандл и в браузерный. Дескриптор к тому же перестал бы быть данными, а инвариант
|
|
13
|
-
// «приложение не знает своего класса» сломался бы: дескриптор, поднимающий сервер, знает,
|
|
14
|
-
// что он сетевой.
|
|
15
|
-
//
|
|
16
|
-
// Watch внутри команды нет намеренно: приложение всё равно собирается сборщиком потребителя,
|
|
17
|
-
// и он же умеет перезапускать (`tsup --watch --onSuccess "den-serve build/index.js"`). Второй
|
|
18
|
-
// сторож поверх первого только путал бы.
|
|
19
|
-
//
|
|
20
|
-
// Обычный `.js`, а не собираемый исходник: команда должна работать одинаково из воркспейса и
|
|
21
|
-
// из опубликованного пакета, а `@foxford/den/serve` — self-reference по имени пакета, поэтому
|
|
22
|
-
// в обоих случаях резолвится своим `exports`.
|
|
23
|
-
//
|
|
24
|
-
// Shebang здесь — `tsx`, потому что в воркспейсе `exports` ведут на `src/*.ts`. В артефакт
|
|
25
|
-
// файл кладётся сборкой с заменой на `node`: там те же `exports` ведут уже на собранный js
|
|
26
|
-
// (см. `installCli` в tsup.config.ts).
|
|
27
|
-
|
|
28
|
-
const USAGE = `den-serve <модуль> [опции]
|
|
29
|
-
|
|
30
|
-
<модуль> путь к модулю, чей дефолтный экспорт — дескриптор приложения
|
|
31
|
-
|
|
32
|
-
--port <порт> порт (по умолчанию PORT из окружения либо 3000)
|
|
33
|
-
--host <адрес> интерфейс прослушивания (по умолчанию HOST либо 0.0.0.0)
|
|
34
|
-
--slow <мс> порог медленного рендера для лога (по умолчанию 1000)
|
|
35
|
-
--configure <модуль> модуль, чей дефолтный экспорт получает инстанс fastify до
|
|
36
|
-
прослушивания: Sentry, метрики, cors — сюда
|
|
37
|
-
-h, --help эта справка
|
|
38
|
-
`
|
|
39
|
-
|
|
40
|
-
function parseArgs(argv) {
|
|
41
|
-
const options = {}
|
|
42
|
-
let entry
|
|
43
|
-
|
|
44
|
-
for (let i = 0; i < argv.length; i += 1) {
|
|
45
|
-
const arg = argv[i]
|
|
46
|
-
switch (arg) {
|
|
47
|
-
case '-h':
|
|
48
|
-
case '--help':
|
|
49
|
-
return { help: true }
|
|
50
|
-
case '--port':
|
|
51
|
-
case '--host':
|
|
52
|
-
case '--slow':
|
|
53
|
-
case '--configure':
|
|
54
|
-
i += 1
|
|
55
|
-
options[arg.slice(2)] = argv[i]
|
|
56
|
-
break
|
|
57
|
-
default:
|
|
58
|
-
if (arg.startsWith('-')) {
|
|
59
|
-
throw new Error(`неизвестная опция ${arg}`)
|
|
60
|
-
}
|
|
61
|
-
if (entry !== undefined) {
|
|
62
|
-
throw new Error('модуль указывается один')
|
|
63
|
-
}
|
|
64
|
-
entry = arg
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return { entry, options }
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function fail(message) {
|
|
72
|
-
process.stderr.write(`den-serve: ${message}\n\n${USAGE}`)
|
|
73
|
-
process.exit(1)
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Достаёт дескриптор из указанного модуля.
|
|
78
|
-
*
|
|
79
|
-
* Форма проверяется ДО подъёма сервера: иначе первая же ошибка вылезла бы на запросе, из
|
|
80
|
-
* середины рендера, и выглядела бы как проблема приложения, а не запуска.
|
|
81
|
-
*/
|
|
82
|
-
async function loadApp(entry) {
|
|
83
|
-
const module = await import(pathToFileURL(resolve(process.cwd(), entry)).href)
|
|
84
|
-
const app = module.default
|
|
85
|
-
|
|
86
|
-
if (typeof app !== 'object' || app === null || typeof app.name !== 'string') {
|
|
87
|
-
fail(`дефолтный экспорт «${entry}» не похож на дескриптор приложения`)
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return app
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Достаёт расширение инстанса из указанного модуля.
|
|
95
|
-
*
|
|
96
|
-
* Отдельной опцией, а не соглашением об имени файла: команда не должна угадывать, что в
|
|
97
|
-
* проекте считается конфигом. Без неё «серверного файла не нужно» и «расширяется снаружи»
|
|
98
|
-
* не сходились бы — за первым же плагином потребитель писал бы свою точку входа.
|
|
99
|
-
*/
|
|
100
|
-
async function loadConfigure(entry) {
|
|
101
|
-
const module = await import(pathToFileURL(resolve(process.cwd(), entry)).href)
|
|
102
|
-
|
|
103
|
-
if (typeof module.default !== 'function') {
|
|
104
|
-
fail(`дефолтный экспорт «${entry}» не функция — расширять инстанс нечем`)
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
return module.default
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
async function main() {
|
|
111
|
-
// Разбор аргументов — единственное место, где ошибка означает «человек опечатался»,
|
|
112
|
-
// поэтому она показывается подсказкой, а не стектрейсом
|
|
113
|
-
let parsed
|
|
114
|
-
try {
|
|
115
|
-
parsed = parseArgs(process.argv.slice(2))
|
|
116
|
-
} catch (error) {
|
|
117
|
-
fail(error.message)
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const { entry, help, options = {} } = parsed
|
|
121
|
-
|
|
122
|
-
if (help) {
|
|
123
|
-
process.stdout.write(USAGE)
|
|
124
|
-
return
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
if (entry === undefined) {
|
|
128
|
-
fail('не указан модуль с дескриптором')
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Рантайм грузится ПОСЛЕ разбора аргументов: `--help` и опечатка в опции не должны тянуть
|
|
132
|
-
// fastify и весь серверный граф
|
|
133
|
-
const { serveApp } = await import('@foxford/den/serve')
|
|
134
|
-
|
|
135
|
-
await serveApp(await loadApp(entry), {
|
|
136
|
-
configure: options.configure === undefined ? undefined : await loadConfigure(options.configure),
|
|
137
|
-
host: options.host ?? process.env.HOST ?? '0.0.0.0',
|
|
138
|
-
port: Number(options.port ?? process.env.PORT ?? 3000),
|
|
139
|
-
slowRenderMs: options.slow === undefined ? undefined : Number(options.slow),
|
|
140
|
-
})
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
main().catch((error) => {
|
|
144
|
-
process.stderr.write(`den-serve: ${error instanceof Error ? error.message : String(error)}\n`)
|
|
145
|
-
process.exit(1)
|
|
146
|
-
})
|