miqro 6.0.9 → 6.0.10

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 (70) hide show
  1. package/build/editor.bundle.js +24 -7
  2. package/build/esm/editor/common/log-socket.d.ts +3 -1
  3. package/build/esm/editor/common/log-socket.js +4 -1
  4. package/build/esm/editor/common/log-socket.js.map +1 -1
  5. package/build/esm/editor/components/editor.js +4 -1
  6. package/build/esm/editor/components/editor.js.map +1 -1
  7. package/build/esm/editor/components/file-browser.js +28 -23
  8. package/build/esm/editor/components/file-browser.js.map +1 -1
  9. package/build/esm/editor/components/file-editor-toolbar.js +4 -4
  10. package/build/esm/editor/components/file-editor-toolbar.js.map +1 -1
  11. package/build/esm/editor/http/admin/editor/api/server/reload.api.js +2 -1
  12. package/build/esm/editor/http/admin/editor/api/server/reload.api.js.map +1 -1
  13. package/build/esm/editor/http/admin/editor/index.api.js +1 -1
  14. package/build/esm/src/common/arguments.js +12 -7
  15. package/build/esm/src/common/arguments.js.map +1 -1
  16. package/build/esm/src/common/assets.d.ts +1 -0
  17. package/build/esm/src/common/assets.js +1 -1
  18. package/build/esm/src/common/assets.js.map +1 -1
  19. package/build/esm/src/common/jsx.d.ts +3 -3
  20. package/build/esm/src/common/jsx.js +36 -22
  21. package/build/esm/src/common/jsx.js.map +1 -1
  22. package/build/esm/src/common/watch.d.ts +3 -1
  23. package/build/esm/src/common/watch.js +5 -0
  24. package/build/esm/src/common/watch.js.map +1 -1
  25. package/build/esm/src/services/app.d.ts +6 -1
  26. package/build/esm/src/services/app.js +36 -117
  27. package/build/esm/src/services/app.js.map +1 -1
  28. package/build/esm/src/services/utils/admin-interface.d.ts +3 -0
  29. package/build/esm/src/services/utils/admin-interface.js +34 -0
  30. package/build/esm/src/services/utils/admin-interface.js.map +1 -0
  31. package/build/esm/src/services/utils/cluster-cache.d.ts +2 -1
  32. package/build/esm/src/services/utils/cluster-cache.js +5 -1
  33. package/build/esm/src/services/utils/cluster-cache.js.map +1 -1
  34. package/build/esm/src/services/utils/cluster-ws.d.ts +1 -0
  35. package/build/esm/src/services/utils/cluster-ws.js +4 -0
  36. package/build/esm/src/services/utils/cluster-ws.js.map +1 -1
  37. package/build/esm/src/services/utils/db-manager.d.ts +1 -0
  38. package/build/esm/src/services/utils/db-manager.js +12 -0
  39. package/build/esm/src/services/utils/db-manager.js.map +1 -1
  40. package/build/esm/src/services/utils/log-transport.d.ts +7 -0
  41. package/build/esm/src/services/utils/log-transport.js +75 -0
  42. package/build/esm/src/services/utils/log-transport.js.map +1 -0
  43. package/build/esm/src/services/utils/websocketmanager.d.ts +1 -0
  44. package/build/esm/src/services/utils/websocketmanager.js +11 -3
  45. package/build/esm/src/services/utils/websocketmanager.js.map +1 -1
  46. package/build/lib.cjs +204 -129
  47. package/editor/common/log-socket.tsx +4 -1
  48. package/editor/components/editor.tsx +4 -1
  49. package/editor/components/file-browser.tsx +48 -35
  50. package/editor/components/file-editor-toolbar.tsx +4 -0
  51. package/editor/http/admin/editor/api/server/reload.api.ts +2 -1
  52. package/editor/http/admin/editor/index.api.tsx +4 -4
  53. package/package.json +9 -7
  54. package/sea/compile.sh +8 -5
  55. package/sea/install-esbuild.sh +1 -1
  56. package/sea/install-nodejs.sh +1 -1
  57. package/sea/node.version.tag +1 -1
  58. package/sea/version.tag.js +11 -0
  59. package/src/common/arguments.ts +11 -7
  60. package/src/common/assets.ts +1 -1
  61. package/src/common/jsx.ts +35 -23
  62. package/src/common/watch.ts +5 -0
  63. package/src/services/app.ts +37 -115
  64. package/src/services/utils/admin-interface.ts +37 -0
  65. package/src/services/utils/cluster-cache.ts +6 -1
  66. package/src/services/utils/cluster-ws.ts +6 -1
  67. package/src/services/utils/db-manager.ts +13 -0
  68. package/src/services/utils/log-transport.ts +75 -0
  69. package/src/services/utils/websocketmanager.ts +13 -3
  70. package/package.json--OLD +0 -36
