windmill-components 1.21.0 → 1.28.1

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 (251) hide show
  1. package/components/AppConnect.svelte +93 -47
  2. package/components/AppConnect.svelte.d.ts +2 -2
  3. package/components/ArgInfo.svelte +0 -5
  4. package/components/ArgInput.svelte +91 -66
  5. package/components/ArgInput.svelte.d.ts +8 -3
  6. package/components/Button.svelte +4 -4
  7. package/components/CenteredPage.svelte +1 -1
  8. package/components/CollapseLink.svelte +12 -0
  9. package/components/CollapseLink.svelte.d.ts +19 -0
  10. package/components/CronInput.svelte +84 -0
  11. package/components/CronInput.svelte.d.ts +18 -0
  12. package/components/DisplayResult.svelte +23 -7
  13. package/components/Editor.svelte +144 -61
  14. package/components/Editor.svelte.d.ts +2 -0
  15. package/components/EditorBar.svelte +215 -0
  16. package/components/EditorBar.svelte.d.ts +23 -0
  17. package/components/FlowBuilder.svelte +151 -79
  18. package/components/FlowEditor.svelte +77 -130
  19. package/components/FlowEditor.svelte.d.ts +3 -2
  20. package/components/FlowJobResult.svelte +1 -1
  21. package/components/FlowPreview.svelte +18 -24
  22. package/components/FlowPreviewContent.svelte +68 -0
  23. package/components/FlowPreviewContent.svelte.d.ts +21 -0
  24. package/components/FlowStatusViewer.svelte +85 -37
  25. package/components/FlowStatusViewer.svelte.d.ts +3 -2
  26. package/components/FlowViewer.svelte +100 -26
  27. package/components/FlowViewer.svelte.d.ts +8 -3
  28. package/components/IconedResourceType.svelte +30 -5
  29. package/components/InputTransformForm.svelte +209 -0
  30. package/components/InputTransformForm.svelte.d.ts +26 -0
  31. package/components/InviteGlobalUser.svelte +2 -2
  32. package/components/InviteUser.svelte +2 -2
  33. package/components/JobStatus.svelte +32 -25
  34. package/components/Modal.svelte +47 -43
  35. package/components/ModuleStep.svelte +100 -54
  36. package/components/ObjectResourceInput.svelte +58 -38
  37. package/components/ObjectTypeNarrowing.svelte +4 -19
  38. package/components/Path.svelte +3 -3
  39. package/components/Path.svelte.d.ts +1 -1
  40. package/components/RadioButton.svelte +11 -96
  41. package/components/RadioButton.svelte.d.ts +4 -2
  42. package/components/ResourceEditor.svelte +5 -6
  43. package/components/ResourceEditor.svelte.d.ts +2 -2
  44. package/components/ResourcePicker.svelte +25 -2
  45. package/components/ResourcePicker.svelte.d.ts +3 -0
  46. package/components/ResourceTypePicker.svelte +17 -29
  47. package/components/ResourceTypePicker.svelte.d.ts +1 -0
  48. package/components/RunForm.svelte +14 -15
  49. package/components/RunForm.svelte.d.ts +1 -1
  50. package/components/SchemaEditor.svelte +87 -71
  51. package/components/SchemaEditor.svelte.d.ts +2 -0
  52. package/components/SchemaEditorProperty.svelte +11 -0
  53. package/components/SchemaEditorProperty.svelte.d.ts +17 -0
  54. package/components/SchemaForm.svelte +21 -127
  55. package/components/SchemaForm.svelte.d.ts +3 -4
  56. package/components/SchemaModal.svelte +20 -33
  57. package/components/SchemaModal.svelte.d.ts +1 -1
  58. package/components/SchemaViewer.svelte +5 -7
  59. package/components/ScriptBuilder.svelte +41 -44
  60. package/components/ScriptEditor.svelte +76 -248
  61. package/components/ScriptPicker.svelte +13 -26
  62. package/components/ScriptPicker.svelte.d.ts +1 -1
  63. package/components/ScriptSchema.svelte +0 -5
  64. package/components/ShareModal.svelte +1 -1
  65. package/components/SharedBadge.svelte +12 -10
  66. package/components/StringTypeNarrowing.svelte +8 -4
  67. package/components/StringTypeNarrowing.svelte.d.ts +1 -0
  68. package/components/TableCustom.svelte +7 -9
  69. package/components/TableSimple.svelte +1 -1
  70. package/components/Toggle.svelte +8 -10
  71. package/components/Toggle.svelte.d.ts +5 -11
  72. package/components/Tooltip.svelte +56 -82
  73. package/components/Tooltip.svelte.d.ts +1 -5
  74. package/components/VariableEditor.svelte +21 -6
  75. package/components/flows/CopyFirstStepSchema.svelte +7 -5
  76. package/components/flows/DynamicInputHelpBox.svelte +1 -1
  77. package/components/flows/FlowBox.svelte +3 -0
  78. package/components/flows/FlowBox.svelte.d.ts +23 -0
  79. package/components/flows/FlowBoxHeader.svelte +9 -0
  80. package/components/flows/FlowBoxHeader.svelte.d.ts +18 -0
  81. package/components/flows/FlowInput.svelte +20 -0
  82. package/components/flows/FlowInput.svelte.d.ts +14 -0
  83. package/components/flows/FlowInputs.svelte +7 -3
  84. package/components/flows/FlowModuleHeader.svelte +44 -41
  85. package/components/flows/FlowModuleHeader.svelte.d.ts +1 -1
  86. package/components/flows/FlowSettings.svelte +174 -0
  87. package/components/flows/FlowSettings.svelte.d.ts +21 -0
  88. package/components/flows/flowStore.d.ts +5 -2
  89. package/components/flows/flowStore.js +65 -9
  90. package/components/flows/pickers/FlowScriptPicker.svelte +6 -1
  91. package/components/flows/pickers/FlowScriptPicker.svelte.d.ts +1 -0
  92. package/components/flows/utils.d.ts +11 -11
  93. package/components/flows/utils.js +103 -63
  94. package/components/icons/AirtableIcon.svelte +17 -0
  95. package/components/icons/AirtableIcon.svelte.d.ts +17 -0
  96. package/components/icons/GCloudIcon.svelte +16 -0
  97. package/components/icons/GCloudIcon.svelte.d.ts +17 -0
  98. package/components/icons/GItlabIcon.svelte +16 -0
  99. package/components/icons/GItlabIcon.svelte.d.ts +17 -0
  100. package/components/icons/GSheetsIcon.svelte +16 -0
  101. package/components/icons/GSheetsIcon.svelte.d.ts +17 -0
  102. package/components/icons/GcalIcon.svelte +16 -0
  103. package/components/icons/GcalIcon.svelte.d.ts +17 -0
  104. package/components/icons/GdriveIcon.svelte +16 -0
  105. package/components/icons/GdriveIcon.svelte.d.ts +17 -0
  106. package/components/icons/GmailIcon.svelte +16 -0
  107. package/components/icons/GmailIcon.svelte.d.ts +17 -0
  108. package/components/icons/PostgresIcon.svelte +8 -49
  109. package/components/icons/Slack.svelte +9 -18
  110. package/components/icons/TogglIcon.svelte +59 -0
  111. package/components/icons/TogglIcon.svelte.d.ts +17 -0
  112. package/components/propertyPicker/ObjectViewer.svelte +35 -37
  113. package/components/propertyPicker/ObjectViewer.svelte.d.ts +1 -0
  114. package/components/propertyPicker/OverlayPropertyPicker.svelte +53 -53
  115. package/components/propertyPicker/OverlayPropertyPicker.svelte.d.ts +5 -2
  116. package/components/propertyPicker/PropPicker.svelte +13 -15
  117. package/components/propertyPicker/PropPicker.svelte.d.ts +1 -1
  118. package/components/propertyPicker/WarningMessage.svelte +14 -41
  119. package/components/propertyPicker/WarningMessage.svelte.d.ts +11 -8
  120. package/components/propertyPicker/utils.d.ts +1 -0
  121. package/components/propertyPicker/utils.js +25 -0
  122. package/gen/core/OpenAPI.js +1 -1
  123. package/gen/index.d.ts +12 -2
  124. package/gen/index.js +1 -2
  125. package/gen/models/CompletedJob.d.ts +1 -1
  126. package/gen/models/Flow.d.ts +3 -13
  127. package/gen/models/FlowMetadata.d.ts +9 -0
  128. package/gen/models/FlowMetadata.js +4 -0
  129. package/gen/models/FlowModuleValue.d.ts +5 -22
  130. package/gen/models/FlowModuleValue.js +1 -15
  131. package/gen/models/ForloopFlow.d.ts +8 -0
  132. package/gen/models/ForloopFlow.js +4 -0
  133. package/gen/models/InputTransform.d.ts +3 -12
  134. package/gen/models/InputTransform.js +1 -8
  135. package/gen/models/JavascriptTransform.d.ts +4 -0
  136. package/gen/models/JavascriptTransform.js +4 -0
  137. package/gen/models/MainArgSignature.d.ts +1 -1
  138. package/gen/models/NewSchedule.d.ts +1 -0
  139. package/gen/models/OpenFlow.d.ts +7 -0
  140. package/gen/models/OpenFlow.js +4 -0
  141. package/gen/models/OpenFlowWPath.d.ts +4 -0
  142. package/gen/models/OpenFlowWPath.js +4 -0
  143. package/gen/models/PathFlow.d.ts +4 -0
  144. package/gen/models/PathFlow.js +4 -0
  145. package/gen/models/PathScript.d.ts +4 -0
  146. package/gen/models/PathScript.js +4 -0
  147. package/gen/models/RawScript.d.ts +12 -0
  148. package/gen/models/RawScript.js +11 -0
  149. package/gen/models/Schedule.d.ts +1 -1
  150. package/gen/models/StaticTransform.d.ts +4 -0
  151. package/gen/models/StaticTransform.js +4 -0
  152. package/gen/models/TokenResponse.d.ts +3 -3
  153. package/gen/models/Usage.d.ts +5 -0
  154. package/gen/models/Usage.js +4 -0
  155. package/gen/models/User.d.ts +2 -0
  156. package/gen/schemas/$AuditLog.d.ts +32 -0
  157. package/gen/schemas/$AuditLog.js +35 -0
  158. package/gen/schemas/$CompletedJob.d.ts +98 -0
  159. package/gen/schemas/$CompletedJob.js +103 -0
  160. package/gen/schemas/$ContextualVariable.d.ts +16 -0
  161. package/gen/schemas/$ContextualVariable.js +19 -0
  162. package/gen/schemas/$CreateResource.d.ts +22 -0
  163. package/gen/schemas/$CreateResource.js +25 -0
  164. package/gen/schemas/$CreateVariable.d.ts +26 -0
  165. package/gen/schemas/$CreateVariable.js +29 -0
  166. package/gen/schemas/$CreateWorkspace.d.ts +20 -0
  167. package/gen/schemas/$CreateWorkspace.js +23 -0
  168. package/gen/schemas/$EditResource.d.ts +13 -0
  169. package/gen/schemas/$EditResource.js +16 -0
  170. package/gen/schemas/$EditResourceType.d.ts +10 -0
  171. package/gen/schemas/$EditResourceType.js +13 -0
  172. package/gen/schemas/$EditSchedule.d.ts +20 -0
  173. package/gen/schemas/$EditSchedule.js +23 -0
  174. package/gen/schemas/$EditVariable.d.ts +16 -0
  175. package/gen/schemas/$EditVariable.js +19 -0
  176. package/gen/schemas/$EditWorkspaceUser.d.ts +7 -0
  177. package/gen/schemas/$EditWorkspaceUser.js +10 -0
  178. package/gen/schemas/$Flow.d.ts +23 -0
  179. package/gen/schemas/$Flow.js +26 -0
  180. package/gen/schemas/$FlowMetadata.d.ts +31 -0
  181. package/gen/schemas/$FlowMetadata.js +34 -0
  182. package/gen/schemas/$FlowPreview.d.ts +80 -0
  183. package/gen/schemas/$FlowPreview.js +83 -0
  184. package/gen/schemas/$GlobalUserInfo.d.ts +26 -0
  185. package/gen/schemas/$GlobalUserInfo.js +29 -0
  186. package/gen/schemas/$Group.d.ts +23 -0
  187. package/gen/schemas/$Group.js +26 -0
  188. package/gen/schemas/$Job.d.ts +17 -0
  189. package/gen/schemas/$Job.js +20 -0
  190. package/gen/schemas/$ListableVariable.d.ts +35 -0
  191. package/gen/schemas/$ListableVariable.js +38 -0
  192. package/gen/schemas/$Login.d.ts +12 -0
  193. package/gen/schemas/$Login.js +15 -0
  194. package/gen/schemas/$MainArgSignature.d.ts +50 -0
  195. package/gen/schemas/$MainArgSignature.js +53 -0
  196. package/gen/schemas/$NewSchedule.d.ts +30 -0
  197. package/gen/schemas/$NewSchedule.js +33 -0
  198. package/gen/schemas/$NewToken.d.ts +11 -0
  199. package/gen/schemas/$NewToken.js +14 -0
  200. package/gen/schemas/$NewUser.d.ts +16 -0
  201. package/gen/schemas/$NewUser.js +19 -0
  202. package/gen/schemas/$Preview.d.ts +19 -0
  203. package/gen/schemas/$Preview.js +22 -0
  204. package/gen/schemas/$QueuedJob.d.ts +139 -0
  205. package/gen/schemas/$QueuedJob.js +144 -0
  206. package/gen/schemas/$Resource.d.ts +31 -0
  207. package/gen/schemas/$Resource.js +34 -0
  208. package/gen/schemas/$ResourceType.d.ts +17 -0
  209. package/gen/schemas/$ResourceType.js +20 -0
  210. package/gen/schemas/$Schedule.d.ts +47 -0
  211. package/gen/schemas/$Schedule.js +50 -0
  212. package/gen/schemas/$Script.d.ts +77 -0
  213. package/gen/schemas/$Script.js +80 -0
  214. package/gen/schemas/$ScriptArgs.d.ts +6 -0
  215. package/gen/schemas/$ScriptArgs.js +9 -0
  216. package/gen/schemas/$SlackToken.d.ts +24 -0
  217. package/gen/schemas/$SlackToken.js +27 -0
  218. package/gen/schemas/$TokenResponse.d.ts +23 -0
  219. package/gen/schemas/$TokenResponse.js +26 -0
  220. package/gen/schemas/$TruncatedToken.d.ts +25 -0
  221. package/gen/schemas/$TruncatedToken.js +28 -0
  222. package/gen/schemas/$Usage.d.ts +13 -0
  223. package/gen/schemas/$Usage.js +16 -0
  224. package/gen/schemas/$User.d.ts +42 -0
  225. package/gen/schemas/$User.js +45 -0
  226. package/gen/schemas/$UserWorkspaceList.d.ts +28 -0
  227. package/gen/schemas/$UserWorkspaceList.js +31 -0
  228. package/gen/schemas/$WorkerPing.d.ts +31 -0
  229. package/gen/schemas/$WorkerPing.js +34 -0
  230. package/gen/schemas/$Workspace.d.ts +19 -0
  231. package/gen/schemas/$Workspace.js +22 -0
  232. package/gen/schemas/$WorkspaceInvite.d.ts +16 -0
  233. package/gen/schemas/$WorkspaceInvite.js +19 -0
  234. package/gen/services/FlowService.d.ts +30 -16
  235. package/gen/services/FlowService.js +25 -0
  236. package/gen/services/JobService.d.ts +1 -1
  237. package/gen/services/ScriptService.d.ts +13 -8
  238. package/gen/services/WorkspaceService.d.ts +1 -1
  239. package/gen/services/WorkspaceService.js +1 -1
  240. package/infer.js +8 -1
  241. package/package.json +87 -15
  242. package/script_helpers.d.ts +1 -1
  243. package/script_helpers.js +7 -6
  244. package/sql.d.ts +89 -0
  245. package/sql.js +817 -0
  246. package/stores.d.ts +1 -1
  247. package/stores.js +0 -6
  248. package/utils.d.ts +26 -6
  249. package/utils.js +94 -7
  250. package/components/RadioButtonV2.svelte +0 -38
  251. package/components/RadioButtonV2.svelte.d.ts +0 -20
