@alepha/devtools 0.16.1 → 0.19.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -5
- package/dist/index.browser.js +224 -0
- package/dist/index.browser.js.map +1 -0
- package/dist/index.d.ts +351 -323
- package/dist/index.js +350 -186
- package/dist/index.js.map +1 -1
- package/package.json +33 -25
- package/src/assets.ts +6 -0
- package/src/{api/entities → entities}/logs.ts +2 -2
- package/src/index.browser.ts +11 -0
- package/src/index.shared.ts +15 -0
- package/src/index.ts +11 -37
- package/src/{api/providers → providers}/DevToolsMetadataProvider.ts +84 -47
- package/src/providers/DevToolsProvider.ts +394 -0
- package/src/{api/schemas → schemas}/DevActionMetadata.ts +8 -0
- package/src/{api/schemas → schemas}/DevEntityMetadata.ts +3 -0
- package/src/{api/schemas → schemas}/DevMetadata.ts +13 -2
- package/src/{api/schemas → schemas}/DevPageMetadata.ts +3 -0
- package/src/{api/schemas → schemas}/DevTopicMetadata.ts +1 -0
- package/src/ui/AppRouter.tsx +73 -59
- package/src/ui/components/DevLayout.tsx +103 -84
- package/src/ui/components/configuration/ConfigAtoms.page.tsx +5 -0
- package/src/ui/components/configuration/ConfigAtoms.tsx +511 -0
- package/src/ui/components/configuration/ConfigEnv.page.tsx +5 -0
- package/src/ui/components/configuration/ConfigEnv.tsx +230 -0
- package/src/ui/components/configuration/DevConfiguration.tsx +36 -0
- package/src/ui/components/configuration/index.ts +3 -0
- package/src/ui/components/dashboard/DevDashboard.tsx +501 -0
- package/src/ui/components/database/DatabaseEditor.page.tsx +23 -0
- package/src/ui/components/database/DatabaseEditor.tsx +402 -0
- package/src/ui/components/database/DatabaseErd.page.tsx +28 -0
- package/src/ui/components/database/DatabaseErd.tsx +107 -0
- package/src/ui/components/database/DevDatabase.tsx +36 -0
- package/src/ui/components/database/EntityNode.tsx +83 -0
- package/src/ui/components/emails/DevEmails.tsx +250 -0
- package/src/ui/components/explorer/DevExplorer.tsx +351 -0
- package/src/ui/components/explorer/ExplorerTree.tsx +178 -0
- package/src/ui/components/explorer/panels/DevPanelAction.tsx +499 -0
- package/src/ui/components/explorer/panels/DevPanelCache.tsx +73 -0
- package/src/ui/components/explorer/panels/DevPanelPage.tsx +96 -0
- package/src/ui/components/explorer/panels/DevPanelQueue.tsx +51 -0
- package/src/ui/components/explorer/panels/DevPanelTopic.tsx +56 -0
- package/src/ui/components/explorer/panels/index.ts +5 -0
- package/src/ui/components/graph/DevDependencyGraph.tsx +35 -60
- package/src/ui/components/graph/GraphControls.tsx +10 -11
- package/src/ui/components/graph/NodeDetails.tsx +22 -29
- package/src/ui/components/graph/ProviderNode.tsx +4 -4
- package/src/ui/components/graph/helpers.ts +1 -1
- package/src/ui/components/logs/DevLogs.tsx +661 -0
- package/src/ui/components/logs/index.ts +1 -0
- package/src/ui/components/shared/TreeView.tsx +189 -0
- package/src/ui/components/sms/DevSms.tsx +225 -0
- package/src/ui/main.css +17 -0
- package/src/ui/main.ts +2 -6
- package/LICENSE +0 -21
- package/assets/devtools/actions.html +0 -21
- package/assets/devtools/actions.html.br +0 -0
- package/assets/devtools/actions.html.gz +0 -0
- package/assets/devtools/asset.BZV40eAE.css +0 -1
- package/assets/devtools/asset.BZV40eAE.css.br +0 -0
- package/assets/devtools/asset.BZV40eAE.css.gz +0 -0
- package/assets/devtools/asset.CBnMq2vO.css +0 -1
- package/assets/devtools/asset.CBnMq2vO.css.br +0 -0
- package/assets/devtools/asset.CBnMq2vO.css.gz +0 -0
- package/assets/devtools/atoms.html +0 -21
- package/assets/devtools/atoms.html.br +0 -0
- package/assets/devtools/atoms.html.gz +0 -0
- package/assets/devtools/caches.html +0 -21
- package/assets/devtools/caches.html.br +0 -0
- package/assets/devtools/caches.html.gz +0 -0
- package/assets/devtools/chunk.6INqNjF0.js +0 -1
- package/assets/devtools/chunk.6INqNjF0.js.br +0 -0
- package/assets/devtools/chunk.6INqNjF0.js.gz +0 -0
- package/assets/devtools/chunk.9vpWpXSF.js +0 -1
- package/assets/devtools/chunk.9vpWpXSF.js.br +0 -0
- package/assets/devtools/chunk.9vpWpXSF.js.gz +0 -0
- package/assets/devtools/chunk.B4peH6PS.js +0 -1
- package/assets/devtools/chunk.B4peH6PS.js.br +0 -0
- package/assets/devtools/chunk.B4peH6PS.js.gz +0 -0
- package/assets/devtools/chunk.B8CNjZzU.js +0 -1
- package/assets/devtools/chunk.B8CNjZzU.js.br +0 -0
- package/assets/devtools/chunk.B8CNjZzU.js.gz +0 -0
- package/assets/devtools/chunk.Bgd10SVI.js +0 -1
- package/assets/devtools/chunk.Bgd10SVI.js.br +0 -0
- package/assets/devtools/chunk.Bgd10SVI.js.gz +0 -0
- package/assets/devtools/chunk.BjFrJKj1.js +0 -1
- package/assets/devtools/chunk.BjFrJKj1.js.br +0 -2
- package/assets/devtools/chunk.BjFrJKj1.js.gz +0 -0
- package/assets/devtools/chunk.BlqFPyLh.js +0 -1
- package/assets/devtools/chunk.BlqFPyLh.js.br +0 -0
- package/assets/devtools/chunk.BlqFPyLh.js.gz +0 -0
- package/assets/devtools/chunk.BqBNmfN9.js +0 -1
- package/assets/devtools/chunk.BqBNmfN9.js.br +0 -0
- package/assets/devtools/chunk.BqBNmfN9.js.gz +0 -0
- package/assets/devtools/chunk.Bt0_vkJm.js +0 -2
- package/assets/devtools/chunk.Bt0_vkJm.js.br +0 -0
- package/assets/devtools/chunk.Bt0_vkJm.js.gz +0 -0
- package/assets/devtools/chunk.C3GuU4pz.js +0 -2
- package/assets/devtools/chunk.C3GuU4pz.js.br +0 -0
- package/assets/devtools/chunk.C3GuU4pz.js.gz +0 -0
- package/assets/devtools/chunk.CGwoN_Mo.js +0 -1
- package/assets/devtools/chunk.CGwoN_Mo.js.br +0 -0
- package/assets/devtools/chunk.CGwoN_Mo.js.gz +0 -0
- package/assets/devtools/chunk.CJCvhHA7.js +0 -1
- package/assets/devtools/chunk.CJCvhHA7.js.br +0 -2
- package/assets/devtools/chunk.CJCvhHA7.js.gz +0 -0
- package/assets/devtools/chunk.CKr2VE6v.js +0 -1
- package/assets/devtools/chunk.CKr2VE6v.js.br +0 -0
- package/assets/devtools/chunk.CKr2VE6v.js.gz +0 -0
- package/assets/devtools/chunk.CLvTwbkw.js +0 -1
- package/assets/devtools/chunk.CLvTwbkw.js.br +0 -0
- package/assets/devtools/chunk.CLvTwbkw.js.gz +0 -0
- package/assets/devtools/chunk.CR13dZhE.js +0 -7
- package/assets/devtools/chunk.CR13dZhE.js.br +0 -0
- package/assets/devtools/chunk.CR13dZhE.js.gz +0 -0
- package/assets/devtools/chunk.C_C-cVqs.js +0 -1
- package/assets/devtools/chunk.C_C-cVqs.js.br +0 -1
- package/assets/devtools/chunk.C_C-cVqs.js.gz +0 -0
- package/assets/devtools/chunk.CjevPbPy.js +0 -1
- package/assets/devtools/chunk.CjevPbPy.js.br +0 -0
- package/assets/devtools/chunk.CjevPbPy.js.gz +0 -0
- package/assets/devtools/chunk.CkNMZqAe.js +0 -1
- package/assets/devtools/chunk.CkNMZqAe.js.br +0 -0
- package/assets/devtools/chunk.CkNMZqAe.js.gz +0 -0
- package/assets/devtools/chunk.Cl1Mlnqx.js +0 -1
- package/assets/devtools/chunk.Cl1Mlnqx.js.br +0 -0
- package/assets/devtools/chunk.Cl1Mlnqx.js.gz +0 -0
- package/assets/devtools/chunk.CyY8OGdZ.js +0 -1
- package/assets/devtools/chunk.CyY8OGdZ.js.br +0 -0
- package/assets/devtools/chunk.CyY8OGdZ.js.gz +0 -0
- package/assets/devtools/chunk.Cyx9kLqD.js +0 -1
- package/assets/devtools/chunk.Cyx9kLqD.js.br +0 -0
- package/assets/devtools/chunk.Cyx9kLqD.js.gz +0 -0
- package/assets/devtools/chunk.D1MGgxUI.js +0 -1
- package/assets/devtools/chunk.D1MGgxUI.js.br +0 -0
- package/assets/devtools/chunk.D1MGgxUI.js.gz +0 -0
- package/assets/devtools/chunk.D5Ci-dwk.js +0 -1
- package/assets/devtools/chunk.D5Ci-dwk.js.br +0 -0
- package/assets/devtools/chunk.D5Ci-dwk.js.gz +0 -0
- package/assets/devtools/chunk.DFrWQW5x.js +0 -9
- package/assets/devtools/chunk.DFrWQW5x.js.br +0 -0
- package/assets/devtools/chunk.DFrWQW5x.js.gz +0 -0
- package/assets/devtools/chunk.DaVlli3f.js +0 -1
- package/assets/devtools/chunk.DaVlli3f.js.br +0 -0
- package/assets/devtools/chunk.DaVlli3f.js.gz +0 -0
- package/assets/devtools/chunk.DdyBCs50.js +0 -1
- package/assets/devtools/chunk.DdyBCs50.js.br +0 -0
- package/assets/devtools/chunk.DdyBCs50.js.gz +0 -0
- package/assets/devtools/chunk.Dl0THvrP.js +0 -1
- package/assets/devtools/chunk.Dl0THvrP.js.br +0 -0
- package/assets/devtools/chunk.Dl0THvrP.js.gz +0 -0
- package/assets/devtools/chunk.DwUNDm68.js +0 -1
- package/assets/devtools/chunk.DwUNDm68.js.br +0 -0
- package/assets/devtools/chunk.DwUNDm68.js.gz +0 -0
- package/assets/devtools/chunk.DzDkh4C6.js +0 -1
- package/assets/devtools/chunk.DzDkh4C6.js.br +0 -0
- package/assets/devtools/chunk.DzDkh4C6.js.gz +0 -0
- package/assets/devtools/chunk.QTExp4CY.js +0 -1
- package/assets/devtools/chunk.QTExp4CY.js.br +0 -0
- package/assets/devtools/chunk.QTExp4CY.js.gz +0 -0
- package/assets/devtools/chunk.ReCPcJln.js +0 -1
- package/assets/devtools/chunk.ReCPcJln.js.br +0 -0
- package/assets/devtools/chunk.ReCPcJln.js.gz +0 -0
- package/assets/devtools/chunk.UEhIKOMY.js +0 -1
- package/assets/devtools/chunk.UEhIKOMY.js.br +0 -0
- package/assets/devtools/chunk.UEhIKOMY.js.gz +0 -0
- package/assets/devtools/chunk.mWQqK3dU.js +0 -1
- package/assets/devtools/chunk.mWQqK3dU.js.br +0 -0
- package/assets/devtools/chunk.mWQqK3dU.js.gz +0 -0
- package/assets/devtools/chunk.uyVen0u2.js +0 -1
- package/assets/devtools/chunk.uyVen0u2.js.br +0 -0
- package/assets/devtools/chunk.uyVen0u2.js.gz +0 -0
- package/assets/devtools/chunk.yLRX_cUF.js +0 -1
- package/assets/devtools/chunk.yLRX_cUF.js.br +0 -0
- package/assets/devtools/chunk.yLRX_cUF.js.gz +0 -0
- package/assets/devtools/chunk.zuZxBYZg.js +0 -1
- package/assets/devtools/chunk.zuZxBYZg.js.br +0 -0
- package/assets/devtools/chunk.zuZxBYZg.js.gz +0 -0
- package/assets/devtools/db.html +0 -21
- package/assets/devtools/db.html.br +0 -0
- package/assets/devtools/db.html.gz +0 -0
- package/assets/devtools/entry.Cry3rxEI.js +0 -79
- package/assets/devtools/entry.Cry3rxEI.js.br +0 -0
- package/assets/devtools/entry.Cry3rxEI.js.gz +0 -0
- package/assets/devtools/env.html +0 -21
- package/assets/devtools/env.html.br +0 -0
- package/assets/devtools/env.html.gz +0 -0
- package/assets/devtools/graph.html +0 -22
- package/assets/devtools/graph.html.br +0 -0
- package/assets/devtools/graph.html.gz +0 -0
- package/assets/devtools/index.html +0 -21
- package/assets/devtools/index.html.br +0 -0
- package/assets/devtools/index.html.gz +0 -0
- package/assets/devtools/logs.html +0 -21
- package/assets/devtools/logs.html.br +0 -0
- package/assets/devtools/logs.html.gz +0 -0
- package/assets/devtools/queues.html +0 -21
- package/assets/devtools/queues.html.br +0 -0
- package/assets/devtools/queues.html.gz +0 -0
- package/assets/devtools/topics.html +0 -21
- package/assets/devtools/topics.html.br +0 -0
- package/assets/devtools/topics.html.gz +0 -0
- package/src/api/DevToolsProvider.ts +0 -157
- package/src/api/providers/DevToolsDatabaseProvider.ts +0 -27
- package/src/api/repositories/LogRepository.ts +0 -8
- package/src/api/schemas/DevCommandMetadata.ts +0 -9
- package/src/ui/components/DevAtomsViewer.tsx +0 -637
- package/src/ui/components/DevCacheInspector.tsx +0 -423
- package/src/ui/components/DevDashboard.tsx +0 -38
- package/src/ui/components/DevEnvExplorer.tsx +0 -462
- package/src/ui/components/DevLogViewer.tsx +0 -252
- package/src/ui/components/DevQueueMonitor.tsx +0 -51
- package/src/ui/components/DevTopicsViewer.tsx +0 -686
- package/src/ui/components/actions/ActionGroup.tsx +0 -37
- package/src/ui/components/actions/ActionItem.tsx +0 -138
- package/src/ui/components/actions/DevActionsExplorer.tsx +0 -132
- package/src/ui/components/actions/MethodBadge.tsx +0 -18
- package/src/ui/components/actions/SchemaViewer.tsx +0 -21
- package/src/ui/components/actions/TryItPanel.tsx +0 -140
- package/src/ui/components/actions/constants.ts +0 -7
- package/src/ui/components/actions/helpers.ts +0 -18
- package/src/ui/components/actions/index.ts +0 -8
- package/src/ui/components/db/ColumnBadge.tsx +0 -55
- package/src/ui/components/db/DevDbStudio.tsx +0 -485
- package/src/ui/components/db/constants.ts +0 -11
- package/src/ui/components/db/index.ts +0 -4
- package/src/ui/components/db/types.ts +0 -7
- package/src/ui/styles.css +0 -1
- /package/src/{api/schemas → schemas}/DevAtomMetadata.ts +0 -0
- /package/src/{api/schemas → schemas}/DevBucketMetadata.ts +0 -0
- /package/src/{api/schemas → schemas}/DevCacheMetadata.ts +0 -0
- /package/src/{api/schemas → schemas}/DevEnvMetadata.ts +0 -0
- /package/src/{api/schemas → schemas}/DevModuleMetadata.ts +0 -0
- /package/src/{api/schemas → schemas}/DevProviderMetadata.ts +0 -0
- /package/src/{api/schemas → schemas}/DevQueueMetadata.ts +0 -0
- /package/src/{api/schemas → schemas}/DevRealmMetadata.ts +0 -0
- /package/src/{api/schemas → schemas}/DevRouteMetadata.ts +0 -0
- /package/src/{api/schemas → schemas}/DevSchedulerMetadata.ts +0 -0
package/dist/index.js
CHANGED
|
@@ -1,46 +1,27 @@
|
|
|
1
|
-
import { $
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { $batch } from "alepha/batch";
|
|
5
|
-
import { $logger, JsonFormatterProvider } from "alepha/logger";
|
|
6
|
-
import { $entity, PG_CREATED_AT, PG_DEFAULT, PG_DELETED_AT, PG_IDENTITY, PG_PRIMARY_KEY, PG_REF, PG_SERIAL, PG_UPDATED_AT, PG_VERSION, Repository, RepositoryProvider, SqliteProvider, parseQueryString, pg } from "alepha/orm";
|
|
7
|
-
import { $action, $route, ServerProvider } from "alepha/server";
|
|
8
|
-
import { $serve } from "alepha/server/static";
|
|
1
|
+
import { $hook, $inject, $module, $state, Alepha, t } from "alepha";
|
|
2
|
+
import { $action, $route, AlephaServer, ServerProvider } from "alepha/server";
|
|
3
|
+
import { $serve, AlephaServerStatic } from "alepha/server/static";
|
|
9
4
|
import { $bucket } from "alepha/bucket";
|
|
10
5
|
import { $cache } from "alepha/cache";
|
|
11
|
-
import {
|
|
6
|
+
import { DateTimeProvider } from "alepha/datetime";
|
|
7
|
+
import { $logger, MemoryDestinationProvider } from "alepha/logger";
|
|
8
|
+
import { PG_CREATED_AT, PG_DEFAULT, PG_DELETED_AT, PG_IDENTITY, PG_PRIMARY_KEY, PG_REF, PG_SERIAL, PG_UPDATED_AT, PG_VERSION, RepositoryProvider } from "alepha/orm";
|
|
12
9
|
import { $queue } from "alepha/queue";
|
|
10
|
+
import { $page } from "alepha/react/router";
|
|
13
11
|
import { $scheduler } from "alepha/scheduler";
|
|
14
12
|
import { $issuer } from "alepha/security";
|
|
15
13
|
import { $topic } from "alepha/topic";
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
id: pg.primaryKey(),
|
|
22
|
-
level: t.enum([
|
|
23
|
-
"TRACE",
|
|
24
|
-
"DEBUG",
|
|
25
|
-
"INFO",
|
|
26
|
-
"WARN",
|
|
27
|
-
"ERROR"
|
|
28
|
-
]),
|
|
29
|
-
message: t.text({ size: "rich" }),
|
|
30
|
-
service: t.text(),
|
|
31
|
-
module: t.text(),
|
|
32
|
-
context: t.optional(t.text()),
|
|
33
|
-
app: t.optional(t.text()),
|
|
34
|
-
data: t.optional(t.json()),
|
|
35
|
-
timestamp: t.integer()
|
|
36
|
-
})
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
//#endregion
|
|
40
|
-
//#region src/api/providers/DevToolsMetadataProvider.ts
|
|
14
|
+
import { localEmailOptions } from "alepha/email";
|
|
15
|
+
import { FileSystemProvider } from "alepha/system";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { fileURLToPath } from "node:url";
|
|
18
|
+
//#region src/providers/DevToolsMetadataProvider.ts
|
|
41
19
|
var DevToolsMetadataProvider = class {
|
|
42
20
|
alepha = $inject(Alepha);
|
|
21
|
+
dateTime = $inject(DateTimeProvider);
|
|
43
22
|
log = $logger();
|
|
23
|
+
serverProvider = $inject(ServerProvider);
|
|
24
|
+
startedAt = this.dateTime.nowMillis();
|
|
44
25
|
getActions() {
|
|
45
26
|
return this.alepha.primitives($action).map((action) => {
|
|
46
27
|
const schema = action.schema;
|
|
@@ -55,13 +36,14 @@ var DevToolsMetadataProvider = class {
|
|
|
55
36
|
description: action.options.description,
|
|
56
37
|
summary: options.summary,
|
|
57
38
|
disabled: action.options.disabled,
|
|
58
|
-
secure:
|
|
39
|
+
secure: action.middlewares.some((m) => m?.name === "$secure") || void 0,
|
|
59
40
|
hide: options.hide,
|
|
60
41
|
body: schema?.body,
|
|
61
42
|
params: schema?.params,
|
|
62
43
|
query: schema?.query,
|
|
63
44
|
response: schema?.response,
|
|
64
|
-
bodyContentType: action.getBodyContentType()
|
|
45
|
+
bodyContentType: action.getBodyContentType(),
|
|
46
|
+
middlewares: action.middlewares.filter(Boolean).length ? action.middlewares.filter(Boolean) : void 0
|
|
65
47
|
};
|
|
66
48
|
});
|
|
67
49
|
}
|
|
@@ -83,12 +65,20 @@ var DevToolsMetadataProvider = class {
|
|
|
83
65
|
}));
|
|
84
66
|
}
|
|
85
67
|
getTopics() {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
68
|
+
const topicPrimitives = this.alepha.primitives($topic);
|
|
69
|
+
const topicMap = /* @__PURE__ */ new Map();
|
|
70
|
+
for (const topic of topicPrimitives) {
|
|
71
|
+
const existing = topicMap.get(topic.name);
|
|
72
|
+
if (existing) existing.subscribers++;
|
|
73
|
+
else topicMap.set(topic.name, {
|
|
74
|
+
name: topic.name,
|
|
75
|
+
description: topic.options.description,
|
|
76
|
+
schema: topic.options.schema,
|
|
77
|
+
provider: this.getProviderName(topic.options.provider),
|
|
78
|
+
subscribers: 1
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return Array.from(topicMap.values());
|
|
92
82
|
}
|
|
93
83
|
getBuckets() {
|
|
94
84
|
return this.alepha.primitives($bucket).map((bucket) => ({
|
|
@@ -123,7 +113,30 @@ var DevToolsMetadataProvider = class {
|
|
|
123
113
|
}));
|
|
124
114
|
}
|
|
125
115
|
getPages() {
|
|
126
|
-
return
|
|
116
|
+
return this.alepha.primitives($page).map((page) => {
|
|
117
|
+
const children = typeof page.options.children === "function" ? page.options.children() : page.options.children;
|
|
118
|
+
const childrenNames = Array.isArray(children) ? children.map((c) => c.name).filter(Boolean) : void 0;
|
|
119
|
+
return {
|
|
120
|
+
name: page.name,
|
|
121
|
+
label: page.options.label,
|
|
122
|
+
description: page.options.description,
|
|
123
|
+
path: page.options.path,
|
|
124
|
+
parentName: page.options.parent?.name,
|
|
125
|
+
params: page.options.schema?.params,
|
|
126
|
+
query: page.options.schema?.query,
|
|
127
|
+
hasComponent: !!page.options.component,
|
|
128
|
+
hasLazy: !!page.options.lazy,
|
|
129
|
+
hasResolve: !!page.options.resolve,
|
|
130
|
+
childrenNames: childrenNames?.length ? childrenNames : void 0,
|
|
131
|
+
hasChildren: !!page.options.children,
|
|
132
|
+
hasParent: !!page.options.parent,
|
|
133
|
+
hasErrorHandler: !!page.options.errorHandler,
|
|
134
|
+
static: typeof page.options.static === "boolean" ? page.options.static : !!page.options.static,
|
|
135
|
+
cache: page.options.cache,
|
|
136
|
+
client: page.options.client,
|
|
137
|
+
animation: page.options.animation
|
|
138
|
+
};
|
|
139
|
+
});
|
|
127
140
|
}
|
|
128
141
|
getProviders() {
|
|
129
142
|
const graph = this.alepha.graph();
|
|
@@ -203,7 +216,10 @@ var DevToolsMetadataProvider = class {
|
|
|
203
216
|
columns,
|
|
204
217
|
indexes,
|
|
205
218
|
foreignKeys,
|
|
206
|
-
constraints
|
|
219
|
+
constraints,
|
|
220
|
+
schema: entity.schema,
|
|
221
|
+
insertSchema: entity.insertSchema,
|
|
222
|
+
updateSchema: entity.updateSchema
|
|
207
223
|
};
|
|
208
224
|
});
|
|
209
225
|
} catch {
|
|
@@ -237,13 +253,6 @@ var DevToolsMetadataProvider = class {
|
|
|
237
253
|
if (t.schema.isUnion(field) && field.anyOf) return field.anyOf.some((type) => t.schema.isNull(type));
|
|
238
254
|
return false;
|
|
239
255
|
}
|
|
240
|
-
getCommands() {
|
|
241
|
-
return this.alepha.primitives($command).filter((cmd) => !cmd.options.hide).map((command) => ({
|
|
242
|
-
name: command.name,
|
|
243
|
-
description: command.options.description,
|
|
244
|
-
hidden: command.options.hide
|
|
245
|
-
}));
|
|
246
|
-
}
|
|
247
256
|
getRoutes() {
|
|
248
257
|
return [];
|
|
249
258
|
}
|
|
@@ -264,8 +273,22 @@ var DevToolsMetadataProvider = class {
|
|
|
264
273
|
currentValue: value
|
|
265
274
|
}));
|
|
266
275
|
}
|
|
276
|
+
getSystem() {
|
|
277
|
+
const isBun = typeof globalThis.Bun !== "undefined";
|
|
278
|
+
const port = Number(this.alepha.env.SERVER_PORT) || 3e3;
|
|
279
|
+
return {
|
|
280
|
+
alephaVersion: String(this.alepha.env.npm_package_version ?? "unknown"),
|
|
281
|
+
nodeVersion: isBun ? globalThis.Bun?.version ?? "unknown" : process.version,
|
|
282
|
+
runtime: isBun ? "bun" : "node",
|
|
283
|
+
mode: this.alepha.isProduction() ? "production" : "development",
|
|
284
|
+
port,
|
|
285
|
+
uptime: (this.dateTime.nowMillis() - this.startedAt) / 1e3,
|
|
286
|
+
memoryUsage: process.memoryUsage?.()?.heapUsed ?? 0
|
|
287
|
+
};
|
|
288
|
+
}
|
|
267
289
|
getMetadata() {
|
|
268
290
|
return {
|
|
291
|
+
system: this.getSystem(),
|
|
269
292
|
actions: this.getActions(),
|
|
270
293
|
queues: this.getQueues(),
|
|
271
294
|
schedulers: this.getSchedulers(),
|
|
@@ -277,7 +300,6 @@ var DevToolsMetadataProvider = class {
|
|
|
277
300
|
providers: this.getProviders(),
|
|
278
301
|
modules: this.getModules(),
|
|
279
302
|
entities: this.getEntities(),
|
|
280
|
-
commands: this.getCommands(),
|
|
281
303
|
routes: this.getRoutes(),
|
|
282
304
|
envs: this.getEnvs(),
|
|
283
305
|
atoms: this.getAtoms()
|
|
@@ -289,37 +311,11 @@ var DevToolsMetadataProvider = class {
|
|
|
289
311
|
return provider.name || "custom";
|
|
290
312
|
}
|
|
291
313
|
};
|
|
292
|
-
|
|
293
|
-
//#endregion
|
|
294
|
-
//#region src/api/providers/DevToolsDatabaseProvider.ts
|
|
295
|
-
var DevToolsDatabaseProvider = class extends SqliteProvider {
|
|
296
|
-
get name() {
|
|
297
|
-
return "";
|
|
298
|
-
}
|
|
299
|
-
options = { path: ":memory:" };
|
|
300
|
-
async migrate() {
|
|
301
|
-
this.sqlite.exec(`
|
|
302
|
-
CREATE TABLE IF NOT EXISTS logs (
|
|
303
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
304
|
-
level TEXT NOT NULL,
|
|
305
|
-
message TEXT,
|
|
306
|
-
service TEXT,
|
|
307
|
-
module TEXT,
|
|
308
|
-
context TEXT,
|
|
309
|
-
app TEXT,
|
|
310
|
-
data TEXT,
|
|
311
|
-
timestamp INTEGER NOT NULL
|
|
312
|
-
)
|
|
313
|
-
`);
|
|
314
|
-
}
|
|
315
|
-
};
|
|
316
|
-
|
|
317
314
|
//#endregion
|
|
318
|
-
//#region src/
|
|
319
|
-
|
|
320
|
-
|
|
315
|
+
//#region src/assets.ts
|
|
316
|
+
const devtoolsAssets = { ui: join(fileURLToPath(import.meta.url), "../../assets/ui") };
|
|
321
317
|
//#endregion
|
|
322
|
-
//#region src/
|
|
318
|
+
//#region src/schemas/DevActionMetadata.ts
|
|
323
319
|
const devActionMetadataSchema = t.object({
|
|
324
320
|
name: t.text(),
|
|
325
321
|
group: t.text(),
|
|
@@ -336,11 +332,14 @@ const devActionMetadataSchema = t.object({
|
|
|
336
332
|
params: t.optional(t.any()),
|
|
337
333
|
query: t.optional(t.any()),
|
|
338
334
|
response: t.optional(t.any()),
|
|
339
|
-
bodyContentType: t.optional(t.text())
|
|
335
|
+
bodyContentType: t.optional(t.text()),
|
|
336
|
+
middlewares: t.optional(t.array(t.object({
|
|
337
|
+
name: t.text(),
|
|
338
|
+
options: t.optional(t.any())
|
|
339
|
+
})))
|
|
340
340
|
});
|
|
341
|
-
|
|
342
341
|
//#endregion
|
|
343
|
-
//#region src/
|
|
342
|
+
//#region src/schemas/DevAtomMetadata.ts
|
|
344
343
|
const devAtomMetadataSchema = t.object({
|
|
345
344
|
name: t.text(),
|
|
346
345
|
description: t.optional(t.text()),
|
|
@@ -348,9 +347,8 @@ const devAtomMetadataSchema = t.object({
|
|
|
348
347
|
defaultValue: t.optional(t.any()),
|
|
349
348
|
currentValue: t.optional(t.any())
|
|
350
349
|
});
|
|
351
|
-
|
|
352
350
|
//#endregion
|
|
353
|
-
//#region src/
|
|
351
|
+
//#region src/schemas/DevBucketMetadata.ts
|
|
354
352
|
const devBucketMetadataSchema = t.object({
|
|
355
353
|
name: t.text(),
|
|
356
354
|
description: t.optional(t.text()),
|
|
@@ -358,26 +356,16 @@ const devBucketMetadataSchema = t.object({
|
|
|
358
356
|
maxSize: t.optional(t.number()),
|
|
359
357
|
provider: t.text()
|
|
360
358
|
});
|
|
361
|
-
|
|
362
359
|
//#endregion
|
|
363
|
-
//#region src/
|
|
360
|
+
//#region src/schemas/DevCacheMetadata.ts
|
|
364
361
|
const devCacheMetadataSchema = t.object({
|
|
365
362
|
name: t.text(),
|
|
366
363
|
ttl: t.optional(t.any()),
|
|
367
364
|
disabled: t.optional(t.boolean()),
|
|
368
365
|
provider: t.text()
|
|
369
366
|
});
|
|
370
|
-
|
|
371
367
|
//#endregion
|
|
372
|
-
//#region src/
|
|
373
|
-
const devCommandMetadataSchema = t.object({
|
|
374
|
-
name: t.text(),
|
|
375
|
-
description: t.optional(t.text()),
|
|
376
|
-
hidden: t.optional(t.boolean())
|
|
377
|
-
});
|
|
378
|
-
|
|
379
|
-
//#endregion
|
|
380
|
-
//#region src/api/schemas/DevEntityMetadata.ts
|
|
368
|
+
//#region src/schemas/DevEntityMetadata.ts
|
|
381
369
|
const devEntityColumnSchema = t.object({
|
|
382
370
|
name: t.text(),
|
|
383
371
|
type: t.text(),
|
|
@@ -419,36 +407,39 @@ const devEntityMetadataSchema = t.object({
|
|
|
419
407
|
columns: t.array(devEntityColumnSchema),
|
|
420
408
|
indexes: t.array(devEntityIndexSchema),
|
|
421
409
|
foreignKeys: t.array(devEntityForeignKeySchema),
|
|
422
|
-
constraints: t.array(devEntityConstraintSchema)
|
|
410
|
+
constraints: t.array(devEntityConstraintSchema),
|
|
411
|
+
schema: t.optional(t.any()),
|
|
412
|
+
insertSchema: t.optional(t.any()),
|
|
413
|
+
updateSchema: t.optional(t.any())
|
|
423
414
|
});
|
|
424
|
-
|
|
425
415
|
//#endregion
|
|
426
|
-
//#region src/
|
|
416
|
+
//#region src/schemas/DevEnvMetadata.ts
|
|
427
417
|
const devEnvMetadataSchema = t.object({
|
|
428
418
|
propertyKey: t.text(),
|
|
429
419
|
schema: t.any(),
|
|
430
420
|
values: t.record(t.text(), t.any()),
|
|
431
421
|
serviceName: t.optional(t.text())
|
|
432
422
|
});
|
|
433
|
-
|
|
434
423
|
//#endregion
|
|
435
|
-
//#region src/
|
|
424
|
+
//#region src/schemas/DevModuleMetadata.ts
|
|
436
425
|
const devModuleMetadataSchema = t.object({
|
|
437
426
|
name: t.text(),
|
|
438
427
|
providers: t.array(t.text())
|
|
439
428
|
});
|
|
440
|
-
|
|
441
429
|
//#endregion
|
|
442
|
-
//#region src/
|
|
430
|
+
//#region src/schemas/DevPageMetadata.ts
|
|
443
431
|
const devPageMetadataSchema = t.object({
|
|
444
432
|
name: t.text(),
|
|
433
|
+
label: t.optional(t.text()),
|
|
445
434
|
description: t.optional(t.text()),
|
|
446
435
|
path: t.optional(t.text()),
|
|
436
|
+
parentName: t.optional(t.text()),
|
|
447
437
|
params: t.optional(t.any()),
|
|
448
438
|
query: t.optional(t.any()),
|
|
449
439
|
hasComponent: t.boolean(),
|
|
450
440
|
hasLazy: t.boolean(),
|
|
451
441
|
hasResolve: t.boolean(),
|
|
442
|
+
childrenNames: t.optional(t.array(t.text())),
|
|
452
443
|
hasChildren: t.boolean(),
|
|
453
444
|
hasParent: t.boolean(),
|
|
454
445
|
hasErrorHandler: t.boolean(),
|
|
@@ -457,27 +448,24 @@ const devPageMetadataSchema = t.object({
|
|
|
457
448
|
client: t.optional(t.any()),
|
|
458
449
|
animation: t.optional(t.any())
|
|
459
450
|
});
|
|
460
|
-
|
|
461
451
|
//#endregion
|
|
462
|
-
//#region src/
|
|
452
|
+
//#region src/schemas/DevProviderMetadata.ts
|
|
463
453
|
const devProviderMetadataSchema = t.object({
|
|
464
454
|
name: t.text(),
|
|
465
455
|
module: t.optional(t.text()),
|
|
466
456
|
dependencies: t.array(t.text()),
|
|
467
457
|
aliases: t.optional(t.array(t.text()))
|
|
468
458
|
});
|
|
469
|
-
|
|
470
459
|
//#endregion
|
|
471
|
-
//#region src/
|
|
460
|
+
//#region src/schemas/DevQueueMetadata.ts
|
|
472
461
|
const devQueueMetadataSchema = t.object({
|
|
473
462
|
name: t.text(),
|
|
474
463
|
description: t.optional(t.text()),
|
|
475
464
|
schema: t.optional(t.any()),
|
|
476
465
|
provider: t.text()
|
|
477
466
|
});
|
|
478
|
-
|
|
479
467
|
//#endregion
|
|
480
|
-
//#region src/
|
|
468
|
+
//#region src/schemas/DevRealmMetadata.ts
|
|
481
469
|
const devRealmMetadataSchema = t.object({
|
|
482
470
|
name: t.text(),
|
|
483
471
|
description: t.optional(t.text()),
|
|
@@ -491,16 +479,14 @@ const devRealmMetadataSchema = t.object({
|
|
|
491
479
|
hasOnDeleteSession: t.boolean()
|
|
492
480
|
}))
|
|
493
481
|
});
|
|
494
|
-
|
|
495
482
|
//#endregion
|
|
496
|
-
//#region src/
|
|
483
|
+
//#region src/schemas/DevRouteMetadata.ts
|
|
497
484
|
const devRouteMetadataSchema = t.object({
|
|
498
485
|
method: t.text(),
|
|
499
486
|
path: t.text()
|
|
500
487
|
});
|
|
501
|
-
|
|
502
488
|
//#endregion
|
|
503
|
-
//#region src/
|
|
489
|
+
//#region src/schemas/DevSchedulerMetadata.ts
|
|
504
490
|
const devSchedulerMetadataSchema = t.object({
|
|
505
491
|
name: t.text(),
|
|
506
492
|
description: t.optional(t.text()),
|
|
@@ -508,19 +494,28 @@ const devSchedulerMetadataSchema = t.object({
|
|
|
508
494
|
interval: t.optional(t.any()),
|
|
509
495
|
lock: t.optional(t.boolean())
|
|
510
496
|
});
|
|
511
|
-
|
|
512
497
|
//#endregion
|
|
513
|
-
//#region src/
|
|
498
|
+
//#region src/schemas/DevTopicMetadata.ts
|
|
514
499
|
const devTopicMetadataSchema = t.object({
|
|
515
500
|
name: t.text(),
|
|
516
501
|
description: t.optional(t.text()),
|
|
517
502
|
schema: t.optional(t.any()),
|
|
518
|
-
provider: t.text()
|
|
503
|
+
provider: t.text(),
|
|
504
|
+
subscribers: t.integer()
|
|
519
505
|
});
|
|
520
|
-
|
|
521
506
|
//#endregion
|
|
522
|
-
//#region src/
|
|
507
|
+
//#region src/schemas/DevMetadata.ts
|
|
508
|
+
const devSystemSchema = t.object({
|
|
509
|
+
alephaVersion: t.text(),
|
|
510
|
+
nodeVersion: t.text(),
|
|
511
|
+
runtime: t.enum(["node", "bun"]),
|
|
512
|
+
mode: t.enum(["development", "production"]),
|
|
513
|
+
port: t.integer(),
|
|
514
|
+
uptime: t.number(),
|
|
515
|
+
memoryUsage: t.number()
|
|
516
|
+
});
|
|
523
517
|
const devMetadataSchema = t.object({
|
|
518
|
+
system: devSystemSchema,
|
|
524
519
|
actions: t.array(devActionMetadataSchema),
|
|
525
520
|
queues: t.array(devQueueMetadataSchema),
|
|
526
521
|
schedulers: t.array(devSchedulerMetadataSchema),
|
|
@@ -532,84 +527,55 @@ const devMetadataSchema = t.object({
|
|
|
532
527
|
providers: t.array(devProviderMetadataSchema),
|
|
533
528
|
modules: t.array(devModuleMetadataSchema),
|
|
534
529
|
entities: t.array(devEntityMetadataSchema),
|
|
535
|
-
commands: t.array(devCommandMetadataSchema),
|
|
536
530
|
routes: t.array(devRouteMetadataSchema),
|
|
537
531
|
envs: t.array(devEnvMetadataSchema),
|
|
538
532
|
atoms: t.array(devAtomMetadataSchema)
|
|
539
533
|
});
|
|
540
|
-
|
|
541
534
|
//#endregion
|
|
542
|
-
//#region src/
|
|
535
|
+
//#region src/providers/DevToolsProvider.ts
|
|
543
536
|
var DevToolsProvider = class {
|
|
544
537
|
log = $logger();
|
|
545
538
|
alepha = $inject(Alepha);
|
|
546
539
|
serverProvider = $inject(ServerProvider);
|
|
547
|
-
jsonFormatter = $inject(JsonFormatterProvider);
|
|
548
|
-
logs = $inject(LogRepository);
|
|
549
540
|
devCollectorProvider = $inject(DevToolsMetadataProvider);
|
|
541
|
+
memoryDestination = $inject(MemoryDestinationProvider);
|
|
542
|
+
fs = $inject(FileSystemProvider);
|
|
543
|
+
emailOptions = $state(localEmailOptions);
|
|
550
544
|
onStart = $hook({
|
|
551
545
|
on: "start",
|
|
552
546
|
handler: () => {
|
|
553
|
-
this.log.info("Devtools OK", { url: `${this.serverProvider.hostname}/
|
|
554
|
-
}
|
|
555
|
-
});
|
|
556
|
-
batchLogs = $batch({
|
|
557
|
-
maxSize: 50,
|
|
558
|
-
maxDuration: [10, "seconds"],
|
|
559
|
-
schema: logs.insertSchema,
|
|
560
|
-
handler: async (entries) => {
|
|
561
|
-
await this.logs.createMany(entries);
|
|
547
|
+
this.log.info("Devtools OK", { url: `${this.serverProvider.hostname}/__devtools/` });
|
|
562
548
|
}
|
|
563
549
|
});
|
|
550
|
+
/**
|
|
551
|
+
* Capture all logs into memory so the devtools UI can display them.
|
|
552
|
+
* In dev mode, LogDestinationProvider is bound to ConsoleDestinationProvider,
|
|
553
|
+
* so MemoryDestinationProvider would otherwise never receive writes.
|
|
554
|
+
*/
|
|
564
555
|
onLog = $hook({
|
|
565
556
|
on: "log",
|
|
566
|
-
handler:
|
|
567
|
-
|
|
568
|
-
if (!this.alepha.isStarted()) return;
|
|
569
|
-
ev.entry.message = ev.entry.message?.slice(0, 2e3);
|
|
570
|
-
if (ev.entry.module === "alepha.devtools") return;
|
|
571
|
-
if (ev.entry.level === "TRACE" && ev.entry.module === "alepha.batch") return;
|
|
572
|
-
if (this.alepha.isProduction() && ev.entry.level === "TRACE") return;
|
|
573
|
-
const entry = {
|
|
574
|
-
...ev.entry,
|
|
575
|
-
data: ev.entry.data instanceof Error ? this.jsonFormatter.formatJsonError(ev.entry.data) : typeof ev.entry.data === "object" && !Array.isArray(ev.entry.data) ? ev.entry.data : { data: ev.entry.data }
|
|
576
|
-
};
|
|
577
|
-
await this.batchLogs.push(entry);
|
|
578
|
-
} catch (error) {
|
|
579
|
-
console.error(error, ev);
|
|
580
|
-
}
|
|
557
|
+
handler: ({ entry }) => {
|
|
558
|
+
this.memoryDestination.write("", entry);
|
|
581
559
|
}
|
|
582
560
|
});
|
|
583
561
|
uiRoute = $serve({
|
|
584
|
-
path: "/
|
|
585
|
-
root:
|
|
586
|
-
historyApiFallback: true
|
|
562
|
+
path: "/__devtools",
|
|
563
|
+
root: devtoolsAssets.ui,
|
|
564
|
+
historyApiFallback: true,
|
|
565
|
+
silent: true
|
|
587
566
|
});
|
|
588
567
|
metadataRoute = $route({
|
|
589
568
|
method: "GET",
|
|
590
|
-
path: "/
|
|
569
|
+
path: "/__devtools/api/metadata",
|
|
591
570
|
silent: true,
|
|
592
571
|
schema: { response: devMetadataSchema },
|
|
593
572
|
handler: () => {
|
|
594
573
|
return this.devCollectorProvider.getMetadata();
|
|
595
574
|
}
|
|
596
575
|
});
|
|
597
|
-
logsRoute = $route({
|
|
598
|
-
method: "GET",
|
|
599
|
-
path: "/devtools/api/logs",
|
|
600
|
-
silent: true,
|
|
601
|
-
schema: {
|
|
602
|
-
query: t.extend(pageQuerySchema, { search: t.optional(t.string()) }),
|
|
603
|
-
response: t.page(logs.schema)
|
|
604
|
-
},
|
|
605
|
-
handler: ({ query }) => {
|
|
606
|
-
query.sort ??= "-timestamp";
|
|
607
|
-
return this.logs.paginate(query, query.search ? { where: parseQueryString(query.search) } : {}, { count: true });
|
|
608
|
-
}
|
|
609
|
-
});
|
|
610
576
|
updateAtomRoute = $route({
|
|
611
577
|
method: "POST",
|
|
612
|
-
path: "/
|
|
578
|
+
path: "/__devtools/api/atoms",
|
|
613
579
|
silent: true,
|
|
614
580
|
schema: {
|
|
615
581
|
body: t.object({
|
|
@@ -627,15 +593,221 @@ var DevToolsProvider = class {
|
|
|
627
593
|
return { success: false };
|
|
628
594
|
}
|
|
629
595
|
});
|
|
596
|
+
logsRoute = $route({
|
|
597
|
+
method: "GET",
|
|
598
|
+
path: "/__devtools/api/logs",
|
|
599
|
+
silent: true,
|
|
600
|
+
schema: {
|
|
601
|
+
query: t.object({
|
|
602
|
+
level: t.optional(t.text()),
|
|
603
|
+
type: t.optional(t.text()),
|
|
604
|
+
module: t.optional(t.text()),
|
|
605
|
+
search: t.optional(t.text()),
|
|
606
|
+
since: t.optional(t.text()),
|
|
607
|
+
limit: t.optional(t.text()),
|
|
608
|
+
offset: t.optional(t.text())
|
|
609
|
+
}),
|
|
610
|
+
response: t.object({
|
|
611
|
+
logs: t.array(t.any()),
|
|
612
|
+
total: t.integer()
|
|
613
|
+
})
|
|
614
|
+
},
|
|
615
|
+
handler: ({ query }) => {
|
|
616
|
+
const levelOrder = [
|
|
617
|
+
"TRACE",
|
|
618
|
+
"DEBUG",
|
|
619
|
+
"INFO",
|
|
620
|
+
"WARN",
|
|
621
|
+
"ERROR"
|
|
622
|
+
];
|
|
623
|
+
let entries = this.memoryDestination.logs;
|
|
624
|
+
if (query.level) {
|
|
625
|
+
const minIndex = levelOrder.indexOf(query.level.toUpperCase());
|
|
626
|
+
if (minIndex >= 0) entries = entries.filter((e) => levelOrder.indexOf(e.level) >= minIndex);
|
|
627
|
+
}
|
|
628
|
+
if (query.type) {
|
|
629
|
+
const types = query.type.split(",").map((t) => t.trim());
|
|
630
|
+
entries = entries.filter((e) => {
|
|
631
|
+
if (!e.data || typeof e.data !== "object") return false;
|
|
632
|
+
const d = e.data;
|
|
633
|
+
for (const t of types) if (t === "http" || t === "http:request") {
|
|
634
|
+
if (d.status && d.method && d.path && d.duration) return true;
|
|
635
|
+
} else if (t === "db" || t === "db:query") {
|
|
636
|
+
if (d.type === "db:query") return true;
|
|
637
|
+
} else if (d.type === t) return true;
|
|
638
|
+
return false;
|
|
639
|
+
});
|
|
640
|
+
}
|
|
641
|
+
if (query.module) entries = entries.filter((e) => e.module === query.module);
|
|
642
|
+
if (query.search) {
|
|
643
|
+
const terms = query.search.toLowerCase().split(/\s+/);
|
|
644
|
+
entries = entries.filter((e) => {
|
|
645
|
+
const text = `${e.message} ${e.module} ${e.service}`.toLowerCase();
|
|
646
|
+
return terms.every((term) => text.includes(term));
|
|
647
|
+
});
|
|
648
|
+
}
|
|
649
|
+
if (query.since) {
|
|
650
|
+
const since = Number(query.since);
|
|
651
|
+
if (!Number.isNaN(since)) entries = entries.filter((e) => e.timestamp >= since);
|
|
652
|
+
}
|
|
653
|
+
const total = entries.length;
|
|
654
|
+
entries = entries.reverse();
|
|
655
|
+
const offset = query.offset ? Number(query.offset) : 0;
|
|
656
|
+
const limit = query.limit ? Number(query.limit) : 100;
|
|
657
|
+
entries = entries.slice(offset, offset + limit);
|
|
658
|
+
return {
|
|
659
|
+
logs: entries,
|
|
660
|
+
total
|
|
661
|
+
};
|
|
662
|
+
}
|
|
663
|
+
});
|
|
664
|
+
emailsRoute = $route({
|
|
665
|
+
method: "GET",
|
|
666
|
+
path: "/__devtools/api/emails",
|
|
667
|
+
silent: true,
|
|
668
|
+
schema: { response: t.object({ emails: t.array(t.object({
|
|
669
|
+
to: t.text(),
|
|
670
|
+
subject: t.text(),
|
|
671
|
+
body: t.string(),
|
|
672
|
+
sentAt: t.text()
|
|
673
|
+
})) }) },
|
|
674
|
+
handler: async () => {
|
|
675
|
+
try {
|
|
676
|
+
const dir = this.emailOptions.directory;
|
|
677
|
+
if (!await this.fs.exists(dir)) return { emails: [] };
|
|
678
|
+
const emailFiles = (await this.fs.ls(dir)).filter((f) => f.endsWith(".eml.json"));
|
|
679
|
+
const emails = [];
|
|
680
|
+
for (const file of emailFiles) try {
|
|
681
|
+
const data = await this.fs.readJsonFile(this.fs.join(dir, file));
|
|
682
|
+
emails.push(data);
|
|
683
|
+
} catch {}
|
|
684
|
+
emails.sort((a, b) => b.sentAt.localeCompare(a.sentAt));
|
|
685
|
+
return { emails };
|
|
686
|
+
} catch {
|
|
687
|
+
return { emails: [] };
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
});
|
|
691
|
+
smsRoute = $route({
|
|
692
|
+
method: "GET",
|
|
693
|
+
path: "/__devtools/api/sms",
|
|
694
|
+
silent: true,
|
|
695
|
+
schema: { response: t.object({ messages: t.array(t.object({
|
|
696
|
+
to: t.text(),
|
|
697
|
+
message: t.string(),
|
|
698
|
+
sentAt: t.text()
|
|
699
|
+
})) }) },
|
|
700
|
+
handler: async () => {
|
|
701
|
+
try {
|
|
702
|
+
const dir = "node_modules/.alepha/sms";
|
|
703
|
+
if (!await this.fs.exists(dir)) return { messages: [] };
|
|
704
|
+
const smsFiles = (await this.fs.ls(dir)).filter((f) => f.endsWith(".sms.json"));
|
|
705
|
+
const messages = [];
|
|
706
|
+
for (const file of smsFiles) try {
|
|
707
|
+
const data = await this.fs.readJsonFile(this.fs.join(dir, file));
|
|
708
|
+
messages.push(data);
|
|
709
|
+
} catch {}
|
|
710
|
+
messages.sort((a, b) => b.sentAt.localeCompare(a.sentAt));
|
|
711
|
+
return { messages };
|
|
712
|
+
} catch {
|
|
713
|
+
return { messages: [] };
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
});
|
|
717
|
+
dbListRoute = $route({
|
|
718
|
+
method: "GET",
|
|
719
|
+
path: "/__devtools/api/db/:entity/records",
|
|
720
|
+
silent: true,
|
|
721
|
+
schema: {
|
|
722
|
+
params: t.object({ entity: t.text() }),
|
|
723
|
+
query: t.object({
|
|
724
|
+
page: t.optional(t.text()),
|
|
725
|
+
size: t.optional(t.text()),
|
|
726
|
+
sort: t.optional(t.text())
|
|
727
|
+
}),
|
|
728
|
+
response: t.record(t.text(), t.any())
|
|
729
|
+
},
|
|
730
|
+
handler: async ({ params, query }) => {
|
|
731
|
+
const repo = this.getRepository(params.entity);
|
|
732
|
+
if (!repo) return {
|
|
733
|
+
content: [],
|
|
734
|
+
page: { totalElements: 0 }
|
|
735
|
+
};
|
|
736
|
+
return repo.paginate({
|
|
737
|
+
page: query.page ? Number(query.page) : 0,
|
|
738
|
+
size: query.size ? Number(query.size) : 50,
|
|
739
|
+
sort: query.sort || void 0
|
|
740
|
+
}, {}, { count: true });
|
|
741
|
+
}
|
|
742
|
+
});
|
|
743
|
+
dbCreateRoute = $route({
|
|
744
|
+
method: "POST",
|
|
745
|
+
path: "/__devtools/api/db/:entity/records",
|
|
746
|
+
silent: true,
|
|
747
|
+
schema: {
|
|
748
|
+
params: t.object({ entity: t.text() }),
|
|
749
|
+
body: t.record(t.text(), t.any()),
|
|
750
|
+
response: t.record(t.text(), t.any())
|
|
751
|
+
},
|
|
752
|
+
handler: async ({ params, body }) => {
|
|
753
|
+
const repo = this.getRepository(params.entity);
|
|
754
|
+
if (!repo) return { error: "Entity not found" };
|
|
755
|
+
return repo.create(body);
|
|
756
|
+
}
|
|
757
|
+
});
|
|
758
|
+
dbUpdateRoute = $route({
|
|
759
|
+
method: "PUT",
|
|
760
|
+
path: "/__devtools/api/db/:entity/records/:id",
|
|
761
|
+
silent: true,
|
|
762
|
+
schema: {
|
|
763
|
+
params: t.object({
|
|
764
|
+
entity: t.text(),
|
|
765
|
+
id: t.text()
|
|
766
|
+
}),
|
|
767
|
+
body: t.record(t.text(), t.any()),
|
|
768
|
+
response: t.record(t.text(), t.any())
|
|
769
|
+
},
|
|
770
|
+
handler: async ({ params, body }) => {
|
|
771
|
+
const repo = this.getRepository(params.entity);
|
|
772
|
+
if (!repo) return { error: "Entity not found" };
|
|
773
|
+
const idValue = this.parseId(repo, params.id);
|
|
774
|
+
return repo.updateById(idValue, body);
|
|
775
|
+
}
|
|
776
|
+
});
|
|
777
|
+
dbDeleteRoute = $route({
|
|
778
|
+
method: "DELETE",
|
|
779
|
+
path: "/__devtools/api/db/:entity/records/:id",
|
|
780
|
+
silent: true,
|
|
781
|
+
schema: {
|
|
782
|
+
params: t.object({
|
|
783
|
+
entity: t.text(),
|
|
784
|
+
id: t.text()
|
|
785
|
+
}),
|
|
786
|
+
response: t.record(t.text(), t.any())
|
|
787
|
+
},
|
|
788
|
+
handler: async ({ params }) => {
|
|
789
|
+
const repo = this.getRepository(params.entity);
|
|
790
|
+
if (!repo) return { error: "Entity not found" };
|
|
791
|
+
const idValue = this.parseId(repo, params.id);
|
|
792
|
+
return repo.deleteById(idValue);
|
|
793
|
+
}
|
|
794
|
+
});
|
|
795
|
+
getRepository(entityName) {
|
|
796
|
+
try {
|
|
797
|
+
return this.alepha.inject(RepositoryProvider).getRepositories().find((r) => r.entity.name === entityName);
|
|
798
|
+
} catch {
|
|
799
|
+
return;
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
parseId(repo, rawId) {
|
|
803
|
+
const idType = repo.id.type;
|
|
804
|
+
if (idType?.type === "integer" || idType?.type === "number") return Number(rawId);
|
|
805
|
+
return rawId;
|
|
806
|
+
}
|
|
630
807
|
};
|
|
631
|
-
|
|
632
808
|
//#endregion
|
|
633
809
|
//#region src/index.ts
|
|
634
810
|
/**
|
|
635
|
-
* | type | quality | stability |
|
|
636
|
-
* |------|---------|-----------|
|
|
637
|
-
* | tooling | rare | experimental |
|
|
638
|
-
*
|
|
639
811
|
* Runtime inspection and debugging UI.
|
|
640
812
|
*
|
|
641
813
|
* **Features:**
|
|
@@ -652,24 +824,16 @@ var DevToolsProvider = class {
|
|
|
652
824
|
const AlephaDevtools = $module({
|
|
653
825
|
name: "alepha.devtools",
|
|
654
826
|
primitives: [],
|
|
655
|
-
services: [
|
|
656
|
-
DevToolsMetadataProvider,
|
|
657
|
-
DevToolsProvider,
|
|
658
|
-
DevToolsDatabaseProvider,
|
|
659
|
-
LogRepository
|
|
660
|
-
],
|
|
827
|
+
services: [DevToolsMetadataProvider, DevToolsProvider],
|
|
661
828
|
register: (alepha) => {
|
|
829
|
+
alepha.with(AlephaServer);
|
|
830
|
+
alepha.with(AlephaServerStatic);
|
|
662
831
|
alepha.with(DevToolsProvider);
|
|
663
|
-
alepha.with(DevToolsDatabaseProvider);
|
|
664
832
|
alepha.with(DevToolsMetadataProvider);
|
|
665
|
-
alepha.store.push("alepha.build.assets", "
|
|
833
|
+
alepha.store.push("alepha.build.assets", "alepha");
|
|
666
834
|
}
|
|
667
835
|
});
|
|
668
|
-
const $devtools = () => {
|
|
669
|
-
$context().alepha.with(AlephaDevtools);
|
|
670
|
-
return {};
|
|
671
|
-
};
|
|
672
|
-
|
|
673
836
|
//#endregion
|
|
674
|
-
export {
|
|
837
|
+
export { AlephaDevtools, DevToolsMetadataProvider, devActionMetadataSchema, devAtomMetadataSchema, devBucketMetadataSchema, devCacheMetadataSchema, devEntityColumnSchema, devEntityConstraintSchema, devEntityForeignKeySchema, devEntityIndexSchema, devEntityMetadataSchema, devEnvMetadataSchema, devMetadataSchema, devModuleMetadataSchema, devPageMetadataSchema, devProviderMetadataSchema, devQueueMetadataSchema, devRealmMetadataSchema, devRouteMetadataSchema, devSchedulerMetadataSchema, devSystemSchema, devTopicMetadataSchema };
|
|
838
|
+
|
|
675
839
|
//# sourceMappingURL=index.js.map
|