miqro 7.0.1 → 7.0.3

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 (148) hide show
  1. package/build/esm/editor/auth.d.ts +6 -0
  2. package/build/esm/editor/auth.js +41 -0
  3. package/build/esm/editor/common/admin-interface.d.ts +36 -0
  4. package/build/esm/editor/common/admin-interface.js +44 -0
  5. package/build/esm/editor/common/constants.d.ts +4 -0
  6. package/build/esm/editor/common/constants.js +20 -0
  7. package/build/esm/editor/common/constants.server.d.ts +2 -0
  8. package/build/esm/editor/common/constants.server.js +4 -0
  9. package/build/esm/editor/common/editor-index.d.ts +2 -0
  10. package/build/esm/editor/common/editor-index.js +14 -0
  11. package/build/esm/editor/common/html-encode.d.ts +1 -0
  12. package/build/esm/editor/common/html-encode.js +14 -0
  13. package/build/esm/editor/common/log-socket.d.ts +15 -0
  14. package/build/esm/editor/common/log-socket.js +71 -0
  15. package/build/esm/editor/common/templates.d.ts +11 -0
  16. package/build/esm/editor/common/templates.js +477 -0
  17. package/build/esm/editor/components/api-preview.d.ts +11 -0
  18. package/build/esm/editor/components/api-preview.js +92 -0
  19. package/build/esm/editor/components/editor.d.ts +16 -0
  20. package/build/esm/editor/components/editor.js +367 -0
  21. package/build/esm/editor/components/file-browser.d.ts +37 -0
  22. package/build/esm/editor/components/file-browser.js +127 -0
  23. package/build/esm/editor/components/file-editor-toolbar.d.ts +22 -0
  24. package/build/esm/editor/components/file-editor-toolbar.js +95 -0
  25. package/build/esm/editor/components/file-editor.d.ts +32 -0
  26. package/build/esm/editor/components/file-editor.js +61 -0
  27. package/build/esm/editor/components/filter-query.d.ts +1 -0
  28. package/build/esm/editor/components/filter-query.js +23 -0
  29. package/build/esm/editor/components/highlight-text-area.d.ts +11 -0
  30. package/build/esm/editor/components/highlight-text-area.js +127 -0
  31. package/build/esm/editor/components/log-viewer.d.ts +6 -0
  32. package/build/esm/editor/components/log-viewer.js +71 -0
  33. package/build/esm/editor/components/new-file.d.ts +10 -0
  34. package/build/esm/editor/components/new-file.js +119 -0
  35. package/build/esm/editor/components/scroll-query.d.ts +7 -0
  36. package/build/esm/editor/components/scroll-query.js +22 -0
  37. package/build/esm/editor/components/start-page.d.ts +13 -0
  38. package/build/esm/editor/components/start-page.js +32 -0
  39. package/build/esm/editor/http/admin/editor/api/fs/delete.api.d.ts +3 -0
  40. package/build/esm/editor/http/admin/editor/api/fs/delete.api.js +30 -0
  41. package/build/esm/editor/http/admin/editor/api/fs/read.api.d.ts +5 -0
  42. package/build/esm/editor/http/admin/editor/api/fs/read.api.js +50 -0
  43. package/build/esm/editor/http/admin/editor/api/fs/rename.api.d.ts +4 -0
  44. package/build/esm/editor/http/admin/editor/api/fs/rename.api.js +40 -0
  45. package/build/esm/editor/http/admin/editor/api/fs/scan.api.d.ts +26 -0
  46. package/build/esm/editor/http/admin/editor/api/fs/scan.api.js +150 -0
  47. package/build/esm/editor/http/admin/editor/api/fs/write.api.d.ts +3 -0
  48. package/build/esm/editor/http/admin/editor/api/fs/write.api.js +39 -0
  49. package/build/esm/editor/http/admin/editor/api/server/reload.api.d.ts +10 -0
  50. package/build/esm/editor/http/admin/editor/api/server/reload.api.js +46 -0
  51. package/build/esm/editor/http/admin/editor/api/server/restart.api.d.ts +10 -0
  52. package/build/esm/editor/http/admin/editor/api/server/restart.api.js +46 -0
  53. package/build/esm/editor/http/admin/editor/editor.d.ts +1 -0
  54. package/build/esm/editor/http/admin/editor/editor.js +8 -0
  55. package/build/esm/editor/http/admin/editor/index.api.d.ts +3 -0
  56. package/build/esm/editor/http/admin/editor/index.api.js +22 -0
  57. package/build/esm/editor/server.d.ts +3 -0
  58. package/build/esm/editor/server.js +49 -0
  59. package/build/esm/editor/ws.d.ts +3 -0
  60. package/build/esm/editor/ws.js +11 -0
  61. package/build/esm/src/inflate/inflate-sea.js +8 -1
  62. package/build/esm/src/services/app.js +7 -2
  63. package/build/lib.cjs +14 -3
  64. package/editor/auth.ts +51 -0
  65. package/editor/common/admin-interface.ts +84 -0
  66. package/editor/common/constants.server.ts +5 -0
  67. package/editor/common/constants.ts +21 -0
  68. package/editor/common/editor-index.tsx +17 -0
  69. package/editor/common/html-encode.ts +14 -0
  70. package/editor/common/log-socket.tsx +87 -0
  71. package/editor/common/templates.ts +481 -0
  72. package/editor/components/api-preview.tsx +118 -0
  73. package/editor/components/editor.tsx +496 -0
  74. package/editor/components/file-browser.tsx +311 -0
  75. package/editor/components/file-editor-toolbar.tsx +194 -0
  76. package/editor/components/file-editor.tsx +125 -0
  77. package/editor/components/filter-query.tsx +26 -0
  78. package/editor/components/highlight-text-area.tsx +148 -0
  79. package/editor/components/log-viewer.tsx +113 -0
  80. package/editor/components/new-file.tsx +172 -0
  81. package/editor/components/scroll-query.tsx +25 -0
  82. package/editor/components/start-page.tsx +52 -0
  83. package/editor/http/admin/editor/api/fs/delete.api.tsx +32 -0
  84. package/editor/http/admin/editor/api/fs/read.api.tsx +55 -0
  85. package/editor/http/admin/editor/api/fs/rename.api.tsx +41 -0
  86. package/editor/http/admin/editor/api/fs/scan.api.tsx +181 -0
  87. package/editor/http/admin/editor/api/fs/write.api.tsx +41 -0
  88. package/editor/http/admin/editor/api/server/reload.api.ts +53 -0
  89. package/editor/http/admin/editor/api/server/restart.api.tsx +52 -0
  90. package/editor/http/admin/editor/editor.tsx +10 -0
  91. package/editor/http/admin/editor/index.api.tsx +42 -0
  92. package/editor/server.ts +57 -0
  93. package/editor/ws.ts +15 -0
  94. package/package.json +2 -2
  95. package/src/bin/compile.ts +35 -0
  96. package/src/bin/doc-md.ts +210 -0
  97. package/src/bin/generate-doc.ts +64 -0
  98. package/src/bin/test.ts +92 -0
  99. package/src/bin/types.ts +34 -0
  100. package/src/cluster.ts +27 -0
  101. package/src/common/arguments.ts +762 -0
  102. package/src/common/assets.ts +148 -0
  103. package/src/common/checksum.ts +58 -0
  104. package/src/common/constants.ts +18 -0
  105. package/src/common/content-type.ts +84 -0
  106. package/src/common/esbuild.ts +102 -0
  107. package/src/common/exit.ts +91 -0
  108. package/src/common/fs.ts +82 -0
  109. package/src/common/help.ts +60 -0
  110. package/src/common/jsx.ts +562 -0
  111. package/src/common/jwt.ts +85 -0
  112. package/src/common/paths.ts +107 -0
  113. package/src/common/watch.ts +88 -0
  114. package/src/inflate/inflate-sea.ts +244 -0
  115. package/src/inflate/inflate.ts +101 -0
  116. package/src/inflate/md.ts +25 -0
  117. package/src/inflate/setup-auth.ts +41 -0
  118. package/src/inflate/setup-cors.ts +41 -0
  119. package/src/inflate/setup-db.ts +117 -0
  120. package/src/inflate/setup-error.ts +44 -0
  121. package/src/inflate/setup-http.ts +704 -0
  122. package/src/inflate/setup-log.ts +45 -0
  123. package/src/inflate/setup-middleware.ts +47 -0
  124. package/src/inflate/setup-server-config.ts +48 -0
  125. package/src/inflate/setup-test.ts +23 -0
  126. package/src/inflate/setup-ws.ts +50 -0
  127. package/src/inflate/setup.doc.ts +92 -0
  128. package/src/inflate/utils/sea-utils.ts +14 -0
  129. package/src/lib.ts +34 -0
  130. package/src/main.ts +101 -0
  131. package/src/services/app.ts +703 -0
  132. package/src/services/editor.tsx +101 -0
  133. package/src/services/globals.ts.ignore +186 -0
  134. package/src/services/hot-reload.ts +51 -0
  135. package/src/services/migrations.ts +68 -0
  136. package/src/services/utils/admin-interface.ts +37 -0
  137. package/src/services/utils/cache.ts +88 -0
  138. package/src/services/utils/cluster-cache.ts +230 -0
  139. package/src/services/utils/cluster-ws.ts +202 -0
  140. package/src/services/utils/db-manager.ts +92 -0
  141. package/src/services/utils/get-route.ts +70 -0
  142. package/src/services/utils/jwt.ts +25 -0
  143. package/src/services/utils/log-transport.ts +81 -0
  144. package/src/services/utils/log.ts +92 -0
  145. package/src/services/utils/middleware.ts +10 -0
  146. package/src/services/utils/server-interface.ts +122 -0
  147. package/src/services/utils/websocketmanager.ts +157 -0
  148. package/src/types.ts +307 -0
