windmill-components 1.28.6 → 1.35.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 (158) hide show
  1. package/common.d.ts +3 -0
  2. package/components/AppConnect.svelte +29 -13
  3. package/components/ArgInput.svelte +28 -14
  4. package/components/ArgInput.svelte.d.ts +4 -0
  5. package/components/CenteredPage.svelte +2 -2
  6. package/components/DisplayResult.svelte +3 -3
  7. package/components/Editor.svelte +97 -97
  8. package/components/Editor.svelte.d.ts +3 -0
  9. package/components/EditorBar.svelte +57 -38
  10. package/components/FlowBuilder.svelte +40 -32
  11. package/components/FlowEditor.svelte +19 -57
  12. package/components/FlowEditor.svelte.d.ts +1 -0
  13. package/components/FlowJobResult.svelte +16 -16
  14. package/components/FlowModulesViewer.svelte +97 -0
  15. package/components/FlowModulesViewer.svelte.d.ts +17 -0
  16. package/components/FlowPreview.svelte +47 -68
  17. package/components/FlowPreview.svelte.d.ts +2 -6
  18. package/components/FlowPreviewContent.svelte +59 -44
  19. package/components/FlowPreviewContent.svelte.d.ts +0 -1
  20. package/components/FlowStatusViewer.svelte +104 -204
  21. package/components/FlowStatusViewer.svelte.d.ts +7 -4
  22. package/components/FlowViewer.svelte +60 -155
  23. package/components/FlowViewer.svelte.d.ts +0 -1
  24. package/components/IconedPath.svelte +12 -0
  25. package/components/IconedPath.svelte.d.ts +16 -0
  26. package/components/IconedResourceType.svelte +21 -2
  27. package/components/IconedResourceType.svelte.d.ts +1 -0
  28. package/components/InputTransformForm.svelte +9 -8
  29. package/components/InputTransformForm.svelte.d.ts +1 -1
  30. package/components/InviteGlobalUser.svelte +1 -1
  31. package/components/ItemPicker.svelte +6 -1
  32. package/components/JobStatus.svelte +1 -1
  33. package/components/ModuleStep.svelte +74 -96
  34. package/components/ModuleStep.svelte.d.ts +7 -4
  35. package/components/Multiselect.svelte +1 -1
  36. package/components/Path.svelte +62 -40
  37. package/components/Path.svelte.d.ts +2 -0
  38. package/components/ProgressBar.svelte +31 -0
  39. package/components/ProgressBar.svelte.d.ts +17 -0
  40. package/components/ProgressBarPart.svelte +20 -0
  41. package/components/ProgressBarPart.svelte.d.ts +20 -0
  42. package/components/ResourceEditor.svelte +2 -1
  43. package/components/ResourcePicker.svelte +9 -0
  44. package/components/SchemaForm.svelte +9 -4
  45. package/components/SchemaForm.svelte.d.ts +1 -1
  46. package/components/SchemaModal.svelte +20 -3
  47. package/components/SchemaViewer.svelte +58 -68
  48. package/components/ScriptBuilder.svelte +145 -122
  49. package/components/ScriptBuilder.svelte.d.ts +1 -0
  50. package/components/ScriptEditor.svelte +118 -339
  51. package/components/ScriptEditor.svelte.d.ts +0 -2
  52. package/components/ScriptSchema.svelte +45 -44
  53. package/components/SharedBadge.svelte +8 -3
  54. package/components/VariableEditor.svelte +1 -1
  55. package/components/common/drawer/Drawer.svelte +108 -0
  56. package/components/common/drawer/Drawer.svelte.d.ts +23 -0
  57. package/components/common/drawer/DrawerContent.svelte +19 -0
  58. package/components/common/drawer/DrawerContent.svelte.d.ts +20 -0
  59. package/components/common/menu/Menu.svelte +57 -0
  60. package/components/common/menu/Menu.svelte.d.ts +23 -0
  61. package/components/common/menu/MenuItem.svelte +9 -0
  62. package/components/common/menu/MenuItem.svelte.d.ts +27 -0
  63. package/components/common/tabs/Tab.svelte +17 -0
  64. package/components/common/tabs/Tab.svelte.d.ts +18 -0
  65. package/components/common/tabs/TabContent.svelte +12 -0
  66. package/components/common/tabs/TabContent.svelte.d.ts +19 -0
  67. package/components/common/tabs/Tabs.svelte +20 -0
  68. package/components/common/tabs/Tabs.svelte.d.ts +24 -0
  69. package/components/flows/CopyFirstStepSchema.svelte +4 -3
  70. package/components/flows/DynamicInputHelpBox.svelte +6 -4
  71. package/components/flows/DynamicInputHelpBox.svelte.d.ts +1 -1
  72. package/components/flows/FlowBox.svelte +15 -2
  73. package/components/flows/FlowBox.svelte.d.ts +14 -14
  74. package/components/flows/FlowBoxHeader.svelte +10 -3
  75. package/components/flows/FlowBoxHeader.svelte.d.ts +3 -0
  76. package/components/flows/FlowInput.svelte +14 -12
  77. package/components/flows/FlowInputs.svelte +56 -22
  78. package/components/flows/FlowInputs.svelte.d.ts +3 -1
  79. package/components/flows/FlowModuleHeader.svelte +69 -54
  80. package/components/flows/FlowModuleHeader.svelte.d.ts +6 -6
  81. package/components/flows/FlowSettings.svelte +82 -92
  82. package/components/flows/FlowSettings.svelte.d.ts +1 -1
  83. package/components/flows/FlowTimeline.svelte +169 -0
  84. package/components/flows/FlowTimeline.svelte.d.ts +21 -0
  85. package/components/flows/flowState.d.ts +14 -0
  86. package/components/flows/flowState.js +52 -0
  87. package/components/flows/flowStateUtils.d.ts +37 -0
  88. package/components/flows/flowStateUtils.js +220 -0
  89. package/components/flows/flowStore.d.ts +1 -16
  90. package/components/flows/flowStore.js +26 -203
  91. package/components/flows/pickers/FlowScriptPicker.svelte +5 -9
  92. package/components/flows/pickers/FlowScriptPicker.svelte.d.ts +0 -1
  93. package/components/flows/pickers/PickHubScript.svelte +1 -1
  94. package/components/flows/pickers/PickHubScript.svelte.d.ts +1 -1
  95. package/components/flows/pickers/PickScript.svelte +1 -1
  96. package/components/flows/pickers/PickScript.svelte.d.ts +1 -1
  97. package/components/flows/scheduleUtils.d.ts +7 -0
  98. package/components/flows/scheduleUtils.js +21 -0
  99. package/components/flows/stepOpenedStore.d.ts +1 -0
  100. package/components/flows/stepOpenedStore.js +6 -0
  101. package/components/flows/utils.d.ts +6 -13
  102. package/components/flows/utils.js +47 -119
  103. package/components/icons/DiscordIcon.svelte +16 -0
  104. package/components/icons/DiscordIcon.svelte.d.ts +17 -0
  105. package/components/icons/HttpIcon.svelte +21 -0
  106. package/components/icons/HttpIcon.svelte.d.ts +17 -0
  107. package/components/icons/MastodonIcon.svelte +16 -0
  108. package/components/icons/MastodonIcon.svelte.d.ts +17 -0
  109. package/components/icons/MatrixIcon.svelte +16 -0
  110. package/components/icons/MatrixIcon.svelte.d.ts +17 -0
  111. package/components/icons/S3Icon.svelte +16 -0
  112. package/components/icons/S3Icon.svelte.d.ts +17 -0
  113. package/components/icons/WindmillIcon.svelte +68 -0
  114. package/components/icons/WindmillIcon.svelte.d.ts +17 -0
  115. package/components/jobs/JobDetail.svelte +176 -0
  116. package/components/jobs/JobDetail.svelte.d.ts +17 -0
  117. package/components/landing/FlowGettingStarted.svelte +95 -0
  118. package/components/landing/FlowGettingStarted.svelte.d.ts +19 -0
  119. package/components/landing/FlowLandingBox.svelte +69 -0
  120. package/components/landing/FlowLandingBox.svelte.d.ts +17 -0
  121. package/components/landing/RessourceGettingStarted.svelte +51 -0
  122. package/components/landing/RessourceGettingStarted.svelte.d.ts +19 -0
  123. package/components/landing/ScriptBox.svelte +81 -0
  124. package/components/landing/ScriptBox.svelte.d.ts +17 -0
  125. package/components/landing/ScriptGettingStarted.svelte +93 -0
  126. package/components/landing/ScriptGettingStarted.svelte.d.ts +19 -0
  127. package/components/preview/FlowPreviewStatus.svelte +28 -0
  128. package/components/preview/FlowPreviewStatus.svelte.d.ts +17 -0
  129. package/components/propertyPicker/ObjectViewer.svelte +13 -13
  130. package/components/propertyPicker/utils.js +3 -2
  131. package/components/script_editor/LogPanel.svelte +172 -0
  132. package/components/script_editor/LogPanel.svelte.d.ts +22 -0
  133. package/components/sidebar/MenuLink.svelte +49 -0
  134. package/components/sidebar/MenuLink.svelte.d.ts +21 -0
  135. package/components/sidebar/SidebarContent.svelte +55 -0
  136. package/components/sidebar/SidebarContent.svelte.d.ts +16 -0
  137. package/components/sidebar/UserMenu.svelte +62 -0
  138. package/components/sidebar/UserMenu.svelte.d.ts +16 -0
  139. package/components/sidebar/WorkspaceMenu.svelte +66 -0
  140. package/components/sidebar/WorkspaceMenu.svelte.d.ts +16 -0
  141. package/gen/core/OpenAPI.js +1 -1
  142. package/gen/core/request.js +1 -0
  143. package/gen/models/FlowModule.d.ts +5 -3
  144. package/gen/models/ForloopFlow.d.ts +2 -2
  145. package/gen/models/MainArgSignature.d.ts +14 -3
  146. package/gen/services/JobService.d.ts +10 -2
  147. package/gen/services/JobService.js +4 -2
  148. package/gen/services/ScriptService.d.ts +18 -0
  149. package/gen/services/ScriptService.js +30 -0
  150. package/infer.js +47 -24
  151. package/logout.js +1 -1
  152. package/package.json +57 -23
  153. package/script_helpers.d.ts +4 -1
  154. package/script_helpers.js +68 -17
  155. package/stores.d.ts +0 -2
  156. package/stores.js +0 -4
  157. package/utils.d.ts +5 -2
  158. package/utils.js +37 -6
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,11 +221,11 @@ 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 != ''}
220
- {#each extra_params as [k, v], i}
228
+ {#each extra_params as [k, v]}
221
229
  <div class="flex flex-row max-w-md">
222
230
  <input type="text" bind:value={k} />
223
231
  <input type="text" bind:value={v} />
@@ -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,10 @@ $: 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"
285
+ on:change={async () => {
286
+ dispatch('input', { rawValue: value, isRaw: false })
287
+ }}
274
288
  />
275
289
  </div>
276
290
  {:else if inputCat == 'base64'}
@@ -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,5 +1,5 @@
1
- <div class="max-w-screen-lg flex grow w-full h-full xl:-ml-20">
2
- <div class="grow w-full h-full mt-4">
1
+ <div class="py-6">
2
+ <div class="max-w-6xl mx-auto px-4 sm:px-6 md:px-8">
3
3
  <slot />
4
4
  </div>
5
5
  </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}
@@ -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,35 @@ 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
+ }
139
+ let command = undefined;
140
+ let monacoServices = undefined;
133
141
  export async function reloadWebsocket() {
134
142
  await closeWebsockets();
135
143
  if (lang == 'python' || deno) {
@@ -138,8 +146,9 @@ export async function reloadWebsocket() {
138
146
  const { toSocket, WebSocketMessageReader, WebSocketMessageWriter } = await import('vscode-ws-jsonrpc');
139
147
  const vscode = await import('vscode');
140
148
  const { RequestType } = await import('vscode-jsonrpc');
149
+ // install Monaco language client services
141
150
  const { MonacoServices } = await import('monaco-languageclient');
142
- MonacoServices.install();
151
+ monacoServices = MonacoServices.install();
143
152
  function createLanguageClient(transports, name, initializationOptions) {
144
153
  const client = new MonacoLanguageClient({
145
154
  name: name,
@@ -199,24 +208,24 @@ export async function reloadWebsocket() {
199
208
  websocketAlive[name] = false;
200
209
  });
201
210
  try {
211
+ console.log('started client');
202
212
  await languageClient.start();
203
213
  }
204
214
  catch (err) {
215
+ console.log('err at client');
205
216
  console.error(err);
206
217
  throw new Error(err);
207
218
  }
208
219
  lastWsAttempt = new Date();
209
220
  nbWsAttempt = 0;
210
221
  if (name == 'deno') {
211
- vscode.commands.getCommands().then((v) => {
212
- if (!v.includes('deno.cache')) {
213
- vscode.commands.registerCommand('deno.cache', (uris = []) => {
214
- languageClient.sendRequest(new RequestType('deno/cache'), {
215
- referrer: { uri },
216
- uris: uris.map((uri) => ({ uri }))
217
- });
218
- });
219
- }
222
+ command && command.dispose();
223
+ command = undefined;
224
+ command = vscode.commands.registerCommand('deno.cache', (uris = []) => {
225
+ languageClient.sendRequest(new RequestType('deno/cache'), {
226
+ referrer: { uri },
227
+ uris: uris.map((uri) => ({ uri }))
228
+ });
220
229
  });
221
230
  }
222
231
  websocketAlive[name] = true;
@@ -283,9 +292,10 @@ export async function reloadWebsocket() {
283
292
  }
284
293
  websocketInterval && clearInterval(websocketInterval);
285
294
  websocketInterval = setInterval(() => {
295
+ console.log(websocketInterval, document.visibilityState, new Date().getTime() - lastWsAttempt.getTime(), nbWsAttempt);
286
296
  if (document.visibilityState == 'visible') {
287
297
  if (!lastWsAttempt ||
288
- (lastWsAttempt.getTime() - new Date().getTime() > 60000 && nbWsAttempt < 2)) {
298
+ (new Date().getTime() - lastWsAttempt.getTime() > 60000 && nbWsAttempt < 2)) {
289
299
  if (!websocketAlive.black && !websocketAlive.deno && !websocketAlive.pyright) {
290
300
  console.log('reconnecting to language servers');
291
301
  lastWsAttempt = new Date();
@@ -304,12 +314,20 @@ export async function reloadWebsocket() {
304
314
  }
305
315
  }
306
316
  async function closeWebsockets() {
317
+ command && command.dispose();
318
+ command = undefined;
319
+ monacoServices && monacoServices.dispose();
320
+ monacoServices = undefined;
307
321
  for (const x of websockets) {
308
322
  try {
309
323
  await x[0].stop();
310
324
  x[1].close();
311
325
  }
312
326
  catch (err) {
327
+ try {
328
+ x[1].close();
329
+ }
330
+ catch (err) { }
313
331
  console.log('error disposing websocket', err);
314
332
  }
315
333
  }
@@ -340,74 +358,56 @@ async function loadMonaco() {
340
358
  enabled: true
341
359
  }
342
360
  });
343
- editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, function () {
344
- format();
345
- });
346
- editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, function () {
347
- if (cmdEnterAction) {
348
- cmdEnterAction();
349
- }
350
- });
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;
351
372
  editor.onDidChangeModelContent((event) => {
352
- code = getCode();
373
+ timeoutModel && clearTimeout(timeoutModel);
374
+ timeoutModel = setTimeout(() => {
375
+ code = getCode();
376
+ }, 500);
353
377
  dispatch('change');
354
378
  });
355
379
  editor.onDidFocusEditorText(() => {
356
380
  dispatch('focus');
381
+ if (deno || lang == 'typescript') {
382
+ if (!websocketAlive.black &&
383
+ !websocketAlive.deno &&
384
+ !websocketAlive.pyright &&
385
+ !websocketInterval) {
386
+ reloadWebsocket();
387
+ }
388
+ }
357
389
  });
358
390
  editor.onDidBlurEditorText(() => {
359
391
  dispatch('blur');
360
392
  });
361
- if (lang == 'sql') {
362
- monaco.languages.register;
363
- }
364
- else if (lang == 'json') {
365
- monaco.languages.json.jsonDefaults.setDiagnosticsOptions({
366
- validate: true,
367
- allowComments: false,
368
- schemas: [],
369
- enableSchemaRequest: true
370
- });
371
- }
372
- else if (lang == 'javascript' || lang == 'typescript') {
373
- monaco.languages.typescript.javascriptDefaults.setCompilerOptions({
374
- target: monaco.languages.typescript.ScriptTarget.Latest,
375
- allowNonTsExtensions: true,
376
- noLib: true
377
- });
378
- if (lang == 'typescript') {
379
- monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
380
- target: monaco.languages.typescript.ScriptTarget.Latest,
381
- allowNonTsExtensions: true,
382
- noLib: true
383
- });
384
- if (deno) {
385
- monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
386
- noSemanticValidation: true,
387
- noSuggestionDiagnostics: true,
388
- noSyntaxValidation: true
389
- });
390
- }
391
- }
392
- if (lang == 'javascript') {
393
- if (extraLib != '' && extraLibPath != '') {
394
- 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
395
398
  }
396
- }
399
+ ]);
397
400
  }
398
401
  if (lang == 'python' || deno) {
399
- // install Monaco language client services
400
402
  reloadWebsocket();
401
403
  }
402
404
  return () => {
403
- if (editor) {
404
- try {
405
- closeWebsockets();
406
- editor.dispose();
407
- }
408
- catch (err) {
409
- console.log('error disposing editor', err);
410
- }
405
+ try {
406
+ closeWebsockets();
407
+ editor && editor.dispose();
408
+ }
409
+ catch (err) {
410
+ console.log('error disposing editor', err);
411
411
  }
412
412
  };
413
413
  }
@@ -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 {};