@alepha/devtools 0.16.0 → 0.19.1

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 (236) hide show
  1. package/README.md +1 -5
  2. package/dist/index.browser.js +224 -0
  3. package/dist/index.browser.js.map +1 -0
  4. package/dist/index.d.ts +349 -321
  5. package/dist/index.js +293 -186
  6. package/dist/index.js.map +1 -1
  7. package/package.json +30 -23
  8. package/src/assets.ts +6 -0
  9. package/src/{api/entities → entities}/logs.ts +2 -2
  10. package/src/index.browser.ts +11 -0
  11. package/src/index.shared.ts +15 -0
  12. package/src/index.ts +11 -37
  13. package/src/{api/providers → providers}/DevToolsMetadataProvider.ts +84 -47
  14. package/src/providers/DevToolsProvider.ts +280 -0
  15. package/src/{api/schemas → schemas}/DevActionMetadata.ts +8 -0
  16. package/src/{api/schemas → schemas}/DevEntityMetadata.ts +3 -0
  17. package/src/{api/schemas → schemas}/DevMetadata.ts +13 -2
  18. package/src/{api/schemas → schemas}/DevPageMetadata.ts +3 -0
  19. package/src/{api/schemas → schemas}/DevTopicMetadata.ts +1 -0
  20. package/src/ui/AppRouter.tsx +55 -59
  21. package/src/ui/components/DevLayout.tsx +104 -84
  22. package/src/ui/components/configuration/ConfigAtoms.page.tsx +5 -0
  23. package/src/ui/components/configuration/ConfigAtoms.tsx +511 -0
  24. package/src/ui/components/configuration/ConfigEnv.page.tsx +5 -0
  25. package/src/ui/components/configuration/ConfigEnv.tsx +230 -0
  26. package/src/ui/components/configuration/DevConfiguration.tsx +36 -0
  27. package/src/ui/components/configuration/index.ts +3 -0
  28. package/src/ui/components/dashboard/DevDashboard.tsx +482 -0
  29. package/src/ui/components/database/DatabaseEditor.page.tsx +23 -0
  30. package/src/ui/components/database/DatabaseEditor.tsx +399 -0
  31. package/src/ui/components/database/DatabaseErd.page.tsx +28 -0
  32. package/src/ui/components/database/DatabaseErd.tsx +107 -0
  33. package/src/ui/components/database/DevDatabase.tsx +36 -0
  34. package/src/ui/components/database/EntityNode.tsx +83 -0
  35. package/src/ui/components/explorer/DevExplorer.tsx +351 -0
  36. package/src/ui/components/explorer/ExplorerTree.tsx +178 -0
  37. package/src/ui/components/explorer/panels/DevPanelAction.tsx +499 -0
  38. package/src/ui/components/explorer/panels/DevPanelCache.tsx +73 -0
  39. package/src/ui/components/explorer/panels/DevPanelPage.tsx +96 -0
  40. package/src/ui/components/explorer/panels/DevPanelQueue.tsx +51 -0
  41. package/src/ui/components/explorer/panels/DevPanelTopic.tsx +56 -0
  42. package/src/ui/components/explorer/panels/index.ts +5 -0
  43. package/src/ui/components/graph/DevDependencyGraph.tsx +35 -60
  44. package/src/ui/components/graph/GraphControls.tsx +10 -11
  45. package/src/ui/components/graph/NodeDetails.tsx +22 -29
  46. package/src/ui/components/graph/ProviderNode.tsx +4 -4
  47. package/src/ui/components/graph/helpers.ts +1 -1
  48. package/src/ui/components/logs/DevLogs.tsx +661 -0
  49. package/src/ui/components/logs/index.ts +1 -0
  50. package/src/ui/components/shared/TreeView.tsx +189 -0
  51. package/src/ui/main.css +17 -0
  52. package/src/ui/main.ts +2 -6
  53. package/LICENSE +0 -21
  54. package/assets/devtools/actions.html +0 -21
  55. package/assets/devtools/actions.html.br +0 -0
  56. package/assets/devtools/actions.html.gz +0 -0
  57. package/assets/devtools/asset.BJSLFcNT.css +0 -1
  58. package/assets/devtools/asset.BJSLFcNT.css.br +0 -0
  59. package/assets/devtools/asset.BJSLFcNT.css.gz +0 -0
  60. package/assets/devtools/asset.BZV40eAE.css +0 -1
  61. package/assets/devtools/asset.BZV40eAE.css.br +0 -0
  62. package/assets/devtools/asset.BZV40eAE.css.gz +0 -0
  63. package/assets/devtools/atoms.html +0 -21
  64. package/assets/devtools/atoms.html.br +0 -0
  65. package/assets/devtools/atoms.html.gz +0 -0
  66. package/assets/devtools/caches.html +0 -21
  67. package/assets/devtools/caches.html.br +0 -0
  68. package/assets/devtools/caches.html.gz +0 -0
  69. package/assets/devtools/chunk.1h5GuATm.js +0 -1
  70. package/assets/devtools/chunk.1h5GuATm.js.br +0 -0
  71. package/assets/devtools/chunk.1h5GuATm.js.gz +0 -0
  72. package/assets/devtools/chunk.3PgxxOdM.js +0 -1
  73. package/assets/devtools/chunk.3PgxxOdM.js.br +0 -0
  74. package/assets/devtools/chunk.3PgxxOdM.js.gz +0 -0
  75. package/assets/devtools/chunk.A_W3H6Aa.js +0 -1
  76. package/assets/devtools/chunk.A_W3H6Aa.js.br +0 -0
  77. package/assets/devtools/chunk.A_W3H6Aa.js.gz +0 -0
  78. package/assets/devtools/chunk.B5tL0VjH.js +0 -1
  79. package/assets/devtools/chunk.B5tL0VjH.js.br +0 -0
  80. package/assets/devtools/chunk.B5tL0VjH.js.gz +0 -0
  81. package/assets/devtools/chunk.B8p_Szro.js +0 -1
  82. package/assets/devtools/chunk.B8p_Szro.js.br +0 -0
  83. package/assets/devtools/chunk.B8p_Szro.js.gz +0 -0
  84. package/assets/devtools/chunk.BANy8c2v.js +0 -1
  85. package/assets/devtools/chunk.BANy8c2v.js.br +0 -0
  86. package/assets/devtools/chunk.BANy8c2v.js.gz +0 -0
  87. package/assets/devtools/chunk.BKph0hv1.js +0 -1
  88. package/assets/devtools/chunk.BKph0hv1.js.br +0 -0
  89. package/assets/devtools/chunk.BKph0hv1.js.gz +0 -0
  90. package/assets/devtools/chunk.BUs1kuwE.js +0 -1
  91. package/assets/devtools/chunk.BUs1kuwE.js.br +0 -0
  92. package/assets/devtools/chunk.BUs1kuwE.js.gz +0 -0
  93. package/assets/devtools/chunk.BVIEr21R.js +0 -1
  94. package/assets/devtools/chunk.BVIEr21R.js.br +0 -0
  95. package/assets/devtools/chunk.BVIEr21R.js.gz +0 -0
  96. package/assets/devtools/chunk.Bb3re2d8.js +0 -1
  97. package/assets/devtools/chunk.Bb3re2d8.js.br +0 -2
  98. package/assets/devtools/chunk.Bb3re2d8.js.gz +0 -0
  99. package/assets/devtools/chunk.BjFrJKj1.js +0 -1
  100. package/assets/devtools/chunk.BjFrJKj1.js.br +0 -2
  101. package/assets/devtools/chunk.BjFrJKj1.js.gz +0 -0
  102. package/assets/devtools/chunk.BkXzz14p.js +0 -1
  103. package/assets/devtools/chunk.BkXzz14p.js.br +0 -0
  104. package/assets/devtools/chunk.BkXzz14p.js.gz +0 -0
  105. package/assets/devtools/chunk.BlqFPyLh.js +0 -1
  106. package/assets/devtools/chunk.BlqFPyLh.js.br +0 -0
  107. package/assets/devtools/chunk.BlqFPyLh.js.gz +0 -0
  108. package/assets/devtools/chunk.BymZ9jU5.js +0 -1
  109. package/assets/devtools/chunk.BymZ9jU5.js.br +0 -0
  110. package/assets/devtools/chunk.BymZ9jU5.js.gz +0 -0
  111. package/assets/devtools/chunk.C0BD3Ujz.js +0 -1
  112. package/assets/devtools/chunk.C0BD3Ujz.js.br +0 -0
  113. package/assets/devtools/chunk.C0BD3Ujz.js.gz +0 -0
  114. package/assets/devtools/chunk.C63rzhbT.js +0 -1
  115. package/assets/devtools/chunk.C63rzhbT.js.br +0 -0
  116. package/assets/devtools/chunk.C63rzhbT.js.gz +0 -0
  117. package/assets/devtools/chunk.CJrYVzjN.js +0 -9
  118. package/assets/devtools/chunk.CJrYVzjN.js.br +0 -0
  119. package/assets/devtools/chunk.CJrYVzjN.js.gz +0 -0
  120. package/assets/devtools/chunk.CPGX3Xpx.js +0 -1
  121. package/assets/devtools/chunk.CPGX3Xpx.js.br +0 -1
  122. package/assets/devtools/chunk.CPGX3Xpx.js.gz +0 -0
  123. package/assets/devtools/chunk.Cf-3skUw.js +0 -1
  124. package/assets/devtools/chunk.Cf-3skUw.js.br +0 -0
  125. package/assets/devtools/chunk.Cf-3skUw.js.gz +0 -0
  126. package/assets/devtools/chunk.D7JLxcoJ.js +0 -7
  127. package/assets/devtools/chunk.D7JLxcoJ.js.br +0 -0
  128. package/assets/devtools/chunk.D7JLxcoJ.js.gz +0 -0
  129. package/assets/devtools/chunk.D7e5mBY4.js +0 -1
  130. package/assets/devtools/chunk.D7e5mBY4.js.br +0 -0
  131. package/assets/devtools/chunk.D7e5mBY4.js.gz +0 -0
  132. package/assets/devtools/chunk.DClU9Z1_.js +0 -1
  133. package/assets/devtools/chunk.DClU9Z1_.js.br +0 -0
  134. package/assets/devtools/chunk.DClU9Z1_.js.gz +0 -0
  135. package/assets/devtools/chunk.DE_M8b3Z.js +0 -1
  136. package/assets/devtools/chunk.DE_M8b3Z.js.br +0 -0
  137. package/assets/devtools/chunk.DE_M8b3Z.js.gz +0 -0
  138. package/assets/devtools/chunk.DWASJDBE.js +0 -1
  139. package/assets/devtools/chunk.DWASJDBE.js.br +0 -0
  140. package/assets/devtools/chunk.DWASJDBE.js.gz +0 -0
  141. package/assets/devtools/chunk.DfzRLqwW.js +0 -1
  142. package/assets/devtools/chunk.DfzRLqwW.js.br +0 -0
  143. package/assets/devtools/chunk.DfzRLqwW.js.gz +0 -0
  144. package/assets/devtools/chunk.Dww1YQtc.js +0 -1
  145. package/assets/devtools/chunk.Dww1YQtc.js.br +0 -0
  146. package/assets/devtools/chunk.Dww1YQtc.js.gz +0 -0
  147. package/assets/devtools/chunk.HFLdduaf.js +0 -1
  148. package/assets/devtools/chunk.HFLdduaf.js.br +0 -0
  149. package/assets/devtools/chunk.HFLdduaf.js.gz +0 -0
  150. package/assets/devtools/chunk.J-htqECs.js +0 -1
  151. package/assets/devtools/chunk.J-htqECs.js.br +0 -2
  152. package/assets/devtools/chunk.J-htqECs.js.gz +0 -0
  153. package/assets/devtools/chunk.JjTGVewZ.js +0 -2
  154. package/assets/devtools/chunk.JjTGVewZ.js.br +0 -0
  155. package/assets/devtools/chunk.JjTGVewZ.js.gz +0 -0
  156. package/assets/devtools/chunk.OV_89czZ.js +0 -1
  157. package/assets/devtools/chunk.OV_89czZ.js.br +0 -0
  158. package/assets/devtools/chunk.OV_89czZ.js.gz +0 -0
  159. package/assets/devtools/chunk.YFkMUqFM.js +0 -1
  160. package/assets/devtools/chunk.YFkMUqFM.js.br +0 -0
  161. package/assets/devtools/chunk.YFkMUqFM.js.gz +0 -0
  162. package/assets/devtools/chunk._KdUFIrt.js +0 -1
  163. package/assets/devtools/chunk._KdUFIrt.js.br +0 -0
  164. package/assets/devtools/chunk._KdUFIrt.js.gz +0 -0
  165. package/assets/devtools/chunk.pjP6xqG8.js +0 -1
  166. package/assets/devtools/chunk.pjP6xqG8.js.br +0 -0
  167. package/assets/devtools/chunk.pjP6xqG8.js.gz +0 -0
  168. package/assets/devtools/chunk.uTFtY0ae.js +0 -2
  169. package/assets/devtools/chunk.uTFtY0ae.js.br +0 -0
  170. package/assets/devtools/chunk.uTFtY0ae.js.gz +0 -0
  171. package/assets/devtools/chunk.uyVen0u2.js +0 -1
  172. package/assets/devtools/chunk.uyVen0u2.js.br +0 -0
  173. package/assets/devtools/chunk.uyVen0u2.js.gz +0 -0
  174. package/assets/devtools/chunk.vHjNjQS8.js +0 -1
  175. package/assets/devtools/chunk.vHjNjQS8.js.br +0 -0
  176. package/assets/devtools/chunk.vHjNjQS8.js.gz +0 -0
  177. package/assets/devtools/db.html +0 -21
  178. package/assets/devtools/db.html.br +0 -0
  179. package/assets/devtools/db.html.gz +0 -0
  180. package/assets/devtools/entry.DhzNl8q_.js +0 -79
  181. package/assets/devtools/entry.DhzNl8q_.js.br +0 -0
  182. package/assets/devtools/entry.DhzNl8q_.js.gz +0 -0
  183. package/assets/devtools/env.html +0 -21
  184. package/assets/devtools/env.html.br +0 -0
  185. package/assets/devtools/env.html.gz +0 -0
  186. package/assets/devtools/graph.html +0 -22
  187. package/assets/devtools/graph.html.br +0 -0
  188. package/assets/devtools/graph.html.gz +0 -0
  189. package/assets/devtools/index.html +0 -21
  190. package/assets/devtools/index.html.br +0 -0
  191. package/assets/devtools/index.html.gz +0 -0
  192. package/assets/devtools/logs.html +0 -21
  193. package/assets/devtools/logs.html.br +0 -0
  194. package/assets/devtools/logs.html.gz +0 -0
  195. package/assets/devtools/queues.html +0 -21
  196. package/assets/devtools/queues.html.br +0 -0
  197. package/assets/devtools/queues.html.gz +0 -0
  198. package/assets/devtools/topics.html +0 -21
  199. package/assets/devtools/topics.html.br +0 -0
  200. package/assets/devtools/topics.html.gz +0 -0
  201. package/src/api/DevToolsProvider.ts +0 -157
  202. package/src/api/providers/DevToolsDatabaseProvider.ts +0 -27
  203. package/src/api/repositories/LogRepository.ts +0 -8
  204. package/src/api/schemas/DevCommandMetadata.ts +0 -9
  205. package/src/ui/components/DevAtomsViewer.tsx +0 -637
  206. package/src/ui/components/DevCacheInspector.tsx +0 -423
  207. package/src/ui/components/DevDashboard.tsx +0 -38
  208. package/src/ui/components/DevEnvExplorer.tsx +0 -462
  209. package/src/ui/components/DevLogViewer.tsx +0 -252
  210. package/src/ui/components/DevQueueMonitor.tsx +0 -51
  211. package/src/ui/components/DevTopicsViewer.tsx +0 -686
  212. package/src/ui/components/actions/ActionGroup.tsx +0 -37
  213. package/src/ui/components/actions/ActionItem.tsx +0 -138
  214. package/src/ui/components/actions/DevActionsExplorer.tsx +0 -132
  215. package/src/ui/components/actions/MethodBadge.tsx +0 -18
  216. package/src/ui/components/actions/SchemaViewer.tsx +0 -21
  217. package/src/ui/components/actions/TryItPanel.tsx +0 -140
  218. package/src/ui/components/actions/constants.ts +0 -7
  219. package/src/ui/components/actions/helpers.ts +0 -18
  220. package/src/ui/components/actions/index.ts +0 -8
  221. package/src/ui/components/db/ColumnBadge.tsx +0 -55
  222. package/src/ui/components/db/DevDbStudio.tsx +0 -485
  223. package/src/ui/components/db/constants.ts +0 -11
  224. package/src/ui/components/db/index.ts +0 -4
  225. package/src/ui/components/db/types.ts +0 -7
  226. package/src/ui/styles.css +0 -1
  227. /package/src/{api/schemas → schemas}/DevAtomMetadata.ts +0 -0
  228. /package/src/{api/schemas → schemas}/DevBucketMetadata.ts +0 -0
  229. /package/src/{api/schemas → schemas}/DevCacheMetadata.ts +0 -0
  230. /package/src/{api/schemas → schemas}/DevEnvMetadata.ts +0 -0
  231. /package/src/{api/schemas → schemas}/DevModuleMetadata.ts +0 -0
  232. /package/src/{api/schemas → schemas}/DevProviderMetadata.ts +0 -0
  233. /package/src/{api/schemas → schemas}/DevQueueMetadata.ts +0 -0
  234. /package/src/{api/schemas → schemas}/DevRealmMetadata.ts +0 -0
  235. /package/src/{api/schemas → schemas}/DevRouteMetadata.ts +0 -0
  236. /package/src/{api/schemas → schemas}/DevSchedulerMetadata.ts +0 -0
