@pikku/inspector 0.9.5 → 0.9.6-next.0

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 (94) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/{add-channel.d.ts → add/add-channel.d.ts} +2 -2
  3. package/dist/{add-channel.js → add/add-channel.js} +12 -5
  4. package/dist/add/add-cli.d.ts +5 -0
  5. package/dist/add/add-cli.js +461 -0
  6. package/dist/{add-file-extends-core-type.d.ts → add/add-file-extends-core-type.d.ts} +2 -2
  7. package/dist/{add-file-extends-core-type.js → add/add-file-extends-core-type.js} +17 -5
  8. package/dist/{add-file-with-config.d.ts → add/add-file-with-config.d.ts} +1 -1
  9. package/dist/{add-file-with-config.js → add/add-file-with-config.js} +1 -1
  10. package/dist/{add-file-with-factory.d.ts → add/add-file-with-factory.d.ts} +1 -1
  11. package/dist/{add-file-with-factory.js → add/add-file-with-factory.js} +4 -4
  12. package/dist/add/add-functions.d.ts +6 -0
  13. package/dist/{add-functions.js → add/add-functions.js} +25 -5
  14. package/dist/{add-http-route.d.ts → add/add-http-route.d.ts} +2 -3
  15. package/dist/{add-http-route.js → add/add-http-route.js} +10 -4
  16. package/dist/add/add-mcp-prompt.d.ts +2 -0
  17. package/dist/{add-mcp-prompt.js → add/add-mcp-prompt.js} +10 -4
  18. package/dist/add/add-mcp-resource.d.ts +2 -0
  19. package/dist/{add-mcp-resource.js → add/add-mcp-resource.js} +10 -4
  20. package/dist/add/add-mcp-tool.d.ts +2 -0
  21. package/dist/{add-mcp-tool.js → add/add-mcp-tool.js} +10 -4
  22. package/dist/add/add-middleware.d.ts +5 -0
  23. package/dist/add/add-middleware.js +251 -0
  24. package/dist/add/add-permission.d.ts +6 -0
  25. package/dist/{add-permission.js → add/add-permission.js} +4 -3
  26. package/dist/add/add-queue-worker.d.ts +2 -0
  27. package/dist/{add-queue-worker.js → add/add-queue-worker.js} +10 -4
  28. package/dist/{add-rpc-invocations.d.ts → add/add-rpc-invocations.d.ts} +1 -1
  29. package/dist/add/add-schedule.d.ts +2 -0
  30. package/dist/{add-schedule.js → add/add-schedule.js} +10 -4
  31. package/dist/index.d.ts +2 -0
  32. package/dist/index.js +1 -0
  33. package/dist/inspector.d.ts +2 -3
  34. package/dist/inspector.js +19 -8
  35. package/dist/types.d.ts +79 -0
  36. package/dist/{utils.d.ts → utils/extract-function-name.d.ts} +7 -15
  37. package/dist/{utils.js → utils/extract-function-name.js} +23 -142
  38. package/dist/utils/extract-services.d.ts +6 -0
  39. package/dist/utils/extract-services.js +29 -0
  40. package/dist/utils/filter-utils.d.ts +9 -0
  41. package/dist/utils/filter-utils.js +45 -0
  42. package/dist/utils/get-files-and-methods.d.ts +21 -0
  43. package/dist/utils/get-files-and-methods.js +60 -0
  44. package/dist/utils/middleware.d.ts +39 -0
  45. package/dist/utils/middleware.js +157 -0
  46. package/dist/utils/type-utils.d.ts +3 -0
  47. package/dist/utils/type-utils.js +50 -0
  48. package/dist/visit.d.ts +3 -3
  49. package/dist/visit.js +33 -30
  50. package/package.json +3 -4
  51. package/src/{add-channel.ts → add/add-channel.ts} +19 -19
  52. package/src/add/add-cli.ts +663 -0
  53. package/src/{add-file-extends-core-type.ts → add/add-file-extends-core-type.ts} +21 -6
  54. package/src/{add-file-with-config.ts → add/add-file-with-config.ts} +2 -2
  55. package/src/{add-file-with-factory.ts → add/add-file-with-factory.ts} +5 -5
  56. package/src/{add-functions.ts → add/add-functions.ts} +29 -14
  57. package/src/{add-http-route.ts → add/add-http-route.ts} +23 -14
  58. package/src/{add-mcp-prompt.ts → add/add-mcp-prompt.ts} +18 -15
  59. package/src/{add-mcp-resource.ts → add/add-mcp-resource.ts} +18 -15
  60. package/src/{add-mcp-tool.ts → add/add-mcp-tool.ts} +18 -15
  61. package/src/add/add-middleware.ts +326 -0
  62. package/src/{add-permission.ts → add/add-permission.ts} +4 -8
  63. package/src/{add-queue-worker.ts → add/add-queue-worker.ts} +17 -14
  64. package/src/{add-rpc-invocations.ts → add/add-rpc-invocations.ts} +1 -1
  65. package/src/{add-schedule.ts → add/add-schedule.ts} +17 -14
  66. package/src/index.ts +5 -0
  67. package/src/inspector.ts +20 -17
  68. package/src/types.ts +92 -0
  69. package/src/{utils.ts → utils/extract-function-name.ts} +25 -199
  70. package/src/utils/extract-services.ts +35 -0
  71. package/src/{utils.test.ts → utils/filter-utils.test.ts} +2 -2
  72. package/src/utils/filter-utils.ts +72 -0
  73. package/src/utils/get-files-and-methods.ts +143 -0
  74. package/src/utils/middleware.ts +234 -0
  75. package/src/utils/type-utils.ts +74 -0
  76. package/src/visit.ts +47 -33
  77. package/tsconfig.tsbuildinfo +1 -1
  78. package/dist/add-functions.d.ts +0 -7
  79. package/dist/add-mcp-prompt.d.ts +0 -3
  80. package/dist/add-mcp-resource.d.ts +0 -3
  81. package/dist/add-mcp-tool.d.ts +0 -3
  82. package/dist/add-middleware.d.ts +0 -7
  83. package/dist/add-middleware.js +0 -35
  84. package/dist/add-permission.d.ts +0 -7
  85. package/dist/add-queue-worker.d.ts +0 -3
  86. package/dist/add-schedule.d.ts +0 -3
  87. package/src/add-middleware.ts +0 -51
  88. /package/dist/{add-rpc-invocations.js → add/add-rpc-invocations.js} +0 -0
  89. /package/dist/{does-type-extend-core-type.d.ts → utils/does-type-extend-core-type.d.ts} +0 -0
  90. /package/dist/{does-type-extend-core-type.js → utils/does-type-extend-core-type.js} +0 -0
  91. /package/dist/{get-property-value.d.ts → utils/get-property-value.d.ts} +0 -0
  92. /package/dist/{get-property-value.js → utils/get-property-value.js} +0 -0
  93. /package/src/{does-type-extend-core-type.ts → utils/does-type-extend-core-type.ts} +0 -0
  94. /package/src/{get-property-value.ts → utils/get-property-value.ts} +0 -0