@@ -0,0 +1,562 @@
1
+ import { Runtime } from "@miqro/jsx";
2
+ import { createNodeRuntime } from "@miqro/jsx-node";
3
+ import { basename, dirname, extname, relative, resolve } from "node:path";
4
+ import { randomUUID } from "node:crypto";
5
+ import { Request, Response, CORSOptions, Logger, APIRoute } from "@miqro/core";
6
+ import { Parser, Schema } from "@miqro/parser";
7
+ import { APIRouteSchema, SessionHandlerOptionsSchema } from "@miqro/core";
8
+ import { cwd } from "node:process";
9
+
10
+ import { esBuild } from "./esbuild.js";
11
+ // import { assertGlobalTampered, browserJSXGlobals } from "../services/globals.js";
12
+ import { APIOptions, ServerConfig, WSConfig, AuthConfig, DBConfig, LogConfig, MiddlewareConfig, ErrorConfig, DocConfig } from "../types.js";
13
+ import { JSX_TMP_DIR } from "./paths.js";
14
+ import { CLEAR_JSX_CACHE } from "./constants.js";
15
+ import { getAsset, initAsset, validateAsset } from "./assets.js";
16
+ import { calculateChecksumFromBuffer } from "./checksum.js";
17
+ import { HandlerWithOptionsSchema, RouteOptionsSchema } from "@miqro/core/build/types.js";
18
+ import { Migration } from "@miqro/query";
19
+ import { mkdirASync, rmdirASync, unlinkASync, writeFileASync } from "./fs.js";
20
+
21
+ let jsxJSBuffer: null | Buffer = null; // Buffer.from(getAsset("jsx.dom.js"));
22
+ let jsxJSBufferChecksumPromise: null | Promise<string> = null; // calculateChecksumFromBuffer(jsxJSBuffer);
23
+
24
+ /*export async function initJSXJS(logger: Logger) {
25
+ jsxJSBuffer = jsxJSBuffer ? jsxJSBuffer : Buffer.from(getAsset("jsx.dom.js"));
26
+ jsxJSBufferChecksumPromise = jsxJSBufferChecksumPromise ? jsxJSBufferChecksumPromise : calculateChecksumFromBuffer(jsxJSBuffer);
27
+ return initAsset(logger, getJSXJSPath(), jsxJSBuffer, true, jsxJSBufferChecksumPromise, false);
28
+ }
29
+
30
+ export async function validateJSXJS(logger: Logger) {
31
+ const checksum = await jsxJSBufferChecksumPromise;
32
+ if (!checksum) {
33
+ throw new Error("error calculating checksum");
34
+ }
35
+ return validateAsset(logger, getJSXJSPath(), checksum);
36
+ }*/
37
+
38
+ export interface Dict<T> {
39
+ [key: string]: T | Dict<T>;
40
+ }
41
+
42
+ const parser = new Parser();
43
+
44
+ export interface InflateError {
45
+ filePath: string;
46
+ error: Error;
47
+ }
48
+
49
+ export interface InflateOptions {
50
+ // embemedJSX: boolean;
51
+ minify: boolean;
52
+ useExport: boolean;
53
+ platform?: string;
54
+ mainFields?: string;
55
+ external?: string[];
56
+ logger?: Logger | Console;
57
+ }
58
+
59
+ const DEFAULT_ESOPTION = {
60
+ platform: "neutral",
61
+ mainFields: "module,main",
62
+ // platform: "node",
63
+ bundle: true,
64
+ jsxFactory: "JSX.createElement",
65
+ jsxFragment: "JSX.Fragment"
66
+ };
67
+
68
+ function JSXTemplate(inFile: string/*, jsxPath: string | false = false*/, useExport = true): string {
69
+ // const PRE = ``;
70
+ // return `${jsxPath ? PRE : ""}\n${useExport ? `export * from "${inFile}";import * as lib from "${inFile}";export default lib.default;` : `import * as lib from "${inFile}"`}`;
71
+ return `${useExport ? `export * from "${inFile}";import * as lib from "${inFile}";export default lib.default;` : `import * as lib from "${inFile}"`}`;
72
+ }
73
+
74
+ export async function inflateJSX(inFile: string, options: InflateOptions): Promise<string> {
75
+ const tmpBuildDir = resolve(JSX_TMP_DIR, String(process.pid), "build", Date.now() + "-" + randomUUID());
76
+ const inFileTmp = resolve(tmpBuildDir, basename(inFile) + ".mjs");
77
+ //const jsxJSPath = getJSXJSPath();//resolve(tmpBuildDir, "jsx.js");
78
+ const logger = options.logger; //getLogger(`${SERVER_IDENTIFIER}_JSX`);
79
+
80
+ try {
81
+
82
+ // if (!options.embemedJSX) {
83
+ await mkdirASync(tmpBuildDir, {
84
+ recursive: true
85
+ });
86
+ await writeFileASync(inFileTmp, JSXTemplate(inFile/*, false*/, options.useExport));
87
+ //await writeFileASync(inFileTmp, browserJSXGlobals(relative(tmpBuildDir, inFile), false));
88
+ logger?.trace("inflating [%s] from [%s]. to change the import folder set JSX_TMP", relative(cwd(), inFile), dirname(relative(JSX_TMP_DIR, inFileTmp)));
89
+ const { outputFiles: [{ contents }] } = await esBuild({
90
+ ...DEFAULT_ESOPTION,
91
+ entryPoints: [inFileTmp],
92
+ minify: options.minify,
93
+ platform: options.platform !== undefined ? options.platform : DEFAULT_ESOPTION.platform,
94
+ mainFields: options.mainFields !== undefined ? options.mainFields : DEFAULT_ESOPTION.mainFields,
95
+ external: options.external ? options.external : undefined,
96
+ });
97
+ if (CLEAR_JSX_CACHE) {
98
+ logger?.trace("clearing cache at [%s] to change this behaivor set CLEAR_JSX_CACHE to 0", tmpBuildDir);
99
+ await unlinkASync(inFileTmp);
100
+ await rmdirASync(tmpBuildDir);
101
+ }
102
+ return contents;
103
+ /*} else {
104
+ await mkdirASync(tmpBuildDir, {
105
+ recursive: true
106
+ });
107
+ //await writeFileASync(jsxJSPath, Buffer.from(getAsset("jsx-dom-bundle")));
108
+ await writeFileASync(inFileTmp, browserJSXGlobals(inFile, false));
109
+ //await writeFileASync(inFileTmp, browserJSXGlobals(relative(tmpBuildDir, inFile), relative(tmpBuildDir, jsxJSPath)));
110
+ logger?.trace("inflating [%s] from [%s] with jsx.js embedded. to change the import folder set JSX_TMP", relative(cwd(), inFile), dirname(relative(JSX_TMP_DIR, inFileTmp)));
111
+ const { outputFiles: [{ contents }] } = await esBuild({
112
+ ...DEFAULT_ESOPTION,
113
+ entryPoints: [inFileTmp],
114
+ minify: options.minify,
115
+ platform: options.platform !== undefined ? options.platform : DEFAULT_ESOPTION.platform,
116
+ mainFields: options.mainFields !== undefined ? options.mainFields : DEFAULT_ESOPTION.mainFields,
117
+ external: options.external ? options.external : undefined
118
+ });
119
+ if (CLEAR_JSX_CACHE) {
120
+ logger?.trace("clearing cache at [%s] to change this behaivor set CLEAR_JSX_CACHE to 0", tmpBuildDir);
121
+ await unlinkASync(inFileTmp);
122
+ //await unlinkASync(jsxJSPath);
123
+ await rmdirASync(tmpBuildDir);
124
+ }
125
+ return contents;
126
+ }*/
127
+ } catch (e) {
128
+ logger?.error("error with: " + inFile);
129
+ logger?.error(e);
130
+ /*if (options.embemedJSX) {
131
+ if (CLEAR_JSX_CACHE) {
132
+ logger?.trace("clearing cache at [%s] to change this behaivor set CLEAR_JSX_CACHE to 0", tmpBuildDir);
133
+ await unlinkASync(inFileTmp);
134
+ //await unlinkASync(jsxJSPath);
135
+ await rmdirASync(tmpBuildDir);
136
+ } else {
137
+ //console.error("errors on: " + tmpBuildDir);
138
+ logger?.error("error with: %s", inFileTmp);
139
+ logger?.trace("NOT clearing cache. to change this behaivor set CLEAR_JSX_CACHE to 1", tmpBuildDir);
140
+ }
141
+ }*/
142
+ throw e;
143
+ }
144
+ }
145
+
146
+ export const APIOptionsSchema: Schema<APIOptions> = {
147
+ type: "object?",
148
+ properties: {
149
+ basePath: "string?",
150
+ path: "string?|string[]?",
151
+ method: "string?|string[]?",
152
+ parser: {
153
+ type: "object?",
154
+ properties: {
155
+ parse: "function"
156
+ },
157
+ mode: "add_extra"
158
+ },
159
+ middleware: "function[]!?",
160
+ session: {
161
+ type: "object?|function?",
162
+ properties: SessionHandlerOptionsSchema.properties
163
+ },
164
+ ...RouteOptionsSchema.properties
165
+ },
166
+ //mode:"add_extra"
167
+ };
168
+
169
+ export interface HTMLModule {
170
+ default: JSX.Element | ((req: Request | null, res: Response | null) => (Promise<JSX.Element> | JSX.Element));
171
+ apiOptions?: APIOptions;
172
+ }
173
+
174
+ export const HTMLModuleSchema: Schema<HTMLModule> = {
175
+ type: "object",
176
+ properties: {
177
+ default: {
178
+ type: "function|object"
179
+ },
180
+ apiOptions: APIOptionsSchema
181
+ },
182
+ //mode:"add_extra"
183
+ }
184
+
185
+ export type JSONModuleValue = string | object;
186
+
187
+ export interface JSONModule {
188
+ default: JSONModuleValue | ((req: Request | null, res: Response | null) => (Promise<JSONModuleValue> | JSONModuleValue));
189
+ apiOptions?: APIOptions;
190
+ }
191
+
192
+ export const JSONModuleSchema: Schema<JSONModule> = {
193
+ type: "object",
194
+ properties: {
195
+ default: {
196
+ type: "function|object|string"
197
+ },
198
+ apiOptions: APIOptionsSchema
199
+ },
200
+ //mode:"add_extra"
201
+ }
202
+
203
+ export const MigrationSchema: Schema<Migration> = {
204
+ type: "object",
205
+ properties: {
206
+ up: "function",
207
+ down: "function"
208
+ },
209
+ mode: "add_extra"
210
+ }
211
+
212
+ export const CORSOptionsSchema: Schema<CORSOptions> = {
213
+ type: "object",
214
+ properties: {
215
+ origins: "string[]?|string?",
216
+ validate: "function?",
217
+ methods: "string?",
218
+ preflightContinue: "boolean?"
219
+ },
220
+ //mode:"add_extra"
221
+ }
222
+
223
+ export const WSConfigSchema: Schema<WSConfig> = {
224
+ type: "object",
225
+ properties: {
226
+ path: "string",
227
+ disabled: "boolean?",
228
+ maxConnections: "number?",
229
+ validate: "function?",
230
+ onConnection: "function?",
231
+ onMessage: "function?",
232
+ onDisconnect: "function?"
233
+ },
234
+ //mode:"add_extra"
235
+ };
236
+
237
+ export const DBConfigSchema: Schema<DBConfig> = {
238
+ type: "object",
239
+ properties: {
240
+ url: "string?",
241
+ disabled: "boolean?",
242
+ storage: "string?",
243
+ dialect: "string?",
244
+ name: "string"
245
+ },
246
+ //mode:"add_extra"
247
+ }
248
+
249
+ export const ServerConfigSchema: Schema<ServerConfig> = {
250
+ type: "object",
251
+ properties: {
252
+ preload: "function?",
253
+ unload: "function?",
254
+ stop: "function?",
255
+ start: "function?",
256
+ load: "function?"
257
+ },
258
+ //mode:"add_extra"
259
+ };
260
+
261
+ export const LogConfigSchema: Schema<LogConfig> = {
262
+ type: "object",
263
+ properties: {
264
+ level: {
265
+ type: "enum?",
266
+ enumValues: ["error", "warn", "info", "debug", "trace", "none"]
267
+ },
268
+ replaceConsoleTransport: "boolean?",
269
+ replaceFileTransport: "boolean?",
270
+ write: "function"
271
+ },
272
+ //mode:"add_extra"
273
+ };
274
+
275
+ export const AuthConfigSchema: Schema<AuthConfig> = {
276
+ type: "object",
277
+ properties: {
278
+ ...SessionHandlerOptionsSchema.properties
279
+ },
280
+ //mode:"add_extra"
281
+ }
282
+
283
+ export const MiddlewareConfigSchema: Schema<MiddlewareConfig> = {
284
+ type: "object",
285
+ properties: {
286
+ middleware: {
287
+ type: "Array",
288
+ arrayType: "function|object",
289
+ required: false,
290
+ properties: {
291
+ ...HandlerWithOptionsSchema.properties
292
+ }
293
+ },
294
+ post: {
295
+ type: "Array",
296
+ arrayType: "function|object",
297
+ required: false,
298
+ properties: {
299
+ ...HandlerWithOptionsSchema.properties
300
+ }
301
+ }
302
+ },
303
+ }
304
+
305
+ export const ErrorConfigSchema: Schema<ErrorConfig> = {
306
+ type: "object",
307
+ properties: {
308
+ catch: {
309
+ type: "Array",
310
+ required: false,
311
+ arrayType: "function"
312
+ }
313
+ },
314
+ }
315
+
316
+ export const DocConfigSchema: Schema<DocConfig> = {
317
+ type: "object",
318
+ properties: {
319
+ publish: {
320
+ type: "dict?",
321
+ dictType: "object",
322
+ properties: {
323
+ type: {
324
+ type: "enum?",
325
+ enumValues: ["HTML", "MD", "JSON"]
326
+ },
327
+ all: "boolean?"
328
+ }
329
+ }
330
+ }
331
+ }
332
+
333
+ export async function importAPIRoute(inFile: string, logger?: Logger) {
334
+ const isCJS = extname(inFile) === ".cjs";
335
+ const mod = isCJS ? (await importJSXFile(inFile, logger)).default.default : (await importJSXFile(inFile, logger)).default;
336
+ const module = typeof mod === "function" ? { handler: mod } : parser.parse(mod, APIRouteSchema, basename(inFile));
337
+ if (module !== undefined) {
338
+ return module as APIRoute;
339
+ } else {
340
+ throw new Error(`error with module [${inFile}] undefined`);
341
+ }
342
+ }
343
+
344
+ export async function importMigrationModule(inFile: string, logger?: Logger) {
345
+ const isCJS = extname(inFile) === ".cjs";
346
+ const mod = isCJS ? (await importJSXFile(inFile, logger)).default.default : (await importJSXFile(inFile, logger)).default;
347
+ const module = parser.parse(mod, MigrationSchema, basename(inFile));
348
+ if (module !== undefined) {
349
+ return module;
350
+ } else {
351
+ throw new Error(`error with module [${inFile}] undefined`);
352
+ }
353
+ }
354
+
355
+ export async function importHTMLModule(inFile: string, logger?: Logger) {
356
+ const module = (await importJSXFile(inFile, logger));
357
+ parser.parse(module.default, HTMLModuleSchema.properties.default, `${basename(inFile)}.default`);
358
+ parser.parse(module.apiOptions, APIOptionsSchema, `${basename(inFile)}.apiOptions`);
359
+ if (module !== undefined) {
360
+ return module;
361
+ } else {
362
+ throw new Error(`error with module [${inFile}] undefined`);
363
+ }
364
+ }
365
+
366
+ export async function importJSONModule(inFile: string, logger?: Logger) {
367
+ const module = (await importJSXFile(inFile, logger));
368
+ parser.parse(module.default, JSONModuleSchema.properties.default, `${basename(inFile)}.default`);
369
+ parser.parse(module.apiOptions, APIOptionsSchema, `${basename(inFile)}.apiOptions`);
370
+ if (module !== undefined) {
371
+ return module;
372
+ } else {
373
+ throw new Error(`error with module [${inFile}] undefined`);
374
+ }
375
+ }
376
+
377
+ export async function importAuthModule(inFile: string, logger?: Logger) {
378
+ const isCJS = extname(inFile) === ".cjs";
379
+ const mod = isCJS ? (await importJSXFile(inFile, logger)).default.default : (await importJSXFile(inFile, logger)).default;
380
+
381
+ const module = parser.parse(mod, AuthConfigSchema, basename(inFile));
382
+ if (module !== undefined) {
383
+ return module;
384
+ } else {
385
+ throw new Error(`error with module [${inFile}] undefined`);
386
+ }
387
+ }
388
+
389
+ export async function importMiddlewareConfigModule(inFile: string, logger?: Logger) {
390
+ const isCJS = extname(inFile) === ".cjs";
391
+ const mod = isCJS ? (await importJSXFile(inFile, logger)).default.default : (await importJSXFile(inFile, logger)).default;
392
+
393
+ const module = parser.parse(mod, MiddlewareConfigSchema, basename(inFile));
394
+ if (module !== undefined) {
395
+ return module;
396
+ } else {
397
+ throw new Error(`error with module [${inFile}] undefined`);
398
+ }
399
+ }
400
+
401
+ export async function importErrorConfigModule(inFile: string, logger?: Logger) {
402
+ const isCJS = extname(inFile) === ".cjs";
403
+ const mod = isCJS ? (await importJSXFile(inFile, logger)).default.default : (await importJSXFile(inFile, logger)).default;
404
+
405
+ const module = parser.parse(mod, ErrorConfigSchema, basename(inFile));
406
+ if (module !== undefined) {
407
+ return module;
408
+ } else {
409
+ throw new Error(`error with module [${inFile}] undefined`);
410
+ }
411
+ }
412
+
413
+ export async function importDocConfigModule(inFile: string, logger?: Logger) {
414
+ const isCJS = extname(inFile) === ".cjs";
415
+ const mod = isCJS ? (await importJSXFile(inFile, logger)).default.default : (await importJSXFile(inFile, logger)).default;
416
+
417
+ const module = parser.parse(mod, DocConfigSchema, basename(inFile));
418
+ if (module !== undefined) {
419
+ return module;
420
+ } else {
421
+ throw new Error(`error with module [${inFile}] undefined`);
422
+ }
423
+ }
424
+
425
+ export async function importConfigConfigModule(inFile: string, logger?: Logger) {
426
+ const isCJS = extname(inFile) === ".cjs";
427
+ const mod = isCJS ? (await importJSXFile(inFile, logger)).default.default : (await importJSXFile(inFile, logger)).default;
428
+
429
+ const module = parser.parse(mod, MiddlewareConfigSchema, basename(inFile));
430
+ if (module !== undefined) {
431
+ return module;
432
+ } else {
433
+ throw new Error(`error with module [${inFile}] undefined`);
434
+ }
435
+ }
436
+
437
+ export async function importCORSModule(inFile: string, logger?: Logger) {
438
+ const isCJS = extname(inFile) === ".cjs";
439
+ const mod = isCJS ? (await importJSXFile(inFile, logger)).default.default : (await importJSXFile(inFile, logger)).default;
440
+
441
+ const module = parser.parse(mod, CORSOptionsSchema, basename(inFile));
442
+ if (module !== undefined) {
443
+ return module;
444
+ } else {
445
+ throw new Error(`error with module [${inFile}] undefined`);
446
+ }
447
+ }
448
+
449
+ export async function importWSConfigModule(inFile: string, logger?: Logger) {
450
+ const isCJS = extname(inFile) === ".cjs";
451
+ const mod = isCJS ? (await importJSXFile(inFile, logger)).default.default : (await importJSXFile(inFile, logger)).default;
452
+
453
+ const module = parser.parse(mod, WSConfigSchema, basename(inFile));
454
+ if (module !== undefined) {
455
+ return module;
456
+ } else {
457
+ throw new Error(`error with module [${inFile}] undefined`);
458
+ }
459
+ }
460
+
461
+ export async function importDBConfigModule(inFile: string, logger?: Logger) {
462
+ const isCJS = extname(inFile) === ".cjs";
463
+ const mod = isCJS ? (await importJSXFile(inFile, logger)).default.default : (await importJSXFile(inFile, logger)).default;
464
+
465
+ const module = parser.parse(mod, DBConfigSchema, basename(inFile));
466
+ if (module !== undefined) {
467
+ return module;
468
+ } else {
469
+ throw new Error(`error with module [${inFile}] undefined`);
470
+ }
471
+ }
472
+
473
+ export async function importLogConfigModule(inFile: string, logger?: Logger) {
474
+ const module = parser.parse((await importJSXFile(inFile, logger)).default, LogConfigSchema, basename(inFile));
475
+ if (module !== undefined) {
476
+ return module;
477
+ } else {
478
+ throw new Error(`error with module [${inFile}] undefined`);
479
+ }
480
+ }
481
+
482
+ export async function importServerConfigModule(inFile: string, logger?: Logger) {
483
+ const isCJS = extname(inFile) === ".cjs";
484
+ const mod = isCJS ? (await importJSXFile(inFile, logger)).default.default : (await importJSXFile(inFile, logger)).default;
485
+
486
+ const module = parser.parse(mod, ServerConfigSchema, basename(inFile));
487
+ if (module !== undefined) {
488
+ return module;
489
+ } else {
490
+ throw new Error(`error with module [${inFile}] undefined`);
491
+ }
492
+ }
493
+
494
+ export async function importJSXFile(inFile: string, logger?: Logger | Console): Promise<any> {
495
+ const inflatedCode = await inflateJSX(inFile, {
496
+ // embemedJSX: false,
497
+ minify: false,
498
+ useExport: true,
499
+ platform: "node",
500
+ logger
501
+ });
502
+ const tmpBuildDir = resolve(JSX_TMP_DIR, String(process.pid), "import", Date.now() + "-" + randomUUID());
503
+ // const inFileTmp = resolve(tmpBuildDir, basename(inFile) + ".mjs");
504
+ const inFileTmp = resolve(tmpBuildDir, basename(inFile) + ".cjs");
505
+ //const logger = getLogger(`${SERVER_IDENTIFIER}_JSX`);
506
+ await mkdirASync(tmpBuildDir, {
507
+ recursive: true
508
+ });
509
+ try {
510
+ await writeFileASync(inFileTmp, inflatedCode);
511
+ // assertGlobalTampered();
512
+ logger?.trace("importing [%s] from [%s]. to change the import folder set JSX_TMP", relative(cwd(), inFile), dirname(relative(JSX_TMP_DIR, inFileTmp)));
513
+ logger?.debug("importing [%s]", relative(cwd(), inFile));
514
+ const module = await import(resolve(inFileTmp));
515
+ // console.dir(module);
516
+ // assertGlobalTampered();
517
+ if (CLEAR_JSX_CACHE) {
518
+ logger?.trace("clearing cache at [%s]. to change this behaivor set CLEAR_JSX_CACHE to 0", tmpBuildDir);
519
+ await unlinkASync(inFileTmp);
520
+ await rmdirASync(tmpBuildDir);
521
+ }
522
+ return module.default;
523
+ } catch (e) {
524
+ logger?.error(e);
525
+ logger?.error("error with2: " + inFile);
526
+ if (CLEAR_JSX_CACHE) {
527
+ logger?.trace("clearing cache at [%s] to change this behaivor set CLEAR_JSX_CACHE to 0", tmpBuildDir);
528
+ await unlinkASync(inFileTmp);
529
+ await rmdirASync(tmpBuildDir);
530
+ } else {
531
+ //console.error("errors on: " + tmpBuildDir);
532
+ logger?.error("error with: %s", inFileTmp);
533
+ logger?.trace("NOT clearing cache. to change this behaivor set CLEAR_JSX_CACHE to 1", tmpBuildDir);
534
+ }
535
+ throw e;
536
+ }
537
+ }
538
+
539
+ export function jsx2HTML(out: JSX.Element, runtime?: Runtime): string {
540
+ runtime = runtime ? runtime : createNodeRuntime();
541
+ const element = runtime.createElement("root");
542
+ const container = runtime.createContainer(element, {
543
+ shadowInit: false, runtimeOptions: {
544
+ disableEffects: true,
545
+ disableEvents: true,
546
+ disableRefListener: true,
547
+ disableRefresh: true
548
+ }
549
+ });
550
+ container.render(out);
551
+ //console.log("jsx2HTML [%s]", element);
552
+ let HTML = "";
553
+ for (let i = 0; i < element.childNodes.length; i++) {
554
+ const child = element.childNodes[i];
555
+ //console.log("jsx2HTML child [%s]", child);
556
+ //console.log("jsx2HTML child [%s]", (child as any).toString(" ", -1));
557
+ HTML += (child as any).toString(" ", -1);
558
+ }
559
+ container.disconnect();
560
+ //console.log("jsx2HTML [%s]", HTML);
561
+ return HTML;
562
+ }
@@ -0,0 +1,85 @@
1
+ import { EncryptJWT, EncryptOptions, JWTDecryptOptions, JWTDecryptResult, JWTPayload, JWTVerifyOptions, JWTVerifyResult, ProtectedHeaderParameters, SignJWT, SignOptions, decodeJwt, decodeProtectedHeader, jwtDecrypt as joseJWTDecrypt, jwtVerify } from "jose";
2
+ import { KeyObject } from "node:crypto";
3
+ import { EncryptJWTOptions, JWTSignOptions } from "../types.js";
4
+
5
+ /**
6
+ * creates a JWT encrypted token with jose
7
+ *
8
+ * @param payload the payload to encrypt
9
+ * @param secret the secret example. const secret = createSecretKey(process.env.JWT_SECRET, 'utf-8');
10
+ * @param options options like expiratation date, issuer and audience
11
+ * @returns
12
+ */
13
+ export async function encryptJWT(payload: JWTPayload, secret: KeyObject, options?: Partial<EncryptJWTOptions>): Promise<string> {
14
+ const en = new EncryptJWT(payload)
15
+ .setProtectedHeader({
16
+ alg: options?.alg ? options?.alg : 'dir',
17
+ enc: options?.enc ? options?.enc : 'A128CBC-HS256'
18
+ })
19
+ .setIssuedAt(options?.iat)
20
+ .setIssuer(options?.iss ? options?.iss : 'urn:example:issuer')
21
+ .setAudience(options?.aud ? options?.aud : 'urn:example:audience')
22
+ .setExpirationTime(options?.exp ? options?.exp : '2h');
23
+
24
+ return await en.encrypt(secret, options?.options);
25
+ }
26
+
27
+ /**
28
+ * decrypts a JWT token with jose
29
+ * @param jwt the JWT token
30
+ * @param secret the secret example. const secret = createSecretKey(process.env.JWT_SECRET, 'utf-8');
31
+ * @param options options like issuer and audience
32
+ * @returns
33
+ */
34
+ export async function decryptJWT<PayloadType = JWTPayload>(jwt: string, secret: KeyObject, options?: Partial<JWTDecryptOptions>): Promise<JWTDecryptResult<PayloadType>> {
35
+ return await joseJWTDecrypt(jwt, secret, options)
36
+ }
37
+
38
+ /**
39
+ * verify a JWT token with jose
40
+ * @param jwt the JWT token
41
+ * @param secret the secret example. const secret = createSecretKey(process.env.JWT_SECRET, 'utf-8');
42
+ * @param options options like issuer and audience
43
+ * @returns
44
+ */
45
+ export async function verifyJWT<PayloadType = JWTPayload>(jwt: string, secret: KeyObject, options?: Partial<JWTVerifyOptions>): Promise<JWTVerifyResult<PayloadType>> {
46
+ return await jwtVerify(jwt, secret, options)
47
+ }
48
+
49
+ /**
50
+ * creates a signed JWT with jose
51
+ *
52
+ * @param payload the payload to encrypt
53
+ * @param secret the secret example. const secret = createSecretKey(process.env.JWT_SECRET, 'utf-8');
54
+ * @param options options like expiratation date, issuer and audience
55
+ * @returns
56
+ */
57
+ export async function signJWT(payload: JWTPayload, secret: KeyObject, options?: Partial<JWTSignOptions>): Promise<string> {
58
+ const sign = new SignJWT(payload)
59
+ .setProtectedHeader({
60
+ alg: options?.alg ? options?.alg : 'HS256',
61
+ })
62
+ .setIssuedAt(options?.iat)
63
+ .setIssuer(options?.iss ? options?.iss : 'urn:example:issuer')
64
+ .setAudience(options?.aud ? options?.aud : 'urn:example:audience')
65
+ .setExpirationTime(options?.exp ? options?.exp : '2h');
66
+ return sign.sign(secret, options?.options);
67
+ }
68
+
69
+ /**
70
+ * decodes a protected header with jose
71
+ * @param token
72
+ * @returns
73
+ */
74
+ export function decodeProtectedHeaderJWT(token: string | object): ProtectedHeaderParameters {
75
+ return decodeProtectedHeader(token);
76
+ }
77
+
78
+ /**
79
+ * decodes a jwt token
80
+ * @param jwt
81
+ * @returns
82
+ */
83
+ export function decodeJWT<PayloadType = JWTPayload>(jwt: string): PayloadType & JWTPayload {
84
+ return decodeJwt<PayloadType>(jwt)
85
+ }