miqro 6.0.11 → 6.0.13

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.
Files changed (43) hide show
  1. package/README.md +2 -1
  2. package/build/esm/editor/common/constants.d.ts +1 -1
  3. package/build/esm/editor/common/constants.js +1 -1
  4. package/build/esm/editor/common/constants.js.map +1 -1
  5. package/build/esm/editor/server.js +1 -1
  6. package/build/esm/editor/server.js.map +1 -1
  7. package/build/esm/src/bin/generate-doc.js +20 -18
  8. package/build/esm/src/bin/generate-doc.js.map +1 -1
  9. package/build/esm/src/cluster.js +12 -4
  10. package/build/esm/src/cluster.js.map +1 -1
  11. package/build/esm/src/common/arguments.d.ts +1 -0
  12. package/build/esm/src/common/arguments.js +11 -1
  13. package/build/esm/src/common/arguments.js.map +1 -1
  14. package/build/esm/src/common/help.d.ts +1 -1
  15. package/build/esm/src/common/help.js +2 -1
  16. package/build/esm/src/common/help.js.map +1 -1
  17. package/build/esm/src/inflate/inflate-sea.js +4 -3
  18. package/build/esm/src/inflate/inflate-sea.js.map +1 -1
  19. package/build/esm/src/main.js +0 -0
  20. package/build/esm/src/services/editor.js +21 -14
  21. package/build/esm/src/services/editor.js.map +1 -1
  22. package/build/esm/src/services/utils/log.js +2 -2
  23. package/build/esm/src/services/utils/log.js.map +1 -1
  24. package/build/esm/src/services/utils/server-interface.d.ts +2 -0
  25. package/build/esm/src/services/utils/server-interface.js +7 -1
  26. package/build/esm/src/services/utils/server-interface.js.map +1 -1
  27. package/build/esm/src/types.d.ts +2 -0
  28. package/build/lib.cjs +140 -127
  29. package/editor/common/constants.ts +1 -1
  30. package/editor/http/admin/editor/style.css +1 -1
  31. package/editor/server.ts +1 -1
  32. package/package.json +4 -5
  33. package/sea/types.json +1 -1
  34. package/src/bin/generate-doc.ts +21 -18
  35. package/src/cluster.ts +12 -4
  36. package/src/common/arguments.ts +13 -1
  37. package/src/common/help.ts +2 -1
  38. package/src/inflate/inflate-sea.ts +4 -3
  39. package/src/services/editor.tsx +24 -16
  40. package/src/services/utils/log.ts +2 -2
  41. package/src/services/utils/server-interface.ts +7 -1
  42. package/src/types/miqro.d.ts +2 -0
  43. package/src/types.ts +2 -0
