windmill-components 1.511.1 → 1.522.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 (232) hide show
  1. package/package/components/AppConnectInner.svelte.d.ts +1 -1
  2. package/package/components/ArgInput.svelte +42 -14
  3. package/package/components/ArgInput.svelte.d.ts +2 -10
  4. package/package/components/AssignableTagsInner.svelte +5 -0
  5. package/package/components/AuthSettings.svelte +4 -2
  6. package/package/components/AuthSettings.svelte.d.ts +1 -0
  7. package/package/components/DBManagerDrawer.svelte +154 -151
  8. package/package/components/DBManagerDrawer.svelte.d.ts +2 -2
  9. package/package/components/DBTable.svelte +3 -3
  10. package/package/components/DBTable.svelte.d.ts +1 -0
  11. package/package/components/DBTableEditor.svelte +7 -7
  12. package/package/components/DBTableEditor.svelte.d.ts +1 -1
  13. package/package/components/DeployWorkspace.svelte +1 -1
  14. package/package/components/DisplayResult.svelte +34 -8
  15. package/package/components/DisplayResult.svelte.d.ts +4 -1
  16. package/package/components/DynSelect.svelte +58 -34
  17. package/package/components/DynSelect.svelte.d.ts +3 -11
  18. package/package/components/EditableSchemaForm.svelte +126 -6
  19. package/package/components/EditableSchemaForm.svelte.d.ts +5 -1
  20. package/package/components/Editor.svelte +1 -1
  21. package/package/components/EditorBar.svelte +82 -4
  22. package/package/components/ErrorOrRecoveryHandler.svelte +76 -8
  23. package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +2 -1
  24. package/package/components/ExploreAssetButton.svelte +14 -4
  25. package/package/components/ExploreAssetButton.svelte.d.ts +1 -0
  26. package/package/components/FlowJobResult.svelte +3 -3
  27. package/package/components/FlowJobResult.svelte.d.ts +1 -0
  28. package/package/components/FlowPreviewContent.svelte +9 -1
  29. package/package/components/FlowPreviewResult.svelte +4 -1
  30. package/package/components/FlowPreviewResult.svelte.d.ts +1 -0
  31. package/package/components/FlowStatusViewerInner.svelte +21 -3
  32. package/package/components/FlowStatusViewerInner.svelte.d.ts +7 -1
  33. package/package/components/FolderEditor.svelte +1 -1
  34. package/package/components/GitDiffPreview.svelte +14 -18
  35. package/package/components/GitDiffPreview.svelte.d.ts +2 -8
  36. package/package/components/GitHubAppIntegration.svelte +3 -1
  37. package/package/components/IdEditorInput.svelte +25 -22
  38. package/package/components/IdEditorInput.svelte.d.ts +11 -23
  39. package/package/components/InstanceSetting.svelte +7 -2
  40. package/package/components/InstanceSettings.svelte +1 -0
  41. package/package/components/JobLoader.svelte +48 -5
  42. package/package/components/JobLoader.svelte.d.ts +7 -2
  43. package/package/components/Login.svelte +8 -2
  44. package/package/components/MemoryFootprintViewer.svelte +1 -1
  45. package/package/components/ModulePreviewResultViewer.svelte +2 -2
  46. package/package/components/MoveDrawer.svelte.d.ts +2 -2
  47. package/package/components/NextcloudSetting.svelte +84 -0
  48. package/package/components/NextcloudSetting.svelte.d.ts +7 -0
  49. package/package/components/ObjectResourceInput.svelte +3 -2
  50. package/package/components/ObjectResourceInput.svelte.d.ts +1 -0
  51. package/package/components/ParqetCsvTableRenderer.svelte +1 -1
  52. package/package/components/ResourceEditor.svelte +1 -1
  53. package/package/components/ResourcePicker.svelte +8 -1
  54. package/package/components/ResourcePicker.svelte.d.ts +1 -0
  55. package/package/components/ResultStreamDisplay.svelte +5 -0
  56. package/package/components/ResultStreamDisplay.svelte.d.ts +5 -0
  57. package/package/components/RunForm.svelte +9 -1
  58. package/package/components/SchemaForm.svelte +2 -2
  59. package/package/components/SchemaForm.svelte.d.ts +2 -10
  60. package/package/components/ScriptBuilder.svelte +13 -8
  61. package/package/components/ScriptBuilder.svelte.d.ts +1 -1
  62. package/package/components/ScriptEditor.svelte.d.ts +1 -1
  63. package/package/components/ScriptWrapper.svelte +1 -1
  64. package/package/components/ShareModal.svelte.d.ts +1 -1
  65. package/package/components/SimpleAgTable.svelte +2 -0
  66. package/package/components/SimpleAgTable.svelte.d.ts +2 -0
  67. package/package/components/SqlRepl.svelte +21 -7
  68. package/package/components/SqlRepl.svelte.d.ts +2 -2
  69. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  70. package/package/components/WorkerTagSelect.svelte +70 -1
  71. package/package/components/apps/components/display/AppDisplayComponent.svelte +13 -1
  72. package/package/components/apps/components/display/AppText.svelte +2 -2
  73. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +8 -1
  74. package/package/components/apps/components/display/dbtable/InsertRow.svelte +5 -4
  75. package/package/components/apps/components/display/dbtable/queries/count.js +11 -1
  76. package/package/components/apps/components/display/dbtable/queries/createTable.d.ts +1 -1
  77. package/package/components/apps/components/display/dbtable/queries/createTable.js +3 -3
  78. package/package/components/apps/components/display/dbtable/queries/delete.js +7 -0
  79. package/package/components/apps/components/display/dbtable/queries/insert.js +2 -0
  80. package/package/components/apps/components/display/dbtable/queries/select.js +14 -0
  81. package/package/components/apps/components/display/dbtable/queries/update.js +7 -0
  82. package/package/components/apps/components/display/dbtable/utils.d.ts +6 -5
  83. package/package/components/apps/components/display/dbtable/utils.js +52 -28
  84. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +1 -1
  85. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +1 -0
  86. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte.d.ts +1 -0
  87. package/package/components/apps/components/display/table/AppAggridTable.svelte +5 -4
  88. package/package/components/apps/components/display/table/AppAggridTable.svelte.d.ts +1 -0
  89. package/package/components/apps/components/display/table/utils.js +7 -4
  90. package/package/components/apps/components/helpers/HiddenComponent.svelte +2 -2
  91. package/package/components/apps/components/helpers/RunnableComponent.svelte +4 -1
  92. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +2 -1
  93. package/package/components/apps/components/inputs/AppS3FileInput.svelte +2 -2
  94. package/package/components/apps/components/layout/AppDecisionTree.svelte +1 -1
  95. package/package/components/apps/components/layout/AppStepper.svelte +1 -1
  96. package/package/components/apps/components/layout/AppTabs.svelte +1 -1
  97. package/package/components/apps/editor/AppEditorHeader.svelte +13 -2
  98. package/package/components/apps/editor/GridViewer.svelte +1 -0
  99. package/package/components/apps/editor/RunnableJobPanelInner.svelte +2 -1
  100. package/package/components/apps/editor/contextPanel/components/IdEditor.svelte +7 -7
  101. package/package/components/apps/editor/contextPanel/components/IdEditor.svelte.d.ts +7 -19
  102. package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +8 -12
  103. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
  104. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
  105. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
  106. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +3 -3
  107. package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte +1 -3
  108. package/package/components/assets/AssetsDropdownButton.svelte +1 -1
  109. package/package/components/assets/JobAssetsViewer.svelte +2 -2
  110. package/package/components/assets/lib.js +4 -0
  111. package/package/components/auditLogs/AuditLogsFilters.svelte +7 -9
  112. package/package/components/common/button/Button.svelte +4 -3
  113. package/package/components/common/button/Button.svelte.d.ts +1 -0
  114. package/package/components/common/confirmationModal/ConfirmationModal.svelte +6 -5
  115. package/package/components/common/confirmationModal/ConfirmationModal.svelte.d.ts +6 -11
  116. package/package/components/common/confirmationModal/asyncConfirmationModal.svelte.d.ts +26 -0
  117. package/package/components/common/confirmationModal/asyncConfirmationModal.svelte.js +50 -0
  118. package/package/components/common/modal/Modal.svelte +2 -5
  119. package/package/components/common/tabs/TabsV2.svelte +2 -1
  120. package/package/components/common/tabs/TabsV2.svelte.d.ts +1 -0
  121. package/package/components/copilot/chat/AIChatManager.svelte.js +61 -7
  122. package/package/components/copilot/chat/ContextTextarea.svelte +1 -1
  123. package/package/components/copilot/chat/script/core.js +28 -29
  124. package/package/components/copilot/chat/shared.d.ts +1 -1
  125. package/package/components/copilot/chat/shared.js +8 -2
  126. package/package/components/custom_ui.d.ts +2 -0
  127. package/package/components/dbOps.d.ts +20 -8
  128. package/package/components/dbOps.js +85 -40
  129. package/package/components/details/DetailPageHeader.svelte +0 -2
  130. package/package/components/flows/content/FlowInput.svelte +5 -0
  131. package/package/components/flows/content/FlowModuleScript.svelte +0 -1
  132. package/package/components/flows/idUtils.js +2 -1
  133. package/package/components/flows/map/FlowModuleSchemaItem.svelte +3 -3
  134. package/package/components/flows/map/FlowModuleSchemaMap.svelte +5 -0
  135. package/package/components/flows/map/InsertModuleButton.svelte +4 -1
  136. package/package/components/flows/propPicker/OutputBadge.svelte +5 -1
  137. package/package/components/flows/propPicker/OutputPickerInner.svelte +9 -5
  138. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +6 -2
  139. package/package/components/flows/propPicker/StepHistory.svelte +4 -1
  140. package/package/components/git_sync/DetectionFlow.svelte +202 -0
  141. package/package/components/git_sync/DetectionFlow.svelte.d.ts +6 -0
  142. package/package/components/git_sync/GitSyncContext.svelte.d.ts +82 -0
  143. package/package/components/git_sync/GitSyncContext.svelte.js +461 -0
  144. package/package/components/git_sync/GitSyncModalManager.svelte +99 -0
  145. package/package/components/git_sync/GitSyncModalManager.svelte.d.ts +18 -0
  146. package/package/components/git_sync/GitSyncRepositoryCard.svelte +339 -0
  147. package/package/components/git_sync/GitSyncRepositoryCard.svelte.d.ts +6 -0
  148. package/package/components/git_sync/GitSyncRepositoryList.svelte +17 -0
  149. package/package/components/git_sync/GitSyncRepositoryList.svelte.d.ts +18 -0
  150. package/package/components/git_sync/GitSyncSection.svelte +89 -0
  151. package/package/components/git_sync/GitSyncSection.svelte.d.ts +3 -0
  152. package/package/components/git_sync/GitSyncSuccessModal.svelte +58 -0
  153. package/package/components/git_sync/GitSyncSuccessModal.svelte.d.ts +7 -0
  154. package/package/components/git_sync/PullWorkspaceModal.svelte +575 -0
  155. package/package/components/git_sync/PullWorkspaceModal.svelte.d.ts +15 -0
  156. package/package/components/git_sync/PushWorkspaceModal.svelte +320 -0
  157. package/package/components/git_sync/PushWorkspaceModal.svelte.d.ts +12 -0
  158. package/package/components/graph/FlowGraphV2.svelte +5 -1
  159. package/package/components/graph/graphBuilder.svelte.js +1 -1
  160. package/package/components/graph/renderers/nodes/AssetNode.svelte +4 -4
  161. package/package/components/icons/AssetDucklakeIcon.svelte +28 -0
  162. package/package/components/icons/AssetDucklakeIcon.svelte.d.ts +9 -0
  163. package/package/components/icons/AssetGenericIcon.svelte +3 -0
  164. package/package/components/icons/DucklakeIcon.svelte +18 -0
  165. package/package/components/icons/DucklakeIcon.svelte.d.ts +6 -0
  166. package/package/components/instanceSettings.js +11 -3
  167. package/package/components/runs/JobPreview.svelte +2 -2
  168. package/package/components/runs/NoWorkerWithTagWarning.svelte +3 -3
  169. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  170. package/package/components/schema/FlowPropertyEditor.svelte +3 -2
  171. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -1
  172. package/package/components/schema/PropertyEditor.svelte +0 -2
  173. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
  174. package/package/components/schema/SchemaFormDND.svelte +2 -1
  175. package/package/components/schema/SchemaFormDND.svelte.d.ts +2 -0
  176. package/package/components/scriptEditor/LogPanel.svelte +5 -3
  177. package/package/components/scriptEditor/LogPanel.svelte.d.ts +5 -1
  178. package/package/components/select/Select.svelte +7 -4
  179. package/package/components/select/Select.svelte.d.ts +5 -0
  180. package/package/components/select/SelectDropdown.svelte +2 -1
  181. package/package/components/select/SelectDropdown.svelte.d.ts +3 -0
  182. package/package/components/sidebar/changelogs.js +5 -0
  183. package/package/components/table/AutoDataTable.svelte +6 -4
  184. package/package/components/table/AutoDataTable.svelte.d.ts +1 -0
  185. package/package/components/table/DataTable.svelte +12 -10
  186. package/package/components/table/DataTable.svelte.d.ts +1 -0
  187. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +2 -2
  188. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +1 -1
  189. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte.d.ts +2 -1
  190. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +50 -11
  191. package/package/components/triggers/gcp/utils.js +1 -0
  192. package/package/components/triggers/http/utils.js +1 -1
  193. package/package/components/triggers/kafka/utils.js +1 -1
  194. package/package/components/triggers/mqtt/utils.js +1 -1
  195. package/package/components/triggers/nats/utils.js +1 -1
  196. package/package/components/triggers/postgres/utils.js +1 -1
  197. package/package/components/triggers/sqs/utils.js +1 -1
  198. package/package/components/triggers/utils.js +2 -1
  199. package/package/components/triggers/webhook/WebhooksConfigSection.svelte +24 -26
  200. package/package/components/triggers/webhook/WebhooksPanel.svelte +1 -15
  201. package/package/components/triggers/websocket/utils.js +1 -1
  202. package/package/components/workspaceSettings/AISettings.svelte +52 -36
  203. package/package/components/workspaceSettings/DucklakeSettings.svelte +321 -0
  204. package/package/components/workspaceSettings/DucklakeSettings.svelte.d.ts +23 -0
  205. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +122 -499
  206. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +8 -10
  207. package/package/consts.js +2 -1
  208. package/package/gen/core/OpenAPI.js +1 -1
  209. package/package/gen/schemas.gen.d.ts +7 -6
  210. package/package/gen/schemas.gen.js +7 -6
  211. package/package/gen/services.gen.d.ts +19 -1
  212. package/package/gen/services.gen.js +38 -0
  213. package/package/gen/types.gen.d.ts +78 -3
  214. package/package/git-sync.d.ts +36 -0
  215. package/package/git-sync.js +1 -0
  216. package/package/hub.d.ts +1 -0
  217. package/package/hubPaths.json +5 -2
  218. package/package/infer.js +3 -2
  219. package/package/script_helpers.d.ts +2 -2
  220. package/package/script_helpers.js +29 -11
  221. package/package/services/JobManager.d.ts +28 -0
  222. package/package/services/JobManager.js +114 -0
  223. package/package/stores.d.ts +1 -1
  224. package/package/utils.d.ts +18 -1
  225. package/package/utils.js +55 -2
  226. package/package.json +5 -4
  227. package/package/components/InitGitRepoPopover.svelte +0 -410
  228. package/package/components/InitGitRepoPopover.svelte.d.ts +0 -13
  229. package/package/components/PullGitRepoPopover.svelte +0 -355
  230. package/package/components/PullGitRepoPopover.svelte.d.ts +0 -18
  231. package/package/inferArgSig.d.ts +0 -42
  232. package/package/inferArgSig.js +0 -198
