windmill-components 1.695.1 → 1.698.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 (157) hide show
  1. package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +2 -0
  2. package/dist/sharedUtils/base.d.ts +1 -0
  3. package/dist/sharedUtils/cloud.d.ts +1 -0
  4. package/dist/sharedUtils/common.d.ts +111 -0
  5. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +5 -0
  6. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +5 -0
  7. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +5 -0
  8. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +13 -0
  9. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +11 -0
  10. package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +95 -0
  11. package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +6 -0
  12. package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +7 -0
  13. package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +33 -0
  14. package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +10 -0
  15. package/dist/sharedUtils/components/apps/editor/component/components.d.ts +5371 -0
  16. package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +3 -0
  17. package/dist/sharedUtils/components/apps/editor/component/index.d.ts +3 -0
  18. package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +7 -0
  19. package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +3 -0
  20. package/dist/sharedUtils/components/apps/gridUtils.d.ts +14 -0
  21. package/dist/sharedUtils/components/apps/inputType.d.ts +178 -0
  22. package/dist/sharedUtils/components/apps/rx.d.ts +29 -0
  23. package/dist/sharedUtils/components/apps/sharedTypes.d.ts +21 -0
  24. package/dist/sharedUtils/components/apps/types.d.ts +274 -0
  25. package/dist/sharedUtils/components/assets/lib.d.ts +25 -0
  26. package/dist/sharedUtils/components/common/alert/model.d.ts +2 -0
  27. package/dist/sharedUtils/components/common/badge/model.d.ts +8 -0
  28. package/dist/sharedUtils/components/common/button/model.d.ts +45 -0
  29. package/dist/sharedUtils/components/common/fileInput/model.d.ts +1 -0
  30. package/dist/sharedUtils/components/common/index.d.ts +24 -0
  31. package/dist/sharedUtils/components/common/skeleton/model.d.ts +21 -0
  32. package/dist/sharedUtils/components/dbTypes.d.ts +14 -0
  33. package/dist/sharedUtils/components/diff_drawer.d.ts +26 -0
  34. package/dist/sharedUtils/components/ducklake.d.ts +1 -0
  35. package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +7 -0
  36. package/dist/sharedUtils/components/icons/index.d.ts +101 -0
  37. package/dist/sharedUtils/components/random_positive_adjetive.d.ts +1 -0
  38. package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +10 -0
  39. package/dist/sharedUtils/components/raw_apps/utils.d.ts +15 -0
  40. package/dist/sharedUtils/components/triggers/email/utils.d.ts +4 -0
  41. package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +2 -0
  42. package/dist/sharedUtils/components/triggers/http/utils.d.ts +11 -0
  43. package/dist/sharedUtils/components/triggers/kafka/utils.d.ts +2 -0
  44. package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +2 -0
  45. package/dist/sharedUtils/components/triggers/nats/utils.d.ts +2 -0
  46. package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +8 -0
  47. package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +2 -0
  48. package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +32 -0
  49. package/dist/sharedUtils/components/triggers/utils.d.ts +80 -0
  50. package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +2 -0
  51. package/dist/sharedUtils/components/triggers.d.ts +20 -0
  52. package/dist/sharedUtils/gen/core/ApiError.d.ts +10 -0
  53. package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +13 -0
  54. package/dist/sharedUtils/gen/core/ApiResult.d.ts +7 -0
  55. package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +26 -0
  56. package/dist/sharedUtils/gen/core/OpenAPI.d.ts +27 -0
  57. package/dist/sharedUtils/gen/core/request.d.ts +29 -0
  58. package/dist/sharedUtils/gen/index.d.ts +6 -0
  59. package/dist/sharedUtils/gen/schemas.gen.d.ts +7036 -0
  60. package/dist/sharedUtils/gen/services.gen.d.ts +6047 -0
  61. package/dist/sharedUtils/gen/types.gen.d.ts +21881 -0
  62. package/dist/sharedUtils/history.svelte.d.ts +9 -0
  63. package/dist/sharedUtils/hub.d.ts +49 -0
  64. package/dist/sharedUtils/jsr.json +6 -0
  65. package/dist/sharedUtils/lib.d.ts +5 -0
  66. package/dist/sharedUtils/lib.es.js +1588 -0
  67. package/dist/sharedUtils/package.json +12 -0
  68. package/dist/sharedUtils/schema.d.ts +3 -0
  69. package/dist/sharedUtils/stores.d.ts +97 -0
  70. package/dist/sharedUtils/svelte5Utils.svelte.d.ts +80 -0
  71. package/dist/sharedUtils/toast.d.ts +8 -0
  72. package/dist/sharedUtils/utils.d.ts +265 -0
  73. package/package/components/AppConnectInner.svelte +38 -5
  74. package/package/components/CompareWorkspaces.svelte +142 -486
  75. package/package/components/Editor.svelte +5 -4
  76. package/package/components/Editor.svelte.d.ts +1 -0
  77. package/package/components/FilterSearchbar.svelte +3 -1
  78. package/package/components/FilterSearchbar.svelte.d.ts +1 -0
  79. package/package/components/ForkWorkspaceBanner.svelte +16 -0
  80. package/package/components/LogViewer.svelte +51 -60
  81. package/package/components/OnBehalfOfSelector.svelte +10 -7
  82. package/package/components/ResourceEditor.svelte +198 -311
  83. package/package/components/ResourceEditor.svelte.d.ts +3 -3
  84. package/package/components/ResourceEditorDrawer.svelte +17 -6
  85. package/package/components/ResourceForm.svelte +235 -0
  86. package/package/components/ResourceForm.svelte.d.ts +25 -0
  87. package/package/components/RunsPage.svelte +1 -0
  88. package/package/components/ScriptBuilder.svelte +1 -0
  89. package/package/components/ScriptEditor.svelte +10 -3
  90. package/package/components/ScriptEditor.svelte.d.ts +1 -0
  91. package/package/components/TaggedTextInput.svelte +4 -1
  92. package/package/components/TaggedTextInput.svelte.d.ts +2 -0
  93. package/package/components/VariableEditor.svelte +177 -199
  94. package/package/components/VariableEditor.svelte.d.ts +1 -2
  95. package/package/components/VariableForm.svelte +133 -0
  96. package/package/components/VariableForm.svelte.d.ts +22 -0
  97. package/package/components/WsSpecificVersions.svelte +39 -0
  98. package/package/components/WsSpecificVersions.svelte.d.ts +9 -0
  99. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +0 -1
  100. package/package/components/apps/editor/AppEditorHeaderDeploy.svelte.d.ts +1 -1
  101. package/package/components/common/table/AppRow.svelte +2 -1
  102. package/package/components/common/table/AppRow.svelte.d.ts +1 -0
  103. package/package/components/common/table/FlowRow.svelte +2 -1
  104. package/package/components/common/table/FlowRow.svelte.d.ts +1 -0
  105. package/package/components/common/table/RawAppRow.svelte +2 -1
  106. package/package/components/common/table/RawAppRow.svelte.d.ts +1 -0
  107. package/package/components/common/table/Row.svelte +11 -3
  108. package/package/components/common/table/Row.svelte.d.ts +2 -1
  109. package/package/components/common/table/RowIcon.svelte +18 -2
  110. package/package/components/common/table/RowIcon.svelte.d.ts +1 -1
  111. package/package/components/common/table/ScriptRow.svelte +2 -1
  112. package/package/components/common/table/ScriptRow.svelte.d.ts +1 -0
  113. package/package/components/copilot/autocomplete/Autocompletor.d.ts +3 -1
  114. package/package/components/copilot/autocomplete/Autocompletor.js +5 -2
  115. package/package/components/copilot/autocomplete/request.d.ts +1 -0
  116. package/package/components/copilot/autocomplete/request.js +1 -1
  117. package/package/components/copilot/chat/AIChatManager.svelte.js +14 -4
  118. package/package/components/copilot/chat/AiChatLayout.svelte +2 -0
  119. package/package/components/copilot/chat/ContextManager.svelte.d.ts +1 -0
  120. package/package/components/copilot/chat/CreatedResourceActionDrawers.svelte +129 -0
  121. package/package/components/copilot/chat/CreatedResourceActionDrawers.svelte.d.ts +4 -0
  122. package/package/components/copilot/chat/ToolExecutionDisplay.svelte +14 -6
  123. package/package/components/copilot/chat/ToolMessageActions.svelte +73 -0
  124. package/package/components/copilot/chat/ToolMessageActions.svelte.d.ts +7 -0
  125. package/package/components/copilot/chat/createdResourceActions.svelte.d.ts +6 -0
  126. package/package/components/copilot/chat/createdResourceActions.svelte.js +29 -0
  127. package/package/components/copilot/chat/script/core.d.ts +6 -2
  128. package/package/components/copilot/chat/script/core.js +13 -7
  129. package/package/components/copilot/chat/script/wacPrompt.test.d.ts +1 -0
  130. package/package/components/copilot/chat/script/wacPrompt.test.js +25 -0
  131. package/package/components/copilot/chat/shared.d.ts +12 -0
  132. package/package/components/copilot/chat/shared.test.js +23 -2
  133. package/package/components/copilot/chat/workspaceTools.js +34 -4
  134. package/package/components/flows/content/ScriptEditorDrawer.svelte +1 -0
  135. package/package/components/graph/wacToFlow.js +1 -1
  136. package/package/components/graph/wacToFlow.test.d.ts +1 -0
  137. package/package/components/graph/wacToFlow.test.js +17 -0
  138. package/package/components/home/Item.svelte +5 -1
  139. package/package/components/home/Item.svelte.d.ts +1 -0
  140. package/package/components/home/ItemsList.svelte +260 -3
  141. package/package/components/instanceSettings/SecretBackendConfig.svelte +457 -88
  142. package/package/components/runs/useJobsLoader.svelte.js +5 -11
  143. package/package/components/sidebar/WorkspaceMenu.svelte +19 -5
  144. package/package/externalDomain.d.ts +2 -0
  145. package/package/externalDomain.js +16 -0
  146. package/package/gen/core/OpenAPI.js +1 -1
  147. package/package/gen/types.gen.d.ts +0 -112
  148. package/package/hubPaths.json +2 -2
  149. package/package/system_prompts/index.d.ts +1 -1
  150. package/package/system_prompts/index.js +22 -3
  151. package/package/system_prompts/prompts.d.ts +2 -2
  152. package/package/system_prompts/prompts.js +6 -3
  153. package/package/utils_deployable.d.ts +162 -638
  154. package/package/utils_deployable.js +75 -143
  155. package/package/utils_workspace_deploy.d.ts +10 -4
  156. package/package/utils_workspace_deploy.js +167 -42
  157. package/package.json +7 -3