@@ -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
- Object.keys(jsonDoc).forEach(path => {
20
- const methods = Object.keys(jsonDoc[path]);
21
- methods.forEach(method => {
22
- const data = jsonDoc[path][method];
23
- //console.log("[%s] [%s]", path, method);
24
-
25
- if (fileMapAPIRouteList.filter(f => {
26
- for (const r of f) {
27
- if (r.method === String(method).toUpperCase() && r.path === path) {
28
- return true;
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,15 +5,23 @@ 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
 
13
- parseArguments();
15
+ const CLUSTER_COUNT = checkEnvVariable("CLUSTER_COUNT", String(cpus().length));
14
16
 
15
- const CMD = `CLUSTER_AUTO_BROADCAST=true ${process.argv[0]} ${mainPath()} ${resolve(__package_dirname, "main.js")} ${process.argv.slice(2).join(" ")}`;
17
+ const args = parseArguments();
16
18
 
17
- console.log(CMD);
19
+ if (args.inflate || args.test || args.compile || args.installTSConfig || args.installTypes || args.migrateDown || args.migrateUp) {
20
+ await import("./main.js");
21
+ } else {
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(" ")}`;
18
23
 
19
- execSync(CMD, { stdio: 'inherit' });
24
+ console.log(CMD);
25
+
26
+ execSync(CMD, { stdio: 'inherit' });
27
+ }
@@ -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,
@@ -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.
@@ -81,6 +81,7 @@ async function main() {
81
81
  localCache,
82
82
  logProvider,
83
83
  wsManager: webSocketManager,
84
+ logger: logProvider.getLogger("server"),
84
85
  dbManager,
85
86
  port: PORT
86
87
  });
@@ -91,7 +92,7 @@ async function main() {
91
92
  const app = new App({
92
93
  onUpgrade: webSocketManager.onUpgrade
93
94
  });
94
- ${SERVERCONFIGLIST ? `\n await Promise.all([${SERVERCONFIGLIST}].map(config=>config.preload(serverInterface)));\n` : ""}
95
+ ${SERVERCONFIGLIST ? `\n await Promise.all([${SERVERCONFIGLIST}].filter(config=>config.preload).map(config=>config.preload(serverInterface)));\n` : ""}
95
96
  app.use(ServerRequestHandler(serverInterface));
96
97
  app.use(LoggerHandler());
97
98
  ${services.map(service => {
@@ -105,11 +106,11 @@ async function main() {
105
106
  ${services.map(service => `
106
107
  app.use(await (await import("./${join(service, "api-router.js")}")).setupRouter());
107
108
  app.use(await (await import("./${join(service, "static-router.js")}")).setupRouter())`).join("\n")}
108
- ${SERVERCONFIGLIST ? `\n await Promise.all([${SERVERCONFIGLIST}].map(config=>config.load(serverInterface)));\n` : ""}
109
+ ${SERVERCONFIGLIST ? `\n await Promise.all([${SERVERCONFIGLIST}].filter(config=>config.load).map(config=>config.load(serverInterface)));\n` : ""}
109
110
 
110
111
 
111
112
  await app.listen(PORT);
112
- ${SERVERCONFIGLIST ? `\n await Promise.all([${SERVERCONFIGLIST}].map(config=>config.start(serverInterface)));` : ""}
113
+ ${SERVERCONFIGLIST ? `\n await Promise.all([${SERVERCONFIGLIST}].filter(config=>config.start).map(config=>config.start(serverInterface)));` : ""}
113
114
  }
114
115
  main().catch(e=>console.error(e));
115
116
  `
@@ -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
- router.use(async (req: AdminRequest, res) => {
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
- router.post(`${BASEEDITOR_PATH}/api/fs/write`, getHandler(authHandler, writeAPI));
43
+ innerRouter.use(authHandler);
43
44
 
44
- router.post(`${BASEEDITOR_PATH}/api/fs/rename`, getHandler(authHandler, renameAPI));
45
+ innerRouter.post(`/api/fs/write`, getHandler(/*authHandler, */writeAPI));
45
46
 
46
- router.post(`${BASEEDITOR_PATH}/api/fs/read`, getHandler(authHandler, readAPI));
47
+ innerRouter.post(`/api/fs/rename`, getHandler(/*authHandler, */renameAPI));
47
48
 
48
- router.post(`${BASEEDITOR_PATH}/api/fs/delete`, getHandler(authHandler, deleteAPI));
49
+ innerRouter.post(`/api/fs/read`, getHandler(/*authHandler, */readAPI));
49
50
 
50
- router.get(`${BASEEDITOR_PATH}/api/fs/scan`, getHandler(authHandler, scanAPI));
51
+ innerRouter.post(`/api/fs/delete`, getHandler(/*authHandler, */deleteAPI));
51
52
 
52
- router.post(`${BASEEDITOR_PATH}/api/server/restart`, getHandler(authHandler, restartAPI));
53
+ innerRouter.get(`/api/fs/scan`, getHandler(/*authHandler, */scanAPI));
53
54
 
54
- router.post(`${BASEEDITOR_PATH}/api/server/reload`, getHandler(authHandler, reloadAPI));
55
+ innerRouter.post(`/api/server/restart`, getHandler(/*authHandler, */restartAPI));
55
56
 
56
- router.get(`${BASEEDITOR_PATH}/font.ttf`, async (_req, res) => {
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
- router.get(BASEEDITOR_PATH, [authHandler, EditorIndex(editorCSS, editorJS, false)]);
69
+ innerRouter.get("/", EditorIndex(editorCSS, editorJS, false));
67
70
 
68
71
 
69
72
 
70
- router.use(async (req: AdminRequest, res) => {
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): Router {
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
  }
@@ -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(
@@ -103,7 +103,7 @@ export class ServerInterfaceImpl implements ServerInterface {
103
103
  constructor(options: ServerInterfaceImplOptions) {
104
104
  this.cache = options.cache;
105
105
  this.localCache = options.localCache;
106
- this.logger = options.logger;
106
+ this.logger = options.logger ? options.logger : options.loggerProvider ? options.loggerProvider.getLogger("server") : undefined;
107
107
  this.port = options.port;
108
108
 
109
109
  const dbManager = options.dbManager;
@@ -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
  }
@@ -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
  }