@jumoo/usync 0.0.0-stage → 18.2.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 (197) hide show
  1. package/LICENCE +373 -0
  2. package/README.md +10 -3
  3. package/dist/api/client/client.gen.d.ts +2 -0
  4. package/dist/api/client/client.gen.js +216 -0
  5. package/dist/api/client/index.d.ts +10 -0
  6. package/dist/api/client/index.js +6 -0
  7. package/dist/api/client/types.gen.d.ts +120 -0
  8. package/dist/api/client/types.gen.js +2 -0
  9. package/dist/api/client/utils.gen.d.ts +37 -0
  10. package/dist/api/client/utils.gen.js +230 -0
  11. package/dist/api/client.gen.d.ts +12 -0
  12. package/dist/api/client.gen.js +3 -0
  13. package/dist/api/core/auth.gen.d.ts +25 -0
  14. package/dist/api/core/auth.gen.js +14 -0
  15. package/dist/api/core/bodySerializer.gen.d.ts +25 -0
  16. package/dist/api/core/bodySerializer.gen.js +57 -0
  17. package/dist/api/core/params.gen.d.ts +43 -0
  18. package/dist/api/core/params.gen.js +109 -0
  19. package/dist/api/core/pathSerializer.gen.d.ts +33 -0
  20. package/dist/api/core/pathSerializer.gen.js +106 -0
  21. package/dist/api/core/queryKeySerializer.gen.d.ts +18 -0
  22. package/dist/api/core/queryKeySerializer.gen.js +92 -0
  23. package/dist/api/core/serverSentEvents.gen.d.ts +71 -0
  24. package/dist/api/core/serverSentEvents.gen.js +132 -0
  25. package/dist/api/core/types.gen.d.ts +83 -0
  26. package/dist/api/core/types.gen.js +2 -0
  27. package/dist/api/core/utils.gen.d.ts +19 -0
  28. package/dist/api/core/utils.gen.js +87 -0
  29. package/dist/api/index.d.ts +2 -0
  30. package/dist/api/index.js +3 -0
  31. package/dist/api/sdk.gen.d.ts +32 -0
  32. package/dist/api/sdk.gen.js +95 -0
  33. package/dist/api/types.gen.d.ts +565 -0
  34. package/dist/api/types.gen.js +47 -0
  35. package/dist/components/events.d.ts +11 -0
  36. package/dist/components/events.js +11 -0
  37. package/dist/components/index.d.ts +8 -0
  38. package/dist/components/index.js +9 -0
  39. package/dist/components/usync-action-box.d.ts +22 -0
  40. package/dist/components/usync-action-box.js +129 -0
  41. package/dist/components/usync-change-detail.d.ts +31 -0
  42. package/dist/components/usync-change-detail.js +709 -0
  43. package/dist/components/usync-change-view.d.ts +22 -0
  44. package/dist/components/usync-change-view.js +125 -0
  45. package/dist/components/usync-progress-box.d.ts +20 -0
  46. package/dist/components/usync-progress-box.js +231 -0
  47. package/dist/components/usync-result-row.d.ts +15 -0
  48. package/dist/components/usync-result-row.js +137 -0
  49. package/dist/components/usync-results-group-view.d.ts +19 -0
  50. package/dist/components/usync-results-group-view.js +118 -0
  51. package/dist/components/usync-results-view.d.ts +17 -0
  52. package/dist/components/usync-results-view.js +177 -0
  53. package/dist/components/usync-sync-file-info-view.d.ts +15 -0
  54. package/dist/components/usync-sync-file-info-view.js +62 -0
  55. package/dist/conditions/constants.d.ts +1 -0
  56. package/dist/conditions/constants.js +1 -0
  57. package/dist/conditions/index.d.ts +2 -0
  58. package/dist/conditions/index.js +2 -0
  59. package/dist/conditions/legacy-files.condition.d.ts +10 -0
  60. package/dist/conditions/legacy-files.condition.js +16 -0
  61. package/dist/conditions/manifest.d.ts +1 -0
  62. package/dist/conditions/manifest.js +18 -0
  63. package/dist/conditions/new-section.condition.d.ts +8 -0
  64. package/dist/conditions/new-section.condition.js +48 -0
  65. package/dist/constants.d.ts +30 -0
  66. package/dist/constants.js +38 -0
  67. package/dist/dialogs/details-modal-element.d.ts +18 -0
  68. package/dist/dialogs/details-modal-element.js +106 -0
  69. package/dist/dialogs/details-modal-token.d.ts +10 -0
  70. package/dist/dialogs/details-modal-token.js +7 -0
  71. package/dist/dialogs/error-modal-element.d.ts +7 -0
  72. package/dist/dialogs/error-modal-element.js +55 -0
  73. package/dist/dialogs/error-modal-token.d.ts +9 -0
  74. package/dist/dialogs/error-modal-token.js +6 -0
  75. package/dist/dialogs/index.d.ts +6 -0
  76. package/dist/dialogs/index.js +6 -0
  77. package/dist/dialogs/legacy-modal-element.d.ts +13 -0
  78. package/dist/dialogs/legacy-modal-element.js +78 -0
  79. package/dist/dialogs/manifest.d.ts +1 -0
  80. package/dist/dialogs/manifest.js +25 -0
  81. package/dist/dialogs/single-import-modal.element.d.ts +13 -0
  82. package/dist/dialogs/single-import-modal.element.js +106 -0
  83. package/dist/dialogs/single-import-modal.token.d.ts +9 -0
  84. package/dist/dialogs/single-import-modal.token.js +6 -0
  85. package/dist/exports.d.ts +10 -0
  86. package/dist/exports.js +10 -0
  87. package/dist/external/signalr/index.d.ts +1 -0
  88. package/dist/external/signalr/index.js +1 -0
  89. package/dist/icons/icons.d.ts +5 -0
  90. package/dist/icons/icons.js +6 -0
  91. package/dist/icons/manifest.d.ts +1 -0
  92. package/dist/icons/manifest.js +7 -0
  93. package/dist/icons/svg/logo.d.ts +2 -0
  94. package/dist/icons/svg/logo.js +21 -0
  95. package/dist/index.d.ts +8 -0
  96. package/dist/index.js +19 -0
  97. package/dist/lang/files/da-dk.d.ts +130 -0
  98. package/dist/lang/files/da-dk.js +141 -0
  99. package/dist/lang/files/de-de.d.ts +130 -0
  100. package/dist/lang/files/de-de.js +141 -0
  101. package/dist/lang/files/en-us.d.ts +162 -0
  102. package/dist/lang/files/en-us.js +173 -0
  103. package/dist/lang/files/es-es.d.ts +130 -0
  104. package/dist/lang/files/es-es.js +141 -0
  105. package/dist/lang/files/fr-fr.d.ts +130 -0
  106. package/dist/lang/files/fr-fr.js +141 -0
  107. package/dist/lang/files/nl-nl.d.ts +130 -0
  108. package/dist/lang/files/nl-nl.js +141 -0
  109. package/dist/lang/manifest.d.ts +1 -0
  110. package/dist/lang/manifest.js +63 -0
  111. package/dist/manifests.d.ts +1 -0
  112. package/dist/manifests.js +14 -0
  113. package/dist/repository/SyncAction.respositoy.d.ts +121 -0
  114. package/dist/repository/SyncAction.respositoy.js +125 -0
  115. package/dist/repository/index.d.ts +4 -0
  116. package/dist/repository/index.js +4 -0
  117. package/dist/repository/sources/SyncAction.source.d.ts +57 -0
  118. package/dist/repository/sources/SyncAction.source.js +57 -0
  119. package/dist/repository/sources/SyncMigration.source.d.ts +13 -0
  120. package/dist/repository/sources/SyncMigration.source.js +30 -0
  121. package/dist/repository/sources/SyncSettings.source.d.ts +33 -0
  122. package/dist/repository/sources/SyncSettings.source.js +33 -0
  123. package/dist/signalr/index.d.ts +3 -0
  124. package/dist/signalr/index.js +3 -0
  125. package/dist/signalr/signalr-reconnect-policy.d.ts +11 -0
  126. package/dist/signalr/signalr-reconnect-policy.js +14 -0
  127. package/dist/signalr/signalr.context.d.ts +34 -0
  128. package/dist/signalr/signalr.context.js +110 -0
  129. package/dist/signalr/signalr.context.token.d.ts +3 -0
  130. package/dist/signalr/signalr.context.token.js +2 -0
  131. package/dist/signalr/types.d.ts +21 -0
  132. package/dist/signalr/types.js +1 -0
  133. package/dist/tree/constants.d.ts +1 -0
  134. package/dist/tree/constants.js +1 -0
  135. package/dist/tree/index.d.ts +2 -0
  136. package/dist/tree/index.js +2 -0
  137. package/dist/tree/manifest.d.ts +1 -0
  138. package/dist/tree/manifest.js +92 -0
  139. package/dist/tree/types.d.ts +14 -0
  140. package/dist/tree/types.js +1 -0
  141. package/dist/tree/usync.menu-element.d.ts +13 -0
  142. package/dist/tree/usync.menu-element.js +74 -0
  143. package/dist/utils/diff/change-name.d.ts +13 -0
  144. package/dist/utils/diff/change-name.js +30 -0
  145. package/dist/utils/diff/classify-change.d.ts +21 -0
  146. package/dist/utils/diff/classify-change.js +111 -0
  147. package/dist/utils/diff/deep-equal.d.ts +13 -0
  148. package/dist/utils/diff/deep-equal.js +57 -0
  149. package/dist/utils/diff/format-value.d.ts +36 -0
  150. package/dist/utils/diff/format-value.js +88 -0
  151. package/dist/utils/diff/index.d.ts +7 -0
  152. package/dist/utils/diff/index.js +7 -0
  153. package/dist/utils/diff/json-diff.d.ts +34 -0
  154. package/dist/utils/diff/json-diff.js +300 -0
  155. package/dist/utils/diff/line-diff.d.ts +16 -0
  156. package/dist/utils/diff/line-diff.js +199 -0
  157. package/dist/utils/diff/types.d.ts +62 -0
  158. package/dist/utils/diff/types.js +12 -0
  159. package/dist/workspace/components/events.d.ts +31 -0
  160. package/dist/workspace/components/events.js +54 -0
  161. package/dist/workspace/components/index.d.ts +3 -0
  162. package/dist/workspace/components/index.js +3 -0
  163. package/dist/workspace/components/usync-action-button.d.ts +20 -0
  164. package/dist/workspace/components/usync-action-button.js +121 -0
  165. package/dist/workspace/components/usync-file-picker.element.d.ts +23 -0
  166. package/dist/workspace/components/usync-file-picker.element.js +106 -0
  167. package/dist/workspace/components/usync-file-upload.element.d.ts +21 -0
  168. package/dist/workspace/components/usync-file-upload.element.js +121 -0
  169. package/dist/workspace/dialogs/import-modal.element.d.ts +11 -0
  170. package/dist/workspace/dialogs/import-modal.element.js +75 -0
  171. package/dist/workspace/dialogs/import-modal.token.d.ts +6 -0
  172. package/dist/workspace/dialogs/import-modal.token.js +6 -0
  173. package/dist/workspace/dialogs/index.d.ts +2 -0
  174. package/dist/workspace/dialogs/index.js +2 -0
  175. package/dist/workspace/dialogs/manifest.d.ts +1 -0
  176. package/dist/workspace/dialogs/manifest.js +7 -0
  177. package/dist/workspace/index.d.ts +3 -0
  178. package/dist/workspace/index.js +3 -0
  179. package/dist/workspace/manifest.d.ts +3 -0
  180. package/dist/workspace/manifest.js +112 -0
  181. package/dist/workspace/types.d.ts +12 -0
  182. package/dist/workspace/types.js +1 -0
  183. package/dist/workspace/views/addons/addons.element.d.ts +7 -0
  184. package/dist/workspace/views/addons/addons.element.js +117 -0
  185. package/dist/workspace/views/default/default.element.d.ts +31 -0
  186. package/dist/workspace/views/default/default.element.js +466 -0
  187. package/dist/workspace/views/legacy/legacy.element.d.ts +14 -0
  188. package/dist/workspace/views/legacy/legacy.element.js +187 -0
  189. package/dist/workspace/views/settings/components/usyncSettingItem.element.d.ts +15 -0
  190. package/dist/workspace/views/settings/components/usyncSettingItem.element.js +96 -0
  191. package/dist/workspace/views/settings/settings.element.d.ts +17 -0
  192. package/dist/workspace/views/settings/settings.element.js +174 -0
  193. package/dist/workspace/workspace.context.d.ts +79 -0
  194. package/dist/workspace/workspace.context.js +448 -0
  195. package/dist/workspace/workspace.element.d.ts +17 -0
  196. package/dist/workspace/workspace.element.js +69 -0
  197. package/package.json +77 -6
