@joystick.js/cli-canary 0.0.0-canary.87 → 0.0.0-canary.89
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/dist/cli.js +7 -0
- package/dist/functions/index.js +21 -0
- package/dist/functions/start/index.js +1 -21
- package/dist/functions/test/index.js +7 -26
- package/dist/lib/dev/index.js +3 -0
- package/package.json +1 -1
- package/src/cli.js +9 -0
- package/src/functions/index.js +21 -0
- package/src/functions/start/index.js +1 -693
- package/src/functions/test/index.js +7 -32
- package/src/lib/dev/index.js +6 -6
package/dist/cli.js
CHANGED
|
@@ -53,6 +53,13 @@ if (functionsCalled.includes("start")) {
|
|
|
53
53
|
functions.start.function(args, options);
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
|
+
if (functionsCalled.includes("test")) {
|
|
57
|
+
const args = getArgs(functions.test.args);
|
|
58
|
+
const options = getOptions(functions.test.options);
|
|
59
|
+
if (functions.test.function && typeof functions.test.function === "function") {
|
|
60
|
+
functions.test.function(args, options);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
56
63
|
if (functionsCalled.includes("update")) {
|
|
57
64
|
const args = getArgs(functions.update.args);
|
|
58
65
|
const options = getOptions(functions.update.options);
|
package/dist/functions/index.js
CHANGED
|
@@ -4,6 +4,7 @@ import logout from "./logout/index.js";
|
|
|
4
4
|
import start from "./start/index.js";
|
|
5
5
|
import update from "./update/index.js";
|
|
6
6
|
import use from "./use/index.js";
|
|
7
|
+
import test from "./test/index.js";
|
|
7
8
|
const [_node, _bin, ...rawArgs] = process.argv;
|
|
8
9
|
var functions_default = {
|
|
9
10
|
build: {
|
|
@@ -216,6 +217,26 @@ var functions_default = {
|
|
|
216
217
|
},
|
|
217
218
|
function: start
|
|
218
219
|
},
|
|
220
|
+
test: {
|
|
221
|
+
set: !!rawArgs.includes("test"),
|
|
222
|
+
description: "Start an existing Joystick app and run its tests.",
|
|
223
|
+
args: {
|
|
224
|
+
w: {
|
|
225
|
+
set: !!rawArgs.includes("w") && !!rawArgs[rawArgs.indexOf("w") + 1],
|
|
226
|
+
parent: "w",
|
|
227
|
+
value: !!rawArgs.includes("w") && rawArgs[rawArgs.indexOf("w") + 1],
|
|
228
|
+
description: "Run joystick test in watch mode."
|
|
229
|
+
},
|
|
230
|
+
watch: {
|
|
231
|
+
set: !!rawArgs.includes("watch") && !!rawArgs[rawArgs.indexOf("watch") + 1],
|
|
232
|
+
parent: "watch",
|
|
233
|
+
value: !!rawArgs.includes("watch") && rawArgs[rawArgs.indexOf("watch") + 1],
|
|
234
|
+
description: "Run joystick test in watch mode."
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
options: {},
|
|
238
|
+
function: test()
|
|
239
|
+
},
|
|
219
240
|
update: {
|
|
220
241
|
set: !!rawArgs.includes("update"),
|
|
221
242
|
description: "Update all Joystick packages to their latest version.",
|
|
@@ -1,29 +1,9 @@
|
|
|
1
1
|
import dev from "../../lib/dev/index.js";
|
|
2
|
-
const startHMRProcess = () => {
|
|
3
|
-
const execArgv = ["--no-warnings"];
|
|
4
|
-
if (majorVersion < 19) {
|
|
5
|
-
execArgv.push("--experimental-specifier-resolution=node");
|
|
6
|
-
}
|
|
7
|
-
const hmrProcess = child_process.fork(
|
|
8
|
-
path.resolve(`${__dirname}/hmrServer.js`),
|
|
9
|
-
[],
|
|
10
|
-
{
|
|
11
|
-
execArgv,
|
|
12
|
-
// NOTE: Pipe stdin, stdout, and stderr. IPC establishes a message channel so we
|
|
13
|
-
// communicate with the child_process.
|
|
14
|
-
silent: true
|
|
15
|
-
}
|
|
16
|
-
);
|
|
17
|
-
process.hmrProcess = hmrProcess;
|
|
18
|
-
handleHMRProcessSTDIO();
|
|
19
|
-
handleHMRProcessMessages();
|
|
20
|
-
};
|
|
21
2
|
var start_default = async (args = {}, options = {}) => {
|
|
22
|
-
const port = options?.port ? parseInt(options?.port) : 2600;
|
|
23
3
|
await dev({
|
|
24
4
|
environment: args?.environment || "development",
|
|
25
5
|
process,
|
|
26
|
-
port
|
|
6
|
+
port: options?.port ? parseInt(options?.port) : 2600
|
|
27
7
|
});
|
|
28
8
|
};
|
|
29
9
|
export {
|
|
@@ -1,30 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import dev from "../../lib/dev/index.js";
|
|
2
|
+
var test_default = async (args = {}, options = {}) => {
|
|
3
|
+
await dev({
|
|
4
|
+
environment: "test",
|
|
5
|
+
process,
|
|
6
|
+
port: 1977
|
|
7
|
+
});
|
|
6
8
|
};
|
|
7
|
-
const validateOptions = (options) => {
|
|
8
|
-
try {
|
|
9
|
-
if (!options)
|
|
10
|
-
throw new Error("options object is required.");
|
|
11
|
-
if (!options.someOption)
|
|
12
|
-
throw new Error("options.someOption is required.");
|
|
13
|
-
} catch (exception) {
|
|
14
|
-
throw new Error(`[test.validateOptions] ${exception.message}`);
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
const test = (options, { resolve, reject }) => {
|
|
18
|
-
try {
|
|
19
|
-
validateOptions(options);
|
|
20
|
-
resolve();
|
|
21
|
-
} catch (exception) {
|
|
22
|
-
reject(`[test] ${exception.message}`);
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
var test_default = (options) => new Promise((resolve, reject) => {
|
|
26
|
-
test(options, { resolve, reject });
|
|
27
|
-
});
|
|
28
9
|
export {
|
|
29
10
|
test_default as default
|
|
30
11
|
};
|
package/dist/lib/dev/index.js
CHANGED
|
@@ -437,6 +437,9 @@ const dev = async (options, { resolve, reject }) => {
|
|
|
437
437
|
nodeMajorVersion,
|
|
438
438
|
__dirname
|
|
439
439
|
);
|
|
440
|
+
if (options?.environment === "test") {
|
|
441
|
+
process.loader.text("Running tests...");
|
|
442
|
+
}
|
|
440
443
|
resolve();
|
|
441
444
|
} catch (exception) {
|
|
442
445
|
console.warn(exception);
|
package/package.json
CHANGED
package/src/cli.js
CHANGED
|
@@ -69,6 +69,15 @@ if (functionsCalled.includes('start')) {
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
+
if (functionsCalled.includes('test')) {
|
|
73
|
+
const args = getArgs(functions.test.args);
|
|
74
|
+
const options = getOptions(functions.test.options);
|
|
75
|
+
|
|
76
|
+
if (functions.test.function && typeof functions.test.function === 'function') {
|
|
77
|
+
functions.test.function(args, options);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
72
81
|
if (functionsCalled.includes('update')) {
|
|
73
82
|
const args = getArgs(functions.update.args);
|
|
74
83
|
const options = getOptions(functions.update.options);
|
package/src/functions/index.js
CHANGED
|
@@ -5,6 +5,7 @@ import logout from './logout/index.js';
|
|
|
5
5
|
import start from './start/index.js';
|
|
6
6
|
import update from './update/index.js';
|
|
7
7
|
import use from "./use/index.js";
|
|
8
|
+
import test from "./test/index.js";
|
|
8
9
|
|
|
9
10
|
const [_node, _bin, ...rawArgs] = process.argv;
|
|
10
11
|
|
|
@@ -219,6 +220,26 @@ export default {
|
|
|
219
220
|
},
|
|
220
221
|
function: start,
|
|
221
222
|
},
|
|
223
|
+
test: {
|
|
224
|
+
set: !!rawArgs.includes('test'),
|
|
225
|
+
description: 'Start an existing Joystick app and run its tests.',
|
|
226
|
+
args: {
|
|
227
|
+
w: {
|
|
228
|
+
set: !!rawArgs.includes('w') && !!rawArgs[rawArgs.indexOf('w') + 1],
|
|
229
|
+
parent: 'w',
|
|
230
|
+
value: !!rawArgs.includes('w') && rawArgs[rawArgs.indexOf('w') + 1],
|
|
231
|
+
description: 'Run joystick test in watch mode.',
|
|
232
|
+
},
|
|
233
|
+
watch: {
|
|
234
|
+
set: !!rawArgs.includes('watch') && !!rawArgs[rawArgs.indexOf('watch') + 1],
|
|
235
|
+
parent: 'watch',
|
|
236
|
+
value: !!rawArgs.includes('watch') && rawArgs[rawArgs.indexOf('watch') + 1],
|
|
237
|
+
description: 'Run joystick test in watch mode.',
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
options: {},
|
|
241
|
+
function: test(),
|
|
242
|
+
},
|
|
222
243
|
update: {
|
|
223
244
|
set: !!rawArgs.includes('update'),
|
|
224
245
|
description: 'Update all Joystick packages to their latest version.',
|
|
@@ -1,701 +1,9 @@
|
|
|
1
|
-
/* eslint-disable consistent-return */
|
|
2
|
-
|
|
3
|
-
//import child_process from "child_process";
|
|
4
|
-
//import path, { dirname } from "path";
|
|
5
|
-
//import { fileURLToPath } from "url";
|
|
6
|
-
//import ps from "ps-node";
|
|
7
|
-
//import { killPortProcess } from "kill-port-process";
|
|
8
|
-
//import fs from "fs";
|
|
9
|
-
//import chokidar from "chokidar";
|
|
10
|
-
//import Loader from "../../lib/loader.js";
|
|
11
|
-
//import getFilesToBuild from "./getFilesToBuild.js";
|
|
12
|
-
//import buildFiles from "./buildFiles.js";
|
|
13
|
-
//import filesToCopy from "./filesToCopy.js";
|
|
14
|
-
//import checkIfPortAvailable from "./checkIfPortAvailable.js";
|
|
15
|
-
//import getCodependenciesForFile from "./getCodependenciesForFile.js";
|
|
16
|
-
//import isValidJSONString from "../../lib/isValidJSONString.js";
|
|
17
|
-
//import startDatabaseProvider from "./databases/startProvider.js";
|
|
18
|
-
//import CLILog from "../../lib/CLILog.js";
|
|
19
|
-
//import removeDeletedDependenciesFromMap from "./removeDeletedDependenciesFromMap.js";
|
|
20
|
-
//import validateDatabasesFromSettings from "../../lib/validateDatabasesFromSettings.js";
|
|
21
|
-
//import wait from "../../lib/wait.js";
|
|
22
1
|
import dev from "../../lib/dev/index.js";
|
|
23
2
|
|
|
24
|
-
//const majorVersion = parseInt(
|
|
25
|
-
// process?.version?.split(".")[0]?.replace("v", ""),
|
|
26
|
-
// 10
|
|
27
|
-
//);
|
|
28
|
-
//
|
|
29
|
-
//const __filename = fileURLToPath(import.meta.url);
|
|
30
|
-
//const __dirname = dirname(__filename);
|
|
31
|
-
//
|
|
32
|
-
//const killProcess = (pid = 0) => {
|
|
33
|
-
// return new Promise((resolve) => {
|
|
34
|
-
// ps.kill(pid, () => {
|
|
35
|
-
// resolve();
|
|
36
|
-
// });
|
|
37
|
-
// });
|
|
38
|
-
//};
|
|
39
|
-
//
|
|
40
|
-
//const watchlist = [
|
|
41
|
-
// { path: "ui" },
|
|
42
|
-
// { path: "lib" },
|
|
43
|
-
// { path: "i18n" },
|
|
44
|
-
// { path: "api" },
|
|
45
|
-
// { path: "email" },
|
|
46
|
-
// { path: "fixtures" },
|
|
47
|
-
// { path: "routes" },
|
|
48
|
-
// { path: "index.client.js" },
|
|
49
|
-
// { path: "index.server.js" },
|
|
50
|
-
// ...filesToCopy,
|
|
51
|
-
//];
|
|
52
|
-
//
|
|
53
|
-
//const requiredFileCheck = () => {
|
|
54
|
-
// return new Promise((resolve) => {
|
|
55
|
-
// const requiredFiles = [
|
|
56
|
-
// { path: "index.server.js", type: "file" },
|
|
57
|
-
// { path: "index.html", type: "file" },
|
|
58
|
-
// { path: "index.client.js", type: "file" },
|
|
59
|
-
// { path: "api", type: "directory" },
|
|
60
|
-
// { path: "i18n", type: "directory" },
|
|
61
|
-
// { path: "lib", type: "directory" },
|
|
62
|
-
// { path: "public", type: "directory" },
|
|
63
|
-
// { path: "ui", type: "directory" },
|
|
64
|
-
// { path: "ui/components", type: "directory" },
|
|
65
|
-
// { path: "ui/layouts", type: "directory" },
|
|
66
|
-
// { path: "ui/pages", type: "directory" },
|
|
67
|
-
// ];
|
|
68
|
-
//
|
|
69
|
-
// requiredFiles.forEach((requiredFile) => {
|
|
70
|
-
// const exists = fs.existsSync(`${process.cwd()}/${requiredFile.path}`);
|
|
71
|
-
// const stats =
|
|
72
|
-
// exists && fs.statSync(`${process.cwd()}/${requiredFile.path}`);
|
|
73
|
-
// const isFile = stats && stats.isFile();
|
|
74
|
-
// const isDirectory = stats && stats.isDirectory();
|
|
75
|
-
//
|
|
76
|
-
// if (requiredFile && requiredFile.type === "file") {
|
|
77
|
-
// if (!exists || (exists && !isFile)) {
|
|
78
|
-
// CLILog(
|
|
79
|
-
// `The path ${requiredFile.path} must exist in your project and must be a file (not a directory).`,
|
|
80
|
-
// {
|
|
81
|
-
// level: "danger",
|
|
82
|
-
// docs: "https://github.com/cheatcode/joystick#folder-and-file-structure",
|
|
83
|
-
// }
|
|
84
|
-
// );
|
|
85
|
-
// process.exit(0);
|
|
86
|
-
// }
|
|
87
|
-
// }
|
|
88
|
-
//
|
|
89
|
-
// if (requiredFile && requiredFile.type === "directory") {
|
|
90
|
-
// if (!exists || (exists && !isDirectory)) {
|
|
91
|
-
// CLILog(
|
|
92
|
-
// `The path ${requiredFile.path} must exist in your project and must be a directory (not a file).`,
|
|
93
|
-
// {
|
|
94
|
-
// level: "danger",
|
|
95
|
-
// docs: "https://github.com/cheatcode/joystick#folder-and-file-structure",
|
|
96
|
-
// }
|
|
97
|
-
// );
|
|
98
|
-
// process.exit(0);
|
|
99
|
-
// }
|
|
100
|
-
// }
|
|
101
|
-
// });
|
|
102
|
-
//
|
|
103
|
-
// resolve();
|
|
104
|
-
// });
|
|
105
|
-
//};
|
|
106
|
-
//
|
|
107
|
-
//const handleCleanup = async (
|
|
108
|
-
// processIds = [process?.serverProcess?.pid, process?.hmrProcess?.pid]
|
|
109
|
-
//) => {
|
|
110
|
-
// for (let i = 0; i < processIds?.length; i += 1) {
|
|
111
|
-
// const processId = processIds[i];
|
|
112
|
-
//
|
|
113
|
-
// if (processId) {
|
|
114
|
-
// await killProcess(processId);
|
|
115
|
-
// }
|
|
116
|
-
// }
|
|
117
|
-
//
|
|
118
|
-
// const databases = Object.entries(process._databases || {});
|
|
119
|
-
//
|
|
120
|
-
// for (let i = 0; i < databases?.length; i += 1) {
|
|
121
|
-
// const [provider, providerConnection] = databases[i];
|
|
122
|
-
//
|
|
123
|
-
// if (providerConnection?.pid) {
|
|
124
|
-
// await killProcess(providerConnection.pid);
|
|
125
|
-
// }
|
|
126
|
-
//
|
|
127
|
-
// if (!providerConnection?.pid) {
|
|
128
|
-
// const providerConnections = Object.entries(providerConnection);
|
|
129
|
-
//
|
|
130
|
-
// for (let pc = 0; pc < providerConnections?.length; pc += 1) {
|
|
131
|
-
// const [_connectionName, connection] = providerConnections[pc];
|
|
132
|
-
//
|
|
133
|
-
// if (connection?.pid) {
|
|
134
|
-
// await killProcess(connection?.pid);
|
|
135
|
-
// }
|
|
136
|
-
// }
|
|
137
|
-
// }
|
|
138
|
-
// }
|
|
139
|
-
//};
|
|
140
|
-
//
|
|
141
|
-
//const getDatabaseProcessIds = () => {
|
|
142
|
-
// const databaseProcessIds = [];
|
|
143
|
-
// const databases = Object.entries(process._databases || {});
|
|
144
|
-
//
|
|
145
|
-
// for (let i = 0; i < databases?.length; i += 1) {
|
|
146
|
-
// const [_provider, providerConnection] = databases[i];
|
|
147
|
-
//
|
|
148
|
-
// if (providerConnection?.pid) {
|
|
149
|
-
// databaseProcessIds.push(providerConnection.pid);
|
|
150
|
-
// }
|
|
151
|
-
//
|
|
152
|
-
// if (!providerConnection?.pid) {
|
|
153
|
-
// const providerConnections = Object.entries(providerConnection);
|
|
154
|
-
//
|
|
155
|
-
// for (let pc = 0; pc < providerConnections?.length; pc += 1) {
|
|
156
|
-
// const [_connectionName, connection] = providerConnections[pc];
|
|
157
|
-
//
|
|
158
|
-
// if (connection?.pid) {
|
|
159
|
-
// databaseProcessIds.push(connection.pid);
|
|
160
|
-
// }
|
|
161
|
-
// }
|
|
162
|
-
// }
|
|
163
|
-
// }
|
|
164
|
-
//
|
|
165
|
-
// return databaseProcessIds;
|
|
166
|
-
//};
|
|
167
|
-
//
|
|
168
|
-
//const handleSignalEvents = (processIds = []) => {
|
|
169
|
-
// const execArgv = ["--no-warnings"];
|
|
170
|
-
//
|
|
171
|
-
// if (majorVersion < 19) {
|
|
172
|
-
// execArgv.push("--experimental-specifier-resolution=node");
|
|
173
|
-
// }
|
|
174
|
-
//
|
|
175
|
-
// const cleanupProcess = child_process.fork(
|
|
176
|
-
// path.resolve(`${__dirname}/cleanup/index.js`),
|
|
177
|
-
// [],
|
|
178
|
-
// {
|
|
179
|
-
// // NOTE: Run in detached mode so when parent process dies, the child still runs
|
|
180
|
-
// // and cleanup completes.
|
|
181
|
-
// detached: true,
|
|
182
|
-
// execArgv,
|
|
183
|
-
// // NOTE: Pipe stdin, stdout, and stderr. IPC establishes a message channel so we
|
|
184
|
-
// // communicate with the child_process.
|
|
185
|
-
// silent: true,
|
|
186
|
-
// }
|
|
187
|
-
// );
|
|
188
|
-
//
|
|
189
|
-
// process.on("SIGINT", async () => {
|
|
190
|
-
// const databaseProcessIds = getDatabaseProcessIds();
|
|
191
|
-
// cleanupProcess.send(JSON.stringify(({ processIds: [...processIds, ...databaseProcessIds] })));
|
|
192
|
-
// process.exit();
|
|
193
|
-
// });
|
|
194
|
-
//
|
|
195
|
-
// process.on("SIGTERM", async () => {
|
|
196
|
-
// const databaseProcessIds = getDatabaseProcessIds();
|
|
197
|
-
// cleanupProcess.send(JSON.stringify(({ processIds: [...processIds, ...databaseProcessIds] })));
|
|
198
|
-
// process.exit();
|
|
199
|
-
// });
|
|
200
|
-
//};
|
|
201
|
-
//
|
|
202
|
-
//const handleHMRProcessMessages = () => {
|
|
203
|
-
// process.hmrProcess.on("message", (message) => {
|
|
204
|
-
// const processMessages = [
|
|
205
|
-
// "SERVER_CLOSED",
|
|
206
|
-
// "HAS_HMR_CONNECTIONS",
|
|
207
|
-
// "HAS_NO_HMR_CONNECTIONS",
|
|
208
|
-
// "HMR_UPDATE_COMPLETED",
|
|
209
|
-
// ];
|
|
210
|
-
//
|
|
211
|
-
// if (!processMessages.includes(message?.type)) {
|
|
212
|
-
// process.loader.stable(message);
|
|
213
|
-
// }
|
|
214
|
-
//
|
|
215
|
-
// if (message?.type === "HAS_HMR_CONNECTIONS") {
|
|
216
|
-
// process.hmrProcess.hasConnections = true;
|
|
217
|
-
// }
|
|
218
|
-
//
|
|
219
|
-
// if (message?.type === "HAS_NO_HMR_CONNECTIONS") {
|
|
220
|
-
// process.hmrProcess.hasConnections = false;
|
|
221
|
-
// }
|
|
222
|
-
//
|
|
223
|
-
// if (message?.type === "HMR_UPDATE_COMPLETED") {
|
|
224
|
-
// // NOTE: Do a setTimeout to ensure that server is still available while the HMR update completes.
|
|
225
|
-
// // Necessary because some updates are instance, but others might mount a UI that needs a server
|
|
226
|
-
// // available (e.g., runs API requests).
|
|
227
|
-
// setTimeout(() => {
|
|
228
|
-
// restartApplicationProcess(message?.sessions);
|
|
229
|
-
// }, 500);
|
|
230
|
-
// }
|
|
231
|
-
// });
|
|
232
|
-
//};
|
|
233
|
-
//
|
|
234
|
-
//const handleHMRProcessSTDIO = () => {
|
|
235
|
-
// try {
|
|
236
|
-
// if (process.hmrProcess) {
|
|
237
|
-
// process.hmrProcess.on("error", (error) => {
|
|
238
|
-
// CLILog(error.toString(), {
|
|
239
|
-
// level: "danger",
|
|
240
|
-
// docs: "https://github.com/cheatcode/joystick",
|
|
241
|
-
// });
|
|
242
|
-
// });
|
|
243
|
-
//
|
|
244
|
-
// process.hmrProcess.stdout.on("data", (data) => {
|
|
245
|
-
// console.log(data.toString());
|
|
246
|
-
// });
|
|
247
|
-
//
|
|
248
|
-
// process.hmrProcess.stderr.on("data", (data) => {
|
|
249
|
-
// process.loader.stop();
|
|
250
|
-
// CLILog(data.toString(), {
|
|
251
|
-
// level: "danger",
|
|
252
|
-
// docs: "https://github.com/cheatcode/joystick",
|
|
253
|
-
// });
|
|
254
|
-
// });
|
|
255
|
-
// }
|
|
256
|
-
// } catch (exception) {
|
|
257
|
-
// throw new Error(`[dev.handleHMRProcessSTDIO] ${exception.message}`);
|
|
258
|
-
// }
|
|
259
|
-
//};
|
|
260
|
-
//
|
|
261
|
-
const startHMRProcess = () => {
|
|
262
|
-
const execArgv = ["--no-warnings"];
|
|
263
|
-
|
|
264
|
-
if (majorVersion < 19) {
|
|
265
|
-
execArgv.push("--experimental-specifier-resolution=node");
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
const hmrProcess = child_process.fork(
|
|
269
|
-
path.resolve(`${__dirname}/hmrServer.js`),
|
|
270
|
-
[],
|
|
271
|
-
{
|
|
272
|
-
execArgv,
|
|
273
|
-
// NOTE: Pipe stdin, stdout, and stderr. IPC establishes a message channel so we
|
|
274
|
-
// communicate with the child_process.
|
|
275
|
-
silent: true,
|
|
276
|
-
}
|
|
277
|
-
);
|
|
278
|
-
|
|
279
|
-
process.hmrProcess = hmrProcess;
|
|
280
|
-
|
|
281
|
-
handleHMRProcessSTDIO();
|
|
282
|
-
handleHMRProcessMessages();
|
|
283
|
-
};
|
|
284
|
-
//
|
|
285
|
-
//const notifyHMRClients = (indexHTMLChanged = false) => {
|
|
286
|
-
// const settings = loadSettings(process.env.NODE_ENV);
|
|
287
|
-
// process.hmrProcess.send(
|
|
288
|
-
// JSON.stringify({
|
|
289
|
-
// type: "RESTART_SERVER",
|
|
290
|
-
// settings,
|
|
291
|
-
// indexHTMLChanged,
|
|
292
|
-
// })
|
|
293
|
-
// );
|
|
294
|
-
//};
|
|
295
|
-
//
|
|
296
|
-
//const handleServerProcessMessages = () => {
|
|
297
|
-
// process.serverProcess.on("message", (message) => {
|
|
298
|
-
// const processMessages = ["SERVER_CLOSED"];
|
|
299
|
-
//
|
|
300
|
-
// if (!processMessages.includes(message)) {
|
|
301
|
-
// process.loader.stable(message);
|
|
302
|
-
// }
|
|
303
|
-
// });
|
|
304
|
-
//};
|
|
305
|
-
//
|
|
306
|
-
//const handleServerProcessSTDIO = () => {
|
|
307
|
-
// try {
|
|
308
|
-
// if (process.serverProcess) {
|
|
309
|
-
// process.serverProcess.on("error", (error) => {
|
|
310
|
-
// console.log(error);
|
|
311
|
-
// });
|
|
312
|
-
//
|
|
313
|
-
// process.serverProcess.stdout.on("data", (data) => {
|
|
314
|
-
// const message = data.toString();
|
|
315
|
-
//
|
|
316
|
-
// if (message && message.includes("App running at:")) {
|
|
317
|
-
// process.loader.stable(message);
|
|
318
|
-
// } else {
|
|
319
|
-
// if (message && !message.includes("BUILD_ERROR")) {
|
|
320
|
-
// console.log(message);
|
|
321
|
-
// }
|
|
322
|
-
// }
|
|
323
|
-
// });
|
|
324
|
-
//
|
|
325
|
-
// process.serverProcess.stderr.on("data", (data) => {
|
|
326
|
-
// process.loader.stop();
|
|
327
|
-
// CLILog(data.toString(), {
|
|
328
|
-
// level: "danger",
|
|
329
|
-
// docs: "https://github.com/cheatcode/joystick",
|
|
330
|
-
// });
|
|
331
|
-
// });
|
|
332
|
-
// }
|
|
333
|
-
// } catch (exception) {
|
|
334
|
-
// throw new Error(`[dev.handleServerProcessSTDIO] ${exception.message}`);
|
|
335
|
-
// }
|
|
336
|
-
//};
|
|
337
|
-
//
|
|
338
|
-
//const startApplicationProcess = (sessionsBeforeHMRUpdate = null) => {
|
|
339
|
-
// const execArgv = ["--no-warnings"];
|
|
340
|
-
//
|
|
341
|
-
// if (majorVersion < 19) {
|
|
342
|
-
// execArgv.push("--experimental-specifier-resolution=node");
|
|
343
|
-
// }
|
|
344
|
-
//
|
|
345
|
-
// if (
|
|
346
|
-
// process.env.NODE_ENV === "development" &&
|
|
347
|
-
// process.env.IS_DEBUG_MODE === "true"
|
|
348
|
-
// ) {
|
|
349
|
-
// execArgv.push("--inspect");
|
|
350
|
-
// }
|
|
351
|
-
//
|
|
352
|
-
// const serverProcess = child_process.fork(
|
|
353
|
-
// path.resolve(".joystick/build/index.server.js"),
|
|
354
|
-
// [],
|
|
355
|
-
// {
|
|
356
|
-
// execArgv,
|
|
357
|
-
// // NOTE: Pipe stdin, stdout, and stderr. IPC establishes a message channel so we
|
|
358
|
-
// // communicate with the child_process.
|
|
359
|
-
// silent: true,
|
|
360
|
-
// env: {
|
|
361
|
-
// FORCE_COLOR: "1",
|
|
362
|
-
// LOGS_PATH: process.env.LOGS_PATH,
|
|
363
|
-
// NODE_ENV: process.env.NODE_ENV,
|
|
364
|
-
// ROOT_URL: process.env.ROOT_URL,
|
|
365
|
-
// PORT: process.env.PORT,
|
|
366
|
-
// JOYSTICK_SETTINGS: process.env.JOYSTICK_SETTINGS,
|
|
367
|
-
// HMR_SESSIONS: sessionsBeforeHMRUpdate,
|
|
368
|
-
// },
|
|
369
|
-
// }
|
|
370
|
-
// );
|
|
371
|
-
//
|
|
372
|
-
// process.serverProcess = serverProcess;
|
|
373
|
-
//
|
|
374
|
-
// handleServerProcessSTDIO();
|
|
375
|
-
// handleServerProcessMessages();
|
|
376
|
-
//
|
|
377
|
-
// return serverProcess;
|
|
378
|
-
//};
|
|
379
|
-
//
|
|
380
|
-
//const restartApplicationProcess = async (sessionsBeforeHMRUpdate = null) => {
|
|
381
|
-
// if (process.serverProcess && process.serverProcess.pid) {
|
|
382
|
-
// process.loader.text("Restarting app...");
|
|
383
|
-
// process.serverProcess.kill();
|
|
384
|
-
// startApplicationProcess(sessionsBeforeHMRUpdate);
|
|
385
|
-
// return Promise.resolve();
|
|
386
|
-
// }
|
|
387
|
-
//
|
|
388
|
-
// // NOTE: Original process was never initialized due to an error.
|
|
389
|
-
// process.loader.text("Starting app...");
|
|
390
|
-
// startApplicationProcess();
|
|
391
|
-
//
|
|
392
|
-
// if (!process.hmrProcess) {
|
|
393
|
-
// startHMRProcess();
|
|
394
|
-
// }
|
|
395
|
-
//};
|
|
396
|
-
//
|
|
397
|
-
//const initialBuild = async (buildSettings = {}) => {
|
|
398
|
-
// const buildPath = `.joystick/build`;
|
|
399
|
-
// const fileMapPath = `.joystick/build/fileMap.json`;
|
|
400
|
-
//
|
|
401
|
-
// if (!fs.existsSync(buildPath)) {
|
|
402
|
-
// fs.mkdirSync(".joystick/build");
|
|
403
|
-
// }
|
|
404
|
-
//
|
|
405
|
-
// if (fs.existsSync(fileMapPath)) {
|
|
406
|
-
// fs.unlinkSync(fileMapPath);
|
|
407
|
-
// }
|
|
408
|
-
//
|
|
409
|
-
// process.loader.text("Building app...");
|
|
410
|
-
//
|
|
411
|
-
// await requiredFileCheck();
|
|
412
|
-
//
|
|
413
|
-
// const filesToBuild = getFilesToBuild(buildSettings?.excludedPaths, "start");
|
|
414
|
-
// const fileResults = await buildFiles(
|
|
415
|
-
// filesToBuild,
|
|
416
|
-
// null,
|
|
417
|
-
// process.env.NODE_ENV
|
|
418
|
-
// );
|
|
419
|
-
//
|
|
420
|
-
// const hasErrors = [...fileResults]
|
|
421
|
-
// .filter((result) => !!result)
|
|
422
|
-
// .map(({ success }) => success)
|
|
423
|
-
// .includes(false);
|
|
424
|
-
//
|
|
425
|
-
// if (!hasErrors) {
|
|
426
|
-
// startApplicationProcess();
|
|
427
|
-
// startHMRProcess();
|
|
428
|
-
// // If the file has errors on startup, no way to trigger a restart w/o a watcher.
|
|
429
|
-
// }
|
|
430
|
-
//};
|
|
431
|
-
//
|
|
432
|
-
//const startWatcher = async (buildSettings = {}) => {
|
|
433
|
-
// await initialBuild(buildSettings);
|
|
434
|
-
//
|
|
435
|
-
// const watcher = chokidar.watch(
|
|
436
|
-
// watchlist.map(({ path }) => path),
|
|
437
|
-
// {
|
|
438
|
-
// ignoreInitial: true,
|
|
439
|
-
// }
|
|
440
|
-
// );
|
|
441
|
-
//
|
|
442
|
-
// watcher.on("all", async (event, path) => {
|
|
443
|
-
// await requiredFileCheck();
|
|
444
|
-
// process.loader.text("Rebuilding app...");
|
|
445
|
-
// const isHTMLUpdate = path === "index.html";
|
|
446
|
-
// const isUIPath = path?.includes("ui/") || path === 'index.css' || isHTMLUpdate;
|
|
447
|
-
// const isUIUpdate =
|
|
448
|
-
// (process.hmrProcess.hasConnections && isUIPath) || false;
|
|
449
|
-
//
|
|
450
|
-
// if (
|
|
451
|
-
// ["addDir"].includes(event) &&
|
|
452
|
-
// fs.existsSync(path) &&
|
|
453
|
-
// fs.lstatSync(path).isDirectory() &&
|
|
454
|
-
// !fs.existsSync(`./.joystick/build/${path}`)
|
|
455
|
-
// ) {
|
|
456
|
-
// fs.mkdirSync(`./.joystick/build/${path}`);
|
|
457
|
-
//
|
|
458
|
-
// if (isUIUpdate) {
|
|
459
|
-
// notifyHMRClients(isHTMLUpdate);
|
|
460
|
-
// } else {
|
|
461
|
-
// restartApplicationProcess();
|
|
462
|
-
// }
|
|
463
|
-
//
|
|
464
|
-
// return;
|
|
465
|
-
// }
|
|
466
|
-
//
|
|
467
|
-
// // If path is file to copy...
|
|
468
|
-
// if (!!filesToCopy.find((fileToCopy) => fileToCopy.path === path)) {
|
|
469
|
-
// const isDirectory = fs.statSync(path).isDirectory();
|
|
470
|
-
//
|
|
471
|
-
// // If path to copy is a directory and doesn't exist in the build...
|
|
472
|
-
// if (isDirectory && !fs.existsSync(`./.joystick/build/${path}`)) {
|
|
473
|
-
// fs.mkdirSync(`./.joystick/build/${path}`);
|
|
474
|
-
// }
|
|
475
|
-
//
|
|
476
|
-
// // If path to copy is not a directory...
|
|
477
|
-
// if (!isDirectory) {
|
|
478
|
-
// fs.writeFileSync(`./.joystick/build/${path}`, fs.readFileSync(path));
|
|
479
|
-
// }
|
|
480
|
-
//
|
|
481
|
-
// // Load settings in case we copied new values over...
|
|
482
|
-
// loadSettings(process.env.NODE_ENV);
|
|
483
|
-
//
|
|
484
|
-
// if (isUIUpdate) {
|
|
485
|
-
// notifyHMRClients(isHTMLUpdate);
|
|
486
|
-
// } else {
|
|
487
|
-
// restartApplicationProcess();
|
|
488
|
-
// }
|
|
489
|
-
//
|
|
490
|
-
// return;
|
|
491
|
-
// }
|
|
492
|
-
//
|
|
493
|
-
// if (["add", "change"].includes(event) && fs.existsSync(path)) {
|
|
494
|
-
// const codependencies = getCodependenciesForFile(path);
|
|
495
|
-
// const fileResults = await buildFiles(
|
|
496
|
-
// [path, ...(codependencies?.existing || [])],
|
|
497
|
-
// null,
|
|
498
|
-
// process.env.NODE_ENV
|
|
499
|
-
// );
|
|
500
|
-
// const fileResultsHaveErrors = fileResults
|
|
501
|
-
// .filter((result) => !!result)
|
|
502
|
-
// .map(({ success }) => success)
|
|
503
|
-
// .includes(false);
|
|
504
|
-
//
|
|
505
|
-
// removeDeletedDependenciesFromMap(codependencies.deleted);
|
|
506
|
-
//
|
|
507
|
-
// const hasErrors = fileResultsHaveErrors;
|
|
508
|
-
//
|
|
509
|
-
// if (process.serverProcess && hasErrors) {
|
|
510
|
-
// process.serverProcess.send(
|
|
511
|
-
// JSON.stringify({
|
|
512
|
-
// error: "BUILD_ERROR",
|
|
513
|
-
// paths: fileResults
|
|
514
|
-
// .filter(({ success }) => !success)
|
|
515
|
-
// .map(({ path: pathWithError, error }) => ({
|
|
516
|
-
// path: pathWithError,
|
|
517
|
-
// error,
|
|
518
|
-
// })),
|
|
519
|
-
// })
|
|
520
|
-
// );
|
|
521
|
-
//
|
|
522
|
-
// return;
|
|
523
|
-
// }
|
|
524
|
-
//
|
|
525
|
-
// if (!hasErrors) {
|
|
526
|
-
// process.initialBuildComplete = true;
|
|
527
|
-
//
|
|
528
|
-
// if (isUIUpdate) {
|
|
529
|
-
// notifyHMRClients(isHTMLUpdate);
|
|
530
|
-
// } else {
|
|
531
|
-
// restartApplicationProcess();
|
|
532
|
-
// }
|
|
533
|
-
//
|
|
534
|
-
// return;
|
|
535
|
-
// }
|
|
536
|
-
// }
|
|
537
|
-
//
|
|
538
|
-
// if (
|
|
539
|
-
// ["unlink", "unlinkDir"].includes(event) &&
|
|
540
|
-
// !fs.existsSync(`./.joystick/build/${path}`)
|
|
541
|
-
// ) {
|
|
542
|
-
// if (isUIUpdate) {
|
|
543
|
-
// notifyHMRClients(isHTMLUpdate);
|
|
544
|
-
// } else {
|
|
545
|
-
// restartApplicationProcess();
|
|
546
|
-
// }
|
|
547
|
-
//
|
|
548
|
-
// return;
|
|
549
|
-
// }
|
|
550
|
-
//
|
|
551
|
-
// if (
|
|
552
|
-
// ["unlink", "unlinkDir"].includes(event) &&
|
|
553
|
-
// fs.existsSync(`./.joystick/build/${path}`)
|
|
554
|
-
// ) {
|
|
555
|
-
// const pathToUnlink = `./.joystick/build/${path}`;
|
|
556
|
-
// const stats = fs.lstatSync(pathToUnlink);
|
|
557
|
-
//
|
|
558
|
-
// if (stats.isDirectory()) {
|
|
559
|
-
// fs.rmdirSync(pathToUnlink, { recursive: true });
|
|
560
|
-
// }
|
|
561
|
-
//
|
|
562
|
-
// if (stats.isFile()) {
|
|
563
|
-
// fs.unlinkSync(pathToUnlink);
|
|
564
|
-
// }
|
|
565
|
-
//
|
|
566
|
-
// if (isUIUpdate) {
|
|
567
|
-
// notifyHMRClients(isHTMLUpdate);
|
|
568
|
-
// } else {
|
|
569
|
-
// restartApplicationProcess();
|
|
570
|
-
// }
|
|
571
|
-
//
|
|
572
|
-
// return;
|
|
573
|
-
// }
|
|
574
|
-
// });
|
|
575
|
-
//};
|
|
576
|
-
//
|
|
577
|
-
//const startDatabase = async (database = {}, databasePort = 2610, hasMultipleOfProvider = false) => {
|
|
578
|
-
// process._databases = {
|
|
579
|
-
// ...(process._databases || {}),
|
|
580
|
-
// [database.provider]: !hasMultipleOfProvider ? await startDatabaseProvider(database, databasePort) : {
|
|
581
|
-
// ...((process._databases && process._databases[database.provider]) || {}),
|
|
582
|
-
// [database?.name || `${database.provider}_${databasePort}`]: await startDatabaseProvider(database, databasePort)
|
|
583
|
-
// },
|
|
584
|
-
// };
|
|
585
|
-
//
|
|
586
|
-
// return Promise.resolve(process._databases);
|
|
587
|
-
//};
|
|
588
|
-
//
|
|
589
|
-
//const startDatabases = async (databasePortStart = 2610) => {
|
|
590
|
-
// try {
|
|
591
|
-
// const hasSettings = !!process.env.JOYSTICK_SETTINGS;
|
|
592
|
-
// const settings = hasSettings && JSON.parse(process.env.JOYSTICK_SETTINGS);
|
|
593
|
-
// const databases = settings?.config?.databases || [];
|
|
594
|
-
//
|
|
595
|
-
// if (databases && Array.isArray(databases) && databases.length > 0) {
|
|
596
|
-
// validateDatabasesFromSettings(databases);
|
|
597
|
-
//
|
|
598
|
-
// for (let i = 0; i < databases?.length; i += 1) {
|
|
599
|
-
// const database = databases[i];
|
|
600
|
-
// const hasMultipleOfProvider = (databases?.filter((database) => database?.provider === database?.provider))?.length > 1;
|
|
601
|
-
//
|
|
602
|
-
// // NOTE: Increment each database port using index in the databases array from settings.
|
|
603
|
-
// await startDatabase(database, databasePortStart + i, hasMultipleOfProvider);
|
|
604
|
-
// }
|
|
605
|
-
//
|
|
606
|
-
// return Promise.resolve();
|
|
607
|
-
// }
|
|
608
|
-
//
|
|
609
|
-
// return Promise.resolve();
|
|
610
|
-
// } catch (exception) {
|
|
611
|
-
// console.warn(exception);
|
|
612
|
-
// }
|
|
613
|
-
//};
|
|
614
|
-
//
|
|
615
|
-
//const loadSettings = () => {
|
|
616
|
-
// const environment = process.env.NODE_ENV;
|
|
617
|
-
// const settingsFilePath = `${process.cwd()}/settings.${environment}.json`;
|
|
618
|
-
// const hasSettingsFile = fs.existsSync(settingsFilePath);
|
|
619
|
-
//
|
|
620
|
-
// if (!hasSettingsFile) {
|
|
621
|
-
// CLILog(
|
|
622
|
-
// `A settings file could not be found for this environment (${environment}). Create a settings.${environment}.json file at the root of your project and restart Joystick.`,
|
|
623
|
-
// {
|
|
624
|
-
// level: "danger",
|
|
625
|
-
// docs: "https://github.com/cheatcode/joystick#settings",
|
|
626
|
-
// }
|
|
627
|
-
// );
|
|
628
|
-
// process.exit(0);
|
|
629
|
-
// }
|
|
630
|
-
//
|
|
631
|
-
// const rawSettingsFile = fs.readFileSync(settingsFilePath, "utf-8");
|
|
632
|
-
// const isValidJSON = isValidJSONString(rawSettingsFile);
|
|
633
|
-
//
|
|
634
|
-
// if (!isValidJSON) {
|
|
635
|
-
// CLILog(
|
|
636
|
-
// `Failed to parse settings file. Double-check the syntax in your settings.${environment}.json file at the root of your project and restart Joystick.`,
|
|
637
|
-
// {
|
|
638
|
-
// level: "danger",
|
|
639
|
-
// docs: "https://github.com/cheatcode/joystick#settings",
|
|
640
|
-
// tools: [{ title: "JSON Linter", url: "https://jsonlint.com/" }],
|
|
641
|
-
// }
|
|
642
|
-
// );
|
|
643
|
-
//
|
|
644
|
-
// process.exit(0);
|
|
645
|
-
// }
|
|
646
|
-
//
|
|
647
|
-
// const settingsFile = isValidJSON ? rawSettingsFile : "{}";
|
|
648
|
-
//
|
|
649
|
-
// // NOTE: Child process will inherit this env var from this parent process.
|
|
650
|
-
// process.env.JOYSTICK_SETTINGS = settingsFile;
|
|
651
|
-
//
|
|
652
|
-
// return JSON.parse(settingsFile);
|
|
653
|
-
//};
|
|
654
|
-
//
|
|
655
|
-
//const checkIfJoystickProject = () => {
|
|
656
|
-
// return fs.existsSync(`${process.cwd()}/.joystick`);
|
|
657
|
-
//};
|
|
658
|
-
|
|
659
3
|
export default async (args = {}, options = {}) => {
|
|
660
|
-
const port = options?.port ? parseInt(options?.port) : 2600;
|
|
661
|
-
|
|
662
4
|
await dev({
|
|
663
5
|
environment: args?.environment || 'development',
|
|
664
6
|
process,
|
|
665
|
-
port,
|
|
7
|
+
port: options?.port ? parseInt(options?.port) : 2600,
|
|
666
8
|
});
|
|
667
|
-
// process.loader = new Loader({ defaultMessage: "Starting app..." });
|
|
668
|
-
//
|
|
669
|
-
// const port = options?.port ? parseInt(options?.port) : 2600;
|
|
670
|
-
//
|
|
671
|
-
// // NOTE: Give databases their own port range to avoid collisions.
|
|
672
|
-
// const databasePortStart = port + 10;
|
|
673
|
-
//
|
|
674
|
-
// const isJoystickProject = checkIfJoystickProject();
|
|
675
|
-
//
|
|
676
|
-
// if (!isJoystickProject) {
|
|
677
|
-
// CLILog(
|
|
678
|
-
// "This is not a Joystick project. A .joystick folder could not be found.",
|
|
679
|
-
// {
|
|
680
|
-
// level: "danger",
|
|
681
|
-
// docs: "https://github.com/cheatcode/joystick",
|
|
682
|
-
// }
|
|
683
|
-
// );
|
|
684
|
-
// process.exit(0);
|
|
685
|
-
// }
|
|
686
|
-
//
|
|
687
|
-
// await killPortProcess([port, port + 1]);
|
|
688
|
-
//
|
|
689
|
-
// process.title = "joystick";
|
|
690
|
-
// process.env.LOGS_PATH = options?.logs || null;
|
|
691
|
-
// process.env.NODE_ENV = options?.environment || "development";
|
|
692
|
-
// process.env.PORT = options?.port ? parseInt(options?.port) : 2600;
|
|
693
|
-
// process.env.IS_DEBUG_MODE = options?.debug;
|
|
694
|
-
//
|
|
695
|
-
// const settings = loadSettings(process.env.NODE_ENV);
|
|
696
|
-
// await startDatabases(databasePortStart);
|
|
697
|
-
//
|
|
698
|
-
// startWatcher(settings?.config?.build);
|
|
699
|
-
//
|
|
700
|
-
// handleSignalEvents([]);
|
|
701
9
|
};
|
|
@@ -1,34 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import dev from "../../lib/dev/index.js";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
const validateOptions = (options) => {
|
|
12
|
-
try {
|
|
13
|
-
if (!options) throw new Error('options object is required.');
|
|
14
|
-
if (!options.someOption) throw new Error('options.someOption is required.');
|
|
15
|
-
} catch (exception) {
|
|
16
|
-
throw new Error(`[test.validateOptions] ${exception.message}`);
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
const test = (options, { resolve, reject }) => {
|
|
21
|
-
try {
|
|
22
|
-
validateOptions(options);
|
|
23
|
-
// Call action methods in sequence here.
|
|
24
|
-
resolve();
|
|
25
|
-
} catch (exception) {
|
|
26
|
-
reject(`[test] ${exception.message}`);
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
export default (options) =>
|
|
31
|
-
new Promise((resolve, reject) => {
|
|
32
|
-
test(options, { resolve, reject });
|
|
3
|
+
export default async (args = {}, options = {}) => {
|
|
4
|
+
await dev({
|
|
5
|
+
environment: 'test',
|
|
6
|
+
process,
|
|
7
|
+
port: 1977,
|
|
33
8
|
});
|
|
34
|
-
|
|
9
|
+
};
|
package/src/lib/dev/index.js
CHANGED
|
@@ -267,7 +267,6 @@ const getWatchChangeContext = (event = '', path = '') => {
|
|
|
267
267
|
try {
|
|
268
268
|
const isHTMLUpdate = path === "index.html";
|
|
269
269
|
const isUIPath = path?.includes("ui/") || path === 'index.css' || isHTMLUpdate;
|
|
270
|
-
// TODO: Flimsy. May want to wait until HMR and server are up to do the builds/watching.
|
|
271
270
|
const isUIUpdate = (process.hmrProcess && process.hmrProcess.hasConnections && isUIPath) || false;
|
|
272
271
|
const isSettingsUpdate = path?.match(SETTINGS_FILE_NAME_REGEX)?.length > 0;
|
|
273
272
|
const isDirectory = fs.statSync(path).isDirectory();
|
|
@@ -525,10 +524,11 @@ const dev = async (options, { resolve, reject }) => {
|
|
|
525
524
|
__dirname
|
|
526
525
|
);
|
|
527
526
|
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
//
|
|
527
|
+
|
|
528
|
+
if (options?.environment === 'test') {
|
|
529
|
+
process.loader.text('Running tests...');
|
|
530
|
+
// await runTests(options);
|
|
531
|
+
}
|
|
532
532
|
|
|
533
533
|
/*
|
|
534
534
|
TODO:
|
|
@@ -540,7 +540,7 @@ const dev = async (options, { resolve, reject }) => {
|
|
|
540
540
|
- [x] Start databases relative to options.environment (development|test) from settings.<environment>.json.
|
|
541
541
|
- [x] Run the initial build
|
|
542
542
|
- [x] Start the file watcher
|
|
543
|
-
- [
|
|
543
|
+
- [x] Start the app as normal from the build directory.
|
|
544
544
|
- [ ] If environment === 'test', run the tests.
|
|
545
545
|
- [ ] If environment === 'test', after tests, run process.exit(0).
|
|
546
546
|
*/
|