@@ -44,27 +44,33 @@ export function FileBrowser(props: FileBrowserProps) {
44
44
  ev.preventDefault();
45
45
  props.togglePanel("left");
46
46
  }}>{"<<"}</button>
47
- <button
48
- class="file-editor-button btn"
49
- style={`width: 30%;${props.disableLog ? "display: none;" : ""}`}
50
- onclick={ev => {
51
- ev.preventDefault();
52
- props.togglePanel("bottom");
53
- }}>log</button>
54
- <button
55
- class="file-editor-button btn active"
56
- style={`width: 30%;${props.disableReload ? "display: none;" : ""}`}
57
- onclick={ev => {
58
- ev.preventDefault();
59
- props.scanFiles();
60
- }}>scan</button>
61
- <button
62
- class="file-editor-button btn warning"
63
- style={`width: 30%;${props.disableReload ? "display: none;" : ""}`}
64
- onclick={ev => {
65
- ev.preventDefault();
66
- props.reloadServer();
67
- }}>reload</button>
47
+ {props.disableLog ? <></> :
48
+ <button
49
+ id="log-btn"
50
+ class="file-editor-button btn"
51
+ style={`width: 30%;${props.disableLog ? "display: none;" : ""}`}
52
+ onclick={ev => {
53
+ ev.preventDefault();
54
+ props.togglePanel("bottom");
55
+ }}>log</button>}
56
+ {props.disableReload ? <></> :
57
+ <button
58
+ id="scan-btn"
59
+ class="file-editor-button btn active"
60
+ style={`width: 30%;${props.disableReload ? "display: none;" : ""}`}
61
+ onclick={ev => {
62
+ ev.preventDefault();
63
+ props.scanFiles();
64
+ }}>scan</button>}
65
+ {props.disableReload ? <></> :
66
+ <button
67
+ id="reload-btn"
68
+ class="file-editor-button btn warning"
69
+ style={`width: 30%;${props.disableReload ? "display: none;" : ""}`}
70
+ onclick={ev => {
71
+ ev.preventDefault();
72
+ props.reloadServer();
73
+ }}>reload</button>}
68
74
  </div>
69
75
  <div class="row">
70
76
  <input