@@ -74,6 +74,6 @@ declare const ScriptEditor: $$__sveltets_2_IsomorphicComponent<Props, {
74
74
  setCollaborationMode: () => Promise<void>;
75
75
  disableCollaboration: () => void;
76
76
  updateArgs: (newArgs: Record<string, any>) => Promise<void>;
77
- }, "args" | "code" | "assets" | "schema" | "editor" | "selectedTab" | "diffEditor" | "hasPreprocessor" | "captureTable">;
77
+ }, "args" | "code" | "assets" | "schema" | "selectedTab" | "editor" | "diffEditor" | "hasPreprocessor" | "captureTable">;
78
78
  type ScriptEditor = InstanceType<typeof ScriptEditor>;
79
79
  export default ScriptEditor;
@@ -5,5 +5,5 @@ let script = $state(oldScript);
5
5
  </script>
6
6
 
7
7
  <AiChatLayout noPadding {disableAi}>
8
- <ScriptBuilder {script} {disableAi} {...props} />
8
+ <ScriptBuilder bind:script {disableAi} {...props} />
9
9
  </AiChatLayout>
@@ -16,7 +16,7 @@ declare const ShareModal: $$__sveltets_2_IsomorphicComponent<Record<string, neve
16
16
  } & {
17
17
  [evt: string]: CustomEvent<any>;
18
18
  }, {}, {
19
- openDrawer: (newPath: string, kind_l: "resource" | "script" | "flow" | "schedule" | "app" | "variable" | "group_" | "raw_app" | "http_trigger" | "websocket_trigger" | "kafka_trigger" | "nats_trigger" | "postgres_trigger" | "mqtt_trigger" | "gcp_trigger" | "sqs_trigger") => Promise<void>;
19
+ openDrawer: (newPath: string, kind_l: "resource" | "script" | "flow" | "app" | "variable" | "schedule" | "group_" | "raw_app" | "http_trigger" | "websocket_trigger" | "kafka_trigger" | "nats_trigger" | "postgres_trigger" | "mqtt_trigger" | "gcp_trigger" | "sqs_trigger") => Promise<void>;
20
20
  }, "">;