package/dist/index.js CHANGED
@@ -1,46 +1,25 @@
1
- import { $context, $hook, $inject, $module, Alepha, pageQuerySchema, t } from "alepha";
2
- import { join } from "node:path";
3
- import { fileURLToPath } from "node:url";
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, 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 { $command } from "alepha/command";
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
- //#region src/api/entities/logs.ts
18
- const logs = $entity({
19
- name: "logs",
20
- schema: t.object({
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 { join } from "node:path";
15
+ import { fileURLToPath } from "node:url";
16
+ //#region src/providers/DevToolsMetadataProvider.ts
41
17
  var DevToolsMetadataProvider = class {
42
18
  alepha = $inject(Alepha);
19
+ dateTime = $inject(DateTimeProvider);
43
20
  log = $logger();
21
+ serverProvider = $inject(ServerProvider);
22
+ startedAt = this.dateTime.nowMillis();
44
23
  getActions() {
45
24
  return this.alepha.primitives($action).map((action) => {
46
25
  const schema = action.schema;
@@ -55,13 +34,14 @@ var DevToolsMetadataProvider = class {
55
34
  description: action.options.description,
56
35
  summary: options.summary,
57
36
  disabled: action.options.disabled,
58
- secure: options.secure,
37
+ secure: action.middlewares.some((m) => m?.name === "$secure") || void 0,
59
38
  hide: options.hide,
60
39
  body: schema?.body,
61
40
  params: schema?.params,
62
41
  query: schema?.query,
63
42
  response: schema?.response,
64
- bodyContentType: action.getBodyContentType()
43
+ bodyContentType: action.getBodyContentType(),
44
+ middlewares: action.middlewares.filter(Boolean).length ? action.middlewares.filter(Boolean) : void 0
65
45
  };
66
46
  });
67
47
  }
@@ -83,12 +63,20 @@ var DevToolsMetadataProvider = class {
83
63
  }));
84
64
  }
85
65
  getTopics() {
86
- return this.alepha.primitives($topic).map((topic) => ({
87
- name: topic.name,
88
- description: topic.options.description,
89
- schema: topic.options.schema,
90
- provider: this.getProviderName(topic.options.provider)
91
- }));
66
+ const topicPrimitives = this.alepha.primitives($topic);
67
+ const topicMap = /* @__PURE__ */ new Map();
68
+ for (const topic of topicPrimitives) {
69
+ const existing = topicMap.get(topic.name);
70
+ if (existing) existing.subscribers++;
71
+ else topicMap.set(topic.name, {
72
+ name: topic.name,
73
+ description: topic.options.description,
74
+ schema: topic.options.schema,
75
+ provider: this.getProviderName(topic.options.provider),
76
+ subscribers: 1
77
+ });
78
+ }
79
+ return Array.from(topicMap.values());
92
80
  }
93
81
  getBuckets() {
94
82
  return this.alepha.primitives($bucket).map((bucket) => ({
@@ -123,7 +111,30 @@ var DevToolsMetadataProvider = class {
123
111
  }));
124
112
  }
125
113
  getPages() {
126
- return [];
114
+ return this.alepha.primitives($page).map((page) => {
115
+ const children = typeof page.options.children === "function" ? page.options.children() : page.options.children;
116
+ const childrenNames = Array.isArray(children) ? children.map((c) => c.name).filter(Boolean) : void 0;
117
+ return {
118
+ name: page.name,
119
+ label: page.options.label,
120
+ description: page.options.description,
121
+ path: page.options.path,
122
+ parentName: page.options.parent?.name,
123
+ params: page.options.schema?.params,
124
+ query: page.options.schema?.query,
125
+ hasComponent: !!page.options.component,
126
+ hasLazy: !!page.options.lazy,
127
+ hasResolve: !!page.options.resolve,
128
+ childrenNames: childrenNames?.length ? childrenNames : void 0,
129
+ hasChildren: !!page.options.children,
130
+ hasParent: !!page.options.parent,
131
+ hasErrorHandler: !!page.options.errorHandler,
132
+ static: typeof page.options.static === "boolean" ? page.options.static : !!page.options.static,
133
+ cache: page.options.cache,
134
+ client: page.options.client,
135
+ animation: page.options.animation
136
+ };
137
+ });
127
138
  }
128
139
  getProviders() {
129
140
  const graph = this.alepha.graph();
@@ -203,7 +214,10 @@ var DevToolsMetadataProvider = class {
203
214
  columns,
204
215
  indexes,
205
216
  foreignKeys,
206
- constraints
217
+ constraints,
218
+ schema: entity.schema,
219
+ insertSchema: entity.insertSchema,
220
+ updateSchema: entity.updateSchema
207
221
  };
208
222
  });
209
223
  } catch {
@@ -237,13 +251,6 @@ var DevToolsMetadataProvider = class {
237
251
  if (t.schema.isUnion(field) && field.anyOf) return field.anyOf.some((type) => t.schema.isNull(type));
238
252
  return false;
239
253
  }
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
254
  getRoutes() {
248
255
  return [];
249
256
  }
@@ -264,8 +271,22 @@ var DevToolsMetadataProvider = class {
264
271
  currentValue: value
265
272
  }));
