@codenotch/codenotch.cli 1.0.33
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/.github/copilot-instructions.md +3 -0
- package/README.md +28 -0
- package/bin/cli.js +3 -0
- package/dist/bin/cli.d.ts +2 -0
- package/dist/bin/cli.js +6 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/commands/index.d.ts +2 -0
- package/dist/commands/index.js +15 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/project/compile.d.ts +2 -0
- package/dist/commands/project/compile.js +25 -0
- package/dist/commands/project/compile.js.map +1 -0
- package/dist/commands/project/deploy.d.ts +2 -0
- package/dist/commands/project/deploy.js +16 -0
- package/dist/commands/project/deploy.js.map +1 -0
- package/dist/commands/project/index.d.ts +2 -0
- package/dist/commands/project/index.js +29 -0
- package/dist/commands/project/index.js.map +1 -0
- package/dist/commands/project/inspect.d.ts +2 -0
- package/dist/commands/project/inspect.js +17 -0
- package/dist/commands/project/inspect.js.map +1 -0
- package/dist/commands/project/new.d.ts +2 -0
- package/dist/commands/project/new.js +13 -0
- package/dist/commands/project/new.js.map +1 -0
- package/dist/commands/project/open.d.ts +2 -0
- package/dist/commands/project/open.js +26 -0
- package/dist/commands/project/open.js.map +1 -0
- package/dist/commands/project/package.d.ts +2 -0
- package/dist/commands/project/package.js +25 -0
- package/dist/commands/project/package.js.map +1 -0
- package/dist/commands/project/refresh.d.ts +2 -0
- package/dist/commands/project/refresh.js +15 -0
- package/dist/commands/project/refresh.js.map +1 -0
- package/dist/commands/project/remove.d.ts +2 -0
- package/dist/commands/project/remove.js +17 -0
- package/dist/commands/project/remove.js.map +1 -0
- package/dist/commands/project/shared.d.ts +5 -0
- package/dist/commands/project/shared.js +6 -0
- package/dist/commands/project/shared.js.map +1 -0
- package/dist/commands/project/start.d.ts +2 -0
- package/dist/commands/project/start.js +28 -0
- package/dist/commands/project/start.js.map +1 -0
- package/dist/commands/project/test.d.ts +2 -0
- package/dist/commands/project/test.js +20 -0
- package/dist/commands/project/test.js.map +1 -0
- package/dist/commands/react/build.d.ts +2 -0
- package/dist/commands/react/build.js +17 -0
- package/dist/commands/react/build.js.map +1 -0
- package/dist/commands/react/index.d.ts +2 -0
- package/dist/commands/react/index.js +13 -0
- package/dist/commands/react/index.js.map +1 -0
- package/dist/commands/react/serve.d.ts +2 -0
- package/dist/commands/react/serve.js +18 -0
- package/dist/commands/react/serve.js.map +1 -0
- package/dist/commands/runtime/clear.d.ts +2 -0
- package/dist/commands/runtime/clear.js +16 -0
- package/dist/commands/runtime/clear.js.map +1 -0
- package/dist/commands/runtime/index.d.ts +2 -0
- package/dist/commands/runtime/index.js +24 -0
- package/dist/commands/runtime/index.js.map +1 -0
- package/dist/commands/runtime/info.d.ts +2 -0
- package/dist/commands/runtime/info.js +49 -0
- package/dist/commands/runtime/info.js.map +1 -0
- package/dist/commands/runtime/latest.d.ts +2 -0
- package/dist/commands/runtime/latest.js +24 -0
- package/dist/commands/runtime/latest.js.map +1 -0
- package/dist/commands/runtime/portal.d.ts +2 -0
- package/dist/commands/runtime/portal.js +24 -0
- package/dist/commands/runtime/portal.js.map +1 -0
- package/dist/commands/runtime/start.d.ts +2 -0
- package/dist/commands/runtime/start.js +21 -0
- package/dist/commands/runtime/start.js.map +1 -0
- package/dist/commands/runtime/stop.d.ts +2 -0
- package/dist/commands/runtime/stop.js +18 -0
- package/dist/commands/runtime/stop.js.map +1 -0
- package/dist/commands/runtime/update.d.ts +2 -0
- package/dist/commands/runtime/update.js +17 -0
- package/dist/commands/runtime/update.js.map +1 -0
- package/dist/commands/system/index.d.ts +2 -0
- package/dist/commands/system/index.js +11 -0
- package/dist/commands/system/index.js.map +1 -0
- package/dist/commands/system/info.d.ts +2 -0
- package/dist/commands/system/info.js +28 -0
- package/dist/commands/system/info.js.map +1 -0
- package/dist/commands/system/read.d.ts +2 -0
- package/dist/commands/system/read.js +28 -0
- package/dist/commands/system/read.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/models/Codenotch.d.ts +237 -0
- package/dist/models/Codenotch.js +214 -0
- package/dist/models/Codenotch.js.map +1 -0
- package/dist/models/DbModels.d.ts +221 -0
- package/dist/models/DbModels.js +130 -0
- package/dist/models/DbModels.js.map +1 -0
- package/dist/models/OpenApiModels.d.ts +115 -0
- package/dist/models/OpenApiModels.js +103 -0
- package/dist/models/OpenApiModels.js.map +1 -0
- package/dist/utils/BuildUtils.d.ts +54 -0
- package/dist/utils/BuildUtils.js +631 -0
- package/dist/utils/BuildUtils.js.map +1 -0
- package/dist/utils/ConsoleUtils.d.ts +6 -0
- package/dist/utils/ConsoleUtils.js +24 -0
- package/dist/utils/ConsoleUtils.js.map +1 -0
- package/dist/utils/FileUtils.d.ts +14 -0
- package/dist/utils/FileUtils.js +218 -0
- package/dist/utils/FileUtils.js.map +1 -0
- package/dist/utils/GitHubAuthUtils.d.ts +11 -0
- package/dist/utils/GitHubAuthUtils.js +74 -0
- package/dist/utils/GitHubAuthUtils.js.map +1 -0
- package/dist/utils/I18nUtils.d.ts +9 -0
- package/dist/utils/I18nUtils.js +56 -0
- package/dist/utils/I18nUtils.js.map +1 -0
- package/dist/utils/OpenAPIUtils.d.ts +33 -0
- package/dist/utils/OpenAPIUtils.js +279 -0
- package/dist/utils/OpenAPIUtils.js.map +1 -0
- package/dist/utils/OsUtils.d.ts +8 -0
- package/dist/utils/OsUtils.js +33 -0
- package/dist/utils/OsUtils.js.map +1 -0
- package/dist/utils/ProjectCompilationUtils.d.ts +63 -0
- package/dist/utils/ProjectCompilationUtils.js +850 -0
- package/dist/utils/ProjectCompilationUtils.js.map +1 -0
- package/dist/utils/ProjectUtils.d.ts +15 -0
- package/dist/utils/ProjectUtils.js +115 -0
- package/dist/utils/ProjectUtils.js.map +1 -0
- package/dist/utils/RuntimeUtils.d.ts +45 -0
- package/dist/utils/RuntimeUtils.js +613 -0
- package/dist/utils/RuntimeUtils.js.map +1 -0
- package/dist/utils/ServeUtils.d.ts +10 -0
- package/dist/utils/ServeUtils.js +191 -0
- package/dist/utils/ServeUtils.js.map +1 -0
- package/dist/utils/ShellUtils.d.ts +3 -0
- package/dist/utils/ShellUtils.js +28 -0
- package/dist/utils/ShellUtils.js.map +1 -0
- package/dist/utils/StringUtils.d.ts +9 -0
- package/dist/utils/StringUtils.js +65 -0
- package/dist/utils/StringUtils.js.map +1 -0
- package/docs/ARCHITECTURE.md +179 -0
- package/docs/TODO.md +18 -0
- package/package.json +63 -0
- package/src/bin/cli.ts +4 -0
- package/src/commands/index.ts +13 -0
- package/src/commands/project/compile.ts +20 -0
- package/src/commands/project/deploy.ts +11 -0
- package/src/commands/project/index.ts +28 -0
- package/src/commands/project/inspect.ts +12 -0
- package/src/commands/project/new.ts +11 -0
- package/src/commands/project/open.ts +21 -0
- package/src/commands/project/package.ts +20 -0
- package/src/commands/project/refresh.ts +13 -0
- package/src/commands/project/remove.ts +12 -0
- package/src/commands/project/shared.ts +9 -0
- package/src/commands/project/start.ts +24 -0
- package/src/commands/project/test.ts +15 -0
- package/src/commands/react/build.ts +12 -0
- package/src/commands/react/index.ts +12 -0
- package/src/commands/react/serve.ts +13 -0
- package/src/commands/runtime/clear.ts +11 -0
- package/src/commands/runtime/index.ts +24 -0
- package/src/commands/runtime/info.ts +47 -0
- package/src/commands/runtime/latest.ts +18 -0
- package/src/commands/runtime/portal.ts +20 -0
- package/src/commands/runtime/start.ts +16 -0
- package/src/commands/runtime/stop.ts +13 -0
- package/src/commands/runtime/update.ts +12 -0
- package/src/commands/system/index.ts +9 -0
- package/src/commands/system/info.ts +23 -0
- package/src/commands/system/read.ts +25 -0
- package/src/index.ts +22 -0
- package/src/models/Codenotch.ts +361 -0
- package/src/models/DbModels.ts +428 -0
- package/src/models/OpenApiModels.ts +145 -0
- package/src/utils/BuildUtils.ts +739 -0
- package/src/utils/ConsoleUtils.ts +22 -0
- package/src/utils/FileUtils.ts +266 -0
- package/src/utils/GitHubAuthUtils.ts +83 -0
- package/src/utils/I18nUtils.ts +58 -0
- package/src/utils/OpenAPIUtils.ts +285 -0
- package/src/utils/OsUtils.ts +32 -0
- package/src/utils/ProjectCompilationUtils.ts +1002 -0
- package/src/utils/ProjectUtils.ts +151 -0
- package/src/utils/RuntimeUtils.ts +743 -0
- package/src/utils/ServeUtils.ts +175 -0
- package/src/utils/ShellUtils.ts +26 -0
- package/src/utils/StringUtils.ts +80 -0
- package/tsconfig.json +35 -0
|
@@ -0,0 +1,613 @@
|
|
|
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 node_os_1 = __importDefault(require("node:os"));
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
9
|
+
const node_fs_1 = require("node:fs");
|
|
10
|
+
const promises_2 = require("node:stream/promises");
|
|
11
|
+
const node_stream_1 = require("node:stream");
|
|
12
|
+
const node_child_process_1 = require("node:child_process");
|
|
13
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
14
|
+
const decompress_1 = __importDefault(require("decompress"));
|
|
15
|
+
const FileUtils_1 = __importDefault(require("./FileUtils"));
|
|
16
|
+
const ProjectUtils_1 = __importDefault(require("./ProjectUtils"));
|
|
17
|
+
const GitHubAuthUtils_1 = __importDefault(require("./GitHubAuthUtils"));
|
|
18
|
+
const ProjectCompilationUtils_1 = __importDefault(require("./ProjectCompilationUtils"));
|
|
19
|
+
class RuntimeUtils {
|
|
20
|
+
/// The directory where the runtime is installed, we will store the executable and other files there
|
|
21
|
+
/// TODO not sure about that, should we store globally, or for each "project" ? Both ? like npm
|
|
22
|
+
static CODENOTCH_INSTALL_DIR = process.env.CODENOTCH_PATH?.trim()
|
|
23
|
+
? node_path_1.default.resolve(process.env.CODENOTCH_PATH.trim())
|
|
24
|
+
: node_path_1.default.join(node_os_1.default.homedir(), ".codenotch");
|
|
25
|
+
static CODENOTCH_DATA_FOLDER = "data";
|
|
26
|
+
static RUNTIME_PID_FILE = node_path_1.default.join(RuntimeUtils.CODENOTCH_INSTALL_DIR, "runtime.pid");
|
|
27
|
+
static RUNTIME_META_FILE = node_path_1.default.join(RuntimeUtils.CODENOTCH_INSTALL_DIR, "runtime.json");
|
|
28
|
+
static DEFAULT_RUNTIME_HOST = "127.0.0.1";
|
|
29
|
+
static DEFAULT_RUNTIME_PORT = 5005;
|
|
30
|
+
static ADMIN_USER_EMAIL = "admin@example.com";
|
|
31
|
+
//#region Runtime
|
|
32
|
+
static async readRuntimeMeta() {
|
|
33
|
+
try {
|
|
34
|
+
const raw = await promises_1.default.readFile(RuntimeUtils.RUNTIME_META_FILE, "utf8");
|
|
35
|
+
return JSON.parse(raw);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
static async writeRuntimeMeta(meta) {
|
|
42
|
+
await promises_1.default.mkdir(RuntimeUtils.CODENOTCH_INSTALL_DIR, { recursive: true });
|
|
43
|
+
await promises_1.default.writeFile(RuntimeUtils.RUNTIME_META_FILE, JSON.stringify(meta, null, 2), "utf8");
|
|
44
|
+
}
|
|
45
|
+
static async getRuntimeBaseUrl() {
|
|
46
|
+
//return `http://localhost:5002`; // for testing on local visual studio
|
|
47
|
+
const meta = await RuntimeUtils.readRuntimeMeta();
|
|
48
|
+
const host = meta?.host ?? RuntimeUtils.DEFAULT_RUNTIME_HOST;
|
|
49
|
+
const port = meta?.port ?? RuntimeUtils.DEFAULT_RUNTIME_PORT;
|
|
50
|
+
return `http://${host}:${port}`;
|
|
51
|
+
}
|
|
52
|
+
static async runtimeFetch(path, includeToken = false, options) {
|
|
53
|
+
const baseUrl = await RuntimeUtils.getRuntimeBaseUrl();
|
|
54
|
+
const isFormData = options?.body instanceof FormData;
|
|
55
|
+
let finalOptions = {
|
|
56
|
+
...options,
|
|
57
|
+
credentials: 'include',
|
|
58
|
+
headers: {
|
|
59
|
+
...(isFormData ? {} : { 'Content-Type': 'application/json' }),
|
|
60
|
+
...options?.headers,
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
if (includeToken) {
|
|
64
|
+
const token = await RuntimeUtils.getAdminToken();
|
|
65
|
+
finalOptions.headers["devAccessToken"] = token;
|
|
66
|
+
}
|
|
67
|
+
const url = `${baseUrl}${path}`;
|
|
68
|
+
const res = await fetch(url, finalOptions);
|
|
69
|
+
if (!res.ok) {
|
|
70
|
+
const body = await res.text().catch(() => null);
|
|
71
|
+
throw new Error(`Runtime api error: ${url} -> ${res.status} - ${body}`);
|
|
72
|
+
}
|
|
73
|
+
if (res.status === 204 || res.headers.get('content-length') === '0') {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
let content = await res.text();
|
|
77
|
+
try {
|
|
78
|
+
return JSON.parse(content);
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
return content;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
static async getAdminToken() {
|
|
85
|
+
// Use the client_credentials flow to get an admin token
|
|
86
|
+
// In dev/local the flow we only need the user email to issue a token
|
|
87
|
+
var response = await RuntimeUtils.runtimeFetch(`/_auth/token`, false, {
|
|
88
|
+
method: "POST",
|
|
89
|
+
body: new URLSearchParams({
|
|
90
|
+
client_id: RuntimeUtils.ADMIN_USER_EMAIL,
|
|
91
|
+
grant_type: "client_credentials",
|
|
92
|
+
}),
|
|
93
|
+
headers: {
|
|
94
|
+
"Content-Type": "application/x-www-form-urlencoded"
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
//TODO some way to cache and reuse this
|
|
98
|
+
return response.access_token;
|
|
99
|
+
}
|
|
100
|
+
static async ensureRuntimeInstalled() {
|
|
101
|
+
const isInstalled = await RuntimeUtils.isRuntimeInstalled();
|
|
102
|
+
if (!isInstalled) {
|
|
103
|
+
//TODO Here we assume NodeJs is installed and available in PATH, we should check that and propose to install it if not
|
|
104
|
+
await RuntimeUtils.installLatestRuntime();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
static async ensureRuntimeIsRunning() {
|
|
108
|
+
const isRunning = await RuntimeUtils.isRuntimeRunning();
|
|
109
|
+
if (isRunning) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
await RuntimeUtils.startRuntime();
|
|
113
|
+
}
|
|
114
|
+
static async isRuntimeInstalled() {
|
|
115
|
+
const targetExe = RuntimeUtils.getRuntimeExecutablePath();
|
|
116
|
+
try {
|
|
117
|
+
await promises_1.default.access(targetExe);
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
static async isRuntimeRunning() {
|
|
125
|
+
try {
|
|
126
|
+
const pidStr = await promises_1.default.readFile(RuntimeUtils.RUNTIME_PID_FILE, "utf8");
|
|
127
|
+
const pid = parseInt(pidStr.trim());
|
|
128
|
+
if (isNaN(pid)) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
// Check if process exists by sending signal 0 (doesn't kill, just checks)
|
|
132
|
+
try {
|
|
133
|
+
process.kill(pid, 0);
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// Process doesn't exist
|
|
138
|
+
await promises_1.default.unlink(RuntimeUtils.RUNTIME_PID_FILE).catch(() => { });
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// PID file doesn't exist
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
static async runRuntimeExecutable(args = [], detached, envVars = {}) {
|
|
148
|
+
const exePath = RuntimeUtils.getRuntimeExecutablePath();
|
|
149
|
+
try {
|
|
150
|
+
const child = (0, node_child_process_1.spawn)(exePath, args, {
|
|
151
|
+
detached: detached,
|
|
152
|
+
stdio: detached ? "ignore" : "pipe",
|
|
153
|
+
windowsHide: true,
|
|
154
|
+
env: { ...process.env, ...envVars },
|
|
155
|
+
});
|
|
156
|
+
if (detached) {
|
|
157
|
+
// Store the PID for later reference
|
|
158
|
+
await promises_1.default.mkdir(RuntimeUtils.CODENOTCH_INSTALL_DIR, { recursive: true });
|
|
159
|
+
await promises_1.default.writeFile(RuntimeUtils.RUNTIME_PID_FILE, child.pid.toString());
|
|
160
|
+
child.unref(); // Allow parent process to exit independently
|
|
161
|
+
return "";
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
// Wait for the child process to complete
|
|
165
|
+
let stdout = "";
|
|
166
|
+
let stderr = "";
|
|
167
|
+
child.stdout?.on("data", (chunk) => {
|
|
168
|
+
const text = chunk.toString();
|
|
169
|
+
stdout += text;
|
|
170
|
+
process.stdout.write(text);
|
|
171
|
+
});
|
|
172
|
+
child.stderr?.on("data", (chunk) => {
|
|
173
|
+
const text = chunk.toString();
|
|
174
|
+
stderr += text;
|
|
175
|
+
process.stderr.write(text);
|
|
176
|
+
});
|
|
177
|
+
await new Promise((resolve, reject) => {
|
|
178
|
+
child.on("exit", (code) => {
|
|
179
|
+
if (code === 0) {
|
|
180
|
+
resolve();
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
const errorOutput = stderr.trim() || stdout.trim();
|
|
184
|
+
reject(new Error(`Runtime process exited with code ${code}${errorOutput ? `: ${errorOutput}` : ""}`));
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
child.on("error", reject);
|
|
188
|
+
});
|
|
189
|
+
return stdout.trim();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
throw new Error(`Failed to run runtime executable: ${error instanceof Error ? error.message : String(error)}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
static getRuntimeExecutablePath() {
|
|
197
|
+
const platform = process.platform; // win32 | linux | darwin
|
|
198
|
+
const exeName = platform === "win32" ? "codenotch.exe" : "codenotch";
|
|
199
|
+
return node_path_1.default.join(RuntimeUtils.CODENOTCH_INSTALL_DIR, exeName);
|
|
200
|
+
}
|
|
201
|
+
static async installLatestRuntime() {
|
|
202
|
+
let wasRunning = await RuntimeUtils.isRuntimeRunning();
|
|
203
|
+
if (wasRunning) {
|
|
204
|
+
await RuntimeUtils.stopRuntime();
|
|
205
|
+
}
|
|
206
|
+
const platform = process.platform; // win32 | linux | darwin
|
|
207
|
+
const exeName = platform === "win32" ? "codenotch.exe" : "codenotch";
|
|
208
|
+
let assetName;
|
|
209
|
+
if (platform === "win32")
|
|
210
|
+
assetName = "codenotch-windows.zip";
|
|
211
|
+
else if (platform === "linux")
|
|
212
|
+
assetName = "codenotch-linux.tar.gz";
|
|
213
|
+
else if (platform === "darwin")
|
|
214
|
+
assetName = "codenotch-macos.tar.gz";
|
|
215
|
+
else
|
|
216
|
+
throw new Error(`Unsupported platform: ${platform}`);
|
|
217
|
+
// We need to authenticate because the repo is private
|
|
218
|
+
const token = await GitHubAuthUtils_1.default.getToken();
|
|
219
|
+
const headers = {
|
|
220
|
+
Authorization: `Bearer ${token}`,
|
|
221
|
+
};
|
|
222
|
+
console.log(chalk_1.default.blue(`Getting latest Codenotch runtime release metadata...`));
|
|
223
|
+
const latestReleaseRes = await fetch("https://api.github.com/repos/EchinoHub/service-core/releases/latest", {
|
|
224
|
+
headers: {
|
|
225
|
+
...headers,
|
|
226
|
+
"Accept": "application/vnd.github+json"
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
if (!latestReleaseRes.ok) {
|
|
230
|
+
const body = await latestReleaseRes.text().catch(() => "");
|
|
231
|
+
throw new Error(`Failed to get latest release: ${latestReleaseRes.status} ${body}`);
|
|
232
|
+
}
|
|
233
|
+
//const url = `https://github.com/EchinoHub/service-core/releases/latest/download/${assetName}`;
|
|
234
|
+
const release = await latestReleaseRes.json();
|
|
235
|
+
const asset = release.assets.find((a) => a.name === assetName);
|
|
236
|
+
if (!asset) {
|
|
237
|
+
throw new Error(`Asset not found: ${assetName}.`);
|
|
238
|
+
}
|
|
239
|
+
const version = release.tag_name;
|
|
240
|
+
console.log(chalk_1.default.blue(`Downloading Codenotch runtime from ${asset.url}...`));
|
|
241
|
+
const res = await fetch(asset.url, {
|
|
242
|
+
redirect: "follow",
|
|
243
|
+
headers: {
|
|
244
|
+
...headers,
|
|
245
|
+
"Accept": "application/octet-stream"
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
if (!res.ok || !res.body) {
|
|
249
|
+
console.log(chalk_1.default.red(`Failed to download runtime from ${asset.url}`));
|
|
250
|
+
throw new Error(`Download failed: ${res.status} ${res.statusText}`);
|
|
251
|
+
}
|
|
252
|
+
const tempRoot = await promises_1.default.mkdtemp(node_path_1.default.join(node_os_1.default.tmpdir(), "codenotch-"));
|
|
253
|
+
try {
|
|
254
|
+
const archivePath = node_path_1.default.join(tempRoot, assetName);
|
|
255
|
+
const extractDir = node_path_1.default.join(tempRoot, "extract");
|
|
256
|
+
await promises_1.default.mkdir(RuntimeUtils.CODENOTCH_INSTALL_DIR, { recursive: true });
|
|
257
|
+
await promises_1.default.mkdir(extractDir, { recursive: true });
|
|
258
|
+
await (0, promises_2.pipeline)(node_stream_1.Readable.fromWeb(res.body), (0, node_fs_1.createWriteStream)(archivePath));
|
|
259
|
+
await (0, decompress_1.default)(archivePath, extractDir);
|
|
260
|
+
const downloadedExe = node_path_1.default.join(extractDir, assetName.split(".")[0], exeName);
|
|
261
|
+
const targetExe = node_path_1.default.join(RuntimeUtils.CODENOTCH_INSTALL_DIR, exeName);
|
|
262
|
+
await promises_1.default.copyFile(downloadedExe, targetExe);
|
|
263
|
+
if (platform !== "win32")
|
|
264
|
+
await promises_1.default.chmod(targetExe, 0o755);
|
|
265
|
+
// Update the metadata with the version
|
|
266
|
+
const existingMeta = await RuntimeUtils.readRuntimeMeta();
|
|
267
|
+
await RuntimeUtils.writeRuntimeMeta({
|
|
268
|
+
host: existingMeta?.host ?? RuntimeUtils.DEFAULT_RUNTIME_HOST,
|
|
269
|
+
port: existingMeta?.port ?? RuntimeUtils.DEFAULT_RUNTIME_PORT,
|
|
270
|
+
version: version,
|
|
271
|
+
dataPath: existingMeta?.dataPath
|
|
272
|
+
});
|
|
273
|
+
console.log(chalk_1.default.blue(`The runtime has been installed successfully.`));
|
|
274
|
+
}
|
|
275
|
+
finally {
|
|
276
|
+
FileUtils_1.default.delete(tempRoot);
|
|
277
|
+
}
|
|
278
|
+
if (wasRunning) {
|
|
279
|
+
await RuntimeUtils.startRuntime();
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
static async startRuntime(options) {
|
|
283
|
+
const isRunning = await RuntimeUtils.isRuntimeRunning();
|
|
284
|
+
if (isRunning) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
await this.ensureRuntimeInstalled();
|
|
288
|
+
// Start the runtime process in detached mode by default
|
|
289
|
+
let detached = true;
|
|
290
|
+
if (options?.attach) {
|
|
291
|
+
detached = false;
|
|
292
|
+
}
|
|
293
|
+
console.log(chalk_1.default.blue(`Starting Codenotch runtime ${detached ? "in detached mode" : "in attached mode"}...`));
|
|
294
|
+
const port = options?.port ?? RuntimeUtils.DEFAULT_RUNTIME_PORT;
|
|
295
|
+
const dataPath = options?.dataPath;
|
|
296
|
+
const version = await RuntimeUtils.getRuntimeVersion();
|
|
297
|
+
// Store the runtime meta (like the port) so we can use it later to connect to the runtime
|
|
298
|
+
await RuntimeUtils.writeRuntimeMeta({
|
|
299
|
+
host: RuntimeUtils.DEFAULT_RUNTIME_HOST,
|
|
300
|
+
port: port,
|
|
301
|
+
version: version,
|
|
302
|
+
dataPath: dataPath
|
|
303
|
+
});
|
|
304
|
+
const runtimeArgs = dataPath ? ["-d", dataPath] : [];
|
|
305
|
+
await RuntimeUtils.runRuntimeExecutable(runtimeArgs, detached, { CODENOTCH_PORT: String(port), START_URL: '' }); // pass the port and prevent the runtime from opening the browser automatically
|
|
306
|
+
// Wait until the runtime is responsive
|
|
307
|
+
const maxAttempts = 50; // Wait up to 10 seconds
|
|
308
|
+
let attempts = 0;
|
|
309
|
+
while (attempts < maxAttempts) {
|
|
310
|
+
try {
|
|
311
|
+
await RuntimeUtils.runtimeFetch("/health");
|
|
312
|
+
console.log(chalk_1.default.green(`Runtime is ready!`));
|
|
313
|
+
return; // Runtime is responsive
|
|
314
|
+
}
|
|
315
|
+
catch (e) {
|
|
316
|
+
await new Promise(resolve => setTimeout(resolve, 200));
|
|
317
|
+
attempts++;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
console.log(chalk_1.default.red(`Failed to start runtime: runtime did not become responsive within expected time.`));
|
|
321
|
+
throw new Error(`Runtime did not become responsive within expected time.`);
|
|
322
|
+
}
|
|
323
|
+
static async stopRuntime() {
|
|
324
|
+
if (await RuntimeUtils.isRuntimeInstalled() === false) {
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
if (await RuntimeUtils.isRuntimeRunning() === false) {
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
try {
|
|
331
|
+
const pidStr = await promises_1.default.readFile(RuntimeUtils.RUNTIME_PID_FILE, "utf8");
|
|
332
|
+
const pid = parseInt(pidStr.trim());
|
|
333
|
+
if (!isNaN(pid)) {
|
|
334
|
+
// Send SIGTERM to gracefully stop the process
|
|
335
|
+
process.kill(pid, "SIGTERM");
|
|
336
|
+
// Wait up to 5 seconds for graceful shutdown
|
|
337
|
+
let attempts = 0;
|
|
338
|
+
while (attempts < 50 && await RuntimeUtils.isRuntimeRunning()) {
|
|
339
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
340
|
+
attempts++;
|
|
341
|
+
}
|
|
342
|
+
// If still running, force kill
|
|
343
|
+
if (await RuntimeUtils.isRuntimeRunning()) {
|
|
344
|
+
process.kill(pid, "SIGKILL");
|
|
345
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
// Clean up the PID file
|
|
349
|
+
await promises_1.default.unlink(RuntimeUtils.RUNTIME_PID_FILE).catch(() => { });
|
|
350
|
+
}
|
|
351
|
+
catch (error) {
|
|
352
|
+
throw new Error(`Failed to stop runtime: ${error instanceof Error ? error.message : String(error)}`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
static async clearRuntime() {
|
|
356
|
+
// Remove the runtime data folder, but keep the executable and other files
|
|
357
|
+
const dataDir = node_path_1.default.join(RuntimeUtils.CODENOTCH_INSTALL_DIR, RuntimeUtils.CODENOTCH_DATA_FOLDER);
|
|
358
|
+
try {
|
|
359
|
+
await promises_1.default.rm(dataDir, { recursive: true, force: true });
|
|
360
|
+
console.log(chalk_1.default.green(`Runtime data cleared successfully.`));
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
console.log(chalk_1.default.red(`Failed to clear runtime data: ${error}`));
|
|
364
|
+
throw error;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
static async getRuntimeVersion() {
|
|
368
|
+
if (!await RuntimeUtils.isRuntimeInstalled()) {
|
|
369
|
+
return "Not installed";
|
|
370
|
+
}
|
|
371
|
+
// Use the metadata if available to avoid calling the executable, which can be slow to start
|
|
372
|
+
const meta = await RuntimeUtils.readRuntimeMeta();
|
|
373
|
+
if (!meta?.version) {
|
|
374
|
+
return await RuntimeUtils.runRuntimeExecutable(["--version"], false);
|
|
375
|
+
}
|
|
376
|
+
return meta?.version;
|
|
377
|
+
}
|
|
378
|
+
static async getRuntimeDataPath() {
|
|
379
|
+
const meta = await RuntimeUtils.readRuntimeMeta();
|
|
380
|
+
return meta?.dataPath;
|
|
381
|
+
}
|
|
382
|
+
static async getLatestRuntimeRelease() {
|
|
383
|
+
const token = await GitHubAuthUtils_1.default.getToken();
|
|
384
|
+
const headers = {
|
|
385
|
+
"Accept": "application/vnd.github+json",
|
|
386
|
+
"Authorization": `Bearer ${token}`,
|
|
387
|
+
};
|
|
388
|
+
const res = await fetch("https://api.github.com/repos/EchinoHub/service-core/releases/latest", { headers });
|
|
389
|
+
if (!res.ok) {
|
|
390
|
+
const body = await res.text().catch(() => "");
|
|
391
|
+
throw new Error(`Failed to get latest release: ${res.status} ${body}`);
|
|
392
|
+
}
|
|
393
|
+
const release = await res.json();
|
|
394
|
+
return {
|
|
395
|
+
version: release.tag_name,
|
|
396
|
+
createdAt: release.created_at,
|
|
397
|
+
url: release.html_url
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
//#endregion
|
|
401
|
+
//#region Project management
|
|
402
|
+
static async startProject(projectPath) {
|
|
403
|
+
//TODO multiproject support
|
|
404
|
+
//TODO --watch mode
|
|
405
|
+
const serviceName = await ProjectUtils_1.default.getProjectServiceName(projectPath);
|
|
406
|
+
// Ensure the runtime is running
|
|
407
|
+
await RuntimeUtils.startRuntime();
|
|
408
|
+
const outputPath = node_path_1.default.join(node_os_1.default.tmpdir(), `cn-build-${Date.now()}.zip`);
|
|
409
|
+
try {
|
|
410
|
+
console.log(chalk_1.default.blue(`Building project "${serviceName}"...`));
|
|
411
|
+
await ProjectUtils_1.default.packageProject(projectPath, outputPath, true);
|
|
412
|
+
console.log(chalk_1.default.blue(`Deploying project "${serviceName}" to runtime...`));
|
|
413
|
+
await new Promise(resolve => setTimeout(resolve, 2000)); // Wait a bit before deploying to ensure the runtime is fully ready, only temporary until runtime fix the ready endpoint to be more reliable
|
|
414
|
+
var deploySuccess = await RuntimeUtils.deployProject(serviceName, outputPath);
|
|
415
|
+
if (deploySuccess) {
|
|
416
|
+
console.log(chalk_1.default.green(`Project "${serviceName}" is now running.`));
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
console.log(chalk_1.default.red(`Project start failed.`));
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
finally {
|
|
423
|
+
// Remove the build
|
|
424
|
+
FileUtils_1.default.delete(outputPath);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
static async testProject(projectPath, fileFilter, nameFilter, inPlace = false) {
|
|
428
|
+
await RuntimeUtils.ensureRuntimeInstalled();
|
|
429
|
+
// For testing we use a separate instance of the runtime
|
|
430
|
+
// We run it in attach mode so we get the results in the console
|
|
431
|
+
const isPartial = !!(fileFilter || nameFilter);
|
|
432
|
+
const finalReportPath = node_path_1.default.join(projectPath, "test-report.json");
|
|
433
|
+
// Runs the runtime test command, writing the report to a given path via -r
|
|
434
|
+
const testFunc = async (workPath, reportPath) => await RuntimeUtils.runRuntimeExecutable([
|
|
435
|
+
"test",
|
|
436
|
+
"-p", workPath,
|
|
437
|
+
...(fileFilter ? ["-f", fileFilter] : []),
|
|
438
|
+
...(nameFilter ? ["-t", nameFilter] : []),
|
|
439
|
+
"-r", reportPath,
|
|
440
|
+
], false);
|
|
441
|
+
// To test a project, we need to install it and to install it, we need it to be compiled
|
|
442
|
+
let projectCompiled = await ProjectUtils_1.default.isManifestCompiled(projectPath);
|
|
443
|
+
// If the project is already compiled we can go ahead and test it
|
|
444
|
+
if (projectCompiled) {
|
|
445
|
+
const tempReportPath = node_path_1.default.join(node_os_1.default.tmpdir(), `cn-report-${Date.now()}.json`);
|
|
446
|
+
try {
|
|
447
|
+
await testFunc(projectPath, tempReportPath);
|
|
448
|
+
await RuntimeUtils.persistTestReport(tempReportPath, finalReportPath, isPartial);
|
|
449
|
+
}
|
|
450
|
+
finally {
|
|
451
|
+
await promises_1.default.unlink(tempReportPath).catch(() => { });
|
|
452
|
+
}
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
// We need a "lightly-compiled" project, meaning we need a full manifest (we don't need i18n or to build the React apps)
|
|
456
|
+
let compileFunc = async (path) => {
|
|
457
|
+
const compilation = await ProjectCompilationUtils_1.default.compileTestProject(path);
|
|
458
|
+
if (compilation.errors.length > 0) {
|
|
459
|
+
console.error(chalk_1.default.red("Compilation failed with errors:"));
|
|
460
|
+
compilation.errors.forEach(err => console.error(chalk_1.default.red(`- ${err}`)));
|
|
461
|
+
console.warn(chalk_1.default.yellow("Ignoring compilation errors and proceeding with testing..."));
|
|
462
|
+
}
|
|
463
|
+
};
|
|
464
|
+
// In-place means we can compile and modify files directly in the project folder, we don't need to copy them to a temp folder, this is useful during CI/CD
|
|
465
|
+
// Inside the IDE we'll prefer to copy the folder to avoid modifying the source files
|
|
466
|
+
if (inPlace) {
|
|
467
|
+
await compileFunc(projectPath);
|
|
468
|
+
const tempReportPath = node_path_1.default.join(node_os_1.default.tmpdir(), `cn-report-${Date.now()}.json`);
|
|
469
|
+
try {
|
|
470
|
+
await testFunc(projectPath, tempReportPath);
|
|
471
|
+
await RuntimeUtils.persistTestReport(tempReportPath, finalReportPath, isPartial);
|
|
472
|
+
}
|
|
473
|
+
finally {
|
|
474
|
+
await promises_1.default.unlink(tempReportPath).catch(() => { });
|
|
475
|
+
}
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
const tempRoot = await promises_1.default.mkdtemp(node_path_1.default.join(node_os_1.default.tmpdir(), "codenotch-"));
|
|
479
|
+
try {
|
|
480
|
+
// Copy project
|
|
481
|
+
await FileUtils_1.default.copyFolder(projectPath, tempRoot, ['.git', 'node_modules', 'dist', 'build', 'out']);
|
|
482
|
+
await compileFunc(tempRoot);
|
|
483
|
+
const tempReportPath = node_path_1.default.join(tempRoot, "test-report.json");
|
|
484
|
+
await testFunc(tempRoot, tempReportPath);
|
|
485
|
+
await RuntimeUtils.persistTestReport(tempReportPath, finalReportPath, isPartial);
|
|
486
|
+
}
|
|
487
|
+
finally {
|
|
488
|
+
// Clean up temp folder
|
|
489
|
+
//TODO consider keeping it for faster re-testing if project has not changed
|
|
490
|
+
await FileUtils_1.default.delete(tempRoot);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
static async deployProject(serviceName, packagePath) {
|
|
494
|
+
// We assume the project is already built and packaged, we just need to deploy it to the runtime
|
|
495
|
+
// Get the information about the project package, we assume it's in the current directory and named "project.zip"
|
|
496
|
+
const zipFilePath = packagePath;
|
|
497
|
+
try {
|
|
498
|
+
await promises_1.default.access(zipFilePath);
|
|
499
|
+
}
|
|
500
|
+
catch (error) {
|
|
501
|
+
console.log(chalk_1.default.red(`Project package not found: ${zipFilePath}`));
|
|
502
|
+
throw new Error(`Project package not found: ${zipFilePath}`);
|
|
503
|
+
}
|
|
504
|
+
// Ensure the runtime is running
|
|
505
|
+
await RuntimeUtils.startRuntime();
|
|
506
|
+
const zipBuffer = await promises_1.default.readFile(zipFilePath);
|
|
507
|
+
const zipBlob = new Blob([zipBuffer], { type: "application/zip" });
|
|
508
|
+
const form = new FormData();
|
|
509
|
+
form.append('serviceName', serviceName);
|
|
510
|
+
form.append('file', zipBlob, "package.zip");
|
|
511
|
+
await RuntimeUtils.runtimeFetch("/project/upload", true, {
|
|
512
|
+
method: "POST",
|
|
513
|
+
body: form
|
|
514
|
+
});
|
|
515
|
+
// Wait until the project deployment has completed
|
|
516
|
+
while (true) {
|
|
517
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
518
|
+
try {
|
|
519
|
+
const projectState = await RuntimeUtils.runtimeFetch(`/${serviceName}/project`, true);
|
|
520
|
+
if (projectState.status === "READY") {
|
|
521
|
+
console.log(chalk_1.default.green(`${serviceName} is ready!`));
|
|
522
|
+
return true;
|
|
523
|
+
}
|
|
524
|
+
else if (projectState.status === "FAILURE" || projectState.status === "REMOVING") {
|
|
525
|
+
console.log(chalk_1.default.red(`Failed to deploy ${serviceName}. Errors: ${projectState.errors?.join(", ")}`));
|
|
526
|
+
return false;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
catch {
|
|
530
|
+
// Keep waiting
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
static async patchProject(projectPath) {
|
|
535
|
+
throw new Error('Method not implemented.');
|
|
536
|
+
}
|
|
537
|
+
static async removeProject(projectPath) {
|
|
538
|
+
const serviceName = await ProjectUtils_1.default.getProjectServiceName(projectPath);
|
|
539
|
+
await RuntimeUtils.uninstallProject(serviceName);
|
|
540
|
+
}
|
|
541
|
+
static async uninstallProject(serviceName) {
|
|
542
|
+
// Cannot properly uninstall if the runtime is not installed and running
|
|
543
|
+
// Ensure the runtime is running
|
|
544
|
+
await RuntimeUtils.startRuntime();
|
|
545
|
+
await RuntimeUtils.runtimeFetch(`/${serviceName}/project`, true, {
|
|
546
|
+
method: 'DELETE'
|
|
547
|
+
});
|
|
548
|
+
/* Normally the runtime handle that
|
|
549
|
+
// Erase all files prefixed with the project name in the runtime data folder
|
|
550
|
+
const runtimeDataDir = path.join(RuntimeUtils.CODENOTCH_INSTALL_DIR, "data");
|
|
551
|
+
const files = await fs.readdir(runtimeDataDir);
|
|
552
|
+
for (const file of files) {
|
|
553
|
+
if (file.startsWith(project)) {
|
|
554
|
+
await fs.unlink(path.join(runtimeDataDir, file));
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
*/
|
|
558
|
+
}
|
|
559
|
+
//#endregion
|
|
560
|
+
//#region Test report helpers
|
|
561
|
+
static async persistTestReport(sourcePath, destPath, isPartial) {
|
|
562
|
+
let newReport;
|
|
563
|
+
try {
|
|
564
|
+
const content = await promises_1.default.readFile(sourcePath, "utf8");
|
|
565
|
+
newReport = JSON.parse(content);
|
|
566
|
+
}
|
|
567
|
+
catch {
|
|
568
|
+
console.warn(chalk_1.default.yellow("Could not read test report from runtime output."));
|
|
569
|
+
return;
|
|
570
|
+
}
|
|
571
|
+
if (!isPartial) {
|
|
572
|
+
await promises_1.default.writeFile(destPath, JSON.stringify(newReport, null, 2), "utf8");
|
|
573
|
+
return;
|
|
574
|
+
}
|
|
575
|
+
// Merge partial results into any existing report
|
|
576
|
+
let existingReport = null;
|
|
577
|
+
try {
|
|
578
|
+
const content = await promises_1.default.readFile(destPath, "utf8");
|
|
579
|
+
existingReport = JSON.parse(content);
|
|
580
|
+
}
|
|
581
|
+
catch {
|
|
582
|
+
// No existing report — use the new one as-is
|
|
583
|
+
}
|
|
584
|
+
const merged = existingReport
|
|
585
|
+
? RuntimeUtils.mergeTestReports(existingReport, newReport)
|
|
586
|
+
: newReport;
|
|
587
|
+
await promises_1.default.writeFile(destPath, JSON.stringify(merged, null, 2), "utf8");
|
|
588
|
+
}
|
|
589
|
+
static mergeTestReports(existing, partial) {
|
|
590
|
+
const updatedTests = [...existing.Tests];
|
|
591
|
+
for (const newTest of partial.Tests) {
|
|
592
|
+
const idx = updatedTests.findIndex(t => t.Name === newTest.Name);
|
|
593
|
+
if (idx >= 0) {
|
|
594
|
+
updatedTests[idx] = newTest;
|
|
595
|
+
}
|
|
596
|
+
else {
|
|
597
|
+
updatedTests.push(newTest);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
const successCount = updatedTests.filter(t => t.Success).length;
|
|
601
|
+
const failureCount = updatedTests.filter(t => !t.Success).length;
|
|
602
|
+
return {
|
|
603
|
+
...existing,
|
|
604
|
+
ExecutionId: partial.ExecutionId,
|
|
605
|
+
Tests: updatedTests,
|
|
606
|
+
SuccessCount: successCount,
|
|
607
|
+
FailureCount: failureCount,
|
|
608
|
+
Success: failureCount === 0,
|
|
609
|
+
};
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
exports.default = RuntimeUtils;
|
|
613
|
+
//# sourceMappingURL=RuntimeUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimeUtils.js","sourceRoot":"","sources":["../../src/utils/RuntimeUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface IServeOptions {
|
|
2
|
+
port?: number;
|
|
3
|
+
index?: string;
|
|
4
|
+
}
|
|
5
|
+
export default abstract class ServeUtils {
|
|
6
|
+
static serveApp(directory: string, options: IServeOptions): Promise<void>;
|
|
7
|
+
private static getAumlVariables;
|
|
8
|
+
private static getEnvVariables;
|
|
9
|
+
private static startExpressServer;
|
|
10
|
+
}
|