@@ -0,0 +1,448 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _uSyncWorkspaceContext_instances, _uSyncWorkspaceContext_repository, _uSyncWorkspaceContext_signalRContext, _uSyncWorkspaceContext_pollTimer, _uSyncWorkspaceContext_lastSignalRMessageAt, _uSyncWorkspaceContext_pendingDownload, _uSyncWorkspaceContext_actions, _uSyncWorkspaceContext_workingGroup, _uSyncWorkspaceContext_workingActions, _uSyncWorkspaceContext_working, _uSyncWorkspaceContext_inBackground, _uSyncWorkspaceContext_completed, _uSyncWorkspaceContext_results, _uSyncWorkspaceContext_settings, _uSyncWorkspaceContext_handlerSettings, _uSyncWorkspaceContext_handlerSets, _uSyncWorkspaceContext_legacy, _uSyncWorkspaceContext_syncFileInfo, _uSyncWorkspaceContext_checkForRunningOperation, _uSyncWorkspaceContext_startPolling, _uSyncWorkspaceContext_stopPolling, _uSyncWorkspaceContext_onRunComplete, _uSyncWorkspaceContext_getFileName;
13
+ import { UmbArrayState, UmbBooleanState, UmbObjectState, } from '@umbraco-cms/backoffice/observable-api';
14
+ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
15
+ import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
16
+ import { uSyncActionRepository, uSyncConstants, } from '@jumoo/uSync';
17
+ import uSyncSignalRContext from '../signalr/signalr.context';
18
+ import { UMB_WORKSPACE_CONTEXT, } from '@umbraco-cms/backoffice/workspace';
19
+ import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal';
20
+ import { USYNC_IMPORT_MODAL } from './dialogs';
21
+ /**
22
+ * Status-poll interval bounds while a background run is active and SignalR
23
+ * isn't delivering. Starts close to real-time so the progress bar actually
24
+ * moves during a run - polling is now gated on message liveness rather than
25
+ * being the sole progress mechanism, and only kicks in when SignalR isn't
26
+ * doing the job, so the SQLite contention risk noted in the background-mode
27
+ * docs is far smaller than when this was the only path. Still backs off
28
+ * towards POLL_INTERVAL_MAX_MS on a long-running import so a multi-minute
29
+ * run doesn't sustain a steady 1s query rate the whole way through.
30
+ */
31
+ const POLL_INTERVAL_MIN_MS = 1000;
32
+ const POLL_INTERVAL_MAX_MS = 20000;
33
+ /**
34
+ * How long to go without a SignalR message before treating the connection as
35
+ * not actually delivering for this run, and falling back to polling.
36
+ *
37
+ * A "connected" socket is not the same as "receiving messages for this run" -
38
+ * under a load-balanced backoffice without a SignalR backplane (or sticky
39
+ * sessions), the socket can be happily connected to a server that isn't the
40
+ * one running the job, so it never delivers anything and `getConnected()`
41
+ * alone would leave the UI hung forever on a run that already finished.
42
+ * Comfortably longer than the gap between handler steps on a healthy
43
+ * single-server run, so the normal (SignalR-only) path is unaffected.
44
+ */
45
+ const SIGNALR_STALE_MS = 15000;
46
+ /**
47
+ * Context for getting and seting up actions.
48
+ */
49
+ export class uSyncWorkspaceContext extends UmbControllerBase {
50
+ getEntityType() {
51
+ return uSyncConstants.workspace.rootElement;
52
+ }
53
+ constructor(host) {
54
+ super(host);
55
+ _uSyncWorkspaceContext_instances.add(this);
56
+ this.workspaceAlias = uSyncConstants.workspace.alias;
57
+ _uSyncWorkspaceContext_repository.set(this, void 0);
58
+ _uSyncWorkspaceContext_signalRContext.set(this, null);
59
+ /**
60
+ * poll timer used while a background operation is running - this is the
61
+ * safety net (and the page-reload reattach mechanism) alongside SignalR,
62
+ * which is the fast path for live progress.
63
+ */
64
+ _uSyncWorkspaceContext_pollTimer.set(this, null);
65
+ /**
66
+ * timestamp of the last SignalR add/update/complete message seen for the
67
+ * current run - used to detect a socket that's "connected" but not
68
+ * actually delivering (see SIGNALR_STALE_MS).
69
+ */
70
+ _uSyncWorkspaceContext_lastSignalRMessageAt.set(this, 0);
71
+ /**
72
+ * true when the current background run needs to trigger a file download
73
+ * once it completes (export-to-file can't download until the export has
74
+ * actually finished writing, which - in background mode - is not when
75
+ * the enqueue call returns).
76
+ */
77
+ _uSyncWorkspaceContext_pendingDownload.set(this, false);
78
+ /**
79
+ * list of actions that have been returned from the process
80
+ */
81
+ _uSyncWorkspaceContext_actions.set(this, new UmbArrayState([], (x) => x.key));
82
+ this.actions = __classPrivateFieldGet(this, _uSyncWorkspaceContext_actions, "f").asObservable();
83
+ this._currentSetName = '';
84
+ /**
85
+ * the working group name
86
+ */
87
+ _uSyncWorkspaceContext_workingGroup.set(this, new UmbObjectState(undefined));
88
+ this.workingGroup = __classPrivateFieldGet(this, _uSyncWorkspaceContext_workingGroup, "f").asObservable();
89
+ /**
90
+ * The summary objects that show the handler boxes
91
+ */
92
+ _uSyncWorkspaceContext_workingActions.set(this, new UmbArrayState([], (x) => x.name));
93
+ this.currentAction = __classPrivateFieldGet(this, _uSyncWorkspaceContext_workingActions, "f").asObservable();
94
+ /**
95
+ * Flag to say if things are currently being processed
96
+ */
97
+ _uSyncWorkspaceContext_working.set(this, new UmbBooleanState(false));
98
+ this.working = __classPrivateFieldGet(this, _uSyncWorkspaceContext_working, "f").asObservable();
99
+ _uSyncWorkspaceContext_inBackground.set(this, new UmbBooleanState(false));
100
+ this.inBackground = __classPrivateFieldGet(this, _uSyncWorkspaceContext_inBackground, "f").asObservable();
101
+ /**
102
+ * Flag to say that the last run has been completed (so results will show)
103
+ */
104
+ _uSyncWorkspaceContext_completed.set(this, new UmbBooleanState(false));
105
+ this.completed = __classPrivateFieldGet(this, _uSyncWorkspaceContext_completed, "f").asObservable();
106
+ /**
107
+ * The results of a run.
108
+ */
109
+ _uSyncWorkspaceContext_results.set(this, new UmbArrayState([], (x) => x.name));
110
+ this.results = __classPrivateFieldGet(this, _uSyncWorkspaceContext_results, "f").asObservable();
111
+ /**
112
+ * Current settings for uSync
113
+ */
114
+ _uSyncWorkspaceContext_settings.set(this, new UmbObjectState(undefined));
115
+ this.settings = __classPrivateFieldGet(this, _uSyncWorkspaceContext_settings, "f")?.asObservable();
116
+ /**
117
+ * Handler settings object
118
+ */
119
+ _uSyncWorkspaceContext_handlerSettings.set(this, new UmbObjectState(undefined));
120
+ this.handlerSettings = __classPrivateFieldGet(this, _uSyncWorkspaceContext_handlerSettings, "f")?.asObservable();
121
+ _uSyncWorkspaceContext_handlerSets.set(this, new UmbArrayState([], (x) => x));
122
+ this.sets = __classPrivateFieldGet(this, _uSyncWorkspaceContext_handlerSets, "f").asObservable();
123
+ _uSyncWorkspaceContext_legacy.set(this, new UmbObjectState(undefined));
124
+ this.legacy = __classPrivateFieldGet(this, _uSyncWorkspaceContext_legacy, "f")?.asObservable();
125
+ _uSyncWorkspaceContext_syncFileInfo.set(this, new UmbObjectState(undefined));
126
+ this.syncFileInfo = __classPrivateFieldGet(this, _uSyncWorkspaceContext_syncFileInfo, "f")?.asObservable();
127
+ this.provideContext(USYNC_CORE_CONTEXT_TOKEN, this);
128
+ this.provideContext(UMB_WORKSPACE_CONTEXT, this);
129
+ __classPrivateFieldSet(this, _uSyncWorkspaceContext_repository, new uSyncActionRepository(this), "f");
130
+ __classPrivateFieldSet(this, _uSyncWorkspaceContext_signalRContext, new uSyncSignalRContext(this), "f");
131
+ this.observe(__classPrivateFieldGet(this, _uSyncWorkspaceContext_signalRContext, "f").connected, (connected) => {
132
+ console.debug('SignalR connected', connected);
133
+ });
134
+ // a "connected" socket only tells us it's connected to *some* server -
135
+ // under a load-balanced backoffice it may not be the one running the
136
+ // job. Track actual message arrival separately so the poll fallback can
137
+ // notice a connection that isn't delivering (see SIGNALR_STALE_MS).
138
+ this.observe(__classPrivateFieldGet(this, _uSyncWorkspaceContext_signalRContext, "f").add, (add) => {
139
+ if (!add)
140
+ return;
141
+ __classPrivateFieldSet(this, _uSyncWorkspaceContext_lastSignalRMessageAt, Date.now(), "f");
142
+ });
143
+ this.observe(__classPrivateFieldGet(this, _uSyncWorkspaceContext_signalRContext, "f").update, (update) => {
144
+ if (!update)
145
+ return;
146
+ __classPrivateFieldSet(this, _uSyncWorkspaceContext_lastSignalRMessageAt, Date.now(), "f");
147
+ });
148
+ this.observe(__classPrivateFieldGet(this, _uSyncWorkspaceContext_signalRContext, "f").complete, (complete) => {
149
+ if (!complete)
150
+ return;
151
+ __classPrivateFieldSet(this, _uSyncWorkspaceContext_lastSignalRMessageAt, Date.now(), "f");
152
+ if (complete.success) {
153
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_instances, "m", _uSyncWorkspaceContext_onRunComplete).call(this, complete.actions ?? []);
154
+ }
155
+ });
156
+ // on load, ask the server if a background run is already active -
157
+ // this is what lets the dashboard reattach after a page reload.
158
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_instances, "m", _uSyncWorkspaceContext_checkForRunningOperation).call(this);
159
+ }
160
+ hostDisconnected() {
161
+ super.hostDisconnected();
162
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_instances, "m", _uSyncWorkspaceContext_stopPolling).call(this);
163
+ }
164
+ /**
165
+ * Return the current actions from the repository
166
+ */
167
+ async getActions(setName) {
168
+ const { data } = await __classPrivateFieldGet(this, _uSyncWorkspaceContext_repository, "f").getActions(setName);
169
+ if (data) {
170
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_actions, "f").setValue(data);
171
+ this._currentSetName = setName;
172
+ }
173
+ }
174
+ /**
175
+ * Get the current uSync settings
176
+ */
177
+ async getSettings() {
178
+ const { data } = await __classPrivateFieldGet(this, _uSyncWorkspaceContext_repository, "f").getSettings();
179
+ if (data) {
180
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_settings, "f").setValue(data);
181
+ }
182
+ return data;
183
+ }
184
+ async getAddons() {
185
+ const { data } = await __classPrivateFieldGet(this, _uSyncWorkspaceContext_repository, "f").getAddons();
186
+ return data;
187
+ }
188
+ async getSyncFileInfo() {
189
+ const { data } = await __classPrivateFieldGet(this, _uSyncWorkspaceContext_repository, "f").getSyncFileInfo();
190
+ if (data) {
191
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_syncFileInfo, "f").setValue(data);
192
+ }
193
+ return data;
194
+ }
195
+ /**
196
+ * Check to see if there is a legacy uSync folder on disk.
197
+ */
198
+ async checkLegacy() {
199
+ const { data } = await __classPrivateFieldGet(this, _uSyncWorkspaceContext_repository, "f").checkLegacy();
200
+ if (data) {
201
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_legacy, "f").setValue(data);
202
+ }
203
+ return data;
204
+ }
205
+ async ignoreLegacy() {
206
+ const { data } = await __classPrivateFieldGet(this, _uSyncWorkspaceContext_repository, "f").ignoreLegacy();
207
+ return data ?? false;
208
+ }
209
+ async copyLegacy() {
210
+ const { data } = await __classPrivateFieldGet(this, _uSyncWorkspaceContext_repository, "f").copyLegacy();
211
+ return data ?? false;
212
+ }
213
+ /**
214
+ * Get handler defaults.
215
+ */
216
+ async getDefaultHandlerSetSettings(setName) {
217
+ const { data } = await __classPrivateFieldGet(this, _uSyncWorkspaceContext_repository, "f").getHandlerSettings(setName);
218
+ if (data) {
219
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_handlerSettings, "f").setValue(data);
220
+ }
221
+ }
222
+ async getHandlerSets() {
223
+ const { data } = await __classPrivateFieldGet(this, _uSyncWorkspaceContext_repository, "f").getSets();
224
+ if (data) {
225
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_handlerSets, "f").setValue(data);
226
+ }
227
+ }
228
+ /**
229
+ * Perform an action (e.g import, export, etc) with options
230
+ * @param options options for the action
231
+ */
232
+ async performAction(options) {
233
+ var clientId = __classPrivateFieldGet(this, _uSyncWorkspaceContext_signalRContext, "f")?.getClientId() ?? '';
234
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_working, "f").setValue(true);
235
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_completed, "f").setValue(false);
236
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_results, "f").setValue([]);
237
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_workingGroup, "f").setValue(options.group);
238
+ var complete = false;
239
+ var id = '';
240
+ var step = 0;
241
+ var lastResponse;
242
+ // pre-action checks, for files.
243
+ if (options.file && options.action === 'Import') {
244
+ // imports need to open the file dialog to get the file first.
245
+ const uploadResult = await this.uploadFile();
246
+ if (!uploadResult) {
247
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_completed, "f").setValue(true);
248
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_working, "f").setValue(false);
249
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_results, "f").setValue([]);
250
+ return;
251
+ }
252
+ }
253
+ do {
254
+ const { data } = await __classPrivateFieldGet(this, _uSyncWorkspaceContext_repository, "f").performAction({
255
+ id: id,
256
+ set: options.setName,
257
+ action: options.action,
258
+ group: options.group.key,
259
+ force: options.force,
260
+ clean: options.clean,
261
+ file: options.file,
262
+ step: step,
263
+ clientId: clientId,
264
+ });
265
+ if (data) {
266
+ step++;
267
+ let summary = data.status ?? [];
268
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_workingActions, "f").setValue(summary);
269
+ id = data.requestId;
270
+ complete = data.complete;
271
+ lastResponse = data;
272
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_inBackground, "f").setValue(data.inBackground);
273
+ if (complete && !data.inBackground) {
274
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_results, "f").setValue(data?.actions ?? []);
275
+ this.getActions(this._currentSetName);
276
+ }
277
+ }
278
+ else {
279
+ complete = true;
280
+ }
281
+ } while (!complete);
282
+ if (lastResponse?.message) {
283
+ // the run couldn't be started (e.g. one is already in progress) -
284
+ // nothing happened, so don't report a completed run.
285
+ console.warn('[uSync]', lastResponse.message);
286
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_working, "f").setValue(false);
287
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_completed, "f").setValue(false);
288
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_inBackground, "f").setValue(false);
289
+ return;
290
+ }
291
+ if (lastResponse?.inBackground && lastResponse?.operationId) {
292
+ // enqueued - poll (and listen via SignalR) until it completes.
293
+ // export-to-file must wait until then too, it can't download yet.
294
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_instances, "m", _uSyncWorkspaceContext_startPolling).call(this, lastResponse.operationId, options);
295
+ return;
296
+ }
297
+ // normal (stepped, foreground) mode - already complete.
298
+ if (options.file && options.action === 'Export') {
299
+ await this.downloadFile();
300
+ }
301
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_completed, "f").setValue(true);
302
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_working, "f").setValue(false);
303
+ }
304
+ /**
305
+ * Manually clear a stuck "running in background" state - a workaround for
306
+ * when the server that was running the sync crashed or restarted and this
307
+ * client is left showing it as still active. This only resets what THIS
308
+ * client shows; it does not (and cannot - Umbraco's long-running-operation
309
+ * service has no cancel API) force the server-side operation to end. If
310
+ * the run really is still active elsewhere, starting a new one will still
311
+ * be rejected until the server-side run actually finishes or its
312
+ * expiration window passes (a few minutes by default).
313
+ */
314
+ dismissBackgroundRun() {
315
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_instances, "m", _uSyncWorkspaceContext_stopPolling).call(this);
316
+ __classPrivateFieldSet(this, _uSyncWorkspaceContext_pendingDownload, false, "f");
317
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_completed, "f").setValue(false);
318
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_working, "f").setValue(false);
319
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_inBackground, "f").setValue(false);
320
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_workingActions, "f").setValue([]);
321
+ }
322
+ async uploadFile() {
323
+ const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT);
324
+ if (!modalManager)
325
+ return;
326
+ const importModal = modalManager.open(this, USYNC_IMPORT_MODAL, {
327
+ data: {},
328
+ });
329
+ const data = await importModal.onSubmit().catch(() => {
330
+ return false;
331
+ });
332
+ if (!data)
333
+ return false;
334
+ return true;
335
+ }
336
+ async downloadFile() {
337
+ const response = await __classPrivateFieldGet(this, _uSyncWorkspaceContext_repository, "f").downloadFile();
338
+ if (!response)
339
+ return;
340
+ console.log('Downloading file', response);
341
+ const url = window.URL.createObjectURL(response);
342
+ const download = document.createElement('a');
343
+ download.href = url;
344
+ download.download = __classPrivateFieldGet(this, _uSyncWorkspaceContext_instances, "m", _uSyncWorkspaceContext_getFileName).call(this);
345
+ document.body.appendChild(download);
346
+ download.dispatchEvent(new MouseEvent('click'));
347
+ download.remove();
348
+ window.URL.revokeObjectURL(url);
349
+ }
350
+ async importSingle(item) {
351
+ if (!item)
352
+ return;
353
+ const data = await __classPrivateFieldGet(this, _uSyncWorkspaceContext_repository, "f").importSingle(item);
354
+ return data;
355
+ }
356
+ }
357
+ _uSyncWorkspaceContext_repository = new WeakMap(), _uSyncWorkspaceContext_signalRContext = new WeakMap(), _uSyncWorkspaceContext_pollTimer = new WeakMap(), _uSyncWorkspaceContext_lastSignalRMessageAt = new WeakMap(), _uSyncWorkspaceContext_pendingDownload = new WeakMap(), _uSyncWorkspaceContext_actions = new WeakMap(), _uSyncWorkspaceContext_workingGroup = new WeakMap(), _uSyncWorkspaceContext_workingActions = new WeakMap(), _uSyncWorkspaceContext_working = new WeakMap(), _uSyncWorkspaceContext_inBackground = new WeakMap(), _uSyncWorkspaceContext_completed = new WeakMap(), _uSyncWorkspaceContext_results = new WeakMap(), _uSyncWorkspaceContext_settings = new WeakMap(), _uSyncWorkspaceContext_handlerSettings = new WeakMap(), _uSyncWorkspaceContext_handlerSets = new WeakMap(), _uSyncWorkspaceContext_legacy = new WeakMap(), _uSyncWorkspaceContext_syncFileInfo = new WeakMap(), _uSyncWorkspaceContext_instances = new WeakSet(), _uSyncWorkspaceContext_checkForRunningOperation =
358
+ /**
359
+ * Ask the server if a background run is already active, and if so,
360
+ * reattach to it (used on load, to recover from a page reload).
361
+ */
362
+ async function _uSyncWorkspaceContext_checkForRunningOperation() {
363
+ const { data } = await __classPrivateFieldGet(this, _uSyncWorkspaceContext_repository, "f").getRunningOperation();
364
+ if (!data?.operationId)
365
+ return;
366
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_working, "f").setValue(true);
367
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_completed, "f").setValue(false);
368
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_inBackground, "f").setValue(true);
369
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_instances, "m", _uSyncWorkspaceContext_startPolling).call(this, data.operationId);
370
+ }, _uSyncWorkspaceContext_startPolling = function _uSyncWorkspaceContext_startPolling(operationId, options) {
371
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_instances, "m", _uSyncWorkspaceContext_stopPolling).call(this);
372
+ __classPrivateFieldSet(this, _uSyncWorkspaceContext_pendingDownload, options?.file === true && options?.action === 'Export', "f");
373
+ // seed this so the very first poll still waits the normal interval
374
+ // rather than firing immediately just because no message has arrived
375
+ // yet for a run that only just started.
376
+ __classPrivateFieldSet(this, _uSyncWorkspaceContext_lastSignalRMessageAt, Date.now(), "f");
377
+ let interval = POLL_INTERVAL_MIN_MS;
378
+ const poll = async () => {
379
+ // SignalR is the fast path for progress/completion - polling is only
380
+ // the fallback (initial reattach before the socket is up, if it drops
381
+ // mid-run, or - under a load-balanced backoffice without a SignalR
382
+ // backplane/sticky sessions - if it's connected to a server that
383
+ // isn't the one running the job and so never delivers anything for
384
+ // this run). Every poll is an authenticated request, and on SQLite a
385
+ // background run can hold locks long enough that a steady stream of
386
+ // unrelated queries starts timing out, so we only spend that request
387
+ // when nothing is actually delivering progress for us right now.
388
+ const signalRDelivering = __classPrivateFieldGet(this, _uSyncWorkspaceContext_signalRContext, "f")?.getConnected() &&
389
+ Date.now() - __classPrivateFieldGet(this, _uSyncWorkspaceContext_lastSignalRMessageAt, "f") < SIGNALR_STALE_MS;
390
+ if (!signalRDelivering) {
391
+ const { data } = await __classPrivateFieldGet(this, _uSyncWorkspaceContext_repository, "f").getOperationStatus(operationId);
392
+ if (data) {
393
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_workingActions, "f").setValue(data.status ?? []);
394
+ // usync-progress-box only ever renders a message from the
395
+ // SignalR update push - without this, the box under the
396
+ // handler icons stays blank/stale for a run whose socket
397
+ // isn't delivering. Only publish while there's still a
398
+ // message worth showing; the completion path below drives
399
+ // its own "Completed"/error state via complete.
400
+ if (data.message && !data.complete) {
401
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_signalRContext, "f")?.setPolledUpdate(data.message);
402
+ }
403
+ if (data.complete) {
404
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_instances, "m", _uSyncWorkspaceContext_onRunComplete).call(this, data.actions ?? [], data.operationStatus === 'Success', data.message);
405
+ return;
406
+ }
407
+ }
408
+ // back off while a run drags on, so a long import doesn't sustain
409
+ // a steady stream of extra queries against the same database.
410
+ interval = Math.min(interval * 1.5, POLL_INTERVAL_MAX_MS);
411
+ }
412
+ __classPrivateFieldSet(this, _uSyncWorkspaceContext_pollTimer, setTimeout(poll, interval), "f");
413
+ };
414
+ __classPrivateFieldSet(this, _uSyncWorkspaceContext_pollTimer, setTimeout(poll, interval), "f");
415
+ }, _uSyncWorkspaceContext_stopPolling = function _uSyncWorkspaceContext_stopPolling() {
416
+ if (__classPrivateFieldGet(this, _uSyncWorkspaceContext_pollTimer, "f")) {
417
+ clearTimeout(__classPrivateFieldGet(this, _uSyncWorkspaceContext_pollTimer, "f"));
418
+ __classPrivateFieldSet(this, _uSyncWorkspaceContext_pollTimer, null, "f");
419
+ }
420
+ }, _uSyncWorkspaceContext_onRunComplete = function _uSyncWorkspaceContext_onRunComplete(actions, success = true, message) {
421
+ if (__classPrivateFieldGet(this, _uSyncWorkspaceContext_completed, "f").getValue())
422
+ return;
423
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_instances, "m", _uSyncWorkspaceContext_stopPolling).call(this);
424
+ if (!success) {
425
+ console.warn('[uSync]', message ?? 'The background run did not complete successfully.');
426
+ }
427
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_results, "f").setValue(actions);
428
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_completed, "f").setValue(true);
429
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_working, "f").setValue(false);
430
+ __classPrivateFieldGet(this, _uSyncWorkspaceContext_inBackground, "f").setValue(false);
431
+ this.getActions(this._currentSetName);
432
+ if (success && __classPrivateFieldGet(this, _uSyncWorkspaceContext_pendingDownload, "f")) {
433
+ __classPrivateFieldSet(this, _uSyncWorkspaceContext_pendingDownload, false, "f");
434
+ this.downloadFile();
435
+ }
436
+ }, _uSyncWorkspaceContext_getFileName = function _uSyncWorkspaceContext_getFileName() {
437
+ const now = new Date();
438
+ const year = now.getUTCFullYear().toString();
439
+ const month = (now.getUTCMonth() + 1).toString().padStart(2, '0');
440
+ const day = now.getUTCDate().toString().padStart(2, '0');
441
+ const hours = now.getUTCHours().toString().padStart(2, '0');
442
+ const minutes = now.getUTCMinutes().toString().padStart(2, '0');
443
+ const seconds = now.getUTCSeconds().toString().padStart(2, '0');
444
+ const timestamp = `${year}${month}${day}_${hours}${minutes}${seconds}`;
445
+ return `usync_export_${timestamp}.zip`;
446
+ };
447
+ export default uSyncWorkspaceContext;
448
+ export const USYNC_CORE_CONTEXT_TOKEN = new UmbContextToken('uSyncWorkspaceContext');
@@ -0,0 +1,17 @@
1
+ import { LitElement } from '@umbraco-cms/backoffice/external/lit';
2
+ import './views/default/default.element.js';
3
+ declare const uSyncWorkspaceRootElement_base: import("@umbraco-cms/backoffice/extension-api").HTMLElementConstructor<import("@umbraco-cms/backoffice/element-api").UmbElement> & typeof LitElement;
4
+ export declare class uSyncWorkspaceRootElement extends uSyncWorkspaceRootElement_base {
5
+ #private;
6
+ version: string;
7
+ constructor();
8
+ connectedCallback(): Promise<void>;
9
+ render(): import("lit-html").TemplateResult<1>;
10
+ static styles: import("lit").CSSResult[];
11
+ }
12
+ export default uSyncWorkspaceRootElement;
13
+ declare global {
14
+ interface HTMLElementTagNameMap {
15
+ 'usync-workspace-root': uSyncWorkspaceRootElement;
16
+ }
17
+ }
@@ -0,0 +1,69 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
8
+ if (kind === "m") throw new TypeError("Private method is not writable");
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
11
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
+ };
13
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
14
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
15
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
16
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
17
+ };
18
+ var _uSyncWorkspaceRootElement_workspaceContext;
19
+ import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
20
+ import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api';
21
+ import { LitElement, css, customElement, html, state, } from '@umbraco-cms/backoffice/external/lit';
22
+ import { uSyncWorkspaceContext, uSyncConstants } from '@jumoo/uSync';
23
+ import './views/default/default.element.js';
24
+ let uSyncWorkspaceRootElement = class uSyncWorkspaceRootElement extends UmbElementMixin(LitElement) {
25
+ constructor() {
26
+ super();
27
+ _uSyncWorkspaceRootElement_workspaceContext.set(this, void 0);
28
+ this.version = uSyncConstants.version;
29
+ __classPrivateFieldSet(this, _uSyncWorkspaceRootElement_workspaceContext, new uSyncWorkspaceContext(this), "f");
30
+ this.observe(__classPrivateFieldGet(this, _uSyncWorkspaceRootElement_workspaceContext, "f").completed, (_completed) => { });
31
+ }
32
+ async connectedCallback() {
33
+ super.connectedCallback();
34
+ const addons = await __classPrivateFieldGet(this, _uSyncWorkspaceRootElement_workspaceContext, "f").getAddons();
35
+ this.version = `v${addons?.version ?? uSyncConstants.version}`;
36
+ }
37
+ render() {
38
+ return html `
39
+ <umb-workspace-editor .enforceNoFooter=${true}>
40
+ <div slot="header" class="header">
41
+ <div>
42
+ <strong><umb-localize key="uSync_name"></umb-localize></strong><br /><em
43
+ >${this.version}</em
44
+ >
45
+ </div>
46
+ </div>
47
+ </umb-workspace-editor>
48
+ `;
49
+ }
50
+ };
51
+ _uSyncWorkspaceRootElement_workspaceContext = new WeakMap();
52
+ uSyncWorkspaceRootElement.styles = [
53
+ UmbTextStyles,
54
+ css `
55
+ umb-workspace-editor > div.header {
56
+ display: flex;
57
+ align-items: center;
58
+ align-content: center;
59
+ }
60
+ `,
61
+ ];
62
+ __decorate([
63
+ state()
64
+ ], uSyncWorkspaceRootElement.prototype, "version", void 0);
65
+ uSyncWorkspaceRootElement = __decorate([
66
+ customElement('usync-workspace-root')
67
+ ], uSyncWorkspaceRootElement);
68
+ export { uSyncWorkspaceRootElement };
69
+ export default uSyncWorkspaceRootElement;
package/package.json CHANGED
@@ -1,6 +1,77 @@
1
- {
2
- "name": "@jumoo/usync",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
1
+ {
2
+ "name": "@jumoo/usync",
3
+ "description": "uSync client libraries for extending uSync behavior in Umbraco",
4
+ "keywords": [
5
+ "Umbraco",
6
+ "uSync"
7
+ ],
8
+ "homepage": "https://jumoo.co.uk/uSync",
9
+ "license": "MPL-2.0",
10
+ "type": "module",
11
+ "version": "18.2.0",
12
+ "main": "./dist/usync.js",
13
+ "types": "./dist/index.d.ts",
14
+ "module": "./dist/usync.js",
15
+ "publishConfig": {
16
+ "access": "restricted"
17
+ },
18
+ "exports": {
19
+ ".": "./dist/index.js",
20
+ "./signalr": "./dist/signalr/index.js",
21
+ "./api": "./dist/api/index.js",
22
+ "./components": "./dist/components/index.js",
23
+ "./constants": "./dist/constants.js",
24
+ "./tree": "./dist/tree/index.js",
25
+ "./dialogs": "./dist/dialogs/index.js"
26
+ },
27
+ "files": [
28
+ "./dist/**/*"
29
+ ],
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/KevinJump/uSync.git"
33
+ },
34
+ "bugs": {
35
+ "url": "https://github.com/kevinjump/usync/issues"
36
+ },
37
+ "author": {
38
+ "name": "Jumoo Ltd",
39
+ "email": "info@jumoo.co.uk",
40
+ "url": "https://jumoo.co.uk"
41
+ },
42
+ "site": {
43
+ "port": "16903",
44
+ "api": "uSync"
45
+ },
46
+ "scripts": {
47
+ "client:build": "tsc --project ./tsconfig.dist.json",
48
+ "client:pack": "npm pack --pack-destination ./pack",
49
+ "client:publish": "npm publish --tag next",
50
+ "client:make": "npm run client:build && npm run client:pack && npm run client:publish",
51
+ "client:link": "npm link",
52
+ "generate-client": "node scripts/generate-openapi.js https://localhost:44304/umbraco/openapi/uSync.json",
53
+ "format:fix": "npm run format -- --write",
54
+ "format": "prettier \"src/**/*.ts\" --check",
55
+ "build": "tsc && vite build",
56
+ "watch": "vite build --watch",
57
+ "typescript:build": "tsc",
58
+ "make": "npm run build && npm run client:make"
59
+ },
60
+ "devDependencies": {
61
+ "@hey-api/openapi-ts": "^0.99.0",
62
+ "@microsoft/signalr": "^10.0.11",
63
+ "@umbraco-cms/backoffice": "^18.0.0-rc3",
64
+ "chalk": "^6.0.0",
65
+ "cross-env": "^10.1.0",
66
+ "eslint": "^10.13.0",
67
+ "lit": "^3.3.3",
68
+ "node-fetch": "^3.3.2",
69
+ "prettier": "^3.9.10",
70
+ "typescript": "^5.9.3",
71
+ "vite": "^8.3.4",
72
+ "vite-plugin-dts": "^5.1.2"
73
+ },
74
+ "overrides": {
75
+ "js-yaml": "^4.3.1"
76
+ }
77
+ }