miqro 6.1.2 → 6.1.4

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 (175) hide show
  1. package/build/editor.bundle.js +16 -0
  2. package/build/esm/editor/auth.d.ts +6 -0
  3. package/build/esm/editor/auth.js +41 -0
  4. package/build/esm/editor/common/admin-interface.d.ts +36 -0
  5. package/build/esm/editor/common/admin-interface.js +44 -0
  6. package/build/esm/editor/common/constants.d.ts +4 -0
  7. package/build/esm/editor/common/constants.js +20 -0
  8. package/build/esm/editor/common/constants.server.d.ts +2 -0
  9. package/build/esm/editor/common/constants.server.js +4 -0
  10. package/build/esm/editor/common/editor-index.d.ts +2 -0
  11. package/build/esm/editor/common/editor-index.js +14 -0
  12. package/build/esm/editor/common/html-encode.d.ts +1 -0
  13. package/build/esm/editor/common/html-encode.js +14 -0
  14. package/build/esm/editor/common/log-socket.d.ts +15 -0
  15. package/build/esm/editor/common/log-socket.js +70 -0
  16. package/build/esm/editor/common/templates.d.ts +11 -0
  17. package/build/esm/editor/common/templates.js +477 -0
  18. package/build/esm/editor/components/api-preview.d.ts +11 -0
  19. package/build/esm/editor/components/api-preview.js +90 -0
  20. package/build/esm/editor/components/editor.d.ts +16 -0
  21. package/build/esm/editor/components/editor.js +357 -0
  22. package/build/esm/editor/components/file-browser.d.ts +37 -0
  23. package/build/esm/editor/components/file-browser.js +126 -0
  24. package/build/esm/editor/components/file-editor-toolbar.d.ts +22 -0
  25. package/build/esm/editor/components/file-editor-toolbar.js +93 -0
  26. package/build/esm/editor/components/file-editor.d.ts +32 -0
  27. package/build/esm/editor/components/file-editor.js +59 -0
  28. package/build/esm/editor/components/filter-query.d.ts +1 -0
  29. package/build/esm/editor/components/filter-query.js +22 -0
  30. package/build/esm/editor/components/highlight-text-area.d.ts +11 -0
  31. package/build/esm/editor/components/highlight-text-area.js +124 -0
  32. package/build/esm/editor/components/log-viewer.d.ts +6 -0
  33. package/build/esm/editor/components/log-viewer.js +69 -0
  34. package/build/esm/editor/components/new-file.d.ts +10 -0
  35. package/build/esm/editor/components/new-file.js +117 -0
  36. package/build/esm/editor/components/scroll-query.d.ts +7 -0
  37. package/build/esm/editor/components/scroll-query.js +21 -0
  38. package/build/esm/editor/components/start-page.d.ts +13 -0
  39. package/build/esm/editor/components/start-page.js +30 -0
  40. package/build/esm/editor/http/admin/editor/api/fs/delete.api.d.ts +3 -0
  41. package/build/esm/editor/http/admin/editor/api/fs/delete.api.js +29 -0
  42. package/build/esm/editor/http/admin/editor/api/fs/read.api.d.ts +5 -0
  43. package/build/esm/editor/http/admin/editor/api/fs/read.api.js +49 -0
  44. package/build/esm/editor/http/admin/editor/api/fs/rename.api.d.ts +4 -0
  45. package/build/esm/editor/http/admin/editor/api/fs/rename.api.js +39 -0
  46. package/build/esm/editor/http/admin/editor/api/fs/scan.api.d.ts +26 -0
  47. package/build/esm/editor/http/admin/editor/api/fs/scan.api.js +149 -0
  48. package/build/esm/editor/http/admin/editor/api/fs/write.api.d.ts +3 -0
  49. package/build/esm/editor/http/admin/editor/api/fs/write.api.js +38 -0
  50. package/build/esm/editor/http/admin/editor/api/server/reload.api.d.ts +10 -0
  51. package/build/esm/editor/http/admin/editor/api/server/reload.api.js +46 -0
  52. package/build/esm/editor/http/admin/editor/api/server/restart.api.d.ts +10 -0
  53. package/build/esm/editor/http/admin/editor/api/server/restart.api.js +45 -0
  54. package/build/esm/editor/http/admin/editor/editor.d.ts +1 -0
  55. package/build/esm/editor/http/admin/editor/editor.js +7 -0
  56. package/build/esm/editor/http/admin/editor/index.api.d.ts +3 -0
  57. package/build/esm/editor/http/admin/editor/index.api.js +21 -0
  58. package/build/esm/editor/server.d.ts +3 -0
  59. package/build/esm/editor/server.js +49 -0
  60. package/build/esm/editor/ws.d.ts +3 -0
  61. package/build/esm/editor/ws.js +11 -0
  62. package/build/esm/src/bin/types.js +8 -0
  63. package/build/esm/src/common/arguments.d.ts +7 -1
  64. package/build/esm/src/common/arguments.js +72 -10
  65. package/build/esm/src/common/help.d.ts +1 -1
  66. package/build/esm/src/common/help.js +33 -29
  67. package/build/esm/src/inflate/setup-ws.d.ts +1 -1
  68. package/build/esm/src/inflate/setup-ws.js +2 -2
  69. package/build/esm/src/main.js +3 -1
  70. package/build/esm/src/services/app.d.ts +2 -0
  71. package/build/esm/src/services/app.js +2 -2
  72. package/build/esm/src/services/utils/log-transport.d.ts +2 -2
  73. package/build/esm/src/services/utils/log-transport.js +8 -3
  74. package/build/esm/src/services/utils/server-interface.d.ts +1 -1
  75. package/build/esm/src/services/utils/server-interface.js +19 -14
  76. package/build/lib.cjs +23 -21
  77. package/editor/auth.ts +51 -0
  78. package/editor/common/admin-interface.ts +84 -0
  79. package/editor/common/constants.server.ts +5 -0
  80. package/editor/common/constants.ts +21 -0
  81. package/editor/common/editor-index.tsx +17 -0
  82. package/editor/common/html-encode.ts +14 -0
  83. package/editor/common/log-socket.tsx +85 -0
  84. package/editor/common/templates.ts +481 -0
  85. package/editor/components/api-preview.tsx +116 -0
  86. package/editor/components/editor.tsx +486 -0
  87. package/editor/components/file-browser.tsx +308 -0
  88. package/editor/components/file-editor-toolbar.tsx +191 -0
  89. package/editor/components/file-editor.tsx +122 -0
  90. package/editor/components/filter-query.tsx +22 -0
  91. package/editor/components/highlight-text-area.tsx +144 -0
  92. package/editor/components/log-viewer.tsx +110 -0
  93. package/editor/components/new-file.tsx +169 -0
  94. package/editor/components/scroll-query.tsx +22 -0
  95. package/editor/components/start-page.tsx +49 -0
  96. package/editor/http/admin/editor/api/fs/delete.api.tsx +32 -0
  97. package/editor/http/admin/editor/api/fs/read.api.tsx +55 -0
  98. package/editor/http/admin/editor/api/fs/rename.api.tsx +41 -0
  99. package/editor/http/admin/editor/api/fs/scan.api.tsx +181 -0
  100. package/editor/http/admin/editor/api/fs/write.api.tsx +41 -0
  101. package/editor/http/admin/editor/api/server/reload.api.ts +53 -0
  102. package/editor/http/admin/editor/api/server/restart.api.tsx +52 -0
  103. package/editor/http/admin/editor/editor.tsx +8 -0
  104. package/editor/http/admin/editor/index.api.tsx +39 -0
  105. package/editor/server.ts +57 -0
  106. package/editor/ws.ts +15 -0
  107. package/package.json +1 -1
  108. package/sea/install-nodejs.sh +1 -1
  109. package/sea/node.version.tag +1 -1
  110. package/src/bin/compile.ts +35 -0
  111. package/src/bin/doc-md.ts +210 -0
  112. package/src/bin/generate-doc.ts +64 -0
  113. package/src/bin/test.ts +92 -0
  114. package/src/bin/types.ts +29 -0
  115. package/src/cluster.ts +27 -0
  116. package/src/common/arguments.ts +576 -0
  117. package/src/common/assets.ts +128 -0
  118. package/src/common/checksum.ts +58 -0
  119. package/src/common/constants.ts +18 -0
  120. package/src/common/content-type.ts +84 -0
  121. package/src/common/esbuild.ts +94 -0
  122. package/src/common/exit.ts +91 -0
  123. package/src/common/fs.ts +17 -0
  124. package/src/common/help.ts +55 -0
  125. package/src/common/jsx.ts +512 -0
  126. package/src/common/paths.ts +158 -0
  127. package/src/common/watch.ts +85 -0
  128. package/src/inflate/inflate-sea.ts +206 -0
  129. package/src/inflate/inflate.ts +99 -0
  130. package/src/inflate/md.ts +25 -0
  131. package/src/inflate/setup-auth.ts +40 -0
  132. package/src/inflate/setup-cors.ts +40 -0
  133. package/src/inflate/setup-db.ts +115 -0
  134. package/src/inflate/setup-error.ts +43 -0
  135. package/src/inflate/setup-http.ts +655 -0
  136. package/src/inflate/setup-log.ts +44 -0
  137. package/src/inflate/setup-middleware.ts +46 -0
  138. package/src/inflate/setup-server-config.ts +47 -0
  139. package/src/inflate/setup-test.ts +23 -0
  140. package/src/inflate/setup-ws.ts +49 -0
  141. package/src/inflate/setup.doc.ts +68 -0
  142. package/src/inflate/utils/sea-utils.ts +14 -0
  143. package/src/lib.ts +19 -0
  144. package/src/main.ts +89 -0
  145. package/src/services/app.ts +660 -0
  146. package/src/services/editor.tsx +101 -0
  147. package/src/services/globals.ts +143 -0
  148. package/src/services/hot-reload.ts +48 -0
  149. package/src/services/migrations.ts +66 -0
  150. package/src/services/utils/admin-interface.ts +37 -0
  151. package/src/services/utils/cache.ts +88 -0
  152. package/src/services/utils/cluster-cache.ts +230 -0
  153. package/src/services/utils/cluster-ws.ts +197 -0
  154. package/src/services/utils/db-manager.ts +92 -0
  155. package/src/services/utils/get-route.ts +70 -0
  156. package/src/services/utils/log-transport.ts +81 -0
  157. package/src/services/utils/log.ts +92 -0
  158. package/src/services/utils/server-interface.ts +179 -0
  159. package/src/services/utils/websocketmanager.ts +149 -0
  160. package/src/types/@esbuild.d.ts +1 -0
  161. package/src/types/@miqro/core.d.ts +2 -0
  162. package/src/types/@miqro/jsx.d.ts +2 -0
  163. package/src/types/@miqro/parser.d.ts +2 -0
  164. package/src/types/@miqro/query.d.ts +2 -0
  165. package/src/types/@miqro/request.d.ts +2 -0
  166. package/src/types/@miqro/test.d.ts +2 -0
  167. package/src/types/@miqro.d.ts +1 -0
  168. package/src/types/@types.d.ts +1 -0
  169. package/src/types/browser.globals.d.ts +9 -0
  170. package/src/types/globals.d.ts +2 -0
  171. package/src/types/jsx.globals.d.ts +37 -0
  172. package/src/types/miqro.d.ts +129 -0
  173. package/src/types/postject.d.ts +1 -0
  174. package/src/types/server.globals.d.ts +72 -0
  175. package/src/types.ts +222 -0