266
273
  }
274
+ getSystem() {
275
+ const isBun = typeof globalThis.Bun !== "undefined";
276
+ const port = Number(this.alepha.env.SERVER_PORT) || 3e3;
277
+ return {
278
+ alephaVersion: String(this.alepha.env.npm_package_version ?? "unknown"),
279
+ nodeVersion: isBun ? globalThis.Bun?.version ?? "unknown" : process.version,
280
+ runtime: isBun ? "bun" : "node",
281
+ mode: this.alepha.isProduction() ? "production" : "development",
282
+ port,
283
+ uptime: (this.dateTime.nowMillis() - this.startedAt) / 1e3,
284
+ memoryUsage: process.memoryUsage?.()?.rss ?? 0
285
+ };
286
+ }
267
287
  getMetadata() {
268
288
  return {
289
+ system: this.getSystem(),
269
290
  actions: this.getActions(),
270
291
  queues: this.getQueues(),
271
292
  schedulers: this.getSchedulers(),
@@ -277,7 +298,6 @@ var DevToolsMetadataProvider = class {
277
298
  providers: this.getProviders(),
278
299
  modules: this.getModules(),
279
300
  entities: this.getEntities(),
280
- commands: this.getCommands(),
281
301
  routes: this.getRoutes(),
282
302
  envs: this.getEnvs(),
283
303
  atoms: this.getAtoms()
@@ -289,37 +309,11 @@ var DevToolsMetadataProvider = class {
289
309
  return provider.name || "custom";
290
310
  }
291
311
  };
292
-
293
312
  //#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
-
313
+ //#region src/assets.ts
314
+ const devtoolsAssets = { ui: join(fileURLToPath(import.meta.url), "../../assets/ui") };
317
315
  //#endregion
318
- //#region src/api/repositories/LogRepository.ts
319
- var LogRepository = class extends Repository.of(logs, DevToolsDatabaseProvider) {};
320
-
321
- //#endregion
322
- //#region src/api/schemas/DevActionMetadata.ts
316
+ //#region src/schemas/DevActionMetadata.ts
323
317
  const devActionMetadataSchema = t.object({
324
318
  name: t.text(),
325
319
  group: t.text(),
@@ -336,11 +330,14 @@ const devActionMetadataSchema = t.object({
336
330
  params: t.optional(t.any()),
337
331
  query: t.optional(t.any()),
338
332
  response: t.optional(t.any()),
339
- bodyContentType: t.optional(t.text())
333
+ bodyContentType: t.optional(t.text()),
334
+ middlewares: t.optional(t.array(t.object({
335
+ name: t.text(),
336
+ options: t.optional(t.any())
337
+ })))
340
338
  });
341
-
342
339
  //#endregion
343
- //#region src/api/schemas/DevAtomMetadata.ts
340
+ //#region src/schemas/DevAtomMetadata.ts
344
341
  const devAtomMetadataSchema = t.object({
345
342
  name: t.text(),
346
343
  description: t.optional(t.text()),
@@ -348,9 +345,8 @@ const devAtomMetadataSchema = t.object({
348
345
  defaultValue: t.optional(t.any()),
349
346
  currentValue: t.optional(t.any())
350
347
  });
351
-
352
348
  //#endregion
353
- //#region src/api/schemas/DevBucketMetadata.ts
349
+ //#region src/schemas/DevBucketMetadata.ts
354
350
  const devBucketMetadataSchema = t.object({
355
351
  name: t.text(),
356
352
  description: t.optional(t.text()),
@@ -358,26 +354,16 @@ const devBucketMetadataSchema = t.object({
358
354
  maxSize: t.optional(t.number()),
359
355
  provider: t.text()
360
356
  });
361
-
362
357
  //#endregion
363
- //#region src/api/schemas/DevCacheMetadata.ts
358
+ //#region src/schemas/DevCacheMetadata.ts
364
359
  const devCacheMetadataSchema = t.object({
365
360
  name: t.text(),
366
361
  ttl: t.optional(t.any()),
367
362
  disabled: t.optional(t.boolean()),
368
363
  provider: t.text()
369
364
  });
370
-
371
- //#endregion
372
- //#region src/api/schemas/DevCommandMetadata.ts
373
- const devCommandMetadataSchema = t.object({
374
- name: t.text(),
375
- description: t.optional(t.text()),
376
- hidden: t.optional(t.boolean())
377
- });
378
-
379
365
  //#endregion
380
- //#region src/api/schemas/DevEntityMetadata.ts
366
+ //#region src/schemas/DevEntityMetadata.ts
381
367
  const devEntityColumnSchema = t.object({
382
368
  name: t.text(),
383
369
  type: t.text(),
@@ -419,36 +405,39 @@ const devEntityMetadataSchema = t.object({
419
405
  columns: t.array(devEntityColumnSchema),
420
406
  indexes: t.array(devEntityIndexSchema),
421
407
  foreignKeys: t.array(devEntityForeignKeySchema),
422
- constraints: t.array(devEntityConstraintSchema)
408
+ constraints: t.array(devEntityConstraintSchema),
409
+ schema: t.optional(t.any()),
410
+ insertSchema: t.optional(t.any()),
411
+ updateSchema: t.optional(t.any())
423
412
  });
424
-
425
413
  //#endregion
426
- //#region src/api/schemas/DevEnvMetadata.ts
414
+ //#region src/schemas/DevEnvMetadata.ts
427
415
  const devEnvMetadataSchema = t.object({
428
416
  propertyKey: t.text(),
429
417
  schema: t.any(),
430
418
  values: t.record(t.text(), t.any()),
431
419
  serviceName: t.optional(t.text())
432
420
  });
433
-
434
421
  //#endregion
435
- //#region src/api/schemas/DevModuleMetadata.ts
422
+ //#region src/schemas/DevModuleMetadata.ts
436
423
  const devModuleMetadataSchema = t.object({
437
424
  name: t.text(),
438
425
  providers: t.array(t.text())
439
426
  });
440
-
441
427
  //#endregion
442
- //#region src/api/schemas/DevPageMetadata.ts
428
+ //#region src/schemas/DevPageMetadata.ts
443
429
  const devPageMetadataSchema = t.object({
444
430
  name: t.text(),
431
+ label: t.optional(t.text()),
445
432
  description: t.optional(t.text()),
446
433
  path: t.optional(t.text()),
434
+ parentName: t.optional(t.text()),
447
435
  params: t.optional(t.any()),
448
436
  query: t.optional(t.any()),
449
437
  hasComponent: t.boolean(),
450
438
  hasLazy: t.boolean(),
451
439
  hasResolve: t.boolean(),
440
+ childrenNames: t.optional(t.array(t.text())),
452
441
  hasChildren: t.boolean(),
453
442
  hasParent: t.boolean(),
454
443
  hasErrorHandler: t.boolean(),
@@ -457,27 +446,24 @@ const devPageMetadataSchema = t.object({
457
446
  client: t.optional(t.any()),
458
447
  animation: t.optional(t.any())
459
448
  });
460
-
461
449
  //#endregion
462
- //#region src/api/schemas/DevProviderMetadata.ts
450
+ //#region src/schemas/DevProviderMetadata.ts
463
451
  const devProviderMetadataSchema = t.object({
464
452
  name: t.text(),
465
453
  module: t.optional(t.text()),
466
454
  dependencies: t.array(t.text()),
467
455
  aliases: t.optional(t.array(t.text()))
468
456
  });
469
-
470
457
  //#endregion
471
- //#region src/api/schemas/DevQueueMetadata.ts
458
+ //#region src/schemas/DevQueueMetadata.ts
472
459
  const devQueueMetadataSchema = t.object({
473
460
  name: t.text(),
474
461
  description: t.optional(t.text()),
475
462
  schema: t.optional(t.any()),
476
463
  provider: t.text()
477
464
  });
478
-
479
465
  //#endregion
480
- //#region src/api/schemas/DevRealmMetadata.ts
466
+ //#region src/schemas/DevRealmMetadata.ts
481
467
  const devRealmMetadataSchema = t.object({
482
468
  name: t.text(),
483
469
  description: t.optional(t.text()),
@@ -491,16 +477,14 @@ const devRealmMetadataSchema = t.object({
491
477
  hasOnDeleteSession: t.boolean()
492
478
  }))
493
479
  });
494
-
495
480
  //#endregion
496
- //#region src/api/schemas/DevRouteMetadata.ts
481
+ //#region src/schemas/DevRouteMetadata.ts
497
482
  const devRouteMetadataSchema = t.object({
498
483
  method: t.text(),
499
484
  path: t.text()
500
485
  });
501
-
502
486
  //#endregion
503
- //#region src/api/schemas/DevSchedulerMetadata.ts
487
+ //#region src/schemas/DevSchedulerMetadata.ts
504
488
  const devSchedulerMetadataSchema = t.object({
505
489
  name: t.text(),
506
490
  description: t.optional(t.text()),
@@ -508,19 +492,28 @@ const devSchedulerMetadataSchema = t.object({
508
492
  interval: t.optional(t.any()),
509
493
  lock: t.optional(t.boolean())
510
494
  });
511
-
512
495
  //#endregion
513
- //#region src/api/schemas/DevTopicMetadata.ts
496
+ //#region src/schemas/DevTopicMetadata.ts
514
497
  const devTopicMetadataSchema = t.object({
515
498
  name: t.text(),
516
499
  description: t.optional(t.text()),
517
500
  schema: t.optional(t.any()),
518
- provider: t.text()
501
+ provider: t.text(),
502
+ subscribers: t.integer()
519
503
  });
520
-
521
504
  //#endregion
522
- //#region src/api/schemas/DevMetadata.ts
505
+ //#region src/schemas/DevMetadata.ts
506
+ const devSystemSchema = t.object({
507
+ alephaVersion: t.text(),
508
+ nodeVersion: t.text(),
509
+ runtime: t.enum(["node", "bun"]),
510
+ mode: t.enum(["development", "production"]),
511
+ port: t.integer(),
512
+ uptime: t.number(),
513
+ memoryUsage: t.number()
514
+ });
523
515
  const devMetadataSchema = t.object({
516
+ system: devSystemSchema,
524
517
  actions: t.array(devActionMetadataSchema),
525
518
  queues: t.array(devQueueMetadataSchema),
526
519
  schedulers: t.array(devSchedulerMetadataSchema),
@@ -532,84 +525,53 @@ const devMetadataSchema = t.object({
532
525
  providers: t.array(devProviderMetadataSchema),
533
526
  modules: t.array(devModuleMetadataSchema),
534
527
  entities: t.array(devEntityMetadataSchema),
535
- commands: t.array(devCommandMetadataSchema),
536
528
  routes: t.array(devRouteMetadataSchema),
537
529
  envs: t.array(devEnvMetadataSchema),
538
530
  atoms: t.array(devAtomMetadataSchema)
539
531
  });
540
-
541
532
  //#endregion
542
- //#region src/api/DevToolsProvider.ts
533
+ //#region src/providers/DevToolsProvider.ts
543
534
  var DevToolsProvider = class {
544
535
  log = $logger();
545
536
  alepha = $inject(Alepha);
546
537
  serverProvider = $inject(ServerProvider);
547
- jsonFormatter = $inject(JsonFormatterProvider);
548
- logs = $inject(LogRepository);
549
538
  devCollectorProvider = $inject(DevToolsMetadataProvider);
539
+ memoryDestination = $inject(MemoryDestinationProvider);
550
540
  onStart = $hook({
551
541
  on: "start",
552
542
  handler: () => {
553
- this.log.info("Devtools OK", { url: `${this.serverProvider.hostname}/devtools/` });
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);
543
+ this.log.info("Devtools OK", { url: `${this.serverProvider.hostname}/__devtools/` });
562
544
  }
563
545
  });
546
+ /**
547
+ * Capture all logs into memory so the devtools UI can display them.
548
+ * In dev mode, LogDestinationProvider is bound to ConsoleDestinationProvider,
549
+ * so MemoryDestinationProvider would otherwise never receive writes.
550
+ */
564
551
  onLog = $hook({
565
552
  on: "log",
566
- handler: async (ev) => {
567
- try {
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
- }
553
+ handler: ({ entry }) => {
554
+ this.memoryDestination.write("", entry);
581
555
  }
582
556
  });
583
557
  uiRoute = $serve({
584
- path: "/devtools",
585
- root: join(fileURLToPath(import.meta.url), "../../../assets/devtools"),
586
- historyApiFallback: true
558
+ path: "/__devtools",
559
+ root: devtoolsAssets.ui,
560
+ historyApiFallback: true,
561
+ silent: true
587
562
  });
588
563
  metadataRoute = $route({
589
564
  method: "GET",
590
- path: "/devtools/api/metadata",
565
+ path: "/__devtools/api/metadata",
591
566
  silent: true,
592
567
  schema: { response: devMetadataSchema },
593
568
  handler: () => {
594
569
  return this.devCollectorProvider.getMetadata();
595
570
  }
596
571
  });
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
572
  updateAtomRoute = $route({
611
573
  method: "POST",
612
- path: "/devtools/api/atoms",
574
+ path: "/__devtools/api/atoms",
613
575
  silent: true,
614
576
  schema: {
615
577
  body: t.object({
@@ -627,15 +589,168 @@ var DevToolsProvider = class {
627
589
  return { success: false };
628
590
  }
629
591
  });
592
+ logsRoute = $route({
593
+ method: "GET",
594
+ path: "/__devtools/api/logs",
595
+ silent: true,
596
+ schema: {
597
+ query: t.object({
598
+ level: t.optional(t.text()),
599
+ type: t.optional(t.text()),
600
+ module: t.optional(t.text()),
601
+ search: t.optional(t.text()),
602
+ since: t.optional(t.text()),
603
+ limit: t.optional(t.text()),
604
+ offset: t.optional(t.text())
605
+ }),
606
+ response: t.object({
607
+ logs: t.array(t.any()),
608
+ total: t.integer()
609
+ })
610
+ },
611
+ handler: ({ query }) => {
612
+ const levelOrder = [
613
+ "TRACE",
614
+ "DEBUG",
615
+ "INFO",
616
+ "WARN",
617
+ "ERROR"
618
+ ];
619
+ let entries = this.memoryDestination.logs;
620
+ if (query.level) {
621
+ const minIndex = levelOrder.indexOf(query.level.toUpperCase());
622
+ if (minIndex >= 0) entries = entries.filter((e) => levelOrder.indexOf(e.level) >= minIndex);
623
+ }
624
+ if (query.type) {
625
+ const types = query.type.split(",").map((t) => t.trim());
626
+ entries = entries.filter((e) => {
627
+ if (!e.data || typeof e.data !== "object") return false;
628
+ const d = e.data;
629
+ for (const t of types) if (t === "http" || t === "http:request") {
630
+ if (d.status && d.method && d.path && d.duration) return true;
631
+ } else if (t === "db" || t === "db:query") {
632
+ if (d.type === "db:query") return true;
633
+ } else if (d.type === t) return true;
634
+ return false;
635
+ });
636
+ }
637
+ if (query.module) entries = entries.filter((e) => e.module === query.module);
638
+ if (query.search) {
639
+ const terms = query.search.toLowerCase().split(/\s+/);
640
+ entries = entries.filter((e) => {
641
+ const text = `${e.message} ${e.module} ${e.service}`.toLowerCase();
642
+ return terms.every((term) => text.includes(term));
643
+ });
644
+ }
645
+ if (query.since) {
646
+ const since = Number(query.since);
647
+ if (!Number.isNaN(since)) entries = entries.filter((e) => e.timestamp >= since);
648
+ }
649
+ const total = entries.length;
650
+ entries = entries.reverse();
651
+ const offset = query.offset ? Number(query.offset) : 0;
652
+ const limit = query.limit ? Number(query.limit) : 100;
653
+ entries = entries.slice(offset, offset + limit);
654
+ return {
655
+ logs: entries,
656
+ total
657
+ };
658
+ }
659
+ });
660
+ dbListRoute = $route({
661
+ method: "GET",
662
+ path: "/__devtools/api/db/:entity/records",
663
+ silent: true,
664
+ schema: {
665
+ params: t.object({ entity: t.text() }),
666
+ query: t.object({
667
+ page: t.optional(t.text()),
668
+ size: t.optional(t.text()),
669
+ sort: t.optional(t.text())
670
+ }),
671
+ response: t.record(t.text(), t.any())
672
+ },
673
+ handler: async ({ params, query }) => {
674
+ const repo = this.getRepository(params.entity);
675
+ if (!repo) return {
676
+ content: [],
677
+ page: { totalElements: 0 }
678
+ };
679
+ return repo.paginate({
680
+ page: query.page ? Number(query.page) : 0,
681
+ size: query.size ? Number(query.size) : 50,
682
+ sort: query.sort || void 0
683
+ }, {}, { count: true });
684
+ }
685
+ });
686
+ dbCreateRoute = $route({
687
+ method: "POST",
688
+ path: "/__devtools/api/db/:entity/records",
689
+ silent: true,
690
+ schema: {
691
+ params: t.object({ entity: t.text() }),
692
+ body: t.record(t.text(), t.any()),
693
+ response: t.record(t.text(), t.any())
694
+ },
695
+ handler: async ({ params, body }) => {
696
+ const repo = this.getRepository(params.entity);
697
+ if (!repo) return { error: "Entity not found" };
698
+ return repo.create(body);
699
+ }
700
+ });
701
+ dbUpdateRoute = $route({
702
+ method: "PUT",
703
+ path: "/__devtools/api/db/:entity/records/:id",
704
+ silent: true,
705
+ schema: {
706
+ params: t.object({
707
+ entity: t.text(),
708
+ id: t.text()
709
+ }),
710
+ body: t.record(t.text(), t.any()),
711
+ response: t.record(t.text(), t.any())
712
+ },
713
+ handler: async ({ params, body }) => {
714
+ const repo = this.getRepository(params.entity);
715
+ if (!repo) return { error: "Entity not found" };
716
+ const idValue = this.parseId(repo, params.id);
717
+ return repo.updateById(idValue, body);
718
+ }
719
+ });
720
+ dbDeleteRoute = $route({
721
+ method: "DELETE",
722
+ path: "/__devtools/api/db/:entity/records/:id",
723
+ silent: true,
724
+ schema: {
725
+ params: t.object({
726
+ entity: t.text(),
727
+ id: t.text()
728
+ }),
729
+ response: t.record(t.text(), t.any())
730
+ },
731
+ handler: async ({ params }) => {
732
+ const repo = this.getRepository(params.entity);
733
+ if (!repo) return { error: "Entity not found" };
734
+ const idValue = this.parseId(repo, params.id);
735
+ return repo.deleteById(idValue);
736
+ }
737
+ });
738
+ getRepository(entityName) {
739
+ try {
740
+ return this.alepha.inject(RepositoryProvider).getRepositories().find((r) => r.entity.name === entityName);
741
+ } catch {
742
+ return;
743
+ }
744
+ }
745
+ parseId(repo, rawId) {
746
+ const idType = repo.id.type;
747
+ if (idType?.type === "integer" || idType?.type === "number") return Number(rawId);
748
+ return rawId;
749
+ }
630
750
  };
631
-
632
751
  //#endregion
633
752
  //#region src/index.ts
634
753
  /**
635
- * | type | quality | stability |
636
- * |------|---------|-----------|
637
- * | tooling | rare | experimental |
638
- *
639
754
  * Runtime inspection and debugging UI.
640
755
  *
641
756
  * **Features:**
@@ -652,24 +767,16 @@ var DevToolsProvider = class {
652
767
  const AlephaDevtools = $module({
653
768
  name: "alepha.devtools",
654
769
  primitives: [],
655
- services: [
656
- DevToolsMetadataProvider,
657
- DevToolsProvider,
658
- DevToolsDatabaseProvider,
659
- LogRepository
660
- ],
770
+ services: [DevToolsMetadataProvider, DevToolsProvider],
661
771
  register: (alepha) => {
772
+ alepha.with(AlephaServer);
773
+ alepha.with(AlephaServerStatic);
662
774
  alepha.with(DevToolsProvider);
663
- alepha.with(DevToolsDatabaseProvider);
664
775
  alepha.with(DevToolsMetadataProvider);
665
- alepha.store.push("alepha.build.assets", "@alepha/devtools");
776
+ alepha.store.push("alepha.build.assets", "alepha");
666
777
  }
667
778
  });
668
- const $devtools = () => {
669
- $context().alepha.with(AlephaDevtools);
670
- return {};
671
- };
672
-
673
779
  //#endregion
674
- export { $devtools, AlephaDevtools, DevToolsMetadataProvider, devActionMetadataSchema, devBucketMetadataSchema, devCacheMetadataSchema, devCommandMetadataSchema, devEntityColumnSchema, devEntityConstraintSchema, devEntityForeignKeySchema, devEntityIndexSchema, devEntityMetadataSchema, devMetadataSchema, devModuleMetadataSchema, devPageMetadataSchema, devProviderMetadataSchema, devQueueMetadataSchema, devRealmMetadataSchema, devRouteMetadataSchema, devSchedulerMetadataSchema, devTopicMetadataSchema };
780
+ export { AlephaDevtools, DevToolsMetadataProvider, devActionMetadataSchema, devAtomMetadataSchema, devBucketMetadataSchema, devCacheMetadataSchema, devEntityColumnSchema, devEntityConstraintSchema, devEntityForeignKeySchema, devEntityIndexSchema, devEntityMetadataSchema, devEnvMetadataSchema, devMetadataSchema, devModuleMetadataSchema, devPageMetadataSchema, devProviderMetadataSchema, devQueueMetadataSchema, devRealmMetadataSchema, devRouteMetadataSchema, devSchedulerMetadataSchema, devSystemSchema, devTopicMetadataSchema };
781
+
675
782
  //# sourceMappingURL=index.js.map