@@ -0,0 +1,84 @@
1
+ <script context="module">
2
+ export const OFFSET = new Date().getTimezoneOffset()
3
+ </script>
4
+
5
+ <script>import { ScheduleService } from '../gen';
6
+ import { displayDate, formatCron, sendUserToast } from '../utils';
7
+ import CollapseLink from './CollapseLink.svelte';
8
+ export let validCRON = true;
9
+ let preview = [];
10
+ let cronError = '';
11
+ export let schedule = '0 0 12 * *';
12
+ let limit = 3;
13
+ $: handleScheduleInput(schedule);
14
+ async function handleScheduleInput(input) {
15
+ try {
16
+ preview = await ScheduleService.previewSchedule({
17
+ requestBody: { schedule: formatCron(input), offset: OFFSET }
18
+ });
19
+ cronError = '';
20
+ validCRON = true;
21
+ }
22
+ catch (err) {
23
+ if (err.status == 400 && err.body.includes('cron')) {
24
+ cronError = `Invalid cron expression`;
25
+ validCRON = false;
26
+ }
27
+ else {
28
+ sendUserToast(`Cannot preview: ${err}`, true);
29
+ validCRON = false;
30
+ }
31
+ }
32
+ }
33
+ </script>
34
+
35
+ <div class="text-purple-500 text-2xs grow">{cronError}</div>
36
+ <div class="flex flex-row items-end max-w-5xl">
37
+ <label class="text-xs min-w-max mr-2 self-center" for="cron-schedule">CRON expression</label>
38
+ <input
39
+ class="inline-block"
40
+ type="text"
41
+ id="cron-schedule"
42
+ name="cron-schedule"
43
+ bind:value={schedule}
44
+ />
45
+ </div>
46
+ <div class="flex flex-row text-xs text-blue-500 gap-3 pl-28">
47
+ <button
48
+ on:click={() => {
49
+ schedule = '0 */15 * * *'
50
+ cronError = ''
51
+ }}>every 15 min</button
52
+ >
53
+ <button
54
+ on:click={() => {
55
+ schedule = '0 0 * * * *'
56
+ cronError = ''
57
+ }}>every hour</button
58
+ >
59
+ <button
60
+ on:click={() => {
61
+ schedule = '0 0 8 * * *'
62
+ cronError = ''
63
+ }}>once a day at 8AM</button
64
+ >
65
+ </div>
66
+
67
+ <CollapseLink text="preview next runs" open={true}>
68
+ {#if preview && preview.length > 0}
69
+ <div class="text-sm text-gray-700 border p-2 rounded-md">
70
+ <div class="flex flex-row justify-between">The next runs will be scheduled at:</div>
71
+ <ul class="list-disc mx-12">
72
+ {#each preview.slice(0, limit) as p}
73
+ <li class="mx-2 text-gray-700 text-sm">{displayDate(p)}</li>
74
+ {/each}
75
+ <li class="text-sm mx-2">...</li>
76
+ {#if limit != 10}
77
+ <button class="underline text-gray-400" on:click={() => (limit = 10)}>Load more</button>
78
+ {:else}
79
+ <button class="underline text-gray-400" on:click={() => (limit = 3)}>Load less</button>
80
+ {/if}
81
+ </ul>
82
+ </div>
83
+ {/if}
84
+ </CollapseLink>
@@ -0,0 +1,18 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ export declare const OFFSET: number;
3
+ declare const __propDef: {
4
+ props: {
5
+ validCRON?: boolean | undefined;
6
+ schedule?: string | undefined;
7
+ };
8
+ events: {
9
+ [evt: string]: CustomEvent<any>;
10
+ };
11
+ slots: {};
12
+ };
13
+ export declare type CronInputProps = typeof __propDef.props;
14
+ export declare type CronInputEvents = typeof __propDef.events;
15
+ export declare type CronInputSlots = typeof __propDef.slots;
16
+ export default class CronInput extends SvelteComponentTyped<CronInputProps, CronInputEvents, CronInputSlots> {
17
+ }
18
+ export {};
@@ -1,7 +1,7 @@
1
1
  <script>import { Highlight } from 'svelte-highlight';
2
- import github from 'svelte-highlight/styles/github';
3
2
  import { json } from 'svelte-highlight/languages';
4
3
  import TableCustom from './TableCustom.svelte';
4
+ import { truncate } from '../utils';
5
5
  export let result;
6
6
  let resultKind = inferResultKind(result);
7
7
  function isArray(obj) {
@@ -37,6 +37,9 @@ function inferResultKind(result) {
37
37
  else if (keys.length == 1 && keys[0] == 'png') {
38
38
  return 'png';
39
39
  }
40
+ else if (keys.length == 1 && keys[0] == 'jpeg') {
41
+ return 'jpeg';
42
+ }
40
43
  else if (keys.length == 1 && keys[0] == 'file') {
41
44
  return 'file';
42
45
  }
@@ -47,9 +50,6 @@ function inferResultKind(result) {
47
50
  }
48
51
  </script>
49
52
 
50
- <svelte:head>
51
- {@html github}
52
- </svelte:head>
53
53
  {#if result}
54
54
  {#if Object.keys(result).length > 0}<div>
55
55
  The result keys are: <b>{Object.keys(result).join(', ')}</b>
@@ -58,13 +58,13 @@ function inferResultKind(result) {
58
58
  {#if resultKind == 'table-col'}
59
59
  <div class="grid grid-flow-col-dense border border-gray-200 rounded-md ">
60
60
  {#each Object.keys(result) as col}
61
- <div class="flex flex-col min-w-full">
61
+ <div class="flex flex-col max-h-40 min-w-full overflow-auto">
62
62
  <div class="px-12 text-left uppercase border-b bg-gray-50 overflow-hidden rounded-t-md ">
63
63
  {col}
64
64
  </div>
65
65
  {#if Array.isArray(result[col])}
66
66
  {#each result[col] as item}
67
- <div class="px-12 text-left">
67
+ <div class="px-12 text-left whitespace-nowrap">
68
68
  {typeof item === 'string' ? item : JSON.stringify(item)}
69
69
  </div>
70
70
  {/each}
@@ -80,7 +80,7 @@ function inferResultKind(result) {
80
80
  {#each asListOfList(Object.values(result)[0]) as row}
81
81
  <tr>
82
82
  {#each row as v}
83
- <td>{v ?? ''}</td>
83
+ <td>{truncate(v, 200) ?? ''}</td>
84
84
  {/each}
85
85
  </tr>
86
86
  {/each}
@@ -95,6 +95,22 @@ function inferResultKind(result) {
95
95
  src="data:image/png;base64,{result.png}"
96
96
  />
97
97
  </div>
98
+ {:else if resultKind == 'jpeg'}
99
+ <div class="h-full">
100
+ Result is an image: <img
101
+ alt="jpeg rendered"
102
+ class="w-auto h-full"
103
+ src="data:image/jpeg;base64,{result.jpeg}"
104
+ />
105
+ </div>
106
+ {:else if resultKind == 'gif'}
107
+ <div class="h-full">
108
+ Result is an image: <img
109
+ alt="gif rendered"
110
+ class="w-auto h-full"
111
+ src="data:image/gif;base64,{result.gif}"
112
+ />
113
+ </div>
98
114
  {:else if resultKind == 'file'}
99
115
  <div>
100
116
  Result is a file: <a
@@ -1,11 +1,48 @@
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']
8
+ });
9
+ monaco.languages.register({
10
+ id: 'sql',
11
+ extensions: ['.sql'],
12
+ aliases: ['SQL'],
13
+ mimetypes: ['application/text']
14
+ });
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: () => { }
30
+ });
31
+ </script>
32
+
1
33
  <script>import { browser, dev } from '$app/env';
2
34
  import { page } from '$app/stores';
3
- import { buildExtraLib } from '../utils';
35
+ import { sendUserToast } from '../utils';
4
36
  import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';
5
37
  import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';
6
38
  import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker';
7
39
  import { createEventDispatcher, onDestroy, onMount } from 'svelte';
8
40
  import { buildWorkerDefinition } from 'monaco-editor-workers';
41
+ import { StandaloneServices } from 'vscode/services';
42
+ import getMessageServiceOverride from 'vscode/service-override/messages';
43
+ StandaloneServices.initialize({
44
+ ...getMessageServiceOverride(document.body)
45
+ });
9
46
  let divEl = null;
10
47
  let editor;
11
48
  export let deno = false;
@@ -16,12 +53,15 @@ export let cmdEnterAction = undefined;
16
53
  export let formatAction = undefined;
17
54
  export let automaticLayout = true;
18
55
  export let websocketAlive = { pyright: false, black: false, deno: false };
19
- export let extraLib = lang == 'typescript' && !deno ? buildExtraLib() : '';
20
- export let extraLibPath = 'file:///node_modules/@types/windmill/index.d.ts';
56
+ export let extraLib = '';
57
+ export let extraLibPath = '';
21
58
  let websockets = [];
22
- let uri = '';
59
+ let websocketInterval;
60
+ let lastWsAttempt = new Date();
61
+ let nbWsAttempt = 0;
23
62
  let disposeMethod;
24
63
  const dispatch = createEventDispatcher();
64
+ const uri = `file:///${hash}.${langToExt(lang)}`;
25
65
  if (browser) {
26
66
  if (dev) {
27
67
  buildWorkerDefinition('../../../node_modules/monaco-editor-workers/dist/workers', import.meta.url, false);
@@ -51,6 +91,22 @@ export function insertAtCursor(code) {
51
91
  editor.trigger('keyboard', 'type', { text: code });
52
92
  }
53
93
  }
94
+ function langToExt(lang) {
95
+ switch (lang) {
96
+ case 'typescript':
97
+ return 'ts';
98
+ case 'python':
99
+ return 'py';
100
+ case 'javascript':
101
+ return 'js';
102
+ case 'json':
103
+ return 'json';
104
+ case 'sql':
105
+ return 'sql';
106
+ default:
107
+ return 'unknown';
108
+ }
109
+ }
54
110
  export function insertAtBeginning(code) {
55
111
  if (editor) {
56
112
  const range = { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 1 };
@@ -75,14 +131,15 @@ function format() {
75
131
  }
76
132
  }
77
133
  export async function reloadWebsocket() {
78
- closeWebsockets();
134
+ await closeWebsockets();
79
135
  if (lang == 'python' || deno) {
80
- // install Monaco language client services
81
136
  const { MonacoLanguageClient } = await import('monaco-languageclient');
82
137
  const { CloseAction, ErrorAction } = await import('vscode-languageclient');
83
- const vscode = await import('vscode');
84
138
  const { toSocket, WebSocketMessageReader, WebSocketMessageWriter } = await import('vscode-ws-jsonrpc');
139
+ const vscode = await import('vscode');
85
140
  const { RequestType } = await import('vscode-jsonrpc');
141
+ const { MonacoServices } = await import('monaco-languageclient');
142
+ MonacoServices.install();
86
143
  function createLanguageClient(transports, name, initializationOptions) {
87
144
  const client = new MonacoLanguageClient({
88
145
  name: name,
@@ -91,7 +148,7 @@ export async function reloadWebsocket() {
91
148
  errorHandler: {
92
149
  error: () => ({ action: ErrorAction.Continue }),
93
150
  closed: () => ({
94
- action: CloseAction.DoNotRestart
151
+ action: CloseAction.Restart
95
152
  })
96
153
  },
97
154
  markdown: {
@@ -123,21 +180,14 @@ export async function reloadWebsocket() {
123
180
  try {
124
181
  const webSocket = new WebSocket(url);
125
182
  webSocket.onopen = () => {
126
- websockets.push(webSocket);
127
183
  const socket = toSocket(webSocket);
128
184
  const reader = new WebSocketMessageReader(socket);
129
185
  const writer = new WebSocketMessageWriter(socket);
130
186
  const languageClient = createLanguageClient({ reader, writer }, name, options);
187
+ websockets.push([languageClient, webSocket]);
131
188
  languageClient.start();
132
- socket.onClose((_code, _reason) => {
133
- websocketAlive[name] = false;
134
- try {
135
- languageClient.stop();
136
- }
137
- catch (err) {
138
- console.error(err);
139
- }
140
- });
189
+ lastWsAttempt = new Date();
190
+ nbWsAttempt = 0;
141
191
  if (name == 'deno') {
142
192
  vscode.commands.getCommands().then((v) => {
143
193
  if (!v.includes('deno.cache')) {
@@ -150,6 +200,18 @@ export async function reloadWebsocket() {
150
200
  }
151
201
  });
152
202
  }
203
+ reader.onClose(() => {
204
+ try {
205
+ console.log('CLOSE');
206
+ languageClient.stop();
207
+ }
208
+ catch (err) {
209
+ console.error(err);
210
+ }
211
+ });
212
+ socket.onClose((_code, _reason) => {
213
+ websocketAlive[name] = false;
214
+ });
153
215
  websocketAlive[name] = true;
154
216
  };
155
217
  }
@@ -168,7 +230,7 @@ export async function reloadWebsocket() {
168
230
  path: null,
169
231
  tlsCertificate: null,
170
232
  unsafelyIgnoreCertificateErrors: null,
171
- unstable: false,
233
+ unstable: true,
172
234
  enable: true,
173
235
  cache: null,
174
236
  codeLens: {
@@ -212,51 +274,51 @@ export async function reloadWebsocket() {
212
274
  }
213
275
  });
214
276
  }
277
+ websocketInterval && clearInterval(websocketInterval);
278
+ websocketInterval = setInterval(() => {
279
+ if (document.visibilityState == 'visible') {
280
+ if (!lastWsAttempt ||
281
+ (lastWsAttempt.getTime() - new Date().getTime() > 60000 && nbWsAttempt < 2)) {
282
+ if (!websocketAlive.black && !websocketAlive.deno && !websocketAlive.pyright) {
283
+ console.log('reconnecting to language servers');
284
+ lastWsAttempt = new Date();
285
+ nbWsAttempt++;
286
+ reloadWebsocket();
287
+ }
288
+ else {
289
+ if (nbWsAttempt >= 2) {
290
+ sendUserToast('Giving up on establishing smart assistant connection', true);
291
+ clearInterval(websocketInterval);
292
+ }
293
+ }
294
+ }
295
+ }
296
+ }, 5000);
215
297
  }
216
298
  }
217
- function closeWebsockets() {
299
+ async function closeWebsockets() {
218
300
  for (const x of websockets) {
219
301
  try {
220
- x.close();
302
+ await x[0].stop();
303
+ x[1].close();
221
304
  }
222
305
  catch (err) {
223
306
  console.log('error disposing websocket', err);
224
307
  }
225
308
  }
226
309
  websockets = [];
310
+ websocketInterval && clearInterval(websocketInterval);
227
311
  }
228
312
  async function loadMonaco() {
229
- const monaco = await import('monaco-editor');
230
- if (lang == 'python') {
231
- monaco.languages.register({
232
- id: 'python',
233
- extensions: ['.py'],
234
- aliases: ['python'],
235
- mimetypes: ['application/text']
236
- });
237
- }
238
- let path = 'unknown';
239
- if (lang == 'python') {
240
- path = `${hash}.py`;
241
- }
242
- else if (lang == 'json') {
243
- path = `${hash}.json`;
244
- }
245
- else if (lang == 'javascript') {
246
- path = `${hash}.js`;
247
- }
248
- else if (lang == 'typescript') {
249
- path = `${hash}.ts`;
250
- }
251
- uri = `file:///${path}`;
252
313
  const model = monaco.editor.createModel(code, lang, monaco.Uri.parse(uri));
253
- model.updateOptions({ tabSize: 4, insertSpaces: true });
314
+ model.updateOptions({ tabSize: 2, insertSpaces: true });
254
315
  editor = monaco.editor.create(divEl, {
255
316
  model: model,
256
317
  value: code,
257
318
  language: lang,
258
319
  automaticLayout,
259
320
  readOnly: false,
321
+ fixedOverflowWidgets: true,
260
322
  autoDetectHighContrast: true,
261
323
  //lineNumbers: 'off',
262
324
  //lineDecorationsWidth: 0,
@@ -286,7 +348,16 @@ async function loadMonaco() {
286
348
  code = getCode();
287
349
  dispatch('change');
288
350
  });
289
- if (lang == 'json') {
351
+ editor.onDidFocusEditorText(() => {
352
+ dispatch('focus');
353
+ });
354
+ editor.onDidBlurEditorText(() => {
355
+ dispatch('blur');
356
+ });
357
+ if (lang == 'sql') {
358
+ monaco.languages.register;
359
+ }
360
+ else if (lang == 'json') {
290
361
  monaco.languages.json.jsonDefaults.setDiagnosticsOptions({
291
362
  validate: true,
292
363
  allowComments: false,
@@ -294,28 +365,36 @@ async function loadMonaco() {
294
365
  enableSchemaRequest: true
295
366
  });
296
367
  }
297
- if (lang == 'typescript') {
298
- monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
368
+ else if (lang == 'javascript' || lang == 'typescript') {
369
+ monaco.languages.typescript.javascriptDefaults.setCompilerOptions({
299
370
  target: monaco.languages.typescript.ScriptTarget.Latest,
300
371
  allowNonTsExtensions: true,
301
372
  noLib: true
302
373
  });
303
- if (deno) {
304
- monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
305
- noSemanticValidation: true,
306
- noSuggestionDiagnostics: true,
307
- noSyntaxValidation: true
374
+ if (lang == 'typescript') {
375
+ monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
376
+ target: monaco.languages.typescript.ScriptTarget.Latest,
377
+ allowNonTsExtensions: true,
378
+ noLib: true
308
379
  });
380
+ if (deno) {
381
+ monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
382
+ noSemanticValidation: true,
383
+ noSuggestionDiagnostics: true,
384
+ noSyntaxValidation: true
385
+ });
386
+ }
309
387
  }
310
- else {
311
- monaco.languages.typescript.typescriptDefaults.addExtraLib(extraLib, extraLibPath);
388
+ if (lang == 'javascript') {
389
+ if (extraLib != '' && extraLibPath != '') {
390
+ monaco.languages.typescript.javascriptDefaults.addExtraLib(extraLib, extraLibPath);
391
+ }
312
392
  }
313
393
  }
314
394
  if (lang == 'python' || deno) {
315
- const { MonacoServices } = await import('monaco-languageclient');
316
- MonacoServices.install();
395
+ // install Monaco language client services
396
+ reloadWebsocket();
317
397
  }
318
- reloadWebsocket();
319
398
  return () => {
320
399
  if (editor) {
321
400
  try {
@@ -334,9 +413,8 @@ onMount(() => {
334
413
  }
335
414
  });
336
415
  onDestroy(() => {
337
- if (disposeMethod) {
338
- disposeMethod();
339
- }
416
+ disposeMethod && disposeMethod();
417
+ websocketInterval && clearInterval(websocketInterval);
340
418
  });
341
419
  </script>
342
420
 
@@ -362,4 +440,9 @@ onDestroy(() => {
362
440
  .few-lines-editor {
363
441
  /* stylelint-disable-next-line unit-allowed-list */
364
442
  height: 80px;
443
+ }
444
+
445
+ .two-lines-editor {
446
+ /* stylelint-disable-next-line unit-allowed-list */
447
+ height: 40px;
365
448
  }</style>
@@ -24,6 +24,8 @@ declare const __propDef: {
24
24
  };
25
25
  events: {
26
26
  change: CustomEvent<any>;
27
+ focus: CustomEvent<any>;
28
+ blur: CustomEvent<any>;
27
29
  } & {
28
30
  [evt: string]: CustomEvent<any>;
29
31
  };