@pikku/inspector 0.11.1 → 0.12.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 (189) hide show
  1. package/CHANGELOG.md +26 -1
  2. package/OPTIMIZATION-PLAN.md +195 -0
  3. package/dist/add/add-ai-agent.d.ts +2 -0
  4. package/dist/add/add-ai-agent.js +314 -0
  5. package/dist/add/add-channel.js +69 -61
  6. package/dist/add/add-cli.js +36 -18
  7. package/dist/add/add-file-with-factory.js +2 -0
  8. package/dist/add/add-functions.js +327 -59
  9. package/dist/add/add-http-route.d.ts +19 -10
  10. package/dist/add/add-http-route.js +153 -44
  11. package/dist/add/add-http-routes.d.ts +5 -0
  12. package/dist/add/add-http-routes.js +159 -0
  13. package/dist/add/add-keyed-wiring.d.ts +12 -0
  14. package/dist/add/add-keyed-wiring.js +97 -0
  15. package/dist/add/add-mcp-prompt.js +14 -9
  16. package/dist/add/add-mcp-resource.js +14 -9
  17. package/dist/add/add-middleware.d.ts +1 -4
  18. package/dist/add/add-middleware.js +364 -79
  19. package/dist/add/add-permission.d.ts +1 -1
  20. package/dist/add/add-permission.js +152 -40
  21. package/dist/add/add-queue-worker.js +18 -12
  22. package/dist/add/add-rpc-invocations.d.ts +3 -0
  23. package/dist/add/add-rpc-invocations.js +65 -25
  24. package/dist/add/add-schedule.js +11 -5
  25. package/dist/add/add-secret.d.ts +3 -0
  26. package/dist/add/add-secret.js +82 -0
  27. package/dist/add/add-trigger.d.ts +2 -0
  28. package/dist/add/add-trigger.js +87 -0
  29. package/dist/add/add-variable.d.ts +1 -0
  30. package/dist/add/add-variable.js +8 -0
  31. package/dist/add/add-workflow-graph.d.ts +7 -0
  32. package/dist/add/add-workflow-graph.js +396 -0
  33. package/dist/add/add-workflow.js +124 -26
  34. package/dist/error-codes.d.ts +16 -1
  35. package/dist/error-codes.js +21 -1
  36. package/dist/index.d.ts +9 -5
  37. package/dist/index.js +5 -2
  38. package/dist/inspector.d.ts +1 -1
  39. package/dist/inspector.js +106 -13
  40. package/dist/schema-generator.d.ts +1 -0
  41. package/dist/schema-generator.js +1 -0
  42. package/dist/types-map.js +10 -1
  43. package/dist/types.d.ts +180 -30
  44. package/dist/utils/compute-required-schemas.d.ts +4 -0
  45. package/dist/utils/compute-required-schemas.js +41 -0
  46. package/dist/utils/contract-hashes.d.ts +35 -0
  47. package/dist/utils/contract-hashes.js +202 -0
  48. package/dist/utils/custom-types-generator.d.ts +9 -0
  49. package/dist/utils/custom-types-generator.js +71 -0
  50. package/dist/utils/detect-schema-vendor.d.ts +22 -0
  51. package/dist/utils/detect-schema-vendor.js +76 -0
  52. package/dist/utils/ensure-function-metadata.d.ts +5 -2
  53. package/dist/utils/ensure-function-metadata.js +220 -6
  54. package/dist/utils/extract-function-name.d.ts +5 -16
  55. package/dist/utils/extract-function-name.js +93 -298
  56. package/dist/utils/extract-services.d.ts +2 -1
  57. package/dist/utils/extract-services.js +25 -1
  58. package/dist/utils/filter-inspector-state.js +107 -23
  59. package/dist/utils/get-property-value.d.ts +8 -2
  60. package/dist/utils/get-property-value.js +33 -4
  61. package/dist/utils/hash.d.ts +2 -0
  62. package/dist/utils/hash.js +23 -0
  63. package/dist/utils/middleware.d.ts +7 -30
  64. package/dist/utils/middleware.js +80 -66
  65. package/dist/utils/permissions.d.ts +2 -2
  66. package/dist/utils/permissions.js +10 -10
  67. package/dist/utils/post-process.d.ts +9 -10
  68. package/dist/utils/post-process.js +231 -24
  69. package/dist/utils/resolve-external-package.d.ts +12 -0
  70. package/dist/utils/resolve-external-package.js +34 -0
  71. package/dist/utils/resolve-function-types.d.ts +6 -0
  72. package/dist/utils/resolve-function-types.js +29 -0
  73. package/dist/utils/resolve-identifier.d.ts +10 -0
  74. package/dist/utils/resolve-identifier.js +36 -0
  75. package/dist/utils/resolve-versions.d.ts +2 -0
  76. package/dist/utils/resolve-versions.js +78 -0
  77. package/dist/utils/schema-generator.d.ts +9 -0
  78. package/dist/utils/schema-generator.js +209 -0
  79. package/dist/utils/serialize-inspector-state.d.ts +73 -13
  80. package/dist/utils/serialize-inspector-state.js +102 -6
  81. package/dist/utils/serialize-mcp-json.d.ts +2 -0
  82. package/dist/utils/serialize-mcp-json.js +99 -0
  83. package/dist/utils/serialize-middleware-groups-meta.d.ts +12 -0
  84. package/dist/utils/serialize-middleware-groups-meta.js +28 -0
  85. package/dist/utils/serialize-openapi-json.d.ts +85 -0
  86. package/dist/utils/serialize-openapi-json.js +151 -0
  87. package/dist/utils/serialize-permissions-groups-meta.d.ts +6 -0
  88. package/dist/utils/serialize-permissions-groups-meta.js +31 -0
  89. package/dist/utils/workflow/dsl/deserialize-dsl-workflow.d.ts +24 -0
  90. package/dist/utils/workflow/dsl/deserialize-dsl-workflow.js +830 -0
  91. package/dist/{workflow/extract-simple-workflow.d.ts → utils/workflow/dsl/extract-dsl-workflow.d.ts} +4 -2
  92. package/dist/{workflow/extract-simple-workflow.js → utils/workflow/dsl/extract-dsl-workflow.js} +572 -72
  93. package/dist/utils/workflow/dsl/index.d.ts +7 -0
  94. package/dist/utils/workflow/dsl/index.js +7 -0
  95. package/dist/{workflow → utils/workflow/dsl}/patterns.d.ts +21 -0
  96. package/dist/{workflow → utils/workflow/dsl}/patterns.js +90 -10
  97. package/dist/{workflow → utils/workflow/dsl}/validation.d.ts +2 -0
  98. package/dist/{workflow → utils/workflow/dsl}/validation.js +25 -7
  99. package/dist/utils/workflow/graph/convert-dsl-to-graph.d.ts +13 -0
  100. package/dist/utils/workflow/graph/convert-dsl-to-graph.js +318 -0
  101. package/dist/utils/workflow/graph/finalize-workflow-wires.d.ts +3 -0
  102. package/dist/utils/workflow/graph/finalize-workflow-wires.js +276 -0
  103. package/dist/utils/workflow/graph/finalize-workflows.d.ts +2 -0
  104. package/dist/utils/workflow/graph/finalize-workflows.js +75 -0
  105. package/dist/utils/workflow/graph/index.d.ts +8 -0
  106. package/dist/utils/workflow/graph/index.js +8 -0
  107. package/dist/utils/workflow/graph/serialize-workflow-graph.d.ts +35 -0
  108. package/dist/utils/workflow/graph/serialize-workflow-graph.js +150 -0
  109. package/dist/utils/workflow/graph/workflow-graph.types.d.ts +203 -0
  110. package/dist/utils/workflow/graph/workflow-graph.types.js +38 -0
  111. package/dist/visit.js +13 -2
  112. package/package.json +26 -4
  113. package/src/add/add-ai-agent.ts +468 -0
  114. package/src/add/add-channel.ts +82 -79
  115. package/src/add/add-cli.ts +49 -20
  116. package/src/add/add-file-with-factory.ts +2 -0
  117. package/src/add/add-functions.ts +429 -71
  118. package/src/add/add-http-route.ts +246 -65
  119. package/src/add/add-http-routes.ts +228 -0
  120. package/src/add/add-keyed-wiring.ts +151 -0
  121. package/src/add/add-mcp-prompt.ts +26 -15
  122. package/src/add/add-mcp-resource.ts +27 -15
  123. package/src/add/add-middleware.ts +482 -80
  124. package/src/add/add-permission.ts +199 -40
  125. package/src/add/add-queue-worker.ts +24 -19
  126. package/src/add/add-rpc-invocations.ts +78 -31
  127. package/src/add/add-schedule.ts +16 -11
  128. package/src/add/add-secret.ts +140 -0
  129. package/src/add/add-trigger.ts +154 -0
  130. package/src/add/add-variable.ts +9 -0
  131. package/src/add/add-workflow-graph.ts +522 -0
  132. package/src/add/add-workflow.ts +117 -30
  133. package/src/error-codes.ts +26 -1
  134. package/src/index.ts +27 -8
  135. package/src/inspector.ts +145 -17
  136. package/src/schema-generator.ts +1 -0
  137. package/src/types-map.ts +12 -1
  138. package/src/types.ts +192 -51
  139. package/src/utils/compute-required-schemas.ts +49 -0
  140. package/src/utils/contract-hashes.test.ts +528 -0
  141. package/src/utils/contract-hashes.ts +290 -0
  142. package/src/utils/custom-types-generator.ts +88 -0
  143. package/src/utils/detect-schema-vendor.ts +90 -0
  144. package/src/utils/ensure-function-metadata.ts +324 -7
  145. package/src/utils/extract-function-name.ts +108 -358
  146. package/src/utils/extract-services.ts +35 -2
  147. package/src/utils/filter-inspector-state.test.ts +34 -20
  148. package/src/utils/filter-inspector-state.ts +140 -31
  149. package/src/utils/get-property-value.ts +50 -5
  150. package/src/utils/hash.ts +26 -0
  151. package/src/utils/middleware.test.ts +204 -0
  152. package/src/utils/middleware.ts +129 -67
  153. package/src/utils/permissions.test.ts +35 -12
  154. package/src/utils/permissions.ts +10 -10
  155. package/src/utils/post-process.ts +283 -43
  156. package/src/utils/resolve-external-package.ts +42 -0
  157. package/src/utils/resolve-function-types.ts +42 -0
  158. package/src/utils/resolve-identifier.ts +46 -0
  159. package/src/utils/resolve-versions.test.ts +249 -0
  160. package/src/utils/resolve-versions.ts +105 -0
  161. package/src/utils/schema-generator.ts +329 -0
  162. package/src/utils/serialize-inspector-state.ts +181 -20
  163. package/src/utils/serialize-mcp-json.ts +145 -0
  164. package/src/utils/serialize-middleware-groups-meta.ts +33 -0
  165. package/src/utils/serialize-openapi-json.ts +277 -0
  166. package/src/utils/serialize-permissions-groups-meta.ts +35 -0
  167. package/src/utils/test-data/inspector-state.json +69 -66
  168. package/src/utils/workflow/dsl/deserialize-dsl-workflow.ts +1104 -0
  169. package/src/{workflow/extract-simple-workflow.ts → utils/workflow/dsl/extract-dsl-workflow.ts} +678 -85
  170. package/src/utils/workflow/dsl/index.ts +11 -0
  171. package/src/{workflow → utils/workflow/dsl}/patterns.ts +108 -11
  172. package/src/{workflow → utils/workflow/dsl}/validation.ts +34 -7
  173. package/src/utils/workflow/graph/convert-dsl-to-graph.ts +422 -0
  174. package/src/utils/workflow/graph/finalize-workflow-wires.ts +310 -0
  175. package/src/utils/workflow/graph/finalize-workflows.ts +100 -0
  176. package/src/utils/workflow/graph/index.ts +11 -0
  177. package/src/utils/workflow/graph/serialize-workflow-graph.ts +216 -0
  178. package/src/utils/workflow/graph/workflow-graph.types.ts +231 -0
  179. package/src/visit.ts +14 -2
  180. package/tsconfig.tsbuildinfo +1 -1
  181. package/dist/add/add-mcp-tool.d.ts +0 -2
  182. package/dist/add/add-mcp-tool.js +0 -81
  183. package/dist/utils/extract-service-metadata.d.ts +0 -19
  184. package/dist/utils/extract-service-metadata.js +0 -244
  185. package/dist/utils/write-service-metadata.d.ts +0 -13
  186. package/dist/utils/write-service-metadata.js +0 -37
  187. package/src/add/add-mcp-tool.ts +0 -141
  188. package/src/utils/extract-service-metadata.ts +0 -353
  189. package/src/utils/write-service-metadata.ts +0 -51