@@ -79,28 +85,34 @@ export function FileBrowser(props: FileBrowserProps) {
79
85
  placeholder={"..filter.."} />
80
86
  </div>
81
87
  <div class="row">
88
+ {props.disablePreview ? <></> :
89
+ <button
90
+ id="preview-btn"
91
+ class="file-editor-button btn"
92
+ style={`width: 30%;${props.disablePreview ? "display: none;" : ""}`}
93
+ onclick={ev => {
94
+ ev.preventDefault();
95
+ props.togglePanel("right");
96
+ }}>preview</button>}
82
97
  <button
83
- class="file-editor-button btn"
84
- style={`width: 30%;${props.disablePreview ? "display: none;" : ""}`}
85
- onclick={ev => {
86
- ev.preventDefault();
87
- props.togglePanel("right");
88
- }}>preview</button>
89
- <button
98
+ id="new-btn"
90
99
  class="file-editor-button btn info"
91
100
  style="width: 20%;"
92
101
  onclick={ev => {
93
102
  ev.preventDefault();
94
103
  props.showNewFile();
95
104
  }}>new</button>
105
+ {props.disableReload ? <></> :
106
+ <button
107
+ id="scan-btn"
108
+ class="file-editor-button btn active"
109
+ style={`width: 30%;${!props.disableReload ? "display: none;" : ""}`}
110
+ onclick={ev => {
111
+ ev.preventDefault();
112
+ props.scanFiles();
113
+ }}>scan</button>}
96
114
  <button
97
- class="file-editor-button btn active"
98
- style={`width: 30%;${!props.disableReload ? "display: none;" : ""}`}
99
- onclick={ev => {
100
- ev.preventDefault();
101
- props.scanFiles();
102
- }}>scan</button>
103
- <button
115
+ id="saveall-btn"
104
116
  class="file-editor-button btn success"
105
117
  style="width: 25%;"
106
118
  onclick={ev => {
@@ -109,6 +121,7 @@ export function FileBrowser(props: FileBrowserProps) {
109
121
 
110
122
  }}>save</button>
111
123
  <button
124
+ id="closeall-btn"
112
125
  class="file-editor-button btn danger"
113
126
  style="width: 25%;"
114
127
  onclick={ev => {
@@ -43,6 +43,7 @@ export function FileEditorToolbar(props: FileEditorToolbar) {
43
43
  props.togglePanel("left");
44
44
  }}>{">>"}</button>
45
45
  <button
46
+ id="save-btn"
46
47
  disabled={!props.changed}
47
48
  class={`btn success`}
48
49
  onclick={ev => {
@@ -50,6 +51,7 @@ export function FileEditorToolbar(props: FileEditorToolbar) {
50
51
  props.saveFile();
51
52
  }}>save</button>
52
53
  {props.disableReload ? <></> : <button
54
+ id="savereload-btn"
53
55
  disabled={!props.changed}
54
56
  class={`btn info`}
55
57
  style="margin-left: var(--file-browser-separation);"
@@ -58,6 +60,7 @@ export function FileEditorToolbar(props: FileEditorToolbar) {
58
60
  props.saveFile(true);
59
61
  }}>save/reload</button>}
60
62
  <button
63
+ id="revert-btn"
61
64
  disabled={!props.changed}
62
65
  style="margin-left: var(--file-browser-separation);"
63
66
  class={`btn warning`}
@@ -66,6 +69,7 @@ export function FileEditorToolbar(props: FileEditorToolbar) {
66
69
  props.revertFile();
67
70
  }}>revert</button>
68
71
  <button
72
+ id="close-btn"
69
73
  class={`btn danger`}
70
74
  style="margin-left: var(--file-browser-separation);"
71
75
  onclick={ev => {
@@ -30,11 +30,12 @@ export default {
30
30
  },
31
31
  handler: async (req: AdminRequest, res) => {
32
32
  const errors = await req?.editor?.reload();
33
+ const parsedErrors = parseInflateErrors(errors);
33
34
  return res.json({
34
35
  message: "OK",
35
36
  reloadString: req.uuid,
36
37
  migrations: req?.editor?.getMigrations().map(m => m.name),
37
- errors: parseInflateErrors(errors)
38
+ errors: parsedErrors ? parsedErrors : []
38
39
  });
39
40
  },
40
41
  } as APIRoute;
@@ -22,11 +22,11 @@ export default {
22
22
 
23
23
  <script type="module" src="/admin/editor/editor.js" />
24
24
  <editor-component
25
- disableLog="true"
26
- disablePreview="true"
27
- disableReload="true"
25
+ disablelog="true"
26
+ disablepreview="true"
27
+ disablereload="true"
28
28
  class="main-container"
29
- reloadString={`${req?.uuid}`}
29
+ reloadstring={`${req?.uuid}`}
30
30
  migrations={`${HTMLEncode(JSON.stringify(migrations))}`}
31
31
  services={`${HTMLEncode(JSON.stringify(services))}`}
32
32
  errors={`${HTMLEncode(JSON.stringify(errors))}`}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "miqro",
3
- "version": "6.0.9",
3
+ "version": "6.0.10",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "build/esm/src/lib.js",
@@ -8,13 +8,15 @@
8
8
  "author": "claukers",
9
9
  "license": "ISC",
10
10
  "scripts": {
11
- "test": "node --enable-source-maps --test test/cases/*.test.js",
12
- "coverage": "node --enable-source-maps --experimental-test-coverage --test test/cases/*.test.js",
11
+ "pretest": "npm run build",
12
+ "test": "BROWSER=none node --enable-source-maps --test test/cases/*.test.js",
13
+ "coverage": "BROWSER=none node --enable-source-maps --experimental-test-coverage --test test/cases/*.test.js",
13
14
  "prepare": "npm run build",
14
15
  "release:package": "sh sea/release-tar.sh",
15
16
  "prerelease:package": "npm run compile",
16
17
  "build": "tsc",
17
- "postbuild": "npm run postbuild:lib && npm run postbuild:postject && npm run postbuild:sh && npm run postbuild:jsxdom && npm run postbuild:editor && npm run postbuild:types",
18
+ "postbuild": "npm run postbuild:lib && npm run postbuild:postject && npm run postbuild:sh && npm run postbuild:jsxdom && npm run postbuild:editor && npm run postbuild:types && npm run postbuild:versiontag",
19
+ "postbuild:versiontag": "node sea/version.tag.js",
18
20
  "postbuild:types": "sh sea/copy-types.sh && node sea/generate-global-types-asset-json.js",
19
21
  "postbuild:editor": "esbuild --log-level=silent --external:node:process --external:node:path --platform=neutral --bundle --loader:.js=jsx --jsx-factory=jsx.createElement --jsx-fragment=jsx.Fragment sea/editor-assets/editor.bundle.in.mjs --outfile=build/editor.bundle.js",
20
22
  "postbuild:jsxdom": "cp node_modules/@miqro/jsx-dom/build/jsx-dom.esm.bundle.js build/jsx.dom.js",
@@ -35,7 +37,8 @@
35
37
  "@types/cookie": "^0.6.0",
36
38
  "@types/node": "^22.10.2",
37
39
  "postject": "1.0.0-alpha.6",
38
- "typescript": "^5.7.2"
40
+ "typescript": "^5.7.2",
41
+ "highlight.js": "11.11.1"
39
42
  },
40
43
  "dependencies": {
41
44
  "@miqro/core": "^5.0.13",
@@ -48,8 +51,7 @@
48
51
  "@miqro/test": "^0.2.9",
49
52
  "@miqro/test-http": "^0.1.2",
50
53
  "@types/showdown": "2.0.6",
51
- "esbuild": "0.25.3",
52
- "highlight.js": "11.11.1",
54
+ "esbuild": "0.25.4",
53
55
  "showdown": "2.1.0"
54
56
  }
55
57
  }
package/sea/compile.sh CHANGED
@@ -14,6 +14,9 @@ TSC_BIN="sh sea/tsc.sh"
14
14
  sh sea/copy-types.sh
15
15
  $NODE_BIN sea/generate-global-types-asset-json.js
16
16
 
17
+ #version.tag
18
+ $NODE_BIN sea/version.tag.js
19
+
17
20
  rm -Rf bin;
18
21
  mkdir -p bin/;
19
22
  rm -Rf build;
@@ -23,12 +26,12 @@ mkdir -p build/;
23
26
  echo $TSC_BIN
24
27
  $TSC_BIN
25
28
 
26
- CURRENT_GIT_BRANCH=`git rev-parse --abbrev-ref HEAD`
27
- CURRENT_GIT_SHORT_HASH=`git rev-parse --short HEAD`
28
- CURRENT_DATE=`date +"%y-%m-%d"`
29
- VERSION_TAG="${CURRENT_DATE}_${CURRENT_GIT_SHORT_HASH}_${CURRENT_GIT_BRANCH}"
29
+ #CURRENT_GIT_BRANCH=`git rev-parse --abbrev-ref HEAD`
30
+ #CURRENT_GIT_SHORT_HASH=`git rev-parse --short HEAD`
31
+ #CURRENT_DATE=`date +"%y-%m-%d"`
32
+ #VERSION_TAG="${CURRENT_DATE}_${CURRENT_GIT_SHORT_HASH}_${CURRENT_GIT_BRANCH}"
30
33
 
31
- echo $VERSION_TAG > sea/version.tag
34
+ #echo $VERSION_TAG > sea/version.tag
32
35
 
33
36
  # jsx.js
34
37
  cp node_modules/@miqro/jsx-dom/build/jsx-dom.esm.bundle.js build/jsx.dom.js
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env sh
2
2
 
3
3
  TARGET="${PWD}/sea/deps/esbuild"
4
- VERSION="0.25.3"
4
+ VERSION="0.25.4"
5
5
 
6
6
  if [ -d "$TARGET" ]; then
7
7
  echo "$TARGET already exists exist."
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env sh
2
2
 
3
3
  TARGET="${PWD}/sea/deps/nodejs"
4
- VERSION="23.11.0"
4
+ VERSION="24.0.0"
5
5
 
6
6
  if [ -d "$TARGET" ]; then
7
7
  echo "$TARGET already exists exist."
@@ -1 +1 @@
1
- 23.11.0
1
+ 24.0.0
@@ -0,0 +1,11 @@
1
+ import { readFileSync, writeFileSync } from "node:fs";
2
+ import { resolve, dirname } from "node:path";
3
+ import { fileURLToPath } from 'node:url';
4
+
5
+ export const __package_dirname = import.meta.url ? resolve(dirname(fileURLToPath(import.meta.url))) : null;
6
+
7
+ const version = JSON.parse(readFileSync(resolve(__package_dirname, "../package.json")).toString()).version;
8
+
9
+ console.log("writing [%s] with [%s]", resolve(__package_dirname, "version.tag"), version);
10
+
11
+ writeFileSync(resolve(__package_dirname, "version.tag"), version);
@@ -1,5 +1,5 @@
1
1
  import { checkEnvVariable } from "@miqro/core";
2
- import { existsSync, statSync } from "node:fs";
2
+ import { existsSync, readFileSync, statSync } from "node:fs";
3
3
  import { resolve } from "node:path";
4
4
  import { cwd, env, platform, arch } from "node:process";
5
5
 
@@ -10,7 +10,7 @@ import { BIN_NAME, help, usage } from "./help.js";
10
10
  import { TEST_SOCKET } from "./paths.js";
11
11
  import { isSea } from "node:sea";
12
12
  import cluster from "node:cluster";
13
- import { getVersion } from "./assets.js";
13
+ import { __package_dirname, getVersion } from "./assets.js";
14
14
 
15
15
  export function getPORT() {
16
16
  return checkEnvVariable("PORT", "8080");
@@ -84,8 +84,12 @@ export function parseArguments(): Arguments {
84
84
  console.log("version [%s]", VERSION);
85
85
  console.log("Node.js version [%s]", NODE_VERSION);
86
86
  console.log("esbuild version [%s]", ESBUILD_VERSION);
87
+ console.log("platform [%s-%s]", platform, arch);
88
+ } else {
89
+ const packageJSON = JSON.parse(readFileSync(resolve(__package_dirname, "package.json")).toString());
90
+ const VERSION = packageJSON.version;
91
+ console.log("version [%s]", VERSION);
87
92
  }
88
- console.log("platform [%s-%s]", platform, arch);
89
93
  process.exit(EXIT_CODES.NORMAL_EXIT);
90
94
  case "-h":
91
95
  case "--help":
@@ -319,22 +323,22 @@ export function parseArguments(): Arguments {
319
323
  process.exit(EXIT_CODES.BAD_ARGUMENTS);
320
324
  }
321
325
 
322
- if (flags.test && (flags.editor)) {
326
+ if (flags.test && (flags.hotreload || flags.editor || flags.compile || flags.inflate)) {
323
327
  console.error("bad arguments. cannot use --editor with --test");
324
328
  process.exit(EXIT_CODES.BAD_ARGUMENTS);
325
329
  }
326
330
 
327
- if (flags.migrateUp && (flags.editor || flags.compile || flags.test || flags.migrateDown || flags.inflate)) {
331
+ if (flags.migrateUp && (flags.hotreload || flags.editor || flags.compile || flags.test || flags.migrateDown || flags.inflate)) {
328
332
  console.error("bad arguments. cannot use with --migrate-up");
329
333
  process.exit(EXIT_CODES.BAD_ARGUMENTS);
330
334
  }
331
335
 
332
- if (flags.migrateDown && (flags.editor || flags.compile || flags.test || flags.migrateUp || flags.inflate)) {
336
+ if (flags.migrateDown && (flags.hotreload || flags.editor || flags.compile || flags.test || flags.migrateUp || flags.inflate)) {
333
337
  console.error("bad arguments. cannot use with --migrate-down");
334
338
  process.exit(EXIT_CODES.BAD_ARGUMENTS);
335
339
  }
336
340
 
337
- if (flags.generateDoc && (flags.editor || flags.compile || flags.test || flags.migrateUp || flags.inflate || flags.migrateDown)) {
341
+ if (flags.generateDoc && (flags.hotreload || flags.editor || flags.compile || flags.test || flags.migrateUp || flags.inflate || flags.migrateDown)) {
338
342
  console.error("bad arguments. cannot use with --generate-doc");
339
343
  process.exit(EXIT_CODES.BAD_ARGUMENTS);
340
344
  }
@@ -10,7 +10,7 @@ import { initESBuild } from "./esbuild.js";
10
10
  import { initJSXJS } from "./jsx.js";
11
11
  //const require = createRequire(import.meta.url);
12
12
 
13
- const __package_dirname = import.meta.url ? resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "..", "..") : null;
13
+ export const __package_dirname = import.meta.url ? resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "..", "..") : null;
14
14
 
15
15
  const ASSETS_ROUTER = {
16
16
  "lib.cjs": "build/lib.cjs",
package/src/common/jsx.ts CHANGED
@@ -126,16 +126,6 @@ export async function inflateJSX(inFile: string, options: InflateOptions): Promi
126
126
  }
127
127
  }
128
128
 
129
- export async function importAPIRoute(inFile: string, logger?: Logger) {
130
- const mod = (await importJSXFile(inFile, logger)).default;
131
- const module = typeof mod === "function" ? { handler: mod } : parser.parse(mod, APIRouteSchema, basename(inFile));
132
- if (module !== undefined) {
133
- return module as APIRoute;
134
- } else {
135
- throw new Error(`error with module [${inFile}] undefined`);
136
- }
137
- }
138
-
139
129
  export const APIOptionsSchema: Schema<APIOptions> = {
140
130
  type: "object?",
141
131
  properties: {
@@ -155,7 +145,8 @@ export const APIOptionsSchema: Schema<APIOptions> = {
155
145
  properties: SessionHandlerOptionsSchema.properties
156
146
  },
157
147
  ...RouteOptionsSchema.properties
158
- }
148
+ },
149
+ //mode:"add_extra"
159
150
  };
160
151
 
161
152
  export interface HTMLModule {
@@ -170,7 +161,8 @@ export const HTMLModuleSchema: Schema<HTMLModule> = {
170
161
  type: "function|object"
171
162
  },
172
163
  apiOptions: APIOptionsSchema
173
- }
164
+ },
165
+ //mode:"add_extra"
174
166
  }
175
167
 
176
168
  export type JSONModuleValue = string | object;
@@ -187,7 +179,8 @@ export const JSONModuleSchema: Schema<JSONModule> = {
187
179
  type: "function|object|string"
188
180
  },
189
181
  apiOptions: APIOptionsSchema
190
- }
182
+ },
183
+ //mode:"add_extra"
191
184
  }
