@starpak/cli 0.0.0-stage → 1.0.5
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/LICENSE +22 -0
- package/bin/spak.js +6 -0
- package/lib/cli/firewall.d.ts +20 -0
- package/lib/cli/firewall.d.ts.map +1 -0
- package/lib/cli/firewall.js +207 -0
- package/lib/cli/firewall.js.map +1 -0
- package/lib/cli/index.d.ts +2 -0
- package/lib/cli/index.d.ts.map +1 -0
- package/lib/cli/index.js +76 -0
- package/lib/cli/index.js.map +1 -0
- package/lib/cli/registry.d.ts +10 -0
- package/lib/cli/registry.d.ts.map +1 -0
- package/lib/cli/registry.js +207 -0
- package/lib/cli/registry.js.map +1 -0
- package/lib/cli/start.d.ts +4 -0
- package/lib/cli/start.d.ts.map +1 -0
- package/lib/cli/start.js +301 -0
- package/lib/cli/start.js.map +1 -0
- package/lib/cli/types.d.ts +2 -0
- package/lib/cli/types.d.ts.map +1 -0
- package/lib/cli/types.js +3 -0
- package/lib/cli/types.js.map +1 -0
- package/lib/commands/check.d.ts +4 -0
- package/lib/commands/check.d.ts.map +1 -0
- package/lib/commands/check.js +84 -0
- package/lib/commands/check.js.map +1 -0
- package/lib/commands/config.d.ts +4 -0
- package/lib/commands/config.d.ts.map +1 -0
- package/lib/commands/config.js +79 -0
- package/lib/commands/config.js.map +1 -0
- package/lib/commands/cpc.d.ts +41 -0
- package/lib/commands/cpc.d.ts.map +1 -0
- package/lib/commands/cpc.js +801 -0
- package/lib/commands/cpc.js.map +1 -0
- package/lib/index.d.ts +32 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +95 -0
- package/lib/index.js.map +1 -0
- package/lib/version.d.ts +2 -0
- package/lib/version.d.ts.map +1 -0
- package/lib/version.js +16 -0
- package/lib/version.js.map +1 -0
- package/package.json +47 -3
- package/README.md +0 -3
package/lib/cli/start.js
ADDED
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const util_1 = require("@starpak/util");
|
|
40
|
+
const path_1 = require("path");
|
|
41
|
+
const kleur_1 = __importDefault(require("kleur"));
|
|
42
|
+
const promises_1 = require("fs/promises");
|
|
43
|
+
// CPC module whitelist check is ALWAYS executed on startup regardless of
|
|
44
|
+
// cpc.enabled. This is intentional — loading untrusted modules must be
|
|
45
|
+
// blocked at the framework level before ANY user plugin code runs.
|
|
46
|
+
const cpc_1 = require("../commands/cpc");
|
|
47
|
+
const log_1 = require("@starpak/log");
|
|
48
|
+
process.env.SPAK_SHARED = JSON.stringify({
|
|
49
|
+
startTime: Date.now(),
|
|
50
|
+
});
|
|
51
|
+
const PID_FILE = (0, path_1.join)((0, util_1.projectDataDir)(), '.spak.pid');
|
|
52
|
+
async function getRunningPid() {
|
|
53
|
+
try {
|
|
54
|
+
const data = await (0, promises_1.readFile)(PID_FILE, 'utf8');
|
|
55
|
+
const pid = parseInt(data.trim(), 10);
|
|
56
|
+
if (isNaN(pid))
|
|
57
|
+
return null;
|
|
58
|
+
try {
|
|
59
|
+
process.kill(pid, 0);
|
|
60
|
+
return pid;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async function savePid(pid) {
|
|
71
|
+
await (0, promises_1.writeFile)(PID_FILE, String(pid), 'utf8');
|
|
72
|
+
}
|
|
73
|
+
async function stopService(signal = 'SIGTERM') {
|
|
74
|
+
const pid = await getRunningPid();
|
|
75
|
+
if (!pid) {
|
|
76
|
+
console.log(kleur_1.default.yellow('Spak 服务未运行'));
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
process.kill(pid, signal);
|
|
81
|
+
console.log(kleur_1.default.green(`已发送 ${signal} 信号到 Spak 服务 (pid=${pid})`));
|
|
82
|
+
try {
|
|
83
|
+
await (0, promises_1.unlink)(PID_FILE);
|
|
84
|
+
}
|
|
85
|
+
catch { }
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
console.error(kleur_1.default.red(`停止 Spak 服务失败 (pid=${pid}): ${String(err)}`));
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async function killService() {
|
|
94
|
+
return stopService('SIGKILL');
|
|
95
|
+
}
|
|
96
|
+
async function startService(file) {
|
|
97
|
+
// ==================================================================
|
|
98
|
+
// DEBUG MODE — Enable detailed logging if requested
|
|
99
|
+
// ==================================================================
|
|
100
|
+
const isDebug = process.env.SPAK_DEBUG === 'true' || process.env.SPAK_LOG_TIME;
|
|
101
|
+
if (isDebug) {
|
|
102
|
+
(0, log_1.setDebugMode)(true);
|
|
103
|
+
}
|
|
104
|
+
await savePid(process.pid);
|
|
105
|
+
// ==================================================================
|
|
106
|
+
// HARD GUARD — CPC module whitelist (always enforced, even without
|
|
107
|
+
// cpc.enabled=true in config). Unauthorized packages/plugins cause
|
|
108
|
+
// process.exit(1) from inside runModuleWhitelistCheck.
|
|
109
|
+
// ==================================================================
|
|
110
|
+
(0, cpc_1.runModuleWhitelistCheck)(true);
|
|
111
|
+
// Normalize ESM / CJS / named-export shapes so that `new NodeLoader()`
|
|
112
|
+
// always works regardless of how the loader module is bundled.
|
|
113
|
+
const mod = await Promise.resolve().then(() => __importStar(require('@starpak/loader')));
|
|
114
|
+
const NodeLoader = mod.default?.default ?? mod.default ?? mod.NodeLoader ?? mod;
|
|
115
|
+
const loader = new NodeLoader();
|
|
116
|
+
try {
|
|
117
|
+
await loader.init(file);
|
|
118
|
+
await loader.readConfig(true);
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
console.error(`${kleur_1.default.red('[CLI]')} 读取配置失败: ${err.stack || err.message}`);
|
|
122
|
+
throw err;
|
|
123
|
+
}
|
|
124
|
+
// Host/port env overrides are applied directly via process.env
|
|
125
|
+
// (SPAK_HOST / SPAK_PORT), consumed by server-style plugins.
|
|
126
|
+
const app = await loader.createApp();
|
|
127
|
+
await app.start();
|
|
128
|
+
console.log(kleur_1.default.green(`Spak 服务已启动 (pid=${process.pid})`));
|
|
129
|
+
const onSignal = async (signal) => {
|
|
130
|
+
console.log(kleur_1.default.yellow(`\n正在关闭 Spak 服务... (${signal})`));
|
|
131
|
+
await app.parallel('exit', signal);
|
|
132
|
+
try {
|
|
133
|
+
await (0, promises_1.unlink)(PID_FILE);
|
|
134
|
+
}
|
|
135
|
+
catch { }
|
|
136
|
+
process.exit(0);
|
|
137
|
+
};
|
|
138
|
+
process.on('SIGINT', () => onSignal('SIGINT'));
|
|
139
|
+
process.on('SIGTERM', () => onSignal('SIGTERM'));
|
|
140
|
+
if (!app.scope.runtime.children.length) {
|
|
141
|
+
// Keep the Node.js event loop alive. A periodic no-op timer is used
|
|
142
|
+
// instead of process.stdin.resume() so the server survives both
|
|
143
|
+
// foreground and background (setsid/nohup, stdin=/dev/null) runs,
|
|
144
|
+
// and still terminates cleanly via the SIGINT/SIGTERM handlers above.
|
|
145
|
+
setInterval(() => { }, 1000);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async function statusService() {
|
|
149
|
+
const pid = await getRunningPid();
|
|
150
|
+
if (!pid) {
|
|
151
|
+
console.log(kleur_1.default.red('Spak 服务未运行'));
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
let port = '?';
|
|
155
|
+
let uptime = '?';
|
|
156
|
+
let memUsage = '?';
|
|
157
|
+
let cpuUsage = '?';
|
|
158
|
+
let nodeVersion = process.version;
|
|
159
|
+
let platform = `${process.platform} ${process.arch}`;
|
|
160
|
+
let hostname = '?';
|
|
161
|
+
let totalMem = '?';
|
|
162
|
+
let freeMem = '?';
|
|
163
|
+
let loadAvg = [];
|
|
164
|
+
let requestCount = 0;
|
|
165
|
+
let pluginCount = 0;
|
|
166
|
+
try {
|
|
167
|
+
const logData = await (0, promises_1.readFile)('spak.log', 'utf-8');
|
|
168
|
+
const portMatch = logData.match(/listening at http:\/\/([^:]+):(\d+)/);
|
|
169
|
+
if (portMatch)
|
|
170
|
+
port = portMatch[2];
|
|
171
|
+
const requests = logData.match(/\[REQUEST\]|\[HTTP\]|request|response/gi);
|
|
172
|
+
requestCount = requests ? requests.length : 0;
|
|
173
|
+
const plugins = logData.match(/apply plugin/g);
|
|
174
|
+
pluginCount = plugins ? plugins.length : 0;
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
if (process.env.SPAK_DEBUG)
|
|
178
|
+
console.debug('[status] read spak.log failed:', err?.message ?? String(err));
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
const os = await Promise.resolve().then(() => __importStar(require('os')));
|
|
182
|
+
hostname = os.hostname();
|
|
183
|
+
totalMem = (os.totalmem() / 1024 / 1024 / 1024).toFixed(1) + ' GB';
|
|
184
|
+
freeMem = (os.freemem() / 1024 / 1024 / 1024).toFixed(1) + ' GB';
|
|
185
|
+
loadAvg = os.loadavg();
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
if (process.env.SPAK_DEBUG)
|
|
189
|
+
console.debug('[status] os module failed:', err?.message ?? String(err));
|
|
190
|
+
}
|
|
191
|
+
try {
|
|
192
|
+
memUsage = ((process.memoryUsage().rss / 1024 / 1024).toFixed(1)) + ' MB';
|
|
193
|
+
cpuUsage = (process.cpuUsage().user / 1000000).toFixed(2) + 's';
|
|
194
|
+
const running = process.uptime();
|
|
195
|
+
const hours = Math.floor(running / 3600);
|
|
196
|
+
const mins = Math.floor((running % 3600) / 60);
|
|
197
|
+
const secs = Math.floor(running % 60);
|
|
198
|
+
uptime = `${hours}h ${mins}m ${secs}s`;
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
if (process.env.SPAK_DEBUG)
|
|
202
|
+
console.debug('[status] runtime stats failed:', err?.message ?? String(err));
|
|
203
|
+
}
|
|
204
|
+
const line = '─'.repeat(40);
|
|
205
|
+
console.log();
|
|
206
|
+
console.log(` ${kleur_1.default.green('●')} ${kleur_1.default.bold('Spak 服务状态')} `);
|
|
207
|
+
console.log(` ${line}`);
|
|
208
|
+
console.log(` ${kleur_1.default.bold('服务')}`);
|
|
209
|
+
console.log(` PID: ${pid}`);
|
|
210
|
+
console.log(` 端口: ${port}`);
|
|
211
|
+
console.log(` 运行时间: ${uptime}`);
|
|
212
|
+
console.log(` 插件数: ${pluginCount}`);
|
|
213
|
+
console.log(` 请求数: ${requestCount}`);
|
|
214
|
+
console.log();
|
|
215
|
+
console.log(` ${kleur_1.default.bold('硬件')}`);
|
|
216
|
+
console.log(` 内存: ${memUsage} / ${totalMem}`);
|
|
217
|
+
console.log(` 可用: ${freeMem}`);
|
|
218
|
+
if (loadAvg.length >= 3) {
|
|
219
|
+
console.log(` 负载: ${loadAvg[0].toFixed(2)}, ${loadAvg[1].toFixed(2)}, ${loadAvg[2].toFixed(2)}`);
|
|
220
|
+
}
|
|
221
|
+
console.log(` CPU: ${cpuUsage}`);
|
|
222
|
+
console.log(` 平台: ${platform}`);
|
|
223
|
+
console.log();
|
|
224
|
+
console.log(` ${kleur_1.default.bold('环境')}`);
|
|
225
|
+
console.log(` 主机: ${hostname}`);
|
|
226
|
+
console.log(` Node: ${nodeVersion}`);
|
|
227
|
+
console.log(` 日志: spak.log`);
|
|
228
|
+
console.log(` PID文件: .spak.pid`);
|
|
229
|
+
console.log(` ${line}`);
|
|
230
|
+
console.log();
|
|
231
|
+
}
|
|
232
|
+
const serveDeclarations = [
|
|
233
|
+
{
|
|
234
|
+
command: 'serve',
|
|
235
|
+
description: '启动 spak 应用',
|
|
236
|
+
args: [{ name: 'file', description: '配置文件路径' }],
|
|
237
|
+
options: [
|
|
238
|
+
{ name: 'debug', description: '指定调试命名空间' },
|
|
239
|
+
{ name: 'log-level', description: '指定日志级别 (默认: 2)', default: '2' },
|
|
240
|
+
{ name: 'log-time', description: '日志中显示时间戳' },
|
|
241
|
+
{ name: 'host', description: '指定服务器主机 (默认: 0.0.0.0)', default: '0.0.0.0' },
|
|
242
|
+
{ name: 'port', description: '指定服务器端口 (默认: 4321)', default: '4321' },
|
|
243
|
+
{ name: 'stop', description: '停止运行中的 spak 实例' },
|
|
244
|
+
{ name: 'restart', description: '重启运行中的 spak 实例' },
|
|
245
|
+
{ name: 'kill', description: '强制杀死运行中的 spak 实例' },
|
|
246
|
+
{ name: 'no-sandbox', description: '禁用插件沙箱 (警告: 不安全, 插件将在无隔离环境下运行)' },
|
|
247
|
+
],
|
|
248
|
+
action: async (args, options) => {
|
|
249
|
+
const file = args.file;
|
|
250
|
+
const { logLevel, debug, logTime, host, port, stop, restart, kill, noSandbox } = options;
|
|
251
|
+
if (kill) {
|
|
252
|
+
await killService();
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
if (stop) {
|
|
256
|
+
await stopService();
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
if (restart) {
|
|
260
|
+
await stopService('SIGTERM');
|
|
261
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
262
|
+
try {
|
|
263
|
+
await (0, promises_1.unlink)(PID_FILE);
|
|
264
|
+
}
|
|
265
|
+
catch { }
|
|
266
|
+
}
|
|
267
|
+
if (noSandbox)
|
|
268
|
+
process.env.SPAK_NO_SANDBOX = '1';
|
|
269
|
+
// Enable debug mode if log.debug is set
|
|
270
|
+
if (options.debug === 'true') {
|
|
271
|
+
(0, log_1.setDebugMode)(true);
|
|
272
|
+
}
|
|
273
|
+
process.env.SPAK_LOG_TIME = logTime || '';
|
|
274
|
+
process.env.SPAK_LOG_TIME = logTime || '';
|
|
275
|
+
process.env.SPAK_LOG_LEVEL = logLevel || '';
|
|
276
|
+
process.env.SPAK_DEBUG = debug || '';
|
|
277
|
+
process.env.SPAK_CONFIG_FILE = file || '';
|
|
278
|
+
if (host)
|
|
279
|
+
process.env.SPAK_HOST = host;
|
|
280
|
+
if (port)
|
|
281
|
+
process.env.SPAK_PORT = String(port);
|
|
282
|
+
if (process.env.SPAK_LOG_LEVEL && (!(0, util_1.isInteger)(Number(process.env.SPAK_LOG_LEVEL)) || Number(process.env.SPAK_LOG_LEVEL) < 0)) {
|
|
283
|
+
console.warn(`${kleur_1.default.red('发生错误')} SPAK_LOG_LEVEL 无效`);
|
|
284
|
+
process.exit(1);
|
|
285
|
+
}
|
|
286
|
+
await startService(file).catch((error) => {
|
|
287
|
+
console.error(kleur_1.default.red(`启动 Spak 服务失败: ${String(error)}`));
|
|
288
|
+
process.exit(1);
|
|
289
|
+
});
|
|
290
|
+
},
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
command: 'serve status',
|
|
294
|
+
description: '显示 spak 服务状态',
|
|
295
|
+
action: async () => {
|
|
296
|
+
await statusService();
|
|
297
|
+
},
|
|
298
|
+
},
|
|
299
|
+
];
|
|
300
|
+
exports.default = serveDeclarations;
|
|
301
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/cli/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA"}
|
package/lib/cli/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAmBvD,eAAO,MAAM,iBAAiB,EAAE,kBAAkB,EAiDjD,CAAA;AAED,eAAe,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ===== spak check — type-check Spak sources (.spk) =====
|
|
3
|
+
//
|
|
4
|
+
// spak check [path]
|
|
5
|
+
//
|
|
6
|
+
// Defaults to the current directory. Directories are scanned recursively for
|
|
7
|
+
// *.spk files; `dist/`, `node_modules/` and `tmp/` are skipped.
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.checkDeclarations = void 0;
|
|
13
|
+
const node_fs_1 = require("node:fs");
|
|
14
|
+
const node_path_1 = require("node:path");
|
|
15
|
+
const kleur_1 = __importDefault(require("kleur"));
|
|
16
|
+
const lang_1 = require("@starpak/lang");
|
|
17
|
+
const SKIP = new Set(['node_modules', 'dist', 'tmp', '.git', '.godot']);
|
|
18
|
+
function collect(target, out = []) {
|
|
19
|
+
const stat = (0, node_fs_1.statSync)(target, { throwIfNoEntry: false });
|
|
20
|
+
if (!stat)
|
|
21
|
+
return out;
|
|
22
|
+
if (stat.isFile()) {
|
|
23
|
+
if (target.endsWith('.spk'))
|
|
24
|
+
out.push(target);
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
for (const entry of (0, node_fs_1.readdirSync)(target, { withFileTypes: true })) {
|
|
28
|
+
if (SKIP.has(entry.name))
|
|
29
|
+
continue;
|
|
30
|
+
collect((0, node_path_1.join)(target, entry.name), out);
|
|
31
|
+
}
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
exports.checkDeclarations = [
|
|
35
|
+
{
|
|
36
|
+
command: 'check',
|
|
37
|
+
description: '类型检查 Spak 源码 (.spk)',
|
|
38
|
+
args: [{ name: 'path', description: '文件或目录 (默认: 当前目录)' }],
|
|
39
|
+
options: [
|
|
40
|
+
{ name: 'strict', description: '将警告视为失败' },
|
|
41
|
+
{ name: 'json', description: '以 JSON 输出诊断信息' },
|
|
42
|
+
],
|
|
43
|
+
action: (args, options) => {
|
|
44
|
+
const target = (0, node_path_1.resolve)(args.path || process.cwd());
|
|
45
|
+
const files = collect(target);
|
|
46
|
+
if (!files.length) {
|
|
47
|
+
console.log(kleur_1.default.yellow(`没有找到 .spk 文件:${target}`));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const all = [];
|
|
51
|
+
for (const file of files) {
|
|
52
|
+
const source = (0, node_fs_1.readFileSync)(file, 'utf-8');
|
|
53
|
+
const diagnostics = (0, lang_1.check)((0, lang_1.parse)(source), {
|
|
54
|
+
strictAny: Boolean(options.strict),
|
|
55
|
+
reportUnused: true,
|
|
56
|
+
});
|
|
57
|
+
if (diagnostics.length)
|
|
58
|
+
all.push({ file, source, diagnostics });
|
|
59
|
+
}
|
|
60
|
+
if (options.json) {
|
|
61
|
+
const payload = all.flatMap(entry => entry.diagnostics.map(diag => ({
|
|
62
|
+
file: entry.file,
|
|
63
|
+
...diag,
|
|
64
|
+
})));
|
|
65
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
for (const entry of all) {
|
|
69
|
+
for (const diag of entry.diagnostics) {
|
|
70
|
+
console.log((0, lang_1.formatDiagnostic)(diag, { file: entry.file, source: entry.source }));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const flat = all.flatMap(entry => entry.diagnostics);
|
|
75
|
+
const { errors, warnings } = (0, lang_1.countBySeverity)(flat);
|
|
76
|
+
const summary = `${files.length} 个文件 · ${errors} 个错误 · ${warnings} 个警告`;
|
|
77
|
+
console.log(errors ? kleur_1.default.red(summary) : kleur_1.default.green(summary));
|
|
78
|
+
if (errors || (options.strict && warnings))
|
|
79
|
+
process.exitCode = 1;
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
exports.default = exports.checkDeclarations;
|
|
84
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAElD,QAAA,MAAM,cAAc,EAAE,kBAAkB,EAiEvC,CAAA;AAED,eAAe,cAAc,CAAA"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const config_1 = require("@starpak/config");
|
|
7
|
+
const kleur_1 = __importDefault(require("kleur"));
|
|
8
|
+
const configCommands = [
|
|
9
|
+
{
|
|
10
|
+
command: 'config',
|
|
11
|
+
description: '管理 Spak 配置',
|
|
12
|
+
args: [],
|
|
13
|
+
action: () => {
|
|
14
|
+
console.log(`配置命令:
|
|
15
|
+
spak config list 列出所有配置
|
|
16
|
+
spak config get <键> 获取配置值
|
|
17
|
+
spak config set <键> <值> 设置配置值`);
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
command: 'config list',
|
|
22
|
+
description: '列出所有配置',
|
|
23
|
+
action: () => {
|
|
24
|
+
const cfg = (0, config_1.loadConfig)();
|
|
25
|
+
console.log(JSON.stringify(cfg, null, 2));
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
command: 'config get',
|
|
30
|
+
description: '获取配置值',
|
|
31
|
+
args: [{ name: 'key', description: '配置键', required: true }],
|
|
32
|
+
action: (args) => {
|
|
33
|
+
if (!args.key) {
|
|
34
|
+
console.log(kleur_1.default.red('用法: spak config get <键>'));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const val = (0, config_1.getConfig)(args.key);
|
|
38
|
+
if (val === undefined) {
|
|
39
|
+
console.log(kleur_1.default.red(`未找到键: ${args.key}`));
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
console.log(`${args.key} = ${JSON.stringify(val)}`);
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
command: 'config set',
|
|
48
|
+
description: '设置配置值',
|
|
49
|
+
args: [
|
|
50
|
+
{ name: 'key', description: '配置键', required: true },
|
|
51
|
+
{ name: 'value', description: '配置值' },
|
|
52
|
+
],
|
|
53
|
+
action: (args) => {
|
|
54
|
+
if (!args.key) {
|
|
55
|
+
console.log(kleur_1.default.red('用法: spak config set <键> <值>'));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// Type validation for specific config keys
|
|
59
|
+
if (args.key === 'cpc.ssetps.memoryLimitMB') {
|
|
60
|
+
if (!args.value || isNaN(Number(args.value))) {
|
|
61
|
+
console.log(kleur_1.default.red('内存限制必须是有效的数字'));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
(0, config_1.setConfig)(args.key, Number(args.value));
|
|
65
|
+
console.log(kleur_1.default.green(`已设置 ${args.key} = ${String(Number(args.value))}`));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
let parsedValue = args.value;
|
|
69
|
+
try {
|
|
70
|
+
parsedValue = JSON.parse(args.value);
|
|
71
|
+
}
|
|
72
|
+
catch { }
|
|
73
|
+
(0, config_1.setConfig)(args.key, parsedValue);
|
|
74
|
+
console.log(kleur_1.default.green(`已设置 ${args.key} = ${JSON.stringify(parsedValue)}`));
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
];
|
|
78
|
+
exports.default = configCommands;
|
|
79
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { CommandDeclaration } from '@starpak/util';
|
|
2
|
+
/**
|
|
3
|
+
* Run the whitelist validation step.
|
|
4
|
+
*
|
|
5
|
+
* Discovers every builtin package under /packages and every plugin
|
|
6
|
+
* under /plugins, then verifies each name appears in the hard-coded
|
|
7
|
+
* MODULE_WHITELIST above.
|
|
8
|
+
*
|
|
9
|
+
* If ANY unauthorized module is found:
|
|
10
|
+
* 1. log each offending name (未授权模块提示)
|
|
11
|
+
* 2. log a final violation summary
|
|
12
|
+
* 3. call process.exit(1) immediately so the framework cannot boot
|
|
13
|
+
*
|
|
14
|
+
* Returns silently when everything is authorized.
|
|
15
|
+
*/
|
|
16
|
+
export declare function runModuleWhitelistCheck(failHard?: boolean): {
|
|
17
|
+
unauthorized: string[];
|
|
18
|
+
total: number;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Sandbox worker 主进程内运行入口(SEA 二进制标记分支)。
|
|
22
|
+
*
|
|
23
|
+
* 封闭二进制里 spawn 子进程用「自 re-exec」:
|
|
24
|
+
* spawn(process.execPath, ['--spak-sandbox', name])
|
|
25
|
+
* 主 bundle 启动时检测到该标记,直接执行本函数(内嵌代码);
|
|
26
|
+
* 防火墙来自同包模块引用,无需 cwd 的 node_modules ——
|
|
27
|
+
* 与非 SEA 场景的 `node -e` 字符串脚本行为等价。
|
|
28
|
+
*/
|
|
29
|
+
export declare function runSandboxWorker(name: string): void;
|
|
30
|
+
export declare function isolatePlugin(name: string): void;
|
|
31
|
+
export declare function terminateSandbox(name: string): void;
|
|
32
|
+
declare const circuitBreakers: Map<string, boolean>;
|
|
33
|
+
declare function triggerCircuitBreaker(pluginName: string): void;
|
|
34
|
+
declare function restoreCircuitBreaker(pluginName: string): void;
|
|
35
|
+
export declare function isAvailable(): boolean;
|
|
36
|
+
export declare function ensureAvailable(): void;
|
|
37
|
+
export declare function initCPC(config: any): void;
|
|
38
|
+
declare const cpcDeclarations: CommandDeclaration[];
|
|
39
|
+
export { circuitBreakers, triggerCircuitBreaker, restoreCircuitBreaker };
|
|
40
|
+
export default cpcDeclarations;
|
|
41
|
+
//# sourceMappingURL=cpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cpc.d.ts","sourceRoot":"","sources":["../../src/commands/cpc.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AA2ClD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,GAAE,OAAc,GAAG;IAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA0D3G;AA4HD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CA0DnD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CA0IhD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAiBnD;AAMD,QAAA,MAAM,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAa,CAAA;AAgEvD,iBAAS,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAIvD;AAED,iBAAS,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAGvD;AAoCD,wBAAgB,WAAW,IAAI,OAAO,CAOrC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAKtC;AAGD,wBAAgB,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CA4BzC;AA6FD,QAAA,MAAM,eAAe,EAAE,kBAAkB,EAiExC,CAAA;AAGD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,CAAA;AAExE,eAAe,eAAe,CAAA"}
|