windmill-components 1.103.2 → 1.109.2

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 (164) hide show
  1. package/package/components/AppConnect.svelte +4 -1
  2. package/package/components/ArgInput.svelte +81 -68
  3. package/package/components/ArgInput.svelte.d.ts +0 -2
  4. package/package/components/Awareness.svelte +17 -0
  5. package/package/components/Awareness.svelte.d.ts +14 -0
  6. package/package/components/CliHelpBox.svelte +2 -5
  7. package/package/components/Editor.svelte +81 -30
  8. package/package/components/Editor.svelte.d.ts +4 -0
  9. package/package/components/EditorBar.svelte +127 -131
  10. package/package/components/EditorBar.svelte.d.ts +8 -0
  11. package/package/components/FlowBuilder.svelte +6 -1
  12. package/package/components/FlowStatusViewer.svelte +157 -144
  13. package/package/components/FlowStatusViewer.svelte.d.ts +1 -0
  14. package/package/components/HighlightCode.svelte +9 -2
  15. package/package/components/HighlightCode.svelte.d.ts +1 -0
  16. package/package/components/InputTransformForm.svelte +1 -1
  17. package/package/components/InputTransformSchemaForm.svelte +4 -1
  18. package/package/components/InputTransformSchemaForm.svelte.d.ts +3 -0
  19. package/package/components/ObjectTypeNarrowing.svelte +8 -2
  20. package/package/components/ResourcePicker.svelte +0 -1
  21. package/package/components/ResourceTypePicker.svelte +1 -1
  22. package/package/components/RunForm.svelte.d.ts +1 -1
  23. package/package/components/ScheduleEditor.svelte +35 -3
  24. package/package/components/SchemaEditor.svelte +7 -8
  25. package/package/components/SchemaEditor.svelte.d.ts +1 -1
  26. package/package/components/SchemaForm.svelte.d.ts +1 -1
  27. package/package/components/SchemaModal.svelte +7 -12
  28. package/package/components/SchemaModal.svelte.d.ts +2 -3
  29. package/package/components/SchemaViewer.svelte +7 -1
  30. package/package/components/SchemaViewer.svelte.d.ts +1 -1
  31. package/package/components/ScriptBuilder.svelte +95 -21
  32. package/package/components/ScriptEditor.svelte +114 -6
  33. package/package/components/ScriptEditor.svelte.d.ts +7 -1
  34. package/package/components/ScriptSchema.svelte.d.ts +1 -1
  35. package/package/components/TemplateEditor.svelte +1 -0
  36. package/package/components/Toggle.svelte +1 -1
  37. package/package/components/Urlize.svelte +19 -0
  38. package/package/components/Urlize.svelte.d.ts +16 -0
  39. package/package/components/UserSettings.svelte +57 -36
  40. package/package/components/UserSettings.svelte.d.ts +1 -0
  41. package/package/components/VariableEditor.svelte +1 -1
  42. package/package/components/apps/components/buttons/AppSchemaForm.svelte +6 -1
  43. package/package/components/apps/components/display/AppDisplayComponent.svelte +6 -1
  44. package/package/components/apps/components/display/AppDownload.svelte +33 -25
  45. package/package/components/apps/components/display/AppFlowStatusComponent.svelte +2 -2
  46. package/package/components/apps/components/display/AppLogsComponent.svelte +2 -2
  47. package/package/components/apps/components/display/AppText.svelte +9 -14
  48. package/package/components/apps/components/display/table/AppAggridTable.svelte +45 -36
  49. package/package/components/apps/components/display/table/AppTable.svelte +5 -2
  50. package/package/components/apps/components/helpers/ComponentErrorHandler.svelte +26 -0
  51. package/package/components/apps/components/helpers/ComponentErrorHandler.svelte.d.ts +18 -0
  52. package/package/components/apps/components/helpers/InputValue.svelte +15 -17
  53. package/package/components/apps/components/helpers/NonRunnableComponent.svelte +1 -1
  54. package/package/components/apps/components/helpers/eval.d.ts +1 -0
  55. package/package/components/apps/components/helpers/eval.js +3 -1
  56. package/package/components/apps/components/inputs/AppCheckbox.svelte +21 -8
  57. package/package/components/apps/components/inputs/AppDateInput.svelte +6 -1
  58. package/package/components/apps/components/inputs/AppMultiSelect.svelte +18 -7
  59. package/package/components/apps/components/inputs/AppNumberInput.svelte +6 -1
  60. package/package/components/apps/components/inputs/AppRangeInput.svelte +6 -2
  61. package/package/components/apps/components/inputs/AppSelect.svelte +11 -3
  62. package/package/components/apps/components/inputs/AppSelectStep.svelte +19 -6
  63. package/package/components/apps/components/inputs/AppSelectTab.svelte +9 -1
  64. package/package/components/apps/components/inputs/AppSliderInputs.svelte +6 -1
  65. package/package/components/apps/components/inputs/AppTextInput.svelte +6 -1
  66. package/package/components/apps/components/inputs/currency/AppCurrencyInput.svelte +6 -1
  67. package/package/components/apps/components/inputs/currency/CurrencyInput.svelte +0 -1
  68. package/package/components/apps/editor/AppEditor.svelte +4 -7
  69. package/package/components/apps/editor/AppEditor.svelte.d.ts +3 -2
  70. package/package/components/apps/editor/AppEditorHeader.svelte +38 -11
  71. package/package/components/apps/editor/AppEditorHeader.svelte.d.ts +3 -0
  72. package/package/components/apps/editor/AppPreview.svelte +9 -7
  73. package/package/components/apps/editor/AppPreview.svelte.d.ts +6 -6
  74. package/package/components/apps/editor/ConnectionInstructions.svelte +1 -0
  75. package/package/components/apps/editor/DeploymentHistory.svelte +70 -0
  76. package/package/components/apps/editor/DeploymentHistory.svelte.d.ts +18 -0
  77. package/package/components/apps/editor/RecomputeAllComponents.svelte +49 -20
  78. package/package/components/apps/editor/component/ComponentNavigation.svelte +51 -20
  79. package/package/components/apps/editor/component/ComponentNavigation.svelte.d.ts +4 -1
  80. package/package/components/apps/editor/component/components.d.ts +50 -49
  81. package/package/components/apps/editor/component/components.js +6 -0
  82. package/package/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte +1 -0
  83. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte +2 -2
  84. package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +1 -4
  85. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +4 -7
  86. package/package/components/apps/rx.js +6 -1
  87. package/package/components/apps/types.d.ts +1 -1
  88. package/package/components/apps/utils.js +1 -0
  89. package/package/components/common/button/ButtonDropdown.svelte +45 -19
  90. package/package/components/common/button/ButtonDropdown.svelte.d.ts +1 -0
  91. package/package/components/common/modal/Modal.svelte +13 -2
  92. package/package/components/common/modal/Modal.svelte.d.ts +1 -0
  93. package/package/components/common/table/AppRow.svelte +33 -3
  94. package/package/components/flows/content/FlowModuleCache.svelte +37 -0
  95. package/package/components/flows/content/FlowModuleCache.svelte.d.ts +17 -0
  96. package/package/components/flows/content/FlowModuleComponent.svelte +57 -54
  97. package/package/components/flows/content/FlowModuleEarlyStop.svelte +1 -1
  98. package/package/components/flows/content/FlowModuleHeader.svelte +12 -1
  99. package/package/components/flows/content/FlowModuleHeader.svelte.d.ts +1 -0
  100. package/package/components/flows/content/FlowModuleSleep.svelte +1 -1
  101. package/package/components/flows/content/FlowModuleSuspend.svelte +1 -7
  102. package/package/components/flows/content/ScriptEditorDrawer.svelte +2 -1
  103. package/package/components/flows/map/FlowModuleSchemaItem.svelte +13 -1
  104. package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -0
  105. package/package/components/flows/map/FlowModuleSchemaMap.svelte +49 -5
  106. package/package/components/flows/map/MapItem.svelte +9 -2
  107. package/package/components/flows/map/MapItem.svelte.d.ts +1 -0
  108. package/package/components/flows/pickers/PickHubApp.svelte +2 -1
  109. package/package/components/flows/pickers/PickHubApp.svelte.d.ts +1 -0
  110. package/package/components/flows/pickers/PickHubFlow.svelte +2 -1
  111. package/package/components/flows/pickers/PickHubFlow.svelte.d.ts +1 -0
  112. package/package/components/flows/pickers/PickHubScript.svelte +2 -1
  113. package/package/components/flows/pickers/PickHubScript.svelte.d.ts +1 -0
  114. package/package/components/flows/previousResults.d.ts +2 -0
  115. package/package/components/flows/previousResults.js +46 -0
  116. package/package/components/graph/FlowGraph.svelte +1 -1
  117. package/package/components/home/ItemsList.svelte +11 -3
  118. package/package/components/home/ListFilters.svelte +39 -0
  119. package/package/components/home/ListFilters.svelte.d.ts +4 -0
  120. package/package/components/propertyPicker/ObjectViewer.svelte +77 -79
  121. package/package/components/propertyPicker/ObjectViewer.svelte.d.ts +1 -1
  122. package/package/components/propertyPicker/PropPicker.svelte +18 -0
  123. package/package/components/sidebar/MultiplayerMenu.svelte +123 -0
  124. package/package/components/sidebar/MultiplayerMenu.svelte.d.ts +16 -0
  125. package/package/components/sidebar/WorkspaceMenu.svelte +1 -1
  126. package/package/gen/core/CancelablePromise.d.ts +2 -8
  127. package/package/gen/core/CancelablePromise.js +38 -36
  128. package/package/gen/core/OpenAPI.js +1 -1
  129. package/package/gen/core/request.js +3 -2
  130. package/package/gen/models/AuditLog.d.ts +1 -1
  131. package/package/gen/models/CreateInput.d.ts +1 -1
  132. package/package/gen/models/FlowMetadata.d.ts +1 -1
  133. package/package/gen/models/FlowModule.d.ts +1 -0
  134. package/package/gen/models/Input.d.ts +1 -1
  135. package/package/gen/models/NewScript.d.ts +2 -1
  136. package/package/gen/models/NewToken.d.ts +1 -0
  137. package/package/gen/models/OpenFlow.d.ts +1 -1
  138. package/package/gen/models/Policy.d.ts +1 -1
  139. package/package/gen/models/Script.d.ts +2 -1
  140. package/package/gen/models/TruncatedToken.d.ts +1 -0
  141. package/package/gen/services/AppService.d.ts +1 -1
  142. package/package/gen/services/JobService.d.ts +64 -4
  143. package/package/gen/services/JobService.js +45 -0
  144. package/package/gen/services/ResourceService.d.ts +2 -1
  145. package/package/gen/services/ResourceService.js +4 -1
  146. package/package/gen/services/ScriptService.d.ts +0 -45
  147. package/package/gen/services/ScriptService.js +0 -52
  148. package/package/gen/services/SettingsService.d.ts +6 -0
  149. package/package/gen/services/SettingsService.js +11 -0
  150. package/package/gen/services/UserService.d.ts +14 -0
  151. package/package/gen/services/UserService.js +11 -0
  152. package/package/gen/services/VariableService.d.ts +12 -0
  153. package/package/gen/services/VariableService.js +16 -0
  154. package/package/hub.d.ts +1 -1
  155. package/package/infer.js +8 -13
  156. package/package/navigation.d.ts +1 -1
  157. package/package/navigation.js +6 -1
  158. package/package/script_helpers.d.ts +1 -1
  159. package/package/script_helpers.js +6 -1
  160. package/package/stores.d.ts +2 -0
  161. package/package/stores.js +4 -2
  162. package/package/utils.d.ts +1 -0
  163. package/package/utils.js +14 -0
  164. package/package.json +28 -19