@@ -0,0 +1,326 @@
1
+ import * as ts from 'typescript'
2
+ import { AddWiring } from '../types.js'
3
+ import {
4
+ extractFunctionName,
5
+ isNamedExport,
6
+ } from '../utils/extract-function-name.js'
7
+ import { extractServicesFromFunction } from '../utils/extract-services.js'
8
+ import { extractMiddlewarePikkuNames } from '../utils/middleware.js'
9
+
10
+ /**
11
+ * Inspect pikkuMiddleware calls, addMiddleware calls, and addHTTPMiddleware calls
12
+ */
13
+ export const addMiddleware: AddWiring = (logger, node, checker, state) => {
14
+ if (!ts.isCallExpression(node)) return
15
+
16
+ const { expression, arguments: args } = node
17
+
18
+ // only handle specific function calls
19
+ if (!ts.isIdentifier(expression)) {
20
+ return
21
+ }
22
+
23
+ // Handle pikkuMiddleware(...) - individual middleware function definition
24
+ if (expression.text === 'pikkuMiddleware') {
25
+ const handlerNode = args[0]
26
+ if (!handlerNode) return
27
+
28
+ if (
29
+ !ts.isArrowFunction(handlerNode) &&
30
+ !ts.isFunctionExpression(handlerNode)
31
+ ) {
32
+ logger.error(`• Handler for pikkuMiddleware is not a function.`)
33
+ return
34
+ }
35
+
36
+ const services = extractServicesFromFunction(handlerNode)
37
+ const { pikkuFuncName, exportedName } = extractFunctionName(node, checker)
38
+ state.middleware.meta[pikkuFuncName] = {
39
+ services,
40
+ sourceFile: node.getSourceFile().fileName,
41
+ position: node.getStart(),
42
+ exportedName,
43
+ }
44
+
45
+ logger.debug(
46
+ `• Found middleware with services: ${services.services.join(', ')}`
47
+ )
48
+ return
49
+ }
50
+
51
+ // Handle pikkuMiddlewareFactory(...) - middleware factory function
52
+ if (expression.text === 'pikkuMiddlewareFactory') {
53
+ const factoryNode = args[0]
54
+ if (!factoryNode) return
55
+
56
+ if (
57
+ !ts.isArrowFunction(factoryNode) &&
58
+ !ts.isFunctionExpression(factoryNode)
59
+ ) {
60
+ logger.error(`• Handler for pikkuMiddlewareFactory is not a function.`)
61
+ return
62
+ }
63
+
64
+ // Extract services by looking inside the factory function body
65
+ // The factory should return pikkuMiddleware(...), so we need to find that call
66
+ let services = { optimized: false, services: [] as string[] }
67
+
68
+ const findPikkuMiddlewareCall = (
69
+ node: ts.Node
70
+ ): ts.CallExpression | undefined => {
71
+ if (ts.isCallExpression(node)) {
72
+ const expr = node.expression
73
+ if (ts.isIdentifier(expr) && expr.text === 'pikkuMiddleware') {
74
+ return node
75
+ }
76
+ }
77
+ return ts.forEachChild(node, findPikkuMiddlewareCall)
78
+ }
79
+
80
+ const pikkuMiddlewareCall = findPikkuMiddlewareCall(factoryNode)
81
+ if (pikkuMiddlewareCall && pikkuMiddlewareCall.arguments[0]) {
82
+ const middlewareHandler = pikkuMiddlewareCall.arguments[0]
83
+ if (
84
+ ts.isArrowFunction(middlewareHandler) ||
85
+ ts.isFunctionExpression(middlewareHandler)
86
+ ) {
87
+ services = extractServicesFromFunction(middlewareHandler)
88
+ }
89
+ }
90
+
91
+ const { pikkuFuncName, exportedName } = extractFunctionName(node, checker)
92
+ state.middleware.meta[pikkuFuncName] = {
93
+ services,
94
+ sourceFile: node.getSourceFile().fileName,
95
+ position: node.getStart(),
96
+ exportedName,
97
+ factory: true,
98
+ }
99
+
100
+ logger.debug(
101
+ `• Found middleware factory with services: ${services.services.join(', ')}`
102
+ )
103
+ return
104
+ }
105
+
106
+ // Handle addMiddleware('tag', [middleware1, middleware2])
107
+ // Supports two patterns:
108
+ // 1. export const x = () => addMiddleware('tag', [...]) (factory - tree-shakeable)
109
+ // 2. export const x = addMiddleware('tag', [...]) (direct - no tree-shaking)
110
+ if (expression.text === 'addMiddleware') {
111
+ const tagArg = args[0]
112
+ const middlewareArrayArg = args[1]
113
+
114
+ if (!tagArg || !middlewareArrayArg) return
115
+
116
+ // Extract tag name
117
+ let tag: string | undefined
118
+ if (ts.isStringLiteral(tagArg)) {
119
+ tag = tagArg.text
120
+ }
121
+
122
+ if (!tag) {
123
+ logger.warn(`• addMiddleware call without valid tag string`)
124
+ return
125
+ }
126
+
127
+ // Check if middleware array is a literal array
128
+ if (!ts.isArrayLiteralExpression(middlewareArrayArg)) {
129
+ logger.error(
130
+ `• addMiddleware('${tag}', ...) must have a literal array as second argument`
131
+ )
132
+ return
133
+ }
134
+
135
+ // Extract middleware pikkuFuncNames from array
136
+ const middlewareNames = extractMiddlewarePikkuNames(
137
+ middlewareArrayArg,
138
+ checker
139
+ )
140
+
141
+ if (middlewareNames.length === 0) {
142
+ logger.warn(`• addMiddleware('${tag}', ...) has empty middleware array`)
143
+ return
144
+ }
145
+
146
+ // Collect services from all middleware in the group
147
+ const allServices = new Set<string>()
148
+ for (const middlewareName of middlewareNames) {
149
+ const middlewareMeta = state.middleware.meta[middlewareName]
150
+ if (middlewareMeta && middlewareMeta.services) {
151
+ for (const service of middlewareMeta.services.services) {
152
+ allServices.add(service)
153
+ }
154
+ }
155
+ }
156
+
157
+ // Check if this call is wrapped in a factory function
158
+ // We need to walk up the tree to see if the parent is: const x = () => addMiddleware(...)
159
+ let isFactory = false
160
+ let exportedName: string | null = null
161
+ let parent = node.parent
162
+
163
+ // Check if parent is arrow function: () => addMiddleware(...)
164
+ if (parent && ts.isArrowFunction(parent)) {
165
+ // Check if arrow function has no parameters
166
+ if (parent.parameters.length === 0) {
167
+ isFactory = true
168
+
169
+ // For factories, we need to check the arrow function's parent for the export name
170
+ // const apiTagMiddleware = () => addMiddleware(...)
171
+ const arrowParent = parent.parent
172
+ if (arrowParent && ts.isVariableDeclaration(arrowParent)) {
173
+ if (ts.isIdentifier(arrowParent.name)) {
174
+ // Check if it's exported
175
+ if (isNamedExport(arrowParent)) {
176
+ exportedName = arrowParent.name.text
177
+ }
178
+ }
179
+ }
180
+ }
181
+ }
182
+
183
+ // If not a factory, get export name from the call expression itself
184
+ if (!isFactory) {
185
+ const extracted = extractFunctionName(node, checker)
186
+ exportedName = extracted.exportedName
187
+ }
188
+
189
+ // Log warning if not using factory pattern
190
+ if (!isFactory && exportedName) {
191
+ logger.warn(
192
+ `• Middleware group '${exportedName}' for tag '${tag}' is not wrapped in a factory function. ` +
193
+ `For tree-shaking, use: export const ${exportedName} = () => addMiddleware('${tag}', [...])`
194
+ )
195
+ }
196
+
197
+ // Store group metadata
198
+ state.middleware.tagMiddleware.set(tag, {
199
+ exportName: exportedName,
200
+ sourceFile: node.getSourceFile().fileName,
201
+ position: node.getStart(),
202
+ services: {
203
+ optimized: false,
204
+ services: Array.from(allServices),
205
+ },
206
+ middlewareCount: middlewareNames.length,
207
+ isFactory,
208
+ })
209
+
210
+ logger.debug(
211
+ `• Found tag middleware group: ${tag} -> [${middlewareNames.join(', ')}] (${isFactory ? 'factory' : 'direct'})`
212
+ )
213
+ return
214
+ }
215
+
216
+ // Handle addHTTPMiddleware(pattern, [middleware1, middleware2])
217
+ // Supports two patterns:
218
+ // 1. export const x = () => addHTTPMiddleware('*', [...]) (factory - tree-shakeable)
219
+ // 2. export const x = addHTTPMiddleware('*', [...]) (direct - no tree-shaking)
220
+ if (expression.text === 'addHTTPMiddleware') {
221
+ const patternArg = args[0]
222
+ const middlewareArrayArg = args[1]
223
+
224
+ if (!patternArg || !middlewareArrayArg) return
225
+
226
+ // Extract route pattern
227
+ let pattern: string | undefined
228
+ if (ts.isStringLiteral(patternArg)) {
229
+ pattern = patternArg.text
230
+ }
231
+
232
+ if (!pattern) {
233
+ logger.warn(`• addHTTPMiddleware call without valid pattern string`)
234
+ return
235
+ }
236
+
237
+ // Check if middleware array is a literal array
238
+ if (!ts.isArrayLiteralExpression(middlewareArrayArg)) {
239
+ logger.error(
240
+ `• addHTTPMiddleware('${pattern}', ...) must have a literal array as second argument`
241
+ )
242
+ return
243
+ }
244
+
245
+ // Extract middleware pikkuFuncNames from array
246
+ const middlewareNames = extractMiddlewarePikkuNames(
247
+ middlewareArrayArg,
248
+ checker
249
+ )
250
+
251
+ if (middlewareNames.length === 0) {
252
+ logger.warn(
253
+ `• addHTTPMiddleware('${pattern}', ...) has empty middleware array`
254
+ )
255
+ return
256
+ }
257
+
258
+ // Collect services from all middleware in the group
259
+ const allServices = new Set<string>()
260
+ for (const middlewareName of middlewareNames) {
261
+ const middlewareMeta = state.middleware.meta[middlewareName]
262
+ if (middlewareMeta && middlewareMeta.services) {
263
+ for (const service of middlewareMeta.services.services) {
264
+ allServices.add(service)
265
+ }
266
+ }
267
+ }
268
+
269
+ // Check if this call is wrapped in a factory function
270
+ let isFactory = false
271
+ let exportedName: string | null = null
272
+ let parent = node.parent
273
+
274
+ // Check if parent is arrow function: () => addHTTPMiddleware(...)
275
+ if (parent && ts.isArrowFunction(parent)) {
276
+ // Check if arrow function has no parameters
277
+ if (parent.parameters.length === 0) {
278
+ isFactory = true
279
+
280
+ // For factories, we need to check the arrow function's parent for the export name
281
+ // const apiRouteMiddleware = () => addHTTPMiddleware(...)
282
+ const arrowParent = parent.parent
283
+ if (arrowParent && ts.isVariableDeclaration(arrowParent)) {
284
+ if (ts.isIdentifier(arrowParent.name)) {
285
+ // Check if it's exported
286
+ if (isNamedExport(arrowParent)) {
287
+ exportedName = arrowParent.name.text
288
+ }
289
+ }
290
+ }
291
+ }
292
+ }
293
+
294
+ // If not a factory, get export name from the call expression itself
295
+ if (!isFactory) {
296
+ const extracted = extractFunctionName(node, checker)
297
+ exportedName = extracted.exportedName
298
+ }
299
+
300
+ // Log warning if not using factory pattern
301
+ if (!isFactory && exportedName) {
302
+ logger.warn(
303
+ `• HTTP middleware group '${exportedName}' for pattern '${pattern}' is not wrapped in a factory function. ` +
304
+ `For tree-shaking, use: export const ${exportedName} = () => addHTTPMiddleware('${pattern}', [...])`
305
+ )
306
+ }
307
+
308
+ // Store group metadata
309
+ state.http.routeMiddleware.set(pattern, {
310
+ exportName: exportedName,
311
+ sourceFile: node.getSourceFile().fileName,
312
+ position: node.getStart(),
313
+ services: {
314
+ optimized: false,
315
+ services: Array.from(allServices),
316
+ },
317
+ middlewareCount: middlewareNames.length,
318
+ isFactory,
319
+ })
320
+
321
+ logger.debug(
322
+ `• Found HTTP route middleware group: ${pattern} -> [${middlewareNames.join(', ')}] (${isFactory ? 'factory' : 'direct'})`
323
+ )
324
+ return
325
+ }
326
+ }
@@ -1,17 +1,13 @@
1
1
  import * as ts from 'typescript'