192
185
 
193
186
  export const MigrationSchema: Schema<Migration> = {
@@ -195,7 +188,8 @@ export const MigrationSchema: Schema<Migration> = {
195
188
  properties: {
196
189
  up: "function",
197
190
  down: "function"
198
- }
191
+ },
192
+ mode: "add_extra"
199
193
  }
200
194
 
201
195
  export const CORSOptionsSchema: Schema<CORSOptions> = {
@@ -205,7 +199,8 @@ export const CORSOptionsSchema: Schema<CORSOptions> = {
205
199
  validate: "function?",
206
200
  methods: "string?",
207
201
  preflightContinue: "boolean?"
208
- }
202
+ },
203
+ //mode:"add_extra"
209
204
  }
210
205
 
211
206
  export const WSConfigSchema: Schema<WSConfig> = {
@@ -218,7 +213,8 @@ export const WSConfigSchema: Schema<WSConfig> = {
218
213
  onConnection: "function?",
219
214
  onMessage: "function?",
220
215
  onDisconnect: "function?"
221
- }
216
+ },
217
+ //mode:"add_extra"
222
218
  };
223
219
 
224
220
  export const DBConfigSchema: Schema<DBConfig> = {
@@ -229,7 +225,8 @@ export const DBConfigSchema: Schema<DBConfig> = {
229
225
  storage: "string?",
230
226
  dialect: "string?",
231
227
  name: "string"
232
- }
228
+ },
229
+ //mode:"add_extra"
233
230
  }
