@zhin.js/console 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +30 -26
- package/lib/index.js.map +1 -1
- package/package.json +9 -8
- package/src/index.ts +35 -25
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAiB,EAAC,eAAe,EAAC,MAAM,IAAI,CAAC;AAC7C,OAAO,EAAc,aAAa,EAAwB,MAAM,MAAM,CAAC;AAOvE,OAAO,QAAQ,gBAAgB,CAAC;IAC5B,UAAU,aAAa;QACnB,GAAG,EAAE,SAAS,CAAC;KAClB;CACJ;AACD,MAAM,MAAM,QAAQ,GAAC,MAAM,GAAC;IACxB,UAAU,EAAC,MAAM,CAAA;IACjB,WAAW,EAAC,MAAM,CAAA;CACrB,CAAA;AACD,MAAM,MAAM,SAAS,GAAG;IACpB,IAAI,EAAC,aAAa,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,IAAI,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,EAAE,EAAC,eAAe,CAAA;CACrB,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import { register, useContext
|
|
1
|
+
import { register, useContext } from '@zhin.js/core';
|
|
2
|
+
import react from '@vitejs/plugin-react';
|
|
2
3
|
import WebSocket from 'ws';
|
|
3
4
|
import { createServer, searchForWorkspaceRoot } from 'vite';
|
|
4
|
-
import Components from 'unplugin-vue-components/vite';
|
|
5
|
-
import { PrimeVueResolver } from '@primevue/auto-import-resolver';
|
|
6
5
|
import connect from 'koa-connect';
|
|
7
|
-
import vuePlugin from "@vitejs/plugin-vue";
|
|
8
6
|
import * as fs from 'fs';
|
|
9
7
|
import * as path from 'path';
|
|
10
8
|
import { fileURLToPath } from "node:url";
|
|
9
|
+
import tailwindcss from '@tailwindcss/vite';
|
|
11
10
|
const createSyncMsg = (key, value) => {
|
|
12
11
|
return {
|
|
13
12
|
type: 'sync',
|
|
@@ -35,7 +34,6 @@ const createDeleteMsg = (key, value) => {
|
|
|
35
34
|
},
|
|
36
35
|
};
|
|
37
36
|
};
|
|
38
|
-
const logger = useLogger();
|
|
39
37
|
useContext('router', async (router) => {
|
|
40
38
|
const root = path.join(process.cwd(), 'node_modules', '@zhin.js', 'client', 'app');
|
|
41
39
|
const base = '/vite/';
|
|
@@ -43,12 +41,8 @@ useContext('router', async (router) => {
|
|
|
43
41
|
root,
|
|
44
42
|
base,
|
|
45
43
|
plugins: [
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
resolvers: [
|
|
49
|
-
PrimeVueResolver()
|
|
50
|
-
]
|
|
51
|
-
})
|
|
44
|
+
react(),
|
|
45
|
+
tailwindcss(),
|
|
52
46
|
],
|
|
53
47
|
server: {
|
|
54
48
|
middlewareMode: true,
|
|
@@ -57,13 +51,14 @@ useContext('router', async (router) => {
|
|
|
57
51
|
},
|
|
58
52
|
},
|
|
59
53
|
resolve: {
|
|
60
|
-
dedupe: ['
|
|
54
|
+
dedupe: ['react', 'react-dom'],
|
|
61
55
|
alias: {
|
|
62
56
|
'@zhin.js/client': path.resolve(root, '../src'),
|
|
57
|
+
'@': path.resolve(root, 'src'),
|
|
63
58
|
},
|
|
64
59
|
},
|
|
65
60
|
optimizeDeps: {
|
|
66
|
-
include: ['
|
|
61
|
+
include: ['react', 'react-dom'],
|
|
67
62
|
},
|
|
68
63
|
build: {
|
|
69
64
|
rollupOptions: {
|
|
@@ -71,8 +66,14 @@ useContext('router', async (router) => {
|
|
|
71
66
|
},
|
|
72
67
|
},
|
|
73
68
|
});
|
|
69
|
+
// Vite 中间件 - 必须在其他路由之前
|
|
70
|
+
router.use((ctx, next) => {
|
|
71
|
+
if (ctx.request.originalUrl.startsWith('/api'))
|
|
72
|
+
return next();
|
|
73
|
+
return connect(vite.middlewares)(ctx, next);
|
|
74
|
+
});
|
|
75
|
+
// SPA 回退路由 - 处理所有未匹配的路由
|
|
74
76
|
router.all('*all', async (ctx, next) => {
|
|
75
|
-
await next();
|
|
76
77
|
const url = ctx.request.originalUrl.replace(base, '');
|
|
77
78
|
const name = ctx.path.slice(1);
|
|
78
79
|
const sendFile = (filename) => {
|
|
@@ -81,32 +82,35 @@ useContext('router', async (router) => {
|
|
|
81
82
|
ctx.type = 'text/javascript';
|
|
82
83
|
return (ctx.body = fs.createReadStream(filename));
|
|
83
84
|
};
|
|
85
|
+
// 1. 检查是否是动态入口
|
|
84
86
|
if (Object.keys(webServer.entries).includes(name)) {
|
|
85
87
|
return sendFile(path.resolve(process.cwd(), webServer.entries[name]));
|
|
86
88
|
}
|
|
89
|
+
// 2. 检查是否是静态文件
|
|
87
90
|
const filename = path.resolve(root, name);
|
|
88
|
-
if (
|
|
89
|
-
|
|
91
|
+
if (filename.startsWith(root) || filename.includes('node_modules')) {
|
|
92
|
+
if (fs.existsSync(filename)) {
|
|
93
|
+
const fileState = fs.statSync(filename);
|
|
94
|
+
if (fileState.isFile()) {
|
|
95
|
+
return sendFile(filename);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
90
98
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
return sendFile(filename);
|
|
99
|
+
else {
|
|
100
|
+
// 安全检查:路径不在允许范围内
|
|
101
|
+
return (ctx.status = 403);
|
|
95
102
|
}
|
|
103
|
+
// 3. 所有其他路径(包括 SPA 路由)都返回 index.html
|
|
104
|
+
// 这样前端路由可以正确处理
|
|
96
105
|
const template = fs.readFileSync(path.resolve(root, 'index.html'), 'utf8');
|
|
97
106
|
ctx.type = 'html';
|
|
98
107
|
ctx.body = await vite.transformIndexHtml(url, template);
|
|
99
108
|
});
|
|
100
|
-
router.use((ctx, next) => {
|
|
101
|
-
if (ctx.request.originalUrl.startsWith('/api'))
|
|
102
|
-
return next();
|
|
103
|
-
return connect(vite.middlewares)(ctx, next);
|
|
104
|
-
});
|
|
105
109
|
const webServer = {
|
|
106
110
|
vite,
|
|
107
111
|
entries: {},
|
|
108
112
|
addEntry(entry) {
|
|
109
|
-
const hash = Date.now().toString(16);
|
|
113
|
+
const hash = Date.now().toString(16) + Math.random().toString(16).slice(2, 8);
|
|
110
114
|
const entryFile = typeof entry === "string" ? entry : entry[process.env.NODE_ENV || 'development'];
|
|
111
115
|
this.entries[hash] = `/vite/@fs/${entryFile}`;
|
|
112
116
|
for (const ws of this.ws.clients || []) {
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/console",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Zhin 控制台",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -12,20 +12,21 @@
|
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@vitejs/plugin-
|
|
15
|
+
"@vitejs/plugin-react": "^4.3.4",
|
|
16
|
+
"@tailwindcss/vite": "4.1.14",
|
|
17
|
+
"radix-ui": "^1.4.3",
|
|
18
|
+
"@radix-ui/themes": "^3.2.1",
|
|
19
|
+
"lucide-react": "^0.469.0",
|
|
16
20
|
"koa-connect": "^2.1.0",
|
|
17
21
|
"ws": "^8.18.3",
|
|
18
|
-
"vue": "^3.5.18",
|
|
19
22
|
"vite": "^7.0.6"
|
|
20
23
|
},
|
|
21
24
|
"peerDependencies": {
|
|
22
25
|
"@types/ws": "^8.18.1",
|
|
23
|
-
"
|
|
24
|
-
"@
|
|
25
|
-
"@zhin.js/client": "^1.0.0",
|
|
26
|
+
"@zhin.js/client": "^1.0.1",
|
|
27
|
+
"@zhin.js/core": "^1.0.3",
|
|
26
28
|
"@zhin.js/http": "^1.0.1",
|
|
27
|
-
"@zhin.js/
|
|
28
|
-
"@zhin.js/types": "^1.0.1"
|
|
29
|
+
"@zhin.js/types": "^1.0.2"
|
|
29
30
|
},
|
|
30
31
|
"peerDependenciesMeta": {
|
|
31
32
|
"@zhin.js/types": {
|
package/src/index.ts
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import {register, useContext
|
|
1
|
+
import {register, useContext} from '@zhin.js/core';
|
|
2
|
+
import react from '@vitejs/plugin-react';
|
|
2
3
|
import WebSocket,{WebSocketServer} from 'ws';
|
|
3
4
|
import {createServer,ViteDevServer,searchForWorkspaceRoot} from 'vite';
|
|
4
|
-
import Components from 'unplugin-vue-components/vite';
|
|
5
|
-
import {PrimeVueResolver} from '@primevue/auto-import-resolver';
|
|
6
5
|
import connect from 'koa-connect';
|
|
7
|
-
import vuePlugin from "@vitejs/plugin-vue";
|
|
8
6
|
import * as fs from 'fs';
|
|
9
7
|
import * as path from 'path';
|
|
10
8
|
import {fileURLToPath} from "node:url";
|
|
9
|
+
import tailwindcss from '@tailwindcss/vite';
|
|
11
10
|
|
|
12
11
|
declare module '@zhin.js/types' {
|
|
13
12
|
interface GlobalContext {
|
|
@@ -51,7 +50,6 @@ const createDeleteMsg = (key: string, value: any) => {
|
|
|
51
50
|
},
|
|
52
51
|
};
|
|
53
52
|
};
|
|
54
|
-
const logger=useLogger();
|
|
55
53
|
useContext('router', async (router) => {
|
|
56
54
|
const root = path.join(process.cwd(),'node_modules','@zhin.js','client','app');
|
|
57
55
|
const base='/vite/'
|
|
@@ -59,12 +57,8 @@ useContext('router', async (router) => {
|
|
|
59
57
|
root,
|
|
60
58
|
base,
|
|
61
59
|
plugins: [
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
resolvers: [
|
|
65
|
-
PrimeVueResolver()
|
|
66
|
-
]
|
|
67
|
-
})
|
|
60
|
+
react(),
|
|
61
|
+
tailwindcss(),
|
|
68
62
|
],
|
|
69
63
|
server: {
|
|
70
64
|
middlewareMode: true,
|
|
@@ -73,13 +67,14 @@ useContext('router', async (router) => {
|
|
|
73
67
|
},
|
|
74
68
|
},
|
|
75
69
|
resolve: {
|
|
76
|
-
dedupe: ['
|
|
70
|
+
dedupe: ['react', 'react-dom'],
|
|
77
71
|
alias: {
|
|
78
72
|
'@zhin.js/client': path.resolve(root, '../src'),
|
|
73
|
+
'@': path.resolve(root, 'src'),
|
|
79
74
|
},
|
|
80
75
|
},
|
|
81
76
|
optimizeDeps: {
|
|
82
|
-
include: ['
|
|
77
|
+
include: ['react', 'react-dom'],
|
|
83
78
|
},
|
|
84
79
|
build: {
|
|
85
80
|
rollupOptions: {
|
|
@@ -87,40 +82,55 @@ useContext('router', async (router) => {
|
|
|
87
82
|
},
|
|
88
83
|
},
|
|
89
84
|
});
|
|
85
|
+
|
|
86
|
+
// Vite 中间件 - 必须在其他路由之前
|
|
87
|
+
router.use((ctx: any, next: any) => {
|
|
88
|
+
if(ctx.request.originalUrl.startsWith('/api')) return next()
|
|
89
|
+
return connect(vite.middlewares)(ctx,next);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
// SPA 回退路由 - 处理所有未匹配的路由
|
|
90
93
|
router.all('*all', async (ctx, next) => {
|
|
91
|
-
|
|
92
|
-
const url=ctx.request.originalUrl.replace(base,'')
|
|
94
|
+
const url = ctx.request.originalUrl.replace(base, '')
|
|
93
95
|
const name = ctx.path.slice(1);
|
|
96
|
+
|
|
94
97
|
const sendFile = (filename: string) => {
|
|
95
98
|
ctx.type = path.extname(filename);
|
|
96
99
|
if (filename.endsWith('.ts')) ctx.type = 'text/javascript';
|
|
97
100
|
return (ctx.body = fs.createReadStream(filename));
|
|
98
101
|
};
|
|
102
|
+
|
|
103
|
+
// 1. 检查是否是动态入口
|
|
99
104
|
if (Object.keys(webServer.entries).includes(name)) {
|
|
100
105
|
return sendFile(path.resolve(process.cwd(), webServer.entries[name]));
|
|
101
106
|
}
|
|
107
|
+
|
|
108
|
+
// 2. 检查是否是静态文件
|
|
102
109
|
const filename = path.resolve(root, name);
|
|
103
|
-
if (
|
|
110
|
+
if (filename.startsWith(root) || filename.includes('node_modules')) {
|
|
111
|
+
if (fs.existsSync(filename)) {
|
|
112
|
+
const fileState = fs.statSync(filename);
|
|
113
|
+
if (fileState.isFile()) {
|
|
114
|
+
return sendFile(filename);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
} else {
|
|
118
|
+
// 安全检查:路径不在允许范围内
|
|
104
119
|
return (ctx.status = 403);
|
|
105
120
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
121
|
+
|
|
122
|
+
// 3. 所有其他路径(包括 SPA 路由)都返回 index.html
|
|
123
|
+
// 这样前端路由可以正确处理
|
|
110
124
|
const template = fs.readFileSync(path.resolve(root, 'index.html'), 'utf8');
|
|
111
125
|
ctx.type = 'html';
|
|
112
126
|
ctx.body = await vite.transformIndexHtml(url, template);
|
|
113
127
|
});
|
|
114
|
-
router.use((ctx: any, next: any) => {
|
|
115
|
-
if(ctx.request.originalUrl.startsWith('/api')) return next()
|
|
116
|
-
return connect(vite.middlewares)(ctx,next);
|
|
117
|
-
});
|
|
118
128
|
|
|
119
129
|
const webServer:WebServer={
|
|
120
130
|
vite,
|
|
121
131
|
entries: {},
|
|
122
132
|
addEntry(entry) {
|
|
123
|
-
const hash = Date.now().toString(16);
|
|
133
|
+
const hash = Date.now().toString(16)+Math.random().toString(16).slice(2,8);
|
|
124
134
|
const entryFile=typeof entry==="string"?entry:entry[(process.env.NODE_ENV as 'development'|'production')||'development'];
|
|
125
135
|
this.entries[hash] = `/vite/@fs/${entryFile}`;
|
|
126
136
|
for (const ws of this.ws.clients || []) {
|