mirror of
https://github.com/unanmed/HumanBreak.git
synced 2025-10-08 20:01:47 +08:00
Compare commits
No commits in common. "138481e637268bd797a1fbd494227169bfaebe2a" and "574d765c699148b9a920bebf64fedbec13b0493e" have entirely different histories.
138481e637
...
574d765c69
1
.gitignore
vendored
1
.gitignore
vendored
@ -52,4 +52,3 @@ graph.svg
|
||||
docs/.vitepress/cache
|
||||
docs/.vitepress/dist
|
||||
docs/.vitepress/apiSidebar.ts
|
||||
_docs
|
||||
|
@ -1,7 +1,6 @@
|
||||
import { defineConfig } from 'vitepress';
|
||||
import { MermaidMarkdown, MermaidPlugin } from 'vitepress-plugin-mermaid';
|
||||
import api from './apiSidebar';
|
||||
import { join } from 'path';
|
||||
|
||||
// https://vitepress.dev/reference/site-config
|
||||
export default defineConfig({
|
||||
@ -14,7 +13,6 @@ export default defineConfig({
|
||||
md.use(MermaidMarkdown);
|
||||
}
|
||||
},
|
||||
outDir: join(process.cwd(), 'public', '_docs'),
|
||||
themeConfig: {
|
||||
// https://vitepress.dev/reference/default-theme-config
|
||||
outline: [2, 3],
|
||||
|
@ -4,28 +4,29 @@ lang: zh-CN
|
||||
|
||||
# API 列表
|
||||
|
||||
- [@motajs/client](./motajs-client/index.md) 渲染层代码
|
||||
- [@motajs/client-base](./motajs-client-base/index.md) 渲染层底层代码
|
||||
- [@motajs/common](./motajs-common/index.md) 渲染层和数据层通用代码
|
||||
- [@motajs/legacy-client](./motajs-legacy-client/index.md) 遗留渲染层代码
|
||||
- [@motajs/legacy-common](./motajs-legacy-common/index.md) 遗留通用代码
|
||||
- [@motajs/legacy-system](./motajs-legacy-system/index.md) 遗留渲染层系统代码
|
||||
- [@motajs/legacy-ui](./motajs-legacy-ui/index.md) 遗留 UI 相关代码
|
||||
- [@motajs/render](./motajs-render/index.md) 渲染系统代码
|
||||
- [@motajs/render-core](./motajs-render-core/index.md) 渲染系统核心代码
|
||||
- [@motajs/render-elements](./motajs-render-elements/index.md) 渲染系统内置元素代码
|
||||
- [@motajs/render-style](./motajs-render-style/index.md) 渲染系统样式代码
|
||||
- [@motajs/render-vue](./motajs-render-vue/index.md) 渲染系统 vue 支持代码
|
||||
- [@motajs/system](./motajs-system/index.md) 渲染层系统代码
|
||||
- [@motajs/system-action](./motajs-system-action/index.md) 渲染层交互系统代码
|
||||
- [@motajs/system-ui](./motajs-system-ui/index.md) 渲染层 UI 系统代码
|
||||
- [@motajs/types](./motajs-types/index.md) 渲染层类型代码
|
||||
- [@user/client-modules](./user-client-modules/index.md) 用户渲染层主要代码
|
||||
- [@user/data-base](./user-data-base/index.md) 用户数据层底层代码
|
||||
- [@user/data-fallback](./user-data-fallback/index.md) 用户数据层向后兼容代码
|
||||
- [@user/data-state](./user-data-state/index.md) 用户数据层状态代码
|
||||
- [@user/data-utils](./user-data-utils/index.md) 用户数据层工具代码
|
||||
- [@user/entry-client](./user-entry-client/index.md) 用户渲染层入口
|
||||
- [@user/entry-data](./user-entry-data/index.md) 用户数据层入口
|
||||
- [@user/legacy-plugin-client](./user-legacy-plugin-client/index.md) 用户遗留渲染层代码
|
||||
- [@user/legacy-plugin-data](./user-legacy-plugin-data/index.md) 用户遗留数据层代码
|
||||
- [@motajs/client](./motajs-client) 渲染层代码
|
||||
- [@motajs/client-base](./motajs-client-base) 渲染层底层代码
|
||||
- [@motajs/common](./motajs-common) 渲染层和数据层通用代码
|
||||
- [@motajs/legacy-client](./motajs-legacy-client) 遗留渲染层代码
|
||||
- [@motajs/legacy-common](./motajs-legacy-common) 遗留通用代码
|
||||
- [@motajs/legacy-data](./motajs-legacy-data) 遗留数据层代码
|
||||
- [@motajs/legacy-system](./motajs-legacy-system) 遗留渲染层系统代码
|
||||
- [@motajs/legacy-ui](./motajs-legacy-ui) 遗留 UI 相关代码
|
||||
- [@motajs/render](./motajs-render) 渲染系统代码
|
||||
- [@motajs/render-core](./motajs-render-core) 渲染系统核心代码
|
||||
- [@motajs/render-elements](./motajs-render-elements) 渲染系统内置元素代码
|
||||
- [@motajs/render-style](./motajs-render-style) 渲染系统样式代码
|
||||
- [@motajs/render-vue](./motajs-render-vue) 渲染系统 vue 支持代码
|
||||
- [@motajs/system](./motajs-system) 渲染层系统代码
|
||||
- [@motajs/system-action](./motajs-system-action) 渲染层交互系统代码
|
||||
- [@motajs/system-ui](./motajs-system-ui) 渲染层 UI 系统代码
|
||||
- [@motajs/types](./motajs-types) 渲染层类型代码
|
||||
- [@user/client-modules](./user-client-modules) 用户渲染层主要代码
|
||||
- [@user/data-base](./user-data-base) 用户数据层底层代码
|
||||
- [@user/data-fallback](./user-data-fallback) 用户数据层向后兼容代码
|
||||
- [@user/data-state](./user-data-state) 用户数据层状态代码
|
||||
- [@user/data-utils](./user-data-utils) 用户数据层工具代码
|
||||
- [@user/entry-client](./user-entry-client) 用户渲染层入口
|
||||
- [@user/entry-data](./user-entry-data) 用户数据层入口
|
||||
- [@user/legacy-plugin-client](./user-legacy-plugin-client) 用户遗留渲染层代码
|
||||
- [@user/legacy-plugin-data](./user-legacy-plugin-data) 用户遗留数据层代码
|
||||
|
@ -127,7 +127,7 @@ return () => (
|
||||
|
||||
### 大数据量处理方案
|
||||
|
||||
考虑使用[滚动条](../user-client-modules/组件 Scroll.md)或[分页](../user-client-modules/组件 Page.md)组件。
|
||||
考虑使用[滚动条](../user-client-modules/Scroll.md)或[分页](../user-client-modules/Page.md)组件。
|
||||
|
||||
---
|
||||
|
||||
|
@ -156,5 +156,5 @@ import { Font } from '@motajs/render-style';
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. 如果需要显示多行文本,考虑使用 [TextContent](../user-client-modules/组件 TextContent.md)
|
||||
1. 如果需要显示多行文本,考虑使用 [TextContent](../user-client-modules/TextContent.md)
|
||||
2. 考虑到浏览器兼容性,不建议在颜色中填写一些新标准的语法,例如 `rgb(0.3, 0.6, 0.8 / 0.6)` `#rgba` 等
|
||||
|
@ -10,31 +10,32 @@ lang: zh-CN
|
||||
|
||||
2.B 样板现在已经迁移至了 monorepo,将代码模块化,共分为 20 余个模块,每个模块的具体内容可以参考 API 文档,模块列表如下:
|
||||
|
||||
- [@motajs/client](../api/motajs-client/index.md) 渲染层代码
|
||||
- [@motajs/client-base](../api/motajs-client-base/index.md) 渲染层底层代码
|
||||
- [@motajs/common](../api/motajs-common/index.md) 渲染层和数据层通用代码
|
||||
- [@motajs/legacy-client](../api/motajs-legacy-client/index.md) 遗留渲染层代码
|
||||
- [@motajs/legacy-common](../api/motajs-legacy-common/index.md) 遗留通用代码
|
||||
- [@motajs/legacy-system](../api/motajs-legacy-system/index.md) 遗留渲染层系统代码
|
||||
- [@motajs/legacy-ui](../api/motajs-legacy-ui/index.md) 遗留 UI 相关代码
|
||||
- [@motajs/render](../api/motajs-render/index.md) 渲染系统代码
|
||||
- [@motajs/render-core](../api/motajs-render-core/index.md) 渲染系统核心代码
|
||||
- [@motajs/render-elements](../api/motajs-render-elements/index.md) 渲染系统内置元素代码
|
||||
- [@motajs/render-style](../api/motajs-render-style/index.md) 渲染系统样式代码
|
||||
- [@motajs/render-vue](../api/motajs-render-vue/index.md) 渲染系统 vue 支持代码
|
||||
- [@motajs/system](../api/motajs-system/index.md) 渲染层系统代码
|
||||
- [@motajs/system-action](../api/motajs-system-action/index.md) 渲染层交互系统代码
|
||||
- [@motajs/system-ui](../api/motajs-system-ui/index.md) 渲染层 UI 系统代码
|
||||
- [@motajs/types](../api/motajs-types/index.md) 渲染层类型代码
|
||||
- [@user/client-modules](../api/user-client-modules/index.md) 用户渲染层主要代码
|
||||
- [@user/data-base](../api/user-data-base/index.md) 用户数据层底层代码
|
||||
- [@user/data-fallback](../api/user-data-fallback/index.md) 用户数据层向后兼容代码
|
||||
- [@user/data-state](../api/user-data-state/index.md) 用户数据层状态代码
|
||||
- [@user/data-utils](../api/user-data-utils/index.md) 用户数据层工具代码
|
||||
- [@user/entry-client](../api/user-entry-client/index.md) 用户渲染层入口
|
||||
- [@user/entry-data](../api/user-entry-data/index.md) 用户数据层入口
|
||||
- [@user/legacy-plugin-client](../api/user-legacy-plugin-client/index.md) 用户遗留渲染层代码
|
||||
- [@user/legacy-plugin-data](../api/user-legacy-plugin-data/index.md) 用户遗留数据层代码
|
||||
- [@motajs/client](../api/motajs-client) 渲染层代码
|
||||
- [@motajs/client-base](../api/motajs-client-base) 渲染层底层代码
|
||||
- [@motajs/common](../api/motajs-common) 渲染层和数据层通用代码
|
||||
- [@motajs/legacy-client](../api/motajs-legacy-client) 遗留渲染层代码
|
||||
- [@motajs/legacy-common](../api/motajs-legacy-common) 遗留通用代码
|
||||
- [@motajs/legacy-data](../api/motajs-legacy-data) 遗留数据层代码
|
||||
- [@motajs/legacy-system](../api/motajs-legacy-system) 遗留渲染层系统代码
|
||||
- [@motajs/legacy-ui](../api/motajs-legacy-ui) 遗留 UI 相关代码
|
||||
- [@motajs/render](../api/motajs-render) 渲染系统代码
|
||||
- [@motajs/render-core](../api/motajs-render-core) 渲染系统核心代码
|
||||
- [@motajs/render-elements](../api/motajs-render-elements) 渲染系统内置元素代码
|
||||
- [@motajs/render-style](../api/motajs-render-style) 渲染系统样式代码
|
||||
- [@motajs/render-vue](../api/motajs-render-vue) 渲染系统 vue 支持代码
|
||||
- [@motajs/system](../api/motajs-system) 渲染层系统代码
|
||||
- [@motajs/system-action](../api/motajs-system-action) 渲染层交互系统代码
|
||||
- [@motajs/system-ui](../api/motajs-system-ui) 渲染层 UI 系统代码
|
||||
- [@motajs/types](../api/motajs-types) 渲染层类型代码
|
||||
- [@user/client-modules](../api/user-client-modules) 用户渲染层主要代码
|
||||
- [@user/data-base](../api/user-data-base) 用户数据层底层代码
|
||||
- [@user/data-fallback](../api/user-data-fallback) 用户数据层向后兼容代码
|
||||
- [@user/data-state](../api/user-data-state) 用户数据层状态代码
|
||||
- [@user/data-utils](../api/user-data-utils) 用户数据层工具代码
|
||||
- [@user/entry-client](../api/user-entry-client) 用户渲染层入口
|
||||
- [@user/entry-data](../api/user-entry-data) 用户数据层入口
|
||||
- [@user/legacy-plugin-client](../api/user-legacy-plugin-client) 用户遗留渲染层代码
|
||||
- [@user/legacy-plugin-data](../api/user-legacy-plugin-data) 用户遗留数据层代码
|
||||
|
||||
## Mota 全局变量
|
||||
|
||||
@ -93,6 +94,7 @@ hook.on('afterBattle', enemy => {
|
||||
2. 加载 2.x 样板的第三方库
|
||||
|
||||
3. 如果是游戏中,加载 `src/main.ts`
|
||||
|
||||
1. 加载渲染端入口
|
||||
2. 加载数据端入口
|
||||
3. 并行初始化数据端与渲染端,在数据端写入 `Mota` 全局变量
|
||||
@ -102,6 +104,7 @@ hook.on('afterBattle', enemy => {
|
||||
7. 执行渲染端各个模块的初始化函数
|
||||
|
||||
4. 如果是录像验证中:
|
||||
|
||||
1. 加载数据端入口
|
||||
2. 初始化数据端,写入 `Mota` 全局变量
|
||||
3. 初始化完毕后执行 `loading.emit('dataRegistered')` 与 `loading.emit('registered')` 钩子
|
||||
|
@ -330,10 +330,12 @@ const finalTrans = trans.multiply(childTrans);
|
||||
#### 常见问题排查
|
||||
|
||||
1. 变换不生效?
|
||||
|
||||
- 验证绑定的对象是否实现 `updateTransform`
|
||||
- 检查有没有把 `trans` 对象赋值给元素的 `transform` 属性
|
||||
|
||||
2. 性能问题
|
||||
|
||||
- 避免高频调用 `setTransform`
|
||||
- 优先使用叠加方法代替矩阵直接操作
|
||||
- 利用 `clone()` 复用已有变换
|
||||
@ -349,7 +351,7 @@ type RenderFn = (canvas: MotaOffscreenCanvas2D, transform: Transform) => void;
|
||||
- `canvas`: 要渲染至的画布,一般直接将内容渲染至这个画布上
|
||||
- `transform`: 当前元素的变换矩阵,相对于父元素,不常用
|
||||
|
||||
多数情况下,我们只会使用到第一个参数,`MotaOffscreenCanvas2D` 接口请参考 [API 文档](../api/motajs-render-core/index.md)。下面是一个典型案例:
|
||||
多数情况下,我们只会使用到第一个参数,`MotaOffscreenCanvas2D` 接口请参考 [API 文档](../api/motajs-render-core)。下面是一个典型案例:
|
||||
|
||||
```tsx
|
||||
const render = (canvas: MotaOffscreenCanvas2D) => {
|
||||
|
@ -31,7 +31,7 @@ watch(data, () => mySprite.value?.update());
|
||||
|
||||
## 我的 UI 很卡
|
||||
|
||||
可能使用了平铺式布局,建议使用 `Scroll` 组件或者 `Page` 组件来对平铺内容分割,从而提高渲染效率。可以参考对应的 [API 文档](../api/user-client-modules/组件 Scroll)。
|
||||
可能使用了平铺式布局,建议使用 `Scroll` 组件或者 `Page` 组件来对平铺内容分割,从而提高渲染效率。可以参考对应的 [API 文档](../api/user-client-modules/Scroll)。
|
||||
|
||||
## 玩着玩着突然黑屏了一下,然后画面就不显示了
|
||||
|
||||
|
@ -820,7 +820,7 @@ watch(selected, () => {
|
||||
|
||||
## 修改 UI 参数
|
||||
|
||||
在打开 UI 时,我们可以传入参数,默认情况下,可以传入所有的 `BaseProps`,也就是所有元素通用属性,以及自己定义的 UI 参数。`BaseProps` 内容较多,可以参考 [API 文档](../api/motajs-render-core/RenderItem.md)。除此之外,我们还为这个自定义怪物手册添加了 `floorId` 参数,它也可以在打开 UI 时传入。如果需要打开的 UI 参数具有响应式,例如可以动态修改楼层 id,可以使用 `reactive` 方法。示例如下:
|
||||
在打开 UI 时,我们可以传入参数,默认情况下,可以传入所有的 `BaseProps`,也就是所有元素通用属性,以及自己定义的 UI 参数。`BaseProps` 内容较多,可以参考 [API 文档](../api/motajs-render-vue/RenderItem.md)。除此之外,我们还为这个自定义怪物手册添加了 `floorId` 参数,它也可以在打开 UI 时传入。如果需要打开的 UI 参数具有响应式,例如可以动态修改楼层 id,可以使用 `reactive` 方法。示例如下:
|
||||
|
||||
```ts
|
||||
import { MyBookProps, MyBookUI } from './myUI';
|
||||
|
41
mota.config.ts
Normal file
41
mota.config.ts
Normal file
@ -0,0 +1,41 @@
|
||||
interface MotaConfig {
|
||||
name: string;
|
||||
resourceName?: string;
|
||||
zip?: Record<string, string[]>;
|
||||
}
|
||||
|
||||
function defineConfig(config: MotaConfig): MotaConfig {
|
||||
return config;
|
||||
}
|
||||
|
||||
export default defineConfig({
|
||||
// 这里修改塔的name,请保持与全塔属性的完全相同,否则发布之后可能无法进行游玩
|
||||
name: 'HumanBreak',
|
||||
resourceName: 'HumanBreakRes',
|
||||
zip: {
|
||||
'resource.zip': [
|
||||
'autotiles/*',
|
||||
'tilesets/*',
|
||||
'images/*',
|
||||
'animates/*',
|
||||
'sounds/*',
|
||||
'fonts/*',
|
||||
'!images/bg.jpg'
|
||||
],
|
||||
'weather.zip': [
|
||||
'materials/fog.png',
|
||||
'materials/cloud.png',
|
||||
'materials/sun.png'
|
||||
],
|
||||
'materials.zip': [
|
||||
'materials/animates.png',
|
||||
'materials/enemy48.png',
|
||||
'materials/enemys.png',
|
||||
'materials/icons.png',
|
||||
'materials/items.png',
|
||||
'materials/npc48.png',
|
||||
'materials/npcs.png',
|
||||
'materials/terrains.png'
|
||||
]
|
||||
}
|
||||
});
|
@ -50,7 +50,6 @@
|
||||
"@rollup/plugin-terser": "^0.4.4",
|
||||
"@rollup/plugin-typescript": "^11.1.6",
|
||||
"@types/babel__core": "^7.20.5",
|
||||
"@types/express": "^5.0.3",
|
||||
"@types/fontmin": "^0.9.5",
|
||||
"@types/fs-extra": "^9.0.13",
|
||||
"@types/lodash-es": "^4.17.12",
|
||||
@ -66,7 +65,6 @@
|
||||
"eslint-plugin-prettier": "^5.5.0",
|
||||
"eslint-plugin-react": "^7.37.5",
|
||||
"eslint-plugin-vue": "^9.33.0",
|
||||
"express": "^5.1.0",
|
||||
"fontmin": "^0.9.9",
|
||||
"form-data": "^4.0.2",
|
||||
"fs-extra": "^10.1.0",
|
||||
|
430
pnpm-lock.yaml
430
pnpm-lock.yaml
@ -93,9 +93,6 @@ importers:
|
||||
'@types/babel__core':
|
||||
specifier: ^7.20.5
|
||||
version: 7.20.5
|
||||
'@types/express':
|
||||
specifier: ^5.0.3
|
||||
version: 5.0.3
|
||||
'@types/fontmin':
|
||||
specifier: ^0.9.5
|
||||
version: 0.9.5
|
||||
@ -141,9 +138,6 @@ importers:
|
||||
eslint-plugin-vue:
|
||||
specifier: ^9.33.0
|
||||
version: 9.33.0(eslint@9.33.0)
|
||||
express:
|
||||
specifier: ^5.1.0
|
||||
version: 5.1.0
|
||||
fontmin:
|
||||
specifier: ^0.9.9
|
||||
version: 0.9.9
|
||||
@ -2243,12 +2237,6 @@ packages:
|
||||
'@types/babel__traverse@7.20.6':
|
||||
resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==}
|
||||
|
||||
'@types/body-parser@1.19.6':
|
||||
resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==}
|
||||
|
||||
'@types/connect@3.4.38':
|
||||
resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
|
||||
|
||||
'@types/d3-array@3.2.1':
|
||||
resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==}
|
||||
|
||||
@ -2345,12 +2333,6 @@ packages:
|
||||
'@types/estree@1.0.6':
|
||||
resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
|
||||
|
||||
'@types/express-serve-static-core@5.0.7':
|
||||
resolution: {integrity: sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==}
|
||||
|
||||
'@types/express@5.0.3':
|
||||
resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==}
|
||||
|
||||
'@types/fontmin@0.9.5':
|
||||
resolution: {integrity: sha512-WQwvTQV73bx7u6MRrZp13L9GeXhTjzLeRrHVk24+iquhLQMyCaL3n1R1K/P6Sghreq52hdZFAdUynzmR/mdL3A==}
|
||||
|
||||
@ -2363,9 +2345,6 @@ packages:
|
||||
'@types/hast@3.0.4':
|
||||
resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
|
||||
|
||||
'@types/http-errors@2.0.5':
|
||||
resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==}
|
||||
|
||||
'@types/json-schema@7.0.15':
|
||||
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
|
||||
|
||||
@ -2387,9 +2366,6 @@ packages:
|
||||
'@types/mdurl@2.0.0':
|
||||
resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==}
|
||||
|
||||
'@types/mime@1.3.5':
|
||||
resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
|
||||
|
||||
'@types/minimist@1.2.5':
|
||||
resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==}
|
||||
|
||||
@ -2399,21 +2375,9 @@ packages:
|
||||
'@types/normalize-package-data@2.4.4':
|
||||
resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
|
||||
|
||||
'@types/qs@6.14.0':
|
||||
resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==}
|
||||
|
||||
'@types/range-parser@1.2.7':
|
||||
resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
|
||||
|
||||
'@types/resolve@1.20.2':
|
||||
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
|
||||
|
||||
'@types/send@0.17.5':
|
||||
resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==}
|
||||
|
||||
'@types/serve-static@1.15.8':
|
||||
resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==}
|
||||
|
||||
'@types/trusted-types@2.0.7':
|
||||
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
|
||||
|
||||
@ -2699,10 +2663,6 @@ packages:
|
||||
abbrev@1.1.1:
|
||||
resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
|
||||
|
||||
accepts@2.0.0:
|
||||
resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
acorn-jsx@5.3.2:
|
||||
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
|
||||
peerDependencies:
|
||||
@ -2925,10 +2885,6 @@ packages:
|
||||
bl@4.1.0:
|
||||
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
|
||||
|
||||
body-parser@2.2.0:
|
||||
resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
boolbase@1.0.0:
|
||||
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
|
||||
|
||||
@ -2994,10 +2950,6 @@ packages:
|
||||
resolution: {integrity: sha512-Qg0ggJUWJq90vtg4lDsGN9CDWvzBMQxhiEkSOD/sJfYt6BLect3eV1/S6K7SCSKJ34n60rf6U5eUPmQENVE4UA==}
|
||||
engines: {node: '>=8.12.0'}
|
||||
|
||||
bytes@3.1.2:
|
||||
resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
cacache@16.1.3:
|
||||
resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==}
|
||||
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
|
||||
@ -3196,28 +3148,12 @@ packages:
|
||||
console-control-strings@1.1.0:
|
||||
resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==}
|
||||
|
||||
content-disposition@1.0.0:
|
||||
resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
content-type@1.0.5:
|
||||
resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
convert-source-map@1.9.0:
|
||||
resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
|
||||
|
||||
convert-source-map@2.0.0:
|
||||
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
|
||||
|
||||
cookie-signature@1.2.2:
|
||||
resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
|
||||
engines: {node: '>=6.6.0'}
|
||||
|
||||
cookie@0.7.2:
|
||||
resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
copy-anything@2.0.6:
|
||||
resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==}
|
||||
|
||||
@ -3516,10 +3452,6 @@ packages:
|
||||
delegates@1.0.0:
|
||||
resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
|
||||
|
||||
depd@2.0.0:
|
||||
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
dependency-tree@11.1.1:
|
||||
resolution: {integrity: sha512-pnkCd8VGOq70EVaEQxDC9mZCjCwYj4yG4j8h+PEJswuWp+rdE6p8zbtVvWk+yPwaVimOjlhNi782U9K5KOU9MQ==}
|
||||
engines: {node: '>=18'}
|
||||
@ -3618,9 +3550,6 @@ packages:
|
||||
eastasianwidth@0.2.0:
|
||||
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
|
||||
|
||||
ee-first@1.1.1:
|
||||
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
|
||||
|
||||
electron-to-chromium@1.5.122:
|
||||
resolution: {integrity: sha512-EML1wnwkY5MFh/xUnCvY8FrhUuKzdYhowuZExZOfwJo+Zu9OsNCI23Cgl5y7awy7HrUHSwB1Z8pZX5TI34lsUg==}
|
||||
|
||||
@ -3639,10 +3568,6 @@ packages:
|
||||
emoji-regex@9.2.2:
|
||||
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
|
||||
|
||||
encodeurl@2.0.0:
|
||||
resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
encoding@0.1.13:
|
||||
resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==}
|
||||
|
||||
@ -3724,9 +3649,6 @@ packages:
|
||||
resolution: {integrity: sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
escape-html@1.0.3:
|
||||
resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
|
||||
|
||||
escape-string-regexp@4.0.0:
|
||||
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
|
||||
engines: {node: '>=10'}
|
||||
@ -3830,20 +3752,12 @@ packages:
|
||||
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
etag@1.8.1:
|
||||
resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
eventemitter3@5.0.1:
|
||||
resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
|
||||
|
||||
exponential-backoff@3.1.2:
|
||||
resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==}
|
||||
|
||||
express@5.1.0:
|
||||
resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
exsolve@1.0.4:
|
||||
resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==}
|
||||
|
||||
@ -3904,10 +3818,6 @@ packages:
|
||||
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
finalhandler@2.1.0:
|
||||
resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
find-up@5.0.0:
|
||||
resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
|
||||
engines: {node: '>=10'}
|
||||
@ -3957,17 +3867,9 @@ packages:
|
||||
resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==}
|
||||
engines: {node: '>= 6'}
|
||||
|
||||
forwarded@0.2.0:
|
||||
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
fraction.js@4.3.7:
|
||||
resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
|
||||
|
||||
fresh@2.0.0:
|
||||
resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
fs-constants@1.0.0:
|
||||
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
|
||||
|
||||
@ -4183,10 +4085,6 @@ packages:
|
||||
http-cache-semantics@4.1.1:
|
||||
resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
|
||||
|
||||
http-errors@2.0.0:
|
||||
resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
http-proxy-agent@5.0.0:
|
||||
resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
|
||||
engines: {node: '>= 6'}
|
||||
@ -4273,10 +4171,6 @@ packages:
|
||||
resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==}
|
||||
engines: {node: '>= 12'}
|
||||
|
||||
ipaddr.js@1.9.1:
|
||||
resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
|
||||
engines: {node: '>= 0.10'}
|
||||
|
||||
is-absolute@1.0.0:
|
||||
resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
@ -4393,9 +4287,6 @@ packages:
|
||||
resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
is-promise@4.0.0:
|
||||
resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
|
||||
|
||||
is-reference@1.2.1:
|
||||
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
|
||||
|
||||
@ -4714,10 +4605,6 @@ packages:
|
||||
mdast-util-to-hast@13.2.0:
|
||||
resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==}
|
||||
|
||||
media-typer@1.1.0:
|
||||
resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
mensch@0.3.4:
|
||||
resolution: {integrity: sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==}
|
||||
|
||||
@ -4729,10 +4616,6 @@ packages:
|
||||
resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
merge-descriptors@2.0.0:
|
||||
resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
merge2@1.4.1:
|
||||
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
|
||||
engines: {node: '>= 8'}
|
||||
@ -4766,18 +4649,10 @@ packages:
|
||||
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
mime-db@1.54.0:
|
||||
resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
mime-types@2.1.35:
|
||||
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
mime-types@3.0.1:
|
||||
resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
mime@1.6.0:
|
||||
resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
|
||||
engines: {node: '>=4'}
|
||||
@ -4920,10 +4795,6 @@ packages:
|
||||
resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
negotiator@1.0.0:
|
||||
resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
node-fetch@2.7.0:
|
||||
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
|
||||
engines: {node: 4.x || >=6.0.0}
|
||||
@ -5012,10 +4883,6 @@ packages:
|
||||
ogg-opus-decoder@1.7.0:
|
||||
resolution: {integrity: sha512-/lrj4+ZGjxZCCNiDSlNEckLrCL+UU9N9XtqES7sXq/Lm6PMi8Pwn/D6TTsbvG45krt21ohAh2FqdEsMuI7ZN4w==}
|
||||
|
||||
on-finished@2.4.1:
|
||||
resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
once@1.4.0:
|
||||
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
|
||||
|
||||
@ -5090,10 +4957,6 @@ packages:
|
||||
parse5@6.0.1:
|
||||
resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
|
||||
|
||||
parseurl@1.3.3:
|
||||
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
path-browserify@1.0.1:
|
||||
resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
|
||||
|
||||
@ -5122,10 +4985,6 @@ packages:
|
||||
resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==}
|
||||
engines: {node: 20 || >=22}
|
||||
|
||||
path-to-regexp@8.2.0:
|
||||
resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==}
|
||||
engines: {node: '>=16'}
|
||||
|
||||
pathe@2.0.3:
|
||||
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
|
||||
|
||||
@ -5390,10 +5249,6 @@ packages:
|
||||
property-information@7.0.0:
|
||||
resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==}
|
||||
|
||||
proxy-addr@2.0.7:
|
||||
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
|
||||
engines: {node: '>= 0.10'}
|
||||
|
||||
proxy-from-env@1.1.0:
|
||||
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
|
||||
|
||||
@ -5413,10 +5268,6 @@ packages:
|
||||
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
qs@6.14.0:
|
||||
resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
|
||||
engines: {node: '>=0.6'}
|
||||
|
||||
quansync@0.2.10:
|
||||
resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==}
|
||||
|
||||
@ -5433,14 +5284,6 @@ packages:
|
||||
randombytes@2.1.0:
|
||||
resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
|
||||
|
||||
range-parser@1.2.1:
|
||||
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
raw-body@3.0.0:
|
||||
resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
rc@1.2.8:
|
||||
resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
|
||||
hasBin: true
|
||||
@ -5612,10 +5455,6 @@ packages:
|
||||
roughjs@4.6.6:
|
||||
resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==}
|
||||
|
||||
router@2.2.0:
|
||||
resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
run-parallel@1.2.0:
|
||||
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
|
||||
|
||||
@ -5683,17 +5522,9 @@ packages:
|
||||
engines: {node: '>=10'}
|
||||
hasBin: true
|
||||
|
||||
send@1.2.0:
|
||||
resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
serialize-javascript@6.0.2:
|
||||
resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
|
||||
|
||||
serve-static@2.2.0:
|
||||
resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
set-blocking@2.0.0:
|
||||
resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
|
||||
|
||||
@ -5712,9 +5543,6 @@ packages:
|
||||
setimmediate@1.0.5:
|
||||
resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
|
||||
|
||||
setprototypeof@1.2.0:
|
||||
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
|
||||
|
||||
shallow-equal@1.2.1:
|
||||
resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==}
|
||||
|
||||
@ -5825,14 +5653,6 @@ packages:
|
||||
resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==}
|
||||
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
|
||||
|
||||
statuses@2.0.1:
|
||||
resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
statuses@2.0.2:
|
||||
resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
stop-iteration-iterator@1.1.0:
|
||||
resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
|
||||
engines: {node: '>= 0.4'}
|
||||
@ -6006,10 +5826,6 @@ packages:
|
||||
resolution: {integrity: sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==}
|
||||
engines: {node: '>= 0.10'}
|
||||
|
||||
toidentifier@1.0.1:
|
||||
resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
|
||||
engines: {node: '>=0.6'}
|
||||
|
||||
tr46@0.0.3:
|
||||
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
|
||||
|
||||
@ -6067,10 +5883,6 @@ packages:
|
||||
resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
type-is@2.0.1:
|
||||
resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
typed-array-buffer@1.0.3:
|
||||
resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
@ -6167,10 +5979,6 @@ packages:
|
||||
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
|
||||
unpipe@1.0.0:
|
||||
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
unplugin-vue-components@0.22.12:
|
||||
resolution: {integrity: sha512-FxyzsuBvMCYPIk+8cgscGBQ345tvwVu+qY5IhE++eorkyvA4Z1TiD/HCiim+Kbqozl10i4K+z+NCa2WO2jexRA==}
|
||||
engines: {node: '>=14'}
|
||||
@ -6216,10 +6024,6 @@ packages:
|
||||
resolution: {integrity: sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==}
|
||||
engines: {node: '>= 0.10'}
|
||||
|
||||
vary@1.1.2:
|
||||
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
vfile-message@4.0.2:
|
||||
resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
|
||||
|
||||
@ -7379,7 +7183,7 @@ snapshots:
|
||||
'@babel/parser': 7.28.3
|
||||
'@babel/template': 7.27.2
|
||||
'@babel/types': 7.27.1
|
||||
debug: 4.4.1
|
||||
debug: 4.4.0
|
||||
globals: 11.12.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
@ -8307,15 +8111,6 @@ snapshots:
|
||||
dependencies:
|
||||
'@babel/types': 7.26.10
|
||||
|
||||
'@types/body-parser@1.19.6':
|
||||
dependencies:
|
||||
'@types/connect': 3.4.38
|
||||
'@types/node': 18.19.123
|
||||
|
||||
'@types/connect@3.4.38':
|
||||
dependencies:
|
||||
'@types/node': 18.19.123
|
||||
|
||||
'@types/d3-array@3.2.1': {}
|
||||
|
||||
'@types/d3-axis@3.0.6':
|
||||
@ -8435,19 +8230,6 @@ snapshots:
|
||||
|
||||
'@types/estree@1.0.6': {}
|
||||
|
||||
'@types/express-serve-static-core@5.0.7':
|
||||
dependencies:
|
||||
'@types/node': 18.19.123
|
||||
'@types/qs': 6.14.0
|
||||
'@types/range-parser': 1.2.7
|
||||
'@types/send': 0.17.5
|
||||
|
||||
'@types/express@5.0.3':
|
||||
dependencies:
|
||||
'@types/body-parser': 1.19.6
|
||||
'@types/express-serve-static-core': 5.0.7
|
||||
'@types/serve-static': 1.15.8
|
||||
|
||||
'@types/fontmin@0.9.5':
|
||||
dependencies:
|
||||
'@types/node': 18.19.123
|
||||
@ -8462,8 +8244,6 @@ snapshots:
|
||||
dependencies:
|
||||
'@types/unist': 3.0.3
|
||||
|
||||
'@types/http-errors@2.0.5': {}
|
||||
|
||||
'@types/json-schema@7.0.15': {}
|
||||
|
||||
'@types/linkify-it@5.0.0': {}
|
||||
@ -8485,8 +8265,6 @@ snapshots:
|
||||
|
||||
'@types/mdurl@2.0.0': {}
|
||||
|
||||
'@types/mime@1.3.5': {}
|
||||
|
||||
'@types/minimist@1.2.5': {}
|
||||
|
||||
'@types/node@18.19.123':
|
||||
@ -8495,23 +8273,8 @@ snapshots:
|
||||
|
||||
'@types/normalize-package-data@2.4.4': {}
|
||||
|
||||
'@types/qs@6.14.0': {}
|
||||
|
||||
'@types/range-parser@1.2.7': {}
|
||||
|
||||
'@types/resolve@1.20.2': {}
|
||||
|
||||
'@types/send@0.17.5':
|
||||
dependencies:
|
||||
'@types/mime': 1.3.5
|
||||
'@types/node': 18.19.123
|
||||
|
||||
'@types/serve-static@1.15.8':
|
||||
dependencies:
|
||||
'@types/http-errors': 2.0.5
|
||||
'@types/node': 18.19.123
|
||||
'@types/send': 0.17.5
|
||||
|
||||
'@types/trusted-types@2.0.7':
|
||||
optional: true
|
||||
|
||||
@ -8912,11 +8675,6 @@ snapshots:
|
||||
|
||||
abbrev@1.1.1: {}
|
||||
|
||||
accepts@2.0.0:
|
||||
dependencies:
|
||||
mime-types: 3.0.1
|
||||
negotiator: 1.0.0
|
||||
|
||||
acorn-jsx@5.3.2(acorn@8.14.1):
|
||||
dependencies:
|
||||
acorn: 8.14.1
|
||||
@ -9196,20 +8954,6 @@ snapshots:
|
||||
inherits: 2.0.4
|
||||
readable-stream: 3.6.2
|
||||
|
||||
body-parser@2.2.0:
|
||||
dependencies:
|
||||
bytes: 3.1.2
|
||||
content-type: 1.0.5
|
||||
debug: 4.4.1
|
||||
http-errors: 2.0.0
|
||||
iconv-lite: 0.6.3
|
||||
on-finished: 2.4.1
|
||||
qs: 6.14.0
|
||||
raw-body: 3.0.0
|
||||
type-is: 2.0.1
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
boolbase@1.0.0: {}
|
||||
|
||||
brace-expansion@1.1.11:
|
||||
@ -9282,8 +9026,6 @@ snapshots:
|
||||
dependencies:
|
||||
readable-stream: 3.6.2
|
||||
|
||||
bytes@3.1.2: {}
|
||||
|
||||
cacache@16.1.3:
|
||||
dependencies:
|
||||
'@npmcli/fs': 2.1.2
|
||||
@ -9509,20 +9251,10 @@ snapshots:
|
||||
|
||||
console-control-strings@1.1.0: {}
|
||||
|
||||
content-disposition@1.0.0:
|
||||
dependencies:
|
||||
safe-buffer: 5.2.1
|
||||
|
||||
content-type@1.0.5: {}
|
||||
|
||||
convert-source-map@1.9.0: {}
|
||||
|
||||
convert-source-map@2.0.0: {}
|
||||
|
||||
cookie-signature@1.2.2: {}
|
||||
|
||||
cookie@0.7.2: {}
|
||||
|
||||
copy-anything@2.0.6:
|
||||
dependencies:
|
||||
is-what: 3.14.1
|
||||
@ -9838,8 +9570,6 @@ snapshots:
|
||||
|
||||
delegates@1.0.0: {}
|
||||
|
||||
depd@2.0.0: {}
|
||||
|
||||
dependency-tree@11.1.1:
|
||||
dependencies:
|
||||
commander: 12.1.0
|
||||
@ -9962,8 +9692,6 @@ snapshots:
|
||||
|
||||
eastasianwidth@0.2.0: {}
|
||||
|
||||
ee-first@1.1.1: {}
|
||||
|
||||
electron-to-chromium@1.5.122: {}
|
||||
|
||||
electron-to-chromium@1.5.157: {}
|
||||
@ -9976,8 +9704,6 @@ snapshots:
|
||||
|
||||
emoji-regex@9.2.2: {}
|
||||
|
||||
encodeurl@2.0.0: {}
|
||||
|
||||
encoding@0.1.13:
|
||||
dependencies:
|
||||
iconv-lite: 0.6.3
|
||||
@ -10168,8 +9894,6 @@ snapshots:
|
||||
|
||||
escape-goat@3.0.0: {}
|
||||
|
||||
escape-html@1.0.3: {}
|
||||
|
||||
escape-string-regexp@4.0.0: {}
|
||||
|
||||
escodegen@2.1.0:
|
||||
@ -10314,44 +10038,10 @@ snapshots:
|
||||
|
||||
esutils@2.0.3: {}
|
||||
|
||||
etag@1.8.1: {}
|
||||
|
||||
eventemitter3@5.0.1: {}
|
||||
|
||||
exponential-backoff@3.1.2: {}
|
||||
|
||||
express@5.1.0:
|
||||
dependencies:
|
||||
accepts: 2.0.0
|
||||
body-parser: 2.2.0
|
||||
content-disposition: 1.0.0
|
||||
content-type: 1.0.5
|
||||
cookie: 0.7.2
|
||||
cookie-signature: 1.2.2
|
||||
debug: 4.4.1
|
||||
encodeurl: 2.0.0
|
||||
escape-html: 1.0.3
|
||||
etag: 1.8.1
|
||||
finalhandler: 2.1.0
|
||||
fresh: 2.0.0
|
||||
http-errors: 2.0.0
|
||||
merge-descriptors: 2.0.0
|
||||
mime-types: 3.0.1
|
||||
on-finished: 2.4.1
|
||||
once: 1.4.0
|
||||
parseurl: 1.3.3
|
||||
proxy-addr: 2.0.7
|
||||
qs: 6.14.0
|
||||
range-parser: 1.2.1
|
||||
router: 2.2.0
|
||||
send: 1.2.0
|
||||
serve-static: 2.2.0
|
||||
statuses: 2.0.2
|
||||
type-is: 2.0.1
|
||||
vary: 1.1.2
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
exsolve@1.0.4: {}
|
||||
|
||||
extend@3.0.2: {}
|
||||
@ -10414,17 +10104,6 @@ snapshots:
|
||||
dependencies:
|
||||
to-regex-range: 5.0.1
|
||||
|
||||
finalhandler@2.1.0:
|
||||
dependencies:
|
||||
debug: 4.4.1
|
||||
encodeurl: 2.0.0
|
||||
escape-html: 1.0.3
|
||||
on-finished: 2.4.1
|
||||
parseurl: 1.3.3
|
||||
statuses: 2.0.2
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
find-up@5.0.0:
|
||||
dependencies:
|
||||
locate-path: 6.0.0
|
||||
@ -10494,12 +10173,8 @@ snapshots:
|
||||
hasown: 2.0.2
|
||||
mime-types: 2.1.35
|
||||
|
||||
forwarded@0.2.0: {}
|
||||
|
||||
fraction.js@4.3.7: {}
|
||||
|
||||
fresh@2.0.0: {}
|
||||
|
||||
fs-constants@1.0.0: {}
|
||||
|
||||
fs-extra@10.1.0:
|
||||
@ -10748,14 +10423,6 @@ snapshots:
|
||||
|
||||
http-cache-semantics@4.1.1: {}
|
||||
|
||||
http-errors@2.0.0:
|
||||
dependencies:
|
||||
depd: 2.0.0
|
||||
inherits: 2.0.4
|
||||
setprototypeof: 1.2.0
|
||||
statuses: 2.0.1
|
||||
toidentifier: 1.0.1
|
||||
|
||||
http-proxy-agent@5.0.0:
|
||||
dependencies:
|
||||
'@tootallnate/once': 2.0.0
|
||||
@ -10833,8 +10500,6 @@ snapshots:
|
||||
jsbn: 1.1.0
|
||||
sprintf-js: 1.1.3
|
||||
|
||||
ipaddr.js@1.9.1: {}
|
||||
|
||||
is-absolute@1.0.0:
|
||||
dependencies:
|
||||
is-relative: 1.0.0
|
||||
@ -10940,8 +10605,6 @@ snapshots:
|
||||
|
||||
is-plain-object@3.0.1: {}
|
||||
|
||||
is-promise@4.0.0: {}
|
||||
|
||||
is-reference@1.2.1:
|
||||
dependencies:
|
||||
'@types/estree': 1.0.6
|
||||
@ -11286,8 +10949,6 @@ snapshots:
|
||||
unist-util-visit: 5.0.0
|
||||
vfile: 6.0.3
|
||||
|
||||
media-typer@1.1.0: {}
|
||||
|
||||
mensch@0.3.4: {}
|
||||
|
||||
meow@10.1.5:
|
||||
@ -11307,8 +10968,6 @@ snapshots:
|
||||
|
||||
meow@13.2.0: {}
|
||||
|
||||
merge-descriptors@2.0.0: {}
|
||||
|
||||
merge2@1.4.1: {}
|
||||
|
||||
mermaid@11.9.0:
|
||||
@ -11362,16 +11021,10 @@ snapshots:
|
||||
|
||||
mime-db@1.52.0: {}
|
||||
|
||||
mime-db@1.54.0: {}
|
||||
|
||||
mime-types@2.1.35:
|
||||
dependencies:
|
||||
mime-db: 1.52.0
|
||||
|
||||
mime-types@3.0.1:
|
||||
dependencies:
|
||||
mime-db: 1.54.0
|
||||
|
||||
mime@1.6.0:
|
||||
optional: true
|
||||
|
||||
@ -11499,8 +11152,6 @@ snapshots:
|
||||
|
||||
negotiator@0.6.4: {}
|
||||
|
||||
negotiator@1.0.0: {}
|
||||
|
||||
node-fetch@2.7.0(encoding@0.1.13):
|
||||
dependencies:
|
||||
whatwg-url: 5.0.0
|
||||
@ -11610,10 +11261,6 @@ snapshots:
|
||||
codec-parser: 2.5.0
|
||||
opus-decoder: 0.7.10
|
||||
|
||||
on-finished@2.4.1:
|
||||
dependencies:
|
||||
ee-first: 1.1.1
|
||||
|
||||
once@1.4.0:
|
||||
dependencies:
|
||||
wrappy: 1.0.2
|
||||
@ -11706,8 +11353,6 @@ snapshots:
|
||||
|
||||
parse5@6.0.1: {}
|
||||
|
||||
parseurl@1.3.3: {}
|
||||
|
||||
path-browserify@1.0.1: {}
|
||||
|
||||
path-data-parser@0.1.0: {}
|
||||
@ -11727,8 +11372,6 @@ snapshots:
|
||||
lru-cache: 11.0.2
|
||||
minipass: 7.1.2
|
||||
|
||||
path-to-regexp@8.2.0: {}
|
||||
|
||||
pathe@2.0.3: {}
|
||||
|
||||
pend@1.2.0: {}
|
||||
@ -12053,11 +11696,6 @@ snapshots:
|
||||
|
||||
property-information@7.0.0: {}
|
||||
|
||||
proxy-addr@2.0.7:
|
||||
dependencies:
|
||||
forwarded: 0.2.0
|
||||
ipaddr.js: 1.9.1
|
||||
|
||||
proxy-from-env@1.1.0: {}
|
||||
|
||||
prr@1.0.1:
|
||||
@ -12081,10 +11719,6 @@ snapshots:
|
||||
|
||||
punycode@2.3.1: {}
|
||||
|
||||
qs@6.14.0:
|
||||
dependencies:
|
||||
side-channel: 1.1.0
|
||||
|
||||
quansync@0.2.10: {}
|
||||
|
||||
queue-microtask@1.2.3: {}
|
||||
@ -12097,15 +11731,6 @@ snapshots:
|
||||
dependencies:
|
||||
safe-buffer: 5.2.1
|
||||
|
||||
range-parser@1.2.1: {}
|
||||
|
||||
raw-body@3.0.0:
|
||||
dependencies:
|
||||
bytes: 3.1.2
|
||||
http-errors: 2.0.0
|
||||
iconv-lite: 0.6.3
|
||||
unpipe: 1.0.0
|
||||
|
||||
rc@1.2.8:
|
||||
dependencies:
|
||||
deep-extend: 0.6.0
|
||||
@ -12313,16 +11938,6 @@ snapshots:
|
||||
points-on-curve: 0.2.0
|
||||
points-on-path: 0.2.1
|
||||
|
||||
router@2.2.0:
|
||||
dependencies:
|
||||
debug: 4.4.1
|
||||
depd: 2.0.0
|
||||
is-promise: 4.0.0
|
||||
parseurl: 1.3.3
|
||||
path-to-regexp: 8.2.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
run-parallel@1.2.0:
|
||||
dependencies:
|
||||
queue-microtask: 1.2.3
|
||||
@ -12384,35 +11999,10 @@ snapshots:
|
||||
|
||||
semver@7.7.2: {}
|
||||
|
||||
send@1.2.0:
|
||||
dependencies:
|
||||
debug: 4.4.1
|
||||
encodeurl: 2.0.0
|
||||
escape-html: 1.0.3
|
||||
etag: 1.8.1
|
||||
fresh: 2.0.0
|
||||
http-errors: 2.0.0
|
||||
mime-types: 3.0.1
|
||||
ms: 2.1.3
|
||||
on-finished: 2.4.1
|
||||
range-parser: 1.2.1
|
||||
statuses: 2.0.2
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
serialize-javascript@6.0.2:
|
||||
dependencies:
|
||||
randombytes: 2.1.0
|
||||
|
||||
serve-static@2.2.0:
|
||||
dependencies:
|
||||
encodeurl: 2.0.0
|
||||
escape-html: 1.0.3
|
||||
parseurl: 1.3.3
|
||||
send: 1.2.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
set-blocking@2.0.0: {}
|
||||
|
||||
set-function-length@1.2.2:
|
||||
@ -12439,8 +12029,6 @@ snapshots:
|
||||
|
||||
setimmediate@1.0.5: {}
|
||||
|
||||
setprototypeof@1.2.0: {}
|
||||
|
||||
shallow-equal@1.2.1: {}
|
||||
|
||||
shebang-command@2.0.0:
|
||||
@ -12558,10 +12146,6 @@ snapshots:
|
||||
dependencies:
|
||||
minipass: 3.3.6
|
||||
|
||||
statuses@2.0.1: {}
|
||||
|
||||
statuses@2.0.2: {}
|
||||
|
||||
stop-iteration-iterator@1.1.0:
|
||||
dependencies:
|
||||
es-errors: 1.3.0
|
||||
@ -12771,8 +12355,6 @@ snapshots:
|
||||
dependencies:
|
||||
through2: 2.0.5
|
||||
|
||||
toidentifier@1.0.1: {}
|
||||
|
||||
tr46@0.0.3: {}
|
||||
|
||||
tree-kill@1.2.2: {}
|
||||
@ -12827,12 +12409,6 @@ snapshots:
|
||||
|
||||
type-fest@1.4.0: {}
|
||||
|
||||
type-is@2.0.1:
|
||||
dependencies:
|
||||
content-type: 1.0.5
|
||||
media-typer: 1.1.0
|
||||
mime-types: 3.0.1
|
||||
|
||||
typed-array-buffer@1.0.3:
|
||||
dependencies:
|
||||
call-bound: 1.0.4
|
||||
@ -12945,8 +12521,6 @@ snapshots:
|
||||
|
||||
universalify@2.0.1: {}
|
||||
|
||||
unpipe@1.0.0: {}
|
||||
|
||||
unplugin-vue-components@0.22.12(@babel/parser@7.28.3)(rollup@3.29.5)(vue@3.5.18(typescript@5.9.2)):
|
||||
dependencies:
|
||||
'@antfu/utils': 0.7.10
|
||||
@ -13008,8 +12582,6 @@ snapshots:
|
||||
|
||||
value-or-function@3.0.0: {}
|
||||
|
||||
vary@1.1.2: {}
|
||||
|
||||
vfile-message@4.0.2:
|
||||
dependencies:
|
||||
'@types/unist': 3.0.3
|
||||
|
@ -360,7 +360,7 @@ core.prototype._loadGameProcess = async function () {
|
||||
if (main.pluginUseCompress) {
|
||||
await main.loadScript(`project/processG.min.js`);
|
||||
} else {
|
||||
await main.loadScript(`esm?name=src/editor.ts`, true);
|
||||
await main.loadScript(`src/editor.esm.ts`, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
687
script/dev.ts
687
script/dev.ts
@ -1,8 +1,14 @@
|
||||
import { createServer } from 'vite';
|
||||
import { Server } from 'http';
|
||||
import { ensureDir, move, pathExists, remove } from 'fs-extra';
|
||||
import { readFile, readdir, writeFile } from 'fs/promises';
|
||||
import { resolve, basename, join } from 'path';
|
||||
import {
|
||||
IncomingMessage,
|
||||
Server,
|
||||
ServerResponse,
|
||||
createServer as http
|
||||
} from 'http';
|
||||
import { isNil } from 'lodash-es';
|
||||
import config from '../mota.config.js';
|
||||
import fs from 'fs-extra';
|
||||
import { resolve, basename } from 'path';
|
||||
import * as rollup from 'rollup';
|
||||
import typescript from '@rollup/plugin-typescript';
|
||||
import nodeResolve from '@rollup/plugin-node-resolve';
|
||||
@ -12,27 +18,13 @@ import chokidar from 'chokidar';
|
||||
import commonjs from '@rollup/plugin-commonjs';
|
||||
import json from '@rollup/plugin-json';
|
||||
import replace from '@rollup/plugin-replace';
|
||||
import express, { Request, Response } from 'express';
|
||||
|
||||
const [, , vitePortStr = '5173', serverPortStr = '3000'] = process.argv;
|
||||
const vitePort = parseInt(vitePortStr);
|
||||
const serverPort = parseInt(serverPortStr);
|
||||
const base = './public';
|
||||
|
||||
const checkBase = resolve(process.cwd());
|
||||
const base = resolve(process.cwd(), 'public');
|
||||
|
||||
const enum APIStatus {
|
||||
Success,
|
||||
PermissionDeny,
|
||||
WriteError,
|
||||
FileNotExist,
|
||||
ReadError
|
||||
}
|
||||
|
||||
interface ResolveResult {
|
||||
safe: boolean;
|
||||
resolved: string;
|
||||
}
|
||||
type Request = IncomingMessage;
|
||||
type Response = ServerResponse<IncomingMessage> & {
|
||||
req: IncomingMessage;
|
||||
};
|
||||
|
||||
interface RollupInfo {
|
||||
dir: string;
|
||||
@ -43,6 +35,7 @@ interface RollupInfo {
|
||||
const rollupMap = new Map<string, RollupInfo>();
|
||||
let bundleIndex = 0;
|
||||
let ws: WebSocket;
|
||||
let h: Server;
|
||||
let wt: chokidar.FSWatcher;
|
||||
|
||||
class RefValue<T> extends EventEmitter {
|
||||
@ -77,115 +70,60 @@ class RefValue<T> extends EventEmitter {
|
||||
}
|
||||
}
|
||||
|
||||
function resolvePath(path: string): ResolveResult {
|
||||
const targetPath = resolve(base, path);
|
||||
|
||||
const safe = targetPath.startsWith(checkBase);
|
||||
return {
|
||||
safe,
|
||||
resolved: targetPath
|
||||
};
|
||||
function resolvePath(path: string) {
|
||||
return resolve(base, path);
|
||||
}
|
||||
|
||||
function parseBodyParam(body: string) {
|
||||
const arr = body.split('&');
|
||||
const obj: Record<string, string> = {};
|
||||
arr.forEach(v => {
|
||||
const [name, value] = v.split('=');
|
||||
obj[name] = value;
|
||||
});
|
||||
return obj;
|
||||
}
|
||||
|
||||
function withSafeCheck(
|
||||
exec: (req: Request, res: Response, path: ResolveResult) => void
|
||||
) {
|
||||
return async (req: Request, res: Response) => {
|
||||
const query = parseBodyParam(req.body);
|
||||
const path = query.name ?? '';
|
||||
if (typeof path !== 'string') {
|
||||
res.status(500).end('Parameter Error: File path is required.');
|
||||
return;
|
||||
}
|
||||
const dir = resolvePath(path);
|
||||
if (!dir.safe) {
|
||||
res.status(500).end(
|
||||
'Permission Error: Cannot access file outside current working directory.'
|
||||
);
|
||||
return;
|
||||
} else {
|
||||
exec(req, res, dir);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
interface AllFilesStatus {
|
||||
status: APIStatus;
|
||||
content: string;
|
||||
}
|
||||
|
||||
function getAllFiles(suffix: string, dir: string, join: string) {
|
||||
return async (req: Request, res: Response) => {
|
||||
const query = req.query ? req.query : parseBodyParam(req.body);
|
||||
const id = query.id;
|
||||
if (typeof id !== 'string') {
|
||||
res.status(404).end('Parameter Error: file names is required.');
|
||||
return;
|
||||
}
|
||||
|
||||
const list = id.split(',');
|
||||
const tasks = list.map<Promise<AllFilesStatus>>(async v => {
|
||||
const path = resolvePath(`${dir}${v}${suffix}`);
|
||||
if (!path.safe) {
|
||||
return Promise.resolve<AllFilesStatus>({
|
||||
status: APIStatus.PermissionDeny,
|
||||
content: ''
|
||||
});
|
||||
}
|
||||
|
||||
const exist = await pathExists(path.resolved);
|
||||
if (!exist) {
|
||||
return Promise.resolve<AllFilesStatus>({
|
||||
status: APIStatus.FileNotExist,
|
||||
content: ''
|
||||
});
|
||||
}
|
||||
|
||||
return readFile(path.resolved, 'utf-8').then(
|
||||
value => {
|
||||
return {
|
||||
status: APIStatus.Success,
|
||||
content: value
|
||||
};
|
||||
},
|
||||
reason => {
|
||||
console.error(reason);
|
||||
return { status: APIStatus.ReadError, content: '' };
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const contents = await Promise.all(tasks);
|
||||
if (contents.every(v => v.status === APIStatus.Success)) {
|
||||
const content = contents.map(v => v.content).join(join);
|
||||
if (suffix === '.js') {
|
||||
/**
|
||||
* 请求文件
|
||||
*/
|
||||
async function getFile(req: Request, res: Response, path: string) {
|
||||
try {
|
||||
const data = await fs.readFile(resolvePath(path));
|
||||
if (path.endsWith('.js'))
|
||||
res.writeHead(200, { 'Content-type': 'text/javascript' });
|
||||
if (path.endsWith('.css'))
|
||||
res.writeHead(200, { 'Content-type': 'text/css' });
|
||||
if (path.endsWith('.html'))
|
||||
res.writeHead(200, { 'Content-type': 'text/html' });
|
||||
return res.end(data), true;
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
return false;
|
||||
}
|
||||
res.end(content);
|
||||
} else {
|
||||
const strArray = contents.map((v, i) => {
|
||||
if (v.status === APIStatus.PermissionDeny) {
|
||||
return `Index: ${i}; Permission Error: Cannot access file outside current working directory`;
|
||||
} else if (v.status === APIStatus.Success) {
|
||||
return `Index: ${i}: Internal Error: Read file error.`;
|
||||
} else {
|
||||
return 'Success';
|
||||
}
|
||||
|
||||
/**
|
||||
* 高层塔优化及动画加载
|
||||
* @param suffix 后缀名
|
||||
* @param dir 文件夹路径
|
||||
* @param join 分隔符
|
||||
*/
|
||||
async function getAll(
|
||||
req: Request,
|
||||
res: Response,
|
||||
ids: string[],
|
||||
suffix: string,
|
||||
dir: string,
|
||||
join: string
|
||||
) {
|
||||
let data: Record<string, Buffer> = {};
|
||||
const tasks = ids.map(v => {
|
||||
return new Promise(res => {
|
||||
const d = resolvePath(`${dir}${v}${suffix}`);
|
||||
try {
|
||||
fs.readFile(d).then(vv => {
|
||||
data[v] = vv;
|
||||
res(`${v} pack success.`);
|
||||
});
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
});
|
||||
const str = strArray.filter(v => v !== 'Success').join('\n');
|
||||
res.status(500).end(str);
|
||||
}
|
||||
};
|
||||
});
|
||||
await Promise.all(tasks);
|
||||
const result = ids.map(v => data[v]);
|
||||
return res.end(result.join(join)), true;
|
||||
}
|
||||
|
||||
async function getEsmFile(
|
||||
@ -193,22 +131,16 @@ async function getEsmFile(
|
||||
res: Response,
|
||||
dir: string
|
||||
): Promise<void> {
|
||||
const path = resolvePath(dir);
|
||||
if (!path.safe) {
|
||||
res.status(500).end(
|
||||
'Permission Error: Cannot access file outside current working directory'
|
||||
);
|
||||
return;
|
||||
}
|
||||
const path = resolvePath(dir.replace('.esm', ''));
|
||||
|
||||
const watcher = rollupMap.get(path.resolved);
|
||||
const watcher = rollupMap.get(path);
|
||||
|
||||
if (!watcher) {
|
||||
const file = (bundleIndex++).toString();
|
||||
await ensureDir('_bundle');
|
||||
await fs.ensureDir('_bundle');
|
||||
// 配置rollup监听器
|
||||
const w = rollup.watch({
|
||||
input: path.resolved,
|
||||
input: path,
|
||||
output: {
|
||||
file: `_bundle/${file}.js`,
|
||||
sourcemap: true,
|
||||
@ -248,13 +180,12 @@ async function getEsmFile(
|
||||
};
|
||||
w.on('event', e => {
|
||||
if (e.code === 'ERROR') {
|
||||
res.status(500).end('Internal Error: Esm build error.');
|
||||
console.log(e.error);
|
||||
}
|
||||
|
||||
if (e.code === 'BUNDLE_END') {
|
||||
info.bundled.value = true;
|
||||
console.log(`${path.resolved} bundle end`);
|
||||
console.log(`${path} bundle end`);
|
||||
}
|
||||
|
||||
if (e.code === 'BUNDLE_START') {
|
||||
@ -263,240 +194,184 @@ async function getEsmFile(
|
||||
});
|
||||
w.on('change', id => {
|
||||
console.log(`${id} changed. Refresh Page.`);
|
||||
if (ws) {
|
||||
ws.send(JSON.stringify({ type: 'reload' }));
|
||||
}
|
||||
ws && ws.send(JSON.stringify({ type: 'reload' }));
|
||||
});
|
||||
rollupMap.set(path.resolved, info);
|
||||
rollupMap.set(path, info);
|
||||
|
||||
// 配置完毕,直接重新获取即可(
|
||||
return getEsmFile(req, res, dir);
|
||||
} else {
|
||||
try {
|
||||
await watcher.bundled.waitValueTo(true);
|
||||
const content = await readFile(watcher.file, 'utf-8');
|
||||
const content = await fs.readFile(watcher.file, 'utf-8');
|
||||
res.writeHead(200, { 'Content-type': 'text/javascript' });
|
||||
res.end(content);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
console.log(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const apiListFile = withSafeCheck(async (_, res, path) => {
|
||||
const exist = await pathExists(path.resolved);
|
||||
if (!exist) {
|
||||
res.status(404).end('Permission Error: Path does not exist.');
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const data = await readdir(path.resolved);
|
||||
res.end(JSON.stringify(data));
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
res.status(500).end('Internal Error: Read dir error.');
|
||||
}
|
||||
});
|
||||
|
||||
const apiMakeDir = withSafeCheck(async (_, res, path) => {
|
||||
try {
|
||||
await ensureDir(path.resolved);
|
||||
res.end();
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
res.status(500).end('Internal Error: Make dir error.');
|
||||
}
|
||||
});
|
||||
|
||||
const apiReadFile = withSafeCheck(async (req, res, path) => {
|
||||
const query = parseBodyParam(req.body);
|
||||
const type = query.type ?? 'utf8';
|
||||
if (typeof type !== 'string') {
|
||||
res.status(500).end('Internal Error: Query parsed failed.');
|
||||
return;
|
||||
}
|
||||
const exist = await pathExists(path.resolved);
|
||||
if (!exist) {
|
||||
res.status(404).end('Permission Error: Path does not exist.');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const file = await readFile(path.resolved, {
|
||||
encoding: type as BufferEncoding
|
||||
/**
|
||||
* 获取POST数据
|
||||
*/
|
||||
async function getPostData(req: Request) {
|
||||
let data = '';
|
||||
await new Promise(res => {
|
||||
req.on('data', chunk => {
|
||||
data += chunk.toString();
|
||||
});
|
||||
res.end(file);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
res.status(500).end('Internal Error: Read file error.');
|
||||
}
|
||||
});
|
||||
|
||||
const apiWriteFile = withSafeCheck(async (req, res, path) => {
|
||||
const query = parseBodyParam(req.body);
|
||||
const type = query.type ?? 'utf8';
|
||||
if (typeof type !== 'string') {
|
||||
res.status(500).end('Internal Error: Query parsed failed.');
|
||||
return;
|
||||
}
|
||||
const value = query.value;
|
||||
if (typeof value !== 'string') {
|
||||
res.status(500).end('Parameter Error: File content is required.');
|
||||
return;
|
||||
}
|
||||
try {
|
||||
await writeFile(path.resolved, value, {
|
||||
encoding: type as BufferEncoding
|
||||
req.on('end', res);
|
||||
});
|
||||
res.end();
|
||||
if (path.resolved.endsWith('project/events.js')) {
|
||||
doDeclaration('events', value);
|
||||
}
|
||||
if (path.resolved.endsWith('project/items.js')) {
|
||||
doDeclaration('items', value);
|
||||
}
|
||||
if (path.resolved.endsWith('project/maps.js')) {
|
||||
doDeclaration('maps', value);
|
||||
}
|
||||
if (path.resolved.endsWith('project/data.js')) {
|
||||
doDeclaration('data', value);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
res.status(500).end(
|
||||
'Internal Error: Fail to write file or fail to do declaration.'
|
||||
);
|
||||
}
|
||||
});
|
||||
return data;
|
||||
}
|
||||
|
||||
const apiDeleteFile = withSafeCheck(async (_, res, path) => {
|
||||
const exist = await pathExists(path.resolved);
|
||||
if (!exist) {
|
||||
res.status(404).end('Permission Error: Path does not exist.');
|
||||
return;
|
||||
}
|
||||
async function readDir(req: Request, res: Response) {
|
||||
const data = await getPostData(req);
|
||||
const dir = resolvePath(data.toString().slice(5));
|
||||
try {
|
||||
await remove(path.resolved);
|
||||
res.end();
|
||||
const info = await fs.readdir(dir);
|
||||
res.end(JSON.stringify(info));
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
res.status(500).end('Internal Error: Remove file error.');
|
||||
}
|
||||
});
|
||||
|
||||
const apiMoveFile = async (req: Request, res: Response) => {
|
||||
const query = parseBodyParam(req.body);
|
||||
const src = query.src;
|
||||
const dest = query.dest;
|
||||
|
||||
if (typeof src !== 'string' || typeof dest !== 'string') {
|
||||
res.status(500).end(
|
||||
'Parameter Error: Source path or destination path is required.'
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const srcPath = resolvePath(src);
|
||||
const destPath = resolvePath(dest);
|
||||
|
||||
if (!srcPath.safe || !destPath.safe) {
|
||||
res.status(500).end(
|
||||
'Permission Error: Cannot access file outside current working directory.'
|
||||
);
|
||||
console.log(e);
|
||||
res.end(`Error: Read dir ${dir} fail. Does the dir exists?`);
|
||||
}
|
||||
}
|
||||
|
||||
async function mkdir(req: Request, res: Response) {
|
||||
const data = await getPostData(req);
|
||||
const dir = resolvePath(data.toString().slice(5));
|
||||
try {
|
||||
await move(srcPath.resolved, destPath.resolved);
|
||||
res.end();
|
||||
await fs.ensureDir(dir);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
res.status(500).end('Internal Error: Move file error.');
|
||||
console.log(e);
|
||||
}
|
||||
};
|
||||
res.end();
|
||||
}
|
||||
|
||||
const apiWriteMultiFiles = async (req: Request, res: Response) => {
|
||||
const query = parseBodyParam(req.body);
|
||||
const name = query.name;
|
||||
const value = query.value;
|
||||
async function readFile(req: Request, res: Response) {
|
||||
const data = (await getPostData(req)).toString();
|
||||
const dir = resolvePath(data.split('&name=')[1]);
|
||||
try {
|
||||
const type = /^type=(utf8|base64)/.exec(data)?.[0].slice(5) ?? 'utf8';
|
||||
const info = await fs.readFile(dir, { encoding: type });
|
||||
res.end(info);
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof name !== 'string' || typeof value !== 'string') {
|
||||
res.status(500).end(
|
||||
'Parameter Error: File names and content is required.'
|
||||
async function writeFile(req: Request, res: Response) {
|
||||
const data = (await getPostData(req)).toString();
|
||||
const name = data.split('&name=')[1].split('&value=')[0];
|
||||
const dir = resolvePath(name);
|
||||
try {
|
||||
const type = /^type=(utf8|base64)/.exec(data)?.[0].slice(5) ?? 'utf8';
|
||||
const value = /&value=.+/.exec(data)?.[0].slice(7) ?? '';
|
||||
await fs.writeFile(dir, value, { encoding: type });
|
||||
if (name.endsWith('project/events.js')) doDeclaration('events', value);
|
||||
if (name.endsWith('project/items.js')) doDeclaration('items', value);
|
||||
if (name.endsWith('project/maps.js')) doDeclaration('maps', value);
|
||||
if (name.endsWith('project/data.js')) doDeclaration('data', value);
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
res.end(
|
||||
`error: Write file ${dir} fail. Does the parent folder exists?`
|
||||
);
|
||||
return;
|
||||
}
|
||||
res.end();
|
||||
}
|
||||
|
||||
const pathList = name.split(';');
|
||||
const valueList = value.split(';');
|
||||
async function rm(req: Request, res: Response) {
|
||||
const data = (await getPostData(req)).toString();
|
||||
const dir = resolvePath(data.slice(5));
|
||||
try {
|
||||
await fs.remove(dir);
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
res.end(`error: Remove file ${dir} fail. Does this file exists?`);
|
||||
}
|
||||
res.end();
|
||||
}
|
||||
|
||||
if (pathList.length !== valueList.length) {
|
||||
res.status(500).end(
|
||||
'Parameter Error: File name and content count must match.'
|
||||
);
|
||||
return;
|
||||
async function moveFile(req: Request, res: Response) {
|
||||
const data = (await getPostData(req)).toString();
|
||||
const info = data.split('&dest=');
|
||||
const src = resolvePath(info[0].slice(4));
|
||||
const dest = resolvePath(info[1]);
|
||||
try {
|
||||
await fs.move(src, dest);
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
res.end();
|
||||
}
|
||||
|
||||
const tasks = pathList.map<Promise<APIStatus>>((v, i) => {
|
||||
const path = resolvePath(v);
|
||||
if (!path.safe) {
|
||||
return Promise.resolve<APIStatus>(APIStatus.PermissionDeny);
|
||||
}
|
||||
return new Promise<APIStatus>(resolve => {
|
||||
writeFile(v, valueList[i]).then(
|
||||
() => {
|
||||
resolve(APIStatus.Success);
|
||||
},
|
||||
reason => {
|
||||
console.error(reason);
|
||||
resolve(APIStatus.WriteError);
|
||||
}
|
||||
);
|
||||
async function writeMultiFiles(req: Request, res: Response) {
|
||||
const data = (await getPostData(req)).toString();
|
||||
const names =
|
||||
/name=.+&value=/.exec(data)?.[0].slice(5, -7).split(';') ?? [];
|
||||
const value = /&value=.+/.exec(data)?.[0].slice(7).split(';') ?? [];
|
||||
|
||||
const tasks = names.map((v, i) => {
|
||||
try {
|
||||
return new Promise(res => {
|
||||
fs.writeFile(
|
||||
resolvePath(v),
|
||||
value[i],
|
||||
'base64' // 多文件是base64写入的
|
||||
).then(v => {
|
||||
res(`write ${v} success.`);
|
||||
});
|
||||
});
|
||||
|
||||
const status = await Promise.all(tasks);
|
||||
|
||||
if (status.every(v => v === APIStatus.Success)) {
|
||||
res.end();
|
||||
} else {
|
||||
const strArray = status.map((v, i) => {
|
||||
if (v === APIStatus.PermissionDeny) {
|
||||
return `Index: ${i}; Permission Error: Cannot access file outside current working directory`;
|
||||
} else if (v === APIStatus.Success) {
|
||||
return `Index: ${i}: Internal Error: Write file error.`;
|
||||
} else {
|
||||
return 'Success';
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
res.end(`error: Write multi files fail.`);
|
||||
}
|
||||
});
|
||||
const str = strArray.filter(v => v !== 'Success').join('\n');
|
||||
res.status(500).end(str);
|
||||
}
|
||||
};
|
||||
await Promise.all(tasks).catch(e => console.log(e));
|
||||
res.end();
|
||||
}
|
||||
|
||||
const apiGetAllFloors = getAllFiles('.js', 'project/floors/', '\n');
|
||||
const apiGetAllAnimates = getAllFiles(
|
||||
'.animate',
|
||||
'project/animates/',
|
||||
'@@@~~~###~~~@@@'
|
||||
);
|
||||
|
||||
const apiGetEsmFiles = async (req: Request, res: Response) => {
|
||||
const query = req.query ? req.query : parseBodyParam(req.body);
|
||||
const name = query.name;
|
||||
if (typeof name !== 'string') {
|
||||
res.status(500).end('Parameter Error: File name is required.');
|
||||
async function writeDevResource(data: string) {
|
||||
return;
|
||||
}
|
||||
const path = resolvePath(join('..', name));
|
||||
if (!path.safe) {
|
||||
res.status(500).end(
|
||||
'Permission Error: Cannot access file outside current working directory'
|
||||
try {
|
||||
const buf = Buffer.from(data, 'base64');
|
||||
data = buf.toString('utf-8');
|
||||
const info = JSON.parse(data.split('\n').slice(1).join(''));
|
||||
const res: string[] = [];
|
||||
const icons = await fs.readFile('./public/project/icons.js', 'utf-8');
|
||||
const iconData = JSON.parse(icons.split('\n').slice(1).join(''));
|
||||
res.push(
|
||||
...info.main.bgms.map((v: any) => `audio/${v}`),
|
||||
...info.main.fonts.map((v: any) => `buffer/project/fonts/${v}.ttf`),
|
||||
...info.main.images.map((v: any) => `image/project/images/${v}`),
|
||||
...info.main.sounds.map((v: any) => `buffer/${v}`),
|
||||
...info.main.tilesets.map((v: any) => `image/project/tilesets${v}`),
|
||||
...Object.keys(iconData.autotile).map(
|
||||
v => `image/project/autotiles/${v}.png`
|
||||
),
|
||||
...[
|
||||
'animates',
|
||||
'cloud',
|
||||
'enemy48',
|
||||
'enemys',
|
||||
'fog',
|
||||
'icons',
|
||||
'items',
|
||||
'keyboard',
|
||||
'npc48',
|
||||
'npcs',
|
||||
'sun',
|
||||
'terrains'
|
||||
].map(v => `material/${v}.png`)
|
||||
);
|
||||
return;
|
||||
const text = JSON.stringify(res, void 0, 4);
|
||||
await fs.writeFile('./src/data/resource-dev.json', text, 'utf-8');
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
|
||||
return getEsmFile(req, res, path.resolved);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 声明某种类型
|
||||
@ -515,7 +390,7 @@ async function doDeclaration(type: string, data: string) {
|
||||
for (const id in eventData.commonEvent) {
|
||||
eventDec += ` | '${id}'\n`;
|
||||
}
|
||||
await writeFile('src/source/events.d.ts', eventDec, 'utf-8');
|
||||
await fs.writeFile('src/source/events.d.ts', eventDec, 'utf-8');
|
||||
} else if (type === 'items') {
|
||||
// 道具
|
||||
const itemData = JSON.parse(data.split('\n').slice(1).join(''));
|
||||
@ -525,7 +400,7 @@ async function doDeclaration(type: string, data: string) {
|
||||
itemDec += ` ${id}: '${itemData[id].cls}';\n`;
|
||||
}
|
||||
itemDec += '}';
|
||||
await writeFile('src/source/items.d.ts', itemDec, 'utf-8');
|
||||
await fs.writeFile('src/source/items.d.ts', itemDec, 'utf-8');
|
||||
} else if (type === 'maps') {
|
||||
// 映射
|
||||
const d = JSON.parse(data.split('\n').slice(1).join(''));
|
||||
@ -542,8 +417,8 @@ async function doDeclaration(type: string, data: string) {
|
||||
id2cls += '}';
|
||||
id2num += '}';
|
||||
num2id += '}';
|
||||
await writeFile('src/source/cls.d.ts', id2cls, 'utf-8');
|
||||
await writeFile(
|
||||
await fs.writeFile('src/source/cls.d.ts', id2cls, 'utf-8');
|
||||
await fs.writeFile(
|
||||
'src/source/maps.d.ts',
|
||||
`${id2num}\n${num2id}`,
|
||||
'utf-8'
|
||||
@ -571,7 +446,7 @@ async function doDeclaration(type: string, data: string) {
|
||||
}
|
||||
names += '}';
|
||||
|
||||
await writeFile(
|
||||
await fs.writeFile(
|
||||
'src/source/data.d.ts',
|
||||
`
|
||||
${floorId}
|
||||
@ -590,6 +465,75 @@ ${names}
|
||||
}
|
||||
}
|
||||
|
||||
async function startHttpServer(port: number = 3000) {
|
||||
if (h) return h;
|
||||
const server = http();
|
||||
|
||||
const tryNext = () => {
|
||||
server.listen(port++, '127.0.0.1');
|
||||
};
|
||||
server.on('error', () => {
|
||||
tryNext();
|
||||
});
|
||||
server.on('listening', () => {
|
||||
console.log(`编辑器地址:http://127.0.0.1:${port - 1}/editor.html`);
|
||||
setupHttp(server);
|
||||
});
|
||||
tryNext();
|
||||
|
||||
return server;
|
||||
}
|
||||
|
||||
function setupHttp(server: Server) {
|
||||
server.on('request', async (req, res) => {
|
||||
const p = req.url
|
||||
?.replace(`/games/${config.name}`, '')
|
||||
.replace('/all/', '/') // 样板中特殊处理的all文件
|
||||
.replace('/forceTem/', '/') // 强制用样板的http服务获取文件
|
||||
.replace('/src/', '../src/'); // src在上一级目录
|
||||
if (isNil(p)) return;
|
||||
|
||||
if (req.method === 'GET') {
|
||||
const dir = resolvePath(
|
||||
p === '/' ? 'index.html' : p.slice(1)
|
||||
).split('?v=')[0];
|
||||
|
||||
if (/.*\.esm\..*/.test(p)) {
|
||||
// xxx.esm.xxx,说明是需要打包的es模块化文件,需要rollup打包后传输
|
||||
return getEsmFile(req, res, p);
|
||||
}
|
||||
|
||||
if (p.startsWith('/__all_floors__.js')) {
|
||||
const all = p.split('&id=')[1].split(',');
|
||||
res.writeHead(200, { 'Content-type': 'text/javascript' });
|
||||
return getAll(req, res, all, '.js', 'project/floors/', '\n');
|
||||
}
|
||||
|
||||
if (p.startsWith('/__all_animates__')) {
|
||||
const all = p.split('&id=')[1].split(',');
|
||||
const split = '@@@~~~###~~~@@@';
|
||||
const dir = 'project/animates/';
|
||||
return getAll(req, res, all, '.animate', dir, split);
|
||||
}
|
||||
|
||||
if (await getFile(req, res, dir)) return;
|
||||
}
|
||||
|
||||
if (req.method === 'POST') {
|
||||
if (p === '/listFile') return readDir(req, res);
|
||||
if (p === '/makeDir') return mkdir(req, res);
|
||||
if (p === '/readFile') return readFile(req, res);
|
||||
if (p === '/writeFile') return writeFile(req, res);
|
||||
if (p === '/deleteFile') return rm(req, res);
|
||||
if (p === '/moveFile') return moveFile(req, res);
|
||||
if (p === '/writeMultiFiles') return writeMultiFiles(req, res);
|
||||
}
|
||||
|
||||
res.statusCode = 404;
|
||||
res.end();
|
||||
});
|
||||
}
|
||||
|
||||
function watchProject() {
|
||||
if (wt) return;
|
||||
const watcher = chokidar.watch('public/', {
|
||||
@ -601,26 +545,25 @@ function watchProject() {
|
||||
'**/_docs/**',
|
||||
'**/_save/**',
|
||||
/\.min\./,
|
||||
/(^|[/\\])\../,
|
||||
/(^|[/\\])[^a-zA-Z:._0-9/\\]/,
|
||||
/(^|[\/\\])\../,
|
||||
/(^|[\/\\])[^a-zA-Z:\._0-9\/\\]/,
|
||||
/_.*/
|
||||
]
|
||||
});
|
||||
wt = watcher;
|
||||
watcher.removeAllListeners();
|
||||
watcher.on('change', async path => {
|
||||
if (!ws) return;
|
||||
// 楼层热重载
|
||||
if (/project(\/|\\)floors(\/|\\).*\.js$/.test(path)) {
|
||||
const floor = basename(path).slice(0, -3);
|
||||
ws.send(JSON.stringify({ type: 'floorHotReload', floor }));
|
||||
ws && ws.send(JSON.stringify({ type: 'floorHotReload', floor }));
|
||||
console.log(`Floor hot reload: ${floor}.`);
|
||||
return;
|
||||
}
|
||||
|
||||
// 脚本编辑热重载
|
||||
if (/project(\/|\\)functions\.js$/.test(path)) {
|
||||
ws.send(JSON.stringify({ type: 'functionsHotReload' }));
|
||||
ws && ws.send(JSON.stringify({ type: 'functionsHotReload' }));
|
||||
console.log(`Functions hot reload.`);
|
||||
return;
|
||||
}
|
||||
@ -628,20 +571,20 @@ function watchProject() {
|
||||
// 数据热重载
|
||||
if (/project(\/|\\).*\.js/.test(path)) {
|
||||
const data = basename(path).slice(0, -3);
|
||||
ws.send(JSON.stringify({ type: 'dataHotReload', data }));
|
||||
ws && ws.send(JSON.stringify({ type: 'dataHotReload', data }));
|
||||
console.log(`Data hot reload: ${data}.`);
|
||||
return;
|
||||
}
|
||||
|
||||
// css热重载
|
||||
if (/.*\.css$/.test(path)) {
|
||||
ws.send(JSON.stringify({ type: 'cssHotReload', path }));
|
||||
ws && ws.send(JSON.stringify({ type: 'cssHotReload', path }));
|
||||
console.log(`Css hot reload: ${path}.`);
|
||||
return;
|
||||
}
|
||||
|
||||
// 剩余内容全部reload
|
||||
ws.send(JSON.stringify({ type: 'reload' }));
|
||||
ws && ws.send(JSON.stringify({ type: 'reload' }));
|
||||
});
|
||||
}
|
||||
|
||||
@ -653,67 +596,37 @@ function setupSocket(socket: WebSocket) {
|
||||
|
||||
async function startWsServer(http: Server) {
|
||||
if (ws) return;
|
||||
|
||||
return new Promise<WebSocketServer>(res => {
|
||||
const server = new WebSocketServer({
|
||||
server: http
|
||||
});
|
||||
|
||||
server.on('connection', socket => {
|
||||
setupSocket(socket);
|
||||
res(server);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function ensureConfig() {
|
||||
const { resolved, safe } = resolvePath('_server/config.json');
|
||||
if (!safe) {
|
||||
throw new Error('Internal Error: Fail to access editor config file.');
|
||||
}
|
||||
const exist = await pathExists(resolved);
|
||||
if (!exist) {
|
||||
return writeFile(resolved, '{}', { encoding: 'utf-8' });
|
||||
try {
|
||||
await fs.readFile(resolvePath('_server/config.json'));
|
||||
} catch {
|
||||
await fs.writeFile(resolvePath('_server/config.json'), '{}', 'utf-8');
|
||||
}
|
||||
}
|
||||
|
||||
(async function () {
|
||||
// 1. 启动vite服务
|
||||
const vite = await createServer();
|
||||
await vite.listen(vitePort);
|
||||
console.log(`游戏地址:http://localhost:${vitePort}/`);
|
||||
await vite.listen(5173);
|
||||
console.log(`游戏地址:http://localhost:5173/`);
|
||||
|
||||
// 2. 启动样板http服务
|
||||
await ensureConfig();
|
||||
|
||||
const app = express();
|
||||
app.use(express.text());
|
||||
app.use(express.urlencoded({ extended: true }));
|
||||
app.use(express.static(base));
|
||||
|
||||
app.post('/listFile', apiListFile);
|
||||
app.post('/makeDir', apiMakeDir);
|
||||
app.post('/readFile', apiReadFile);
|
||||
app.post('/writeFile', apiWriteFile);
|
||||
app.post('/deleteFile', apiDeleteFile);
|
||||
app.post('/moveFile', apiMoveFile);
|
||||
app.post('/writeMultiFiles', apiWriteMultiFiles);
|
||||
app.get('/all/__all_floors__.js', apiGetAllFloors);
|
||||
app.get('/all/__all_animates__', apiGetAllAnimates);
|
||||
app.get('/esm', apiGetEsmFiles);
|
||||
|
||||
const server = app.listen(serverPort);
|
||||
|
||||
server.on('listening', () => {
|
||||
console.log(`编辑器地址:http://127.0.0.1:${serverPort}/editor.html`);
|
||||
console.log(
|
||||
`文档地址:http://127.0.0.1:${serverPort}/_docs/index.html`
|
||||
);
|
||||
});
|
||||
const server = await startHttpServer(3000);
|
||||
h = server;
|
||||
|
||||
// 3. 启动样板ws热重载服务
|
||||
startWsServer(server);
|
||||
|
||||
process.on('SIGTERM', () => {
|
||||
vite.close();
|
||||
server.close();
|
||||
process.exit(0);
|
||||
});
|
||||
await startWsServer(server);
|
||||
})();
|
||||
|
@ -70,7 +70,13 @@ export default defineConfig({
|
||||
'/makeDir': FSHOST,
|
||||
'/moveFile': FSHOST,
|
||||
'/deleteFile': FSHOST,
|
||||
'^/all/.*': FSHOST,
|
||||
'^/all/.*': {
|
||||
target: FSHOST,
|
||||
changeOrigin: true,
|
||||
rewrite(path) {
|
||||
return path.replace(/^\/all/, '');
|
||||
},
|
||||
},
|
||||
'^/forceTem/.*': {
|
||||
target: FSHOST,
|
||||
changeOrigin: true,
|
||||
|
Loading…
Reference in New Issue
Block a user