234
231
 
235
232
  export const ServerConfigSchema: Schema<ServerConfig> = {
@@ -240,7 +237,8 @@ export const ServerConfigSchema: Schema<ServerConfig> = {
240
237
  stop: "function?",
241
238
  start: "function?",
242
239
  load: "function?"
243
- }
240
+ },
241
+ //mode:"add_extra"
244
242
  };
245
243
 
246
244
  export const LogConfigSchema: Schema<LogConfig> = {
@@ -253,17 +251,27 @@ export const LogConfigSchema: Schema<LogConfig> = {
253
251
  replaceConsoleTransport: "boolean?",
254
252
  replaceFileTransport: "boolean?",
255
253
  write: "function"
256
- }
254
+ },
255
+ //mode:"add_extra"
257
256
  };
258
257
 
259
258
  export const AuthConfigSchema: Schema<AuthConfig> = {
260
259
  type: "object",
261
260
  properties: {
262
261
  ...SessionHandlerOptionsSchema.properties
263
- }
262
+ },
263
+ //mode:"add_extra"
264
264
  }
265
265
 
266
-
266
+ export async function importAPIRoute(inFile: string, logger?: Logger) {
267
+ const mod = (await importJSXFile(inFile, logger)).default;
268
+ const module = typeof mod === "function" ? { handler: mod } : parser.parse(mod, APIRouteSchema, basename(inFile));
269
+ if (module !== undefined) {
270
+ return module as APIRoute;
271
+ } else {
272
+ throw new Error(`error with module [${inFile}] undefined`);
273
+ }
274
+ }
267
275
 