@@ -64,8 +64,13 @@ export async function existsTrigger(data, triggerKind) {
64
64
  * changes without flipping the target's enabled/disabled state. Schedules'
65
65
  * `EditSchedule` already lacks `enabled` on the backend, but stripping keeps
66
66
  * the intent explicit and matches the YAML/CLI round-trip behavior.
67
+ *
68
+ * Used by the legacy `kind === 'trigger'` path in `utils_workspace_deploy.ts`
69
+ * (the cross-workspace deploy UI). The merge-UI deploy goes through the
70
+ * shared `deployItem` in `windmill-utils-internal`, which applies its own
71
+ * `stripOperationalStateOnUpdate` at the dispatch layer.
67
72
  */
68
- function stripOperationalState(payload) {
73
+ export function stripOperationalState(payload) {
69
74
  const { mode: _mode, enabled: _enabled, ...rest } = payload;
70
75
  return rest;
71
76
  }
@@ -82,7 +87,7 @@ export async function getTriggersDeployData(kind, path, workspace, onBehalfOf) {
82
87
  });
83
88
  return {
84
89
  data: {
85
- ...stripOperationalState(sqsTrigger),
90
+ ...sqsTrigger,
86
91
  permissioned_as: onBehalfOf,
87
92
  preserve_permissioned_as: preservePermissionedAs
88
93
  },
@@ -97,7 +102,7 @@ export async function getTriggersDeployData(kind, path, workspace, onBehalfOf) {
97
102
  });
98
103
  return {
99
104
  data: {
100
- ...stripOperationalState(kafkaTrigger),
105
+ ...kafkaTrigger,
101
106
  permissioned_as: onBehalfOf,
102
107
  preserve_permissioned_as: preservePermissionedAs
103
108
  },
@@ -112,7 +117,7 @@ export async function getTriggersDeployData(kind, path, workspace, onBehalfOf) {
112
117
  });
113
118
  return {
114
119
  data: {
115
- ...stripOperationalState(mqttTrigger),
120
+ ...mqttTrigger,
116
121
  permissioned_as: onBehalfOf,
117
122
  preserve_permissioned_as: preservePermissionedAs
118
123
  },
@@ -127,7 +132,7 @@ export async function getTriggersDeployData(kind, path, workspace, onBehalfOf) {
127
132
  });
128
133
  return {
129
134
  data: {
130
- ...stripOperationalState(natsTrigger),
135
+ ...natsTrigger,
131
136
  permissioned_as: onBehalfOf,
132
137
  preserve_permissioned_as: preservePermissionedAs
133
138
  },
@@ -146,7 +151,7 @@ export async function getTriggersDeployData(kind, path, workspace, onBehalfOf) {
146
151
  gcpTrigger.delivery_config.audience = '';
147
152
  }
148
153
  const data = {
149
- ...stripOperationalState(gcpTrigger),
154
+ ...gcpTrigger,
150
155
  delivery_config: gcpTrigger.delivery_config ?? undefined,
151
156
  base_endpoint: gcpTrigger.delivery_type === 'push' ? `${window.location.origin}${base}` : undefined,
152
157
  permissioned_as: onBehalfOf,
@@ -165,7 +170,7 @@ export async function getTriggersDeployData(kind, path, workspace, onBehalfOf) {
165
170
  });
166
171
  return {
167
172
  data: {
168
- ...stripOperationalState(postgresTrigger),
173
+ ...postgresTrigger,
169
174
  permissioned_as: onBehalfOf,
170
175
  preserve_permissioned_as: preservePermissionedAs
171
176
  },
@@ -180,7 +185,7 @@ export async function getTriggersDeployData(kind, path, workspace, onBehalfOf) {
180
185
  });
181
186
  return {
182
187
  data: {
183
- ...stripOperationalState(websocketTrigger),
188
+ ...websocketTrigger,
184
189
  permissioned_as: onBehalfOf,
185
190
  preserve_permissioned_as: preservePermissionedAs
186
191
  },
@@ -195,7 +200,7 @@ export async function getTriggersDeployData(kind, path, workspace, onBehalfOf) {
195
200
  });
196
201
  return {
197
202
  data: {
198
- ...stripOperationalState(httpTrigger),
203
+ ...httpTrigger,
199
204
  permissioned_as: onBehalfOf,
200
205
  preserve_permissioned_as: preservePermissionedAs
201
206
  },
@@ -210,7 +215,7 @@ export async function getTriggersDeployData(kind, path, workspace, onBehalfOf) {
210
215
  });
211
216
  return {
212
217
  data: {
213
- ...stripOperationalState(azureTrigger),
218
+ ...azureTrigger,
214
219
  permissioned_as: onBehalfOf,
215
220
  preserve_permissioned_as: preservePermissionedAs
216
221
  },
@@ -225,7 +230,7 @@ export async function getTriggersDeployData(kind, path, workspace, onBehalfOf) {
225
230
  });
226
231
  return {
227
232
  data: {
228
- ...stripOperationalState(emailTrigger),
233
+ ...emailTrigger,
229
234
  permissioned_as: onBehalfOf,
230
235
  preserve_permissioned_as: preservePermissionedAs
231
236
  },
@@ -240,7 +245,7 @@ export async function getTriggersDeployData(kind, path, workspace, onBehalfOf) {
240
245
  });
241
246
  return {
242
247
  data: {
243
- ...stripOperationalState(schedulesTrigger),
248
+ ...schedulesTrigger,
244
249
  // permissioned_as is only set on create, not update
245
250
  permissioned_as: onBehalfOf,
246
251
  preserve_permissioned_as: preservePermissionedAs
@@ -251,156 +256,75 @@ export async function getTriggersDeployData(kind, path, workspace, onBehalfOf) {
251
256
  }
252
257
  throw new Error(`Unexpected trigger kind got: ${kind}`);
253
258
  }
259
+ /**
260
+ * Runtime fields stripped from the trigger/schedule diff so the drawer mirrors
261
+ * the backend's `compare_two_trigger_or_schedule` semantics — same set as
262
+ * `TRIGGER_COMPARE_IGNORE` and `stripTriggerOrScheduleRuntimeFields` in the
263
+ * shared deploy module.
264
+ */
265
+ const TRIGGER_RUNTIME_IGNORE = new Set([
266
+ 'workspace_id',
267
+ 'edited_by',
268
+ 'edited_at',
269
+ 'email',
270
+ 'error',
271
+ 'enabled',
272
+ 'mode',
273
+ 'server_id',
274
+ 'last_server_ping',
275
+ 'extra_perms',
276
+ 'permissioned_as',
277
+ // Server-managed (kept in sync with backend `TRIGGER_COMPARE_IGNORE`).
278
+ 'subscription_id',
279
+ 'push_auth_config'
280
+ ]);
281
+ function stripTriggerRuntimeFields(row) {
282
+ const out = {};
283
+ for (const [k, v] of Object.entries(row)) {
284
+ if (!TRIGGER_RUNTIME_IGNORE.has(k))
285
+ out[k] = v;
286
+ }
287
+ return out;
288
+ }
254
289
  export async function getTriggerValue(kind, path, workspace) {
290
+ let trigger;
255
291
  if (kind === 'sqs') {
256
- const { mode, script_path, is_flow, queue_url, aws_resource_path, message_attributes } = await SqsTriggerService.getSqsTrigger({
257
- workspace: workspace,
258
- path: path
259
- });
260
- return {
261
- mode,
262
- script_path,
263
- is_flow,
264
- queue_url,
265
- aws_resource_path,
266
- message_attributes
267
- };
292
+ trigger = await SqsTriggerService.getSqsTrigger({ workspace, path });
268
293
  }
269
294
  else if (kind === 'kafka') {
270
- const { mode, script_path, is_flow, kafka_resource_path, topics, group_id } = await KafkaTriggerService.getKafkaTrigger({
271
- workspace: workspace,
272
- path: path
273
- });
274
- return {
275
- mode,
276
- script_path,
277
- is_flow,
278
- kafka_resource_path,
279
- topics,
280
- group_id
281
- };
295
+ trigger = await KafkaTriggerService.getKafkaTrigger({ workspace, path });
282
296
  }
283
297
  else if (kind === 'mqtt') {
284
- const { mode, script_path, is_flow, mqtt_resource_path, v3_config, v5_config, client_id, subscribe_topics, client_version } = await MqttTriggerService.getMqttTrigger({
285
- workspace: workspace,
286
- path: path
287
- });
288
- return {
289
- mode,
290
- script_path,
291
- is_flow,
292
- mqtt_resource_path,
293
- v3_config,
294
- v5_config,
295
- client_id,
296
- subscribe_topics,
297
- client_version
298
- };
298
+ trigger = await MqttTriggerService.getMqttTrigger({ workspace, path });
299
299
  }
300
300
  else if (kind === 'nats') {
301
- const { mode, script_path, is_flow, nats_resource_path, use_jetstream, stream_name, consumer_name, subjects } = await NatsTriggerService.getNatsTrigger({
302
- workspace: workspace,
303
- path: path
304
- });
305
- return {
306
- mode,
307
- script_path,
308
- is_flow,
309
- nats_resource_path,
310
- use_jetstream,
311
- stream_name,
312
- consumer_name,
313
- subjects
314
- };
301
+ trigger = await NatsTriggerService.getNatsTrigger({ workspace, path });
315
302
  }
316
303
  else if (kind === 'postgres') {
317
- const { mode, script_path, is_flow, postgres_resource_path, replication_slot_name, publication_name } = await PostgresTriggerService.getPostgresTrigger({
318
- workspace: workspace,
319
- path: path
320
- });
321
- return {
322
- mode,
323
- script_path,
324
- is_flow,
325
- postgres_resource_path,
326
- replication_slot_name,
327
- publication_name
328
- };
304
+ trigger = await PostgresTriggerService.getPostgresTrigger({ workspace, path });
329
305
  }
330
306
  else if (kind === 'gcp') {
331
- const { mode, script_path, is_flow, gcp_resource_path } = await GcpTriggerService.getGcpTrigger({
332
- workspace: workspace,
333
- path: path
334
- });
335
- return {
336
- mode,
337
- script_path,
338
- is_flow,
339
- gcp_resource_path
340
- };
307
+ trigger = await GcpTriggerService.getGcpTrigger({ workspace, path });
341
308
  }
342
309
  else if (kind === 'websockets') {
343
- const { mode, script_path, is_flow, url, url_runnable_args, can_return_message, filters, initial_messages } = await WebsocketTriggerService.getWebsocketTrigger({
344
- workspace: workspace,
345
- path: path
346
- });
347
- return {
348
- mode,
349
- script_path,
350
- is_flow,
351
- url,
352
- url_runnable_args,
353
- can_return_message,
354
- filters,
355
- initial_messages
356
- };
310
+ trigger = await WebsocketTriggerService.getWebsocketTrigger({ workspace, path });
357
311
  }
358
312
  else if (kind === 'routes') {
359
- const { script_path, is_flow, http_method, route_path, static_asset_config, request_type, authentication_method, is_static_website, authentication_resource_path } = await HttpTriggerService.getHttpTrigger({
360
- workspace: workspace,
361
- path: path
362
- });
363
- return {
364
- script_path,
365
- is_flow,
366
- http_method,
367
- route_path,
368
- static_asset_config,
369
- request_type,
370
- authentication_method,
371
- is_static_website,
372
- authentication_resource_path
373
- };
313
+ trigger = await HttpTriggerService.getHttpTrigger({ workspace, path });
374
314
  }
375
315
  else if (kind === 'schedules') {
376
- const { script_path, is_flow, on_failure, schedule, timezone, on_failure_times, on_failure_exact, on_failure_extra_args, on_recovery, on_recovery_times, on_recovery_extra_args, on_success, on_success_extra_args, ws_error_handler_muted, retry, summary, no_flow_overlap, tag, paused_until, cron_version } = await ScheduleService.getSchedule({
377
- workspace: workspace,
378
- path: path
379
- });
380
- return {
381
- script_path,
382
- is_flow,
383
- on_failure,
384
- schedule,
385
- timezone,
386
- on_failure_times,
387
- on_failure_exact,
388
- on_failure_extra_args,
389
- on_recovery,
390
- on_recovery_times,
391
- on_recovery_extra_args,
392
- on_success,
393
- on_success_extra_args,
394
- ws_error_handler_muted,
395
- retry,
396
- summary,
397
- no_flow_overlap,
398
- tag,
399
- paused_until,
400
- cron_version
401
- };
316
+ trigger = await ScheduleService.getSchedule({ workspace, path });
402
317
  }
403
- throw new Error(`Unexpected trigger kind got: ${kind}`);
318
+ else if (kind === 'azure') {
319
+ trigger = await AzureTriggerService.getAzureTrigger({ workspace, path });
320
+ }
321
+ else if (kind === 'emails') {
322
+ trigger = await EmailTriggerService.getEmailTrigger({ workspace, path });
323
+ }
324
+ else {
325
+ throw new Error(`Unexpected trigger kind got: ${kind}`);
326
+ }
327
+ return stripTriggerRuntimeFields(trigger);
404
328
  }
405
329
  /**
406
330
  * Get the permissioned_as for a trigger (used for on_behalf_of during deployment).
@@ -443,6 +367,14 @@ export async function getTriggerPermissionedAs(kind, path, workspace) {
443
367
  const trigger = await ScheduleService.getSchedule({ workspace, path });
444
368
  return trigger.permissioned_as;
445
369
  }
370
+ else if (kind === 'azure') {
371
+ const trigger = await AzureTriggerService.getAzureTrigger({ workspace, path });
372
+ return trigger.permissioned_as;
373
+ }
374
+ else if (kind === 'emails') {
375
+ const trigger = await EmailTriggerService.getEmailTrigger({ workspace, path });
376
+ return trigger.permissioned_as;
377
+ }
446
378
  }
447
379
  catch {
448
380
  // Trigger may not exist in the workspace
@@ -1,11 +1,16 @@
1
1
  import { type AdditionalInformation, type Kind } from './utils_deployable';
2
- import { type DeployResult } from 'windmill-utils-internal';
3
- export type { DeployResult };
2
+ import { type DeployKind, type DeployResult, type TriggerDeployKind } from 'windmill-utils-internal';
3
+ export type { DeployResult, DeployKind, TriggerDeployKind };
4
4
  export interface DeployItemParams {
5
5
  kind: Kind;
6
6
  path: string;
7
7
  workspaceFrom: string;
8
8
  workspaceTo: string;
9
+ /**
10
+ * Carries the trigger sub-kind for the legacy generic `kind: 'trigger'` path
11
+ * used by `DeployWorkspace.svelte`. Not needed for the new per-kind names
12
+ * (`http_trigger`, `kafka_trigger`, …) returned by the fork-merge compare API.
13
+ */
9
14
  additionalInformation?: AdditionalInformation;
10
15
  /**
11
16
  * The value to use for on_behalf_of when deploying.
@@ -18,8 +23,9 @@ export interface DeployItemParams {
18
23
  onBehalfOf?: string;
19
24
  }
20
25
  /**
21
- * Deploy an item from one workspace to another.
22
- * Handles all item kinds: flow, script, app, variable, resource, resource_type, folder, trigger.
26
+ * Deploy an item from one workspace to another. Handles every kind in the shared
27
+ * `DeployKind` union plus the legacy generic `'trigger'` from `DeployWorkspace.svelte`,
28
+ * which carries its sub-kind in `additionalInformation`.
23
29
  */
24
30
  export declare function deployItem(params: DeployItemParams): Promise<DeployResult>;
25
31
  /**
@@ -1,9 +1,123 @@
1
- import { AppService, FlowService, FolderService, ResourceService, ScheduleService, ScriptService, VariableService } from './gen';
2
- import { existsTrigger, getTriggersDeployData, getTriggerPermissionedAs, getTriggerValue } from './utils_deployable';
1
+ import { AppService, AzureTriggerService, EmailTriggerService, FlowService, FolderService, GcpTriggerService, HttpTriggerService, KafkaTriggerService, MqttTriggerService, NatsTriggerService, PostgresTriggerService, ResourceService, ScheduleService, ScriptService, SqsTriggerService, VariableService, WebsocketTriggerService } from './gen';
2
+ import { existsTrigger, getTriggersDeployData, getTriggerPermissionedAs, getTriggerValue, stripOperationalState } from './utils_deployable';
3
3
  import { deployItem as sharedDeployItem, deleteItemInWorkspace as sharedDeleteItem, checkItemExists as sharedCheckItemExists, getOnBehalfOf as sharedGetOnBehalfOf, getItemValue as sharedGetItemValue } from 'windmill-utils-internal';
4
4
  // ---------------------------------------------------------------------------
5
5
  // Provider adapter — wraps frontend's class-based services
6
6
  // ---------------------------------------------------------------------------
7
+ /**
8
+ * Map a shared `TriggerDeployKind` (e.g. `kafka_trigger`) to the per-kind
9
+ * service class. Per-kind dispatch lives in the adapter so the shared
10
+ * `deployItem` only needs to know "trigger" vs "not trigger".
11
+ */
12
+ function triggerServiceFor(kind) {
13
+ switch (kind) {
14
+ case 'http_trigger':
15
+ return {
16
+ exists: HttpTriggerService.existsHttpTrigger,
17
+ get: HttpTriggerService.getHttpTrigger,
18
+ create: HttpTriggerService.createHttpTrigger,
19
+ update: HttpTriggerService.updateHttpTrigger,
20
+ delete: HttpTriggerService.deleteHttpTrigger
21
+ };
22
+ case 'websocket_trigger':
23
+ return {
24
+ exists: WebsocketTriggerService.existsWebsocketTrigger,
25
+ get: WebsocketTriggerService.getWebsocketTrigger,
26
+ create: WebsocketTriggerService.createWebsocketTrigger,
27
+ update: WebsocketTriggerService.updateWebsocketTrigger,
28
+ delete: WebsocketTriggerService.deleteWebsocketTrigger
29
+ };
30
+ case 'kafka_trigger':
31
+ return {
32
+ exists: KafkaTriggerService.existsKafkaTrigger,
33
+ get: KafkaTriggerService.getKafkaTrigger,
34
+ create: KafkaTriggerService.createKafkaTrigger,
35
+ update: KafkaTriggerService.updateKafkaTrigger,
36
+ delete: KafkaTriggerService.deleteKafkaTrigger
37
+ };
38
+ case 'nats_trigger':
39
+ return {
40
+ exists: NatsTriggerService.existsNatsTrigger,
41
+ get: NatsTriggerService.getNatsTrigger,
42
+ create: NatsTriggerService.createNatsTrigger,
43
+ update: NatsTriggerService.updateNatsTrigger,
44
+ delete: NatsTriggerService.deleteNatsTrigger
45
+ };
46
+ case 'postgres_trigger':
47
+ return {
48
+ exists: PostgresTriggerService.existsPostgresTrigger,
49
+ get: PostgresTriggerService.getPostgresTrigger,
50
+ create: PostgresTriggerService.createPostgresTrigger,
51
+ update: PostgresTriggerService.updatePostgresTrigger,
52
+ delete: PostgresTriggerService.deletePostgresTrigger
53
+ };
54
+ case 'mqtt_trigger':
55
+ return {
56
+ exists: MqttTriggerService.existsMqttTrigger,
57
+ get: MqttTriggerService.getMqttTrigger,
58
+ create: MqttTriggerService.createMqttTrigger,
59
+ update: MqttTriggerService.updateMqttTrigger,
60
+ delete: MqttTriggerService.deleteMqttTrigger
61
+ };
62
+ case 'sqs_trigger':
63
+ return {
64
+ exists: SqsTriggerService.existsSqsTrigger,
65
+ get: SqsTriggerService.getSqsTrigger,
66
+ create: SqsTriggerService.createSqsTrigger,
67
+ update: SqsTriggerService.updateSqsTrigger,
68
+ delete: SqsTriggerService.deleteSqsTrigger
69
+ };
70
+ case 'gcp_trigger':
71
+ return {
72
+ exists: GcpTriggerService.existsGcpTrigger,
73
+ get: GcpTriggerService.getGcpTrigger,
74
+ create: GcpTriggerService.createGcpTrigger,
75
+ update: GcpTriggerService.updateGcpTrigger,
76
+ delete: GcpTriggerService.deleteGcpTrigger
77
+ };
78
+ case 'azure_trigger':
79
+ return {
80
+ exists: AzureTriggerService.existsAzureTrigger,
81
+ get: AzureTriggerService.getAzureTrigger,
82
+ create: AzureTriggerService.createAzureTrigger,
83
+ update: AzureTriggerService.updateAzureTrigger,
84
+ delete: AzureTriggerService.deleteAzureTrigger
85
+ };
86
+ case 'email_trigger':
87
+ return {
88
+ exists: EmailTriggerService.existsEmailTrigger,
89
+ get: EmailTriggerService.getEmailTrigger,
90
+ create: EmailTriggerService.createEmailTrigger,
91
+ update: EmailTriggerService.updateEmailTrigger,
92
+ delete: EmailTriggerService.deleteEmailTrigger
93
+ };
94
+ default: {
95
+ // Exhaustiveness guard: extending TriggerDeployKind without a case here
96
+ // produces a compile error rather than a silent runtime failure.
97
+ const _exhaustive = kind;
98
+ throw new Error(`Unhandled trigger kind: ${_exhaustive}`);
99
+ }
100
+ }
101
+ }
102
+ /**
103
+ * Map the shared `TriggerDeployKind` to the legacy frontend `TriggerKind`
104
+ * used by helpers in `utils_deployable.ts`.
105
+ */
106
+ function legacyTriggerKind(kind) {
107
+ const map = {
108
+ http_trigger: 'routes',
109
+ websocket_trigger: 'websockets',
110
+ kafka_trigger: 'kafka',
111
+ nats_trigger: 'nats',
112
+ postgres_trigger: 'postgres',
113
+ mqtt_trigger: 'mqtt',
114
+ sqs_trigger: 'sqs',
115
+ gcp_trigger: 'gcp',
116
+ azure_trigger: 'azure',
117
+ email_trigger: 'emails'
118
+ };
119
+ return map[kind];
120
+ }
7
121
  function makeProvider() {
8
122
  return {
9
123
  existsFlowByPath: (p) => FlowService.existsFlowByPath(p),
@@ -43,27 +157,61 @@ function makeProvider() {
43
157
  getFolder: (p) => FolderService.getFolder(p),
44
158
  createFolder: (p) => FolderService.createFolder(p),
45
159
  updateFolder: (p) => FolderService.updateFolder(p),
46
- deleteFolder: (p) => FolderService.deleteFolder(p)
160
+ deleteFolder: (p) => FolderService.deleteFolder(p),
161
+ // Triggers
162
+ existsTriggerByKind: (kind, p) => triggerServiceFor(kind).exists(p),
163
+ getTriggerForDeploy: async (kind, p) => {
164
+ // Reuses the existing per-kind transform map (e.g. GCP wipes
165
+ // subscription_id and computes base_endpoint from window.location).
166
+ // Operational-state strip is applied by the shared `deployItem`
167
+ // after this returns.
168
+ const { data } = await getTriggersDeployData(legacyTriggerKind(kind), p.path, p.workspace, p.onBehalfOf);
169
+ return data;
170
+ },
171
+ createTriggerByKind: (kind, p) => triggerServiceFor(kind).create(p),
172
+ updateTriggerByKind: (kind, p) => triggerServiceFor(kind).update(p),
173
+ deleteTriggerByKind: (kind, p) => triggerServiceFor(kind).delete(p),
174
+ getTriggerValue: (kind, p) => getTriggerValue(legacyTriggerKind(kind), p.path, p.workspace),
175
+ getTriggerPermissionedAs: async (kind, p) => {
176
+ const trigger = await triggerServiceFor(kind).get(p);
177
+ return trigger?.permissioned_as;
178
+ },
179
+ // Schedules
180
+ existsSchedule: (p) => ScheduleService.existsSchedule(p),
181
+ getSchedule: (p) => ScheduleService.getSchedule(p),
182
+ createSchedule: (p) => ScheduleService.createSchedule(p),
183
+ updateSchedule: (p) => ScheduleService.updateSchedule(p),
184
+ deleteSchedule: (p) => ScheduleService.deleteSchedule(p)
47
185
  };
48
186
  }
49
187
  /**
50
- * Deploy an item from one workspace to another.
51
- * Handles all item kinds: flow, script, app, variable, resource, resource_type, folder, trigger.
188
+ * Deploy an item from one workspace to another. Handles every kind in the shared
189
+ * `DeployKind` union plus the legacy generic `'trigger'` from `DeployWorkspace.svelte`,
190
+ * which carries its sub-kind in `additionalInformation`.
52
191
  */
53
192
  export async function deployItem(params) {
54
193
  const { kind, path, workspaceFrom, workspaceTo, additionalInformation, onBehalfOf } = params;
55
- // Triggers are frontend-specific (not in the shared module)
56
194
  if (kind === 'trigger') {
195
+ // Legacy path: `DeployWorkspace.svelte` doesn't know the per-kind trigger
196
+ // name when building dependency graphs, so it passes `kind: 'trigger'` and
197
+ // the actual sub-kind in `additionalInformation`. Translate to per-kind.
57
198
  if (!additionalInformation?.triggers) {
58
199
  return { success: false, error: 'Missing triggers kind' };
59
200
  }
60
201
  try {
61
- const alreadyExists = await checkItemExists(kind, path, workspaceTo, additionalInformation);
202
+ const alreadyExists = await existsTrigger({ workspace: workspaceTo, path }, additionalInformation.triggers.kind);
62
203
  const { data, createFn, updateFn } = await getTriggersDeployData(additionalInformation.triggers.kind, path, workspaceFrom, onBehalfOf);
63
204
  if (alreadyExists) {
64
- await updateFn({ path, workspace: workspaceTo, requestBody: data });
205
+ // Strip operational state so the update doesn't flip the target's
206
+ // existing enabled/mode flag — preserved via `is_mode_unspecified()`
207
+ // on the backend. Mirrors the shared `stripOperationalStateOnUpdate`
208
+ // in the merge-deploy path.
209
+ const stripped = stripOperationalState(data);
210
+ await updateFn({ path, workspace: workspaceTo, requestBody: stripped });
65
211
  }
66
212
  else {
213
+ // Create — pass source's `mode`/`enabled` through so a new
214
+ // trigger lands with the state the source workspace had.
67
215
  await createFn({ workspace: workspaceTo, requestBody: data });
68
216
  }
69
217
  return { success: true };
@@ -86,31 +234,11 @@ export async function deleteItemInWorkspace(kind, path, workspace) {
86
234
  * Check if an item already exists in the target workspace.
87
235
  */
88
236
  export async function checkItemExists(kind, path, workspace, additionalInformation) {
89
- // Triggers and schedules are frontend-specific
90
- if (kind === 'schedule') {
91
- return ScheduleService.existsSchedule({ workspace, path });
92
- }
93
- else if (kind === 'trigger') {
94
- const triggersKind = [
95
- 'kafka',
96
- 'mqtt',
97
- 'nats',
98
- 'postgres',
99
- 'routes',
100
- 'schedules',
101
- 'sqs',
102
- 'websockets',
103
- 'gcp',
104
- 'azure',
105
- 'emails'
106
- ];
107
- if (additionalInformation?.triggers &&
108
- triggersKind.includes(additionalInformation.triggers.kind)) {
109
- return existsTrigger({ workspace, path }, additionalInformation.triggers.kind);
110
- }
111
- else {
112
- throw new Error(`Unexpected triggers kind, expected one of: '${triggersKind.join(', ')}' got: ${additionalInformation?.triggers?.kind}`);
237
+ if (kind === 'trigger') {
238
+ if (!additionalInformation?.triggers) {
239
+ throw new Error('Missing triggers kind for legacy trigger deploy');
113
240
  }
241
+ return existsTrigger({ workspace, path }, additionalInformation.triggers.kind);
114
242
  }
115
243
  return sharedCheckItemExists(makeProvider(), kind, path, workspace);
116
244
  }
@@ -118,17 +246,15 @@ export async function checkItemExists(kind, path, workspace, additionalInformati
118
246
  * Get the value of an item for diff comparison.
119
247
  */
120
248
  export async function getItemValue(kind, path, workspace, additionalInformation) {
121
- // Triggers are frontend-specific
122
249
  if (kind === 'trigger') {
123
- if (additionalInformation?.triggers) {
124
- try {
125
- return await getTriggerValue(additionalInformation.triggers.kind, path, workspace);
126
- }
127
- catch {
128
- return {};
129
- }
250
+ if (!additionalInformation?.triggers)
251
+ return {};
252
+ try {
253
+ return await getTriggerValue(additionalInformation.triggers.kind, path, workspace);
254
+ }
255
+ catch {
256
+ return {};
130
257
  }
131
- return {};
132
258
  }
133
259
  return sharedGetItemValue(makeProvider(), kind, path, workspace);
134
260
  }
@@ -136,7 +262,6 @@ export async function getItemValue(kind, path, workspace, additionalInformation)
136
262
  * Get the on_behalf_of value for a deployable item.
137
263
  */
138
264
  export async function getOnBehalfOf(kind, path, workspace, additionalInformation) {
139
- // Triggers are frontend-specific
140
265
  if (kind === 'trigger' && additionalInformation?.triggers) {
141
266
  try {
142
267
  return await getTriggerPermissionedAs(additionalInformation.triggers.kind, path, workspace);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "windmill-components",
3
- "version": "1.695.1",
3
+ "version": "1.698.0",
4
4
  "scripts": {
5
5
  "dev": "vite dev",
6
6
  "build": "vite build",
@@ -159,11 +159,11 @@
159
159
  "windmill-parser-wasm-regex": "1.692.0",
160
160
  "windmill-parser-wasm-ruby": "1.526.1",
161
161
  "windmill-parser-wasm-rust": "1.647.1",
162
- "windmill-parser-wasm-ts": "1.693.1",
162
+ "windmill-parser-wasm-ts": "1.695.0",
163
163
  "windmill-parser-wasm-wac": "1.668.6",
164
164
  "windmill-parser-wasm-yaml": "1.593.0",
165
165
  "windmill-sql-datatype-parser-wasm": "1.512.0",
166
- "windmill-utils-internal": "^1.4.0",
166
+ "windmill-utils-internal": "^1.7.0",
167
167
  "xterm": "^5.3.0",
168
168
  "xterm-readline": "^1.1.2",
169
169
  "y-monaco": "^0.1.4",
@@ -379,6 +379,10 @@
379
379
  "types": "./package/stores.d.ts",
380
380
  "default": "./package/stores.js"
381
381
  },
382
+ "./externalDomain": {
383
+ "types": "./package/externalDomain.d.ts",
384
+ "default": "./package/externalDomain.js"
385
+ },
382
386
  "./gen": {
383
387
  "types": "./package/gen/index.d.ts",
384
388
  "default": "./package/gen/index.js"