@pikku/inspector 0.12.22 → 0.12.24

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 (45) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/add/add-addon-bans.d.ts +7 -0
  3. package/dist/add/add-addon-bans.js +65 -0
  4. package/dist/add/add-auth.js +43 -0
  5. package/dist/add/add-channel.js +47 -6
  6. package/dist/add/add-cli.js +17 -0
  7. package/dist/add/add-http-route.d.ts +11 -1
  8. package/dist/add/add-http-route.js +37 -0
  9. package/dist/add/add-http-routes.d.ts +0 -3
  10. package/dist/add/add-http-routes.js +179 -36
  11. package/dist/error-codes.d.ts +3 -1
  12. package/dist/error-codes.js +3 -0
  13. package/dist/inspector.js +17 -5
  14. package/dist/types.d.ts +48 -1
  15. package/dist/utils/get-exported-variable-name.d.ts +2 -0
  16. package/dist/utils/get-exported-variable-name.js +34 -0
  17. package/dist/utils/load-addon-functions-meta.js +98 -0
  18. package/dist/utils/post-process.js +16 -3
  19. package/dist/utils/resolve-addon-package.js +3 -1
  20. package/dist/utils/resolve-ref-contract.d.ts +21 -0
  21. package/dist/utils/resolve-ref-contract.js +46 -0
  22. package/dist/utils/serialize-inspector-state.d.ts +1 -0
  23. package/dist/utils/serialize-inspector-state.js +9 -0
  24. package/dist/visit.js +24 -19
  25. package/package.json +1 -1
  26. package/src/add/add-addon-bans.ts +84 -0
  27. package/src/add/add-auth.test.ts +94 -0
  28. package/src/add/add-auth.ts +46 -0
  29. package/src/add/add-channel.ts +66 -7
  30. package/src/add/add-cli.ts +30 -0
  31. package/src/add/add-http-route.ts +75 -1
  32. package/src/add/add-http-routes.ts +283 -41
  33. package/src/add/addon-bans.test.ts +121 -0
  34. package/src/add/addon-contracts.test.ts +221 -0
  35. package/src/error-codes.ts +4 -0
  36. package/src/inspector.ts +17 -5
  37. package/src/types.ts +70 -1
  38. package/src/utils/get-exported-variable-name.ts +48 -0
  39. package/src/utils/load-addon-functions-meta.ts +164 -0
  40. package/src/utils/post-process.ts +17 -3
  41. package/src/utils/resolve-addon-package.ts +6 -1
  42. package/src/utils/resolve-ref-contract.ts +71 -0
  43. package/src/utils/serialize-inspector-state.ts +10 -0
  44. package/src/visit.ts +26 -19
  45. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,71 @@
1
+ import * as ts from 'typescript'
2
+
3
+ export interface RefContractResolution<T> {
4
+ contract: T
5
+ /**
6
+ * Optional basePath override supplied by the consumer via the second
7
+ * argument, e.g. refHTTP('ns:routes', { basePath: '/ext' }). When undefined
8
+ * the addon contract's own basePath is preserved.
9
+ */
10
+ basePath?: string
11
+ }
12
+
13
+ const getStringProperty = (
14
+ obj: ts.ObjectLiteralExpression,
15
+ name: string
16
+ ): string | undefined => {
17
+ for (const prop of obj.properties) {
18
+ if (
19
+ ts.isPropertyAssignment(prop) &&
20
+ (ts.isIdentifier(prop.name) || ts.isStringLiteral(prop.name)) &&
21
+ prop.name.text === name &&
22
+ ts.isStringLiteral(prop.initializer)
23
+ ) {
24
+ return prop.initializer.text
25
+ }
26
+ }
27
+ return undefined
28
+ }
29
+
30
+ /**
31
+ * Resolve a refHTTP / refChannel / refCLI call expression against the addon
32
+ * contracts already loaded (and namespaced) by loadAddonFunctionsMeta.
33
+ *
34
+ * The first string argument has the form 'namespace:contractName', mirroring
35
+ * how ref('namespace:fn') references an addon function. Detection is purely
36
+ * syntactic — no import resolution is required because the namespace and
37
+ * contract name are carried in the string literal. An optional second object
38
+ * argument may override mount details such as basePath.
39
+ */
40
+ export const resolveRefContract = <T>(
41
+ node: ts.Node,
42
+ helperName: 'refHTTP' | 'refChannel' | 'refCLI',
43
+ addonContracts: Record<string, Record<string, T>>
44
+ ): RefContractResolution<T> | null => {
45
+ if (!ts.isCallExpression(node)) return null
46
+ if (
47
+ !ts.isIdentifier(node.expression) ||
48
+ node.expression.text !== helperName
49
+ ) {
50
+ return null
51
+ }
52
+
53
+ const [arg, optionsArg] = node.arguments
54
+ if (!arg || !ts.isStringLiteral(arg)) return null
55
+
56
+ const separator = arg.text.indexOf(':')
57
+ if (separator === -1) return null
58
+
59
+ const namespace = arg.text.slice(0, separator)
60
+ const contractName = arg.text.slice(separator + 1)
61
+
62
+ const contract = addonContracts[namespace]?.[contractName]
63
+ if (contract === undefined) return null
64
+
65
+ let basePath: string | undefined
66
+ if (optionsArg && ts.isObjectLiteralExpression(optionsArg)) {
67
+ basePath = getStringProperty(optionsArg, 'basePath')
68
+ }
69
+
70
+ return { contract, basePath }
71
+ }
@@ -263,6 +263,7 @@ export interface SerializableInspectorState {
263
263
  openAPISpec: Record<string, any> | null
264
264
  diagnostics: InspectorDiagnostic[]
265
265
  addonFunctions: InspectorState['addonFunctions']
266
+ exportedContracts: InspectorState['exportedContracts']
266
267
  }
