windmill-components 1.28.7 → 1.34.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 (119) hide show
  1. package/common.d.ts +3 -0
  2. package/components/AppConnect.svelte +28 -12
  3. package/components/ArgInput.svelte +25 -14
  4. package/components/ArgInput.svelte.d.ts +4 -0
  5. package/components/CenteredPage.svelte +1 -1
  6. package/components/DisplayResult.svelte +3 -3
  7. package/components/Drawer.svelte +108 -0
  8. package/components/Drawer.svelte.d.ts +23 -0
  9. package/components/Editor.svelte +70 -78
  10. package/components/Editor.svelte.d.ts +3 -0
  11. package/components/EditorBar.svelte +23 -10
  12. package/components/FlowBuilder.svelte +39 -33
  13. package/components/FlowEditor.svelte +17 -58
  14. package/components/FlowJobResult.svelte +18 -17
  15. package/components/FlowPreview.svelte +13 -34
  16. package/components/FlowPreview.svelte.d.ts +2 -4
  17. package/components/FlowPreviewContent.svelte +56 -44
  18. package/components/FlowPreviewContent.svelte.d.ts +0 -1
  19. package/components/FlowStatusViewer.svelte +123 -205
  20. package/components/FlowStatusViewer.svelte.d.ts +7 -4
  21. package/components/FlowViewer.svelte +4 -1
  22. package/components/IconedPath.svelte +12 -0
  23. package/components/IconedPath.svelte.d.ts +16 -0
  24. package/components/IconedResourceType.svelte +21 -2
  25. package/components/IconedResourceType.svelte.d.ts +1 -0
  26. package/components/InputTransformForm.svelte +9 -8
  27. package/components/InputTransformForm.svelte.d.ts +1 -1
  28. package/components/InviteGlobalUser.svelte +1 -1
  29. package/components/ItemPicker.svelte +6 -1
  30. package/components/JobStatus.svelte +1 -1
  31. package/components/ModuleStep.svelte +73 -93
  32. package/components/ModuleStep.svelte.d.ts +7 -2
  33. package/components/Path.svelte +62 -40
  34. package/components/Path.svelte.d.ts +2 -0
  35. package/components/ProgressBar.svelte +31 -0
  36. package/components/ProgressBar.svelte.d.ts +17 -0
  37. package/components/ProgressBarPart.svelte +20 -0
  38. package/components/ProgressBarPart.svelte.d.ts +20 -0
  39. package/components/ResourceEditor.svelte +2 -1
  40. package/components/ResourcePicker.svelte +9 -0
  41. package/components/SchemaForm.svelte +9 -4
  42. package/components/SchemaForm.svelte.d.ts +1 -1
  43. package/components/SchemaModal.svelte +20 -3
  44. package/components/ScriptBuilder.svelte +58 -21
  45. package/components/ScriptBuilder.svelte.d.ts +1 -0
  46. package/components/ScriptEditor.svelte +4 -2
  47. package/components/SharedBadge.svelte +8 -3
  48. package/components/VariableEditor.svelte +1 -1
  49. package/components/flows/CopyFirstStepSchema.svelte +4 -3
  50. package/components/flows/DynamicInputHelpBox.svelte +6 -4
  51. package/components/flows/DynamicInputHelpBox.svelte.d.ts +1 -1
  52. package/components/flows/FlowBox.svelte +15 -2
  53. package/components/flows/FlowBox.svelte.d.ts +14 -14
  54. package/components/flows/FlowBoxHeader.svelte +10 -3
  55. package/components/flows/FlowBoxHeader.svelte.d.ts +3 -0
  56. package/components/flows/FlowInput.svelte +14 -12
  57. package/components/flows/FlowInputs.svelte +55 -35
  58. package/components/flows/FlowInputs.svelte.d.ts +3 -1
  59. package/components/flows/FlowModuleHeader.svelte +71 -55
  60. package/components/flows/FlowModuleHeader.svelte.d.ts +6 -6
  61. package/components/flows/FlowSettings.svelte +34 -57
  62. package/components/flows/FlowSettings.svelte.d.ts +0 -1
  63. package/components/flows/FlowTimeline.svelte +169 -0
  64. package/components/flows/FlowTimeline.svelte.d.ts +21 -0
  65. package/components/flows/flowState.d.ts +14 -0
  66. package/components/flows/flowState.js +52 -0
  67. package/components/flows/flowStateUtils.d.ts +37 -0
  68. package/components/flows/flowStateUtils.js +222 -0
  69. package/components/flows/flowStore.d.ts +1 -16
  70. package/components/flows/flowStore.js +7 -208
  71. package/components/flows/pickers/FlowScriptPicker.svelte +5 -9
  72. package/components/flows/pickers/FlowScriptPicker.svelte.d.ts +0 -1
  73. package/components/flows/pickers/PickHubScript.svelte +1 -1
  74. package/components/flows/pickers/PickHubScript.svelte.d.ts +1 -1
  75. package/components/flows/pickers/PickScript.svelte +1 -1
  76. package/components/flows/pickers/PickScript.svelte.d.ts +1 -1
  77. package/components/flows/scheduleUtils.d.ts +7 -0
  78. package/components/flows/scheduleUtils.js +21 -0
  79. package/components/flows/stepOpenedStore.d.ts +1 -0
  80. package/components/flows/stepOpenedStore.js +6 -0
  81. package/components/flows/utils.d.ts +5 -12
  82. package/components/flows/utils.js +40 -112
  83. package/components/icons/DiscordIcon.svelte +16 -0
  84. package/components/icons/DiscordIcon.svelte.d.ts +17 -0
  85. package/components/icons/HttpIcon.svelte +21 -0
  86. package/components/icons/HttpIcon.svelte.d.ts +17 -0
  87. package/components/icons/MastodonIcon.svelte +16 -0
  88. package/components/icons/MastodonIcon.svelte.d.ts +17 -0
  89. package/components/icons/MatrixIcon.svelte +16 -0
  90. package/components/icons/MatrixIcon.svelte.d.ts +17 -0
  91. package/components/icons/S3Icon.svelte +16 -0
  92. package/components/icons/S3Icon.svelte.d.ts +17 -0
  93. package/components/icons/WindmillIcon.svelte +68 -0
  94. package/components/icons/WindmillIcon.svelte.d.ts +17 -0
  95. package/components/preview/FlowPreviewStatus.svelte +28 -0
  96. package/components/preview/FlowPreviewStatus.svelte.d.ts +17 -0
  97. package/components/propertyPicker/ObjectViewer.svelte +13 -13
  98. package/components/propertyPicker/utils.js +3 -2
  99. package/components/tabs/Tab.svelte +12 -0
  100. package/components/tabs/Tab.svelte.d.ts +19 -0
  101. package/components/tabs/TabPanel.svelte +11 -0
  102. package/components/tabs/TabPanel.svelte.d.ts +20 -0
  103. package/components/tabs/Tabs.svelte +3 -0
  104. package/components/tabs/Tabs.svelte.d.ts +23 -0
  105. package/gen/core/OpenAPI.js +1 -1
  106. package/gen/core/request.js +1 -0
  107. package/gen/models/MainArgSignature.d.ts +14 -3
  108. package/gen/services/JobService.d.ts +10 -2
  109. package/gen/services/JobService.js +4 -2
  110. package/gen/services/ScriptService.d.ts +18 -0
  111. package/gen/services/ScriptService.js +30 -0
  112. package/infer.js +47 -24
  113. package/package.json +39 -20
  114. package/script_helpers.d.ts +4 -1
  115. package/script_helpers.js +68 -17
  116. package/stores.d.ts +1 -2
  117. package/stores.js +1 -4
  118. package/utils.d.ts +4 -2
  119. package/utils.js +33 -5
