@gxp-dev/tools 2.0.63 → 2.0.65
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/README.md +32 -31
- package/bin/gx-devtools.js +74 -54
- package/bin/lib/cli.js +23 -21
- package/bin/lib/commands/add-dependency.js +366 -325
- package/bin/lib/commands/assets.js +137 -139
- package/bin/lib/commands/build.js +169 -174
- package/bin/lib/commands/datastore.js +181 -183
- package/bin/lib/commands/dev.js +127 -131
- package/bin/lib/commands/extensions.js +147 -149
- package/bin/lib/commands/extract-config.js +73 -67
- package/bin/lib/commands/index.js +12 -12
- package/bin/lib/commands/init.js +342 -240
- package/bin/lib/commands/publish.js +69 -75
- package/bin/lib/commands/socket.js +69 -69
- package/bin/lib/commands/ssl.js +14 -14
- package/bin/lib/constants.js +10 -24
- package/bin/lib/tui/App.tsx +761 -705
- package/bin/lib/tui/components/AIPanel.tsx +191 -171
- package/bin/lib/tui/components/CommandInput.tsx +394 -343
- package/bin/lib/tui/components/GeminiPanel.tsx +175 -151
- package/bin/lib/tui/components/Header.tsx +23 -21
- package/bin/lib/tui/components/LogPanel.tsx +244 -220
- package/bin/lib/tui/components/TabBar.tsx +50 -48
- package/bin/lib/tui/components/WelcomeScreen.tsx +126 -71
- package/bin/lib/tui/index.tsx +37 -39
- package/bin/lib/tui/services/AIService.ts +518 -462
- package/bin/lib/tui/services/ExtensionService.ts +140 -129
- package/bin/lib/tui/services/GeminiService.ts +367 -337
- package/bin/lib/tui/services/ServiceManager.ts +344 -322
- package/bin/lib/tui/services/SocketService.ts +168 -168
- package/bin/lib/tui/services/ViteService.ts +88 -88
- package/bin/lib/tui/services/index.ts +47 -22
- package/bin/lib/utils/ai-scaffold.js +291 -280
- package/bin/lib/utils/extract-config.js +157 -140
- package/bin/lib/utils/files.js +82 -86
- package/bin/lib/utils/index.js +7 -7
- package/bin/lib/utils/paths.js +34 -34
- package/bin/lib/utils/prompts.js +194 -169
- package/bin/lib/utils/ssl.js +79 -81
- package/browser-extensions/README.md +0 -1
- package/browser-extensions/chrome/background.js +244 -237
- package/browser-extensions/chrome/content.js +32 -29
- package/browser-extensions/chrome/devtools.html +7 -7
- package/browser-extensions/chrome/devtools.js +19 -19
- package/browser-extensions/chrome/inspector.js +802 -767
- package/browser-extensions/chrome/manifest.json +71 -63
- package/browser-extensions/chrome/panel.html +674 -636
- package/browser-extensions/chrome/panel.js +722 -712
- package/browser-extensions/chrome/popup.html +586 -543
- package/browser-extensions/chrome/popup.js +282 -244
- package/browser-extensions/chrome/rules.json +1 -1
- package/browser-extensions/chrome/test-chrome.html +216 -136
- package/browser-extensions/chrome/test-mixed-content.html +284 -189
- package/browser-extensions/chrome/test-uri-pattern.html +221 -198
- package/browser-extensions/firefox/README.md +9 -6
- package/browser-extensions/firefox/background.js +221 -218
- package/browser-extensions/firefox/content.js +55 -52
- package/browser-extensions/firefox/debug-errors.html +386 -228
- package/browser-extensions/firefox/debug-https.html +153 -105
- package/browser-extensions/firefox/devtools.html +7 -7
- package/browser-extensions/firefox/devtools.js +23 -20
- package/browser-extensions/firefox/inspector.js +802 -767
- package/browser-extensions/firefox/manifest.json +68 -68
- package/browser-extensions/firefox/panel.html +674 -636
- package/browser-extensions/firefox/panel.js +722 -712
- package/browser-extensions/firefox/popup.html +572 -535
- package/browser-extensions/firefox/popup.js +281 -236
- package/browser-extensions/firefox/test-gramercy.html +170 -125
- package/browser-extensions/firefox/test-imports.html +59 -55
- package/browser-extensions/firefox/test-masking.html +231 -140
- package/browser-extensions/firefox/test-uri-pattern.html +221 -198
- package/dist/tui/App.d.ts +1 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +154 -150
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/components/AIPanel.d.ts.map +1 -1
- package/dist/tui/components/AIPanel.js +42 -35
- package/dist/tui/components/AIPanel.js.map +1 -1
- package/dist/tui/components/CommandInput.d.ts +1 -1
- package/dist/tui/components/CommandInput.d.ts.map +1 -1
- package/dist/tui/components/CommandInput.js +92 -62
- package/dist/tui/components/CommandInput.js.map +1 -1
- package/dist/tui/components/GeminiPanel.d.ts.map +1 -1
- package/dist/tui/components/GeminiPanel.js +37 -30
- package/dist/tui/components/GeminiPanel.js.map +1 -1
- package/dist/tui/components/Header.d.ts.map +1 -1
- package/dist/tui/components/Header.js +1 -1
- package/dist/tui/components/Header.js.map +1 -1
- package/dist/tui/components/LogPanel.d.ts +1 -1
- package/dist/tui/components/LogPanel.d.ts.map +1 -1
- package/dist/tui/components/LogPanel.js +26 -24
- package/dist/tui/components/LogPanel.js.map +1 -1
- package/dist/tui/components/TabBar.d.ts +2 -2
- package/dist/tui/components/TabBar.d.ts.map +1 -1
- package/dist/tui/components/TabBar.js +11 -11
- package/dist/tui/components/TabBar.js.map +1 -1
- package/dist/tui/components/WelcomeScreen.d.ts.map +1 -1
- package/dist/tui/components/WelcomeScreen.js +6 -6
- package/dist/tui/components/WelcomeScreen.js.map +1 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +8 -8
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/services/AIService.d.ts +2 -2
- package/dist/tui/services/AIService.d.ts.map +1 -1
- package/dist/tui/services/AIService.js +165 -125
- package/dist/tui/services/AIService.js.map +1 -1
- package/dist/tui/services/ExtensionService.d.ts +1 -1
- package/dist/tui/services/ExtensionService.d.ts.map +1 -1
- package/dist/tui/services/ExtensionService.js +33 -26
- package/dist/tui/services/ExtensionService.js.map +1 -1
- package/dist/tui/services/GeminiService.d.ts +1 -1
- package/dist/tui/services/GeminiService.d.ts.map +1 -1
- package/dist/tui/services/GeminiService.js +87 -76
- package/dist/tui/services/GeminiService.js.map +1 -1
- package/dist/tui/services/ServiceManager.d.ts +3 -3
- package/dist/tui/services/ServiceManager.d.ts.map +1 -1
- package/dist/tui/services/ServiceManager.js +72 -58
- package/dist/tui/services/ServiceManager.js.map +1 -1
- package/dist/tui/services/SocketService.d.ts.map +1 -1
- package/dist/tui/services/SocketService.js +32 -32
- package/dist/tui/services/SocketService.js.map +1 -1
- package/dist/tui/services/ViteService.d.ts.map +1 -1
- package/dist/tui/services/ViteService.js +26 -28
- package/dist/tui/services/ViteService.js.map +1 -1
- package/dist/tui/services/index.d.ts +6 -6
- package/dist/tui/services/index.d.ts.map +1 -1
- package/dist/tui/services/index.js +6 -6
- package/dist/tui/services/index.js.map +1 -1
- package/mcp/gxp-api-server.js +83 -81
- package/package.json +109 -93
- package/runtime/PortalContainer.vue +258 -234
- package/runtime/dev-tools/DevToolsModal.vue +153 -155
- package/runtime/dev-tools/LayoutSwitcher.vue +144 -140
- package/runtime/dev-tools/MockDataEditor.vue +456 -433
- package/runtime/dev-tools/SocketSimulator.vue +379 -371
- package/runtime/dev-tools/StoreInspector.vue +517 -455
- package/runtime/dev-tools/index.js +5 -5
- package/runtime/fallback-layouts/PrivateLayout.vue +2 -2
- package/runtime/fallback-layouts/PublicLayout.vue +2 -2
- package/runtime/fallback-layouts/SystemLayout.vue +2 -2
- package/runtime/gxpStringsPlugin.js +159 -134
- package/runtime/index.html +17 -19
- package/runtime/main.js +24 -22
- package/runtime/mock-api/auth-middleware.js +15 -15
- package/runtime/mock-api/image-generator.js +46 -46
- package/runtime/mock-api/index.js +55 -55
- package/runtime/mock-api/response-generator.js +116 -105
- package/runtime/mock-api/route-generator.js +107 -84
- package/runtime/mock-api/socket-triggers.js +94 -93
- package/runtime/mock-api/spec-loader.js +79 -80
- package/runtime/package.json +3 -0
- package/runtime/server.js +68 -68
- package/runtime/stores/gxpPortalConfigStore.js +204 -186
- package/runtime/stores/index.js +2 -2
- package/runtime/vite-inspector-plugin.js +858 -707
- package/runtime/vite-source-tracker-plugin.js +132 -113
- package/runtime/vite.config.js +191 -139
- package/scripts/launch-chrome.js +41 -41
- package/scripts/pack-chrome.js +38 -39
- package/socket-events/AiSessionMessageCreated.json +17 -17
- package/socket-events/SocialStreamPostCreated.json +23 -23
- package/socket-events/SocialStreamPostVariantCompleted.json +22 -22
- package/template/.claude/agents/gxp-developer.md +100 -99
- package/template/.claude/settings.json +7 -7
- package/template/AGENTS.md +30 -23
- package/template/GEMINI.md +20 -20
- package/template/README.md +70 -53
- package/template/app-manifest.json +2 -4
- package/template/configuration.json +10 -10
- package/template/default-styling.css +1 -1
- package/template/index.html +18 -20
- package/template/main.js +24 -22
- package/template/src/DemoPage.vue +415 -362
- package/template/src/Plugin.vue +76 -85
- package/template/src/stores/index.js +3 -3
- package/template/src/stores/test-data.json +164 -172
- package/template/theme-layouts/AdditionalStyling.css +50 -50
- package/template/theme-layouts/PrivateLayout.vue +8 -12
- package/template/theme-layouts/PublicLayout.vue +8 -12
- package/template/theme-layouts/SystemLayout.vue +8 -12
- package/template/vite.extend.js +45 -0
- package/template/vite.config.js +0 -409
|
@@ -11,33 +11,33 @@
|
|
|
11
11
|
* @returns {object} Map of operation keys to trigger definitions
|
|
12
12
|
*/
|
|
13
13
|
function parseSocketTriggers(asyncApiSpec) {
|
|
14
|
-
const triggers = {}
|
|
14
|
+
const triggers = {}
|
|
15
15
|
|
|
16
16
|
if (!asyncApiSpec) {
|
|
17
|
-
return triggers
|
|
17
|
+
return triggers
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
// Handle AsyncAPI 2.x format
|
|
21
21
|
if (asyncApiSpec.channels) {
|
|
22
|
-
parseChannels(asyncApiSpec.channels, asyncApiSpec, triggers)
|
|
22
|
+
parseChannels(asyncApiSpec.channels, asyncApiSpec, triggers)
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
// Handle AsyncAPI 3.x format
|
|
26
26
|
if (asyncApiSpec.operations) {
|
|
27
|
-
parseOperations(asyncApiSpec.operations, asyncApiSpec, triggers)
|
|
27
|
+
parseOperations(asyncApiSpec.operations, asyncApiSpec, triggers)
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
// Also check components/messages directly
|
|
31
31
|
if (asyncApiSpec.components?.messages) {
|
|
32
|
-
parseMessages(asyncApiSpec.components.messages, triggers)
|
|
32
|
+
parseMessages(asyncApiSpec.components.messages, triggers)
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
const triggerCount = Object.keys(triggers).length
|
|
35
|
+
const triggerCount = Object.keys(triggers).length
|
|
36
36
|
if (triggerCount > 0) {
|
|
37
|
-
console.log(`📡 Parsed ${triggerCount} socket trigger definitions`)
|
|
37
|
+
console.log(`📡 Parsed ${triggerCount} socket trigger definitions`)
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
return triggers
|
|
40
|
+
return triggers
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
/**
|
|
@@ -49,15 +49,12 @@ function parseSocketTriggers(asyncApiSpec) {
|
|
|
49
49
|
function parseChannels(channels, spec, triggers) {
|
|
50
50
|
for (const [channelName, channel] of Object.entries(channels)) {
|
|
51
51
|
// Check publish/subscribe operations
|
|
52
|
-
const operations = [
|
|
53
|
-
channel.publish,
|
|
54
|
-
channel.subscribe,
|
|
55
|
-
].filter(Boolean);
|
|
52
|
+
const operations = [channel.publish, channel.subscribe].filter(Boolean)
|
|
56
53
|
|
|
57
54
|
for (const operation of operations) {
|
|
58
|
-
const message = operation.message
|
|
55
|
+
const message = operation.message
|
|
59
56
|
if (message) {
|
|
60
|
-
extractTriggersFromMessage(channelName, message, spec, triggers)
|
|
57
|
+
extractTriggersFromMessage(channelName, message, spec, triggers)
|
|
61
58
|
}
|
|
62
59
|
}
|
|
63
60
|
}
|
|
@@ -73,8 +70,8 @@ function parseOperations(operations, spec, triggers) {
|
|
|
73
70
|
for (const [, operation] of Object.entries(operations)) {
|
|
74
71
|
if (operation.messages) {
|
|
75
72
|
for (const message of operation.messages) {
|
|
76
|
-
const channelName = operation.channel?.$ref || "default"
|
|
77
|
-
extractTriggersFromMessage(channelName, message, spec, triggers)
|
|
73
|
+
const channelName = operation.channel?.$ref || "default"
|
|
74
|
+
extractTriggersFromMessage(channelName, message, spec, triggers)
|
|
78
75
|
}
|
|
79
76
|
}
|
|
80
77
|
}
|
|
@@ -90,14 +87,14 @@ function parseMessages(messages, triggers) {
|
|
|
90
87
|
if (message["x-triggered-by"]) {
|
|
91
88
|
const triggerDefs = Array.isArray(message["x-triggered-by"])
|
|
92
89
|
? message["x-triggered-by"]
|
|
93
|
-
: [message["x-triggered-by"]]
|
|
90
|
+
: [message["x-triggered-by"]]
|
|
94
91
|
|
|
95
92
|
for (const triggerDef of triggerDefs) {
|
|
96
|
-
const operationKey = triggerDef.operation
|
|
97
|
-
if (!operationKey) continue
|
|
93
|
+
const operationKey = triggerDef.operation
|
|
94
|
+
if (!operationKey) continue
|
|
98
95
|
|
|
99
96
|
if (!triggers[operationKey]) {
|
|
100
|
-
triggers[operationKey] = []
|
|
97
|
+
triggers[operationKey] = []
|
|
101
98
|
}
|
|
102
99
|
|
|
103
100
|
triggers[operationKey].push({
|
|
@@ -106,7 +103,7 @@ function parseMessages(messages, triggers) {
|
|
|
106
103
|
delay: triggerDef.delay || 0,
|
|
107
104
|
condition: triggerDef.condition,
|
|
108
105
|
payload: triggerDef.payload || message.payload,
|
|
109
|
-
})
|
|
106
|
+
})
|
|
110
107
|
}
|
|
111
108
|
}
|
|
112
109
|
}
|
|
@@ -121,23 +118,23 @@ function parseMessages(messages, triggers) {
|
|
|
121
118
|
*/
|
|
122
119
|
function extractTriggersFromMessage(channelName, message, spec, triggers) {
|
|
123
120
|
// Resolve $ref if needed
|
|
124
|
-
let resolvedMessage = message
|
|
121
|
+
let resolvedMessage = message
|
|
125
122
|
if (message.$ref) {
|
|
126
|
-
resolvedMessage = resolveRef(message.$ref, spec) || message
|
|
123
|
+
resolvedMessage = resolveRef(message.$ref, spec) || message
|
|
127
124
|
}
|
|
128
125
|
|
|
129
126
|
// Check for x-triggered-by extension
|
|
130
|
-
const triggerDefs = resolvedMessage["x-triggered-by"]
|
|
131
|
-
if (!triggerDefs) return
|
|
127
|
+
const triggerDefs = resolvedMessage["x-triggered-by"]
|
|
128
|
+
if (!triggerDefs) return
|
|
132
129
|
|
|
133
|
-
const triggerArray = Array.isArray(triggerDefs) ? triggerDefs : [triggerDefs]
|
|
130
|
+
const triggerArray = Array.isArray(triggerDefs) ? triggerDefs : [triggerDefs]
|
|
134
131
|
|
|
135
132
|
for (const triggerDef of triggerArray) {
|
|
136
|
-
const operationKey = triggerDef.operation
|
|
137
|
-
if (!operationKey) continue
|
|
133
|
+
const operationKey = triggerDef.operation
|
|
134
|
+
if (!operationKey) continue
|
|
138
135
|
|
|
139
136
|
if (!triggers[operationKey]) {
|
|
140
|
-
triggers[operationKey] = []
|
|
137
|
+
triggers[operationKey] = []
|
|
141
138
|
}
|
|
142
139
|
|
|
143
140
|
triggers[operationKey].push({
|
|
@@ -146,7 +143,7 @@ function extractTriggersFromMessage(channelName, message, spec, triggers) {
|
|
|
146
143
|
delay: triggerDef.delay || 0,
|
|
147
144
|
condition: triggerDef.condition,
|
|
148
145
|
payload: triggerDef.payload || resolvedMessage.payload,
|
|
149
|
-
})
|
|
146
|
+
})
|
|
150
147
|
}
|
|
151
148
|
}
|
|
152
149
|
|
|
@@ -158,21 +155,21 @@ function extractTriggersFromMessage(channelName, message, spec, triggers) {
|
|
|
158
155
|
*/
|
|
159
156
|
function resolveRef(ref, spec) {
|
|
160
157
|
if (!ref || !ref.startsWith("#/")) {
|
|
161
|
-
return null
|
|
158
|
+
return null
|
|
162
159
|
}
|
|
163
160
|
|
|
164
|
-
const parts = ref.slice(2).split("/")
|
|
165
|
-
let current = spec
|
|
161
|
+
const parts = ref.slice(2).split("/")
|
|
162
|
+
let current = spec
|
|
166
163
|
|
|
167
164
|
for (const part of parts) {
|
|
168
165
|
if (current && typeof current === "object" && part in current) {
|
|
169
|
-
current = current[part]
|
|
166
|
+
current = current[part]
|
|
170
167
|
} else {
|
|
171
|
-
return null
|
|
168
|
+
return null
|
|
172
169
|
}
|
|
173
170
|
}
|
|
174
171
|
|
|
175
|
-
return current
|
|
172
|
+
return current
|
|
176
173
|
}
|
|
177
174
|
|
|
178
175
|
/**
|
|
@@ -182,31 +179,31 @@ function resolveRef(ref, spec) {
|
|
|
182
179
|
* @returns {object} Templated payload
|
|
183
180
|
*/
|
|
184
181
|
function templatePayload(payload, context) {
|
|
185
|
-
if (!payload) return {}
|
|
182
|
+
if (!payload) return {}
|
|
186
183
|
|
|
187
|
-
const payloadStr = JSON.stringify(payload)
|
|
184
|
+
const payloadStr = JSON.stringify(payload)
|
|
188
185
|
|
|
189
186
|
// Replace template variables
|
|
190
187
|
const templated = payloadStr.replace(/\{\{([^}]+)\}\}/g, (match, path) => {
|
|
191
|
-
const value = resolvePath(path.trim(), context)
|
|
188
|
+
const value = resolvePath(path.trim(), context)
|
|
192
189
|
|
|
193
190
|
if (value === undefined) {
|
|
194
|
-
return match
|
|
191
|
+
return match // Keep original if not found
|
|
195
192
|
}
|
|
196
193
|
|
|
197
194
|
// Handle different types
|
|
198
195
|
if (typeof value === "string") {
|
|
199
|
-
return value
|
|
196
|
+
return value
|
|
200
197
|
}
|
|
201
198
|
|
|
202
|
-
return JSON.stringify(value)
|
|
203
|
-
})
|
|
199
|
+
return JSON.stringify(value)
|
|
200
|
+
})
|
|
204
201
|
|
|
205
202
|
try {
|
|
206
|
-
return JSON.parse(templated)
|
|
203
|
+
return JSON.parse(templated)
|
|
207
204
|
} catch {
|
|
208
205
|
// If JSON parse fails, return original
|
|
209
|
-
return payload
|
|
206
|
+
return payload
|
|
210
207
|
}
|
|
211
208
|
}
|
|
212
209
|
|
|
@@ -219,25 +216,25 @@ function templatePayload(payload, context) {
|
|
|
219
216
|
function resolvePath(path, obj) {
|
|
220
217
|
// Handle special values
|
|
221
218
|
if (path === "now") {
|
|
222
|
-
return new Date().toISOString()
|
|
219
|
+
return new Date().toISOString()
|
|
223
220
|
}
|
|
224
221
|
|
|
225
222
|
if (path === "timestamp") {
|
|
226
|
-
return Date.now()
|
|
223
|
+
return Date.now()
|
|
227
224
|
}
|
|
228
225
|
|
|
229
|
-
const parts = path.split(".")
|
|
230
|
-
let current = obj
|
|
226
|
+
const parts = path.split(".")
|
|
227
|
+
let current = obj
|
|
231
228
|
|
|
232
229
|
for (const part of parts) {
|
|
233
230
|
if (current && typeof current === "object" && part in current) {
|
|
234
|
-
current = current[part]
|
|
231
|
+
current = current[part]
|
|
235
232
|
} else {
|
|
236
|
-
return undefined
|
|
233
|
+
return undefined
|
|
237
234
|
}
|
|
238
235
|
}
|
|
239
236
|
|
|
240
|
-
return current
|
|
237
|
+
return current
|
|
241
238
|
}
|
|
242
239
|
|
|
243
240
|
/**
|
|
@@ -247,43 +244,43 @@ function resolvePath(path, obj) {
|
|
|
247
244
|
* @returns {boolean} Condition result
|
|
248
245
|
*/
|
|
249
246
|
function evaluateCondition(condition, context) {
|
|
250
|
-
if (!condition) return true
|
|
247
|
+
if (!condition) return true
|
|
251
248
|
|
|
252
249
|
try {
|
|
253
250
|
// Simple condition parsing (e.g., "response.status == 200")
|
|
254
|
-
const match = condition.match(/^([^\s]+)\s*(==|!=|>|<|>=|<=)\s*(.+)$/)
|
|
251
|
+
const match = condition.match(/^([^\s]+)\s*(==|!=|>|<|>=|<=)\s*(.+)$/)
|
|
255
252
|
|
|
256
|
-
if (!match) return true
|
|
253
|
+
if (!match) return true
|
|
257
254
|
|
|
258
|
-
const [, path, operator, valueStr] = match
|
|
259
|
-
const actualValue = resolvePath(path, context)
|
|
255
|
+
const [, path, operator, valueStr] = match
|
|
256
|
+
const actualValue = resolvePath(path, context)
|
|
260
257
|
|
|
261
258
|
// Parse the expected value
|
|
262
|
-
let expectedValue
|
|
259
|
+
let expectedValue
|
|
263
260
|
try {
|
|
264
|
-
expectedValue = JSON.parse(valueStr)
|
|
261
|
+
expectedValue = JSON.parse(valueStr)
|
|
265
262
|
} catch {
|
|
266
|
-
expectedValue = valueStr
|
|
263
|
+
expectedValue = valueStr
|
|
267
264
|
}
|
|
268
265
|
|
|
269
266
|
switch (operator) {
|
|
270
267
|
case "==":
|
|
271
|
-
return actualValue == expectedValue
|
|
268
|
+
return actualValue == expectedValue
|
|
272
269
|
case "!=":
|
|
273
|
-
return actualValue != expectedValue
|
|
270
|
+
return actualValue != expectedValue
|
|
274
271
|
case ">":
|
|
275
|
-
return actualValue > expectedValue
|
|
272
|
+
return actualValue > expectedValue
|
|
276
273
|
case "<":
|
|
277
|
-
return actualValue < expectedValue
|
|
274
|
+
return actualValue < expectedValue
|
|
278
275
|
case ">=":
|
|
279
|
-
return actualValue >= expectedValue
|
|
276
|
+
return actualValue >= expectedValue
|
|
280
277
|
case "<=":
|
|
281
|
-
return actualValue <= expectedValue
|
|
278
|
+
return actualValue <= expectedValue
|
|
282
279
|
default:
|
|
283
|
-
return true
|
|
280
|
+
return true
|
|
284
281
|
}
|
|
285
282
|
} catch {
|
|
286
|
-
return true
|
|
283
|
+
return true
|
|
287
284
|
}
|
|
288
285
|
}
|
|
289
286
|
|
|
@@ -295,45 +292,49 @@ function evaluateCondition(condition, context) {
|
|
|
295
292
|
* @param {object} context - Request/response context
|
|
296
293
|
*/
|
|
297
294
|
function triggerSocketEvents(io, socketTriggers, operationKey, context) {
|
|
298
|
-
if (!io || !socketTriggers) return
|
|
295
|
+
if (!io || !socketTriggers) return
|
|
299
296
|
|
|
300
|
-
const triggers = socketTriggers[operationKey]
|
|
301
|
-
if (!triggers || triggers.length === 0) return
|
|
297
|
+
const triggers = socketTriggers[operationKey]
|
|
298
|
+
if (!triggers || triggers.length === 0) return
|
|
302
299
|
|
|
303
300
|
for (const trigger of triggers) {
|
|
304
301
|
// Evaluate condition
|
|
305
302
|
if (!evaluateCondition(trigger.condition, context)) {
|
|
306
|
-
console.log(
|
|
307
|
-
|
|
303
|
+
console.log(
|
|
304
|
+
` ⏭️ Skipped socket event (condition not met): ${trigger.event}`,
|
|
305
|
+
)
|
|
306
|
+
continue
|
|
308
307
|
}
|
|
309
308
|
|
|
310
309
|
// Template the payload
|
|
311
|
-
const payload = templatePayload(trigger.payload, context)
|
|
310
|
+
const payload = templatePayload(trigger.payload, context)
|
|
312
311
|
|
|
313
312
|
// Template the channel name
|
|
314
|
-
let channel = trigger.channel || ""
|
|
313
|
+
let channel = trigger.channel || ""
|
|
315
314
|
channel = channel.replace(/\{([^}]+)\}/g, (match, path) => {
|
|
316
|
-
const value = resolvePath(`request.params.${path}`, context)
|
|
317
|
-
return value !== undefined ? value : match
|
|
318
|
-
})
|
|
315
|
+
const value = resolvePath(`request.params.${path}`, context)
|
|
316
|
+
return value !== undefined ? value : match
|
|
317
|
+
})
|
|
319
318
|
|
|
320
319
|
// Schedule the emit
|
|
321
|
-
const delay = trigger.delay || 0
|
|
320
|
+
const delay = trigger.delay || 0
|
|
322
321
|
|
|
323
322
|
const emit = () => {
|
|
324
|
-
console.log(` 📡 Emitting socket event: ${trigger.event}`)
|
|
323
|
+
console.log(` 📡 Emitting socket event: ${trigger.event}`)
|
|
325
324
|
if (channel) {
|
|
326
|
-
console.log(` Channel: ${channel}`)
|
|
325
|
+
console.log(` Channel: ${channel}`)
|
|
327
326
|
}
|
|
328
327
|
|
|
329
|
-
io.emit(trigger.event, payload)
|
|
330
|
-
}
|
|
328
|
+
io.emit(trigger.event, payload)
|
|
329
|
+
}
|
|
331
330
|
|
|
332
331
|
if (delay > 0) {
|
|
333
|
-
console.log(
|
|
334
|
-
|
|
332
|
+
console.log(
|
|
333
|
+
` ⏱️ Scheduling socket event: ${trigger.event} (${delay}ms delay)`,
|
|
334
|
+
)
|
|
335
|
+
setTimeout(emit, delay)
|
|
335
336
|
} else {
|
|
336
|
-
emit()
|
|
337
|
+
emit()
|
|
337
338
|
}
|
|
338
339
|
}
|
|
339
340
|
}
|
|
@@ -345,21 +346,21 @@ function triggerSocketEvents(io, socketTriggers, operationKey, context) {
|
|
|
345
346
|
*/
|
|
346
347
|
function getTriggerStats(socketTriggers) {
|
|
347
348
|
if (!socketTriggers) {
|
|
348
|
-
return { total: 0, operations: [] }
|
|
349
|
+
return { total: 0, operations: [] }
|
|
349
350
|
}
|
|
350
351
|
|
|
351
|
-
const operations = []
|
|
352
|
-
let total = 0
|
|
352
|
+
const operations = []
|
|
353
|
+
let total = 0
|
|
353
354
|
|
|
354
355
|
for (const [operation, triggers] of Object.entries(socketTriggers)) {
|
|
355
|
-
total += triggers.length
|
|
356
|
+
total += triggers.length
|
|
356
357
|
operations.push({
|
|
357
358
|
operation,
|
|
358
359
|
events: triggers.map((t) => t.event),
|
|
359
|
-
})
|
|
360
|
+
})
|
|
360
361
|
}
|
|
361
362
|
|
|
362
|
-
return { total, operations }
|
|
363
|
+
return { total, operations }
|
|
363
364
|
}
|
|
364
365
|
|
|
365
366
|
module.exports = {
|
|
@@ -368,4 +369,4 @@ module.exports = {
|
|
|
368
369
|
templatePayload,
|
|
369
370
|
evaluateCondition,
|
|
370
371
|
getTriggerStats,
|
|
371
|
-
}
|
|
372
|
+
}
|