@@ -4,7 +4,10 @@ import {
4
4
  getCommonWireMetaData,
5
5
  } from '../utils/get-property-value.js'
6
6
  import { AddWiring } from '../types.js'
7
- import { extractFunctionName } from '../utils/extract-function-name.js'
7
+ import {
8
+ extractFunctionName,
9
+ makeContextBasedId,
10
+ } from '../utils/extract-function-name.js'
8
11
  import { getPropertyAssignmentInitializer } from '../utils/type-utils.js'
9
12
  import { resolveMiddleware } from '../utils/middleware.js'
10
13
  import { extractWireNames } from '../utils/post-process.js'
@@ -39,12 +42,10 @@ export const addSchedule: AddWiring = (
39
42
 
40
43
  const nameValue = getPropertyValue(obj, 'name') as string | null
41
44
  const scheduleValue = getPropertyValue(obj, 'schedule') as string | null
42
- const { tags, summary, description, errors } = getCommonWireMetaData(
43
- obj,
44
- 'Scheduler',
45
- nameValue,
46
- logger
47
- )
45
+ const { disabled, tags, summary, description, errors } =
46
+ getCommonWireMetaData(obj, 'Scheduler', nameValue, logger)
47
+
48
+ if (disabled) return
48
49
 
49
50
  const funcInitializer = getPropertyAssignmentInitializer(
50
51
  obj,
@@ -60,11 +61,15 @@ export const addSchedule: AddWiring = (
60
61
  return
61
62
  }
62
63
 
63
- const pikkuFuncName = extractFunctionName(
64
+ const extracted = extractFunctionName(
64
65
  funcInitializer,
65
66
  checker,
66
67
  state.rootDir
67
- ).pikkuFuncName
68
+ )
69
+ let pikkuFuncId = extracted.pikkuFuncId
70
+ if (pikkuFuncId.startsWith('__temp_') && nameValue) {
71
+ pikkuFuncId = makeContextBasedId('scheduler', nameValue)
72
+ }
68
73
 
69
74
  if (!nameValue || !scheduleValue) {
70
75
  return
@@ -74,14 +79,14 @@ export const addSchedule: AddWiring = (
74
79
  const middleware = resolveMiddleware(state, obj, tags, checker)
75
80
 
76
81
  // --- track used functions/middleware for service aggregation ---
77
- state.serviceAggregation.usedFunctions.add(pikkuFuncName)
82
+ state.serviceAggregation.usedFunctions.add(pikkuFuncId)
78
83
  extractWireNames(middleware).forEach((name) =>
79
84
  state.serviceAggregation.usedMiddleware.add(name)
80
85
  )
81
86
 
82
87
  state.scheduledTasks.files.add(node.getSourceFile().fileName)
83
88
  state.scheduledTasks.meta[nameValue] = {
84
- pikkuFuncName,
89
+ pikkuFuncId,
85
90
  name: nameValue,
86
91
  schedule: scheduleValue,
87
92
  summary,
@@ -0,0 +1,140 @@
1
+ import * as ts from 'typescript'
2
+ import {
3
+ getPropertyValue,
4
+ getArrayPropertyValue,
5
+ } from '../utils/get-property-value.js'
6
+ import { AddWiring } from '../types.js'
7
+ import { ErrorCode } from '../error-codes.js'
8
+ import { createAddKeyedWiring } from './add-keyed-wiring.js'
9
+
10
+ export const addSecret = createAddKeyedWiring({
11
+ functionName: 'wireSecret',
12
+ idField: 'secretId',
13
+ label: 'Secret',
14
+ schemaPrefix: 'SecretSchema',
15
+ getState: (state) => state.secrets,
16
+ })
17
+
18
+ export const addOAuth2Credential: AddWiring = (
19
+ logger,
20
+ node,
21
+ _checker,
22
+ state,
23
+ _options
24
+ ) => {
25
+ if (!ts.isCallExpression(node)) {
26
+ return
27
+ }
28
+
29
+ const args = node.arguments
30
+ const firstArg = args[0]
31
+ const expression = node.expression
32
+
33
+ if (
34
+ !ts.isIdentifier(expression) ||
35
+ expression.text !== 'wireOAuth2Credential'
36
+ ) {
37
+ return
38
+ }
39
+
40
+ if (!firstArg) {
41
+ return
42
+ }
43
+
44
+ if (ts.isObjectLiteralExpression(firstArg)) {
45
+ const obj = firstArg
46
+
47
+ const nameValue = getPropertyValue(obj, 'name') as string | null
48
+ const displayNameValue = getPropertyValue(obj, 'displayName') as
49
+ | string
50
+ | null
51
+ const descriptionValue = getPropertyValue(obj, 'description') as
52
+ | string
53
+ | null
54
+ const secretIdValue = getPropertyValue(obj, 'secretId') as string | null
55
+ const tokenSecretIdValue = getPropertyValue(obj, 'tokenSecretId') as
56
+ | string
57
+ | null
58
+ const authorizationUrlValue = getPropertyValue(obj, 'authorizationUrl') as
59
+ | string
60
+ | null
61
+ const tokenUrlValue = getPropertyValue(obj, 'tokenUrl') as string | null
62
+ const scopesValue = getArrayPropertyValue(obj, 'scopes')
63
+ const pkceValue = getPropertyValue(obj, 'pkce') as boolean | null
64
+
65
+ if (!nameValue) {
66
+ logger.critical(
67
+ ErrorCode.MISSING_NAME,
68
+ "OAuth2 Credential is missing the required 'name' property."
69
+ )
70
+ return
71
+ }
72
+
73
+ if (!displayNameValue) {
74
+ logger.critical(
75
+ ErrorCode.MISSING_NAME,
76
+ `OAuth2 Credential '${nameValue}' is missing the required 'displayName' property.`
77
+ )
78
+ return
79
+ }
80
+
81
+ if (!secretIdValue) {
82
+ logger.critical(
83
+ ErrorCode.MISSING_NAME,
84
+ `OAuth2 Credential '${nameValue}' is missing the required 'secretId' property.`
85
+ )
86
+ return
87
+ }
88
+
89
+ if (!tokenSecretIdValue) {
90
+ logger.critical(
91
+ ErrorCode.MISSING_NAME,
92
+ `OAuth2 Credential '${nameValue}' is missing the required 'tokenSecretId' property.`
93
+ )
94
+ return
95
+ }
96
+
97
+ if (!authorizationUrlValue) {
98
+ logger.critical(
99
+ ErrorCode.MISSING_NAME,
100
+ `OAuth2 Credential '${nameValue}' is missing the required 'authorizationUrl' property.`
101
+ )
102
+ return
103
+ }
104
+
105
+ if (!tokenUrlValue) {
106
+ logger.critical(
107
+ ErrorCode.MISSING_NAME,
108
+ `OAuth2 Credential '${nameValue}' is missing the required 'tokenUrl' property.`
109
+ )
110
+ return
111
+ }
112
+
113
+ if (!scopesValue || scopesValue.length === 0) {
114
+ logger.critical(
115
+ ErrorCode.MISSING_NAME,
116
+ `OAuth2 Credential '${nameValue}' is missing the required 'scopes' property.`
117
+ )
118
+ return
119
+ }
120
+
121
+ const sourceFile = node.getSourceFile().fileName
122
+
123
+ state.secrets.files.add(sourceFile)
124
+
125
+ state.secrets.definitions.push({
126
+ name: nameValue,
127
+ displayName: displayNameValue,
128
+ description: descriptionValue || undefined,
129
+ secretId: secretIdValue,
130
+ oauth2: {
131
+ tokenSecretId: tokenSecretIdValue,
132
+ authorizationUrl: authorizationUrlValue,
133
+ tokenUrl: tokenUrlValue,
134
+ scopes: scopesValue,
135
+ pkce: pkceValue || undefined,
136
+ },
137
+ sourceFile,
138
+ })
139
+ }
140
+ }
@@ -0,0 +1,154 @@
1
+ import * as ts from 'typescript'
2
+ import {
3
+ getPropertyValue,
4
+ getCommonWireMetaData,
5
+ } from '../utils/get-property-value.js'
6
+ import { AddWiring } from '../types.js'
7
+ import {
8
+ extractFunctionName,
9
+ makeContextBasedId,
10
+ } from '../utils/extract-function-name.js'
11
+ import { getPropertyAssignmentInitializer } from '../utils/type-utils.js'
12
+ import { resolveMiddleware } from '../utils/middleware.js'
13
+ import { extractWireNames } from '../utils/post-process.js'
14
+ import { resolveExternalPackageName } from '../utils/resolve-external-package.js'
15
+
16
+ import { ErrorCode } from '../error-codes.js'
17
+ export const addTrigger: AddWiring = (
18
+ logger,
19
+ node,
20
+ checker,
21
+ state,
22
+ options
23
+ ) => {
24
+ if (!ts.isCallExpression(node)) {
25
+ return
26
+ }
27
+
28
+ const args = node.arguments
29
+ const firstArg = args[0]
30
+ const expression = node.expression
31
+
32
+ if (!ts.isIdentifier(expression)) {
33
+ return
34
+ }
35
+
36
+ if (expression.text === 'wireTrigger') {
37
+ addWireTrigger(logger, node, checker, state, firstArg)
38
+ } else if (expression.text === 'wireTriggerSource') {
39
+ addWireTriggerSource(logger, node, checker, state, options, firstArg)
40
+ }
41
+ }
42
+
43
+ const addWireTrigger: (
44
+ logger: Parameters<AddWiring>[0],
45
+ node: ts.CallExpression,
46
+ checker: Parameters<AddWiring>[2],
47
+ state: Parameters<AddWiring>[3],
48
+ firstArg: ts.Expression | undefined
49
+ ) => void = (logger, node, checker, state, firstArg) => {
50
+ if (!firstArg || !ts.isObjectLiteralExpression(firstArg)) {
51
+ return
52
+ }
53
+
54
+ const obj = firstArg
55
+
56
+ const nameValue = getPropertyValue(obj, 'name') as string | null
57
+ const { disabled, tags, summary, description, errors } =
58
+ getCommonWireMetaData(obj, 'Trigger', nameValue, logger)
59
+
60
+ if (disabled) return
61
+
62
+ const funcInitializer = getPropertyAssignmentInitializer(
63
+ obj,
64
+ 'func',
65
+ true,
66
+ checker
67
+ )
68
+ if (!funcInitializer) {
69
+ logger.critical(
70
+ ErrorCode.MISSING_FUNC,
71
+ `No valid 'func' property for trigger '${nameValue}'.`
72
+ )
73
+ return
74
+ }
75
+
76
+ const extracted = extractFunctionName(funcInitializer, checker, state.rootDir)
77
+ let pikkuFuncId = extracted.pikkuFuncId
78
+ if (pikkuFuncId.startsWith('__temp_') && nameValue) {
79
+ pikkuFuncId = makeContextBasedId('trigger', nameValue)
80
+ }
81
+
82
+ if (!nameValue) {
83
+ return
84
+ }
85
+
86
+ // --- resolve middleware ---
87
+ const middleware = resolveMiddleware(state, obj, tags, checker)
88
+
89
+ // --- track used functions/middleware for service aggregation ---
90
+ state.serviceAggregation.usedFunctions.add(pikkuFuncId)
91
+ extractWireNames(middleware).forEach((name) =>
92
+ state.serviceAggregation.usedMiddleware.add(name)
93
+ )
94
+
95
+ state.triggers.files.add(node.getSourceFile().fileName)
96
+ state.triggers.meta[nameValue] = {
97
+ pikkuFuncId,
98
+ name: nameValue,
99
+ summary,
100
+ description,
101
+ errors,
102
+ tags,
103
+ middleware,
104
+ }
105
+ }
106
+
107
+ const addWireTriggerSource: (
108
+ logger: Parameters<AddWiring>[0],
109
+ node: ts.CallExpression,
110
+ checker: Parameters<AddWiring>[2],
111
+ state: Parameters<AddWiring>[3],
112
+ options: Parameters<AddWiring>[4],
113
+ firstArg: ts.Expression | undefined
114
+ ) => void = (logger, node, checker, state, options, firstArg) => {
115
+ if (!firstArg || !ts.isObjectLiteralExpression(firstArg)) {
116
+ return
117
+ }
118
+
119
+ const obj = firstArg
120
+
121
+ const nameValue = getPropertyValue(obj, 'name') as string | null
122
+ if (!nameValue) {
123
+ return
124
+ }
125
+
126
+ const funcInitializer = getPropertyAssignmentInitializer(
127
+ obj,
128
+ 'func',
129
+ true,
130
+ checker
131
+ )
132
+ if (!funcInitializer) {
133
+ logger.critical(
134
+ ErrorCode.MISSING_FUNC,
135
+ `No valid 'func' property for trigger source '${nameValue}'.`
136
+ )
137
+ return
138
+ }
139
+
140
+ if (ts.isIdentifier(funcInitializer)) {
141
+ const packageName = resolveExternalPackageName(
142
+ funcInitializer,
143
+ checker,
144
+ options.externalPackages
145
+ )
146
+ state.triggers.sourceMeta[nameValue] = {
147
+ name: nameValue,
148
+ pikkuFuncId: funcInitializer.text,
149
+ packageName: packageName || undefined,
150
+ }
151
+ }
152
+
153
+ state.triggers.files.add(node.getSourceFile().fileName)
154
+ }
@@ -0,0 +1,9 @@
1
+ import { createAddKeyedWiring } from './add-keyed-wiring.js'
2
+
3
+ export const addVariable = createAddKeyedWiring({
4
+ functionName: 'wireVariable',
5
+ idField: 'variableId',
6
+ label: 'Variable',
7
+ schemaPrefix: 'VariableSchema',
8
+ getState: (state) => state.variables,
9
+ })