package/common.d.ts CHANGED
@@ -12,6 +12,9 @@ export interface SchemaProperty {
12
12
  type?: 'string' | 'number' | 'bytes';
13
13
  contentEncoding?: 'base64';
14
14
  };
15
+ properties?: {
16
+ [name: string]: SchemaProperty;
17
+ };
15
18
  }
16
19
  export declare type Schema = {
17
20
  $schema: string;
@@ -149,6 +149,13 @@ async function back() {
149
149
  }
150
150
  }
151
151
  const dispatch = createEventDispatcher();
152
+ $: isGoogleSignin =
153
+ step == 1 &&
154
+ (resource_type == 'google' ||
155
+ resource_type == 'gmail' ||
156
+ resource_type == 'gcal' ||
157
+ resource_type == 'gdrive' ||
158
+ resource_type == 'gsheets');
152
159
  </script>
153
160
 
154
161
  <Modal
@@ -161,20 +168,21 @@ const dispatch = createEventDispatcher();
161
168
  loadResources()
162
169
  }}
163
170
  >
164
- <div slot="title">Connect an App</div>
171
+ <div slot="title">Connect an API</div>
165
172
  <div slot="content">
166
173
  {#if step == 1}
167
174
  {#if resource_type && !connects[resource_type] && !connectsManual.find((x) => x[0] == resource_type)}
168
175
  <div class="bg-red-100 border-l-4 border-red-600 text-orange-700 p-4" role="alert">
169
- <p class="font-bold">No app integration for {resource_type}</p>
176
+ <p class="font-bold">No API integration for {resource_type}</p>
170
177
  <p>
171
- The resource type "{resource_type}" seems to not have an app integration. You can still
172
- create this resource manually by closing this modal and pressing: "Add a resource". You
173
- can also contribute to windmill and add it as an app integration if relevant.
178
+ The resource type "{resource_type}" seems to not have an OAuth API integration. You can
179
+ still create this resource manually by closing this modal and pressing: "Add a
180
+ resource". You can also contribute to windmill and add it as an API integration if
181
+ relevant.
174
182
  </p>
175
183
  </div>
176
184
  {/if}
177
- <PageHeader title="OAuth apps" />
185
+ <PageHeader title="OAuth APIs" />
178
186
  <div class="grid sm:grid-cols-2 md:grid-cols-3 gap-x-2 gap-y-1 items-center mb-2">
179
187
  {#each Object.entries(connects).sort((a, b) => a[0].localeCompare(b[0])) as [key, values]}
180
188
  <button
@@ -213,7 +221,7 @@ const dispatch = createEventDispatcher();
213
221
  ><span class="ml-2">{(scopes ?? []).length} item{(scopes ?? []).length > 1 ? 's' : ''}</span
214
222
  >
215
223
  {:else}
216
- <p class="italic text-sm">Pick an OAuth app and customize the scopes here</p>
224
+ <p class="italic text-sm">Pick an OAuth API and customize the scopes here</p>
217
225
  {/if}
218
226
  <PageHeader title="Extra Params" primary={false} />
219
227
  {#if !manual && resource_type != ''}
@@ -240,9 +248,9 @@ const dispatch = createEventDispatcher();
240
248
  >{(extra_params ?? []).length} item{(extra_params ?? []).length > 1 ? 's' : ''}</span
241
249
  >
242
250
  {:else}
243
- <p class="italic text-sm">Pick an OAuth app and customize the extra parameters here</p>
251
+ <p class="italic text-sm">Pick an OAuth API and customize the extra parameters here</p>
244
252
  {/if}
245
- <PageHeader title="Non OAuth apps" />
253
+ <PageHeader title="Non OAuth APIs" />
246
254
  <div class="grid sm:grid-cols-2 md:grid-cols-3 gap-x-2 gap-y-1 items-center mb-2">
247
255
  {#each connectsManual as [key, instructions]}
248
256
  <button
@@ -297,7 +305,7 @@ const dispatch = createEventDispatcher();
297
305
  <span class="font-mono">`$var:${path}`</span>). You can refer to this resource anywhere
298
306
  this token is required. A script can use the resource type
299
307
  <span class="font-mono">{resource_type}</span> as a type parameter to restrict the kind of
300
- tokens it accepts to this app.
308
+ tokens it accepts to this api.
301
309
  </li>
302
310
  </ul>
303
311
  {/if}
@@ -307,13 +315,21 @@ const dispatch = createEventDispatcher();
307
315
  <button class="default-button px-4 py-2 font-semibold" on:click={back}>Back</button>
308
316
  {/if}
309
317
  <button
310
- class="default-button px-4 py-2 font-semibold"
318
+ class={isGoogleSignin ? '' : 'default-button px-4 py-2 font-semibold'}
311
319
  class:default-button-disabled={(step == 1 && resource_type == '') ||
312
320
  (step == 2 && value == '') ||
313
321
  (step == 3 && pathError != '')}
314
322
  on:click={next}
315
323
  >
316
- {step == 3 ? 'Connect' : 'Next'}
324
+ {#if isGoogleSignin}
325
+ <img src="/google_signin.png" alt="Google sign-in" />
326
+ {:else if step == 1 && !manual}
327
+ Connect
328
+ {:else if step == 3}
329
+ Add resource
330
+ {:else}
331
+ Next
332
+ {/if}
317
333
  </button>
318
334
  </div>
319
335
  </Modal>
@@ -10,6 +10,7 @@ import ObjectResourceInput from './ObjectResourceInput.svelte';
10
10
  import ObjectTypeNarrowing from './ObjectTypeNarrowing.svelte';
11
11
  import ResourcePicker from './ResourcePicker.svelte';
12
12
  import StringTypeNarrowing from './StringTypeNarrowing.svelte';
13
+ import SchemaForm from './SchemaForm.svelte';
13
14
  export let label = '';
14
15
  export let value;
15
16
  export let defaultValue = undefined;
@@ -27,6 +28,7 @@ export let disabled = false;
27
28
  export let editableSchema = false;
28
29
  export let itemsType = undefined;
29
30
  export let displayHeader = true;
31
+ export let properties = undefined;
30
32
  let seeEditable = enum_ != undefined || pattern != undefined;
31
33
  const dispatch = createEventDispatcher();
32
34
  $: minHeight = `${1 + minRows * 1.2}em`;
@@ -55,10 +57,10 @@ $: {
55
57
  defaultValue && recomputeRowSize(JSON.stringify(defaultValue, null, 4));
56
58
  }
57
59
  function recomputeRowSize(str) {
58
- if (str.length > 50) {
59
- minRows = 3;
60
+ if (type == 'string') {
61
+ minRows = str.split('\n').length;
60
62
  }
61
- if (type != 'string') {
63
+ else if (type != 'string') {
62
64
  minRows = Math.max(minRows, Math.min(str.split(/\r\n|\r|\n/).length + 1, maxRows));
63
65
  }
64
66
  }
@@ -244,16 +246,25 @@ $: inputCat = computeInputCat(type, format, itemsType?.type, enum_, contentEncod
244
246
  {:else if inputCat == 'resource-object'}
245
247
  <ObjectResourceInput {format} bind:value />
246
248
  {:else if inputCat == 'object'}
247
- <textarea
248
- {disabled}
249
- style="min-height: {minHeight}; max-height: {maxHeight}"
250
- on:input={async () => recomputeRowSize(rawValue ?? '')}
251
- class="col-span-10 {valid
252
- ? ''
253
- : 'border border-red-700 border-opacity-30 focus:border-red-700 focus:border-opacity-30 bg-red-100'}"
254
- placeholder={defaultValue ? JSON.stringify(defaultValue, null, 4) : ''}
255
- bind:value={rawValue}
256
- />
249
+ {#if properties && Object.keys(properties).length > 0}
250
+ <div class="p-4 pl-8 border rounded w-full">
251
+ <SchemaForm
252
+ schema={{ properties, $schema: '', required: [], type: 'object' }}
253
+ bind:args={value}
254
+ />
255
+ </div>
256
+ {:else}
257
+ <textarea
258
+ {disabled}
259
+ style="min-height: {minHeight}; max-height: {maxHeight}"
260
+ on:input={async () => recomputeRowSize(rawValue ?? '')}
261
+ class="col-span-10 {valid
262
+ ? ''
263
+ : 'border border-red-700 border-opacity-30 focus:border-red-700 focus:border-opacity-30 bg-red-100'}"
264
+ placeholder={defaultValue ? JSON.stringify(defaultValue, null, 4) : ''}
265
+ bind:value={rawValue}
266
+ />
267
+ {/if}
257
268
  {:else if inputCat == 'enum'}
258
269
  <select {disabled} class="px-6" bind:value>
259
270
  {#each enum_ ?? [] as e}
@@ -270,7 +281,7 @@ $: inputCat = computeInputCat(type, format, itemsType?.type, enum_, contentEncod
270
281
  bind:this={editor}
271
282
  lang="sql"
272
283
  bind:code={value}
273
- class="two-lines-editor"
284
+ class="few-lines-editor"
274
285
  on:change={async () => {
275
286
  dispatch('input', { rawValue: value, isRaw: false })
276
287
  }}
@@ -1,6 +1,7 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
2
  import { type InputCat } from '../utils';
3
3
  import Editor from './Editor.svelte';
4
+ import type { SchemaProperty } from '../common';
4
5
  declare const __propDef: {
5
6
  props: {
6
7
  label?: string | undefined;
@@ -23,6 +24,9 @@ declare const __propDef: {
23
24
  contentEncoding?: "base64" | undefined;
24
25
  } | undefined;
25
26
  displayHeader?: boolean | undefined;
27
+ properties?: {
28
+ [name: string]: SchemaProperty;
29
+ } | undefined;
26
30
  editor?: Editor | undefined;
27
31
  evalValueToRaw?: (() => void) | undefined;
28
32
  inputCat?: InputCat | undefined;
@@ -1,4 +1,4 @@
1
- <div class="max-w-screen-lg flex grow w-full h-full xl:-ml-20">
1
+ <div class="max-w-screen-lg flex grow w-full h-full xl:-ml-20 mr-2 lg:mr-0">
2
2
  <div class="grow w-full h-full mt-4">
3
3
  <slot />
4
4
  </div>
@@ -49,7 +49,7 @@ function inferResultKind(result) {
49
49
 
50
50
  {#if result}
51
51
  {#if typeof result == 'object' && Object.keys(result).length > 0}<div>
52
- The result keys are: <b>{Object.keys(result).join(', ')}</b>
52
+ The result keys are: <b>{truncate(Object.keys(result).join(', '), 50)}</b>
53
53
  </div>
54
54
  {/if}
55
55
  {#if resultKind == 'table-col'}
@@ -74,10 +74,10 @@ function inferResultKind(result) {
74
74
  >
75
75
  <TableCustom>
76
76
  <tbody slot="body">
77
- {#each asListOfList(Object.values(result)[0]) as row}
77
+ {#each asListOfList(result) as row}
78
78
  <tr>
79
79
  {#each row as v}
80
- <td>{truncate(v, 200) ?? ''}</td>
80
+ <td>{truncate(JSON.stringify(v), 200) ?? ''}</td>
81
81
  {/each}
82
82
  </tr>
83
83
  {/each}
@@ -0,0 +1,108 @@
1
+ <script>import { onMount } from 'svelte';
2
+ import { createEventDispatcher } from 'svelte';
3
+ export let open = false;
4
+ export let duration = 0.3;
5
+ export let placement = 'right';
6
+ export let size = '600px';
7
+ let mounted = false;
8
+ const dispatch = createEventDispatcher();
9
+ $: style = `--duration: ${duration}s; --size: ${size};`;
10
+ function scrollLock(open) {
11
+ const body = document.querySelector('body');
12
+ if (mounted && body) {
13
+ body.style.overflowY = open ? 'hidden' : 'auto';
14
+ }
15
+ }
16
+ $: scrollLock(open);
17
+ function handleClickAway() {
18
+ dispatch('clickAway');
19
+ open = !open;
20
+ }
21
+ onMount(() => {
22
+ mounted = true;
23
+ scrollLock(open);
24
+ });
25
+ </script>
26
+
27
+ <aside class="drawer" class:open {style}>
28
+ <div class="overlay" on:click={handleClickAway} />
29
+
30
+ <div class="panel {placement}" class:size>
31
+ <slot />
32
+ </div>
33
+ </aside>
34
+
35
+ <style>
36
+ .drawer {
37
+ position: fixed;
38
+ top: 0;
39
+ left: 0;
40
+ height: 100%;
41
+ width: 100%;
42
+ z-index: -1;
43
+ transition: z-index var(--duration) step-end;
44
+ }
45
+
46
+ .drawer.open {
47
+ z-index: 99;
48
+ transition: z-index var(--duration) step-start;
49
+ }
50
+
51
+ .overlay {
52
+ position: fixed;
53
+ top: 0;
54
+ left: 0;
55
+ width: 100%;
56
+ height: 100%;
57
+ background: rgba(100, 100, 100, 0.5);
58
+ opacity: 0;
59
+ z-index: 2;
60
+ transition: opacity var(--duration) ease;
61
+ }
62
+
63
+ .drawer.open .overlay {
64
+ opacity: 1;
65
+ }
66
+
67
+ .panel {
68
+ position: fixed;
69
+ width: 100%;
70
+ background: white;
71
+ z-index: 3;
72
+ transition: transform var(--duration) ease;
73
+ overflow: auto;
74
+ }
75
+
76
+ .panel.left {
77
+ left: 0;
78
+ transform: translate(-100%, 0);
79
+ }
80
+
81
+ .panel.right {
82
+ right: 0;
83
+ transform: translate(100%, 0);
84
+ }
85
+
86
+ .panel.top {
87
+ top: 0;
88
+ transform: translate(0, -100%);
89
+ }
90
+
91
+ .panel.bottom {
92
+ bottom: 0;
93
+ transform: translate(0, 100%);
94
+ }
95
+
96
+ .panel.left.size,
97
+ .panel.right.size {
98
+ max-width: var(--size);
99
+ }
100
+
101
+ .panel.top.size,
102
+ .panel.bottom.size {
103
+ max-height: var(--size);
104
+ }
105
+
106
+ .drawer.open .panel {
107
+ transform: translate(0, 0);
108
+ }</style>
@@ -0,0 +1,23 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ open?: boolean | undefined;
5
+ duration?: number | undefined;
6
+ placement?: string | undefined;
7
+ size?: string | undefined;
8
+ };
9
+ events: {
10
+ clickAway: CustomEvent<any>;
11
+ } & {
12
+ [evt: string]: CustomEvent<any>;
13
+ };
14
+ slots: {
15
+ default: {};
16
+ };
17
+ };
18
+ export declare type DrawerProps = typeof __propDef.props;
19
+ export declare type DrawerEvents = typeof __propDef.events;
20
+ export declare type DrawerSlots = typeof __propDef.slots;
21
+ export default class Drawer extends SvelteComponentTyped<DrawerProps, DrawerEvents, DrawerSlots> {
22
+ }
23
+ export {};
@@ -1,32 +1,24 @@
1
1
  <script context="module">import * as monaco from 'monaco-editor';
2
- import { language as sql } from 'monaco-editor/esm/vs/basic-languages/sql/sql';
3
- monaco.languages.register({
4
- id: 'python',
5
- extensions: ['.py'],
6
- aliases: ['python'],
7
- mimetypes: ['application/text']
2
+ monaco.languages.typescript.javascriptDefaults.setCompilerOptions({
3
+ target: monaco.languages.typescript.ScriptTarget.Latest,
4
+ allowNonTsExtensions: true,
5
+ noLib: true
8
6
  });
9
- monaco.languages.register({
10
- id: 'sql',
11
- extensions: ['.sql'],
12
- aliases: ['SQL'],
13
- mimetypes: ['application/text']
7
+ monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
8
+ target: monaco.languages.typescript.ScriptTarget.Latest,
9
+ allowNonTsExtensions: true,
10
+ noLib: true
14
11
  });
15
- monaco.languages.registerInlineCompletionsProvider('sql', {
16
- provideInlineCompletions: (a, b, c, d) => {
17
- const w = a.getWordUntilPosition(b).word.toLowerCase();
18
- return {
19
- items: w.length > 0
20
- ? ['SELECT', 'FROM', 'WHILE', 'AND', 'OR', 'DELETE', 'UPDATE', 'SET', 'WHEN', 'LIMIT']
21
- .concat(sql.keywords)
22
- .filter((x) => x.toLowerCase().startsWith(w))
23
- .map((x) => ({
24
- text: x + ' '
25
- }))
26
- : []
27
- };
28
- },
29
- freeInlineCompletions: () => { }
12
+ monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
13
+ noSemanticValidation: true,
14
+ noSuggestionDiagnostics: true,
15
+ noSyntaxValidation: true
16
+ });
17
+ monaco.languages.json.jsonDefaults.setDiagnosticsOptions({
18
+ validate: true,
19
+ allowComments: false,
20
+ schemas: [],
21
+ enableSchemaRequest: true
30
22
  });
31
23
  </script>
32
24
 
@@ -36,10 +28,11 @@ import { sendUserToast } from '../utils';
36
28
  import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';
37
29
  import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';
38
30
  import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker';
39
- import { createEventDispatcher, onDestroy, onMount } from 'svelte';
40
31
  import { buildWorkerDefinition } from 'monaco-editor-workers';
41
- import { StandaloneServices } from 'vscode/services';
32
+ import { createEventDispatcher, onDestroy, onMount } from 'svelte';
42
33
  import getMessageServiceOverride from 'vscode/service-override/messages';
34
+ import { StandaloneServices } from 'vscode/services';
35
+ import { DENO_INIT_CODE_CLEAR, PYTHON_INIT_CODE_CLEAR } from '../script_helpers';
43
36
  StandaloneServices.initialize({
44
37
  ...getMessageServiceOverride(document.body)
45
38
  });
@@ -55,6 +48,7 @@ export let automaticLayout = true;
55
48
  export let websocketAlive = { pyright: false, black: false, deno: false };
56
49
  export let extraLib = '';
57
50
  export let extraLibPath = '';
51
+ export let shouldBindKey = true;
58
52
  let websockets = [];
59
53
  let websocketInterval;
60
54
  let lastWsAttempt = new Date();
@@ -84,7 +78,7 @@ if (browser) {
84
78
  }
85
79
  }
86
80
  export function getCode() {
87
- return editor?.getValue();
81
+ return editor?.getValue() ?? '';
88
82
  }
89
83
  export function insertAtCursor(code) {
90
84
  if (editor) {
@@ -115,21 +109,33 @@ export function insertAtBeginning(code) {
115
109
  }
116
110
  }
117
111
  export function setCode(ncode) {
112
+ code = ncode;
118
113
  if (editor) {
119
- return editor.setValue(ncode);
120
- }
121
- else {
122
- code = ncode;
114
+ editor.setValue(ncode);
123
115
  }
124
116
  }
125
117
  function format() {
126
118
  if (editor) {
119
+ code = getCode();
127
120
  editor.getAction('editor.action.formatDocument').run();
128
121
  if (formatAction) {
129
122
  formatAction();
130
123
  }
131
124
  }
132
125
  }
126
+ export async function clearContent() {
127
+ if (editor) {
128
+ if (lang == 'typescript') {
129
+ setCode(DENO_INIT_CODE_CLEAR);
130
+ }
131
+ else if (lang == 'python') {
132
+ setCode(PYTHON_INIT_CODE_CLEAR);
133
+ }
134
+ else {
135
+ setCode('');
136
+ }
137
+ }
138
+ }
133
139
  let command = undefined;
134
140
  let monacoServices = undefined;
135
141
  export async function reloadWebsocket() {
@@ -286,9 +292,10 @@ export async function reloadWebsocket() {
286
292
  }
287
293
  websocketInterval && clearInterval(websocketInterval);
288
294
  websocketInterval = setInterval(() => {
295
+ console.log(websocketInterval, document.visibilityState, new Date().getTime() - lastWsAttempt.getTime(), nbWsAttempt);
289
296
  if (document.visibilityState == 'visible') {
290
297
  if (!lastWsAttempt ||
291
- (lastWsAttempt.getTime() - new Date().getTime() > 60000 && nbWsAttempt < 2)) {
298
+ (new Date().getTime() - lastWsAttempt.getTime() > 60000 && nbWsAttempt < 2)) {
292
299
  if (!websocketAlive.black && !websocketAlive.deno && !websocketAlive.pyright) {
293
300
  console.log('reconnecting to language servers');
294
301
  lastWsAttempt = new Date();
@@ -351,60 +358,45 @@ async function loadMonaco() {
351
358
  enabled: true
352
359
  }
353
360
  });
354
- editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, function () {
355
- format();
356
- });
357
- editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, function () {
358
- if (cmdEnterAction) {
359
- cmdEnterAction();
360
- }
361
- });
361
+ if (shouldBindKey) {
362
+ editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, function () {
363
+ format();
364
+ });
365
+ editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, function () {
366
+ if (cmdEnterAction) {
367
+ cmdEnterAction();
368
+ }
369
+ });
370
+ }
371
+ let timeoutModel = undefined;
362
372
  editor.onDidChangeModelContent((event) => {
363
- code = getCode();
373
+ timeoutModel && clearTimeout(timeoutModel);
374
+ timeoutModel = setTimeout(() => {
375
+ code = getCode();
376
+ }, 500);
364
377
  dispatch('change');
365
378
  });
366
379
  editor.onDidFocusEditorText(() => {
367
380
  dispatch('focus');
381
+ if (deno || lang == 'typescript') {
382
+ if (!websocketAlive.black &&
383
+ !websocketAlive.deno &&
384
+ !websocketAlive.pyright &&
385
+ !websocketInterval) {
386
+ reloadWebsocket();
387
+ }
388
+ }
368
389
  });
369
390
  editor.onDidBlurEditorText(() => {
370
391
  dispatch('blur');
371
392
  });
372
- if (lang == 'sql') {
373
- monaco.languages.register;
374
- }
375
- else if (lang == 'json') {
376
- monaco.languages.json.jsonDefaults.setDiagnosticsOptions({
377
- validate: true,
378
- allowComments: false,
379
- schemas: [],
380
- enableSchemaRequest: true
381
- });
382
- }
383
- else if (lang == 'javascript' || lang == 'typescript') {
384
- monaco.languages.typescript.javascriptDefaults.setCompilerOptions({
385
- target: monaco.languages.typescript.ScriptTarget.Latest,
386
- allowNonTsExtensions: true,
387
- noLib: true
388
- });
389
- if (lang == 'typescript') {
390
- monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
391
- target: monaco.languages.typescript.ScriptTarget.Latest,
392
- allowNonTsExtensions: true,
393
- noLib: true
394
- });
395
- if (deno) {
396
- monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
397
- noSemanticValidation: true,
398
- noSuggestionDiagnostics: true,
399
- noSyntaxValidation: true
400
- });
401
- }
402
- }
403
- if (lang == 'javascript') {
404
- if (extraLib != '' && extraLibPath != '') {
405
- monaco.languages.typescript.javascriptDefaults.addExtraLib(extraLib, extraLibPath);
393
+ if (lang == 'javascript' && extraLib != '' && extraLibPath != '') {
394
+ monaco.languages.typescript.javascriptDefaults.setExtraLibs([
395
+ {
396
+ content: extraLib,
397
+ filePath: extraLibPath
406
398
  }
407
- }
399
+ ]);
408
400
  }
409
401
  if (lang == 'python' || deno) {
410
402
  reloadWebsocket();
@@ -16,10 +16,12 @@ declare const __propDef: {
16
16
  } | undefined;
17
17
  extraLib?: string | undefined;
18
18
  extraLibPath?: string | undefined;
19
+ shouldBindKey?: boolean | undefined;
19
20
  getCode?: (() => string) | undefined;
20
21
  insertAtCursor?: ((code: string) => void) | undefined;
21
22
  insertAtBeginning?: ((code: string) => void) | undefined;
22
23
  setCode?: ((ncode: string) => void) | undefined;
24
+ clearContent?: (() => Promise<void>) | undefined;
23
25
  reloadWebsocket?: (() => Promise<void>) | undefined;
24
26
  };
25
27
  events: {
@@ -39,6 +41,7 @@ export default class Editor extends SvelteComponentTyped<EditorProps, EditorEven
39
41
  get insertAtCursor(): (code: string) => void;
40
42
  get insertAtBeginning(): (code: string) => void;
41
43
  get setCode(): (ncode: string) => void;
44
+ get clearContent(): () => Promise<void>;
42
45
  get reloadWebsocket(): () => Promise<void>;
43
46
  }
44
47
  export {};
@@ -84,7 +84,7 @@ async function loadScripts() {
84
84
  if (lang == 'deno') {
85
85
  if (!editor.getCode().includes('import * as wmill from')) {
86
86
  editor.insertAtBeginning(
87
- `import * as wmill from 'https://deno.land/x/windmill@v${__pkg__.version}/index.ts'\n`
87
+ `import * as wmill from 'https://deno.land/x/windmill@v${__pkg__.version}/mod.ts'\n`
88
88
  )
89
89
  }
90
90
  editor.insertAtCursor(`(await wmill.getVariable('${path}'))`)
@@ -123,7 +123,7 @@ async function loadScripts() {
123
123
  if (lang == 'deno') {
124
124
  if (!editor.getCode().includes('import * as wmill from')) {
125
125
  editor.insertAtBeginning(
126
- `import * as wmill from 'https://deno.land/x/windmill@v${__pkg__.version}/index.ts'\n`
126
+ `import * as wmill from 'https://deno.land/x/windmill@v${__pkg__.version}/mod.ts'\n`
127
127
  )
128
128
  }
129
129
  editor.insertAtCursor(`(await wmill.getResource('${path}'))`)
@@ -195,21 +195,34 @@ async function loadScripts() {
195
195
  Script explorer
196
196
  </Button>
197
197
  </div>
198
- <div class="flex flex-row-reverse w-full">
198
+ <div class="flex flex-row-reverse gap-x-2 w-full">
199
199
  <Button
200
200
  size="xs"
201
+ class={!websocketAlive.pyright && !websocketAlive.deno && !websocketAlive.black
202
+ ? 'bg-red-50'
203
+ : ''}
201
204
  color="alternative"
202
205
  on:click={() => {
203
206
  editor.reloadWebsocket()
204
207
  }}
205
208
  >
206
- Reload assistants (status:&nbsp;
207
- {#if lang == 'deno'}
208
- <span class={websocketAlive.deno ? 'text-green-600' : 'text-red-600'}>Deno</span>
209
- {:else if lang == 'python3'}
210
- <span class={websocketAlive.pyright ? 'text-green-600' : 'text-red-600'}>Pyright</span>
211
- <span class={websocketAlive.black ? 'text-green-600' : 'text-red-600'}>Black</span>
212
- {/if})
209
+ Reload assistants
210
+ <span class="ml-1">
211
+ {#if lang == 'deno'}
212
+ (<span class={websocketAlive.deno ? 'text-green-600' : 'text-red-700'}>Deno</span>)
213
+ {:else if lang == 'python3'}
214
+ (<span class={websocketAlive.pyright ? 'text-green-600' : 'text-red-700'}>Pyright</span>
215
+ &nbsp;
216
+ <span class={websocketAlive.black ? 'text-green-600' : 'text-red-700'}>Black</span>)
217
+ {/if}
218
+ </span>
213
219
  </Button>
220
+ <Button
221
+ size="xs"
222
+ color="alternative"
223
+ on:click={() => {
224
+ editor.clearContent()
225
+ }}>Reset content</Button
226
+ >
214
227
  </div>
215
228
  </div>