@alepha/devtools 0.12.1 → 0.13.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.
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@alepha/devtools",
3
3
  "description": "Developer tools for monitoring and debugging Alepha applications.",
4
4
  "author": "Nicolas Foures",
5
- "version": "0.12.1",
5
+ "version": "0.13.1",
6
6
  "type": "module",
7
7
  "engines": {
8
8
  "node": ">=22.0.0"
@@ -15,16 +15,16 @@
15
15
  "src"
16
16
  ],
17
17
  "devDependencies": {
18
- "@alepha/react": "0.12.1",
19
- "@alepha/ui": "0.12.1",
18
+ "@alepha/react": "0.13.1",
19
+ "@alepha/ui": "0.13.1",
20
20
  "@tabler/icons-react": "^3.35.0",
21
- "alepha": "0.12.1",
21
+ "alepha": "0.13.1",
22
22
  "react": "^19.2.0",
23
23
  "tsdown": "^0.16.7",
24
24
  "vitest": "^4.0.14"
25
25
  },
26
26
  "peerDependencies": {
27
- "alepha": "0.12.1"
27
+ "alepha": "0.13.1"
28
28
  },
29
29
  "scripts": {
30
30
  "lint": "alepha lint",
@@ -1,27 +0,0 @@
1
- //#region rolldown:runtime
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __copyProps = (to, from, except, desc) => {
9
- if (from && typeof from === "object" || typeof from === "function") {
10
- for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
- key = keys[i];
12
- if (!__hasOwnProp.call(to, key) && key !== except) {
13
- __defProp(to, key, {
14
- get: ((k) => from[k]).bind(null, key),
15
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
- });
17
- }
18
- }
19
- }
20
- return to;
21
- };
22
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
23
- value: mod,
24
- enumerable: true
25
- }) : target, mod));
26
-
27
- //#endregion
package/dist/index.cjs DELETED
@@ -1,433 +0,0 @@
1
- let alepha = require("alepha");
2
- let node_path = require("node:path");
3
- let node_url = require("node:url");
4
- let alepha_batch = require("alepha/batch");
5
- let alepha_logger = require("alepha/logger");
6
- let alepha_orm = require("alepha/orm");
7
- let alepha_server = require("alepha/server");
8
- let alepha_server_static = require("alepha/server/static");
9
- let alepha_bucket = require("alepha/bucket");
10
- let alepha_cache = require("alepha/cache");
11
- let alepha_queue = require("alepha/queue");
12
- let alepha_scheduler = require("alepha/scheduler");
13
- let alepha_security = require("alepha/security");
14
- let alepha_topic = require("alepha/topic");
15
-
16
- //#region src/entities/logs.ts
17
- const logs = (0, alepha_orm.$entity)({
18
- name: "logs",
19
- schema: alepha.t.object({
20
- id: alepha_orm.pg.primaryKey(),
21
- level: alepha.t.enum([
22
- "TRACE",
23
- "DEBUG",
24
- "INFO",
25
- "WARN",
26
- "ERROR"
27
- ]),
28
- message: alepha.t.text({ size: "rich" }),
29
- service: alepha.t.text(),
30
- module: alepha.t.text(),
31
- context: alepha.t.optional(alepha.t.text()),
32
- app: alepha.t.optional(alepha.t.text()),
33
- data: alepha.t.optional(alepha.t.json()),
34
- timestamp: alepha.t.integer()
35
- })
36
- });
37
-
38
- //#endregion
39
- //#region src/providers/DevToolsMetadataProvider.ts
40
- var DevToolsMetadataProvider = class {
41
- alepha = (0, alepha.$inject)(alepha.Alepha);
42
- log = (0, alepha_logger.$logger)();
43
- getActions() {
44
- return this.alepha.descriptors(alepha_server.$action).map((action) => {
45
- const schema = action.schema;
46
- const options = action.options;
47
- return {
48
- name: action.name,
49
- group: action.group,
50
- method: action.method,
51
- path: action.path,
52
- prefix: action.prefix,
53
- fullPath: action.route.path,
54
- description: action.options.description,
55
- summary: options.summary,
56
- disabled: action.options.disabled,
57
- secure: options.secure,
58
- hide: options.hide,
59
- body: schema?.body,
60
- params: schema?.params,
61
- query: schema?.query,
62
- response: schema?.response,
63
- bodyContentType: action.getBodyContentType()
64
- };
65
- });
66
- }
67
- getQueues() {
68
- return this.alepha.descriptors(alepha_queue.$queue).map((queue) => ({
69
- name: queue.name,
70
- description: queue.options.description,
71
- schema: queue.options.schema,
72
- provider: this.getProviderName(queue.options.provider)
73
- }));
74
- }
75
- getSchedulers() {
76
- return this.alepha.descriptors(alepha_scheduler.$scheduler).map((scheduler) => ({
77
- name: scheduler.name,
78
- description: scheduler.options.description,
79
- cron: scheduler.options.cron,
80
- interval: scheduler.options.interval,
81
- lock: scheduler.options.lock
82
- }));
83
- }
84
- getTopics() {
85
- return this.alepha.descriptors(alepha_topic.$topic).map((topic) => ({
86
- name: topic.name,
87
- description: topic.options.description,
88
- schema: topic.options.schema,
89
- provider: this.getProviderName(topic.options.provider)
90
- }));
91
- }
92
- getBuckets() {
93
- return this.alepha.descriptors(alepha_bucket.$bucket).map((bucket) => ({
94
- name: bucket.name,
95
- description: bucket.options.description,
96
- mimeTypes: bucket.options.mimeTypes,
97
- maxSize: bucket.options.maxSize,
98
- provider: this.getProviderName(bucket.options.provider)
99
- }));
100
- }
101
- getRealms() {
102
- return this.alepha.descriptors(alepha_security.$realm).map((realm) => ({
103
- name: realm.name,
104
- description: realm.options.description,
105
- roles: realm.options.roles,
106
- type: "secret" in realm.options ? "internal" : "external",
107
- settings: {
108
- accessTokenExpiration: realm.options.settings?.accessToken?.expiration,
109
- refreshTokenExpiration: realm.options.settings?.refreshToken?.expiration,
110
- hasOnCreateSession: !!realm.options.settings?.onCreateSession,
111
- hasOnRefreshSession: !!realm.options.settings?.onRefreshSession,
112
- hasOnDeleteSession: !!realm.options.settings?.onDeleteSession
113
- }
114
- }));
115
- }
116
- getCaches() {
117
- return this.alepha.descriptors(alepha_cache.$cache).map((cache) => ({
118
- name: cache.container,
119
- ttl: cache.options.ttl,
120
- disabled: cache.options.disabled,
121
- provider: this.getProviderName(cache.options.provider)
122
- }));
123
- }
124
- getPages() {
125
- return [];
126
- }
127
- getProviders() {
128
- const graph = this.alepha.graph();
129
- return Object.entries(graph).map(([name, info]) => ({
130
- name,
131
- module: info.module,
132
- dependencies: info.from,
133
- aliases: info.as
134
- }));
135
- }
136
- getModules() {
137
- const graph = this.alepha.graph();
138
- const moduleMap = /* @__PURE__ */ new Map();
139
- for (const [providerName, info] of Object.entries(graph)) if (info.module) {
140
- if (!moduleMap.has(info.module)) moduleMap.set(info.module, /* @__PURE__ */ new Set());
141
- moduleMap.get(info.module).add(providerName);
142
- }
143
- return Array.from(moduleMap.entries()).map(([name, providers]) => ({
144
- name,
145
- providers: Array.from(providers)
146
- }));
147
- }
148
- getMetadata() {
149
- return {
150
- actions: this.getActions(),
151
- queues: this.getQueues(),
152
- schedulers: this.getSchedulers(),
153
- topics: this.getTopics(),
154
- buckets: this.getBuckets(),
155
- realms: this.getRealms(),
156
- caches: this.getCaches(),
157
- pages: this.getPages(),
158
- providers: this.getProviders(),
159
- modules: this.getModules()
160
- };
161
- }
162
- getProviderName(provider) {
163
- if (!provider) return "default";
164
- if (provider === "memory") return "memory";
165
- return provider.name || "custom";
166
- }
167
- };
168
-
169
- //#endregion
170
- //#region src/providers/DevToolsDatabaseProvider.ts
171
- var DevToolsDatabaseProvider = class extends alepha_orm.NodeSqliteProvider {
172
- get name() {
173
- return "devtools";
174
- }
175
- options = { path: ":memory:" };
176
- };
177
-
178
- //#endregion
179
- //#region src/repositories/LogRepository.ts
180
- var LogRepository = class extends alepha_orm.Repository {
181
- constructor() {
182
- super(logs, DevToolsDatabaseProvider);
183
- }
184
- };
185
-
186
- //#endregion
187
- //#region src/schemas/DevActionMetadata.ts
188
- const devActionMetadataSchema = alepha.t.object({
189
- name: alepha.t.text(),
190
- group: alepha.t.text(),
191
- method: alepha.t.text(),
192
- path: alepha.t.text(),
193
- prefix: alepha.t.text(),
194
- fullPath: alepha.t.text(),
195
- description: alepha.t.optional(alepha.t.text()),
196
- summary: alepha.t.optional(alepha.t.text()),
197
- disabled: alepha.t.optional(alepha.t.boolean()),
198
- secure: alepha.t.optional(alepha.t.boolean()),
199
- hide: alepha.t.optional(alepha.t.boolean()),
200
- body: alepha.t.optional(alepha.t.any()),
201
- params: alepha.t.optional(alepha.t.any()),
202
- query: alepha.t.optional(alepha.t.any()),
203
- response: alepha.t.optional(alepha.t.any()),
204
- bodyContentType: alepha.t.optional(alepha.t.text())
205
- });
206
-
207
- //#endregion
208
- //#region src/schemas/DevBucketMetadata.ts
209
- const devBucketMetadataSchema = alepha.t.object({
210
- name: alepha.t.text(),
211
- description: alepha.t.optional(alepha.t.text()),
212
- mimeTypes: alepha.t.optional(alepha.t.array(alepha.t.text())),
213
- maxSize: alepha.t.optional(alepha.t.number()),
214
- provider: alepha.t.text()
215
- });
216
-
217
- //#endregion
218
- //#region src/schemas/DevCacheMetadata.ts
219
- const devCacheMetadataSchema = alepha.t.object({
220
- name: alepha.t.text(),
221
- ttl: alepha.t.optional(alepha.t.any()),
222
- disabled: alepha.t.optional(alepha.t.boolean()),
223
- provider: alepha.t.text()
224
- });
225
-
226
- //#endregion
227
- //#region src/schemas/DevModuleMetadata.ts
228
- const devModuleMetadataSchema = alepha.t.object({
229
- name: alepha.t.text(),
230
- providers: alepha.t.array(alepha.t.text())
231
- });
232
-
233
- //#endregion
234
- //#region src/schemas/DevPageMetadata.ts
235
- const devPageMetadataSchema = alepha.t.object({
236
- name: alepha.t.text(),
237
- description: alepha.t.optional(alepha.t.text()),
238
- path: alepha.t.optional(alepha.t.text()),
239
- params: alepha.t.optional(alepha.t.any()),
240
- query: alepha.t.optional(alepha.t.any()),
241
- hasComponent: alepha.t.boolean(),
242
- hasLazy: alepha.t.boolean(),
243
- hasResolve: alepha.t.boolean(),
244
- hasChildren: alepha.t.boolean(),
245
- hasParent: alepha.t.boolean(),
246
- hasErrorHandler: alepha.t.boolean(),
247
- static: alepha.t.optional(alepha.t.boolean()),
248
- cache: alepha.t.optional(alepha.t.any()),
249
- client: alepha.t.optional(alepha.t.any()),
250
- animation: alepha.t.optional(alepha.t.any())
251
- });
252
-
253
- //#endregion
254
- //#region src/schemas/DevProviderMetadata.ts
255
- const devProviderMetadataSchema = alepha.t.object({
256
- name: alepha.t.text(),
257
- module: alepha.t.optional(alepha.t.text()),
258
- dependencies: alepha.t.array(alepha.t.text()),
259
- aliases: alepha.t.optional(alepha.t.array(alepha.t.text()))
260
- });
261
-
262
- //#endregion
263
- //#region src/schemas/DevQueueMetadata.ts
264
- const devQueueMetadataSchema = alepha.t.object({
265
- name: alepha.t.text(),
266
- description: alepha.t.optional(alepha.t.text()),
267
- schema: alepha.t.optional(alepha.t.any()),
268
- provider: alepha.t.text()
269
- });
270
-
271
- //#endregion
272
- //#region src/schemas/DevRealmMetadata.ts
273
- const devRealmMetadataSchema = alepha.t.object({
274
- name: alepha.t.text(),
275
- description: alepha.t.optional(alepha.t.text()),
276
- roles: alepha.t.optional(alepha.t.array(alepha.t.any())),
277
- type: alepha.t.enum(["internal", "external"]),
278
- settings: alepha.t.optional(alepha.t.object({
279
- accessTokenExpiration: alepha.t.optional(alepha.t.any()),
280
- refreshTokenExpiration: alepha.t.optional(alepha.t.any()),
281
- hasOnCreateSession: alepha.t.boolean(),
282
- hasOnRefreshSession: alepha.t.boolean(),
283
- hasOnDeleteSession: alepha.t.boolean()
284
- }))
285
- });
286
-
287
- //#endregion
288
- //#region src/schemas/DevSchedulerMetadata.ts
289
- const devSchedulerMetadataSchema = alepha.t.object({
290
- name: alepha.t.text(),
291
- description: alepha.t.optional(alepha.t.text()),
292
- cron: alepha.t.optional(alepha.t.text()),
293
- interval: alepha.t.optional(alepha.t.any()),
294
- lock: alepha.t.optional(alepha.t.boolean())
295
- });
296
-
297
- //#endregion
298
- //#region src/schemas/DevTopicMetadata.ts
299
- const devTopicMetadataSchema = alepha.t.object({
300
- name: alepha.t.text(),
301
- description: alepha.t.optional(alepha.t.text()),
302
- schema: alepha.t.optional(alepha.t.any()),
303
- provider: alepha.t.text()
304
- });
305
-
306
- //#endregion
307
- //#region src/schemas/DevMetadata.ts
308
- const devMetadataSchema = alepha.t.object({
309
- actions: alepha.t.array(devActionMetadataSchema),
310
- queues: alepha.t.array(devQueueMetadataSchema),
311
- schedulers: alepha.t.array(devSchedulerMetadataSchema),
312
- topics: alepha.t.array(devTopicMetadataSchema),
313
- buckets: alepha.t.array(devBucketMetadataSchema),
314
- realms: alepha.t.array(devRealmMetadataSchema),
315
- caches: alepha.t.array(devCacheMetadataSchema),
316
- pages: alepha.t.array(devPageMetadataSchema),
317
- providers: alepha.t.array(devProviderMetadataSchema),
318
- modules: alepha.t.array(devModuleMetadataSchema)
319
- });
320
-
321
- //#endregion
322
- //#region src/DevToolsProvider.ts
323
- var DevToolsProvider = class {
324
- log = (0, alepha_logger.$logger)();
325
- alepha = (0, alepha.$inject)(alepha.Alepha);
326
- serverProvider = (0, alepha.$inject)(alepha_server.ServerProvider);
327
- jsonFormatter = (0, alepha.$inject)(alepha_logger.JsonFormatterProvider);
328
- logs = (0, alepha.$inject)(LogRepository);
329
- devCollectorProvider = (0, alepha.$inject)(DevToolsMetadataProvider);
330
- onStart = (0, alepha.$hook)({
331
- on: "start",
332
- handler: () => {
333
- this.log.info(`Devtools available at ${this.serverProvider.hostname}/devtools/`);
334
- }
335
- });
336
- batchLogs = (0, alepha_batch.$batch)({
337
- maxSize: 50,
338
- maxDuration: [10, "seconds"],
339
- schema: logs.insertSchema,
340
- handler: async (entries) => {
341
- await this.logs.createMany(entries);
342
- }
343
- });
344
- onLog = (0, alepha.$hook)({
345
- on: "log",
346
- handler: async (ev) => {
347
- try {
348
- if (!this.alepha.isStarted()) return;
349
- if (ev.entry.module === "alepha.devtools") return;
350
- if (ev.entry.level === "TRACE" && ev.entry.module === "alepha.batch") return;
351
- if (this.alepha.isProduction() && ev.entry.level === "TRACE") return;
352
- const entry = {
353
- ...ev.entry,
354
- 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 }
355
- };
356
- await this.batchLogs.push(entry);
357
- } catch (error) {
358
- console.error(error, ev);
359
- }
360
- }
361
- });
362
- uiRoute = (0, alepha_server_static.$serve)({
363
- path: "/devtools",
364
- root: (0, node_path.join)((0, node_url.fileURLToPath)(require("url").pathToFileURL(__filename).href), "../../assets/devtools"),
365
- historyApiFallback: true
366
- });
367
- metadataRoute = (0, alepha_server.$route)({
368
- method: "GET",
369
- path: "/devtools/api/metadata",
370
- silent: true,
371
- schema: { response: devMetadataSchema },
372
- handler: () => {
373
- return this.devCollectorProvider.getMetadata();
374
- }
375
- });
376
- logsRoute = (0, alepha_server.$route)({
377
- method: "GET",
378
- path: "/devtools/api/logs",
379
- silent: true,
380
- schema: {
381
- query: alepha.t.extend(alepha.pageQuerySchema, { search: alepha.t.optional(alepha.t.string()) }),
382
- response: alepha.t.page(logs.schema)
383
- },
384
- handler: ({ query }) => {
385
- query.sort ??= "-timestamp";
386
- return this.logs.paginate(query, query.search ? { where: (0, alepha_orm.parseQueryString)(query.search) } : {}, { count: true });
387
- }
388
- });
389
- };
390
-
391
- //#endregion
392
- //#region src/index.ts
393
- /**
394
- * Developer tools module for monitoring and debugging Alepha applications.
395
- *
396
- * This module provides comprehensive data collection capabilities for tracking application behavior,
397
- * performance metrics, and debugging information in real-time.
398
- *
399
- * @see {@link DevToolsMetadataProvider}
400
- * @module alepha.devtools
401
- */
402
- const AlephaDevtools = (0, alepha.$module)({
403
- name: "alepha.devtools",
404
- descriptors: [],
405
- services: [
406
- DevToolsMetadataProvider,
407
- DevToolsProvider,
408
- DevToolsDatabaseProvider,
409
- LogRepository
410
- ],
411
- register: (alepha$1) => {
412
- alepha$1.with(DevToolsProvider);
413
- alepha$1.with(DevToolsDatabaseProvider);
414
- alepha$1.with(DevToolsMetadataProvider);
415
- alepha$1.state.push("alepha.build.assets", "@alepha/devtools");
416
- }
417
- });
418
-
419
- //#endregion
420
- exports.AlephaDevtools = AlephaDevtools;
421
- exports.DevToolsMetadataProvider = DevToolsMetadataProvider;
422
- exports.devActionMetadataSchema = devActionMetadataSchema;
423
- exports.devBucketMetadataSchema = devBucketMetadataSchema;
424
- exports.devCacheMetadataSchema = devCacheMetadataSchema;
425
- exports.devMetadataSchema = devMetadataSchema;
426
- exports.devModuleMetadataSchema = devModuleMetadataSchema;
427
- exports.devPageMetadataSchema = devPageMetadataSchema;
428
- exports.devProviderMetadataSchema = devProviderMetadataSchema;
429
- exports.devQueueMetadataSchema = devQueueMetadataSchema;
430
- exports.devRealmMetadataSchema = devRealmMetadataSchema;
431
- exports.devSchedulerMetadataSchema = devSchedulerMetadataSchema;
432
- exports.devTopicMetadataSchema = devTopicMetadataSchema;
433
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","names":["t","pg","Alepha","$action","$queue","$scheduler","$topic","$bucket","$realm","$cache","NodeSqliteProvider","Repository","t","t","t","t","t","t","t","t","t","t","t","Alepha","ServerProvider","JsonFormatterProvider","t","pageQuerySchema"],"sources":["../src/entities/logs.ts","../src/providers/DevToolsMetadataProvider.ts","../src/providers/DevToolsDatabaseProvider.ts","../src/repositories/LogRepository.ts","../src/schemas/DevActionMetadata.ts","../src/schemas/DevBucketMetadata.ts","../src/schemas/DevCacheMetadata.ts","../src/schemas/DevModuleMetadata.ts","../src/schemas/DevPageMetadata.ts","../src/schemas/DevProviderMetadata.ts","../src/schemas/DevQueueMetadata.ts","../src/schemas/DevRealmMetadata.ts","../src/schemas/DevSchedulerMetadata.ts","../src/schemas/DevTopicMetadata.ts","../src/schemas/DevMetadata.ts","../src/DevToolsProvider.ts","../src/index.ts"],"sourcesContent":["import { type Static, t } from \"alepha\";\nimport { $entity, pg } from \"alepha/orm\";\n\nexport const logs = $entity({\n name: \"logs\",\n schema: t.object({\n id: pg.primaryKey(),\n level: t.enum([\"TRACE\", \"DEBUG\", \"INFO\", \"WARN\", \"ERROR\"]),\n message: t.text({\n size: \"rich\",\n }),\n service: t.text(),\n module: t.text(),\n context: t.optional(t.text()),\n app: t.optional(t.text()),\n data: t.optional(t.json()),\n timestamp: t.integer(),\n }),\n});\n\nexport type DevLogEntry = Static<typeof logs.schema>;\n","import { $inject, Alepha } from \"alepha\";\nimport { $bucket } from \"alepha/bucket\";\nimport { $cache } from \"alepha/cache\";\nimport { $logger } from \"alepha/logger\";\nimport { $queue } from \"alepha/queue\";\nimport { $scheduler } from \"alepha/scheduler\";\nimport { $realm } from \"alepha/security\";\nimport { $action } from \"alepha/server\";\nimport { $topic } from \"alepha/topic\";\nimport type { DevActionMetadata } from \"../schemas/DevActionMetadata.ts\";\nimport type { DevBucketMetadata } from \"../schemas/DevBucketMetadata.ts\";\nimport type { DevCacheMetadata } from \"../schemas/DevCacheMetadata.ts\";\nimport type { DevMetadata } from \"../schemas/DevMetadata.ts\";\nimport type { DevModuleMetadata } from \"../schemas/DevModuleMetadata.ts\";\nimport type { DevPageMetadata } from \"../schemas/DevPageMetadata.ts\";\nimport type { DevProviderMetadata } from \"../schemas/DevProviderMetadata.ts\";\nimport type { DevQueueMetadata } from \"../schemas/DevQueueMetadata.ts\";\nimport type { DevRealmMetadata } from \"../schemas/DevRealmMetadata.ts\";\nimport type { DevSchedulerMetadata } from \"../schemas/DevSchedulerMetadata.ts\";\nimport type { DevTopicMetadata } from \"../schemas/DevTopicMetadata.ts\";\n\nexport class DevToolsMetadataProvider {\n protected readonly alepha = $inject(Alepha);\n protected readonly log = $logger();\n\n public getActions(): DevActionMetadata[] {\n const actionDescriptors = this.alepha.descriptors($action);\n\n return actionDescriptors.map((action) => {\n const schema = action.schema;\n const options = action.options as any; // Allow accessing augmented properties\n\n return {\n name: action.name,\n group: action.group,\n method: action.method,\n path: action.path,\n prefix: action.prefix,\n fullPath: action.route.path,\n description: action.options.description,\n summary: options.summary,\n disabled: action.options.disabled,\n secure: options.secure,\n hide: options.hide,\n body: schema?.body,\n params: schema?.params,\n query: schema?.query,\n response: schema?.response,\n bodyContentType: action.getBodyContentType(),\n };\n });\n }\n\n public getQueues(): DevQueueMetadata[] {\n const queueDescriptors = this.alepha.descriptors($queue);\n\n return queueDescriptors.map((queue) => ({\n name: queue.name,\n description: queue.options.description,\n schema: queue.options.schema,\n provider: this.getProviderName(queue.options.provider),\n }));\n }\n\n public getSchedulers(): DevSchedulerMetadata[] {\n const schedulerDescriptors = this.alepha.descriptors($scheduler);\n\n return schedulerDescriptors.map((scheduler) => ({\n name: scheduler.name,\n description: scheduler.options.description,\n cron: scheduler.options.cron,\n interval: scheduler.options.interval,\n lock: scheduler.options.lock,\n }));\n }\n\n public getTopics(): DevTopicMetadata[] {\n const topicDescriptors = this.alepha.descriptors($topic);\n\n return topicDescriptors.map((topic) => ({\n name: topic.name,\n description: topic.options.description,\n schema: topic.options.schema,\n provider: this.getProviderName(topic.options.provider),\n }));\n }\n\n public getBuckets(): DevBucketMetadata[] {\n const bucketDescriptors = this.alepha.descriptors($bucket);\n\n return bucketDescriptors.map((bucket) => ({\n name: bucket.name,\n description: bucket.options.description,\n mimeTypes: bucket.options.mimeTypes,\n maxSize: bucket.options.maxSize,\n provider: this.getProviderName(bucket.options.provider),\n }));\n }\n\n public getRealms(): DevRealmMetadata[] {\n const realmDescriptors = this.alepha.descriptors($realm);\n\n return realmDescriptors.map((realm) => ({\n name: realm.name,\n description: realm.options.description,\n roles: realm.options.roles,\n type: \"secret\" in realm.options ? \"internal\" : \"external\",\n settings: {\n accessTokenExpiration: realm.options.settings?.accessToken?.expiration,\n refreshTokenExpiration:\n realm.options.settings?.refreshToken?.expiration,\n hasOnCreateSession: !!realm.options.settings?.onCreateSession,\n hasOnRefreshSession: !!realm.options.settings?.onRefreshSession,\n hasOnDeleteSession: !!realm.options.settings?.onDeleteSession,\n },\n }));\n }\n\n public getCaches(): DevCacheMetadata[] {\n const cacheDescriptors = this.alepha.descriptors($cache);\n\n return cacheDescriptors.map((cache) => ({\n name: cache.container,\n ttl: cache.options.ttl,\n disabled: cache.options.disabled,\n provider: this.getProviderName(cache.options.provider),\n }));\n }\n\n public getPages(): DevPageMetadata[] {\n // const pageDescriptors = this.alepha.descriptors($page);\n //\n // return pageDescriptors.map((page) => ({\n // name: page.name,\n // description: page.options.description,\n // path: page.options.path,\n // params: page.options.schema?.params,\n // query: page.options.schema?.query,\n // hasComponent: !!page.options.component,\n // hasLazy: !!page.options.lazy,\n // hasResolve: !!page.options.resolve,\n // hasChildren: !!page.options.children,\n // hasParent: !!page.options.parent,\n // hasErrorHandler: !!page.options.errorHandler,\n // static:\n // typeof page.options.static === \"boolean\"\n // ? page.options.static\n // : !!page.options.static,\n // cache: page.options.cache,\n // client: page.options.client,\n // animation: page.options.animation,\n // }));\n\n return [];\n }\n\n public getProviders(): DevProviderMetadata[] {\n const graph = this.alepha.graph();\n\n return Object.entries(graph).map(([name, info]) => ({\n name,\n module: info.module,\n dependencies: info.from,\n aliases: info.as,\n }));\n }\n\n public getModules(): DevModuleMetadata[] {\n const graph = this.alepha.graph();\n const moduleMap = new Map<string, Set<string>>();\n\n // Group providers by module\n for (const [providerName, info] of Object.entries(graph)) {\n if (info.module) {\n if (!moduleMap.has(info.module)) {\n moduleMap.set(info.module, new Set());\n }\n moduleMap.get(info.module)!.add(providerName);\n }\n }\n\n return Array.from(moduleMap.entries()).map(([name, providers]) => ({\n name,\n providers: Array.from(providers),\n }));\n }\n\n public getMetadata(): DevMetadata {\n return {\n actions: this.getActions(),\n queues: this.getQueues(),\n schedulers: this.getSchedulers(),\n topics: this.getTopics(),\n buckets: this.getBuckets(),\n realms: this.getRealms(),\n caches: this.getCaches(),\n pages: this.getPages(),\n providers: this.getProviders(),\n modules: this.getModules(),\n };\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n protected getProviderName(provider?: \"memory\" | any): string {\n if (!provider) {\n return \"default\";\n }\n if (provider === \"memory\") {\n return \"memory\";\n }\n return provider.name || \"custom\";\n }\n}\n","import { NodeSqliteProvider } from \"alepha/orm\";\n\nexport class DevToolsDatabaseProvider extends NodeSqliteProvider {\n public get name() {\n return \"devtools\";\n }\n\n protected readonly options = {\n path: \":memory:\",\n };\n}\n","import { Repository } from \"alepha/orm\";\nimport { logs } from \"../entities/logs.ts\";\nimport { DevToolsDatabaseProvider } from \"../providers/DevToolsDatabaseProvider.ts\";\n\nexport class LogRepository extends Repository<typeof logs.schema> {\n constructor() {\n super(logs, DevToolsDatabaseProvider);\n }\n}\n","import { type Static, t } from \"alepha\";\n\nexport const devActionMetadataSchema = t.object({\n name: t.text(),\n group: t.text(),\n method: t.text(),\n path: t.text(),\n prefix: t.text(),\n fullPath: t.text(),\n description: t.optional(t.text()),\n summary: t.optional(t.text()),\n disabled: t.optional(t.boolean()),\n secure: t.optional(t.boolean()),\n hide: t.optional(t.boolean()),\n body: t.optional(t.any()),\n params: t.optional(t.any()),\n query: t.optional(t.any()),\n response: t.optional(t.any()),\n bodyContentType: t.optional(t.text()),\n});\n\nexport type DevActionMetadata = Static<typeof devActionMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devBucketMetadataSchema = t.object({\n name: t.text(),\n description: t.optional(t.text()),\n mimeTypes: t.optional(t.array(t.text())),\n maxSize: t.optional(t.number()),\n provider: t.text(),\n});\n\nexport type DevBucketMetadata = Static<typeof devBucketMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devCacheMetadataSchema = t.object({\n name: t.text(),\n ttl: t.optional(t.any()),\n disabled: t.optional(t.boolean()),\n provider: t.text(),\n});\n\nexport type DevCacheMetadata = Static<typeof devCacheMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devModuleMetadataSchema = t.object({\n name: t.text(),\n providers: t.array(t.text()),\n});\n\nexport type DevModuleMetadata = Static<typeof devModuleMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devPageMetadataSchema = t.object({\n name: t.text(),\n description: t.optional(t.text()),\n path: t.optional(t.text()),\n params: t.optional(t.any()),\n query: t.optional(t.any()),\n hasComponent: t.boolean(),\n hasLazy: t.boolean(),\n hasResolve: t.boolean(),\n hasChildren: t.boolean(),\n hasParent: t.boolean(),\n hasErrorHandler: t.boolean(),\n static: t.optional(t.boolean()),\n cache: t.optional(t.any()),\n client: t.optional(t.any()),\n animation: t.optional(t.any()),\n});\n\nexport type DevPageMetadata = Static<typeof devPageMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devProviderMetadataSchema = t.object({\n name: t.text(),\n module: t.optional(t.text()),\n dependencies: t.array(t.text()),\n aliases: t.optional(t.array(t.text())),\n});\n\nexport type DevProviderMetadata = Static<typeof devProviderMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devQueueMetadataSchema = t.object({\n name: t.text(),\n description: t.optional(t.text()),\n schema: t.optional(t.any()),\n provider: t.text(),\n});\n\nexport type DevQueueMetadata = Static<typeof devQueueMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devRealmMetadataSchema = t.object({\n name: t.text(),\n description: t.optional(t.text()),\n roles: t.optional(t.array(t.any())),\n type: t.enum([\"internal\", \"external\"]),\n settings: t.optional(\n t.object({\n accessTokenExpiration: t.optional(t.any()),\n refreshTokenExpiration: t.optional(t.any()),\n hasOnCreateSession: t.boolean(),\n hasOnRefreshSession: t.boolean(),\n hasOnDeleteSession: t.boolean(),\n }),\n ),\n});\n\nexport type DevRealmMetadata = Static<typeof devRealmMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devSchedulerMetadataSchema = t.object({\n name: t.text(),\n description: t.optional(t.text()),\n cron: t.optional(t.text()),\n interval: t.optional(t.any()),\n lock: t.optional(t.boolean()),\n});\n\nexport type DevSchedulerMetadata = Static<typeof devSchedulerMetadataSchema>;\n","import { type Static, t } from \"alepha\";\n\nexport const devTopicMetadataSchema = t.object({\n name: t.text(),\n description: t.optional(t.text()),\n schema: t.optional(t.any()),\n provider: t.text(),\n});\n\nexport type DevTopicMetadata = Static<typeof devTopicMetadataSchema>;\n","import { type Static, t } from \"alepha\";\nimport { devActionMetadataSchema } from \"./DevActionMetadata.ts\";\nimport { devBucketMetadataSchema } from \"./DevBucketMetadata.ts\";\nimport { devCacheMetadataSchema } from \"./DevCacheMetadata.ts\";\nimport { devModuleMetadataSchema } from \"./DevModuleMetadata.ts\";\nimport { devPageMetadataSchema } from \"./DevPageMetadata.ts\";\nimport { devProviderMetadataSchema } from \"./DevProviderMetadata.ts\";\nimport { devQueueMetadataSchema } from \"./DevQueueMetadata.ts\";\nimport { devRealmMetadataSchema } from \"./DevRealmMetadata.ts\";\nimport { devSchedulerMetadataSchema } from \"./DevSchedulerMetadata.ts\";\nimport { devTopicMetadataSchema } from \"./DevTopicMetadata.ts\";\n\nexport const devMetadataSchema = t.object({\n actions: t.array(devActionMetadataSchema),\n queues: t.array(devQueueMetadataSchema),\n schedulers: t.array(devSchedulerMetadataSchema),\n topics: t.array(devTopicMetadataSchema),\n buckets: t.array(devBucketMetadataSchema),\n realms: t.array(devRealmMetadataSchema),\n caches: t.array(devCacheMetadataSchema),\n pages: t.array(devPageMetadataSchema),\n providers: t.array(devProviderMetadataSchema),\n modules: t.array(devModuleMetadataSchema),\n // More metadata will be added here later\n});\n\nexport type DevMetadata = Static<typeof devMetadataSchema>;\n","import { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { $hook, $inject, Alepha, pageQuerySchema, t } from \"alepha\";\nimport { $batch } from \"alepha/batch\";\nimport { $logger, JsonFormatterProvider, type LogEntry } from \"alepha/logger\";\nimport { parseQueryString } from \"alepha/orm\";\nimport { $route, ServerProvider } from \"alepha/server\";\nimport { $serve } from \"alepha/server/static\";\nimport { type DevLogEntry, logs } from \"./entities/logs.ts\";\nimport { DevToolsMetadataProvider } from \"./providers/DevToolsMetadataProvider.ts\";\nimport { LogRepository } from \"./repositories/LogRepository.ts\";\nimport { devMetadataSchema } from \"./schemas/DevMetadata.ts\";\n\nexport class DevToolsProvider {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly serverProvider = $inject(ServerProvider);\n protected readonly jsonFormatter = $inject(JsonFormatterProvider);\n protected readonly logs = $inject(LogRepository);\n protected readonly devCollectorProvider = $inject(DevToolsMetadataProvider);\n\n protected readonly onStart = $hook({\n on: \"start\",\n handler: () => {\n this.log.info(\n `Devtools available at ${this.serverProvider.hostname}/devtools/`,\n );\n },\n });\n\n protected batchLogs = $batch({\n maxSize: 50,\n maxDuration: [10, \"seconds\"],\n schema: logs.insertSchema,\n handler: async (entries) => {\n await this.logs.createMany(entries);\n },\n });\n\n protected readonly onLog = $hook({\n on: \"log\",\n handler: async (ev: { message?: string; entry: LogEntry }) => {\n // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n // CAUTION: It's very easy to create an infinite loop here.\n // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n try {\n if (!this.alepha.isStarted()) {\n return;\n }\n\n if (ev.entry.module === \"alepha.devtools\") {\n // skip devtools logs to avoid infinite loop\n return;\n }\n\n if (ev.entry.level === \"TRACE\" && ev.entry.module === \"alepha.batch\") {\n // skip batch trace logs to avoid infinite loop\n return;\n }\n\n if (this.alepha.isProduction() && ev.entry.level === \"TRACE\") {\n // skip trace logs in production\n return;\n }\n\n const entry = {\n ...ev.entry,\n data:\n ev.entry.data instanceof Error\n ? this.jsonFormatter.formatJsonError(ev.entry.data)\n : typeof ev.entry.data === \"object\" &&\n !Array.isArray(ev.entry.data)\n ? ev.entry.data\n : { data: ev.entry.data },\n };\n\n await this.batchLogs.push(entry as DevLogEntry);\n } catch (error) {\n // DO TO NOT WITH THE LOGGER HERE TO AVOID INFINITE LOOP\n console.error(error, ev);\n }\n },\n });\n\n protected readonly uiRoute = $serve({\n path: \"/devtools\",\n root: join(fileURLToPath(import.meta.url), \"../../assets/devtools\"),\n historyApiFallback: true,\n });\n\n protected readonly metadataRoute = $route({\n method: \"GET\",\n path: \"/devtools/api/metadata\",\n silent: true,\n schema: {\n response: devMetadataSchema,\n },\n handler: () => {\n return this.devCollectorProvider.getMetadata();\n },\n });\n\n protected readonly logsRoute = $route({\n method: \"GET\",\n path: \"/devtools/api/logs\",\n silent: true,\n schema: {\n query: t.extend(pageQuerySchema, {\n search: t.optional(t.string()),\n }),\n response: t.page(logs.schema),\n },\n handler: ({ query }) => {\n query.sort ??= \"-timestamp\";\n return this.logs.paginate(\n query,\n query.search\n ? {\n where: parseQueryString(query.search),\n }\n : {},\n {\n count: true,\n },\n );\n },\n });\n}\n","import { $module } from \"alepha\";\nimport { DevToolsProvider } from \"./DevToolsProvider.ts\";\nimport { DevToolsDatabaseProvider } from \"./providers/DevToolsDatabaseProvider.ts\";\nimport { DevToolsMetadataProvider } from \"./providers/DevToolsMetadataProvider.ts\";\nimport { LogRepository } from \"./repositories/LogRepository.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./providers/DevToolsMetadataProvider.ts\";\nexport * from \"./schemas/DevActionMetadata.ts\";\nexport * from \"./schemas/DevBucketMetadata.ts\";\nexport * from \"./schemas/DevCacheMetadata.ts\";\nexport * from \"./schemas/DevMetadata.ts\";\nexport * from \"./schemas/DevModuleMetadata.ts\";\nexport * from \"./schemas/DevPageMetadata.ts\";\nexport * from \"./schemas/DevProviderMetadata.ts\";\nexport * from \"./schemas/DevQueueMetadata.ts\";\nexport * from \"./schemas/DevRealmMetadata.ts\";\nexport * from \"./schemas/DevSchedulerMetadata.ts\";\nexport * from \"./schemas/DevTopicMetadata.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Developer tools module for monitoring and debugging Alepha applications.\n *\n * This module provides comprehensive data collection capabilities for tracking application behavior,\n * performance metrics, and debugging information in real-time.\n *\n * @see {@link DevToolsMetadataProvider}\n * @module alepha.devtools\n */\nexport const AlephaDevtools = $module({\n name: \"alepha.devtools\",\n descriptors: [],\n services: [\n DevToolsMetadataProvider,\n DevToolsProvider,\n DevToolsDatabaseProvider,\n LogRepository,\n ],\n register: (alepha) => {\n alepha.with(DevToolsProvider);\n alepha.with(DevToolsDatabaseProvider);\n alepha.with(DevToolsMetadataProvider);\n alepha.state.push(\"alepha.build.assets\", \"@alepha/devtools\");\n },\n});\n"],"mappings":"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"}