@alepha/devtools 0.10.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/dist/index.js ADDED
@@ -0,0 +1,350 @@
1
+ import { $hook, $inject, $module, Alepha, t } from "@alepha/core";
2
+ import { $bucket } from "@alepha/bucket";
3
+ import { $cache } from "@alepha/cache";
4
+ import { $queue } from "@alepha/queue";
5
+ import { $page } from "@alepha/react";
6
+ import { $scheduler } from "@alepha/scheduler";
7
+ import { $realm } from "@alepha/security";
8
+ import { $action, $route } from "@alepha/server";
9
+ import { $topic } from "@alepha/topic";
10
+
11
+ //#region src/schemas/DevActionMetadata.ts
12
+ const devActionMetadataSchema = t.object({
13
+ name: t.string(),
14
+ group: t.string(),
15
+ method: t.string(),
16
+ path: t.string(),
17
+ prefix: t.string(),
18
+ fullPath: t.string(),
19
+ description: t.optional(t.string()),
20
+ summary: t.optional(t.string()),
21
+ disabled: t.optional(t.boolean()),
22
+ secure: t.optional(t.boolean()),
23
+ hide: t.optional(t.boolean()),
24
+ body: t.optional(t.any()),
25
+ params: t.optional(t.any()),
26
+ query: t.optional(t.any()),
27
+ response: t.optional(t.any()),
28
+ bodyContentType: t.optional(t.string())
29
+ });
30
+
31
+ //#endregion
32
+ //#region src/schemas/DevBucketMetadata.ts
33
+ const devBucketMetadataSchema = t.object({
34
+ name: t.string(),
35
+ description: t.optional(t.string()),
36
+ mimeTypes: t.optional(t.array(t.string())),
37
+ maxSize: t.optional(t.number()),
38
+ provider: t.string()
39
+ });
40
+
41
+ //#endregion
42
+ //#region src/schemas/DevCacheMetadata.ts
43
+ const devCacheMetadataSchema = t.object({
44
+ name: t.string(),
45
+ ttl: t.optional(t.any()),
46
+ disabled: t.optional(t.boolean()),
47
+ provider: t.string()
48
+ });
49
+
50
+ //#endregion
51
+ //#region src/schemas/DevLogEntry.ts
52
+ const devLogEntrySchema = t.object({
53
+ formatted: t.string(),
54
+ entry: t.any()
55
+ });
56
+
57
+ //#endregion
58
+ //#region src/schemas/DevModuleMetadata.ts
59
+ const devModuleMetadataSchema = t.object({
60
+ name: t.string(),
61
+ providers: t.array(t.string())
62
+ });
63
+
64
+ //#endregion
65
+ //#region src/schemas/DevPageMetadata.ts
66
+ const devPageMetadataSchema = t.object({
67
+ name: t.string(),
68
+ description: t.optional(t.string()),
69
+ path: t.optional(t.string()),
70
+ params: t.optional(t.any()),
71
+ query: t.optional(t.any()),
72
+ hasComponent: t.boolean(),
73
+ hasLazy: t.boolean(),
74
+ hasResolve: t.boolean(),
75
+ hasChildren: t.boolean(),
76
+ hasParent: t.boolean(),
77
+ hasErrorHandler: t.boolean(),
78
+ static: t.optional(t.boolean()),
79
+ cache: t.optional(t.any()),
80
+ client: t.optional(t.any()),
81
+ animation: t.optional(t.any())
82
+ });
83
+
84
+ //#endregion
85
+ //#region src/schemas/DevProviderMetadata.ts
86
+ const devProviderMetadataSchema = t.object({
87
+ name: t.string(),
88
+ module: t.optional(t.string()),
89
+ dependencies: t.array(t.string()),
90
+ aliases: t.optional(t.array(t.string()))
91
+ });
92
+
93
+ //#endregion
94
+ //#region src/schemas/DevQueueMetadata.ts
95
+ const devQueueMetadataSchema = t.object({
96
+ name: t.string(),
97
+ description: t.optional(t.string()),
98
+ schema: t.optional(t.any()),
99
+ provider: t.string()
100
+ });
101
+
102
+ //#endregion
103
+ //#region src/schemas/DevRealmMetadata.ts
104
+ const devRealmMetadataSchema = t.object({
105
+ name: t.string(),
106
+ description: t.optional(t.string()),
107
+ roles: t.optional(t.array(t.any())),
108
+ type: t.enum(["internal", "external"]),
109
+ settings: t.optional(t.object({
110
+ accessTokenExpiration: t.optional(t.any()),
111
+ refreshTokenExpiration: t.optional(t.any()),
112
+ hasOnCreateSession: t.boolean(),
113
+ hasOnRefreshSession: t.boolean(),
114
+ hasOnDeleteSession: t.boolean()
115
+ }))
116
+ });
117
+
118
+ //#endregion
119
+ //#region src/schemas/DevSchedulerMetadata.ts
120
+ const devSchedulerMetadataSchema = t.object({
121
+ name: t.string(),
122
+ description: t.optional(t.string()),
123
+ cron: t.optional(t.string()),
124
+ interval: t.optional(t.any()),
125
+ lock: t.optional(t.boolean())
126
+ });
127
+
128
+ //#endregion
129
+ //#region src/schemas/DevTopicMetadata.ts
130
+ const devTopicMetadataSchema = t.object({
131
+ name: t.string(),
132
+ description: t.optional(t.string()),
133
+ schema: t.optional(t.any()),
134
+ provider: t.string()
135
+ });
136
+
137
+ //#endregion
138
+ //#region src/schemas/DevMetadata.ts
139
+ const devMetadataSchema = t.object({
140
+ logs: t.array(devLogEntrySchema),
141
+ actions: t.array(devActionMetadataSchema),
142
+ queues: t.array(devQueueMetadataSchema),
143
+ schedulers: t.array(devSchedulerMetadataSchema),
144
+ topics: t.array(devTopicMetadataSchema),
145
+ buckets: t.array(devBucketMetadataSchema),
146
+ realms: t.array(devRealmMetadataSchema),
147
+ caches: t.array(devCacheMetadataSchema),
148
+ pages: t.array(devPageMetadataSchema),
149
+ providers: t.array(devProviderMetadataSchema),
150
+ modules: t.array(devModuleMetadataSchema)
151
+ });
152
+
153
+ //#endregion
154
+ //#region src/DevCollectorProvider.ts
155
+ var DevCollectorProvider = class {
156
+ alepha = $inject(Alepha);
157
+ logs = [];
158
+ maxLogs = 1e3;
159
+ onLog = $hook({
160
+ on: "log",
161
+ handler: (ev) => {
162
+ this.logs.push({
163
+ formatted: ev.message,
164
+ entry: ev.entry
165
+ });
166
+ if (this.logs.length > this.maxLogs) this.logs.shift();
167
+ }
168
+ });
169
+ getLogs() {
170
+ return this.logs;
171
+ }
172
+ getActions() {
173
+ const actionDescriptors = this.alepha.descriptors($action);
174
+ return actionDescriptors.map((action) => {
175
+ const schema = action.schema;
176
+ const options = action.options;
177
+ return {
178
+ name: action.name,
179
+ group: action.group,
180
+ method: action.method,
181
+ path: action.path,
182
+ prefix: action.prefix,
183
+ fullPath: action.route.path,
184
+ description: action.options.description,
185
+ summary: options.summary,
186
+ disabled: action.options.disabled,
187
+ secure: options.secure,
188
+ hide: options.hide,
189
+ body: schema?.body,
190
+ params: schema?.params,
191
+ query: schema?.query,
192
+ response: schema?.response,
193
+ bodyContentType: action.getBodyContentType()
194
+ };
195
+ });
196
+ }
197
+ getQueues() {
198
+ const queueDescriptors = this.alepha.descriptors($queue);
199
+ return queueDescriptors.map((queue) => ({
200
+ name: queue.name,
201
+ description: queue.options.description,
202
+ schema: queue.options.schema,
203
+ provider: this.getProviderName(queue.options.provider)
204
+ }));
205
+ }
206
+ getSchedulers() {
207
+ const schedulerDescriptors = this.alepha.descriptors($scheduler);
208
+ return schedulerDescriptors.map((scheduler) => ({
209
+ name: scheduler.name,
210
+ description: scheduler.options.description,
211
+ cron: scheduler.options.cron,
212
+ interval: scheduler.options.interval,
213
+ lock: scheduler.options.lock
214
+ }));
215
+ }
216
+ getTopics() {
217
+ const topicDescriptors = this.alepha.descriptors($topic);
218
+ return topicDescriptors.map((topic) => ({
219
+ name: topic.name,
220
+ description: topic.options.description,
221
+ schema: topic.options.schema,
222
+ provider: this.getProviderName(topic.options.provider)
223
+ }));
224
+ }
225
+ getBuckets() {
226
+ const bucketDescriptors = this.alepha.descriptors($bucket);
227
+ return bucketDescriptors.map((bucket) => ({
228
+ name: bucket.name,
229
+ description: bucket.options.description,
230
+ mimeTypes: bucket.options.mimeTypes,
231
+ maxSize: bucket.options.maxSize,
232
+ provider: this.getProviderName(bucket.options.provider)
233
+ }));
234
+ }
235
+ getRealms() {
236
+ const realmDescriptors = this.alepha.descriptors($realm);
237
+ return realmDescriptors.map((realm) => ({
238
+ name: realm.name,
239
+ description: realm.options.description,
240
+ roles: realm.options.roles,
241
+ type: "secret" in realm.options ? "internal" : "external",
242
+ settings: {
243
+ accessTokenExpiration: realm.options.settings?.accessToken?.expiration,
244
+ refreshTokenExpiration: realm.options.settings?.refreshToken?.expiration,
245
+ hasOnCreateSession: !!realm.options.settings?.onCreateSession,
246
+ hasOnRefreshSession: !!realm.options.settings?.onRefreshSession,
247
+ hasOnDeleteSession: !!realm.options.settings?.onDeleteSession
248
+ }
249
+ }));
250
+ }
251
+ getCaches() {
252
+ const cacheDescriptors = this.alepha.descriptors($cache);
253
+ return cacheDescriptors.map((cache) => ({
254
+ name: cache.container,
255
+ ttl: cache.options.ttl,
256
+ disabled: cache.options.disabled,
257
+ provider: this.getProviderName(cache.options.provider)
258
+ }));
259
+ }
260
+ getPages() {
261
+ const pageDescriptors = this.alepha.descriptors($page);
262
+ return pageDescriptors.map((page) => ({
263
+ name: page.name,
264
+ description: page.options.description,
265
+ path: page.options.path,
266
+ params: page.options.schema?.params,
267
+ query: page.options.schema?.query,
268
+ hasComponent: !!page.options.component,
269
+ hasLazy: !!page.options.lazy,
270
+ hasResolve: !!page.options.resolve,
271
+ hasChildren: !!page.options.children,
272
+ hasParent: !!page.options.parent,
273
+ hasErrorHandler: !!page.options.errorHandler,
274
+ static: typeof page.options.static === "boolean" ? page.options.static : !!page.options.static,
275
+ cache: page.options.cache,
276
+ client: page.options.client,
277
+ animation: page.options.animation
278
+ }));
279
+ }
280
+ getProviders() {
281
+ const graph = this.alepha.graph();
282
+ return Object.entries(graph).map(([name, info]) => ({
283
+ name,
284
+ module: info.module,
285
+ dependencies: info.from,
286
+ aliases: info.as
287
+ }));
288
+ }
289
+ getModules() {
290
+ const graph = this.alepha.graph();
291
+ const moduleMap = /* @__PURE__ */ new Map();
292
+ for (const [providerName, info] of Object.entries(graph)) if (info.module) {
293
+ if (!moduleMap.has(info.module)) moduleMap.set(info.module, /* @__PURE__ */ new Set());
294
+ moduleMap.get(info.module).add(providerName);
295
+ }
296
+ return Array.from(moduleMap.entries()).map(([name, providers]) => ({
297
+ name,
298
+ providers: Array.from(providers)
299
+ }));
300
+ }
301
+ getMetadata() {
302
+ return {
303
+ logs: this.getLogs(),
304
+ actions: this.getActions(),
305
+ queues: this.getQueues(),
306
+ schedulers: this.getSchedulers(),
307
+ topics: this.getTopics(),
308
+ buckets: this.getBuckets(),
309
+ realms: this.getRealms(),
310
+ caches: this.getCaches(),
311
+ pages: this.getPages(),
312
+ providers: this.getProviders(),
313
+ modules: this.getModules()
314
+ };
315
+ }
316
+ metadataRoute = $route({
317
+ method: "GET",
318
+ path: "/_devtools/metadata",
319
+ schema: { response: devMetadataSchema },
320
+ handler: () => {
321
+ return this.getMetadata();
322
+ }
323
+ });
324
+ getProviderName(provider) {
325
+ if (!provider) return "default";
326
+ if (provider === "memory") return "memory";
327
+ return provider.name || "custom";
328
+ }
329
+ };
330
+
331
+ //#endregion
332
+ //#region src/index.ts
333
+ /**
334
+ * Developer tools module for monitoring and debugging Alepha applications.
335
+ *
336
+ * This module provides comprehensive data collection capabilities for tracking application behavior,
337
+ * performance metrics, and debugging information in real-time.
338
+ *
339
+ * @see {@link DevCollectorProvider}
340
+ * @module alepha.devtools
341
+ */
342
+ const AlephaDevtools = $module({
343
+ name: "alepha.devtools",
344
+ descriptors: [],
345
+ services: [DevCollectorProvider]
346
+ });
347
+
348
+ //#endregion
349
+ export { AlephaDevtools, DevCollectorProvider, devActionMetadataSchema, devBucketMetadataSchema, devCacheMetadataSchema, devLogEntrySchema, devMetadataSchema, devModuleMetadataSchema, devPageMetadataSchema, devProviderMetadataSchema, devQueueMetadataSchema, devRealmMetadataSchema, devSchedulerMetadataSchema, devTopicMetadataSchema };
350
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/schemas/DevActionMetadata.ts","../src/schemas/DevBucketMetadata.ts","../src/schemas/DevCacheMetadata.ts","../src/schemas/DevLogEntry.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/DevCollectorProvider.ts","../src/index.ts"],"sourcesContent":["import { type Static, t } from \"@alepha/core\";\n\nexport const devActionMetadataSchema = t.object({\n\tname: t.string(),\n\tgroup: t.string(),\n\tmethod: t.string(),\n\tpath: t.string(),\n\tprefix: t.string(),\n\tfullPath: t.string(),\n\tdescription: t.optional(t.string()),\n\tsummary: t.optional(t.string()),\n\tdisabled: t.optional(t.boolean()),\n\tsecure: t.optional(t.boolean()),\n\thide: t.optional(t.boolean()),\n\tbody: t.optional(t.any()),\n\tparams: t.optional(t.any()),\n\tquery: t.optional(t.any()),\n\tresponse: t.optional(t.any()),\n\tbodyContentType: t.optional(t.string()),\n});\n\nexport type DevActionMetadata = Static<typeof devActionMetadataSchema>;\n","import { type Static, t } from \"@alepha/core\";\n\nexport const devBucketMetadataSchema = t.object({\n\tname: t.string(),\n\tdescription: t.optional(t.string()),\n\tmimeTypes: t.optional(t.array(t.string())),\n\tmaxSize: t.optional(t.number()),\n\tprovider: t.string(),\n});\n\nexport type DevBucketMetadata = Static<typeof devBucketMetadataSchema>;\n","import { type Static, t } from \"@alepha/core\";\n\nexport const devCacheMetadataSchema = t.object({\n\tname: t.string(),\n\tttl: t.optional(t.any()),\n\tdisabled: t.optional(t.boolean()),\n\tprovider: t.string(),\n});\n\nexport type DevCacheMetadata = Static<typeof devCacheMetadataSchema>;\n","import { type Static, t } from \"@alepha/core\";\nimport type { LogEntry } from \"@alepha/logger\";\n\nexport const devLogEntrySchema = t.object({\n\tformatted: t.string(),\n\tentry: t.any(), // Use any since LogEntry has Date instead of string for timestamp\n});\n\nexport type DevLogEntry = Static<typeof devLogEntrySchema> & {\n\tentry: LogEntry;\n};\n","import { type Static, t } from \"@alepha/core\";\n\nexport const devModuleMetadataSchema = t.object({\n\tname: t.string(),\n\tproviders: t.array(t.string()),\n});\n\nexport type DevModuleMetadata = Static<typeof devModuleMetadataSchema>;\n","import { type Static, t } from \"@alepha/core\";\n\nexport const devPageMetadataSchema = t.object({\n\tname: t.string(),\n\tdescription: t.optional(t.string()),\n\tpath: t.optional(t.string()),\n\tparams: t.optional(t.any()),\n\tquery: t.optional(t.any()),\n\thasComponent: t.boolean(),\n\thasLazy: t.boolean(),\n\thasResolve: t.boolean(),\n\thasChildren: t.boolean(),\n\thasParent: t.boolean(),\n\thasErrorHandler: t.boolean(),\n\tstatic: t.optional(t.boolean()),\n\tcache: t.optional(t.any()),\n\tclient: t.optional(t.any()),\n\tanimation: t.optional(t.any()),\n});\n\nexport type DevPageMetadata = Static<typeof devPageMetadataSchema>;\n","import { type Static, t } from \"@alepha/core\";\n\nexport const devProviderMetadataSchema = t.object({\n\tname: t.string(),\n\tmodule: t.optional(t.string()),\n\tdependencies: t.array(t.string()),\n\taliases: t.optional(t.array(t.string())),\n});\n\nexport type DevProviderMetadata = Static<typeof devProviderMetadataSchema>;\n","import { type Static, t } from \"@alepha/core\";\n\nexport const devQueueMetadataSchema = t.object({\n\tname: t.string(),\n\tdescription: t.optional(t.string()),\n\tschema: t.optional(t.any()),\n\tprovider: t.string(),\n});\n\nexport type DevQueueMetadata = Static<typeof devQueueMetadataSchema>;\n","import { type Static, t } from \"@alepha/core\";\n\nexport const devRealmMetadataSchema = t.object({\n\tname: t.string(),\n\tdescription: t.optional(t.string()),\n\troles: t.optional(t.array(t.any())),\n\ttype: t.enum([\"internal\", \"external\"]),\n\tsettings: t.optional(\n\t\tt.object({\n\t\t\taccessTokenExpiration: t.optional(t.any()),\n\t\t\trefreshTokenExpiration: t.optional(t.any()),\n\t\t\thasOnCreateSession: t.boolean(),\n\t\t\thasOnRefreshSession: t.boolean(),\n\t\t\thasOnDeleteSession: t.boolean(),\n\t\t}),\n\t),\n});\n\nexport type DevRealmMetadata = Static<typeof devRealmMetadataSchema>;\n","import { type Static, t } from \"@alepha/core\";\n\nexport const devSchedulerMetadataSchema = t.object({\n\tname: t.string(),\n\tdescription: t.optional(t.string()),\n\tcron: t.optional(t.string()),\n\tinterval: t.optional(t.any()),\n\tlock: t.optional(t.boolean()),\n});\n\nexport type DevSchedulerMetadata = Static<typeof devSchedulerMetadataSchema>;\n","import { type Static, t } from \"@alepha/core\";\n\nexport const devTopicMetadataSchema = t.object({\n\tname: t.string(),\n\tdescription: t.optional(t.string()),\n\tschema: t.optional(t.any()),\n\tprovider: t.string(),\n});\n\nexport type DevTopicMetadata = Static<typeof devTopicMetadataSchema>;\n","import { type Static, t } from \"@alepha/core\";\nimport { devActionMetadataSchema } from \"./DevActionMetadata.ts\";\nimport { devBucketMetadataSchema } from \"./DevBucketMetadata.ts\";\nimport { devCacheMetadataSchema } from \"./DevCacheMetadata.ts\";\nimport { devLogEntrySchema } from \"./DevLogEntry.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\tlogs: t.array(devLogEntrySchema),\n\tactions: t.array(devActionMetadataSchema),\n\tqueues: t.array(devQueueMetadataSchema),\n\tschedulers: t.array(devSchedulerMetadataSchema),\n\ttopics: t.array(devTopicMetadataSchema),\n\tbuckets: t.array(devBucketMetadataSchema),\n\trealms: t.array(devRealmMetadataSchema),\n\tcaches: t.array(devCacheMetadataSchema),\n\tpages: t.array(devPageMetadataSchema),\n\tproviders: t.array(devProviderMetadataSchema),\n\tmodules: t.array(devModuleMetadataSchema),\n\t// More metadata will be added here later\n});\n\nexport type DevMetadata = Static<typeof devMetadataSchema>;\n","import { $bucket } from \"@alepha/bucket\";\nimport { $cache } from \"@alepha/cache\";\nimport { $hook, $inject, Alepha } from \"@alepha/core\";\nimport type { LogEntry } from \"@alepha/logger\";\nimport { $queue } from \"@alepha/queue\";\nimport { $page } from \"@alepha/react\";\nimport { $scheduler } from \"@alepha/scheduler\";\nimport { $realm } from \"@alepha/security\";\nimport { $action, $route } 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 { DevLogEntry } from \"./schemas/DevLogEntry.ts\";\nimport { type DevMetadata, devMetadataSchema } 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 DevCollectorProvider {\n\tprotected readonly alepha = $inject(Alepha);\n\tprotected readonly logs: DevLogEntry[] = [];\n\tprotected readonly maxLogs = 1000;\n\n\tprotected readonly onLog = $hook({\n\t\ton: \"log\",\n\t\thandler: (ev: { message: string; entry: LogEntry }) => {\n\t\t\tthis.logs.push({\n\t\t\t\tformatted: ev.message,\n\t\t\t\tentry: ev.entry,\n\t\t\t});\n\n\t\t\t// Keep only the last 1000 logs\n\t\t\tif (this.logs.length > this.maxLogs) {\n\t\t\t\tthis.logs.shift();\n\t\t\t}\n\t\t},\n\t});\n\n\tpublic getLogs(): DevLogEntry[] {\n\t\treturn this.logs;\n\t}\n\n\tpublic getActions(): DevActionMetadata[] {\n\t\tconst actionDescriptors = this.alepha.descriptors($action);\n\n\t\treturn actionDescriptors.map((action) => {\n\t\t\tconst schema = action.schema;\n\t\t\tconst options = action.options as any; // Allow accessing augmented properties\n\n\t\t\treturn {\n\t\t\t\tname: action.name,\n\t\t\t\tgroup: action.group,\n\t\t\t\tmethod: action.method,\n\t\t\t\tpath: action.path,\n\t\t\t\tprefix: action.prefix,\n\t\t\t\tfullPath: action.route.path,\n\t\t\t\tdescription: action.options.description,\n\t\t\t\tsummary: options.summary,\n\t\t\t\tdisabled: action.options.disabled,\n\t\t\t\tsecure: options.secure,\n\t\t\t\thide: options.hide,\n\t\t\t\tbody: schema?.body,\n\t\t\t\tparams: schema?.params,\n\t\t\t\tquery: schema?.query,\n\t\t\t\tresponse: schema?.response,\n\t\t\t\tbodyContentType: action.getBodyContentType(),\n\t\t\t};\n\t\t});\n\t}\n\n\tpublic getQueues(): DevQueueMetadata[] {\n\t\tconst queueDescriptors = this.alepha.descriptors($queue);\n\n\t\treturn queueDescriptors.map((queue) => ({\n\t\t\tname: queue.name,\n\t\t\tdescription: queue.options.description,\n\t\t\tschema: queue.options.schema,\n\t\t\tprovider: this.getProviderName(queue.options.provider),\n\t\t}));\n\t}\n\n\tpublic getSchedulers(): DevSchedulerMetadata[] {\n\t\tconst schedulerDescriptors = this.alepha.descriptors($scheduler);\n\n\t\treturn schedulerDescriptors.map((scheduler) => ({\n\t\t\tname: scheduler.name,\n\t\t\tdescription: scheduler.options.description,\n\t\t\tcron: scheduler.options.cron,\n\t\t\tinterval: scheduler.options.interval,\n\t\t\tlock: scheduler.options.lock,\n\t\t}));\n\t}\n\n\tpublic getTopics(): DevTopicMetadata[] {\n\t\tconst topicDescriptors = this.alepha.descriptors($topic);\n\n\t\treturn topicDescriptors.map((topic) => ({\n\t\t\tname: topic.name,\n\t\t\tdescription: topic.options.description,\n\t\t\tschema: topic.options.schema,\n\t\t\tprovider: this.getProviderName(topic.options.provider),\n\t\t}));\n\t}\n\n\tpublic getBuckets(): DevBucketMetadata[] {\n\t\tconst bucketDescriptors = this.alepha.descriptors($bucket);\n\n\t\treturn bucketDescriptors.map((bucket) => ({\n\t\t\tname: bucket.name,\n\t\t\tdescription: bucket.options.description,\n\t\t\tmimeTypes: bucket.options.mimeTypes,\n\t\t\tmaxSize: bucket.options.maxSize,\n\t\t\tprovider: this.getProviderName(bucket.options.provider),\n\t\t}));\n\t}\n\n\tpublic getRealms(): DevRealmMetadata[] {\n\t\tconst realmDescriptors = this.alepha.descriptors($realm);\n\n\t\treturn realmDescriptors.map((realm) => ({\n\t\t\tname: realm.name,\n\t\t\tdescription: realm.options.description,\n\t\t\troles: realm.options.roles,\n\t\t\ttype: \"secret\" in realm.options ? \"internal\" : \"external\",\n\t\t\tsettings: {\n\t\t\t\taccessTokenExpiration: realm.options.settings?.accessToken?.expiration,\n\t\t\t\trefreshTokenExpiration:\n\t\t\t\t\trealm.options.settings?.refreshToken?.expiration,\n\t\t\t\thasOnCreateSession: !!realm.options.settings?.onCreateSession,\n\t\t\t\thasOnRefreshSession: !!realm.options.settings?.onRefreshSession,\n\t\t\t\thasOnDeleteSession: !!realm.options.settings?.onDeleteSession,\n\t\t\t},\n\t\t}));\n\t}\n\n\tpublic getCaches(): DevCacheMetadata[] {\n\t\tconst cacheDescriptors = this.alepha.descriptors($cache);\n\n\t\treturn cacheDescriptors.map((cache) => ({\n\t\t\tname: cache.container,\n\t\t\tttl: cache.options.ttl,\n\t\t\tdisabled: cache.options.disabled,\n\t\t\tprovider: this.getProviderName(cache.options.provider),\n\t\t}));\n\t}\n\n\tpublic getPages(): DevPageMetadata[] {\n\t\tconst pageDescriptors = this.alepha.descriptors($page);\n\n\t\treturn pageDescriptors.map((page) => ({\n\t\t\tname: page.name,\n\t\t\tdescription: page.options.description,\n\t\t\tpath: page.options.path,\n\t\t\tparams: page.options.schema?.params,\n\t\t\tquery: page.options.schema?.query,\n\t\t\thasComponent: !!page.options.component,\n\t\t\thasLazy: !!page.options.lazy,\n\t\t\thasResolve: !!page.options.resolve,\n\t\t\thasChildren: !!page.options.children,\n\t\t\thasParent: !!page.options.parent,\n\t\t\thasErrorHandler: !!page.options.errorHandler,\n\t\t\tstatic:\n\t\t\t\ttypeof page.options.static === \"boolean\"\n\t\t\t\t\t? page.options.static\n\t\t\t\t\t: !!page.options.static,\n\t\t\tcache: page.options.cache,\n\t\t\tclient: page.options.client,\n\t\t\tanimation: page.options.animation,\n\t\t}));\n\t}\n\n\tpublic getProviders(): DevProviderMetadata[] {\n\t\tconst graph = this.alepha.graph();\n\n\t\treturn Object.entries(graph).map(([name, info]) => ({\n\t\t\tname,\n\t\t\tmodule: info.module,\n\t\t\tdependencies: info.from,\n\t\t\taliases: info.as,\n\t\t}));\n\t}\n\n\tpublic getModules(): DevModuleMetadata[] {\n\t\tconst graph = this.alepha.graph();\n\t\tconst moduleMap = new Map<string, Set<string>>();\n\n\t\t// Group providers by module\n\t\tfor (const [providerName, info] of Object.entries(graph)) {\n\t\t\tif (info.module) {\n\t\t\t\tif (!moduleMap.has(info.module)) {\n\t\t\t\t\tmoduleMap.set(info.module, new Set());\n\t\t\t\t}\n\t\t\t\tmoduleMap.get(info.module)!.add(providerName);\n\t\t\t}\n\t\t}\n\n\t\treturn Array.from(moduleMap.entries()).map(([name, providers]) => ({\n\t\t\tname,\n\t\t\tproviders: Array.from(providers),\n\t\t}));\n\t}\n\n\tpublic getMetadata(): DevMetadata {\n\t\treturn {\n\t\t\tlogs: this.getLogs(),\n\t\t\tactions: this.getActions(),\n\t\t\tqueues: this.getQueues(),\n\t\t\tschedulers: this.getSchedulers(),\n\t\t\ttopics: this.getTopics(),\n\t\t\tbuckets: this.getBuckets(),\n\t\t\trealms: this.getRealms(),\n\t\t\tcaches: this.getCaches(),\n\t\t\tpages: this.getPages(),\n\t\t\tproviders: this.getProviders(),\n\t\t\tmodules: this.getModules(),\n\t\t};\n\t}\n\n\tprotected readonly metadataRoute = $route({\n\t\tmethod: \"GET\",\n\t\tpath: \"/_devtools/metadata\",\n\t\tschema: {\n\t\t\tresponse: devMetadataSchema,\n\t\t},\n\t\thandler: () => {\n\t\t\treturn this.getMetadata();\n\t\t},\n\t});\n\n\tprotected getProviderName(provider?: \"memory\" | any): string {\n\t\tif (!provider) {\n\t\t\treturn \"default\";\n\t\t}\n\t\tif (provider === \"memory\") {\n\t\t\treturn \"memory\";\n\t\t}\n\t\treturn provider.name || \"custom\";\n\t}\n}\n","import { $module } from \"@alepha/core\";\nimport { DevCollectorProvider } from \"./DevCollectorProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./DevCollectorProvider.ts\";\nexport * from \"./schemas/DevActionMetadata.ts\";\nexport * from \"./schemas/DevBucketMetadata.ts\";\nexport * from \"./schemas/DevCacheMetadata.ts\";\nexport * from \"./schemas/DevLogEntry.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 DevCollectorProvider}\n * @module alepha.devtools\n */\nexport const AlephaDevtools = $module({\n\tname: \"alepha.devtools\",\n\tdescriptors: [],\n\tservices: [DevCollectorProvider],\n});\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@alepha/devtools",
3
+ "description": "Developer tools for monitoring and debugging Alepha applications.",
4
+ "version": "0.10.2",
5
+ "type": "module",
6
+ "engines": {
7
+ "node": ">=22.0.0"
8
+ },
9
+ "license": "MIT",
10
+ "main": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "files": [
13
+ "dist",
14
+ "src"
15
+ ],
16
+ "dependencies": {
17
+ "@alepha/bucket": "0.10.2",
18
+ "@alepha/cache": "0.10.2",
19
+ "@alepha/core": "0.10.2",
20
+ "@alepha/logger": "0.10.2",
21
+ "@alepha/queue": "0.10.2",
22
+ "@alepha/react": "0.10.2",
23
+ "@alepha/scheduler": "0.10.2",
24
+ "@alepha/security": "0.10.2",
25
+ "@alepha/server": "0.10.2",
26
+ "@alepha/topic": "0.10.2"
27
+ },
28
+ "devDependencies": {
29
+ "@biomejs/biome": "^2.2.4",
30
+ "tsdown": "^0.15.6",
31
+ "typescript": "^5.9.3",
32
+ "vitest": "^3.2.4"
33
+ },
34
+ "scripts": {
35
+ "test": "vitest run",
36
+ "lint": "biome check --write --unsafe",
37
+ "build": "tsdown -c ../../tsdown.config.ts",
38
+ "check": "tsc"
39
+ },
40
+ "homepage": "https://github.com/feunard/alepha",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "git+https://github.com/feunard/alepha.git"
44
+ },
45
+ "keywords": [
46
+ "alepha",
47
+ "devtools",
48
+ "monitoring",
49
+ "debugging"
50
+ ],
51
+ "module": "./dist/index.js",
52
+ "exports": {
53
+ ".": {
54
+ "types": "./dist/index.d.ts",
55
+ "import": "./dist/index.js"
56
+ }
57
+ }
58
+ }