fdb2 1.0.23 → 1.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -607
- package/bootstrap.js +26 -0
- package/dist/public/bootstrap.js +5 -5
- package/dist/public/explorer.js +203 -197
- package/dist/public/favicon.ico +0 -0
- package/dist/public/index.js +189 -168
- package/dist/public/layout.js +4 -4
- package/dist/public/vue.js +120 -90
- package/dist/scripts/electron-build.js +145 -0
- package/dist/scripts/electron-dev.js +116 -0
- package/dist/server/service/connection.service.d.ts.map +1 -1
- package/dist/server/service/connection.service.js +3 -7
- package/dist/server/service/connection.service.js.map +1 -1
- package/dist/server/service/connection.service.ts +3 -7
- package/dist/server/utils/data-dir.d.ts +19 -0
- package/dist/server/utils/data-dir.d.ts.map +1 -0
- package/dist/server/utils/data-dir.js +84 -0
- package/dist/server/utils/data-dir.js.map +1 -0
- package/dist/server/utils/data-dir.ts +47 -0
- package/electron/main.js +269 -0
- package/electron/preload.js +59 -0
- package/electron/updater.js +181 -0
- package/package.json +28 -35
- package/public/favicon.icns +0 -0
- package/public/favicon.ico +0 -0
- package/scripts/electron-build.js +145 -0
- package/scripts/electron-dev.js +116 -0
- package/server.js +6 -3
- package/dist/package.json +0 -139
- package/dist/pnpm-lock.yaml +0 -7332
- package/dist/scripts/nw-build.js +0 -136
- package/dist/scripts/nw-dev.js +0 -67
- package/dist/server/service/session.service.ts +0 -158
- package/scripts/nw-build.js +0 -136
- package/scripts/nw-dev.js +0 -67
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Electron 构建脚本
|
|
3
|
+
* @description 构建前端 + 服务端,然后使用 electron-builder 打包桌面应用
|
|
4
|
+
*
|
|
5
|
+
* 用法:
|
|
6
|
+
* node scripts/electron-build.js # 当前平台
|
|
7
|
+
* node scripts/electron-build.js --platform=win # Windows
|
|
8
|
+
* node scripts/electron-build.js --platform=mac # macOS
|
|
9
|
+
* node scripts/electron-build.js --platform=linux # Linux
|
|
10
|
+
* node scripts/electron-build.js --platform=all # 所有平台
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const path = require('path');
|
|
14
|
+
const { execSync } = require('child_process');
|
|
15
|
+
|
|
16
|
+
const projectRoot = path.resolve(__dirname, '..');
|
|
17
|
+
|
|
18
|
+
// Use Chinese mirror for local builds (outside CI). GitHub Actions runners can access GitHub directly.
|
|
19
|
+
if (!process.env.CI) {
|
|
20
|
+
if (!process.env.ELECTRON_MIRROR) {
|
|
21
|
+
process.env.ELECTRON_MIRROR = 'https://npmmirror.com/mirrors/electron/';
|
|
22
|
+
}
|
|
23
|
+
if (!process.env.ELECTRON_BUILDER_BINARIES_MIRROR) {
|
|
24
|
+
process.env.ELECTRON_BUILDER_BINARIES_MIRROR = 'https://npmmirror.com/mirrors/electron-builder-binaries/';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const args = process.argv.slice(2);
|
|
29
|
+
const targetPlatform = args.find(arg => arg.startsWith('--platform='))?.split('=')[1];
|
|
30
|
+
|
|
31
|
+
function getCurrentPlatform() {
|
|
32
|
+
switch (process.platform) {
|
|
33
|
+
case 'darwin': return 'mac';
|
|
34
|
+
case 'win32': return 'win';
|
|
35
|
+
default: return 'linux';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async function build() {
|
|
40
|
+
try {
|
|
41
|
+
console.log('Building FDB2 Electron app...\n');
|
|
42
|
+
|
|
43
|
+
// 1. 构建前端 + 服务端
|
|
44
|
+
console.log('1. Building Vue app + server...');
|
|
45
|
+
execSync('npm run build', { stdio: 'inherit', cwd: projectRoot });
|
|
46
|
+
|
|
47
|
+
// 2. Rebuild native modules for Electron
|
|
48
|
+
console.log('\n2. Rebuilding native modules for Electron...');
|
|
49
|
+
try {
|
|
50
|
+
// macOS 26+ 的 C++ 头文件在 SDK 内部,需要额外 -isystem 路径
|
|
51
|
+
const env = { ...process.env };
|
|
52
|
+
if (process.platform === 'darwin') {
|
|
53
|
+
try {
|
|
54
|
+
const sdkPath = execSync('xcrun --show-sdk-path', { encoding: 'utf-8' }).trim();
|
|
55
|
+
env.CXXFLAGS = (env.CXXFLAGS || '') + ` -isystem ${sdkPath}/usr/include/c++/v1`;
|
|
56
|
+
console.log(`macOS SDK: ${sdkPath}`);
|
|
57
|
+
} catch (e) { /* ignore */ }
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const electronVersion = require('electron/package.json').version;
|
|
61
|
+
const nodedir = path.join(require('os').homedir(), '.electron-gyp', electronVersion);
|
|
62
|
+
const arch = process.arch;
|
|
63
|
+
const gypArgs = `--target=${electronVersion} --arch=${arch} --nodedir=${nodedir}`;
|
|
64
|
+
|
|
65
|
+
// 确保 Electron headers 已下载
|
|
66
|
+
try {
|
|
67
|
+
require('fs').accessSync(nodedir);
|
|
68
|
+
} catch {
|
|
69
|
+
console.log('Downloading Electron headers...');
|
|
70
|
+
execSync(`npx node-gyp install ${gypArgs}`, { stdio: 'inherit', cwd: projectRoot, env });
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// 逐个编译原生模块
|
|
74
|
+
const nativeModules = ['better-sqlite3'];
|
|
75
|
+
for (const mod of nativeModules) {
|
|
76
|
+
let modDir;
|
|
77
|
+
try {
|
|
78
|
+
modDir = execSync(`node -p "require.resolve('${mod}/package.json').replace('/package.json','')"`, { encoding: 'utf-8', cwd: projectRoot }).trim();
|
|
79
|
+
} catch (e) {
|
|
80
|
+
console.warn(` Warning: Cannot resolve ${mod}, skipping`);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
console.log(`Building ${mod} at ${modDir}...`);
|
|
84
|
+
try {
|
|
85
|
+
execSync(`npx node-gyp configure ${gypArgs}`, { stdio: 'inherit', cwd: modDir, env });
|
|
86
|
+
// macOS: 修复过时的 deployment target (10.7 → 11.0)
|
|
87
|
+
if (process.platform === 'darwin') {
|
|
88
|
+
execSync(`find build -name "*.mk" -exec sed -i '' 's/-mmacosx-version-min=10\\.7/-mmacosx-version-min=11.0/g' {} +`, { cwd: modDir });
|
|
89
|
+
}
|
|
90
|
+
execSync(`make -C build`, { stdio: 'inherit', cwd: modDir, env });
|
|
91
|
+
console.log(` OK: ${mod} built successfully`);
|
|
92
|
+
} catch (e) {
|
|
93
|
+
console.warn(` Warning: ${mod} build failed (non-fatal):`, e.message);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
} catch (e) {
|
|
97
|
+
console.warn('Native module rebuild failed (non-fatal):', e.message);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// 3. 使用 electron-builder 打包
|
|
101
|
+
console.log('\n3. Packaging with electron-builder...');
|
|
102
|
+
|
|
103
|
+
const builder = require('electron-builder');
|
|
104
|
+
const platform = targetPlatform || getCurrentPlatform();
|
|
105
|
+
|
|
106
|
+
const platformMap = {
|
|
107
|
+
mac: builder.Platform.MAC.createTarget(),
|
|
108
|
+
win: builder.Platform.WINDOWS.createTarget(),
|
|
109
|
+
linux: builder.Platform.LINUX.createTarget(),
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
let targets;
|
|
113
|
+
if (platform === 'all') {
|
|
114
|
+
targets = {
|
|
115
|
+
...platformMap.mac,
|
|
116
|
+
...platformMap.win,
|
|
117
|
+
...platformMap.linux,
|
|
118
|
+
};
|
|
119
|
+
} else if (platformMap[platform]) {
|
|
120
|
+
targets = platformMap[platform];
|
|
121
|
+
} else {
|
|
122
|
+
console.error(`Unsupported platform: ${platform}`);
|
|
123
|
+
console.error('Supported: mac, win, linux, all');
|
|
124
|
+
process.exit(1);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
await builder.build({
|
|
128
|
+
targets,
|
|
129
|
+
config: {
|
|
130
|
+
...require(path.resolve(projectRoot, 'electron-builder.json')),
|
|
131
|
+
// In CI, enable native module rebuild (build tools available)
|
|
132
|
+
npmRebuild: !!process.env.CI,
|
|
133
|
+
},
|
|
134
|
+
projectDir: projectRoot,
|
|
135
|
+
publish: 'never',
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
console.log('\nBuild complete! Check the release/ directory.');
|
|
139
|
+
} catch (error) {
|
|
140
|
+
console.error('Build failed:', error);
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
build();
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Electron 开发模式启动脚本
|
|
3
|
+
* @description 启动 Vite 开发服务器,然后启动 Electron 窗口指向 Vite
|
|
4
|
+
*
|
|
5
|
+
* 用法: node scripts/electron-dev.js
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const { exec, spawn } = require('child_process');
|
|
9
|
+
const { resolve } = require('path');
|
|
10
|
+
const os = require('os');
|
|
11
|
+
|
|
12
|
+
const projectRoot = resolve(__dirname, '..');
|
|
13
|
+
const preferredPort = process.env.VITE_PORT || 9800;
|
|
14
|
+
const isWindows = os.platform() === 'win32';
|
|
15
|
+
let viteUrl = null;
|
|
16
|
+
let electronProcess = null;
|
|
17
|
+
|
|
18
|
+
// 启动 Vite 开发服务器(加大 maxBuffer 避免长时间运行溢出)
|
|
19
|
+
const viteProcess = exec('npm run dev', {
|
|
20
|
+
cwd: projectRoot,
|
|
21
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
22
|
+
env: { ...process.env, VITE_PORT: String(preferredPort) },
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
let readyTimer = null;
|
|
26
|
+
|
|
27
|
+
// 去除 ANSI 转义码,避免干扰正则匹配
|
|
28
|
+
function stripAnsi(str) {
|
|
29
|
+
return str.replace(/\x1b\[[0-9;]*m/g, '').replace(/\x1b\][^\x07]*\x07/g, '');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// 同时监听 stdout 和 stderr,Vite v8 可能将 URL 信息输出到 stderr
|
|
33
|
+
function handleOutput(data) {
|
|
34
|
+
const raw = data.toString();
|
|
35
|
+
console.log(raw);
|
|
36
|
+
|
|
37
|
+
const output = stripAnsi(raw);
|
|
38
|
+
|
|
39
|
+
// 从 Vite 输出中解析实际端口(如 "Local: http://localhost:9804/")
|
|
40
|
+
const localMatch = output.match(/Local:\s+https?:\/\/localhost:(\d+)/);
|
|
41
|
+
if (localMatch) {
|
|
42
|
+
viteUrl = `http://localhost:${localMatch[1]}`;
|
|
43
|
+
console.log(`[electron-dev] Detected Vite URL: ${viteUrl}`);
|
|
44
|
+
// 延迟启动 Electron,等 Vite 完全就绪
|
|
45
|
+
if (!readyTimer) {
|
|
46
|
+
readyTimer = setTimeout(() => {
|
|
47
|
+
console.log(`[electron-dev] Starting Electron...`);
|
|
48
|
+
startElectron();
|
|
49
|
+
}, 1500);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
viteProcess.stdout.on('data', handleOutput);
|
|
55
|
+
viteProcess.stderr.on('data', handleOutput);
|
|
56
|
+
viteProcess.on('close', (code) => console.log(`[electron-dev] Vite exited: ${code}`));
|
|
57
|
+
|
|
58
|
+
// 超时兜底:30秒内未匹配到 Vite URL,尝试使用默认端口
|
|
59
|
+
const FALLBACK_TIMEOUT = 30000;
|
|
60
|
+
const fallbackTimer = setTimeout(() => {
|
|
61
|
+
if (!viteUrl && !readyTimer) {
|
|
62
|
+
console.warn(`[electron-dev] Timeout: Vite URL not detected after ${FALLBACK_TIMEOUT / 1000}s, falling back to port ${preferredPort}`);
|
|
63
|
+
viteUrl = `http://localhost:${preferredPort}`;
|
|
64
|
+
console.log(`[electron-dev] Starting Electron with fallback URL: ${viteUrl}`);
|
|
65
|
+
startElectron();
|
|
66
|
+
}
|
|
67
|
+
}, FALLBACK_TIMEOUT);
|
|
68
|
+
|
|
69
|
+
function startElectron() {
|
|
70
|
+
if (electronProcess || !viteUrl) return; // 避免重复启动或 URL 未就绪
|
|
71
|
+
|
|
72
|
+
const electronBin = require('electron');
|
|
73
|
+
const mainScript = resolve(projectRoot, 'electron', 'main.js');
|
|
74
|
+
|
|
75
|
+
electronProcess = spawn(electronBin, [mainScript, `--dev-url=${viteUrl}`], {
|
|
76
|
+
cwd: projectRoot,
|
|
77
|
+
stdio: 'inherit',
|
|
78
|
+
env: { ...process.env, ELECTRON_DISABLE_SECURITY_WARNINGS: 'true', ELECTRON_DEV: '1' },
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
electronProcess.on('close', (code) => {
|
|
82
|
+
console.log(`[electron-dev] Electron exited: ${code}`);
|
|
83
|
+
killProcessTree(viteProcess);
|
|
84
|
+
process.exit(code || 0);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
electronProcess.on('error', (err) => {
|
|
88
|
+
console.error('[electron-dev] Failed to start Electron:', err);
|
|
89
|
+
killProcessTree(viteProcess);
|
|
90
|
+
process.exit(1);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// 杀进程树(Windows 下需要 taskkill 清理子进程,避免端口残留)
|
|
95
|
+
function killProcessTree(proc) {
|
|
96
|
+
if (!proc || proc.killed) return;
|
|
97
|
+
if (isWindows && proc.pid) {
|
|
98
|
+
try {
|
|
99
|
+
exec(`taskkill /pid ${proc.pid} /T /F`, { timeout: 5000 });
|
|
100
|
+
} catch (e) { /* ignore */ }
|
|
101
|
+
} else {
|
|
102
|
+
proc.kill('SIGTERM');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// 信号处理
|
|
107
|
+
function cleanup() {
|
|
108
|
+
clearTimeout(fallbackTimer);
|
|
109
|
+
clearTimeout(readyTimer);
|
|
110
|
+
if (electronProcess) killProcessTree(electronProcess);
|
|
111
|
+
killProcessTree(viteProcess);
|
|
112
|
+
process.exit();
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
process.on('SIGINT', cleanup);
|
|
116
|
+
process.on('SIGTERM', cleanup);
|
package/server.js
CHANGED
|
@@ -6,6 +6,7 @@ const fs = require('fs');
|
|
|
6
6
|
|
|
7
7
|
// 预加载 better-sqlite3 模块,确保原生绑定文件能够正确加载
|
|
8
8
|
// 并将其缓存到全局模块缓存中,以便 dist/server/index.js 可以使用
|
|
9
|
+
const { getDataPath } = require('./dist/server/utils/data-dir');
|
|
9
10
|
try {
|
|
10
11
|
const betterSqlite3 = require('better-sqlite3');
|
|
11
12
|
console.log('better-sqlite3 module preloaded successfully');
|
|
@@ -26,8 +27,11 @@ try {
|
|
|
26
27
|
console.error('Warning: Failed to preload better-sqlite3 module:', error.message);
|
|
27
28
|
}
|
|
28
29
|
|
|
29
|
-
// 日志文件路径 -
|
|
30
|
-
const logFilePath =
|
|
30
|
+
// 日志文件路径 - 使用统一数据目录
|
|
31
|
+
const logFilePath = getDataPath('server.log');
|
|
32
|
+
|
|
33
|
+
// PID 文件路径 - 使用统一数据目录
|
|
34
|
+
const pidFilePath = getDataPath('fdb2.server.pid');
|
|
31
35
|
|
|
32
36
|
// 重定向控制台输出到日志文件
|
|
33
37
|
const logStream = fs.createWriteStream(logFilePath, { flags: 'a' });
|
|
@@ -122,7 +126,6 @@ const PORT = portFromArgs || process.env.PORT || 9800;
|
|
|
122
126
|
app.listen(PORT, () => {
|
|
123
127
|
|
|
124
128
|
// 将 PID 写入 PID 文件
|
|
125
|
-
const pidFilePath = path.join(__dirname, 'fdb2.server.pid');
|
|
126
129
|
fs.writeFileSync(pidFilePath, process.pid.toString());
|
|
127
130
|
console.log(`PID ${process.pid} written to ${pidFilePath}`);
|
|
128
131
|
|
package/dist/package.json
DELETED
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "fdb2",
|
|
3
|
-
"version": "1.0.17",
|
|
4
|
-
"private": false,
|
|
5
|
-
"type": "commonjs",
|
|
6
|
-
"main": "view/index.html",
|
|
7
|
-
"files": [
|
|
8
|
-
"bin/",
|
|
9
|
-
"public/",
|
|
10
|
-
"view/",
|
|
11
|
-
"scripts/",
|
|
12
|
-
"server.js",
|
|
13
|
-
"package.json",
|
|
14
|
-
"README.md"
|
|
15
|
-
],
|
|
16
|
-
"homepage": "https://surl.fit/tools/tools/fdb2",
|
|
17
|
-
"icon": "public/favicon.ico",
|
|
18
|
-
"window": {
|
|
19
|
-
"title": "数据库管理工具",
|
|
20
|
-
"width": 1200,
|
|
21
|
-
"height": 800,
|
|
22
|
-
"min_width": 800,
|
|
23
|
-
"min_height": 600,
|
|
24
|
-
"resizable": true,
|
|
25
|
-
"show_in_taskbar": true,
|
|
26
|
-
"frame": true,
|
|
27
|
-
"icon": "public/favicon.ico"
|
|
28
|
-
},
|
|
29
|
-
"scripts": {
|
|
30
|
-
"start": "pm2 start server.js --name fdb2-server --disable-logs --",
|
|
31
|
-
"restart": "pm2 restart fdb2-server --disable-logs --",
|
|
32
|
-
"stop": "pm2 stop fdb2-server --",
|
|
33
|
-
"dev": "vite",
|
|
34
|
-
"build": "npm run build-only",
|
|
35
|
-
"preview": "vite preview",
|
|
36
|
-
"test:unit": "vitest",
|
|
37
|
-
"build-only": "vite build && npm run build-server",
|
|
38
|
-
"build-server": "tsc -p tsconfig.server.json",
|
|
39
|
-
"build:vscode": "vite build --config vite.config.vscode.ts",
|
|
40
|
-
"build:vscode:extension": "cd packages/vscode && npm run compile",
|
|
41
|
-
"build:all": "npm run build && npm run build:vscode && npm run build:vscode:extension",
|
|
42
|
-
"move-assets": "node move-assets.cjs",
|
|
43
|
-
"type-check": "vue-tsc --noEmit --composite false",
|
|
44
|
-
"lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore",
|
|
45
|
-
"nw:dev": "node scripts/nw-dev.js",
|
|
46
|
-
"nw:build": "node scripts/nw-build.js",
|
|
47
|
-
"nw:build:win": "node scripts/nw-build.js --platform=win",
|
|
48
|
-
"nw:build:osx": "node scripts/nw-build.js --platform=osx",
|
|
49
|
-
"nw:build:linux": "node scripts/nw-build.js --platform=linux",
|
|
50
|
-
"pkg:server": "cd d:/code/ycnull/db_tool && pkg dist/server/index.js -t node18-win-x64 -o dist/server/server.exe",
|
|
51
|
-
"build:server:pkg": "ncc build server/index.ts -o dist/server/pkg",
|
|
52
|
-
"vscode:dev": "cd packages/vscode && npm run watch",
|
|
53
|
-
"vscode:package": "cd packages/vscode && vsce package"
|
|
54
|
-
},
|
|
55
|
-
"dependencies": {
|
|
56
|
-
"@fefeding/common": "^1.0.58",
|
|
57
|
-
"axios": "^1.15.0",
|
|
58
|
-
"dayjs": "^1.11.20",
|
|
59
|
-
"express": "^5.2.1",
|
|
60
|
-
"mysql2": "^3.22.1",
|
|
61
|
-
"oracledb": "^6.10.0",
|
|
62
|
-
"pg": "^8.20.0",
|
|
63
|
-
"reflect-metadata": "^0.2.2",
|
|
64
|
-
"typeorm": "^0.3.28"
|
|
65
|
-
},
|
|
66
|
-
"optionalDependencies": {
|
|
67
|
-
"better-sqlite3": "^11.10.0"
|
|
68
|
-
},
|
|
69
|
-
"devDependencies": {
|
|
70
|
-
"@codemirror/commands": "^6.10.3",
|
|
71
|
-
"@codemirror/fold": "^0.19.4",
|
|
72
|
-
"@codemirror/lang-json": "^6.0.2",
|
|
73
|
-
"@codemirror/lang-sql": "^6.10.0",
|
|
74
|
-
"@codemirror/language": "^6.12.3",
|
|
75
|
-
"@codemirror/state": "^6.6.0",
|
|
76
|
-
"@codemirror/theme-one-dark": "^6.1.3",
|
|
77
|
-
"@codemirror/view": "^6.41.0",
|
|
78
|
-
"@fefeding/eventemitter": "^1.0.5",
|
|
79
|
-
"@fefeding/vite-nunjucks-plugin": "^1.0.2",
|
|
80
|
-
"@popperjs/core": "^2.11.8",
|
|
81
|
-
"@rollup/pluginutils": "^5.3.0",
|
|
82
|
-
"@types/bootstrap": "^5.2.10",
|
|
83
|
-
"@types/jsdom": "^21.1.7",
|
|
84
|
-
"@types/node": "^24.12.2",
|
|
85
|
-
"@types/vue": "^2.0.0",
|
|
86
|
-
"@vitejs/plugin-vue": "^6.0.6",
|
|
87
|
-
"@vitejs/plugin-vue-jsx": "^5.1.5",
|
|
88
|
-
"@vue/tsconfig": "^0.8.1",
|
|
89
|
-
"@vueuse/core": "^13.9.0",
|
|
90
|
-
"@zumer/snapdom": "^1.9.14",
|
|
91
|
-
"autoprefixer": "^10.5.0",
|
|
92
|
-
"bootstrap": "^5.3.8",
|
|
93
|
-
"bootstrap-icons": "^1.13.1",
|
|
94
|
-
"codemirror": "^6.0.2",
|
|
95
|
-
"dotenv": "^17.4.2",
|
|
96
|
-
"echarts": "^6.0.0",
|
|
97
|
-
"exceljs": "^4.4.0",
|
|
98
|
-
"js-cookie": "^3.0.5",
|
|
99
|
-
"jsdom": "^26.1.0",
|
|
100
|
-
"jszip": "^3.10.1",
|
|
101
|
-
"nw": "^0.107.0",
|
|
102
|
-
"nw-builder": "^4.17.7",
|
|
103
|
-
"pinia": "^3.0.4",
|
|
104
|
-
"pinia-plugin-persistedstate": "^4.7.1",
|
|
105
|
-
"postcss": "^8.5.10",
|
|
106
|
-
"sass": "^1.99.0",
|
|
107
|
-
"tailwindcss": "^3.4.19",
|
|
108
|
-
"typescript": "^5.9.3",
|
|
109
|
-
"vconsole": "^3.15.1",
|
|
110
|
-
"vite": "latest",
|
|
111
|
-
"vite-plugin-files-copy": "^3.8.0",
|
|
112
|
-
"vitest": "^3.2.4",
|
|
113
|
-
"vue": "^3.5.32",
|
|
114
|
-
"vue-router": "^4.6.4",
|
|
115
|
-
"vue-tsc": "^3.2.6",
|
|
116
|
-
"vuex": "^4.1.0",
|
|
117
|
-
"xlsx": "^0.18.5"
|
|
118
|
-
},
|
|
119
|
-
"bin": {
|
|
120
|
-
"fdb2": "bin/fdb2.js"
|
|
121
|
-
},
|
|
122
|
-
"pkg": {
|
|
123
|
-
"scripts": [
|
|
124
|
-
"dist/server/**/*.js"
|
|
125
|
-
],
|
|
126
|
-
"assets": [
|
|
127
|
-
"dist/node_modules/**/*",
|
|
128
|
-
"dist/client/**/*"
|
|
129
|
-
]
|
|
130
|
-
},
|
|
131
|
-
"publishConfig": {
|
|
132
|
-
"registry": "https://registry.npmjs.org/"
|
|
133
|
-
},
|
|
134
|
-
"pnpm": {
|
|
135
|
-
"onlyBuiltDependencies": [
|
|
136
|
-
"better-sqlite3"
|
|
137
|
-
]
|
|
138
|
-
}
|
|
139
|
-
}
|