miqro 6.0.12 → 6.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/build/editor.bundle.js +4 -4
- package/build/esm/editor/common/constants.d.ts +1 -1
- package/build/esm/editor/common/constants.js +1 -1
- package/build/esm/editor/common/constants.js.map +1 -1
- package/build/esm/editor/common/templates.js +4 -4
- package/build/esm/editor/server.js +1 -1
- package/build/esm/editor/server.js.map +1 -1
- package/build/esm/src/bin/generate-doc.js +20 -18
- package/build/esm/src/bin/generate-doc.js.map +1 -1
- package/build/esm/src/cluster.js +4 -1
- package/build/esm/src/cluster.js.map +1 -1
- package/build/esm/src/common/arguments.d.ts +1 -0
- package/build/esm/src/common/arguments.js +11 -1
- package/build/esm/src/common/arguments.js.map +1 -1
- package/build/esm/src/common/constants.d.ts +1 -0
- package/build/esm/src/common/constants.js +2 -2
- package/build/esm/src/common/constants.js.map +1 -1
- package/build/esm/src/common/help.d.ts +1 -1
- package/build/esm/src/common/help.js +2 -1
- package/build/esm/src/common/help.js.map +1 -1
- package/build/esm/src/main.js +0 -0
- package/build/esm/src/services/app.js +3 -3
- package/build/esm/src/services/app.js.map +1 -1
- package/build/esm/src/services/editor.js +21 -14
- package/build/esm/src/services/editor.js.map +1 -1
- package/build/esm/src/services/hot-reload.js +2 -1
- package/build/esm/src/services/hot-reload.js.map +1 -1
- package/build/esm/src/services/utils/log.js +2 -2
- package/build/esm/src/services/utils/log.js.map +1 -1
- package/build/esm/src/services/utils/server-interface.d.ts +2 -0
- package/build/esm/src/services/utils/server-interface.js +6 -0
- package/build/esm/src/services/utils/server-interface.js.map +1 -1
- package/build/esm/src/types.d.ts +2 -0
- package/build/lib.cjs +140 -127
- package/editor/common/constants.ts +1 -1
- package/editor/common/templates.ts +4 -4
- package/editor/http/admin/editor/style.css +1 -1
- package/editor/server.ts +1 -1
- package/package.json +4 -5
- package/sea/types.json +1 -1
- package/src/bin/generate-doc.ts +21 -18
- package/src/cluster.ts +5 -1
- package/src/common/arguments.ts +13 -1
- package/src/common/constants.ts +3 -3
- package/src/common/help.ts +2 -1
- package/src/services/app.ts +3 -3
- package/src/services/editor.tsx +24 -16
- package/src/services/hot-reload.ts +3 -1
- package/src/services/utils/log.ts +2 -2
- package/src/services/utils/server-interface.ts +6 -0
- package/src/types/miqro.d.ts +2 -0
- package/src/types.ts +2 -0
package/src/bin/generate-doc.ts
CHANGED
|
@@ -16,28 +16,31 @@ export async function generateDocs(args: Arguments, logger: Logger, result: Infl
|
|
|
16
16
|
const fileMapAPIRouteList = Object.keys(fileMap).map(f => fileMap[f]).filter(fMap => fMap.previewMethod === "api").map(fMap => fMap.routes);
|
|
17
17
|
|
|
18
18
|
const jsonDoc = router.getJSONDoc();
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
19
|
+
|
|
20
|
+
if (!args.generateDocAll) {
|
|
21
|
+
Object.keys(jsonDoc).forEach(path => {
|
|
22
|
+
const methods = Object.keys(jsonDoc[path]);
|
|
23
|
+
methods.forEach(method => {
|
|
24
|
+
const data = jsonDoc[path][method];
|
|
25
|
+
//console.log("[%s] [%s]", path, method);
|
|
26
|
+
|
|
27
|
+
if (fileMapAPIRouteList.filter(f => {
|
|
28
|
+
for (const r of f) {
|
|
29
|
+
if (r.method === String(method).toUpperCase() && r.path === path) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
29
32
|
}
|
|
33
|
+
return false;
|
|
34
|
+
}).length === 0) {
|
|
35
|
+
//console.log("DELETE [%s] [%s]", path, method);
|
|
36
|
+
delete jsonDoc[path][method];
|
|
37
|
+
} else {
|
|
38
|
+
//console.log("KEEP [%s] [%s]", path, method);
|
|
30
39
|
}
|
|
31
|
-
return false;
|
|
32
|
-
}).length === 0) {
|
|
33
|
-
//console.log("DELETE [%s] [%s]", path, method);
|
|
34
|
-
delete jsonDoc[path][method];
|
|
35
|
-
} else {
|
|
36
|
-
//console.log("KEEP [%s] [%s]", path, method);
|
|
37
|
-
}
|
|
38
40
|
|
|
41
|
+
});
|
|
39
42
|
});
|
|
40
|
-
}
|
|
43
|
+
}
|
|
41
44
|
|
|
42
45
|
switch (args.generateDocType) {
|
|
43
46
|
case "JSON":
|
package/src/cluster.ts
CHANGED
|
@@ -5,17 +5,21 @@ import { dirname, resolve } from "node:path";
|
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
6
|
import { execSync } from "node:child_process";
|
|
7
7
|
import { parseArguments } from "./common/arguments.js";
|
|
8
|
+
import { checkEnvVariable } from "@miqro/core";
|
|
9
|
+
import { cpus } from "node:os";
|
|
8
10
|
|
|
9
11
|
const __package_dirname = import.meta.url ? resolve(dirname(fileURLToPath(import.meta.url))) : null;
|
|
10
12
|
|
|
11
13
|
//const usage = "CLUSTER_COUNT=os.cpus().length [CLUSTER_AUTO_BROADCAST=true|false] [CLUSTER_DISABLE_RESTART=true|false]";
|
|
12
14
|
|
|
15
|
+
const CLUSTER_COUNT = checkEnvVariable("CLUSTER_COUNT", String(cpus().length));
|
|
16
|
+
|
|
13
17
|
const args = parseArguments();
|
|
14
18
|
|
|
15
19
|
if (args.inflate || args.test || args.compile || args.installTSConfig || args.installTypes || args.migrateDown || args.migrateUp) {
|
|
16
20
|
await import("./main.js");
|
|
17
21
|
} else {
|
|
18
|
-
const CMD = `CLUSTER_AUTO_BROADCAST=true ${process.argv[0]} ${mainPath()} ${resolve(__package_dirname, "main.js")} ${process.argv.slice(2).join(" ")}`;
|
|
22
|
+
const CMD = `CLUSTER_COUNT=${CLUSTER_COUNT} CLUSTER_AUTO_BROADCAST=true ${process.argv[0]} ${mainPath()} ${resolve(__package_dirname, "main.js")} ${process.argv.slice(2).join(" ")}`;
|
|
19
23
|
|
|
20
24
|
console.log(CMD);
|
|
21
25
|
|
package/src/common/arguments.ts
CHANGED
|
@@ -23,6 +23,7 @@ export interface Arguments {
|
|
|
23
23
|
inflate: boolean;
|
|
24
24
|
generateDoc: boolean;
|
|
25
25
|
generateDocOut: string;
|
|
26
|
+
generateDocAll: boolean;
|
|
26
27
|
generateDocType: "JSON" | "MD";
|
|
27
28
|
migrateUp: boolean;
|
|
28
29
|
migrateDown: boolean;
|
|
@@ -46,6 +47,7 @@ export function parseArguments(): Arguments {
|
|
|
46
47
|
installTSConfig: boolean | null;
|
|
47
48
|
inflate: boolean | null;
|
|
48
49
|
generateDoc: boolean | null;
|
|
50
|
+
generateDocAll: boolean | null;
|
|
49
51
|
generateDocOut?: string | null;
|
|
50
52
|
generateDocType?: string | null;
|
|
51
53
|
test: boolean;
|
|
@@ -67,6 +69,7 @@ export function parseArguments(): Arguments {
|
|
|
67
69
|
test: null,
|
|
68
70
|
inflate: null,
|
|
69
71
|
generateDoc: null,
|
|
72
|
+
generateDocAll: null,
|
|
70
73
|
generateDocOut: null,
|
|
71
74
|
generateDocType: null,
|
|
72
75
|
editor: null,
|
|
@@ -120,6 +123,14 @@ export function parseArguments(): Arguments {
|
|
|
120
123
|
}
|
|
121
124
|
flags.generateDoc = true;
|
|
122
125
|
continue;
|
|
126
|
+
case "--generate-doc-all":
|
|
127
|
+
if (flags.generateDocAll !== null) {
|
|
128
|
+
console.error("bad arguments.");
|
|
129
|
+
console.error(usage);
|
|
130
|
+
process.exit(EXIT_CODES.BAD_ARGUMENTS);
|
|
131
|
+
}
|
|
132
|
+
flags.generateDocAll = true;
|
|
133
|
+
continue;
|
|
123
134
|
case "--generate-doc-out":
|
|
124
135
|
if (flags.generateDocOut !== null) {
|
|
125
136
|
console.error("bad arguments. --generate-doc-out already set.");
|
|
@@ -343,7 +354,7 @@ export function parseArguments(): Arguments {
|
|
|
343
354
|
process.exit(EXIT_CODES.BAD_ARGUMENTS);
|
|
344
355
|
}
|
|
345
356
|
|
|
346
|
-
if ((flags.generateDocOut || flags.generateDocType) && !flags.generateDoc) {
|
|
357
|
+
if ((flags.generateDocAll || flags.generateDocOut || flags.generateDocType) && !flags.generateDoc) {
|
|
347
358
|
console.error("bad arguments. cannot use without --generate-doc");
|
|
348
359
|
process.exit(EXIT_CODES.BAD_ARGUMENTS);
|
|
349
360
|
}
|
|
@@ -351,6 +362,7 @@ export function parseArguments(): Arguments {
|
|
|
351
362
|
const generateDocType = flags.generateDocType ? flags.generateDocType as any : "MD";
|
|
352
363
|
|
|
353
364
|
return {
|
|
365
|
+
generateDocAll: flags.generateDocAll ? true : false,
|
|
354
366
|
hotreload: flags.hotreload ? true : false,
|
|
355
367
|
installTypes: flags.installTypes ? true : false,
|
|
356
368
|
installTSConfig: flags.installTSConfig ? true : false,
|
package/src/common/constants.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { checkEnvVariable } from "@miqro/core";
|
|
2
|
-
|
|
3
1
|
export const EXIT_CODES = {
|
|
4
2
|
BAD_ARGUMENTS: 10,
|
|
5
3
|
NORMAL_EXIT: 0,
|
|
@@ -9,10 +7,12 @@ export const EXIT_CODES = {
|
|
|
9
7
|
TEST_FAILED: 30,
|
|
10
8
|
}
|
|
11
9
|
|
|
12
|
-
export const CLEAR_JSX_CACHE =
|
|
10
|
+
export const CLEAR_JSX_CACHE = (process.env["CLEAR_JSX_CACHE"] !== undefined ? process.env["CLEAR_JSX_CACHE"] : "1") === "1";
|
|
13
11
|
|
|
14
12
|
export const EDITOR_CONFIG_KEY = "$$editor$$";
|
|
15
13
|
|
|
14
|
+
export const HOT_RELOAD_PATH = "/hot-reload";
|
|
15
|
+
|
|
16
16
|
//export const SERVER_IDENTIFIER = cluster.isPrimary ? "SERVER" : process.env["CLUSTER_NODE_NUMBER"] ? `WORKER_${process.env["CLUSTER_NODE_NUMBER"]}` : "WORKER";
|
|
17
17
|
|
|
18
18
|
//export const DB_IDENTIFIER = cluster.isPrimary ? "DATABASE" : process.env["CLUSTER_NODE_NUMBER"] ? `WORKER_${process.env["CLUSTER_NODE_NUMBER"]}_DATABASE` : "WORKER_DATABASE";
|
package/src/common/help.ts
CHANGED
|
@@ -18,7 +18,7 @@ export const help = `
|
|
|
18
18
|
|
|
19
19
|
-v, --version\t\toutputs the version number
|
|
20
20
|
-h, --help\t\toutputs this page.
|
|
21
|
-
--watch\t\tuse to enable the hot-reload functionality.
|
|
21
|
+
--watch\t\t\tuse to enable the hot-reload functionality.
|
|
22
22
|
--test\t\t\trun the tests for a service.
|
|
23
23
|
--migrate-up\t\tmigrations up.
|
|
24
24
|
--migrate-down\t\tmigrations down.
|
|
@@ -28,6 +28,7 @@ export const help = `
|
|
|
28
28
|
--generate-doc\t\tgenerates a documentation for the api endpoints of the service.
|
|
29
29
|
--generate-doc-out\tthe output file for the generated documentation. default value is API.md.
|
|
30
30
|
--generate-doc-type\tthe format of the generated documentation. it can be JSON or MD. default value is MD.
|
|
31
|
+
--generate-doc-all\toutputs all the server routes in the documentation output.
|
|
31
32
|
--compile\t\tinflates the application and tries to create a NODE SEA binary.
|
|
32
33
|
--inflate-sea\t\tinflates the application with sea compilation scripts.
|
|
33
34
|
--install-tsconfig\tcreates a tsconfig.json configured to use with --install-types.
|
package/src/services/app.ts
CHANGED
|
@@ -14,7 +14,7 @@ import editorServerConfig from "../../editor/server.js";
|
|
|
14
14
|
|
|
15
15
|
import { ClusterCache } from "./utils/cluster-cache.js";
|
|
16
16
|
import { createEditorRouter } from "./editor.js";
|
|
17
|
-
import { EDITOR_CONFIG_KEY } from "../common/constants.js";
|
|
17
|
+
import { EDITOR_CONFIG_KEY, HOT_RELOAD_PATH } from "../common/constants.js";
|
|
18
18
|
import { watchAndServer } from "../common/watch.js";
|
|
19
19
|
import { LocalCache } from "./utils/cache.js";
|
|
20
20
|
import { initGlobals } from "./globals.js";
|
|
@@ -325,9 +325,9 @@ export class Miqro {
|
|
|
325
325
|
}
|
|
326
326
|
|
|
327
327
|
if (this.options?.hotreload/* && !options?.inflateTests*/) {
|
|
328
|
-
this.logger?.debug("setting up websocket on [
|
|
328
|
+
this.logger?.debug("setting up websocket on [%s]", HOT_RELOAD_PATH);
|
|
329
329
|
wsConfigList.push({
|
|
330
|
-
path:
|
|
330
|
+
path: HOT_RELOAD_PATH
|
|
331
331
|
});
|
|
332
332
|
}
|
|
333
333
|
|
package/src/services/editor.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { APIRoute, Handler, Router, RouterHandlerOptions, SessionHandler } from "@miqro/core";
|
|
1
|
+
import { APIRoute, Handler, HandlerWithOptions, Router, RouterHandlerOptions, SessionHandler } from "@miqro/core";
|
|
2
2
|
import { getAsset } from "../common/assets.js";
|
|
3
3
|
|
|
4
4
|
import { BASEEDITOR_PATH } from "../../editor/common/constants.js";
|
|
@@ -17,8 +17,9 @@ import { CONTENT_TYPE_MAP } from "../common/content-type.js";
|
|
|
17
17
|
|
|
18
18
|
export async function createEditorRouter(adminInterface: EditorAdminInterface): Promise<Router> {
|
|
19
19
|
const router = new Router();
|
|
20
|
+
const innerRouter = new Router();
|
|
20
21
|
|
|
21
|
-
|
|
22
|
+
innerRouter.use(async (req: AdminRequest, res) => {
|
|
22
23
|
res.setHeader("x-uuid", req.uuid);
|
|
23
24
|
req.editor = adminInterface;
|
|
24
25
|
});
|
|
@@ -39,21 +40,23 @@ export async function createEditorRouter(adminInterface: EditorAdminInterface):
|
|
|
39
40
|
|
|
40
41
|
const { EditorIndex } = await import("../../editor/common/editor-index.js");
|
|
41
42
|
|
|
42
|
-
|
|
43
|
+
innerRouter.use(authHandler);
|
|
43
44
|
|
|
44
|
-
|
|
45
|
+
innerRouter.post(`/api/fs/write`, getHandler(/*authHandler, */writeAPI));
|
|
45
46
|
|
|
46
|
-
|
|
47
|
+
innerRouter.post(`/api/fs/rename`, getHandler(/*authHandler, */renameAPI));
|
|
47
48
|
|
|
48
|
-
|
|
49
|
+
innerRouter.post(`/api/fs/read`, getHandler(/*authHandler, */readAPI));
|
|
49
50
|
|
|
50
|
-
|
|
51
|
+
innerRouter.post(`/api/fs/delete`, getHandler(/*authHandler, */deleteAPI));
|
|
51
52
|
|
|
52
|
-
|
|
53
|
+
innerRouter.get(`/api/fs/scan`, getHandler(/*authHandler, */scanAPI));
|
|
53
54
|
|
|
54
|
-
|
|
55
|
+
innerRouter.post(`/api/server/restart`, getHandler(/*authHandler, */restartAPI));
|
|
55
56
|
|
|
56
|
-
|
|
57
|
+
innerRouter.post(`/api/server/reload`, getHandler(/*authHandler, */reloadAPI));
|
|
58
|
+
|
|
59
|
+
innerRouter.get(`/font.ttf`, async (_req, res) => {
|
|
57
60
|
return await res.asyncEnd({
|
|
58
61
|
status: 200,
|
|
59
62
|
headers: {
|
|
@@ -63,14 +66,16 @@ export async function createEditorRouter(adminInterface: EditorAdminInterface):
|
|
|
63
66
|
})
|
|
64
67
|
});
|
|
65
68
|
|
|
66
|
-
|
|
69
|
+
innerRouter.get("/", EditorIndex(editorCSS, editorJS, false));
|
|
67
70
|
|
|
68
71
|
|
|
69
72
|
|
|
70
|
-
|
|
73
|
+
innerRouter.use(async (req: AdminRequest, res) => {
|
|
71
74
|
delete req.editor;
|
|
72
75
|
});
|
|
73
76
|
|
|
77
|
+
router.use(innerRouter, BASEEDITOR_PATH);
|
|
78
|
+
|
|
74
79
|
return router;
|
|
75
80
|
}
|
|
76
81
|
|
|
@@ -84,10 +89,13 @@ function getHandlerOptions(router: APIRoute): RouterHandlerOptions {
|
|
|
84
89
|
};
|
|
85
90
|
}
|
|
86
91
|
|
|
87
|
-
function getHandler(auth: Handler, router: APIRoute):
|
|
88
|
-
const ret = new Router();
|
|
92
|
+
function getHandler(/*auth: Handler, */router: APIRoute): HandlerWithOptions {
|
|
93
|
+
/*const ret = new Router();
|
|
89
94
|
ret.use(auth);
|
|
90
95
|
ret.use(router.handler, undefined, undefined, getHandlerOptions(router));
|
|
91
|
-
return ret
|
|
92
|
-
|
|
96
|
+
return ret;*/
|
|
97
|
+
return {
|
|
98
|
+
...getHandlerOptions(router),
|
|
99
|
+
handler: router.handler as Handler
|
|
100
|
+
}
|
|
93
101
|
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
//import { checkEnvVariable } from "@miqro/core";
|
|
2
2
|
|
|
3
|
+
import { HOT_RELOAD_PATH } from "../common/constants.js";
|
|
4
|
+
|
|
3
5
|
export function getHotReloadScript() {
|
|
4
6
|
const HOT_RELOAD_JS_SCRIPT = `
|
|
5
7
|
// Create WebSocket connection.
|
|
6
8
|
|
|
7
9
|
function getSocket() {
|
|
8
|
-
return new WebSocket("
|
|
10
|
+
return new WebSocket("${HOT_RELOAD_PATH}");
|
|
9
11
|
}
|
|
10
12
|
|
|
11
13
|
const socket = getSocket();
|
|
@@ -40,9 +40,9 @@ export class LogProvider {
|
|
|
40
40
|
} catch (e) {
|
|
41
41
|
urlParsingError = e;
|
|
42
42
|
}
|
|
43
|
-
const pathToEnv = path.replace(/\//ig, "_").toUpperCase();
|
|
43
|
+
const pathToEnv = path.replace(/\//ig, "_").replace(/\./ig, "_").replace(/-/ig, "_").toUpperCase();
|
|
44
44
|
const WORKER_IDENTIFIER = process.env["CLUSTER_NODE_NUMBER"] ? `WORKER_${process.env["CLUSTER_NODE_NUMBER"]}_` : "";
|
|
45
|
-
const identifier = `${pathToEnv === "_" ? "" : `${pathToEnv.substring(1)}`}${method.toUpperCase()}`;
|
|
45
|
+
const identifier = `${pathToEnv === "_" ? "" : `${pathToEnv.substring(1)}`}${pathToEnv.charAt(pathToEnv.length - 1) !== "_" ? "_" : ""}${method.toUpperCase()}`;
|
|
46
46
|
const upgrade = req.headers.connection?.indexOf("Upgrade") !== -1;
|
|
47
47
|
|
|
48
48
|
const logger = this.getLogger(
|
|
@@ -144,6 +144,12 @@ export class ServerInterfaceImpl implements ServerInterface {
|
|
|
144
144
|
}
|
|
145
145
|
});
|
|
146
146
|
}
|
|
147
|
+
public getWorkerNumber(): number {
|
|
148
|
+
return cluster.isPrimary || process.env["CLUSTER_NODE_NUMBER"] === undefined ? 0 : parseInt(process.env["CLUSTER_NODE_NUMBER"], 10);
|
|
149
|
+
}
|
|
150
|
+
public getWorkerCount(): number {
|
|
151
|
+
return cluster.isPrimary || process.env["CLUSTER_NODE_NUMBER"] === undefined || process.env["CLUSTER_COUNT"] === undefined ? 1 : parseInt(process.env["CLUSTER_COUNT"], 10);
|
|
152
|
+
}
|
|
147
153
|
public isPrimaryWorker(): boolean {
|
|
148
154
|
return cluster.isPrimary || process.env["CLUSTER_NODE_NUMBER"] === "0";
|
|
149
155
|
}
|
package/src/types/miqro.d.ts
CHANGED
|
@@ -94,6 +94,8 @@ export interface ServerInterface {
|
|
|
94
94
|
localCache: CacheInterface;
|
|
95
95
|
logger: Logger;
|
|
96
96
|
isPrimaryWorker: () => boolean;
|
|
97
|
+
getWorkerNumber: () => number;
|
|
98
|
+
getWorkerCount: () => number;
|
|
97
99
|
openBrowser: (path: string) => void;
|
|
98
100
|
getLogger: (identifier: string, options?: { level?: any; transports?: any[]; formatter?: any; }) => Logger;
|
|
99
101
|
}
|
package/src/types.ts
CHANGED
|
@@ -107,6 +107,8 @@ export interface ServerInterface {
|
|
|
107
107
|
localCache: CacheInterface;
|
|
108
108
|
logger?: Logger;
|
|
109
109
|
isPrimaryWorker: () => boolean;
|
|
110
|
+
getWorkerNumber: () => number;
|
|
111
|
+
getWorkerCount: () => number;
|
|
110
112
|
openBrowser: (path: string) => void;
|
|
111
113
|
getLogger: (identifier: string, options?: { level?: any; transports?: any[]; formatter?: any; }) => Logger;
|
|
112
114
|
}
|