267
268
 
268
269
  /**
@@ -443,6 +444,7 @@ export function serializeInspectorState(
443
444
  openAPISpec: state.openAPISpec,
444
445
  diagnostics: state.diagnostics,
445
446
  addonFunctions: state.addonFunctions,
447
+ exportedContracts: state.exportedContracts,
446
448
  }
447
449
  }
448
450
 
@@ -630,6 +632,14 @@ export function deserializeInspectorState(
630
632
  openAPISpec: data.openAPISpec || null,
631
633
  diagnostics: data.diagnostics || [],
632
634
  addonFunctions: data.addonFunctions || {},
635
+ exportedContracts: data.exportedContracts || {
636
+ http: {},
637
+ cli: {},
638
+ channel: {},
639
+ addonHttp: {},
640
+ addonCli: {},
641
+ addonChannel: {},
642
+ },
633
643
  program: null,
634
644
  }
635
645
  }
package/src/visit.ts CHANGED
@@ -3,6 +3,7 @@ import { addFileWithFactory } from './add/add-file-with-factory.js'
3
3
  import { addFileExtendsCoreType } from './add/add-file-extends-core-type.js'
4
4
  import { addHTTPRoute } from './add/add-http-route.js'
5
5
  import { addHTTPRoutes } from './add/add-http-routes.js'
6
+ import { checkAddonBans } from './add/add-addon-bans.js'
6
7
  import { addSchedule } from './add/add-schedule.js'
7
8
  import { addTrigger } from './add/add-trigger.js'
8
9
  import { addQueueWorker } from './add/add-queue-worker.js'
@@ -106,27 +107,33 @@ export const visitRoutes = (
106
107
  state: InspectorState,
107
108
  options: InspectorOptions
108
109
  ) => {
109
- addFunctions(logger, node, checker, state, options)
110
- addAuth(logger, node, checker, state, options)
111
- addSecret(logger, node, checker, state, options)
112
- addCredential(logger, node, checker, state, options)
113
- addVariable(logger, node, checker, state, options)
110
+ const nextOptions = ts.isSourceFile(node)
111
+ ? { ...options, sourceFile: node }
112
+ : options
114
113
 
115
- addHTTPRoute(logger, node, checker, state, options)
116
- addHTTPRoutes(logger, node, checker, state, options)
117
- addSchedule(logger, node, checker, state, options)
118
- addTrigger(logger, node, checker, state, options)
119
- addQueueWorker(logger, node, checker, state, options)
120
- addChannel(logger, node, checker, state, options)
121
- addGateway(logger, node, checker, state, options)
122
- addCLI(logger, node, checker, state, options)
123
- addCLIRenderers(logger, node, checker, state, options)
124
- addMCPResource(logger, node, checker, state, options)
125
- addMCPPrompt(logger, node, checker, state, options)
126
- addWorkflowGraph(logger, node, checker, state, options)
127
- addAIAgent(logger, node, checker, state, options)
114
+ checkAddonBans(logger, node, checker, state, nextOptions)
115
+
116
+ addFunctions(logger, node, checker, state, nextOptions)
117
+ addAuth(logger, node, checker, state, nextOptions)
118
+ addSecret(logger, node, checker, state, nextOptions)
119
+ addCredential(logger, node, checker, state, nextOptions)
120
+ addVariable(logger, node, checker, state, nextOptions)
121
+
122
+ addHTTPRoute(logger, node, checker, state, nextOptions)
123
+ addHTTPRoutes(logger, node, checker, state, nextOptions)
124
+ addSchedule(logger, node, checker, state, nextOptions)
125
+ addTrigger(logger, node, checker, state, nextOptions)
126
+ addQueueWorker(logger, node, checker, state, nextOptions)
127
+ addChannel(logger, node, checker, state, nextOptions)
128
+ addGateway(logger, node, checker, state, nextOptions)
129
+ addCLI(logger, node, checker, state, nextOptions)
130
+ addCLIRenderers(logger, node, checker, state, nextOptions)
131
+ addMCPResource(logger, node, checker, state, nextOptions)
132
+ addMCPPrompt(logger, node, checker, state, nextOptions)
133
+ addWorkflowGraph(logger, node, checker, state, nextOptions)
134
+ addAIAgent(logger, node, checker, state, nextOptions)
128
135
 
129
136
  ts.forEachChild(node, (child) =>
130
- visitRoutes(logger, checker, child, state, options)
137
+ visitRoutes(logger, checker, child, state, nextOptions)
131
138
  )
132
139
  }