2
- import { InspectorLogger, InspectorState } from './types.js'
3
- import { extractFunctionName, extractServicesFromFunction } from './utils.js'
2
+ import { AddWiring } from '../types.js'
3
+ import { extractFunctionName } from '../utils/extract-function-name.js'
4
+ import { extractServicesFromFunction } from '../utils/extract-services.js'
4
5
 
5
6
  /**
6
7
  * Inspect pikkuPermission calls and extract first-arg destructuring
7
8
  * for tree shaking optimization.
8
9
  */
9
- export function addPermission(
10
- node: ts.Node,
11
- checker: ts.TypeChecker,
12
- state: InspectorState,
13
- logger: InspectorLogger
14
- ) {
10
+ export const addPermission: AddWiring = (logger, node, checker, state) => {
15
11
  if (!ts.isCallExpression(node)) return
16
12
 
17
13
  const { expression, arguments: args } = node
@@ -1,19 +1,18 @@
1
1
  import * as ts from 'typescript'
2
- import { getPropertyValue } from './get-property-value.js'
2
+ import { getPropertyValue } from '../utils/get-property-value.js'
3
3
  import { PikkuDocs, PikkuWiringTypes } from '@pikku/core'
4
- import { InspectorFilters, InspectorState, InspectorLogger } from './types.js'
5
- import {
6
- extractFunctionName,
7
- getPropertyAssignmentInitializer,
8
- matchesFilters,
9
- } from './utils.js'
4
+ import { AddWiring } from '../types.js'
5
+ import { extractFunctionName } from '../utils/extract-function-name.js'
6
+ import { getPropertyAssignmentInitializer } from '../utils/type-utils.js'
7
+ import { matchesFilters } from '../utils/filter-utils.js'
8
+ import { resolveMiddleware } from '../utils/middleware.js'
10
9
 
11
- export const addQueueWorker = (
12
- node: ts.Node,
13
- checker: ts.TypeChecker,
14
- state: InspectorState,
15
- filters: InspectorFilters,
16
- logger: InspectorLogger
10
+ export const addQueueWorker: AddWiring = (
11
+ logger,
12
+ node,
13
+ checker,
14
+ state,
15
+ options
17
16
  ) => {
18
17
  if (!ts.isCallExpression(node)) {
19
18
  return
@@ -69,7 +68,7 @@ export const addQueueWorker = (
69
68
 
70
69
  if (
71
70
  !matchesFilters(
72
- filters,
71
+ options.filters || {},
73
72
  { tags },
74
73
  { type: PikkuWiringTypes.queue, name: queueName, filePath },
75
74
  logger
@@ -81,12 +80,16 @@ export const addQueueWorker = (
81
80
  return
82
81
  }
83
82
 
83
+ // --- resolve middleware ---
84
+ const middleware = resolveMiddleware(state, obj, tags, checker)
85
+
84
86
  state.queueWorkers.files.add(node.getSourceFile().fileName)
85
87
  state.queueWorkers.meta[queueName] = {
86
88
  pikkuFuncName,
87
89
  queueName,
88
90
  docs,
89
91
  tags,
92
+ middleware,
90
93
  }
91
94
  }
92
95
  }
@@ -1,5 +1,5 @@
1
1
  import * as ts from 'typescript'
2
- import { InspectorState, InspectorLogger } from './types.js'
2
+ import { InspectorState, InspectorLogger } from '../types.js'
3
3
 
4
4
  /**
5
5
  * Scan for rpc.invoke() calls to track which functions are actually being invoked
@@ -1,19 +1,18 @@
1
1
  import * as ts from 'typescript'
2
- import { getPropertyValue } from './get-property-value.js'
2
+ import { getPropertyValue } from '../utils/get-property-value.js'
3
3
  import { PikkuDocs, PikkuWiringTypes } from '@pikku/core'
4
- import { InspectorFilters, InspectorState, InspectorLogger } from './types.js'
5
- import {
6
- extractFunctionName,
7
- getPropertyAssignmentInitializer,
8
- matchesFilters,
9
- } from './utils.js'
4
+ import { AddWiring } from '../types.js'
5
+ import { extractFunctionName } from '../utils/extract-function-name.js'
6
+ import { getPropertyAssignmentInitializer } from '../utils/type-utils.js'
7
+ import { matchesFilters } from '../utils/filter-utils.js'
8
+ import { resolveMiddleware } from '../utils/middleware.js'
10
9
 
11
- export const addSchedule = (
12
- node: ts.Node,
13
- checker: ts.TypeChecker,
14
- state: InspectorState,
15
- filters: InspectorFilters,
16
- logger: InspectorLogger
10
+ export const addSchedule: AddWiring = (
11
+ logger,
12
+ node,
13
+ checker,
14
+ state,
15
+ options
17
16
  ) => {
18
17
  if (!ts.isCallExpression(node)) {
19
18
  return
@@ -66,7 +65,7 @@ export const addSchedule = (
66
65
 
67
66
  if (
68
67
  !matchesFilters(
69
- filters,
68
+ options.filters || {},
70
69
  { tags },
71
70
  { type: PikkuWiringTypes.scheduler, name: nameValue, filePath },
72
71
  logger
@@ -75,6 +74,9 @@ export const addSchedule = (
75
74
  return
76
75
  }
77
76
 
77
+ // --- resolve middleware ---
78
+ const middleware = resolveMiddleware(state, obj, tags, checker)
79
+
78
80
  state.scheduledTasks.files.add(node.getSourceFile().fileName)
79
81
  state.scheduledTasks.meta[nameValue] = {
80
82
  pikkuFuncName,
@@ -82,6 +84,7 @@ export const addSchedule = (
82
84
  schedule: scheduleValue,
83
85
  docs,
84
86
  tags,
87
+ middleware,
85
88
  }
86
89
  }
87
90
  }
package/src/index.ts CHANGED
@@ -1,4 +1,9 @@
1
1
  export { inspect } from './inspector.js'
2
+ export { getFilesAndMethods } from './utils/get-files-and-methods.js'
2
3
  export type { TypesMap } from './types-map.js'
3
4
  export type * from './types.js'
4
5
  export type { InspectorState } from './types.js'
6
+ export type {
7
+ FilesAndMethods,
8
+ FilesAndMethodsErrors,
9
+ } from './utils/get-files-and-methods.js'
package/src/inspector.ts CHANGED
@@ -1,23 +1,13 @@
1
1
  import * as ts from 'typescript'
2
2
  import { visitSetup, visitRoutes } from './visit.js'
3
3
  import { TypesMap } from './types-map.js'
4
- import {
5
- InspectorState,
6
- InspectorHTTPState,
7
- InspectorFilters,
8
- InspectorLogger,
9
- } from './types.js'
10
-
11
- export const normalizeHTTPTypes = (
12
- httpState: InspectorHTTPState
13
- ): InspectorHTTPState => {
14
- return httpState
15
- }
4
+ import { InspectorState, InspectorLogger, InspectorOptions } from './types.js'
5
+ import { getFilesAndMethods } from './utils/get-files-and-methods.js'
16
6
 
17
7
  export const inspect = (
18
8
  logger: InspectorLogger,
19
9
  routeFiles: string[],
20
- filters: InspectorFilters
10
+ options: InspectorOptions = {}
21
11
  ): InspectorState => {
22
12
  const program = ts.createProgram(routeFiles, {
23
13
  target: ts.ScriptTarget.ESNext,
@@ -30,12 +20,17 @@ export const inspect = (
30
20
  singletonServicesTypeImportMap: new Map(),
31
21
  sessionServicesTypeImportMap: new Map(),
32
22
  userSessionTypeImportMap: new Map(),
23
+ configTypeImportMap: new Map(),
33
24
  singletonServicesFactories: new Map(),
34
25
  sessionServicesFactories: new Map(),
35
26
  configFactories: new Map(),
27
+ filesAndMethods: {},
28
+ filesAndMethodsErrors: new Map(),
29
+ typesLookup: new Map(),
36
30
  functions: {
37
31
  typesMap: new TypesMap(),
38
32
  meta: {},
33
+ files: new Map(),
39
34
  },
40
35
  http: {
41
36
  metaInputTypes: new Map(),
@@ -49,6 +44,7 @@ export const inspect = (
49
44
  options: {},
50
45
  },
51
46
  files: new Set(),
47
+ routeMiddleware: new Map(),
52
48
  },
53
49
  channels: {
54
50
  files: new Set(),
@@ -75,8 +71,13 @@ export const inspect = (
75
71
  promptsMeta: {},
76
72
  files: new Set(),
77
73
  },
74
+ cli: {
75
+ meta: {},
76
+ files: new Set(),
77
+ },
78
78
  middleware: {
79
79
  meta: {},
80
+ tagMiddleware: new Map(),
80
81
  },
81
82
  permissions: {
82
83
  meta: {},
@@ -86,19 +87,21 @@ export const inspect = (
86
87
  // First sweep: add all functions
87
88
  for (const sourceFile of sourceFiles) {
88
89
  ts.forEachChild(sourceFile, (child) =>
89
- visitSetup(checker, child, state, filters, logger)
90
+ visitSetup(logger, checker, child, state, options)
90
91
  )
91
92
  }
92
93
 
93
94
  // Second sweep: add all transports
94
95
  for (const sourceFile of sourceFiles) {
95
96
  ts.forEachChild(sourceFile, (child) =>
96
- visitRoutes(checker, child, state, filters, logger)
97
+ visitRoutes(logger, checker, child, state, options)
97
98
  )
98
99
  }
99
100
 
100
- // Normalise the typesMap
101
- state.http = normalizeHTTPTypes(state.http)
101
+ // Populate filesAndMethods
102
+ const { result, errors } = getFilesAndMethods(state, options.types)
103
+ state.filesAndMethods = result
104
+ state.filesAndMethodsErrors = errors
102
105
 
103
106
  return state
104
107
  }