sapdon 3.2.2 → 3.3.3

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 (68) hide show
  1. package/README.md +245 -121
  2. package/doc/dev/architecture.md +415 -0
  3. package/doc/dev/cli.md +467 -0
  4. package/doc/dev/core.md +717 -0
  5. package/doc/dev/oc.md +582 -0
  6. package/doc/user/api/biome.md +558 -0
  7. package/doc/user/api/block.md +945 -0
  8. package/doc/user/api/entity.md +685 -0
  9. package/doc/user/api/extra.md +231 -0
  10. package/doc/user/api/item.md +896 -0
  11. package/doc/user/api/recipe.md +427 -0
  12. package/doc/user/api/texture.md +181 -0
  13. package/doc/user/config/build-config.md +84 -0
  14. package/doc/user/config/mod-info.md +33 -0
  15. package/doc/user/faq.md +160 -0
  16. package/doc/user/quick-start.md +108 -0
  17. package/doc/user/tutorials/block.md +463 -0
  18. package/doc/user/tutorials/entity.md +356 -0
  19. package/doc/user/tutorials/item.md +449 -0
  20. package/doc/user/tutorials/recipe.md +278 -0
  21. package/package.json +4 -3
  22. package/prod/cli/index.js +1 -1
  23. package/prod/cli/start.js +1 -1458
  24. package/prod/core/index.d.ts +3290 -2150
  25. package/prod/core/index.js +1 -59015
  26. package/prod/core/package.json +7 -0
  27. package/prod/oc/index.d.ts +348 -108
  28. package/prod/oc/index.js +1 -1
  29. package/prod/oc/package.json +7 -0
  30. package/prod/utils/index.d.ts +20 -2
  31. package/prod/utils/index.js +1 -1
  32. package/prod/utils/package.json +7 -0
  33. package/doc/BlockAPI.md +0 -145
  34. package/doc/api.md +0 -128
  35. package/doc/oc/index.md +0 -0
  36. package/doc/sapdon-ts.md +0 -64
  37. package/src/templates/js_sapdon/build.config +0 -23
  38. package/src/templates/js_sapdon/main.mjs +0 -4
  39. package/src/templates/js_sapdon/mod.info +0 -7
  40. package/src/templates/js_sapdon/pack_icon.png +0 -0
  41. package/src/templates/js_sapdon/package.json +0 -20
  42. package/src/templates/js_sapdon/res/animations/animation_item.animation.json +0 -34
  43. package/src/templates/js_sapdon/res/animations/large_item.animation.json +0 -27
  44. package/src/templates/js_sapdon/res/models/blocks/crop.geo.json +0 -48
  45. package/src/templates/js_sapdon/res/models/entity/animation/animation_item.geo.json +0 -26
  46. package/src/templates/js_sapdon/res/models/entity/animation/large_item.geo.json +0 -28
  47. package/src/templates/js_sapdon/res/textures/blocks/none.png +0 -0
  48. package/src/templates/js_sapdon/res/textures/blocks/test_log_oak.png +0 -0
  49. package/src/templates/js_sapdon/res/textures/blocks/test_log_top.png +0 -0
  50. package/src/templates/js_sapdon/res/textures/items/masterball.png +0 -0
  51. package/src/templates/js_sapdon/scripts/custom_components/cropComponent.js +0 -50
  52. package/src/templates/js_sapdon/scripts/custom_components/items/gui_book.js +0 -37
  53. package/src/templates/js_sapdon/scripts/custom_components/registry.js +0 -25
  54. package/src/templates/js_sapdon/scripts/index.js +0 -0
  55. package/src/templates/ts_sapdon/build.config +0 -23
  56. package/src/templates/ts_sapdon/main.ts +0 -11
  57. package/src/templates/ts_sapdon/mod.info +0 -7
  58. package/src/templates/ts_sapdon/pack_icon.png +0 -0
  59. package/src/templates/ts_sapdon/package.json +0 -20
  60. package/src/templates/ts_sapdon/res/models/blocks/crop.geo.json +0 -48
  61. package/src/templates/ts_sapdon/res/textures/blocks/test_log_oak.png +0 -0
  62. package/src/templates/ts_sapdon/res/textures/blocks/test_log_top.png +0 -0
  63. package/src/templates/ts_sapdon/res/textures/items/masterball.png +0 -0
  64. package/src/templates/ts_sapdon/scripts/components/cropComponent.ts +0 -44
  65. package/src/templates/ts_sapdon/scripts/components/items/guiBook.ts +0 -36
  66. package/src/templates/ts_sapdon/scripts/components/registry.ts +0 -24
  67. package/src/templates/ts_sapdon/scripts/index.ts +0 -7
  68. package/src/templates/ts_sapdon/tsconfig.json +0 -117