@@ -0,0 +1,576 @@
1
+ import { checkEnvVariable } from "@miqro/core";
2
+ import { cp, existsSync, readFileSync, statSync } from "node:fs";
3
+ import { basename, dirname, join, relative, resolve } from "node:path";
4
+ import { cwd, env, platform, arch } from "node:process";
5
+
6
+ import { EXIT_CODES } from "./constants.js";
7
+ import { tmpdir } from "node:os";
8
+ import { randomUUID } from "node:crypto";
9
+ import { BIN_NAME, help, usage } from "./help.js";
10
+ import { getMiqroJSONPath, TEST_SOCKET } from "./paths.js";
11
+ import { isSea } from "node:sea";
12
+ import cluster from "node:cluster";
13
+ import { __package_dirname, getVersion } from "./assets.js";
14
+ import { Parser, Schema } from "@miqro/parser";
15
+
16
+ const parser = new Parser();
17
+
18
+ interface MiqroJSON {
19
+ services?: string[];
20
+ port?: string | number;
21
+ inflateDir?: string;
22
+ name?: string;
23
+ browser?: string | boolean;
24
+ logFile?: string | boolean;
25
+ editor?: boolean;
26
+ }
27
+
28
+ const MiqroJSONSchema: Schema<MiqroJSON> = {
29
+ type: "object",
30
+ properties: {
31
+ name: "string?",
32
+ services: "string[]?",
33
+ port: "number?|string?",
34
+ inflateDir: "string?",
35
+ browser: "boolean?|string?",
36
+ logFile: "boolean?|string?",
37
+ editor: "boolean?"
38
+ }
39
+ }
40
+
41
+ export function importMiqroJSON(inFile: string) {
42
+ const mod = JSON.parse(readFileSync(inFile).toString());
43
+ const module = parser.parse(mod, MiqroJSONSchema, basename(inFile));
44
+ if (module !== undefined) {
45
+ return module as MiqroJSON;
46
+ } else {
47
+ throw new Error(`error loading [${inFile}] undefined`);
48
+ }
49
+ }
50
+
51
+ export function getPORT() {
52
+ return checkEnvVariable("PORT", "8080");
53
+ }
54
+
55
+ export interface Arguments {
56
+ name?: string;
57
+ browser?: string | boolean;
58
+ logFile?: string | boolean;
59
+ installTypes: boolean;
60
+ installMiqroJSON: boolean;
61
+ installTSConfig: boolean;
62
+ test: boolean;
63
+ port: string;
64
+ inflate: boolean;
65
+ generateDoc: boolean;
66
+ generateDocOut: string;
67
+ miqroJSONPath: string | false;
68
+ disableMiqroJSON: boolean;
69
+ generateDocAll: boolean;
70
+ generateDocType: "JSON" | "MD";
71
+ migrateUp: boolean;
72
+ migrateDown: boolean;
73
+ compile: boolean;
74
+ inflateSEA: boolean;
75
+ inflateDir: string;
76
+ services: string[];
77
+ editor: boolean;
78
+ hotreload: boolean;
79
+ }
80
+
81
+ /**
82
+ * parse process.argv arguments
83
+ */
84
+ export function parseArguments(): Arguments {
85
+ //env["LOG_FILE"] = env["LOG_FILE"] ? env["LOG_FILE"] : "./server.log";
86
+
87
+
88
+ const args = cluster.isPrimary ? process.argv.slice(2, process.argv.length) : process.argv.slice(3, process.argv.length);
89
+ const flags: {
90
+ logFile: string | boolean | null;
91
+ browser: string | boolean | null;
92
+ name: string | null;
93
+ installTypes: boolean | null;
94
+ installMiqroJSON: boolean | null;
95
+ installTSConfig: boolean | null;
96
+ inflate: boolean | null;
97
+ port: string | null;
98
+ generateDoc: boolean | null;
99
+ generateDocAll: boolean | null;
100
+ miqroJSONPath: string | null;
101
+ disableMiqroJSON: boolean | null;
102
+ generateDocOut?: string | null;
103
+ generateDocType?: string | null;
104
+ test: boolean;
105
+ migrateUp: boolean | null;
106
+ migrateDown: boolean | null;
107
+ compile: boolean | null;
108
+ inflateSEA: boolean | null;
109
+ editor: boolean | null;
110
+ inflateDir?: string | null;
111
+ hotreload?: boolean | null;
112
+ } = {
113
+ name: null,
114
+ browser: null,
115
+ logFile: null,
116
+ hotreload: null,
117
+ miqroJSONPath: null,
118
+ installMiqroJSON: null,
119
+ disableMiqroJSON: null,
120
+ installTypes: null,
121
+ port: null,
122
+ installTSConfig: null,
123
+ migrateUp: null,
124
+ migrateDown: null,
125
+ inflateSEA: null,
126
+ compile: null,
127
+ test: null,
128
+ inflate: null,
129
+ generateDoc: null,
130
+ generateDocAll: null,
131
+ generateDocOut: null,
132
+ generateDocType: null,
133
+ editor: null,
134
+ inflateDir: null
135
+ };
136
+ const services: string[] = [];
137
+
138
+ for (let i = 0; i < args.length; i++) {
139
+ const argument = args[i];
140
+ switch (argument) {
141
+ case "-v":
142
+ case "--version":
143
+ const { VERSION, NODE_VERSION, ESBUILD_VERSION } = getVersion();
144
+ if (isSea()) {
145
+ console.log("version [%s]", VERSION);
146
+ console.log("Node.js version [%s]", NODE_VERSION);
147
+ console.log("esbuild version [%s]", ESBUILD_VERSION);
148
+ console.log("platform [%s-%s]", platform, arch);
149
+ } else {
150
+ const packageJSON = JSON.parse(readFileSync(resolve(__package_dirname, "package.json")).toString());
151
+ const VERSION = packageJSON.version;
152
+ console.log("version [%s]", VERSION);
153
+ }
154
+ process.exit(EXIT_CODES.NORMAL_EXIT);
155
+ case "-h":
156
+ case "--help":
157
+ console.log(usage);
158
+ console.log(help);
159
+ process.exit(EXIT_CODES.NORMAL_EXIT);
160
+ case "--disable-miqrojson":
161
+ if (flags.disableMiqroJSON !== null || flags.miqroJSONPath !== null) {
162
+ console.error("bad arguments.");
163
+ console.error(usage);
164
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
165
+ }
166
+ flags.disableMiqroJSON = true;
167
+ continue;
168
+ case "--config":
169
+ if (flags.miqroJSONPath !== null || flags.disableMiqroJSON !== null) {
170
+ console.error("bad arguments.");
171
+ console.error(usage);
172
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
173
+ }
174
+ const cPath = String(args[i + 1]).toUpperCase() as any;
175
+ if (typeof cPath !== "string") {
176
+ console.error("bad arguments. --config must be a string.");
177
+ console.error(usage);
178
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
179
+ }
180
+ flags.miqroJSONPath = cPath;
181
+ i++;
182
+ continue;
183
+ case "--install-tsconfig":
184
+ if (flags.inflate !== null || flags.installTSConfig !== null) {
185
+ console.error("bad arguments.");
186
+ console.error(usage);
187
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
188
+ }
189
+ flags.installTSConfig = true;
190
+ continue;
191
+ case "--watch":
192
+ if (flags.hotreload !== null) {
193
+ console.error("bad arguments.");
194
+ console.error(usage);
195
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
196
+ }
197
+ flags.hotreload = true;
198
+ continue;
199
+ case "--port":
200
+ if (flags.port !== null) {
201
+ console.error("bad arguments.");
202
+ console.error(usage);
203
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
204
+ }
205
+ const cPort = String(args[i + 1]) as any;
206
+ if (typeof cPort !== "string") {
207
+ console.error("bad arguments. --port must be a string.");
208
+ console.error(usage);
209
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
210
+ }
211
+ flags.port = cPort;
212
+ i++;
213
+ continue;
214
+ case "--name":
215
+ if (flags.name !== null) {
216
+ console.error("bad arguments.");
217
+ console.error(usage);
218
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
219
+ }
220
+ const cName = String(args[i + 1]).toUpperCase() as any;
221
+ if (typeof cName !== "string") {
222
+ console.error("bad arguments. --port must be a string.");
223
+ console.error(usage);
224
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
225
+ }
226
+ flags.name = cName;
227
+ i++;
228
+ continue;
229
+ case "--log-file":
230
+ if (flags.logFile !== null) {
231
+ console.error("bad arguments.");
232
+ console.error(usage);
233
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
234
+ }
235
+ const cLofFile = String(args[i + 1]) as any;
236
+ if (typeof cLofFile !== "string") {
237
+ console.error("bad arguments. --port must be a string.");
238
+ console.error(usage);
239
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
240
+ }
241
+ flags.logFile = cLofFile;
242
+ i++;
243
+ continue;
244
+ case "--browser":
245
+ if (flags.browser !== null) {
246
+ console.error("bad arguments.");
247
+ console.error(usage);
248
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
249
+ }
250
+ const cBrowser = String(args[i + 1]) as any;
251
+ if (typeof cBrowser !== "string") {
252
+ console.error("bad arguments. --port must be a string.");
253
+ console.error(usage);
254
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
255
+ }
256
+ flags.browser = cBrowser;
257
+ i++;
258
+ continue;
259
+ case "--generate-doc":
260
+ if (flags.generateDoc !== null) {
261
+ console.error("bad arguments.");
262
+ console.error(usage);
263
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
264
+ }
265
+ flags.generateDoc = true;
266
+ continue;
267
+ case "--generate-doc-all":
268
+ if (flags.generateDocAll !== null) {
269
+ console.error("bad arguments.");
270
+ console.error(usage);
271
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
272
+ }
273
+ flags.generateDocAll = true;
274
+ continue;
275
+ case "--generate-doc-out":
276
+ if (flags.generateDocOut !== null) {
277
+ console.error("bad arguments. --generate-doc-out already set.");
278
+ console.error(usage);
279
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
280
+ }
281
+ flags.generateDocOut = args[i + 1];
282
+ if (typeof flags.generateDocOut !== "string") {
283
+ console.error("bad arguments. --generate-doc-out missing value.");
284
+ console.error(usage);
285
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
286
+ }
287
+ i++;
288
+ continue;
289
+ case "--generate-doc-type":
290
+ if (flags.generateDocType !== null) {
291
+ console.error("bad arguments. --generate-doc-type already set.");
292
+ console.error(usage);
293
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
294
+ }
295
+ const gDt = String(args[i + 1]).toUpperCase() as any;
296
+ if (typeof gDt !== "string" || (gDt !== "JSON" && gDt !== "MD")) {
297
+ console.error("bad arguments. --generate-doc-type can be json or md.");
298
+ console.error(usage);
299
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
300
+ }
301
+ flags.generateDocType = gDt;
302
+ i++;
303
+ continue;
304
+ case "--compile":
305
+ if (flags.compile !== null) {
306
+ if (flags.inflateDir === null) {
307
+ flags.inflateDir = resolve(tmpdir(), `${BIN_NAME}-compile`, randomUUID());
308
+ }
309
+ console.error("bad arguments. --compile already set");
310
+ console.error(usage);
311
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
312
+ }
313
+ flags.compile = true;
314
+ flags.inflateSEA = true;
315
+ flags.inflate = true;
316
+ continue;
317
+ case "--install-types":
318
+ if (flags.inflate !== null || flags.installTypes !== null) {
319
+ console.error("bad arguments.");
320
+ console.error(usage);
321
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
322
+ }
323
+ flags.installTypes = true;
324
+ continue;
325
+ case "--editor":
326
+ if (flags.editor !== null) {
327
+ console.error("bad arguments.");
328
+ console.error(usage);
329
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
330
+ }
331
+ flags.editor = true;
332
+ continue;
333
+ case "--install-miqrojson":
334
+ if (flags.installMiqroJSON !== null) {
335
+ console.error("bad arguments. --install-miqrojson already set.");
336
+ console.error(usage);
337
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
338
+ }
339
+ flags.installMiqroJSON = true;
340
+ continue;
341
+ case "--inflate-sea":
342
+ if (flags.inflateSEA !== null) {
343
+ console.error("bad arguments. --inflate-sea already set.");
344
+ console.error(usage);
345
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
346
+ }
347
+ flags.inflateSEA = true;
348
+ continue;
349
+ case "--migrate-up":
350
+ if (flags.migrateUp !== null) {
351
+ console.error("bad arguments.");
352
+ console.error(usage);
353
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
354
+ }
355
+ flags.migrateUp = true;
356
+ continue;
357
+ case "--migrate-down":
358
+ if (flags.migrateDown !== null) {
359
+ console.error("bad arguments.");
360
+ console.error(usage);
361
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
362
+ }
363
+ flags.migrateDown = true;
364
+ continue;
365
+ case "--inflate":
366
+ if (flags.inflate !== null) {
367
+ console.error("bad arguments.");
368
+ console.error(usage);
369
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
370
+ }
371
+ flags.inflate = true;
372
+ continue;
373
+ case "--test":
374
+ if (flags.test !== null) {
375
+ console.error("bad arguments.");
376
+ console.error(usage);
377
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
378
+ }
379
+ env["BROWSER"] = env["BROWSER"] ? env["BROWSER"] : "none";
380
+ env["PORT"] = TEST_SOCKET;
381
+ flags.test = true;
382
+ continue;
383
+ case "--service":
384
+ if (args[i + 1] === undefined) {
385
+ console.error("bad arguments. service directory not provided.");
386
+ console.error(usage);
387
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
388
+ }
389
+ services.push(args[i + 1]);
390
+ i++;
391
+ continue;
392
+ case "--inflate-dir":
393
+ if (flags.inflateDir !== null && flags.compile === null) {
394
+ console.error("bad arguments. --inflate-dir already set.");
395
+ console.error(usage);
396
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
397
+ }
398
+ flags.inflateDir = args[i + 1];
399
+ if (typeof flags.inflateDir !== "string") {
400
+ console.error("bad arguments. inflate directory not provided.");
401
+ console.error(usage);
402
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
403
+ }
404
+ i++;
405
+ continue;
406
+ default:
407
+ //console.error("IGNORING bad arguments. [%s]", argument);
408
+ //continue;
409
+ console.error("bad argument. [%s]", argument);
410
+ console.error(usage);
411
+ console.log(help);
412
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
413
+ /*flags.inflate = flags.inflate ? flags.inflate : false;
414
+ flags.editor = flags.editor ? flags.editor : false;
415
+ flags.inflateDir = flags.inflateDir ? flags.inflateDir : undefined;
416
+ services.push(argument);
417
+ continue;*/
418
+ }
419
+ }
420
+
421
+ flags.inflate = flags.inflate ? flags.inflate : false;
422
+
423
+ flags.test = flags.test ? flags.test : false;
424
+ flags.inflateDir = flags.inflateDir ? flags.inflateDir : undefined;
425
+
426
+ const miqroJSONPath = !flags.disableMiqroJSON ? flags.miqroJSONPath ? resolve(flags.miqroJSONPath) : getMiqroJSONPath() : false;
427
+ const miqroRC = miqroJSONPath ? importMiqroJSON(miqroJSONPath) : {};
428
+
429
+ // try to load .miqrorc
430
+ if (!flags.disableMiqroJSON && miqroJSONPath) {
431
+ if (services.length === 0) {
432
+ if (miqroRC.services) {
433
+ for (const service of miqroRC.services) {
434
+ services.push(join(relative(cwd(), dirname(miqroJSONPath)), service));
435
+ }
436
+ }
437
+ }
438
+ if (flags.port === null) {
439
+ if (miqroRC.port) {
440
+ flags.port = String(miqroRC.port);
441
+ }
442
+ }
443
+ if (!flags.inflateDir && flags.inflate) {
444
+ if (miqroRC.inflateDir) {
445
+ flags.inflateDir = miqroRC.inflateDir;
446
+ }
447
+ }
448
+ if (flags.name === null) {
449
+ if (miqroRC.name) {
450
+ flags.name = miqroRC.name;
451
+ }
452
+ }
453
+ if (flags.logFile === null) {
454
+ if (miqroRC.logFile !== undefined) {
455
+ flags.logFile = miqroRC.logFile;
456
+ }
457
+ }
458
+ if (flags.browser === null) {
459
+ if (miqroRC.browser !== undefined) {
460
+ flags.browser = miqroRC.browser;
461
+ }
462
+ }
463
+ if (flags.editor === null) {
464
+ if (miqroRC.editor !== undefined) {
465
+ flags.editor = miqroRC.editor;
466
+ }
467
+ }
468
+ }
469
+
470
+ flags.editor = flags.editor ? flags.editor : false;
471
+
472
+ if (services.length === 0 && (!flags.installTSConfig && !flags.installTypes && !flags.installMiqroJSON)) {
473
+ flags.inflateDir = flags.inflateDir ? flags.inflateDir : undefined;
474
+ console.error(`bad arguments. missing --service argument`);
475
+ console.error(usage);
476
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
477
+ }
478
+
479
+ const notDirServices = services.filter(service => existsSync(resolve(process.cwd(), service)) && !statSync(resolve(process.cwd(), service)).isDirectory());
480
+
481
+ if (notDirServices.length > 0) {
482
+ console.error(`bad arguments. [${notDirServices.join(",")}] are not directories.`);
483
+ console.error(usage);
484
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
485
+ }
486
+
487
+ if (flags.inflateDir && existsSync(resolve(cwd(), flags.inflateDir)) && !statSync(resolve(cwd(), flags.inflateDir)).isDirectory()) {
488
+ console.error("bad arguments. inflate directory not a directory.");
489
+ console.error(usage);
490
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
491
+ }
492
+
493
+ if (!flags.inflate && flags.inflateDir) {
494
+ console.error("bad arguments. to use --inflate-dir you must use --inflate.");
495
+ console.error(usage);
496
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
497
+ }
498
+
499
+ if (flags.inflate === null || flags.inflateDir === null) {
500
+ console.error("for ts");
501
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
502
+ }
503
+
504
+ if (flags.inflate && flags.editor) {
505
+ console.error("bad arguments. cannot use --inflate with --editor");
506
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
507
+ }
508
+
509
+ if (flags.inflate && (flags.installTypes || flags.installTSConfig || flags.installMiqroJSON)) {
510
+ console.error("bad arguments. cannot use --inflate with --install-types, --install-tsconfig or --install-miqrojson");
511
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
512
+ }
513
+
514
+ if (flags.inflateSEA && !flags.inflate) {
515
+ console.error("bad arguments. cannot use --inflate-sea without --inflate");
516
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
517
+ }
518
+
519
+ if (flags.editor && (flags.installTypes || flags.installTSConfig || flags.installMiqroJSON)) {
520
+ console.error("bad arguments. cannot use --editor with--install-types, --install-tsconfig or --install-miqrojson");
521
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
522
+ }
523
+
524
+ if (flags.test && (flags.hotreload || flags.editor || flags.compile || flags.inflate)) {
525
+ console.error("bad arguments. cannot use --editor with --test");
526
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
527
+ }
528
+
529
+ if (flags.migrateUp && (flags.hotreload || flags.editor || flags.compile || flags.test || flags.migrateDown || flags.inflate)) {
530
+ console.error("bad arguments. cannot use with --migrate-up");
531
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
532
+ }
533
+
534
+ if (flags.migrateDown && (flags.hotreload || flags.editor || flags.compile || flags.test || flags.migrateUp || flags.inflate)) {
535
+ console.error("bad arguments. cannot use with --migrate-down");
536
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
537
+ }
538
+
539
+ if (flags.generateDoc && (flags.hotreload || flags.editor || flags.compile || flags.test || flags.migrateUp || flags.inflate || flags.migrateDown)) {
540
+ console.error("bad arguments. cannot use with --generate-doc");
541
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
542
+ }
543
+
544
+ if ((flags.generateDocAll || flags.generateDocOut || flags.generateDocType) && !flags.generateDoc) {
545
+ console.error("bad arguments. cannot use without --generate-doc");
546
+ process.exit(EXIT_CODES.BAD_ARGUMENTS);
547
+ }
548
+
549
+ const generateDocType = flags.generateDocType ? flags.generateDocType as any : "MD";
550
+
551
+ return {
552
+ name: flags.name ? flags.name : undefined,
553
+ browser: flags.browser !== null ? flags.browser : undefined,
554
+ logFile: flags.logFile !== null ? flags.logFile : undefined,
555
+ generateDocAll: flags.generateDocAll ? true : false,
556
+ hotreload: flags.hotreload ? true : false,
557
+ disableMiqroJSON: flags.disableMiqroJSON !== null ? flags.disableMiqroJSON : false,
558
+ miqroJSONPath: miqroJSONPath ? miqroJSONPath : false,
559
+ installTypes: flags.installTypes ? true : false,
560
+ installMiqroJSON: flags.installMiqroJSON ? true : false,
561
+ installTSConfig: flags.installTSConfig ? true : false,
562
+ inflate: flags.inflate,
563
+ port: flags.port ? flags.port : getPORT(),
564
+ migrateUp: flags.migrateUp ? true : false,
565
+ migrateDown: flags.migrateDown ? true : false,
566
+ test: flags.test ? true : false,
567
+ compile: flags.compile,
568
+ inflateSEA: flags.inflateSEA ? true : false,
569
+ inflateDir: flags.inflateDir ? resolve(process.cwd(), flags.inflateDir) : resolve(process.cwd(), "inflated"),
570
+ generateDoc: flags.generateDoc = flags.generateDoc ? flags.generateDoc : false,
571
+ generateDocOut: flags.generateDocOut ? resolve(process.cwd(), flags.generateDocOut) : generateDocType === "MD" ? resolve(process.cwd(), "API.md") : resolve(process.cwd(), "API.json"),
572
+ generateDocType,
573
+ services,
574
+ editor: flags.editor ? true : false
575
+ }
576
+ }
@@ -0,0 +1,128 @@
1
+ //import { createRequire } from 'node:module';
2
+ import { Logger, MinimalLogger } from "@miqro/core";
3
+ import { chmodSync, constants, existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
4
+ import { getAsset as seaGetAsset, isSea } from "node:sea";
5
+ import { dirname, resolve } from "node:path";
6
+ import { calculateChecksum, calculateChecksumFromBuffer } from "./checksum.js";
7
+ import { arch, cwd, platform } from "node:process";
8
+ import { fileURLToPath } from 'node:url';
9
+ import { initESBuild } from "./esbuild.js";
10
+ import { initJSXJS } from "./jsx.js";
11
+ //const require = createRequire(import.meta.url);
12
+
13
+ export const __package_dirname = import.meta.url ? resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "..", "..") : null;
14
+
15
+ const ASSETS_ROUTER = {
16
+ "lib.cjs": "build/lib.cjs",
17
+ "version.tag": "sea/version.tag",
18
+ "node.version.tag": "sea/node.version.tag",
19
+ "esbuild.version.tag": "sea/esbuild.version.tag",
20
+ "postject.base64.cjs": "build/postject.base64.cjs",
21
+ "sea.basic.config.json": "sea/basic-config.json",
22
+ "node.sh": "sea/node.sh",
23
+ "install-nodejs.sh": "sea/install-nodejs.sh",
24
+ "compile.base64.sh": "sea/basic-compile.base64.sh",
25
+ "sign-remove.sh": "sea/sign-remove.sh",
26
+ "sign-add.sh": "sea/sign-add.sh",
27
+ "app.sh": "sea/app.sh",
28
+ "jsx.dom.js": "build/jsx.dom.js",
29
+ "types.json": "sea/types.json",
30
+ "editor-assets/editor.bundle.js": "build/editor.bundle.js",
31
+ "editor-assets/style.css": "build/style.css",
32
+ "editor-assets/font.ttf": "build/font.ttf"
33
+ }
34
+
35
+ export function getAsset(key: string): ArrayBuffer {
36
+ if (isSea()) {
37
+ return seaGetAsset(key);
38
+ } else {
39
+ if (!ASSETS_ROUTER[key]) {
40
+ if (key === "esbuild-binary") {
41
+ if (__package_dirname === null) {
42
+ return readFileSync(resolve(`./sea/esbuild`));
43
+ } else {
44
+ //return readFileSync(resolve(__package_dirname, `./node_modules/@esbuild/${platform}-${arch}/bin/esbuild`));
45
+ const esBinaryPath = resolve(dirname(import.meta.resolve(`esbuild`).substring("file://".length)), "..", "..", "@esbuild", `${platform}-${arch}`);
46
+ return readFileSync(resolve(esBinaryPath, "bin", "esbuild"));
47
+ }
48
+ } else {
49
+ throw new Error("asset not registered!");
50
+ }
51
+ }
52
+ return readFileSync(resolve(__package_dirname, ASSETS_ROUTER[key]));
53
+ }
54
+ }
55
+
56
+ export function getVersion() {
57
+ const VERSION = !isSea() ? "" : Buffer.from(getAsset("version.tag")).toString().trim();
58
+ const NODE_VERSION = !isSea() ? "" : Buffer.from(getAsset("node.version.tag")).toString().trim();
59
+ const ESBUILD_VERSION = !isSea() ? "" : Buffer.from(getAsset("esbuild.version.tag")).toString().trim();
60
+ return {
61
+ VERSION,
62
+ NODE_VERSION,
63
+ ESBUILD_VERSION
64
+ }
65
+ }
66
+
67
+ export async function initAssets(logger: Logger) {
68
+ const { VERSION, NODE_VERSION, ESBUILD_VERSION } = getVersion();
69
+ if (isSea()) {
70
+ logger.debug("version [%s]", VERSION);
71
+ logger.debug("Node.js version [%s]", NODE_VERSION);
72
+ logger.debug("esbuild version [%s]", ESBUILD_VERSION);
73
+ }
74
+ logger.debug("platform [%s-%s]", platform, arch);
75
+ await Promise.all([initJSXJS(logger), initESBuild(logger)]);
76
+ }
77
+
78
+ export async function initTypes(logger: MinimalLogger) {
79
+ const typesJSON = JSON.parse(Buffer.from(getAsset("types.json")).toString("utf-8"));
80
+ await Promise.all(Object.keys(typesJSON).map(typeFile =>
81
+ initAsset(logger, resolve(cwd(), "." + typeFile), Buffer.from(typesJSON[typeFile], "base64"))
82
+ ));
83
+ }
84
+
85
+ export async function validateAsset(logger: MinimalLogger | undefined, path: string, internalChecksum: string): Promise<boolean> {
86
+ mkdirSync(dirname(path), {
87
+ recursive: true
88
+ });
89
+ if (existsSync(path)) {
90
+ logger?.trace("validating [%s]", path);
91
+ const checksum = await calculateChecksum(path);
92
+ //const internalChecksum = await calculateChecksumFromBuffer(buffer);
93
+ if (internalChecksum !== checksum) {
94
+ logger?.trace("invalid [%s] checksum", path);
95
+ return false;
96
+ } else {
97
+ logger?.trace("validated [%s]", path);
98
+ return true;
99
+ }
100
+ } else {
101
+ logger?.trace("invalid [%s] doesnt exists", path);
102
+ return false;
103
+ }
104
+ }
105
+
106
+ export async function initAsset(logger: MinimalLogger, path: string, buffer: Buffer, executable?: boolean, checksum?: Promise<string>, logInstallasInfo = true) {
107
+ const valid = await validateAsset(logger, path, checksum === undefined ? await calculateChecksumFromBuffer(buffer) : await checksum);
108
+ if (existsSync(path)) {
109
+ if (!valid) {
110
+ logger.info("updating [%s]", path);
111
+ unlinkSync(path);
112
+ writeFileSync(path, buffer);
113
+ if (executable) {
114
+ chmodSync(path, constants.S_IXUSR | constants.S_IRUSR | constants.S_IWUSR);
115
+ }
116
+ }
117
+ } else {
118
+ if (!logInstallasInfo) {
119
+ logger.debug("installing [%s]", path);
120
+ } else {
121
+ logger.info("installing [%s]", path);
122
+ }
123
+ writeFileSync(path, buffer);
124
+ if (executable) {
125
+ chmodSync(path, constants.S_IXUSR | constants.S_IRUSR | constants.S_IWUSR);
126
+ }
127
+ }
128
+ }