windmill-components 1.511.0 → 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.
- package/package/components/AppConnectInner.svelte.d.ts +1 -1
- package/package/components/ArgInput.svelte +56 -18
- package/package/components/ArgInput.svelte.d.ts +2 -10
- package/package/components/AssignableTagsInner.svelte +5 -0
- package/package/components/AuthSettings.svelte +4 -2
- package/package/components/AuthSettings.svelte.d.ts +1 -0
- package/package/components/DBManagerDrawer.svelte +154 -151
- package/package/components/DBManagerDrawer.svelte.d.ts +2 -2
- package/package/components/DBTable.svelte +3 -3
- package/package/components/DBTable.svelte.d.ts +1 -0
- package/package/components/DBTableEditor.svelte +7 -7
- package/package/components/DBTableEditor.svelte.d.ts +1 -1
- package/package/components/DeployWorkspace.svelte +1 -1
- package/package/components/DisplayResult.svelte +34 -8
- package/package/components/DisplayResult.svelte.d.ts +4 -1
- package/package/components/DynSelect.svelte +58 -34
- package/package/components/DynSelect.svelte.d.ts +3 -11
- package/package/components/EditableSchemaForm.svelte +126 -6
- package/package/components/EditableSchemaForm.svelte.d.ts +5 -1
- package/package/components/Editor.svelte +1 -1
- package/package/components/EditorBar.svelte +82 -4
- package/package/components/ErrorOrRecoveryHandler.svelte +76 -8
- package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +2 -1
- package/package/components/ExploreAssetButton.svelte +14 -4
- package/package/components/ExploreAssetButton.svelte.d.ts +1 -0
- package/package/components/FlowJobResult.svelte +3 -3
- package/package/components/FlowJobResult.svelte.d.ts +1 -0
- package/package/components/FlowPreviewContent.svelte +9 -0
- package/package/components/FlowPreviewContent.svelte.d.ts +3 -0
- package/package/components/FlowPreviewResult.svelte +4 -1
- package/package/components/FlowPreviewResult.svelte.d.ts +1 -0
- package/package/components/FlowStatusViewer.svelte +2 -1
- package/package/components/FlowStatusViewer.svelte.d.ts +3 -0
- package/package/components/FlowStatusViewerInner.svelte +23 -3
- package/package/components/FlowStatusViewerInner.svelte.d.ts +10 -1
- package/package/components/FolderEditor.svelte +1 -1
- package/package/components/GitDiffPreview.svelte +14 -18
- package/package/components/GitDiffPreview.svelte.d.ts +2 -8
- package/package/components/GitHubAppIntegration.svelte +3 -1
- package/package/components/IdEditorInput.svelte +25 -22
- package/package/components/IdEditorInput.svelte.d.ts +11 -23
- package/package/components/InstanceSetting.svelte +7 -2
- package/package/components/InstanceSettings.svelte +1 -0
- package/package/components/JobLoader.svelte +48 -5
- package/package/components/JobLoader.svelte.d.ts +7 -2
- package/package/components/Login.svelte +8 -2
- package/package/components/MemoryFootprintViewer.svelte +1 -1
- package/package/components/ModulePreviewResultViewer.svelte +2 -2
- package/package/components/MoveDrawer.svelte.d.ts +2 -2
- package/package/components/NextcloudSetting.svelte +84 -0
- package/package/components/NextcloudSetting.svelte.d.ts +7 -0
- package/package/components/ObjectResourceInput.svelte +3 -2
- package/package/components/ObjectResourceInput.svelte.d.ts +1 -0
- package/package/components/ParqetCsvTableRenderer.svelte +1 -1
- package/package/components/ResourceEditor.svelte +1 -1
- package/package/components/ResourcePicker.svelte +8 -1
- package/package/components/ResourcePicker.svelte.d.ts +1 -0
- package/package/components/ResultStreamDisplay.svelte +5 -0
- package/package/components/ResultStreamDisplay.svelte.d.ts +5 -0
- package/package/components/RunForm.svelte +9 -1
- package/package/components/SchemaForm.svelte +2 -2
- package/package/components/SchemaForm.svelte.d.ts +2 -10
- package/package/components/ScriptBuilder.svelte +13 -8
- package/package/components/ScriptBuilder.svelte.d.ts +1 -1
- package/package/components/ScriptEditor.svelte.d.ts +1 -1
- package/package/components/ScriptWrapper.svelte +1 -1
- package/package/components/ShareModal.svelte.d.ts +1 -1
- package/package/components/SimpleAgTable.svelte +2 -0
- package/package/components/SimpleAgTable.svelte.d.ts +2 -0
- package/package/components/SqlRepl.svelte +21 -7
- package/package/components/SqlRepl.svelte.d.ts +2 -2
- package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
- package/package/components/WorkerTagSelect.svelte +70 -1
- package/package/components/apps/components/display/AppDisplayComponent.svelte +13 -1
- package/package/components/apps/components/display/AppText.svelte +2 -2
- package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +8 -1
- package/package/components/apps/components/display/dbtable/InsertRow.svelte +5 -4
- package/package/components/apps/components/display/dbtable/queries/count.js +11 -1
- package/package/components/apps/components/display/dbtable/queries/createTable.d.ts +1 -1
- package/package/components/apps/components/display/dbtable/queries/createTable.js +3 -3
- package/package/components/apps/components/display/dbtable/queries/delete.js +7 -0
- package/package/components/apps/components/display/dbtable/queries/insert.js +2 -0
- package/package/components/apps/components/display/dbtable/queries/select.js +14 -0
- package/package/components/apps/components/display/dbtable/queries/update.js +7 -0
- package/package/components/apps/components/display/dbtable/utils.d.ts +6 -5
- package/package/components/apps/components/display/dbtable/utils.js +52 -28
- package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +1 -1
- package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +1 -0
- package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte.d.ts +1 -0
- package/package/components/apps/components/display/table/AppAggridTable.svelte +5 -4
- package/package/components/apps/components/display/table/AppAggridTable.svelte.d.ts +1 -0
- package/package/components/apps/components/display/table/utils.js +7 -4
- package/package/components/apps/components/helpers/HiddenComponent.svelte +2 -2
- package/package/components/apps/components/helpers/RunnableComponent.svelte +4 -1
- package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +2 -1
- package/package/components/apps/components/inputs/AppS3FileInput.svelte +2 -2
- package/package/components/apps/components/layout/AppDecisionTree.svelte +1 -1
- package/package/components/apps/components/layout/AppStepper.svelte +1 -1
- package/package/components/apps/components/layout/AppTabs.svelte +1 -1
- package/package/components/apps/editor/AppEditorHeader.svelte +13 -2
- package/package/components/apps/editor/GridViewer.svelte +1 -0
- package/package/components/apps/editor/RunnableJobPanelInner.svelte +2 -1
- package/package/components/apps/editor/contextPanel/components/IdEditor.svelte +7 -7
- package/package/components/apps/editor/contextPanel/components/IdEditor.svelte.d.ts +7 -19
- package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +8 -12
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
- package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +3 -3
- package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte +1 -3
- package/package/components/assets/AssetsDropdownButton.svelte +1 -1
- package/package/components/assets/JobAssetsViewer.svelte +2 -2
- package/package/components/assets/lib.js +4 -0
- package/package/components/auditLogs/AuditLogsFilters.svelte +7 -9
- package/package/components/common/button/Button.svelte +4 -3
- package/package/components/common/button/Button.svelte.d.ts +1 -0
- package/package/components/common/confirmationModal/ConfirmationModal.svelte +6 -5
- package/package/components/common/confirmationModal/ConfirmationModal.svelte.d.ts +6 -11
- package/package/components/common/confirmationModal/asyncConfirmationModal.svelte.d.ts +26 -0
- package/package/components/common/confirmationModal/asyncConfirmationModal.svelte.js +50 -0
- package/package/components/common/modal/Modal.svelte +2 -5
- package/package/components/common/tabs/TabsV2.svelte +2 -1
- package/package/components/common/tabs/TabsV2.svelte.d.ts +1 -0
- package/package/components/copilot/chat/AIChatManager.svelte.js +61 -7
- package/package/components/copilot/chat/ContextTextarea.svelte +1 -1
- package/package/components/copilot/chat/script/core.js +28 -29
- package/package/components/copilot/chat/shared.d.ts +1 -1
- package/package/components/copilot/chat/shared.js +8 -2
- package/package/components/custom_ui.d.ts +3 -0
- package/package/components/dbOps.d.ts +20 -8
- package/package/components/dbOps.js +85 -40
- package/package/components/details/DetailPageHeader.svelte +0 -2
- package/package/components/flows/content/FlowInput.svelte +5 -0
- package/package/components/flows/content/FlowModuleComponent.svelte +1 -0
- package/package/components/flows/content/FlowModuleScript.svelte +0 -1
- package/package/components/flows/idUtils.js +2 -1
- package/package/components/flows/map/FlowModuleSchemaItem.svelte +3 -3
- package/package/components/flows/map/FlowModuleSchemaMap.svelte +5 -0
- package/package/components/flows/map/InsertModuleButton.svelte +4 -1
- package/package/components/flows/propPicker/OutputBadge.svelte +5 -1
- package/package/components/flows/propPicker/OutputPickerInner.svelte +9 -5
- package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +6 -2
- package/package/components/flows/propPicker/StepHistory.svelte +4 -1
- package/package/components/git_sync/DetectionFlow.svelte +202 -0
- package/package/components/git_sync/DetectionFlow.svelte.d.ts +6 -0
- package/package/components/git_sync/GitSyncContext.svelte.d.ts +82 -0
- package/package/components/git_sync/GitSyncContext.svelte.js +461 -0
- package/package/components/git_sync/GitSyncModalManager.svelte +99 -0
- package/package/components/git_sync/GitSyncModalManager.svelte.d.ts +18 -0
- package/package/components/git_sync/GitSyncRepositoryCard.svelte +339 -0
- package/package/components/git_sync/GitSyncRepositoryCard.svelte.d.ts +6 -0
- package/package/components/git_sync/GitSyncRepositoryList.svelte +17 -0
- package/package/components/git_sync/GitSyncRepositoryList.svelte.d.ts +18 -0
- package/package/components/git_sync/GitSyncSection.svelte +89 -0
- package/package/components/git_sync/GitSyncSection.svelte.d.ts +3 -0
- package/package/components/git_sync/GitSyncSuccessModal.svelte +58 -0
- package/package/components/git_sync/GitSyncSuccessModal.svelte.d.ts +7 -0
- package/package/components/git_sync/PullWorkspaceModal.svelte +575 -0
- package/package/components/git_sync/PullWorkspaceModal.svelte.d.ts +15 -0
- package/package/components/git_sync/PushWorkspaceModal.svelte +320 -0
- package/package/components/git_sync/PushWorkspaceModal.svelte.d.ts +12 -0
- package/package/components/graph/FlowGraphV2.svelte +5 -1
- package/package/components/graph/graphBuilder.svelte.js +1 -1
- package/package/components/graph/renderers/nodes/AssetNode.svelte +4 -4
- package/package/components/icons/AssetDucklakeIcon.svelte +28 -0
- package/package/components/icons/AssetDucklakeIcon.svelte.d.ts +9 -0
- package/package/components/icons/AssetGenericIcon.svelte +3 -0
- package/package/components/icons/DucklakeIcon.svelte +18 -0
- package/package/components/icons/DucklakeIcon.svelte.d.ts +6 -0
- package/package/components/instanceSettings.js +11 -3
- package/package/components/runs/JobPreview.svelte +2 -2
- package/package/components/runs/NoWorkerWithTagWarning.svelte +3 -3
- package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
- package/package/components/schema/FlowPropertyEditor.svelte +3 -2
- package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -1
- package/package/components/schema/PropertyEditor.svelte +0 -2
- package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
- package/package/components/schema/SchemaFormDND.svelte +2 -1
- package/package/components/schema/SchemaFormDND.svelte.d.ts +2 -0
- package/package/components/scriptEditor/LogPanel.svelte +5 -3
- package/package/components/scriptEditor/LogPanel.svelte.d.ts +5 -1
- package/package/components/select/Select.svelte +7 -4
- package/package/components/select/Select.svelte.d.ts +5 -0
- package/package/components/select/SelectDropdown.svelte +2 -1
- package/package/components/select/SelectDropdown.svelte.d.ts +3 -0
- package/package/components/sidebar/changelogs.js +5 -0
- package/package/components/table/AutoDataTable.svelte +6 -4
- package/package/components/table/AutoDataTable.svelte.d.ts +1 -0
- package/package/components/table/DataTable.svelte +12 -10
- package/package/components/table/DataTable.svelte.d.ts +1 -0
- package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +2 -2
- package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +1 -1
- package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte.d.ts +2 -1
- package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +50 -11
- package/package/components/triggers/gcp/utils.js +1 -0
- package/package/components/triggers/http/utils.js +1 -1
- package/package/components/triggers/kafka/utils.js +1 -1
- package/package/components/triggers/mqtt/utils.js +1 -1
- package/package/components/triggers/nats/utils.js +1 -1
- package/package/components/triggers/postgres/utils.js +1 -1
- package/package/components/triggers/sqs/utils.js +1 -1
- package/package/components/triggers/utils.js +2 -1
- package/package/components/triggers/webhook/WebhooksConfigSection.svelte +24 -26
- package/package/components/triggers/webhook/WebhooksPanel.svelte +1 -15
- package/package/components/triggers/websocket/utils.js +1 -1
- package/package/components/workspaceSettings/AISettings.svelte +52 -36
- package/package/components/workspaceSettings/DucklakeSettings.svelte +321 -0
- package/package/components/workspaceSettings/DucklakeSettings.svelte.d.ts +23 -0
- package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +122 -499
- package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +8 -10
- package/package/consts.js +2 -1
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +33 -24
- package/package/gen/schemas.gen.js +36 -27
- package/package/gen/services.gen.d.ts +19 -1
- package/package/gen/services.gen.js +38 -0
- package/package/gen/types.gen.d.ts +103 -9
- package/package/git-sync.d.ts +36 -0
- package/package/git-sync.js +1 -0
- package/package/hub.d.ts +1 -0
- package/package/hubPaths.json +5 -2
- package/package/infer.js +3 -2
- package/package/script_helpers.d.ts +2 -2
- package/package/script_helpers.js +29 -11
- package/package/services/JobManager.d.ts +28 -0
- package/package/services/JobManager.js +114 -0
- package/package/stores.d.ts +1 -1
- package/package/utils.d.ts +18 -1
- package/package/utils.js +55 -2
- package/package.json +13 -12
- package/package/components/InitGitRepoPopover.svelte +0 -410
- package/package/components/InitGitRepoPopover.svelte.d.ts +0 -13
- package/package/components/PullGitRepoPopover.svelte +0 -355
- package/package/components/PullGitRepoPopover.svelte.d.ts +0 -18
- package/package/inferArgSig.d.ts +0 -35
- package/package/inferArgSig.js +0 -191
|
@@ -9,7 +9,7 @@ import { sendUserToast } from '../toast';
|
|
|
9
9
|
import Select from './select/Select.svelte';
|
|
10
10
|
import DbManagerDrawer from './DBManagerDrawer.svelte';
|
|
11
11
|
import ExploreAssetButton, { assetCanBeExplored } from './ExploreAssetButton.svelte';
|
|
12
|
-
let { initialValue = $bindable(undefined), value = $bindable(undefined), valueType = $bindable(undefined), resourceType = undefined, disabled = false, disablePortal = false, showSchemaExplorer = false, selectFirst = false, expressOAuthSetup = false, defaultValues = undefined, placeholder = undefined, onClear = undefined } = $props();
|
|
12
|
+
let { initialValue = $bindable(undefined), value = $bindable(undefined), valueType = $bindable(undefined), resourceType = undefined, disabled = false, disablePortal = false, showSchemaExplorer = false, selectFirst = false, expressOAuthSetup = false, defaultValues = undefined, placeholder = undefined, onClear = undefined, excludedValues = undefined } = $props();
|
|
13
13
|
if (initialValue && value == undefined) {
|
|
14
14
|
console.log('initialValue', initialValue);
|
|
15
15
|
value = initialValue;
|
|
@@ -62,6 +62,7 @@ async function loadResources(resourceType) {
|
|
|
62
62
|
const nc = resources
|
|
63
63
|
.flat()
|
|
64
64
|
.filter((x) => x.resource_type != 'state' && x.resource_type != 'cache')
|
|
65
|
+
.filter((x) => !excludedValues || !excludedValues.includes(x.path))
|
|
65
66
|
.map((x) => ({
|
|
66
67
|
value: x.path,
|
|
67
68
|
label: x.path,
|
|
@@ -95,6 +96,12 @@ $effect(() => {
|
|
|
95
96
|
});
|
|
96
97
|
untrack(() => loadResources(resourceType));
|
|
97
98
|
});
|
|
99
|
+
$effect(() => {
|
|
100
|
+
excludedValues;
|
|
101
|
+
if ($workspaceStore && resourceType && !disabled) {
|
|
102
|
+
untrack(() => loadResources(resourceType));
|
|
103
|
+
}
|
|
104
|
+
});
|
|
98
105
|
let appConnect = $state();
|
|
99
106
|
let resourceEditor = $state();
|
|
100
107
|
let dbManagerDrawer = $state();
|
|
@@ -11,6 +11,7 @@ interface Props {
|
|
|
11
11
|
defaultValues?: Record<string, any> | undefined;
|
|
12
12
|
placeholder?: string | undefined;
|
|
13
13
|
onClear?: () => void;
|
|
14
|
+
excludedValues?: string[];
|
|
14
15
|
}
|
|
15
16
|
declare const ResourcePicker: import("svelte").Component<Props, {
|
|
16
17
|
askNewResource: () => Promise<void>;
|
|
@@ -12,6 +12,7 @@ import JsonInputs from './JsonInputs.svelte';
|
|
|
12
12
|
import { triggerableByAI } from '../actions/triggerableByAI.svelte';
|
|
13
13
|
import InputSelectedBadge from './schema/InputSelectedBadge.svelte';
|
|
14
14
|
import { untrack } from 'svelte';
|
|
15
|
+
import {} from '../gen';
|
|
15
16
|
let reloadArgs = $state(0);
|
|
16
17
|
let jsonEditor = $state(undefined);
|
|
17
18
|
let schemaHeight = $state(0);
|
|
@@ -190,7 +191,14 @@ $effect(() => {
|
|
|
190
191
|
type: 'hash',
|
|
191
192
|
hash: runnable.hash
|
|
192
193
|
}
|
|
193
|
-
:
|
|
194
|
+
: runnable.schema?.['x-windmill-dyn-select-code'] &&
|
|
195
|
+
runnable.schema?.['x-windmill-dyn-select-lang']
|
|
196
|
+
? {
|
|
197
|
+
type: 'inline',
|
|
198
|
+
code: runnable.schema['x-windmill-dyn-select-code'] as string,
|
|
199
|
+
lang: runnable.schema['x-windmill-dyn-select-lang'] as ScriptLang
|
|
200
|
+
}
|
|
201
|
+
: undefined}
|
|
194
202
|
prettifyHeader
|
|
195
203
|
{noVariablePicker}
|
|
196
204
|
{autofocus}
|
|
@@ -203,7 +203,7 @@ const actions_render = $derived(actions);
|
|
|
203
203
|
title={formerProperty?.title}
|
|
204
204
|
placeholder={formerProperty?.placeholder}
|
|
205
205
|
orderEditable={dndConfig != undefined}
|
|
206
|
-
otherArgs={args}
|
|
206
|
+
otherArgs={{ ...args, [argName]: undefined }}
|
|
207
207
|
{helperScript}
|
|
208
208
|
{lightHeader}
|
|
209
209
|
hideNested={typeof diff[argName].diff === 'object'}
|
|
@@ -276,7 +276,7 @@ const actions_render = $derived(actions);
|
|
|
276
276
|
title={schema.properties[argName].title}
|
|
277
277
|
placeholder={schema.properties[argName].placeholder}
|
|
278
278
|
orderEditable={dndConfig != undefined}
|
|
279
|
-
otherArgs={args}
|
|
279
|
+
otherArgs={{ ...args, [argName]: undefined }}
|
|
280
280
|
{helperScript}
|
|
281
281
|
{lightHeader}
|
|
282
282
|
diffStatus={diff[argName] ?? undefined}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Schema } from '../common';
|
|
2
|
-
import { type
|
|
2
|
+
import { type DynamicSelect } from '../utils';
|
|
3
3
|
import { type Options as DndOptions } from '@windmill-labs/svelte-dnd-action';
|
|
4
4
|
import type { SchemaDiff } from './schema/schemaUtils.svelte';
|
|
5
5
|
import type { ComponentCustomCSS } from './apps/types';
|
|
@@ -30,15 +30,7 @@ interface Props {
|
|
|
30
30
|
id: string;
|
|
31
31
|
value: string;
|
|
32
32
|
}[] | undefined;
|
|
33
|
-
helperScript?:
|
|
34
|
-
type: 'inline';
|
|
35
|
-
path?: string;
|
|
36
|
-
lang: Script['language'];
|
|
37
|
-
code: string;
|
|
38
|
-
} | {
|
|
39
|
-
type: 'hash';
|
|
40
|
-
hash: string;
|
|
41
|
-
} | undefined;
|
|
33
|
+
helperScript?: DynamicSelect.HelperScript;
|
|
42
34
|
lightHeader?: boolean;
|
|
43
35
|
diff?: Record<string, SchemaDiff>;
|
|
44
36
|
nestedParent?: {
|
|
@@ -5,7 +5,7 @@ import { inferArgs } from '../infer';
|
|
|
5
5
|
import { initialCode } from '../script_helpers';
|
|
6
6
|
import AIFormSettings from './copilot/AIFormSettings.svelte';
|
|
7
7
|
import { defaultScripts, enterpriseLicense, usedTriggerKinds, userStore, workerTags, workspaceStore } from '../stores';
|
|
8
|
-
import { cleanValueProperties, emptySchema, emptyString, encodeState, generateRandomString, orderedJsonStringify, replaceFalseWithUndefined } from '../utils';
|
|
8
|
+
import { cleanValueProperties, emptySchema, emptyString, encodeState, generateRandomString, orderedJsonStringify, readFieldsRecursively, replaceFalseWithUndefined } from '../utils';
|
|
9
9
|
import Path from './Path.svelte';
|
|
10
10
|
import ScriptEditor from './ScriptEditor.svelte';
|
|
11
11
|
import { Alert, Badge, Button, Drawer, SecondsInput, Tab, TabContent, Tabs } from './common';
|
|
@@ -41,7 +41,7 @@ import { deployTriggers, filterDraftTriggers, handleSelectTriggerFromKind } from
|
|
|
41
41
|
import DraftTriggersConfirmationModal from './common/confirmationModal/DraftTriggersConfirmationModal.svelte';
|
|
42
42
|
import { Triggers } from './triggers/triggers.svelte';
|
|
43
43
|
import WorkerTagSelect from './WorkerTagSelect.svelte';
|
|
44
|
-
let { script, fullyLoaded = true, initialPath = $bindable(''), template = $bindable('script'), initialArgs = {}, lockedLanguage = false, showMeta = false, neverShowMeta = false, diffDrawer = undefined, savedScript = $bindable(undefined), searchParams = new URLSearchParams(), disableHistoryChange = false, replaceStateFn = (url) => window.history.replaceState(null, '', url), customUi = {}, savedPrimarySchedule = undefined, functionExports = undefined, children, onDeploy, onDeployError, onSaveInitial, onSeeDetails, onSaveDraftError, onSaveDraft, disableAi } = $props();
|
|
44
|
+
let { script = $bindable(), fullyLoaded = true, initialPath = $bindable(''), template = $bindable('script'), initialArgs = {}, lockedLanguage = false, showMeta = false, neverShowMeta = false, diffDrawer = undefined, savedScript = $bindable(undefined), searchParams = new URLSearchParams(), disableHistoryChange = false, replaceStateFn = (url) => window.history.replaceState(null, '', url), customUi = {}, savedPrimarySchedule = undefined, functionExports = undefined, children, onDeploy, onDeployError, onSaveInitial, onSeeDetails, onSaveDraftError, onSaveDraft, disableAi } = $props();
|
|
45
45
|
export function getInitialAndModifiedValues() {
|
|
46
46
|
return {
|
|
47
47
|
savedValue: savedScript,
|
|
@@ -186,12 +186,16 @@ const scriptKindOptions = [
|
|
|
186
186
|
let pathError = $state('');
|
|
187
187
|
let loadingSave = $state(false);
|
|
188
188
|
let loadingDraft = $state(false);
|
|
189
|
+
let timeout2 = undefined;
|
|
189
190
|
function encodeScriptState(script) {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
191
|
+
untrack(() => timeout2 && clearTimeout(timeout2));
|
|
192
|
+
timeout2 = setTimeout(() => {
|
|
193
|
+
replaceStateFn('#' +
|
|
194
|
+
encodeState({
|
|
195
|
+
...script,
|
|
196
|
+
draft_triggers: structuredClone(triggersState.getDraftTriggersSnapshot())
|
|
197
|
+
}));
|
|
198
|
+
}, 500);
|
|
195
199
|
}
|
|
196
200
|
let timeout = undefined;
|
|
197
201
|
function saveSessionDraft() {
|
|
@@ -715,7 +719,8 @@ $effect(() => {
|
|
|
715
719
|
});
|
|
716
720
|
});
|
|
717
721
|
$effect(() => {
|
|
718
|
-
|
|
722
|
+
readFieldsRecursively(script);
|
|
723
|
+
!disableHistoryChange && encodeScriptState(script);
|
|
719
724
|
});
|
|
720
725
|
loadWorkerTags();
|
|
721
726
|
async function loadWorkerTags() {
|
|
@@ -7,6 +7,6 @@ declare const ScriptBuilder: import("svelte").Component<ScriptBuilderProps, {
|
|
|
7
7
|
setPrimarySchedule: (schedule: ScheduleTrigger | undefined | false) => void;
|
|
8
8
|
setDraftTriggers: (triggers: Trigger[] | undefined) => void;
|
|
9
9
|
setCode: (code: string) => void;
|
|
10
|
-
}, "template" | "initialPath" | "savedScript">;
|
|
10
|
+
}, "script" | "template" | "initialPath" | "savedScript">;
|
|
11
11
|
type ScriptBuilder = ReturnType<typeof ScriptBuilder>;
|
|
12
12
|
export default ScriptBuilder;
|
|
@@ -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" | "
|
|
77
|
+
}, "args" | "code" | "assets" | "schema" | "selectedTab" | "editor" | "diffEditor" | "hasPreprocessor" | "captureTable">;
|
|
78
78
|
type ScriptEditor = InstanceType<typeof ScriptEditor>;
|
|
79
79
|
export default ScriptEditor;
|
|
@@ -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" | "
|
|
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';
|
|
@@ -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
|
-
|
|
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(
|
|
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 (
|
|
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 });
|
|
@@ -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" | "
|
|
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
|
|
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
|
|
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 '
|
|
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
|
-
|
|
28
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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(
|
|
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
|
}
|