@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.
- package/CHANGELOG.md +8 -0
- package/dist/{add-channel.d.ts → add/add-channel.d.ts} +2 -2
- package/dist/{add-channel.js → add/add-channel.js} +12 -5
- package/dist/add/add-cli.d.ts +5 -0
- package/dist/add/add-cli.js +461 -0
- package/dist/{add-file-extends-core-type.d.ts → add/add-file-extends-core-type.d.ts} +2 -2
- package/dist/{add-file-extends-core-type.js → add/add-file-extends-core-type.js} +17 -5
- package/dist/{add-file-with-config.d.ts → add/add-file-with-config.d.ts} +1 -1
- package/dist/{add-file-with-config.js → add/add-file-with-config.js} +1 -1
- package/dist/{add-file-with-factory.d.ts → add/add-file-with-factory.d.ts} +1 -1
- package/dist/{add-file-with-factory.js → add/add-file-with-factory.js} +4 -4
- package/dist/add/add-functions.d.ts +6 -0
- package/dist/{add-functions.js → add/add-functions.js} +25 -5
- package/dist/{add-http-route.d.ts → add/add-http-route.d.ts} +2 -3
- package/dist/{add-http-route.js → add/add-http-route.js} +10 -4
- package/dist/add/add-mcp-prompt.d.ts +2 -0
- package/dist/{add-mcp-prompt.js → add/add-mcp-prompt.js} +10 -4
- package/dist/add/add-mcp-resource.d.ts +2 -0
- package/dist/{add-mcp-resource.js → add/add-mcp-resource.js} +10 -4
- package/dist/add/add-mcp-tool.d.ts +2 -0
- package/dist/{add-mcp-tool.js → add/add-mcp-tool.js} +10 -4
- package/dist/add/add-middleware.d.ts +5 -0
- package/dist/add/add-middleware.js +251 -0
- package/dist/add/add-permission.d.ts +6 -0
- package/dist/{add-permission.js → add/add-permission.js} +4 -3
- package/dist/add/add-queue-worker.d.ts +2 -0
- package/dist/{add-queue-worker.js → add/add-queue-worker.js} +10 -4
- package/dist/{add-rpc-invocations.d.ts → add/add-rpc-invocations.d.ts} +1 -1
- package/dist/add/add-schedule.d.ts +2 -0
- package/dist/{add-schedule.js → add/add-schedule.js} +10 -4
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/inspector.d.ts +2 -3
- package/dist/inspector.js +19 -8
- package/dist/types.d.ts +79 -0
- package/dist/{utils.d.ts → utils/extract-function-name.d.ts} +7 -15
- package/dist/{utils.js → utils/extract-function-name.js} +23 -142
- package/dist/utils/extract-services.d.ts +6 -0
- package/dist/utils/extract-services.js +29 -0
- package/dist/utils/filter-utils.d.ts +9 -0
- package/dist/utils/filter-utils.js +45 -0
- package/dist/utils/get-files-and-methods.d.ts +21 -0
- package/dist/utils/get-files-and-methods.js +60 -0
- package/dist/utils/middleware.d.ts +39 -0
- package/dist/utils/middleware.js +157 -0
- package/dist/utils/type-utils.d.ts +3 -0
- package/dist/utils/type-utils.js +50 -0
- package/dist/visit.d.ts +3 -3
- package/dist/visit.js +33 -30
- package/package.json +3 -4
- package/src/{add-channel.ts → add/add-channel.ts} +19 -19
- package/src/add/add-cli.ts +663 -0
- package/src/{add-file-extends-core-type.ts → add/add-file-extends-core-type.ts} +21 -6
- package/src/{add-file-with-config.ts → add/add-file-with-config.ts} +2 -2
- package/src/{add-file-with-factory.ts → add/add-file-with-factory.ts} +5 -5
- package/src/{add-functions.ts → add/add-functions.ts} +29 -14
- package/src/{add-http-route.ts → add/add-http-route.ts} +23 -14
- package/src/{add-mcp-prompt.ts → add/add-mcp-prompt.ts} +18 -15
- package/src/{add-mcp-resource.ts → add/add-mcp-resource.ts} +18 -15
- package/src/{add-mcp-tool.ts → add/add-mcp-tool.ts} +18 -15
- package/src/add/add-middleware.ts +326 -0
- package/src/{add-permission.ts → add/add-permission.ts} +4 -8
- package/src/{add-queue-worker.ts → add/add-queue-worker.ts} +17 -14
- package/src/{add-rpc-invocations.ts → add/add-rpc-invocations.ts} +1 -1
- package/src/{add-schedule.ts → add/add-schedule.ts} +17 -14
- package/src/index.ts +5 -0
- package/src/inspector.ts +20 -17
- package/src/types.ts +92 -0
- package/src/{utils.ts → utils/extract-function-name.ts} +25 -199
- package/src/utils/extract-services.ts +35 -0
- package/src/{utils.test.ts → utils/filter-utils.test.ts} +2 -2
- package/src/utils/filter-utils.ts +72 -0
- package/src/utils/get-files-and-methods.ts +143 -0
- package/src/utils/middleware.ts +234 -0
- package/src/utils/type-utils.ts +74 -0
- package/src/visit.ts +47 -33
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/add-functions.d.ts +0 -7
- package/dist/add-mcp-prompt.d.ts +0 -3
- package/dist/add-mcp-resource.d.ts +0 -3
- package/dist/add-mcp-tool.d.ts +0 -3
- package/dist/add-middleware.d.ts +0 -7
- package/dist/add-middleware.js +0 -35
- package/dist/add-permission.d.ts +0 -7
- package/dist/add-queue-worker.d.ts +0 -3
- package/dist/add-schedule.d.ts +0 -3
- package/src/add-middleware.ts +0 -51
- /package/dist/{add-rpc-invocations.js → add/add-rpc-invocations.js} +0 -0
- /package/dist/{does-type-extend-core-type.d.ts → utils/does-type-extend-core-type.d.ts} +0 -0
- /package/dist/{does-type-extend-core-type.js → utils/does-type-extend-core-type.js} +0 -0
- /package/dist/{get-property-value.d.ts → utils/get-property-value.d.ts} +0 -0
- /package/dist/{get-property-value.js → utils/get-property-value.js} +0 -0
- /package/src/{does-type-extend-core-type.ts → utils/does-type-extend-core-type.ts} +0 -0
- /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 {
|
|
3
|
-
import { extractFunctionName
|
|
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
|
|
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 '
|
|
2
|
+
import { getPropertyValue } from '../utils/get-property-value.js'
|
|
3
3
|
import { PikkuDocs, PikkuWiringTypes } from '@pikku/core'
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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,19 +1,18 @@
|
|
|
1
1
|
import * as ts from 'typescript'
|
|
2
|
-
import { getPropertyValue } from '
|
|
2
|
+
import { getPropertyValue } from '../utils/get-property-value.js'
|
|
3
3
|
import { PikkuDocs, PikkuWiringTypes } from '@pikku/core'
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
97
|
+
visitRoutes(logger, checker, child, state, options)
|
|
97
98
|
)
|
|
98
99
|
}
|
|
99
100
|
|
|
100
|
-
//
|
|
101
|
-
|
|
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
|
}
|