@strav/devtools 0.2.3 → 0.2.4

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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strav/devtools",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "type": "module",
5
5
  "description": "Debug inspector and performance monitor for the Strav framework",
6
6
  "license": "MIT",
@@ -7,7 +7,7 @@ import { PERIODS } from '../storage/aggregate_store.ts'
7
7
  /**
8
8
  * Register the devtools dashboard routes on a router.
9
9
  *
10
- * Mounts the API under `/_devtools` and serves the SPA dashboard.
10
+ * Uses route aliases from the devtools configuration for named routes.
11
11
  *
12
12
  * @example
13
13
  * import { registerDashboard } from '@strav/devtools/dashboard/routes'
@@ -15,31 +15,49 @@ import { PERIODS } from '../storage/aggregate_store.ts'
15
15
  *
16
16
  * // With custom auth guard
17
17
  * registerDashboard(router, (ctx) => ctx.get('user')?.isAdmin)
18
+ *
19
+ * // After registration, use named routes:
20
+ * const dashboardUrl = routeUrl('devtools.dashboard.home')
21
+ * const apiResponse = await route('devtools.api.entries', { params: { limit: 50 } })
18
22
  */
19
23
  export function registerDashboard(
20
24
  router: Router,
21
25
  guard?: (ctx: Context) => boolean | Promise<boolean>
22
26
  ): void {
23
- router.group({ prefix: '/_devtools', middleware: [dashboardAuth(guard)] }, r => {
24
- // ---- SPA entry point ----
25
- r.get('', serveDashboard)
27
+ const config = DevtoolsManager.config
28
+ const dashboardAlias = config.routes.aliases.dashboard
29
+ const apiAlias = config.routes.aliases.api
30
+ const subdomain = config.routes.subdomain
26
31
 
27
- // ---- API: Entries (Inspector) ----
28
- r.get('/api/entries', listEntries)
29
- r.get('/api/entries/:uuid', showEntry)
30
- r.get('/api/entries/:uuid/batch', showBatch)
31
- r.get('/api/entries/tag/:tag', entriesByTag)
32
+ router.group({ prefix: '/_devtools', middleware: [dashboardAuth(guard)], subdomain }, r => {
33
+ // ---- Dashboard routes ----
34
+ r.group({}, dashboardRoutes).as(dashboardAlias)
32
35
 
33
- // ---- API: Aggregates (Metrics) ----
34
- r.get('/api/metrics/:type', queryMetrics)
35
- r.get('/api/metrics/:type/top', topKeys)
36
+ // ---- API routes ----
37
+ r.group({ prefix: '/api' }, apiRoutes).as(apiAlias)
38
+ })
36
39
 
37
- // ---- API: Stats ----
38
- r.get('/api/stats', stats)
40
+ function dashboardRoutes(r: Router): void {
41
+ r.get('', serveDashboard).as('home')
42
+ }
39
43
 
40
- // ---- API: Prune ----
41
- r.delete('/api/entries', pruneEntries)
42
- })
44
+ function apiRoutes(r: Router): void {
45
+ // ---- Entries (Inspector) ----
46
+ r.get('/entries', listEntries).as('entries')
47
+ r.get('/entries/:uuid', showEntry).as('entry')
48
+ r.get('/entries/:uuid/batch', showBatch).as('entry_batch')
49
+ r.get('/entries/tag/:tag', entriesByTag).as('entries_by_tag')
50
+
51
+ // ---- Aggregates (Metrics) ----
52
+ r.get('/metrics/:type', queryMetrics).as('metrics')
53
+ r.get('/metrics/:type/top', topKeys).as('metrics_top')
54
+
55
+ // ---- Stats ----
56
+ r.get('/stats', stats).as('stats')
57
+
58
+ // ---- Prune ----
59
+ r.delete('/entries', pruneEntries).as('prune_entries')
60
+ }
43
61
  }
44
62
 
45
63
  // ---------------------------------------------------------------------------
@@ -47,6 +47,13 @@ export default class DevtoolsManager {
47
47
 
48
48
  DevtoolsManager._config = {
49
49
  enabled: config.get('devtools.enabled', true) as boolean,
50
+ routes: {
51
+ aliases: {
52
+ dashboard: config.get('devtools.routes.aliases.dashboard', 'devtools.dashboard') as string,
53
+ api: config.get('devtools.routes.aliases.api', 'devtools.api') as string,
54
+ },
55
+ subdomain: config.get('devtools.routes.subdomain') as string | undefined,
56
+ },
50
57
  storage: {
51
58
  pruneAfter: config.get('devtools.storage.pruneAfter', 24) as number,
52
59
  },
package/src/types.ts CHANGED
@@ -51,6 +51,17 @@ export interface AggregateRecord {
51
51
  /** Configuration shape for the devtools package. */
52
52
  export interface DevtoolsConfig {
53
53
  enabled: boolean
54
+ routes: {
55
+ /** Route group aliases for devtools endpoints */
56
+ aliases: {
57
+ /** Dashboard frontend routes */
58
+ dashboard: string
59
+ /** API endpoints for dashboard data */
60
+ api: string
61
+ }
62
+ /** Optional subdomain for devtools routes */
63
+ subdomain?: string
64
+ }
54
65
  storage: {
55
66
  pruneAfter: number
56
67
  }