@@ -267,7 +267,9 @@ let filteredConnectsManual = [];
267
267
  }}
268
268
  size="800px"
269
269
  >
270
- <DrawerContent title="Connect an API or add a Resource" on:close={drawer.closeDrawer}>
270
+ <DrawerContent title="Connect an API or add a Resource" on:close={drawer.closeDrawer}
271
+ tooltip="Resources represent connections to third party systems. Learn more on how to integrate external APIs."
272
+ documentationLink="https://docs.windmill.dev/docs/integrations/integrations_on_windmill">
271
273
  {#if step == 1}
272
274
  <div class="w-12/12 pb-2 flex flex-row my-1 gap-1">
273
275
  <input
@@ -326,6 +328,7 @@ let filteredConnectsManual = [];
326
328
  <Button
327
329
  variant="border"
328
330
  color="blue"
331
+ hover="yo"
329
332
  size="sm"
330
333
  endIcon={{ icon: faPlus }}
331
334
  on:click={() => {
@@ -1,6 +1,6 @@
1
- <script>import { faChevronDown, faChevronUp, faDollarSign, faPlus } from '@fortawesome/free-solid-svg-icons';
1
+ <script>import { faChevronDown, faChevronUp, faPlus } from '@fortawesome/free-solid-svg-icons';
2
2
  import { setInputCat as computeInputCat } from '../utils';
3
- import { X } from 'lucide-svelte';
3
+ import { DollarSign, Pen, X } from 'lucide-svelte';
4
4
  import { createEventDispatcher } from 'svelte';
5
5
  import autosize from 'svelte-autosize';
6
6
  import Icon from 'svelte-awesome';
@@ -46,34 +46,40 @@ export let minW = true;
46
46
  export let prettifyHeader = false;
47
47
  let seeEditable = enum_ != undefined || pattern != undefined;
48
48
  const dispatch = createEventDispatcher();
49
- $: validateInput(pattern, value);
50
49
  let error = '';
51
50
  let el = undefined;
52
51
  export let editor = undefined;
52
+ let inputCat = computeInputCat(type, format, itemsType?.type, enum_, contentEncoding);
53
+ $: inputCat = computeInputCat(type, format, itemsType?.type, enum_, contentEncoding);
53
54
  let rawValue = undefined;
54
- $: {
55
- if (rawValue) {
56
- try {
57
- value = JSON.parse(rawValue);
58
- error = '';
55
+ function computeDefaultValue(nvalue, inputCat, defaultValue) {
56
+ if (value == undefined || value == null) {
57
+ value = defaultValue;
58
+ if (defaultValue === undefined || defaultValue === null) {
59
+ if (inputCat === 'string') {
60
+ value = '';
61
+ }
62
+ else if (inputCat == 'enum') {
63
+ value = enum_?.[0];
64
+ }
65
+ else if (inputCat == 'boolean') {
66
+ value = false;
67
+ }
68
+ else if (inputCat == 'list') {
69
+ value = [];
70
+ }
59
71
  }
60
- catch (err) {
61
- error = err.toString();
72
+ else if (inputCat === 'object') {
73
+ evalValueToRaw();
62
74
  }
63
75
  }
64
76
  }
65
- $: {
66
- error = '';
67
- if (inputCat === 'object') {
68
- evalValueToRaw();
69
- validateInput(pattern, value);
70
- }
71
- }
72
- export function evalValueToRaw() {
73
- if (value) {
74
- rawValue = JSON.stringify(value, null, 2);
75
- }
77
+ computeDefaultValue();
78
+ $: computeDefaultValue(value, inputCat, defaultValue);
79
+ function evalValueToRaw() {
80
+ rawValue = inputCat === 'object' ? JSON.stringify(value, null, 2) : undefined;
76
81
  }
82
+ evalValueToRaw();
77
83
  function fileChanged(e, cb) {
78
84
  let t = e.target;
79
85
  if (t && 'files' in t && t.files.length > 0) {
@@ -125,28 +131,10 @@ function onKeyDown(e) {
125
131
  }
126
132
  e.stopPropagation();
127
133
  }
128
- $: {
129
- if (value == undefined || value == null) {
130
- value = defaultValue;
131
- if (defaultValue === undefined || defaultValue === null) {
132
- if (inputCat === 'string') {
133
- value = '';
134
- }
135
- else if (inputCat == 'enum') {
136
- value = enum_?.[0];
137
- }
138
- else if (inputCat == 'boolean') {
139
- value = false;
140
- }
141
- else if (inputCat == 'list') {
142
- value = [];
143
- }
144
- }
145
- }
146
- }
147
- $: inputCat = computeInputCat(type, format, itemsType?.type, enum_, contentEncoding);
148
134
  let redraw = 0;
149
135
  let itemsLimit = 50;
136
+ let customValue = false;
137
+ $: validateInput(pattern, value);
150
138
  </script>
151
139
 
152
140
  <!-- svelte-ignore a11y-autofocus -->
@@ -338,18 +326,45 @@ let itemsLimit = 50;
338
326
  />
339
327
  {/if}
340
328
  {:else if inputCat == 'enum'}
341
- <select
342
- on:focus={(e) => {
343
- dispatch('focus')
344
- }}
345
- {disabled}
346
- class="px-6"
347
- bind:value
348
- >
349
- {#each enum_ ?? [] as e}
350
- <option>{e}</option>
351
- {/each}
352
- </select>
329
+ <div class="flex flex-row w-full gap-1">
330
+ {#if !customValue}
331
+ <select
332
+ on:focus={(e) => {
333
+ dispatch('focus')
334
+ }}
335
+ {disabled}
336
+ class="px-6"
337
+ bind:value
338
+ >
339
+ {#each enum_ ?? [] as e}
340
+ <option>{e}</option>
341
+ {/each}
342
+ </select>
343
+ {:else}
344
+ <input
345
+ {autofocus}
346
+ on:focus
347
+ type="text"
348
+ class={valid
349
+ ? ''
350
+ : 'border border-red-700 border-opacity-30 focus:border-red-700 focus:border-opacity-30 bg-red-100'}
351
+ placeholder={defaultValue ?? ''}
352
+ bind:value
353
+ />
354
+ {/if}
355
+
356
+ {#if !disabled}
357
+ <button
358
+ class="min-w-min !px-2 items-center text-gray-800 bg-gray-100 border rounded center-center hover:bg-gray-300 transition-all cursor-pointer"
359
+ on:click={() => {
360
+ customValue = !customValue
361
+ }}
362
+ title="Custom Value"
363
+ >
364
+ <Pen size={14} />
365
+ </button>
366
+ {/if}
367
+ </div>
353
368
  {:else if inputCat == 'date'}
354
369
  <input {autofocus} class="inline-block" type="datetime-local" bind:value />
355
370
  {:else if inputCat == 'sql' || inputCat == 'yaml'}
@@ -381,7 +396,7 @@ let itemsLimit = 50;
381
396
  />
382
397
  {:else if inputCat == 'string'}
383
398
  <div class="flex flex-col w-full">
384
- <div class="flex flex-row w-full items- justify-between">
399
+ <div class="flex flex-row w-full items-center justify-between relative">
385
400
  {#if password}
386
401
  <Password {disabled} bind:password={value} />
387
402
  {:else}
@@ -396,26 +411,24 @@ let itemsLimit = 50;
396
411
  on:keydown={onKeyDown}
397
412
  type="text"
398
413
  {disabled}
399
- class="col-span-10 {valid
414
+ class="w-full {valid
400
415
  ? ''
401
416
  : 'border border-red-700 border-opacity-30 focus:border-red-700 focus:border-opacity-30 bg-red-100'}"
402
417
  placeholder={defaultValue ?? ''}
403
418
  bind:value
404
419
  />
405
420
  {#if itemPicker}
406
- <div class="ml-1 relative">
407
- <!-- svelte-ignore a11y-click-events-have-key-events -->
408
- <div
409
- class="min-w-min min-h-[34px] items-center leading-4 px-3 text-blue-500 cursor-pointer border border-blue-500 rounded center-center"
410
- on:click={() => {
411
- pickForField = label
412
- itemPicker?.openDrawer?.()
413
- }}
414
- title="Use Variable"
415
- >
416
- <Icon data={faDollarSign} />
417
- </div>
418
- </div>
421
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
422
+ <button
423
+ class="absolute right-1 top-1 py-1 min-w-min !px-2 items-center text-gray-800 bg-gray-100 border rounded center-center hover:bg-gray-300 transition-all cursor-pointer"
424
+ on:click={() => {
425
+ pickForField = label
426
+ itemPicker?.openDrawer?.()
427
+ }}
428
+ title="Insert a Variable"
429
+ >
430
+ <DollarSign size={14} />
431
+ </button>
419
432
  {/if}
420
433
  {/if}
421
434
  </div>
@@ -37,7 +37,6 @@ declare const __propDef: {
37
37
  minW?: boolean | undefined;
38
38
  prettifyHeader?: boolean | undefined;
39
39
  editor?: SimpleEditor | undefined;
40
- evalValueToRaw?: (() => void) | undefined;
41
40
  focus?: (() => void) | undefined;
42
41
  };
43
42
  events: {
@@ -53,7 +52,6 @@ export type ArgInputProps = typeof __propDef.props;
53
52
  export type ArgInputEvents = typeof __propDef.events;
54
53
  export type ArgInputSlots = typeof __propDef.slots;
55
54
  export default class ArgInput extends SvelteComponentTyped<ArgInputProps, ArgInputEvents, ArgInputSlots> {
56
- get evalValueToRaw(): () => void;
57
55
  get focus(): () => void;
58
56
  }
59
57
  export {};
@@ -0,0 +1,17 @@
1
+ <script>import { awarenessStore, userStore } from '../stores';
2
+ import { BROWSER } from 'esm-env';
3
+ let url = BROWSER ? window.location.pathname : '';
4
+ </script>
5
+
6
+ <div class="isolate flex -space-x-1 overflow-hidden w-20">
7
+ {#each Object.entries($awarenessStore ?? {}).filter(([a, b]) => b == url && a != $userStore?.username) as [user, _]}
8
+ <span
9
+ class="inline-flex h-6 w-6 items-center justify-center rounded-full ring-2 ring-white bg-gray-600"
10
+ title={user}
11
+ >
12
+ <span class="text-sm font-medium leading-none text-white"
13
+ >{user.substring(0, 2).toLocaleUpperCase()}</span
14
+ >
15
+ </span>
16
+ {/each}
17
+ </div>
@@ -0,0 +1,14 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: Record<string, never>;
4
+ events: {
5
+ [evt: string]: CustomEvent<any>;
6
+ };
7
+ slots: {};
8
+ };
9
+ export type AwarenessProps = typeof __propDef.props;
10
+ export type AwarenessEvents = typeof __propDef.events;
11
+ export type AwarenessSlots = typeof __propDef.slots;
12
+ export default class Awareness extends SvelteComponentTyped<AwarenessProps, AwarenessEvents, AwarenessSlots> {
13
+ }
14
+ export {};
@@ -1,13 +1,10 @@
1
1
  <script>import { page } from '$app/stores';
2
- import { userWorkspaces, workspaceStore } from '../stores';
2
+ import { workspaceStore } from '../stores';
3
3
  import { faChevronDown, faChevronUp } from '@fortawesome/free-solid-svg-icons';
4
4
  import Icon from 'svelte-awesome';
5
5
  import { slide } from 'svelte/transition';
6
6
  import InlineCodeCopy from './InlineCodeCopy.svelte';
7
7
  $: opened = false;
8
- $: workspace = $userWorkspaces.find((e) => e.id === $workspaceStore);
9
- $: workspaceName = workspace?.name;
10
- $: workspaceId = workspace?.id;
11
8
  $: url = `${$page.url.protocol}//${$page.url.hostname}/`;
12
9
  </script>
13
10
 
@@ -39,7 +36,7 @@ $: url = `${$page.url.protocol}//${$page.url.hostname}/`;
39
36
  >
40
37
  <li
41
38
  >Setup the wmill cli for this workspace & remote: <InlineCodeCopy
42
- content={`wmill workspace add ${workspaceName} ${workspaceId} ${url}`}
39
+ content={`wmill workspace add ${$workspaceStore} ${$workspaceStore} ${url}`}
43
40
  /></li
44
41
  >
45
42
  <li>Follow the prompts in your terminal</li>
@@ -12,6 +12,7 @@ import 'monaco-editor/esm/vs/language/typescript/monaco.contribution';
12
12
  import { MonacoLanguageClient, initServices } from 'monaco-languageclient';
13
13
  import { toSocket, WebSocketMessageReader, WebSocketMessageWriter } from 'vscode-ws-jsonrpc';
14
14
  import { CloseAction, ErrorAction, RequestType } from 'vscode-languageclient';
15
+ import { MonacoBinding } from 'y-monaco';
15
16
  languages.typescript.typescriptDefaults.setModeConfiguration({
16
17
  completionItems: false,
17
18
  definitions: false,
@@ -50,20 +51,31 @@ export let websocketAlive = {
50
51
  };
51
52
  export let shouldBindKey = true;
52
53
  export let fixedOverflowWidgets = true;
53
- export let path = randomHash();
54
- if (path == '' || path == undefined || path.startsWith('/')) {
55
- path = randomHash();
54
+ export let path = undefined;
55
+ export let yContent = undefined;
56
+ export let awareness = undefined;
57
+ export let folding = false;
58
+ const rHash = randomHash();
59
+ $: filePath = computePath(path);
60
+ function computePath(path) {
61
+ if (path == '' || path == undefined || path.startsWith('/')) {
62
+ return rHash;
63
+ }
64
+ else {
65
+ return path;
66
+ }
56
67
  }
57
68
  let initialPath = path;
58
69
  $: path != initialPath && lang == 'typescript' && handlePathChange();
59
70
  let websockets = [];
71
+ let languageClients = [];
60
72
  let websocketInterval;
61
73
  let lastWsAttempt = new Date();
62
74
  let nbWsAttempt = 0;
63
75
  let disposeMethod;
64
76
  const dispatch = createEventDispatcher();
65
77
  const uri = lang == 'typescript'
66
- ? `file:///${path}.${langToExt(lang)}`
78
+ ? `file:///${filePath}.${langToExt(lang)}`
67
79
  : `file:///tmp/monaco/${randomHash()}.${langToExt(lang)}`;
68
80
  buildWorkerDefinition('../../../workers', import.meta.url, false);
69
81
  export function getCode() {
@@ -165,6 +177,9 @@ export async function reloadWebsocket() {
165
177
  }
166
178
  catch (e) {
167
179
  console.log('initServices failed', e.message);
180
+ if (e.message != 'Lifecycle cannot go backwards') {
181
+ return;
182
+ }
168
183
  }
169
184
  function createLanguageClient(transports, name, initializationOptions, middlewareOptions) {
170
185
  const client = new MonacoLanguageClient({
@@ -209,6 +224,7 @@ export async function reloadWebsocket() {
209
224
  async function connectToLanguageServer(url, name, initOptions, middlewareOptions) {
210
225
  try {
211
226
  const webSocket = new WebSocket(url);
227
+ websockets.push(webSocket);
212
228
  webSocket.onopen = async () => {
213
229
  const socket = toSocket(webSocket);
214
230
  const reader = new WebSocketMessageReader(socket);
@@ -217,7 +233,7 @@ export async function reloadWebsocket() {
217
233
  // if (middlewareOptions != undefined) {
218
234
  // languageClient.registerNotUsedFeatures()
219
235
  // }
220
- websockets.push([languageClient, webSocket]);
236
+ languageClients.push(languageClient);
221
237
  // HACK ALERT: for some reasons, the client need to be restarted to take into account the 'go get <dep>' command
222
238
  // the only way I could figure out to listen for this event is this. I'm sure there is a better way to do this
223
239
  if (name == 'go') {
@@ -282,7 +298,7 @@ export async function reloadWebsocket() {
282
298
  const hostname = BROWSER ? window.location.protocol + '//' + window.location.host : 'SSR';
283
299
  let encodedImportMap = '';
284
300
  if (lang == 'typescript') {
285
- if (path && path.split('/').length > 2) {
301
+ if (filePath && filePath.split('/').length > 2) {
286
302
  let expiration = new Date();
287
303
  expiration.setHours(expiration.getHours() + 2);
288
304
  const token = await UserService.createToken({
@@ -294,7 +310,7 @@ export async function reloadWebsocket() {
294
310
  'file:///': root + '/'
295
311
  }
296
312
  };
297
- let path_splitted = path.split('/');
313
+ let path_splitted = filePath.split('/');
298
314
  for (let c = 0; c < path_splitted.length; c++) {
299
315
  let key = 'file://./';
300
316
  for (let i = 0; i < c; i++) {
@@ -445,35 +461,45 @@ export async function reloadWebsocket() {
445
461
  }
446
462
  let pathTimeout = undefined;
447
463
  function handlePathChange() {
464
+ console.log('path changed, reloading language server', initialPath, path);
448
465
  initialPath = path;
449
466
  pathTimeout && clearTimeout(pathTimeout);
450
- pathTimeout = setTimeout(reloadWebsocket, 3000);
467
+ pathTimeout = setTimeout(reloadWebsocket, 1000);
451
468
  }
452
469
  async function closeWebsockets() {
453
470
  command && command.dispose();
454
471
  command = undefined;
472
+ console.debug(`disposing ${websockets.length} language clients and closing websockets`);
473
+ for (const x of languageClients) {
474
+ try {
475
+ await x.dispose();
476
+ }
477
+ catch (err) {
478
+ console.debug('error disposing language client', err);
479
+ }
480
+ }
481
+ languageClients = [];
455
482
  for (const x of websockets) {
456
483
  try {
457
- await x[0].dispose();
458
- x[1].close();
484
+ await x.close();
459
485
  }
460
486
  catch (err) {
461
- console.log('error disposing language client, closing websocket', err);
462
- try {
463
- x[1].close();
464
- }
465
- catch (err) {
466
- console.log('error disposing websocket, closin', err);
467
- }
487
+ console.debug('error closing websocket', err);
468
488
  }
469
489
  }
470
- console.log('disposed language client and closed websocket');
490
+ console.debug('done closing websockets');
471
491
  websockets = [];
472
492
  websocketInterval && clearInterval(websocketInterval);
473
493
  }
474
494
  let widgets = document.getElementById('monaco-widgets-root') ?? undefined;
495
+ let model;
496
+ let monacoBinding = undefined;
497
+ // @ts-ignore
498
+ $: if (yContent && awareness && model && editor) {
499
+ monacoBinding && monacoBinding.destroy();
500
+ monacoBinding = new MonacoBinding(yContent, model, new Set([editor]), awareness);
501
+ }
475
502
  async function loadMonaco() {
476
- let model;
477
503
  try {
478
504
  model = meditor.createModel(code, lang, mUri.parse(uri));
479
505
  }
@@ -489,15 +515,19 @@ async function loadMonaco() {
489
515
  editor = meditor.create(divEl, {
490
516
  ...editorConfig(model, code, lang, automaticLayout, fixedOverflowWidgets),
491
517
  overflowWidgetsDomNode: widgets,
492
- tabSize: lang == 'python' ? 4 : 2
518
+ tabSize: lang == 'python' ? 4 : 2,
519
+ folding
493
520
  });
494
521
  let timeoutModel = undefined;
495
522
  editor.onDidChangeModelContent((event) => {
496
523
  $dirtyStore = true;
497
524
  timeoutModel && clearTimeout(timeoutModel);
498
525
  timeoutModel = setTimeout(() => {
499
- code = getCode();
500
- dispatch('change', code);
526
+ let ncode = getCode();
527
+ if (ncode != '') {
528
+ code = ncode;
529
+ dispatch('change', code);
530
+ }
501
531
  }, 500);
502
532
  });
503
533
  editor.onDidFocusEditorText(() => {
@@ -517,11 +547,13 @@ async function loadMonaco() {
517
547
  !websocketAlive.shellcheck &&
518
548
  !websocketAlive.go &&
519
549
  !websocketInterval) {
550
+ console.log('reconnecting to language servers on focus');
520
551
  reloadWebsocket();
521
552
  }
522
553
  });
523
554
  reloadWebsocket();
524
555
  return () => {
556
+ console.log('disposing editor');
525
557
  try {
526
558
  closeWebsockets();
527
559
  model?.dispose();
@@ -557,11 +589,30 @@ onDestroy(() => {
557
589
 
558
590
  <div bind:this={divEl} class="{$$props.class} editor" />
559
591
 
560
- <style>
561
- .editor {
562
- border-radius: 0.375rem;
563
- border-width: 1px;
564
- --tw-border-opacity: 1;
565
- border-color: rgb(249 250 251 / var(--tw-border-opacity));
566
- padding: 0px
567
- }</style>
592
+ <style global>
593
+ :global(.editor) {
594
+ border-radius: 0.375rem;
595
+ border-width: 1px;
596
+ --tw-border-opacity: 1;
597
+ border-color: rgb(249 250 251 / var(--tw-border-opacity));
598
+ padding: 0px;
599
+ }
600
+ :global(.yRemoteSelection) {
601
+ background-color: rgb(250, 129, 0, 0.5);
602
+ }
603
+ :global(.yRemoteSelectionHead) {
604
+ position: absolute;
605
+ border-left: orange solid 2px;
606
+ border-top: orange solid 2px;
607
+ border-bottom: orange solid 2px;
608
+ height: 100%;
609
+ box-sizing: border-box;
610
+ }
611
+ :global(.yRemoteSelectionHead::after) {
612
+ position: absolute;
613
+ content: ' ';
614
+ border: 3px solid orange;
615
+ border-radius: 4px;
616
+ left: -4px;
617
+ top: -5px;
618
+ }</style>
@@ -6,6 +6,7 @@ import 'monaco-editor/esm/vs/basic-languages/go/go.contribution';
6
6
  import 'monaco-editor/esm/vs/basic-languages/shell/shell.contribution';
7
7
  import 'monaco-editor/esm/vs/basic-languages/typescript/typescript.contribution';
8
8
  import 'monaco-editor/esm/vs/language/typescript/monaco.contribution';
9
+ import type { Text } from 'yjs';
9
10
  declare const __propDef: {
10
11
  props: {
11
12
  [x: string]: any;
@@ -25,6 +26,9 @@ declare const __propDef: {
25
26
  shouldBindKey?: boolean | undefined;
26
27
  fixedOverflowWidgets?: boolean | undefined;
27
28
  path?: string | undefined;
29
+ yContent?: Text | undefined;
30
+ awareness?: any | undefined;
31
+ folding?: boolean | undefined;
28
32
  getCode?: (() => string) | undefined;
29
33
  insertAtCursor?: ((code: string) => void) | undefined;
30
34
  insertAtBeginning?: ((code: string) => void) | undefined;