268
276
  export async function importMigrationModule(inFile: string, logger?: Logger) {
269
277
  const module = parser.parse((await importJSXFile(inFile, logger)).default, MigrationSchema, basename(inFile));
@@ -275,7 +283,9 @@ export async function importMigrationModule(inFile: string, logger?: Logger) {
275
283
  }
276
284
 
277
285
  export async function importHTMLModule(inFile: string, logger?: Logger) {
278
- const module = parser.parse((await importJSXFile(inFile, logger)), HTMLModuleSchema, basename(inFile));
286
+ const module = (await importJSXFile(inFile, logger));
287
+ parser.parse(module.default, HTMLModuleSchema.properties.default, `${basename(inFile)}.default`);
288
+ parser.parse(module.apiOptions, APIOptionsSchema, `${basename(inFile)}.apiOptions`);
279
289
  if (module !== undefined) {
280
290
  return module;
281
291
  } else {
@@ -284,7 +294,9 @@ export async function importHTMLModule(inFile: string, logger?: Logger) {
284
294
  }
285
295
 
286
296
  export async function importJSONModule(inFile: string, logger?: Logger) {
287
- const module = parser.parse((await importJSXFile(inFile, logger)), JSONModuleSchema, basename(inFile));
297
+ const module = (await importJSXFile(inFile, logger));
298
+ parser.parse(module.default, JSONModuleSchema.properties.default, `${basename(inFile)}.default`);
299
+ parser.parse(module.apiOptions, APIOptionsSchema, `${basename(inFile)}.apiOptions`);
288
300
  if (module !== undefined) {
289
301
  return module;
290
302
  } else {
@@ -77,4 +77,9 @@ export async function watchAndServer(app: Miqro) {
77
77
 
78
78
  watchLogger?.info("watching for changes on [%s]", app.options.services.join(","));
79
79
  reWatch();
80
+ return {
81
+ stopWatch: () => {
82
+ stopWatch();
83
+ }
84
+ };
80
85
  }