package/doc/dev/cli.md ADDED
@@ -0,0 +1,467 @@
1
+ # CLI 模块文档
2
+
3
+ `src/cli/` 是 Sapdon 的命令行工具模块,负责项目初始化、构建编排、开发服务器、热更新等所有 CLI 功能。
4
+
5
+ ---
6
+
7
+ ## 1. 目录结构
8
+
9
+ ```
10
+ src/cli/
11
+ ├── index.js # @sapdon/cli 包入口,导出 dev server 客户端
12
+ ├── start.js # CLI 命令定义 (commander),入口脚本
13
+ ├── build.js # 构建编排器:bundler、manifest 生成、注册
14
+ ├── load.js # 处理注册数据,生成 JSON 文件
15
+ ├── registryServer.ts # GRegistryServer — 服务端注册表,注册 submit/remote-logger handler
16
+ ├── init.js # 项目初始化、路径辅助
17
+ ├── utils.ts # 通用文件 I/O 工具
18
+ ├── tools/
19
+ │ └── textureSet.js # 纹理图集生成 (item_texture.json / terrain_texture.json)
20
+ ├── dev-server/
21
+ │ ├── index.ts # 开发服务器入口,导出 server 实例
22
+ │ ├── server.ts # DevelopmentServer 类 — HTTP 服务
23
+ │ ├── client.js # cliRequest() — 子进程向 dev server 发送数据
24
+ │ ├── hmr.js # 热更新文件监听
25
+ │ ├── syncFiles.js # 同步产物到 Minecraft 目录 + 复制库文件
26
+ │ └── config.js # dev server 配置 (端口)
27
+ ├── meta/
28
+ │ ├── buildConfig.ts # 读取/解析 build.config (含 v1→v2 迁移)
29
+ │ ├── versionType.ts # Minecraft 安装路径 (release/beta)
30
+ │ └── package.ts # 读取框架自身的 package.json
31
+ ├── res/
32
+ │ ├── server.ts # 资源提示文件生成 (res.hint.ts) + res/ 目录监听
33
+ │ └── fileResource.ts # FileResource 类 — 惰性文件资源加载器
34
+ └── remoteLogger/
35
+ ├── server.ts # 远程日志服务端处理
36
+ ├── client.ts # 远程日志客户端发送
37
+ └── message.ts # 日志消息类型定义
38
+ ```
39
+
40
+ 共 22 个文件。
41
+
42
+ ---
43
+
44
+ ## 2. 入口文件
45
+
46
+ ### `start.js` — CLI 命令入口
47
+
48
+ 此文件是 `package.json` 中 `bin` 字段指定的入口 (`prod/cli/start.js`),**不导出任何内容**,直接定义并执行 commander 命令。
49
+
50
+ | 命令 | 说明 |
51
+ |------|------|
52
+ | `init` | 为已有项目添加 sapdon 配置(修改 package.json scripts,生成 mod.info) |
53
+ | `create <name>` | 从模板脚手架新项目,支持 `js` / `ts` 选择 |
54
+ | `build <name>` | 完整构建 + 启动热更新 |
55
+ | `pack` | 构建当前目录(不启动 HMR) |
56
+ | `lib` | 复制 `prod/` 到 `node_modules/@sapdon/` |
57
+ | `res` | 生成资源提示文件 `res.hint.ts` |
58
+ | `config` | (占位) 读取 build.config |
59
+
60
+ ### `index.js` — 包入口
61
+
62
+ `@sapdon/cli` 的包入口,供其他模块编程式使用:
63
+
64
+ ```typescript
65
+ import { devServer, client } from '@sapdon/cli'
66
+
67
+ // devServer: DevelopmentServer 单例
68
+ // client.call(name, ...args) — 向 dev server 发送请求
69
+ ```
70
+
71
+ ---
72
+
73
+ ## 3. 构建管道
74
+
75
+ ### `build.js` — 构建编排器
76
+
77
+ 核心构建函数 `buildProject()` 的执行流程:
78
+
79
+ ```
80
+ 1. projectCanBuild()
81
+ → 验证项目存在 + build.config 存在
82
+
83
+ 2. 生成 manifest.json(仅首次)
84
+ → BP/manifest.json + RP/manifest.json
85
+ → 通过 AddonManifest 类生成
86
+
87
+ 3. 复制 pack_icon.png → BP + RP
88
+
89
+ 4. 复制资源文件夹 (res/) → RP
90
+
91
+ 5. startDevServer()
92
+ → 启动 HTTP 服务器 (端口 49037)
93
+
94
+ 6. GRegistryServer.startServer()
95
+ → 注册 submit handler
96
+
97
+ 7. runScript(absoluteModPath)
98
+ → rollup 编译 buildEntry (main.ts)
99
+ → fork 子进程执行
100
+ → 子进程中用户代码注册数据
101
+ → HTTP POST 提交到 dev server
102
+ → generateAddon() 生成 JSON 文件
103
+
104
+ 8. bundleScripts()
105
+ → rollup 打包 scripts/main.ts → scripts/index.js
106
+
107
+ 9. syncDevFilesServer()
108
+ → 复制 BP/RP 到 Minecraft 开发包目录
109
+ ```
110
+
111
+ **导出的关键组件:**
112
+
113
+ | 导出 | 说明 |
114
+ |------|------|
115
+ | `scriptBundler` | Rollup 包装器,`.js()` / `.ts()` / `.any()` 三个方法 |
116
+ | `projectCanBuild(path)` | 验证项目可构建 |
117
+ | `buildProject(path, name)` | 完整构建流程 |
118
+
119
+ **scriptBundler 详细:**
120
+
121
+ ```typescript
122
+ scriptBundler.js(source, target, sourcemap)
123
+ → 纯 JS 打包,使用 commonjs + node-resolve + json + terser(production)
124
+
125
+ scriptBundler.ts(source, target, sourcemap)
126
+ → TS 打包,额外使用 typescript 插件 + typescript-paths 插件
127
+ → tsconfig 使用项目自身的 tsconfig.json
128
+
129
+ scriptBundler.any(source, target)
130
+ → 根据 useJs 配置委托给 .js() 或 .ts()
131
+ ```
132
+
133
+ ### `load.js` — 注册数据处理
134
+
135
+ `generateAddon()` 在 `submit` handler 中调用,负责将 `GRegistryServer.dataList` 中的注册数据写出为 JSON 文件:
136
+
137
+ ```
138
+ generateAddon(modPath, buildPath, projectName)
139
+
140
+ for each { name, root, path: dataPath, data } in dataList:
141
+ ├── case "item_texture" → 暂存,稍后生成 item_texture.json
142
+ ├── case "terrain_texture" → 暂存,稍后生成 terrain_texture.json
143
+ ├── case "flipbook_textures" → 暂存,稍后生成 flipbook_textures.json
144
+ └── default:
145
+ root == "behavior"
146
+ → writeFileSync(<buildPath>/<name>_BP/<dataPath>/<name>.json)
147
+ root == "resource"
148
+ → writeFileSync(<buildPath>/<name>_RP/<dataPath>/<name>.json)
149
+
150
+ generateTextureFiles()
151
+ → generateItemTextureJson()
152
+ → generateBlockTextureJson()
153
+ → saveFile(flipbook_textures.json)
154
+ ```
155
+
156
+ ---
157
+
158
+ ## 4. 初始化模块
159
+
160
+ ### `init.js` — 项目初始化与路径工具
161
+
162
+ | 导出 | 说明 |
163
+ |------|------|
164
+ | `initProject(path, data)` | 从模板创建新项目,复制文件 + 生成 mod.info + npm install |
165
+ | `initNPMProject(path, data)` | 为已有 npm 项目添加 sapdon 支持 |
166
+ | `readPackageJson(dir)` | 读取目录的 package.json,返回 `{ name, description, author, version }` |
167
+ | `globalObject` | 全局可变对象,存储运行时状态 (projectPath) |
168
+ | `getProjectPath()` | 返回当前项目路径 |
169
+ | `getProjectName()` | 返回项目名 (目录 basename) |
170
+ | `getBuildDirBp()` | 返回 BP 构建目录路径 |
171
+ | `getBuildDirRp()` | 返回 RP 构建目录路径 |
172
+
173
+ 模板映射:`{ js: 'js_sapdon', ts: 'ts_sapdon' }`,对应 `src/templates/` 下的目录。
174
+
175
+ ---
176
+
177
+ ## 5. 开发服务器
178
+
179
+ ### `dev-server/` 子系统
180
+
181
+ 架构图:
182
+
183
+ ```
184
+ 子进程 (用户代码) CLI 主进程
185
+ ┌─────────────────────────┐ ┌──────────────────────────┐
186
+ │ │ │ │
187
+ │ GRegistry │ │ DevelopmentServer │
188
+ │ .register() │ POST │ (端口 49037) │
189
+ │ .submit() │─────→│ │
190
+ │ │ │ cliServerHandlers: │
191
+ │ core/transport/client.ts│ │ submit │
192
+ │ transportPost() │ │ remote-logger │
193
+ └─────────────────────────┘ └──────────────────────────┘
194
+ ```
195
+
196
+ ### `server.ts` — DevelopmentServer 类
197
+
198
+ | 方法 | 说明 |
199
+ |------|------|
200
+ | `isListening()` | 服务器是否在监听 |
201
+ | `bootstrap()` | 创建 HTTP server,监听配置端口 |
202
+ | `handle(url, handler)` | 注册 URL handler |
203
+ | `getHandler(url)` | 获取已注册的 handler |
204
+ | `interceptHandler(url, interceptor)` | 用拦截器包装已有 handler |
205
+
206
+ **请求处理流程:**
207
+
208
+ ```
209
+ HTTP POST /<url>
210
+ → 匹配 cliServerHandlers 中的 handler
211
+ → 收集 body chunk
212
+ → end 时 decode(body) 解析 JSON
213
+ → await handler(...decodedArgs)
214
+ → 响应 200
215
+ ```
216
+
217
+ ### `client.js` — 客户端通信
218
+
219
+ | 导出 | 说明 |
220
+ |------|------|
221
+ | `cliRequest(path, ...params)` | POST 请求到 dev server,body 用 `encode()` 编码 |
222
+ | `post(path, body)` | 发送原始 body 的 POST 请求 |
223
+
224
+ ### `config.js` — 配置
225
+
226
+ ```javascript
227
+ { port: 49037 }
228
+ ```
229
+
230
+ ---
231
+
232
+ ## 6. 热更新 (HMR)
233
+
234
+ ### `hmr.js`
235
+
236
+ ```
237
+ hmr(projectPath, projectName)
238
+ → 检查 buildConfig.buildOptions.useHMR
239
+ → fs.watch(projectPath, { recursive: true })
240
+ → 1 秒防抖
241
+ → 过滤条件:
242
+ ✅ .js / .ts 文件
243
+ ✅ build.config / mod.info
244
+ ❌ 点文件/目录 (.git, .vscode)
245
+ ❌ buildDir (dev/)
246
+ ❌ .tmp 文件
247
+ → 变更时:
248
+ buildProject(projectPath, projectName)
249
+ syncDevFilesServer(projectPath, projectName)
250
+ → 额外启动:
251
+ watchResourceDir() — 监听 res/ 目录 (3 秒防抖)
252
+ ```
253
+
254
+ ---
255
+
256
+ ## 7. 文件同步
257
+
258
+ ### `syncFiles.js`
259
+
260
+ | 导出 | 说明 |
261
+ |------|------|
262
+ | `syncDevFilesServer(path, name)` | `fs.cpSync` 复制 BP/RP 到 Minecraft 开发包目录 |
263
+ | `writeLib(path)` | 复制 `prod/core`、`prod/cli`、`prod/oc` 到 `node_modules/@sapdon/` |
264
+
265
+ **Minecraft 目录路径**(由 `versionType` 决定):
266
+
267
+ | versionType | 路径 |
268
+ |-------------|------|
269
+ | `release` | `%USERPROFILE%/AppData/Roaming/Minecraft Bedrock/Users/Shared/games/com.mojang/` |
270
+ | `beta` | `%USERPROFILE%/AppData/Local/Packages/Microsoft.MinecraftWindowsBeta_8wekyb3d8bbwe/LocalState/games/com.mojang/` |
271
+
272
+ 可被环境变量 `MC_PATH` / `MC_BETA_PATH` 覆盖。
273
+
274
+ **writeLib 写入的 package.json:**
275
+
276
+ ```json
277
+ // node_modules/@sapdon/core/package.json
278
+ { "name": "@sapdon/core", "main": "index.js", "version": "..." }
279
+
280
+ // node_modules/@sapdon/cli/package.json
281
+ { "name": "@sapdon/cli", "main": "index.js", "version": "..." }
282
+
283
+ // node_modules/@sapdon/runtime/package.json
284
+ { "name": "@sapdon/runtime", "main": "index.js", "version": "..." }
285
+ ```
286
+
287
+ ---
288
+
289
+ ## 8. 元数据模块
290
+
291
+ ### `meta/buildConfig.ts` — build.config 解析
292
+
293
+ `getBuildConfig()` 读取项目根目录的 `build.config` 文件:
294
+
295
+ - 使用 `parseJsonWithComments()` 解析(支持 `//` 和 `/* */` 注释)
296
+ - 自动检测 v1 格式并迁移到 v2(`transferV1ToV2()`)
297
+ - 结果通过 `cacheSync` 缓存
298
+
299
+ **BuildConfig 接口:**
300
+
301
+ ```typescript
302
+ interface BuildConfig {
303
+ formatVersion: number // 当前是 2
304
+ buildOptions: {
305
+ useHMR: boolean // 热更新
306
+ buildMode: 'development' | 'production' // 构建模式
307
+ buildEntry: string // main.ts 入口
308
+ scriptEntry: string // scripts/main.ts
309
+ scriptOutput: string // scripts/index.js
310
+ useJs: boolean // 是否用 JS
311
+ buildDir: string // dev/
312
+ dependencies: Array<{ module_name: string, version: string }>
313
+ resource: { path: string, resourceHints: boolean }
314
+ }
315
+ versionType: 'release' | 'beta'
316
+ }
317
+ ```
318
+
319
+ ### `meta/versionType.ts` — Minecraft 路径
320
+
321
+ | 函数 | 说明 |
322
+ |------|------|
323
+ | `mojangPath()` | release 版路径(环境变量 `MC_PATH` 可覆盖) |
324
+ | `betaPath()` | beta 版路径(环境变量 `MC_BETA_PATH` 可覆盖) |
325
+ | `getGamePath()` | 根据 `buildConfig.versionType` 返回对应路径 |
326
+
327
+ ### `meta/package.ts` — 框架自身信息
328
+
329
+ `getPackageJson()` 读取框架根目录的 `package.json`(用于获取版本号等)。
330
+
331
+ ---
332
+
333
+ ## 9. 资源提示系统
334
+
335
+ ### `res/server.ts`
336
+
337
+ 为 TypeScript 项目生成 `res.hint.ts`,提供类型安全的资源引用:
338
+
339
+ ```
340
+ initResourceDir()
341
+ → 仅 TS 项目 (buildEntry 不以 .js 结尾)
342
+ → 创建 res/ 目录(如不存在)
343
+ → walk(res/) 递归扫描文件
344
+ → 生成 ResourceHint 树
345
+ → 写入 res.hint.ts
346
+
347
+ res.hint.ts 示例:
348
+ import { FileResource } from '...'
349
+ export default {
350
+ "textures": {
351
+ "blocks": {
352
+ "stone": FileResource.get("res/textures/blocks/stone.png")
353
+ }
354
+ }
355
+ }
356
+ ```
357
+
358
+ `watchResourceDir()` 监听 `res/` 目录变更,3 秒防抖,变更时执行 `sapdon res`。
359
+
360
+ ### `res/fileResource.ts` — FileResource 类
361
+
362
+ 惰性文件资源加载器,带全局缓存:
363
+
364
+ | 成员 | 说明 |
365
+ |------|------|
366
+ | `static cache` | 全局实例缓存(按 URI 键) |
367
+ | `static fileSystemLoader` | 默认加载器:`fs.readFileSync` |
368
+ | `static get(uri)` | 工厂方法,返回缓存或新实例 |
369
+ | `load(loader)` | 加载并缓存 |
370
+ | `clear()` | 清除缓存 |
371
+ | `ptr()` | 返回惰性 getter 函数 |
372
+
373
+ ---
374
+
375
+ ## 10. 纹理图集生成
376
+
377
+ ### `tools/textureSet.js`
378
+
379
+ 扫描资源目录的 PNG 文件,生成 Minecraft 所需的纹理图集 JSON:
380
+
381
+ | 导出 | 说明 |
382
+ |------|------|
383
+ | `generateItemTextureJson(dir, output, projectName, userData)` | 扫描 `textures/items/` 的 PNG,合并用户数据,输出 `item_texture.json` |
384
+ | `generateBlockTextureJson(dir, output, projectName, userData)` | 扫描 `textures/blocks/` 的 PNG,合并用户数据,输出 `terrain_texture.json` |
385
+
386
+ ---
387
+
388
+ ## 11. 远程日志系统
389
+
390
+ ### `remoteLogger/`
391
+
392
+ 用于 Minecraft 游戏内 Script API 向 CLI 发送日志消息:
393
+
394
+ ```
395
+ 游戏内 (Script API) CLI 主进程
396
+ ┌──────────────────────┐ ┌──────────────────┐
397
+ │ remoteLogger.client │ │ remoteLogger.server
398
+ │ .info("msg") │─────→│ .handleRemoteLogger()
399
+ │ .error("err") │ POST │ → console[level]()
400
+ └──────────────────────┘ └──────────────────┘
401
+ ```
402
+
403
+ | 文件 | 内容 |
404
+ |------|------|
405
+ | `message.ts` | `LogLevel` 枚举 + `Message` 接口 + `createMessage()` |
406
+ | `client.ts` | `sendMessage()` / `remoteLogger.info()` / `remoteLogger.error()` |
407
+ | `server.ts` | `handleRemoteLogger()` — 接收并输出日志 |
408
+
409
+ ---
410
+
411
+ ## 12. 通用工具
412
+
413
+ ### `utils.ts`
414
+
415
+ | 导出 | 说明 |
416
+ |------|------|
417
+ | `generateUUID()` | 生成 UUID v4 |
418
+ | `copyFileSync(src, dest)` | 同步复制文件 |
419
+ | `pathNotExist(path)` | 检查路径是否**不存在** |
420
+ | `readFile(path)` | 同步读文件 (UTF-8),失败返回 null |
421
+ | `saveFile(path, data)` | 同步写文件,自动创建父目录 |
422
+ | `copyFolder(src, dest)` | 递归复制目录 |
423
+ | `dirname(importMeta)` | 从 `import.meta` 获取 `__dirname` |
424
+ | `asyncImport(path)` | 动态 import,非相对路径自动加 `file://` 前缀 |
425
+ | `parseJsonWithComments(str)` | 解析含 `//` 和 `/* */` 注释的 JSON |
426
+
427
+ ---
428
+
429
+ ## 13. 模块依赖关系
430
+
431
+ ```
432
+ start.js (命令定义)
433
+ ├── init.js → 项目创建/初始化
434
+ ├── build.js → 构建编排
435
+ ├── dev-server/hmr.js → 热更新
436
+ ├── dev-server/syncFiles.js → writeLib
437
+ └── res/server.js → initResourceDir
438
+
439
+ build.js (构建核心)
440
+ ├── load.js → generateAddon (数据处理)
441
+ ├── dev-server/ → server, startDevServer, syncDevFilesServer
442
+ ├── registryServer.js → GRegistryServer
443
+ ├── core/addon/manifest.js → 清单生成
444
+ └── meta/buildConfig.js → 配置读取
445
+
446
+ load.js (JSON 文件生成)
447
+ ├── tools/textureSet.js → 纹理图集
448
+ └── registryServer.js → GRegistryServer
449
+
450
+ dev-server/ (IPC 基础设施)
451
+ ├── server.ts ←→ client.js (HTTP 通信)
452
+ ├── hmr.js → build.js + syncFiles.js
453
+ └── syncFiles.js → meta/versionType.js + meta/package.js
454
+
455
+ meta/ (配置层)
456
+ ├── buildConfig.ts → init.js (getProjectPath)
457
+ ├── versionType.ts → buildConfig.ts
458
+ └── package.ts → (读取 package.json)
459
+
460
+ res/ (资源提示)
461
+ ├── server.ts → fileResource.ts + meta/buildConfig.ts
462
+ └── fileResource.ts
463
+
464
+ remoteLogger/ (远程日志)
465
+ ├── client.ts → dev-server/client.js + message.ts
466
+ └── server.ts → message.ts
467
+ ```