21
21
  type ShareModal = InstanceType<typeof ShareModal>;
22
22
  export default ShareModal;
@@ -1,4 +1,6 @@
1
1
  <script lang="ts">import { sendUserToast } from '../toast';
2
+ import 'ag-grid-community/styles/ag-grid.css';
3
+ import 'ag-grid-community/styles/ag-theme-alpine.css';
2
4
  import { createGrid } from 'ag-grid-community';
3
5
  import DarkModeObserver from './DarkModeObserver.svelte';
4
6
  import { untrack } from 'svelte';
@@ -1,3 +1,5 @@
1
+ import 'ag-grid-community/styles/ag-grid.css';
2
+ import 'ag-grid-community/styles/ag-theme-alpine.css';
1
3
  type Props = {
2
4
  data: Record<string, any>[];
3
5
  class?: string;
@@ -33,6 +33,12 @@ function splitSqlStatements(code) {
33
33
  }
34
34
  return statements;
35
35
  }
36
+ function pruneComments(code) {
37
+ return code
38
+ .replace(/--.*?(\r?\n|$)/g, '')
39
+ .replace(/\/\*[\s\S]*?\*\//g, '')
40
+ .trim();
41
+ }
36
42
  </script>
37
43
 
38
44
  <script lang="ts">import { CornerDownLeft, Loader2 } from 'lucide-svelte';
@@ -44,7 +50,9 @@ import { untrack } from 'svelte';
44
50
  import { getLanguageByResourceType } from './apps/components/display/dbtable/utils';
45
51
  import StepHistory, {} from './flows/propPicker/StepHistory.svelte';
46
52
  import { Pane, Splitpanes } from 'svelte-splitpanes';
47
- let { resourcePath, resourceType, onData, placeholderTableName } = $props();
53
+ import { getDbType, wrapDucklakeQuery } from './dbOps';
54
+ let { input, onData, placeholderTableName } = $props();
55
+ let dbType = $derived(getDbType(input));
48
56
  const DEFAULT_SQL = 'SELECT * FROM _';
49
57
  let code = $state(DEFAULT_SQL);
50
58
  $effect(() => {
@@ -60,7 +68,11 @@ async function run({ doPostgresRowToJsonFix } = {}) {
60
68
  return;
61
69
  isRunning = true;
62
70
  try {
63
- const statements = splitSqlStatements(code);
71
+ const statements = splitSqlStatements(pruneComments(code));
72
+ if (statements.length === 0) {
73
+ sendUserToast('Nothing to run', true);
74
+ return;
75
+ }
64
76
  // Transform all to JSON in case of select. This fixes the issue of
65
77
  // custom postgres enum type failing to convert to a rust type in the backend.
66
78
  // We don't always put the fix by default for row ordering concerns
@@ -75,14 +87,16 @@ async function run({ doPostgresRowToJsonFix } = {}) {
75
87
  })
76
88
  .join(';');
77
89
  }
90
+ const dbArg = input?.type === 'database' ? { database: '$res:' + input.resourcePath } : {};
91
+ if (input?.type === 'ducklake') {
92
+ transformedCode = wrapDucklakeQuery(transformedCode, input.ducklake);
93
+ }
78
94
  let { job, result } = (await runScriptAndPollResult({
79
95
  workspace: $workspaceStore,
80
96
  requestBody: {
81
- language: getLanguageByResourceType(resourceType),
97
+ language: getLanguageByResourceType(dbType),
82
98
  content: transformedCode,
83
- args: {
84
- database: '$res:' + resourcePath
85
- }
99
+ args: dbArg
86
100
  }
87
101
  }, { withJobData: true }));
88
102
  if (statements.length > 1) {
@@ -113,7 +127,7 @@ async function run({ doPostgresRowToJsonFix } = {}) {
113
127
  }
114
128
  catch (e) {
115
129
  console.error(e);
116
- if (resourceType === 'postgresql' && !doPostgresRowToJsonFix) {
130
+ if (dbType === 'postgresql' && !doPostgresRowToJsonFix) {
117
131
  console.error('Error running query, trying with row_to_json fix');
118
132
  isRunning = false;
119
133
  return await run({ doPostgresRowToJsonFix: true });
@@ -1,6 +1,6 @@
1
+ import { type DbInput } from './dbOps';
1
2
  type Props = {
2
- resourceType: string;
3
- resourcePath: string;
3
+ input: DbInput;
4
4
  onData: (data: Record<string, any>[]) => void;
5
5
  placeholderTableName?: string;
6
6
  };
@@ -15,6 +15,6 @@ interface Props {
15
15
  overrideAllowKindChange?: boolean;
16
16
  originalType?: string | undefined;
17
17
  }
18
- declare const StringTypeNarrowing: import("svelte").Component<Props, {}, "password" | "disableCreate" | "pattern" | "format" | "contentEncoding" | "customErrorMessage" | "dateFormat" | "enum_" | "enumLabels" | "minRows" | "disableVariablePicker">;
18
+ declare const StringTypeNarrowing: import("svelte").Component<Props, {}, "password" | "disableCreate" | "pattern" | "format" | "enum_" | "enumLabels" | "contentEncoding" | "customErrorMessage" | "dateFormat" | "minRows" | "disableVariablePicker">;
19
19
  type StringTypeNarrowing = ReturnType<typeof StringTypeNarrowing>;
20
20
  export default StringTypeNarrowing;
@@ -1,13 +1,26 @@
1
1
  <script lang="ts">import { workerTags, workspaceStore } from '../stores';
2
2
  import { WorkerService } from '../gen';
3
- import { createEventDispatcher } from 'svelte';
3
+ import { createEventDispatcher, onDestroy, onMount } from 'svelte';
4
4
  import Select from './select/Select.svelte';
5
5
  import { safeSelectItems } from './select/utils.svelte';
6
6
  import { Button } from './common';
7
7
  import { RotateCw } from 'lucide-svelte';
8
8
  import { sendUserToast } from '../toast';
9
+ import Popover from './Popover.svelte';
9
10
  let { tag = $bindable(), noLabel = false, nullTag = undefined, disabled = false, placeholder, inputClass } = $props();
10
11
  let loading = $state(false);
12
+ let visible = $state(false);
13
+ let timeout = undefined;
14
+ let tagsToWorkerExists = $state(undefined);
15
+ onMount(() => {
16
+ visible = true;
17
+ });
18
+ onDestroy(() => {
19
+ visible = false;
20
+ if (timeout) {
21
+ clearTimeout(timeout);
22
+ }
23
+ });
11
24
  loadWorkerGroups();
12
25
  const dispatch = createEventDispatcher();
13
26
  async function loadWorkerGroups(force = false) {
@@ -28,9 +41,64 @@ let items = $derived([
28
41
  ...(tag && tag != '' && !($workerTags ?? []).includes(tag) ? [tag] : []),
29
42
  ...($workerTags ?? [])
30
43
  ]);
44
+ let lastCheck = undefined;
45
+ async function loadTagsToWorkerExists(tags) {
46
+ if (lastCheck && Date.now() - lastCheck < 5000) {
47
+ return;
48
+ }
49
+ if (timeout) {
50
+ clearTimeout(timeout);
51
+ }
52
+ if (open) {
53
+ tagsToWorkerExists = await WorkerService.existsWorkersWithTags({ tags: tags.join(',') });
54
+ lastCheck = Date.now();
55
+ if (visible) {
56
+ timeout = setTimeout(() => {
57
+ loadTagsToWorkerExists(tags);
58
+ }, 5000);
59
+ }
60
+ }
61
+ }
62
+ // let finalItems = $derived(
63
+ // items.map((item) => {
64
+ // if (tagsToWorkerExists) {
65
+ // return {
66
+ // value: item,
67
+ // __select_group: tagsToWorkerExists[item]
68
+ // ? `${placeholder ?? 'Worker'}s available`
69
+ // : `No ${placeholder ?? 'Worker'}s`
70
+ // }
71
+ // }
72
+ // return item
73
+ // })
74
+ // )
75
+ $effect(() => {
76
+ if ($workerTags && open) {
77
+ loadTagsToWorkerExists($workerTags);
78
+ }
79
+ });
31
80
  let open = $state(false);
32
81
  </script>
33
82
 
83
+ {#snippet startSnippet({ item })}
84
+ {#if tagsToWorkerExists}
85
+ {#if tagsToWorkerExists[item.value]}
86
+ <Popover>
87
+ {#snippet text()}
88
+ At least one worker with this tag exists and is running.
89
+ {/snippet}
90
+ <div class="rounded-full inline-block bg-green-500 text-white text-xs w-2 h-2 mr-1"></div>
91
+ </Popover>
92
+ {:else}
93
+ <Popover>
94
+ {#snippet text()}
95
+ No workers with this tag exist or is running.
96
+ {/snippet}
97
+ <div class="rounded-full inline-block bg-red-500 text-white text-xs w-2 h-2 mr-1"></div>
98
+ </Popover>
99
+ {/if}
100
+ {/if}
101
+ {/snippet}
34
102
  <div class="flex gap-1 items-center relative">
35
103
  {#if !noLabel}
36
104
  <div class="text-tertiary text-2xs">{placeholder ?? 'tag'}</div>
@@ -44,6 +112,7 @@ let open = $state(false);
44
112
  placeholder={nullTag ? nullTag : (placeholder ?? 'lang default')}
45
113
  items={safeSelectItems(items)}
46
114
  bind:value={() => tag, (value) => ((tag = value), dispatch('change', value))}
115
+ {startSnippet}
47
116
  />
48
117
  {#if open}
49
118
  <div class="absolute top-0 -right-12">
@@ -9,6 +9,7 @@ import ResolveStyle from '../helpers/ResolveStyle.svelte';
9
9
  import { components } from '../../editor/component';
10
10
  import ResolveConfig from '../helpers/ResolveConfig.svelte';
11
11
  import { userStore } from '../../../../stores';
12
+ let result_stream = $state(undefined);
12
13
  let { id, componentInput, initializing = $bindable(undefined), customCss = undefined, render, configuration } = $props();
13
14
  const requireHtmlApproval = getContext(IS_APP_PUBLIC_CONTEXT_KEY);
14
15
  const { app, worldStore, componentControl, workspace, appPath } = getContext('AppViewerContext');
@@ -24,6 +25,7 @@ const outputs = initOutput($worldStore, id, {
24
25
  loading: false
25
26
  });
26
27
  let css = $state(initCss($app.css?.displaycomponent, customCss));
28
+ let loading = $state(false);
27
29
  </script>
28
30
 
29
31
  {#each Object.keys(components['displaycomponent'].initialData.configuration) as key (key)}
@@ -45,7 +47,15 @@ let css = $state(initCss($app.css?.displaycomponent, customCss));
45
47
  />
46
48
  {/each}
47
49
 
48
- <RunnableWrapper {outputs} {render} {componentInput} {id} bind:initializing bind:result>
50
+ <RunnableWrapper
51
+ {outputs}
52
+ {render}
53
+ {componentInput}
54
+ {id}
55
+ bind:initializing
56
+ bind:result
57
+ bind:loading
58
+ >
49
59
  <div class="flex flex-col w-full h-full component-wrapper">
50
60
  <div
51
61
  class={twMerge(
@@ -70,8 +80,10 @@ let css = $state(initCss($app.css?.displaycomponent, customCss));
70
80
  )}
71
81
  >
72
82
  <DisplayResult
83
+ {loading}
73
84
  workspaceId={workspace}
74
85
  {result}
86
+ {result_stream}
75
87
  {requireHtmlApproval}
76
88
  disableExpand={resolvedConfig?.hideDetails}
77
89
  appPath={$userStore ? undefined : $appPath}
@@ -2,7 +2,7 @@
2
2
  const bubble = createBubbler();
3
3
  import Tooltip from '../../../Tooltip.svelte';
4
4
  import { Clipboard } from 'lucide-svelte';
5
- import { getContext } from 'svelte';
5
+ import { getContext, untrack } from 'svelte';
6
6
  import { twMerge } from 'tailwind-merge';
7
7
  import { copyToClipboard, isCodeInjection } from '../../../../utils';
8
8
  import Button from '../../../common/button/Button.svelte';
@@ -34,7 +34,7 @@ $componentControl[id] = {
34
34
  }
35
35
  };
36
36
  const outputs = initOutput($worldStore, id, {
37
- result,
37
+ result: untrack(() => result),
38
38
  loading: initializing
39
39
  });
40
40
  function getComponent() {
@@ -18,6 +18,7 @@ import { CancelablePromise } from '../../../../../gen';
18
18
  import RefreshButton from '../../helpers/RefreshButton.svelte';
19
19
  import RunnableWrapper from '../../helpers/RunnableWrapper.svelte';
20
20
  import InsertRowDrawerButton from '../InsertRowDrawerButton.svelte';
21
+ import { assert } from '../../../../../utils';
21
22
  let { id, configuration, customCss = undefined, render, initializing = $bindable(undefined), actions = [] } = $props();
22
23
  $effect.pre(() => {
23
24
  if (initializing === undefined) {
@@ -224,7 +225,13 @@ async function listColumnsIfAvailable() {
224
225
  gridItem.data.configuration.columnDefs.loading = true;
225
226
  gridItem.data = gridItem.data;
226
227
  $app = $app;
227
- let tableMetadata = await loadTableMetaData(resolvedConfig.type.configuration[selected].resource, $workspaceStore, resolvedConfig.type.configuration[selected].table, selected);
228
+ let resource = resolvedConfig.type.configuration[selected].resource;
229
+ assert('resource starts with $res:', resource?.startsWith('$res:'), resource);
230
+ let tableMetadata = await loadTableMetaData({
231
+ type: 'database',
232
+ resourcePath: resource.substring(5),
233
+ resourceType: selected
234
+ }, $workspaceStore, resolvedConfig.type.configuration[selected].table);
228
235
  if (!tableMetadata)
229
236
  return;
230
237
  let old = columnDefs?.value ?? [];
@@ -1,8 +1,8 @@
1
1
  <script lang="ts">import { ColumnIdentity } from './utils';
2
- import init, { parse_sql, parse_mysql, parse_bigquery, parse_snowflake, parse_mssql } from 'windmill-sql-datatype-parser-wasm';
2
+ import init, { parse_sql, parse_mysql, parse_bigquery, parse_snowflake, parse_mssql, parse_duckdb } from 'windmill-sql-datatype-parser-wasm';
3
3
  import wasmUrl from 'windmill-sql-datatype-parser-wasm/windmill_sql_datatype_parser_wasm_bg.wasm?url';
4
4
  init(wasmUrl);
5
- import { argSigToJsonSchemaType } from '../../../../../inferArgSig';
5
+ import { argSigToJsonSchemaType } from 'windmill-utils-internal';
6
6
  import SchemaForm from '../../../../SchemaForm.svelte';
7
7
  import { untrack } from 'svelte';
8
8
  let schema = $state(undefined);
@@ -24,8 +24,9 @@ function parseSQLArgs(field, dbType) {
24
24
  case 'ms_sql_server':
25
25
  rawType = parse_mssql(field);
26
26
  break;
27
- default:
28
- throw new Error('Language not supported');
27
+ case 'duckdb':
28
+ rawType = parse_duckdb(field);
29
+ break;
29
30
  }
30
31
  return rawType;
31
32
  }
@@ -77,6 +77,15 @@ export function makeCountQuery(dbType, table, whereClause = undefined, columnDef
77
77
  query += `SELECT COUNT(*) as count FROM \`${table}\``;
78
78
  break;
79
79
  }
80
+ case 'duckdb':
81
+ if (filteredColumns.length > 0) {
82
+ quicksearchCondition += ` ($quicksearch = '' OR CONCAT(' ', ${filteredColumns.join(', ')}) LIKE CONCAT('%', $quicksearch, '%'))`;
83
+ }
84
+ else {
85
+ quicksearchCondition += ` ($quicksearch = '' OR 1 = 1)`;
86
+ }
87
+ query += `SELECT COUNT(*) as count FROM ${table}`;
88
+ break;
80
89
  default:
81
90
  throw new Error('Unsupported database type:' + dbType);
82
91
  }
@@ -91,7 +100,8 @@ export function makeCountQuery(dbType, table, whereClause = undefined, columnDef
91
100
  (dbType === 'mysql' ||
92
101
  dbType === 'postgresql' ||
93
102
  dbType === 'snowflake' ||
94
- dbType === 'bigquery')) {
103
+ dbType === 'bigquery' ||
104
+ dbType === 'duckdb')) {
95
105
  query = query.replace(`${andCondition}`, wherePrefix);
96
106
  }
97
107
  return query;
@@ -20,6 +20,6 @@ type CreateTableValuesColumn = {
20
20
  not_null?: boolean;
21
21
  datatype_length?: number;
22
22
  };
23
- export declare function makeCreateTableQuery(values: CreateTableValues, resourceType: DbType, schema?: string): string;
23
+ export declare function makeCreateTableQuery(values: CreateTableValues, dbType: DbType, schema?: string): string;
24
24
  export declare function datatypeDefaultLength(datatype: string): number;
25
25
  export {};
@@ -1,9 +1,9 @@
1
1
  import { dbSupportsSchemas } from '../utils';
2
- export function makeCreateTableQuery(values, resourceType, schema) {
2
+ export function makeCreateTableQuery(values, dbType, schema) {
3
3
  const pkCount = values.columns.reduce((p, c) => p + (c.primaryKey ? 1 : 0), 0);
4
4
  function transformColumn(c) {
5
5
  const datatype = c.datatype_length ? `${c.datatype}(${c.datatype_length})` : c.datatype;
6
- const defValue = c.defaultValue && formatDefaultValue(c.defaultValue, datatype, resourceType);
6
+ const defValue = c.defaultValue && formatDefaultValue(c.defaultValue, datatype, dbType);
7
7
  let str = ` ${c.name} ${datatype}`;
8
8
  if (c.not_null)
9
9
  str += ' NOT NULL';
@@ -26,7 +26,7 @@ export function makeCreateTableQuery(values, resourceType, schema) {
26
26
  l += ` ON UPDATE ${fk.onUpdate}`;
27
27
  return l;
28
28
  }
29
- const useSchema = dbSupportsSchemas(resourceType);
29
+ const useSchema = dbSupportsSchemas(dbType);
30
30
  const lines = values.columns.map(transformColumn);
31
31
  lines.push(...values.foreignKeys.map(transformFk));
32
32
  if (pkCount > 1) {
@@ -37,6 +37,13 @@ export function makeDeleteQuery(table, columns, dbType) {
37
37
  query += `\nDELETE FROM ${table} \nWHERE ${conditions}`;
38
38
  return query;
39
39
  }
40
+ case 'duckdb': {
41
+ const conditions = columns
42
+ .map((c) => `($${c.field} IS NULL AND ${c.field} IS NULL OR ${c.field} = $${c.field})`)
43
+ .join('\n AND ');
44
+ query += `\nDELETE FROM ${table} \nWHERE ${conditions}`;
45
+ return query;
46
+ }
40
47
  default:
41
48
  throw new Error('Unsupported database type');
42
49
  }
@@ -12,6 +12,8 @@ function formatInsertValues(columns, dbType, startIndex = 1) {
12
12
  return columns.map(() => `?`).join(', ');
13
13
  case 'bigquery':
14
14
  return columns.map((c) => `@${c.field}`).join(', ');
15
+ case 'duckdb':
16
+ return columns.map((c) => `$${c.field}`).join(', ');
15
17
  default:
16
18
  throw new Error('Unsupported database type');
17
19
  }
@@ -155,6 +155,20 @@ CASE WHEN :order_by = '${column.field}' AND :is_desc IS true THEN \`${column.fie
155
155
  query += ` LIMIT @limit OFFSET @offset`;
156
156
  break;
157
157
  }
158
+ case 'duckdb': {
159
+ const orderBy = `
160
+ ${columnDefs
161
+ .map((column) => `
162
+ (CASE WHEN $order_by = '${column.field}' AND $is_desc IS false THEN "${column.field}"::text END),
163
+ (CASE WHEN $order_by = '${column.field}' AND $is_desc IS true THEN "${column.field}"::text END) DESC`)
164
+ .join(',\n')}`;
165
+ quicksearchCondition = `($quicksearch = '' OR CONCAT(${filteredColumns.join(', ')}) ILIKE '%' || $quicksearch || '%')`;
166
+ query += `SELECT ${filteredColumns.join(', ')} FROM ${table}\n`;
167
+ query += ` WHERE ${whereClause ? `${whereClause} AND` : ''} ${quicksearchCondition}\n`;
168
+ query += ` ORDER BY ${orderBy}\n`;
169
+ query += ` LIMIT $limit::INT OFFSET $offset::INT`;
170
+ break;
171
+ }
158
172
  default:
159
173
  throw new Error('Unsupported database type');
160
174
  }
@@ -41,6 +41,13 @@ export function makeUpdateQuery(table, column, columns, dbType) {
41
41
  query += `\nUPDATE ${table} SET ${column.field} = @value_to_update \nWHERE ${conditions}`;
42
42
  return query;
43
43
  }
44
+ case 'duckdb': {
45
+ const conditions = columns
46
+ .map((c) => `($${c.field} IS NULL AND ${c.field} IS NULL OR ${c.field} = $${c.field})`)
47
+ .join('\n AND ');
48
+ query += `\nUPDATE ${table} SET ${column.field} = $value_to_update \nWHERE ${conditions}`;
49
+ return query;
50
+ }
44
51
  default:
45
52
  throw new Error('Unsupported database type');
46
53
  }
@@ -1,6 +1,7 @@
1
- import { type Preview } from '../../../../../gen';
1
+ import { type ScriptLang } from '../../../../../gen';
2
2
  import type { DBSchema, DBSchemas, SQLSchema } from '../../../../../stores';
3
3
  import { type IntrospectionQuery } from 'graphql';
4
+ import type { DbInput } from '../../../../dbOps';
4
5
  export declare enum ColumnIdentity {
5
6
  ByDefault = "By Default",
6
7
  Always = "Always",
@@ -40,8 +41,8 @@ export type ColumnDef = {
40
41
  defaultUserValue?: any;
41
42
  defaultValueNull?: boolean;
42
43
  } & ColumnMetadata;
43
- export declare function loadTableMetaData(resource: string, workspace: string | undefined, table: string | undefined, resourceType: string): Promise<TableMetadata | undefined>;
44
- export declare function loadAllTablesMetaData(resource: string, workspace: string | undefined, resourceType: string): Promise<Record<string, TableMetadata> | undefined>;
44
+ export declare function loadTableMetaData(input: DbInput, workspace: string | undefined, table: string | undefined): Promise<TableMetadata | undefined>;
45
+ export declare function loadAllTablesMetaData(workspace: string | undefined, input: DbInput): Promise<Record<string, TableMetadata> | undefined>;
45
46
  export declare function resourceTypeToLang(rt: string): string;
46
47
  declare const scripts: Record<string, {
47
48
  code: string;
@@ -76,10 +77,10 @@ export declare function formatSchema(dbSchema: {
76
77
  };
77
78
  export declare function formatGraphqlSchema(schema: IntrospectionQuery): string;
78
79
  export type DbType = (typeof dbTypes)[number];
79
- export declare const dbTypes: readonly ["mysql", "ms_sql_server", "postgresql", "snowflake", "bigquery"];
80
+ export declare const dbTypes: readonly ["mysql", "ms_sql_server", "postgresql", "snowflake", "bigquery", "duckdb"];
80
81
  export declare const isDbType: (str?: string) => str is DbType;
81
82
  export declare function buildVisibleFieldList(columnDefs: ColumnDef[], dbType: DbType): string[];
82
- export declare function getLanguageByResourceType(name: string): Preview['language'];
83
+ export declare function getLanguageByResourceType(name: string): ScriptLang;
83
84
  export declare function buildParameters(columns: Array<{
84
85
  field: string;
85
86
  datatype: string;