@powerhousedao/connect 1.0.23-staging.1 → 1.0.24-dev.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 (37) hide show
  1. package/dist/.env +1 -1
  2. package/dist/assets/{app-L-nqsJL1.js → app-B5yYl0zv.js} +19842 -18216
  3. package/dist/assets/app-B5yYl0zv.js.map +1 -0
  4. package/dist/assets/{app-Dtx0nq4m.css → app-DWlDE8AF.css} +240 -181
  5. package/dist/assets/{app-loader-B9WMnDgs.js → app-loader-CmEZOj3m.js} +735 -420
  6. package/dist/assets/app-loader-CmEZOj3m.js.map +1 -0
  7. package/dist/assets/{app-loader-3ipafc56.css → app-loader-NDVZu4bS.css} +238 -228
  8. package/dist/assets/browser-D5LEpLBa.js +27224 -0
  9. package/dist/assets/browser-D5LEpLBa.js.map +1 -0
  10. package/dist/assets/{ccip-XbQMrTCQ.js → ccip-KtRjx9vh.js} +6 -8
  11. package/dist/assets/ccip-KtRjx9vh.js.map +1 -0
  12. package/dist/assets/{content-B39UDenT.js → content-2lJzkjLx.js} +1100 -462
  13. package/dist/assets/content-2lJzkjLx.js.map +1 -0
  14. package/dist/assets/{index-CCHuBMLB.js → index-BVVRVlZN.js} +4 -3
  15. package/dist/assets/index-BVVRVlZN.js.map +1 -0
  16. package/dist/assets/{index-DZDjpeBO.js → index-BhHOiwFw.js} +2476 -2660
  17. package/dist/assets/index-BhHOiwFw.js.map +1 -0
  18. package/dist/assets/index-DZiF5od7.js +208 -0
  19. package/dist/assets/index-DZiF5od7.js.map +1 -0
  20. package/dist/assets/{index-C3q-1asu.js → index-dSMCpjcQ.js} +23 -171
  21. package/dist/assets/index-dSMCpjcQ.js.map +1 -0
  22. package/dist/assets/{main.B_-fy86f.js → main.DA6nl4Ov.js} +3 -12
  23. package/dist/assets/main.DA6nl4Ov.js.map +1 -0
  24. package/dist/assets/reactor-analytics-CF_JKt8H.js +42 -0
  25. package/dist/assets/reactor-analytics-CF_JKt8H.js.map +1 -0
  26. package/dist/assets/router-Ch1WZD-6.js +1585 -0
  27. package/dist/assets/router-Ch1WZD-6.js.map +1 -0
  28. package/dist/assets/{style-0ej1afQi.css → style-CdxGKc2g.css} +39 -95
  29. package/dist/external-packages.js +1 -0
  30. package/dist/external-packages.js.map +1 -0
  31. package/dist/hmr.js +1 -0
  32. package/dist/hmr.js.map +1 -0
  33. package/dist/index.html +1 -1
  34. package/dist/service-worker.js +1 -0
  35. package/dist/service-worker.js.map +1 -0
  36. package/dist/vite-envs.sh +1 -1
  37. package/package.json +21 -20
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/app-L-nqsJL1.js","assets/main.B_-fy86f.js","assets/app-Dtx0nq4m.css"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/app-B5yYl0zv.js","assets/main.DA6nl4Ov.js","assets/app-DWlDE8AF.css"])))=>i.map(i=>d[i]);
2
2
  var __defProp = Object.defineProperty;
3
3
  var __typeError = (msg) => {
4
4
  throw TypeError(msg);
@@ -11,7 +11,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
11
11
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
12
12
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
13
13
  var _tags, _levelString, _errorHandler, _ConsoleLogger_instances, levelValue_get, _getDocumentModelModule, _drives, _ReadModeService_instances, parseGraphQLErrors_fn, fetchDrive_fn, _a, _ServiceWorkerManager_instances, handleServiceWorkerMessage_fn, handleServiceWorker_fn;
14
- import { _ as __vitePreload } from "./main.B_-fy86f.js";
14
+ import { _ as __vitePreload } from "./main.DA6nl4Ov.js";
15
15
  import { jsx, jsxs } from "react/jsx-runtime";
16
16
  import { useState, useEffect, Suspense, lazy } from "react";
17
17
  function _mergeNamespaces(n, m) {
@@ -97,14 +97,51 @@ const trimResultingState = (document) => {
97
97
  });
98
98
  return { ...document, operations: { global: global2, local } };
99
99
  };
100
+ class CacheStorageManager {
101
+ constructor(cache) {
102
+ __publicField(this, "index", 0);
103
+ __publicField(this, "cache");
104
+ this.cache = cache;
105
+ }
106
+ createStorage() {
107
+ const index = this.index;
108
+ this.index += 1;
109
+ function buildKey(key) {
110
+ return `${index}-${key}`;
111
+ }
112
+ const storage = {
113
+ get: (key) => {
114
+ return this.cache.get(buildKey(key));
115
+ },
116
+ set: (key, value) => {
117
+ this.cache.set(buildKey(key), value);
118
+ return storage;
119
+ },
120
+ delete: (key) => {
121
+ return this.cache.delete(buildKey(key));
122
+ },
123
+ clear: () => {
124
+ this.cache.clear();
125
+ }
126
+ };
127
+ return storage;
128
+ }
129
+ }
100
130
  class InMemoryCache {
101
- constructor() {
102
- __publicField(this, "idTodocument", /* @__PURE__ */ new Map());
103
- __publicField(this, "idToDrive", /* @__PURE__ */ new Map());
104
- __publicField(this, "slugToDriveId", /* @__PURE__ */ new Map());
131
+ constructor(cache = /* @__PURE__ */ new Map()) {
132
+ __publicField(this, "cache");
133
+ __publicField(this, "cacheStorageManager");
134
+ __publicField(this, "idToDocument");
135
+ __publicField(this, "idToDrive");
136
+ __publicField(this, "slugToDriveId");
137
+ this.cache = cache;
138
+ this.cacheStorageManager = new CacheStorageManager(cache);
139
+ this.idToDocument = this.cacheStorageManager.createStorage();
140
+ this.idToDrive = this.cacheStorageManager.createStorage();
141
+ this.slugToDriveId = this.cacheStorageManager.createStorage();
105
142
  }
106
143
  clear() {
107
- this.idTodocument.clear();
144
+ this.idToDocument.clear();
108
145
  this.idToDrive.clear();
109
146
  this.slugToDriveId.clear();
110
147
  }
@@ -113,13 +150,13 @@ class InMemoryCache {
113
150
  /////////////////////////////////////////////////////////////////////////////
114
151
  async setDocument(documentId, document) {
115
152
  const doc = trimResultingState(document);
116
- this.idTodocument.set(documentId, doc);
153
+ this.idToDocument.set(documentId, doc);
117
154
  }
118
155
  async getDocument(documentId) {
119
- return this.idTodocument.get(documentId);
156
+ return this.idToDocument.get(documentId);
120
157
  }
121
158
  async deleteDocument(documentId) {
122
- return this.idTodocument.delete(documentId);
159
+ return this.idToDocument.delete(documentId);
123
160
  }
124
161
  async setDrive(driveId, drive) {
125
162
  const doc = trimResultingState(drive);
@@ -133,14 +170,14 @@ class InMemoryCache {
133
170
  if (!drive) {
134
171
  return false;
135
172
  }
136
- const slug = drive.state.global.slug;
173
+ const slug = drive.slug.length > 0 ? drive.slug : driveId;
137
174
  if (slug) {
138
175
  this.slugToDriveId.delete(slug);
139
176
  }
140
177
  return this.idToDrive.delete(driveId);
141
178
  }
142
179
  async setDriveBySlug(slug, drive) {
143
- const driveId = drive.state.global.id;
180
+ const driveId = drive.id;
144
181
  this.slugToDriveId.set(slug, driveId);
145
182
  this.setDrive(driveId, drive);
146
183
  }
@@ -388,8 +425,8 @@ function isBE() {
388
425
  return buf[0] === 254;
389
426
  }
390
427
  const FileSystemError = new Error("File system not available.");
391
- function generateUUID$1() {
392
- if (!crypto.randomUUID) {
428
+ function generateUUID() {
429
+ if (typeof crypto === "undefined" || !crypto.randomUUID) {
393
430
  throw new Error("generateUUID is not available in unsecure contexts.");
394
431
  }
395
432
  return crypto.randomUUID();
@@ -6777,7 +6814,7 @@ function loadStateOperation(oldDocument, newDocument) {
6777
6814
  };
6778
6815
  }
6779
6816
  function generateId(method) {
6780
- return generateUUID$1();
6817
+ return generateUUID();
6781
6818
  }
6782
6819
  function getUnixTimestamp(date) {
6783
6820
  return (new Date(date).getTime() / 1e3).toFixed(0);
@@ -6940,6 +6977,7 @@ function processSkipOperation(document, action, customReducer, skipValue, reuseO
6940
6977
  scopeState = resultingStateParser(lastRemainingOperation.resultingState);
6941
6978
  } else {
6942
6979
  const { state } = replayOperations(document.initialState, documentOperations, customReducer, void 0, void 0, void 0, void 0, {
6980
+ reuseHash: true,
6943
6981
  reuseOperationResultingState,
6944
6982
  operationResultingStateParser: resultingStateParser
6945
6983
  });
@@ -6966,6 +7004,7 @@ function processUndoOperation(document, scope, customReducer, reuseOperationResu
6966
7004
  const clearedOperations = [...documentOperations[scope]];
6967
7005
  const diff = diffOperations(garbageCollect(sortedOperations), clearedOperations);
6968
7006
  const doc = replayOperations(document.initialState, documentOperations, customReducer, void 0, void 0, void 0, void 0, {
7007
+ reuseHash: true,
6969
7008
  reuseOperationResultingState,
6970
7009
  operationResultingStateParser: resultingStateParser
6971
7010
  });
@@ -7115,6 +7154,7 @@ function createReducer(stateReducer2, documentReducer = baseReducer) {
7115
7154
  return reducer2;
7116
7155
  }
7117
7156
  function baseCreateExtendedState(initialState, createState2) {
7157
+ const id = (initialState == null ? void 0 : initialState.id) ?? generateUUID();
7118
7158
  return {
7119
7159
  name: "",
7120
7160
  documentType: "",
@@ -7126,6 +7166,8 @@ function baseCreateExtendedState(initialState, createState2) {
7126
7166
  lastModified: (/* @__PURE__ */ new Date()).toISOString(),
7127
7167
  attachments: {},
7128
7168
  ...initialState,
7169
+ id,
7170
+ slug: (initialState == null ? void 0 : initialState.slug) ?? id,
7129
7171
  state: (createState2 == null ? void 0 : createState2(initialState == null ? void 0 : initialState.state)) ?? ((initialState == null ? void 0 : initialState.state) ?? {
7130
7172
  global: {},
7131
7173
  local: {}
@@ -7144,10 +7186,6 @@ function baseCreateDocument(initialState, createState2) {
7144
7186
  function hashDocumentStateForScope(document, scope = "global") {
7145
7187
  return hash(cjsModule(document.state[scope] || ""));
7146
7188
  }
7147
- const hashKey = (date, randomLimit = 1e3) => {
7148
- const random = Math.random() * randomLimit;
7149
- return hash(`${(/* @__PURE__ */ new Date()).toISOString()}${random}`);
7150
- };
7151
7189
  function getDocumentLastModified(document) {
7152
7190
  var _a2;
7153
7191
  const sortedOperations = sortOperations(Object.values(document.operations).flat());
@@ -7196,6 +7234,9 @@ function replayDocument(initialState, operations, reducer2, dispatch, header, sk
7196
7234
  operationsToReplay.push(...Object.values(operations).flat());
7197
7235
  }
7198
7236
  const document = baseCreateDocument(documentState);
7237
+ if (header == null ? void 0 : header.slug) {
7238
+ document.slug = header.slug;
7239
+ }
7199
7240
  document.initialState = initialState;
7200
7241
  document.operations = initialOperations;
7201
7242
  let result = document;
@@ -7534,21 +7575,186 @@ function UpdateStateExampleInputSchema() {
7534
7575
  newExample: z.string()
7535
7576
  });
7536
7577
  }
7578
+ var dist = {};
7579
+ var hasRequiredDist;
7580
+ function requireDist() {
7581
+ if (hasRequiredDist) return dist;
7582
+ hasRequiredDist = 1;
7583
+ (function(exports) {
7584
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
7585
+ function getDefaultExportFromCjs2(x) {
7586
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
7587
+ }
7588
+ var browser = { exports: {} };
7589
+ var process2 = browser.exports = {};
7590
+ var cachedSetTimeout;
7591
+ var cachedClearTimeout;
7592
+ function defaultSetTimout() {
7593
+ throw new Error("setTimeout has not been defined");
7594
+ }
7595
+ function defaultClearTimeout() {
7596
+ throw new Error("clearTimeout has not been defined");
7597
+ }
7598
+ (function() {
7599
+ try {
7600
+ if (typeof setTimeout === "function") {
7601
+ cachedSetTimeout = setTimeout;
7602
+ } else {
7603
+ cachedSetTimeout = defaultSetTimout;
7604
+ }
7605
+ } catch (e) {
7606
+ cachedSetTimeout = defaultSetTimout;
7607
+ }
7608
+ try {
7609
+ if (typeof clearTimeout === "function") {
7610
+ cachedClearTimeout = clearTimeout;
7611
+ } else {
7612
+ cachedClearTimeout = defaultClearTimeout;
7613
+ }
7614
+ } catch (e) {
7615
+ cachedClearTimeout = defaultClearTimeout;
7616
+ }
7617
+ })();
7618
+ function runTimeout(fun) {
7619
+ if (cachedSetTimeout === setTimeout) {
7620
+ return setTimeout(fun, 0);
7621
+ }
7622
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
7623
+ cachedSetTimeout = setTimeout;
7624
+ return setTimeout(fun, 0);
7625
+ }
7626
+ try {
7627
+ return cachedSetTimeout(fun, 0);
7628
+ } catch (e) {
7629
+ try {
7630
+ return cachedSetTimeout.call(null, fun, 0);
7631
+ } catch (e2) {
7632
+ return cachedSetTimeout.call(this, fun, 0);
7633
+ }
7634
+ }
7635
+ }
7636
+ function runClearTimeout(marker) {
7637
+ if (cachedClearTimeout === clearTimeout) {
7638
+ return clearTimeout(marker);
7639
+ }
7640
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
7641
+ cachedClearTimeout = clearTimeout;
7642
+ return clearTimeout(marker);
7643
+ }
7644
+ try {
7645
+ return cachedClearTimeout(marker);
7646
+ } catch (e) {
7647
+ try {
7648
+ return cachedClearTimeout.call(null, marker);
7649
+ } catch (e2) {
7650
+ return cachedClearTimeout.call(this, marker);
7651
+ }
7652
+ }
7653
+ }
7654
+ var queue = [];
7655
+ var draining = false;
7656
+ var currentQueue;
7657
+ var queueIndex = -1;
7658
+ function cleanUpNextTick() {
7659
+ if (!draining || !currentQueue) {
7660
+ return;
7661
+ }
7662
+ draining = false;
7663
+ if (currentQueue.length) {
7664
+ queue = currentQueue.concat(queue);
7665
+ } else {
7666
+ queueIndex = -1;
7667
+ }
7668
+ if (queue.length) {
7669
+ drainQueue();
7670
+ }
7671
+ }
7672
+ function drainQueue() {
7673
+ if (draining) {
7674
+ return;
7675
+ }
7676
+ var timeout = runTimeout(cleanUpNextTick);
7677
+ draining = true;
7678
+ var len = queue.length;
7679
+ while (len) {
7680
+ currentQueue = queue;
7681
+ queue = [];
7682
+ while (++queueIndex < len) {
7683
+ if (currentQueue) {
7684
+ currentQueue[queueIndex].run();
7685
+ }
7686
+ }
7687
+ queueIndex = -1;
7688
+ len = queue.length;
7689
+ }
7690
+ currentQueue = null;
7691
+ draining = false;
7692
+ runClearTimeout(timeout);
7693
+ }
7694
+ process2.nextTick = function(fun) {
7695
+ var args = new Array(arguments.length - 1);
7696
+ if (arguments.length > 1) {
7697
+ for (var i = 1; i < arguments.length; i++) {
7698
+ args[i - 1] = arguments[i];
7699
+ }
7700
+ }
7701
+ queue.push(new Item(fun, args));
7702
+ if (queue.length === 1 && !draining) {
7703
+ runTimeout(drainQueue);
7704
+ }
7705
+ };
7706
+ function Item(fun, array) {
7707
+ this.fun = fun;
7708
+ this.array = array;
7709
+ }
7710
+ Item.prototype.run = function() {
7711
+ this.fun.apply(null, this.array);
7712
+ };
7713
+ process2.title = "browser";
7714
+ process2.browser = true;
7715
+ process2.env = {};
7716
+ process2.argv = [];
7717
+ process2.version = "";
7718
+ process2.versions = {};
7719
+ function noop2() {
7720
+ }
7721
+ process2.on = noop2;
7722
+ process2.addListener = noop2;
7723
+ process2.once = noop2;
7724
+ process2.off = noop2;
7725
+ process2.removeListener = noop2;
7726
+ process2.removeAllListeners = noop2;
7727
+ process2.emit = noop2;
7728
+ process2.prependListener = noop2;
7729
+ process2.prependOnceListener = noop2;
7730
+ process2.listeners = function(name2) {
7731
+ return [];
7732
+ };
7733
+ process2.binding = function(name2) {
7734
+ throw new Error("process.binding is not supported");
7735
+ };
7736
+ process2.cwd = function() {
7737
+ return "/";
7738
+ };
7739
+ process2.chdir = function(dir) {
7740
+ throw new Error("process.chdir is not supported");
7741
+ };
7742
+ process2.umask = function() {
7743
+ return 0;
7744
+ };
7745
+ var browserExports = browser.exports;
7746
+ const process$1 = /* @__PURE__ */ getDefaultExportFromCjs2(browserExports);
7747
+ exports.default = process$1;
7748
+ exports.process = process$1;
7749
+ })(dist);
7750
+ return dist;
7751
+ }
7752
+ var distExports = requireDist();
7753
+ const process = /* @__PURE__ */ getDefaultExportFromCjs(distExports);
7537
7754
  function commonjsRequire(path) {
7538
7755
  throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
7539
7756
  }
7540
7757
  var jszip_min = { exports: {} };
7541
- /*!
7542
-
7543
- JSZip v3.10.1 - A JavaScript class for generating and reading zip files
7544
- <http://stuartk.com/jszip>
7545
-
7546
- (c) 2009-2016 Stuart Knightley <stuart [at] stuartk.com>
7547
- Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown.
7548
-
7549
- JSZip uses the library pako released under the MIT license :
7550
- https://github.com/nodeca/pako/blob/main/LICENSE
7551
- */
7552
7758
  var hasRequiredJszip_min;
7553
7759
  function requireJszip_min() {
7554
7760
  if (hasRequiredJszip_min) return jszip_min.exports;
@@ -9891,7 +10097,6 @@ const types = {
9891
10097
  "application/dash+xml": ["mpd"],
9892
10098
  "application/dash-patch+xml": ["mpp"],
9893
10099
  "application/davmount+xml": ["davmount"],
9894
- "application/dicom": ["dcm"],
9895
10100
  "application/docbook+xml": ["dbk"],
9896
10101
  "application/dssc+der": ["dssc"],
9897
10102
  "application/dssc+xml": ["xdssc"],
@@ -9978,14 +10183,7 @@ const types = {
9978
10183
  "application/oebps-package+xml": ["opf"],
9979
10184
  "application/ogg": ["ogx"],
9980
10185
  "application/omdoc+xml": ["omdoc"],
9981
- "application/onenote": [
9982
- "onetoc",
9983
- "onetoc2",
9984
- "onetmp",
9985
- "onepkg",
9986
- "one",
9987
- "onea"
9988
- ],
10186
+ "application/onenote": ["onetoc", "onetoc2", "onetmp", "onepkg"],
9989
10187
  "application/oxps": ["oxps"],
9990
10188
  "application/p2p-overlay+xml": ["relo"],
9991
10189
  "application/patch-ops-error+xml": ["xer"],
@@ -10081,7 +10279,6 @@ const types = {
10081
10279
  "application/yang": ["yang"],
10082
10280
  "application/yin+xml": ["yin"],
10083
10281
  "application/zip": ["zip"],
10084
- "application/zip+dotlottie": ["lottie"],
10085
10282
  "audio/3gpp": ["*3gpp"],
10086
10283
  "audio/aac": ["adts", "aac"],
10087
10284
  "audio/adpcm": ["adp"],
@@ -10090,7 +10287,7 @@ const types = {
10090
10287
  "audio/midi": ["mid", "midi", "kar", "rmi"],
10091
10288
  "audio/mobile-xmf": ["mxmf"],
10092
10289
  "audio/mp3": ["*mp3"],
10093
- "audio/mp4": ["m4a", "mp4a", "m4b"],
10290
+ "audio/mp4": ["m4a", "mp4a"],
10094
10291
  "audio/mpeg": ["mpga", "mp2", "mp2a", "mp3", "m2a", "m3a"],
10095
10292
  "audio/ogg": ["oga", "ogg", "spx", "opus"],
10096
10293
  "audio/s3m": ["s3m"],
@@ -10122,12 +10319,11 @@ const types = {
10122
10319
  "image/heif": ["heif"],
10123
10320
  "image/heif-sequence": ["heifs"],
10124
10321
  "image/hej2k": ["hej2"],
10322
+ "image/hsj2": ["hsj2"],
10125
10323
  "image/ief": ["ief"],
10126
- "image/jaii": ["jaii"],
10127
- "image/jais": ["jais"],
10128
10324
  "image/jls": ["jls"],
10129
10325
  "image/jp2": ["jp2", "jpg2"],
10130
- "image/jpeg": ["jpg", "jpeg", "jpe"],
10326
+ "image/jpeg": ["jpeg", "jpg", "jpe"],
10131
10327
  "image/jph": ["jph"],
10132
10328
  "image/jphc": ["jhc"],
10133
10329
  "image/jpm": ["jpm", "jpgm"],
@@ -10142,7 +10338,6 @@ const types = {
10142
10338
  "image/jxss": ["jxss"],
10143
10339
  "image/ktx": ["ktx"],
10144
10340
  "image/ktx2": ["ktx2"],
10145
- "image/pjpeg": ["jfif"],
10146
10341
  "image/png": ["png"],
10147
10342
  "image/sgi": ["sgi"],
10148
10343
  "image/svg+xml": ["svg", "svgz"],
@@ -10156,7 +10351,7 @@ const types = {
10156
10351
  "message/global-delivery-status": ["u8dsn"],
10157
10352
  "message/global-disposition-notification": ["u8mdn"],
10158
10353
  "message/global-headers": ["u8hdr"],
10159
- "message/rfc822": ["eml", "mime", "mht", "mhtml"],
10354
+ "message/rfc822": ["eml", "mime"],
10160
10355
  "model/3mf": ["3mf"],
10161
10356
  "model/gltf+json": ["gltf"],
10162
10357
  "model/gltf-binary": ["glb"],
@@ -10166,7 +10361,6 @@ const types = {
10166
10361
  "model/mtl": ["mtl"],
10167
10362
  "model/obj": ["obj"],
10168
10363
  "model/prc": ["prc"],
10169
- "model/step": ["step", "stp", "stpnc", "p21", "210"],
10170
10364
  "model/step+xml": ["stpx"],
10171
10365
  "model/step+zip": ["stpz"],
10172
10366
  "model/step-xml+zip": ["stpxz"],
@@ -10272,8 +10466,8 @@ class Mime {
10272
10466
  getType(path) {
10273
10467
  if (typeof path !== "string")
10274
10468
  return null;
10275
- const last = path.replace(/^.*[/\\]/s, "").toLowerCase();
10276
- const ext = last.replace(/^.*\./s, "").toLowerCase();
10469
+ const last = path.replace(/^.*[/\\]/, "").toLowerCase();
10470
+ const ext = last.replace(/^.*\./, "").toLowerCase();
10277
10471
  const hasPath = last.length < path.length;
10278
10472
  const hasDot = ext.length < last.length - 1;
10279
10473
  if (!hasDot && hasPath)
@@ -10335,8 +10529,10 @@ function validateOperations(operations) {
10335
10529
  }
10336
10530
  function createZip(document) {
10337
10531
  const zip = new JSZip();
10338
- const { name: name2, revision, documentType: documentType2, created, lastModified } = document;
10532
+ const { id, slug, name: name2, revision, documentType: documentType2, created, lastModified } = document;
10339
10533
  const header = {
10534
+ id,
10535
+ slug,
10340
10536
  name: name2,
10341
10537
  revision,
10342
10538
  documentType: documentType2,
@@ -10752,40 +10948,60 @@ const reducer$2 = {
10752
10948
  state.triggers = state.triggers.filter((trigger) => trigger.id !== action.input.triggerId);
10753
10949
  }
10754
10950
  };
10755
- const byteToHex = [];
10756
- for (let i = 0; i < 256; ++i) {
10757
- byteToHex.push((i + 256).toString(16).slice(1));
10951
+ class DocumentModelNotFoundError extends Error {
10952
+ constructor(id, cause) {
10953
+ super(`Document model "${id}" not found`, { cause });
10954
+ __publicField(this, "id");
10955
+ this.id = id;
10956
+ }
10957
+ }
10958
+ class OperationError extends Error {
10959
+ constructor(status, operation, message, cause) {
10960
+ super(message, { cause: cause ?? operation });
10961
+ __publicField(this, "status");
10962
+ __publicField(this, "operation");
10963
+ this.status = status;
10964
+ this.operation = operation;
10965
+ }
10758
10966
  }
10759
- function unsafeStringify(arr, offset = 0) {
10760
- return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
10967
+ class ConflictOperationError extends OperationError {
10968
+ constructor(existingOperation, newOperation) {
10969
+ super("CONFLICT", newOperation, `Conflicting operation on index ${newOperation.index}`, { existingOperation, newOperation });
10970
+ }
10761
10971
  }
10762
- let getRandomValues;
10763
- const rnds8 = new Uint8Array(16);
10764
- function rng() {
10765
- if (!getRandomValues) {
10766
- if (typeof crypto === "undefined" || !crypto.getRandomValues) {
10767
- throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
10768
- }
10769
- getRandomValues = crypto.getRandomValues.bind(crypto);
10972
+ class DocumentIdValidationError extends Error {
10973
+ constructor(documentId) {
10974
+ super(`Invalid document id: ${documentId}`);
10770
10975
  }
10771
- return getRandomValues(rnds8);
10772
10976
  }
10773
- const randomUUID = typeof crypto !== "undefined" && crypto.randomUUID && crypto.randomUUID.bind(crypto);
10774
- const native = { randomUUID };
10775
- function v4(options, buf, offset) {
10776
- var _a2;
10777
- if (native.randomUUID && true && !options) {
10778
- return native.randomUUID();
10977
+ class DocumentSlugValidationError extends Error {
10978
+ constructor(slug) {
10979
+ super(`Invalid slug: ${slug}`);
10980
+ }
10981
+ }
10982
+ class DocumentAlreadyExistsError extends Error {
10983
+ constructor(documentId) {
10984
+ super(`Document with id ${documentId} uses id or slug that already exists`);
10985
+ __publicField(this, "documentId");
10986
+ this.documentId = documentId;
10987
+ }
10988
+ }
10989
+ class DocumentNotFoundError extends Error {
10990
+ constructor(documentId) {
10991
+ super(`Document with id ${documentId} not found`);
10992
+ __publicField(this, "documentId");
10993
+ this.documentId = documentId;
10779
10994
  }
10780
- options = options || {};
10781
- const rnds = options.random ?? ((_a2 = options.rng) == null ? void 0 : _a2.call(options)) ?? rng();
10782
- if (rnds.length < 16) {
10783
- throw new Error("Random bytes length must be >= 16");
10995
+ }
10996
+ class SynchronizationUnitNotFoundError extends Error {
10997
+ constructor(message, syncUnitId) {
10998
+ super(message);
10999
+ __publicField(this, "syncUnitId");
11000
+ this.syncUnitId = syncUnitId;
10784
11001
  }
10785
- rnds[6] = rnds[6] & 15 | 64;
10786
- rnds[8] = rnds[8] & 63 | 128;
10787
- return unsafeStringify(rnds);
10788
11002
  }
11003
+ const isValidDocumentId = (id) => id && id.length > 0 && /^[a-zA-Z0-9_-]+$/.test(id);
11004
+ const isValidSlug = (slug) => slug && slug.length > 0 && /^[a-zA-Z0-9_-]+$/.test(slug);
10789
11005
  function isFileNode(node) {
10790
11006
  return node.kind === "file";
10791
11007
  }
@@ -10849,7 +11065,7 @@ function generateNodesCopy(src, idGenerator, nodes) {
10849
11065
  function generateSynchronizationUnitId(nodes) {
10850
11066
  let syncId = "";
10851
11067
  while (!syncId || nodes.find((node) => isFileNode(node) && node.synchronizationUnits.find((unit) => unit.syncId === syncId))) {
10852
- syncId = v4();
11068
+ syncId = generateId();
10853
11069
  }
10854
11070
  return syncId;
10855
11071
  }
@@ -10927,6 +11143,9 @@ const reducer$1 = {
10927
11143
  if (state.nodes.find((node) => node.id === action.input.id)) {
10928
11144
  throw new Error(`Node with id ${action.input.id} already exists!`);
10929
11145
  }
11146
+ if (!isValidDocumentId(action.input.id)) {
11147
+ throw new DocumentIdValidationError(action.input.id);
11148
+ }
10930
11149
  const name2 = handleTargetNameCollisions({
10931
11150
  nodes: state.nodes,
10932
11151
  srcName: action.input.name,
@@ -11019,6 +11238,9 @@ const reducer$1 = {
11019
11238
  if (!node) {
11020
11239
  throw new Error(`Node with id ${action.input.srcId} not found`);
11021
11240
  }
11241
+ if (!isValidDocumentId(action.input.targetId)) {
11242
+ throw new DocumentIdValidationError(action.input.targetId);
11243
+ }
11022
11244
  const duplicatedNode = state.nodes.find((node2) => node2.id === action.input.targetId);
11023
11245
  if (duplicatedNode) {
11024
11246
  throw new Error(`Node with id ${action.input.targetId} already exists`);
@@ -11030,8 +11252,9 @@ const reducer$1 = {
11030
11252
  });
11031
11253
  const newNode = {
11032
11254
  ...node,
11033
- name: name2,
11034
11255
  id: action.input.targetId,
11256
+ slug: action.input.targetId,
11257
+ name: name2,
11035
11258
  parentFolder: action.input.targetParentFolder || null
11036
11259
  };
11037
11260
  const isFile = isFileNode(newNode);
@@ -11163,11 +11386,9 @@ const fileExtension = "phdd";
11163
11386
  const documentType = "powerhouse/document-drive";
11164
11387
  const documentModelName = "DocumentDrive";
11165
11388
  const initialGlobalState = {
11166
- id: "",
11167
11389
  name: "",
11168
11390
  nodes: [],
11169
- icon: null,
11170
- slug: null
11391
+ icon: null
11171
11392
  };
11172
11393
  const initialLocalState = {
11173
11394
  listeners: [],
@@ -11428,8 +11649,7 @@ const driveDocumentModelModule = {
11428
11649
  actions: { ...creators, ...actions },
11429
11650
  utils: { ...documentModelUtils, ...customUtils }
11430
11651
  };
11431
- var define_process_env_default = {};
11432
- const LEVELS = {
11652
+ const LogLevels = {
11433
11653
  verbose: 1,
11434
11654
  debug: 2,
11435
11655
  info: 3,
@@ -11437,6 +11657,10 @@ const LEVELS = {
11437
11657
  error: 5,
11438
11658
  silent: 6
11439
11659
  };
11660
+ function isLogLevel(value) {
11661
+ return typeof value === "string" && value in LogLevels;
11662
+ }
11663
+ var define_process_env_default = {};
11440
11664
  class ConsoleLogger {
11441
11665
  constructor(tags, errorHandler2) {
11442
11666
  __privateAdd(this, _ConsoleLogger_instances);
@@ -11456,6 +11680,10 @@ class ConsoleLogger {
11456
11680
  return __privateGet(this, _levelString);
11457
11681
  }
11458
11682
  set level(level) {
11683
+ if (level !== "env" && !isLogLevel(level)) {
11684
+ throw new Error(`Invalid log level: ${JSON.stringify(level)}.
11685
+ Must be one of ${Object.keys(LogLevels).concat(["env"]).join(", ")}.`);
11686
+ }
11459
11687
  __privateSet(this, _levelString, level);
11460
11688
  }
11461
11689
  get errorHandler() {
@@ -11468,31 +11696,31 @@ class ConsoleLogger {
11468
11696
  return this.debug(...data);
11469
11697
  }
11470
11698
  verbose(...data) {
11471
- if (__privateGet(this, _ConsoleLogger_instances, levelValue_get) > LEVELS.verbose) {
11699
+ if (__privateGet(this, _ConsoleLogger_instances, levelValue_get) > LogLevels.verbose) {
11472
11700
  return;
11473
11701
  }
11474
11702
  return this.debug(...data);
11475
11703
  }
11476
11704
  debug(...data) {
11477
- if (__privateGet(this, _ConsoleLogger_instances, levelValue_get) > LEVELS.debug) {
11705
+ if (__privateGet(this, _ConsoleLogger_instances, levelValue_get) > LogLevels.debug) {
11478
11706
  return;
11479
11707
  }
11480
11708
  return console.debug(...[...__privateGet(this, _tags), ...data]);
11481
11709
  }
11482
11710
  info(...data) {
11483
- if (__privateGet(this, _ConsoleLogger_instances, levelValue_get) > LEVELS.info) {
11711
+ if (__privateGet(this, _ConsoleLogger_instances, levelValue_get) > LogLevels.info) {
11484
11712
  return;
11485
11713
  }
11486
11714
  return console.info(...[...__privateGet(this, _tags), ...data]);
11487
11715
  }
11488
11716
  warn(...data) {
11489
- if (__privateGet(this, _ConsoleLogger_instances, levelValue_get) > LEVELS.warn) {
11717
+ if (__privateGet(this, _ConsoleLogger_instances, levelValue_get) > LogLevels.warn) {
11490
11718
  return;
11491
11719
  }
11492
11720
  return console.warn(...[...__privateGet(this, _tags), ...data]);
11493
11721
  }
11494
11722
  error(...data) {
11495
- if (__privateGet(this, _ConsoleLogger_instances, levelValue_get) > LEVELS.error) {
11723
+ if (__privateGet(this, _ConsoleLogger_instances, levelValue_get) > LogLevels.error) {
11496
11724
  return;
11497
11725
  }
11498
11726
  if (__privateGet(this, _errorHandler)) {
@@ -11507,16 +11735,16 @@ _errorHandler = new WeakMap();
11507
11735
  _ConsoleLogger_instances = new WeakSet();
11508
11736
  levelValue_get = function() {
11509
11737
  if (__privateGet(this, _levelString) === "env") {
11510
- const envLevel = typeof process !== "undefined" ? define_process_env_default.LOG_LEVEL : void 0;
11738
+ const envLevel = typeof process !== "undefined" && "env" in process ? define_process_env_default.LOG_LEVEL : void 0;
11511
11739
  if (!envLevel) {
11512
- return LEVELS.debug;
11740
+ return LogLevels.debug;
11513
11741
  }
11514
- if (!(envLevel in LEVELS)) {
11515
- return LEVELS.debug;
11742
+ if (!(envLevel in LogLevels)) {
11743
+ return LogLevels.debug;
11516
11744
  }
11517
- return LEVELS[envLevel];
11745
+ return LogLevels[envLevel];
11518
11746
  }
11519
- return LEVELS[__privateGet(this, _levelString)];
11747
+ return LogLevels[__privateGet(this, _levelString)];
11520
11748
  };
11521
11749
  const loggerInstance = new ConsoleLogger();
11522
11750
  let logLevel = "env";
@@ -11538,48 +11766,6 @@ const childLogger = (tags) => {
11538
11766
  logger2.errorHandler = errorHandler;
11539
11767
  return logger2;
11540
11768
  };
11541
- class DocumentModelNotFoundError extends Error {
11542
- constructor(id, cause) {
11543
- super(`Document model "${id}" not found`, { cause });
11544
- __publicField(this, "id");
11545
- this.id = id;
11546
- }
11547
- }
11548
- class OperationError extends Error {
11549
- constructor(status, operation, message, cause) {
11550
- super(message, { cause: cause ?? operation });
11551
- __publicField(this, "status");
11552
- __publicField(this, "operation");
11553
- this.status = status;
11554
- this.operation = operation;
11555
- }
11556
- }
11557
- class ConflictOperationError extends OperationError {
11558
- constructor(existingOperation, newOperation) {
11559
- super("CONFLICT", newOperation, `Conflicting operation on index ${newOperation.index}`, { existingOperation, newOperation });
11560
- }
11561
- }
11562
- class DocumentAlreadyExistsError extends Error {
11563
- constructor(documentId) {
11564
- super(`Document with id ${documentId} already exists`);
11565
- __publicField(this, "documentId");
11566
- this.documentId = documentId;
11567
- }
11568
- }
11569
- class DocumentNotFoundError extends Error {
11570
- constructor(documentId) {
11571
- super(`Document with id ${documentId} not found`);
11572
- __publicField(this, "documentId");
11573
- this.documentId = documentId;
11574
- }
11575
- }
11576
- class SynchronizationUnitNotFoundError extends Error {
11577
- constructor(message, syncUnitId) {
11578
- super(message);
11579
- __publicField(this, "syncUnitId");
11580
- this.syncUnitId = syncUnitId;
11581
- }
11582
- }
11583
11769
  var RunAsap;
11584
11770
  (function(RunAsap2) {
11585
11771
  RunAsap2.useMessageChannel = (() => {
@@ -11719,9 +11905,6 @@ function mergeOperations(currentOperations, newOperations) {
11719
11905
  return { ...acc, [curr.scope]: [...existingOperations, curr] };
11720
11906
  }, currentOperations);
11721
11907
  }
11722
- function generateUUID() {
11723
- return generateId();
11724
- }
11725
11908
  function isBefore(dateA, dateB) {
11726
11909
  return new Date(dateA) < new Date(dateB);
11727
11910
  }
@@ -11822,7 +12005,7 @@ class BaseQueueManager {
11822
12005
  if (!this.delegate) {
11823
12006
  throw new Error("No server delegate defined");
11824
12007
  }
11825
- const jobId = generateUUID();
12008
+ const jobId = generateId();
11826
12009
  const queue = this.getQueue(job.driveId, job.documentId);
11827
12010
  if (await queue.isDeleted()) {
11828
12011
  throw new Error("Queue is deleted");
@@ -22161,14 +22344,18 @@ async function fetchDocument(url, documentId, documentModelModule) {
22161
22344
  local: []
22162
22345
  },
22163
22346
  attachments: {},
22164
- initialState: utils.createExtendedState({
22165
- // TODO: getDocument should return all the initial state fields
22166
- created: result.document.created,
22167
- lastModified: result.document.created,
22168
- state: utils.createState({
22169
- global: result.document.initialState.state.global
22170
- })
22171
- }),
22347
+ initialState: {
22348
+ ...utils.createExtendedState({
22349
+ // TODO: getDocument should return all the initial state fields
22350
+ created: result.document.created,
22351
+ lastModified: result.document.created,
22352
+ state: utils.createState({
22353
+ global: result.document.initialState.state.global
22354
+ })
22355
+ }),
22356
+ id: result.document.id,
22357
+ slug: result.document.slug
22358
+ },
22172
22359
  clipboard: []
22173
22360
  } : null;
22174
22361
  return {
@@ -22223,7 +22410,13 @@ class ReadModeService {
22223
22410
  return document;
22224
22411
  }
22225
22412
  async addReadDrive(url, options) {
22226
- const { id } = (options == null ? void 0 : options.expectedDriveInfo) ?? await requestPublicDrive(url);
22413
+ let id;
22414
+ if (options == null ? void 0 : options.expectedDriveInfo) {
22415
+ id = options.expectedDriveInfo.id;
22416
+ } else {
22417
+ const drive = await requestPublicDrive(url);
22418
+ id = drive.id;
22419
+ }
22227
22420
  const result = await __privateMethod(this, _ReadModeService_instances, fetchDrive_fn).call(this, id, url);
22228
22421
  if (result instanceof Error) {
22229
22422
  throw result;
@@ -22246,7 +22439,7 @@ class ReadModeService {
22246
22439
  return Promise.resolve(result ? { ...result.drive, readContext: result.context } : new ReadDriveNotFoundError(id));
22247
22440
  }
22248
22441
  async getReadDriveBySlug(slug) {
22249
- const readDrive = [...__privateGet(this, _drives).values()].find(({ drive }) => drive.state.global.slug === slug);
22442
+ const readDrive = [...__privateGet(this, _drives).values()].find(({ drive }) => drive.slug === slug);
22250
22443
  return Promise.resolve(readDrive ? { ...readDrive.drive, readContext: readDrive.context } : new ReadDriveSlugNotFoundError(slug));
22251
22444
  }
22252
22445
  getReadDriveContext(id) {
@@ -22385,8 +22578,8 @@ class DefaultDrivesManager {
22385
22578
  }
22386
22579
  async preserveDrivesById(driveIdsToPreserve, drives, removeStrategy = "detach") {
22387
22580
  const getAllDrives = drives.map((driveId) => this.server.getDrive(driveId));
22388
- const drivesToRemove = (await Promise.all(getAllDrives)).filter((drive) => drive.state.local.listeners.length > 0 || drive.state.local.triggers.length > 0).filter((drive) => !driveIdsToPreserve.includes(drive.state.global.id));
22389
- const driveIds = drivesToRemove.map((drive) => drive.state.global.id);
22581
+ const drivesToRemove = (await Promise.all(getAllDrives)).filter((drive) => drive.state.local.listeners.length > 0 || drive.state.local.triggers.length > 0).filter((drive) => !driveIdsToPreserve.includes(drive.id));
22582
+ const driveIds = drivesToRemove.map((drive) => drive.id);
22390
22583
  if (removeStrategy === "detach") {
22391
22584
  await this.detachDrivesById(driveIds);
22392
22585
  } else {
@@ -22434,7 +22627,7 @@ class DefaultDrivesManager {
22434
22627
  case "remove-all": {
22435
22628
  const getDrives = driveids.map((driveId) => this.server.getDrive(driveId));
22436
22629
  const drives = await Promise.all(getDrives);
22437
- const drivesToRemove = drives.filter((drive) => drive.state.local.listeners.length > 0 || drive.state.local.triggers.length > 0).map((drive) => drive.state.global.id);
22630
+ const drivesToRemove = drives.filter((drive) => drive.state.local.listeners.length > 0 || drive.state.local.triggers.length > 0).map((drive) => drive.id);
22438
22631
  await this.removeDrivesById(drivesToRemove);
22439
22632
  break;
22440
22633
  }
@@ -22711,7 +22904,7 @@ class PullResponderTransmitter {
22711
22904
  static async executePull(driveId, trigger, onStrandUpdate, onError, onRevisions, onAcknowledge) {
22712
22905
  var _a2, _b;
22713
22906
  staticLogger().verbose(`executePull(driveId: ${driveId}), trigger:`, trigger);
22714
- staticLogger().info(`[SYNC DEBUG] PullResponderTransmitter.executePull starting for drive: ${driveId}, listenerId: ${trigger.data.listenerId}`);
22907
+ staticLogger().debug(`[SYNC DEBUG] PullResponderTransmitter.executePull starting for drive: ${driveId}, listenerId: ${trigger.data.listenerId}`);
22715
22908
  const { url } = trigger.data;
22716
22909
  let strands;
22717
22910
  let error;
@@ -22875,7 +23068,7 @@ class PullResponderTransmitter {
22875
23068
  };
22876
23069
  const listenerId = await PullResponderTransmitter.registerPullResponder(driveId, url, filter);
22877
23070
  const pullTrigger = {
22878
- id: generateUUID(),
23071
+ id: generateId(),
22879
23072
  type: "PullResponder",
22880
23073
  driveId,
22881
23074
  filter,
@@ -23308,7 +23501,7 @@ class BaseDocumentDriveServer {
23308
23501
  async _initializeDrive(driveId) {
23309
23502
  var _a2, _b, _c;
23310
23503
  const drive = await this.getDrive(driveId);
23311
- this.logger.verbose(`[SYNC DEBUG] Initializing drive ${driveId} with slug "${drive.state.global.slug}"`);
23504
+ this.logger.verbose(`[SYNC DEBUG] Initializing drive ${driveId} with slug "${drive.slug}"`);
23312
23505
  await this.synchronizationManager.initializeDriveSyncStatus(driveId, drive);
23313
23506
  if (this.shouldSyncRemoteDrive(drive)) {
23314
23507
  this.logger.verbose(`[SYNC DEBUG] Starting sync for remote drive ${driveId}`);
@@ -23322,7 +23515,7 @@ class BaseDocumentDriveServer {
23322
23515
  this.logger.verbose(`[SYNC DEBUG] Created SwitchboardPush transmitter with URL: ${zodListener.callInfo.data || "none"}`);
23323
23516
  await this.listenerManager.setListener(driveId, {
23324
23517
  block: zodListener.block,
23325
- driveId: drive.state.global.id,
23518
+ driveId: drive.id,
23326
23519
  filter: {
23327
23520
  branch: zodListener.filter.branch ?? [],
23328
23521
  documentId: zodListener.filter.documentId ?? [],
@@ -23384,25 +23577,25 @@ class BaseDocumentDriveServer {
23384
23577
  return [...this.documentModelModules];
23385
23578
  }
23386
23579
  async addDrive(input, preferredEditor) {
23387
- const id = input.global.id || generateUUID();
23388
- if (!id) {
23389
- throw new Error("Invalid Drive Id");
23390
- }
23391
- const drives = await this.legacyStorage.getDrives();
23392
- if (drives.includes(id)) {
23393
- throw new DocumentAlreadyExistsError(id);
23394
- }
23395
23580
  const document = createDocument({
23396
- state: input
23581
+ id: input.id,
23582
+ slug: input.slug,
23583
+ state: {
23584
+ global: {
23585
+ icon: input.global.icon ?? null,
23586
+ name: input.global.name
23587
+ },
23588
+ local: input.local
23589
+ }
23397
23590
  });
23398
23591
  document.meta = {
23399
23592
  preferredEditor
23400
23593
  };
23401
- await this.legacyStorage.createDrive(id, document);
23402
- if (input.global.slug) {
23403
- await this.cache.deleteDriveBySlug(input.global.slug);
23594
+ await this.documentStorage.create(document);
23595
+ if (input.slug && input.slug.length > 0) {
23596
+ await this.cache.deleteDriveBySlug(input.slug);
23404
23597
  }
23405
- await this._initializeDrive(id);
23598
+ await this._initializeDrive(document.id);
23406
23599
  this.eventEmitter.emit("driveAdded", document);
23407
23600
  return document;
23408
23601
  }
@@ -23414,11 +23607,11 @@ class BaseDocumentDriveServer {
23414
23607
  pullInterval
23415
23608
  });
23416
23609
  return await this.addDrive({
23610
+ id,
23611
+ slug,
23417
23612
  global: {
23418
- id,
23419
23613
  name: name2,
23420
- slug,
23421
- icon: icon ?? null
23614
+ icon
23422
23615
  },
23423
23616
  local: {
23424
23617
  triggers: [...triggers, pullTrigger],
@@ -23433,7 +23626,7 @@ class BaseDocumentDriveServer {
23433
23626
  this.stopSyncRemoteDrive(driveId),
23434
23627
  this.listenerManager.removeDrive(driveId),
23435
23628
  this.cache.deleteDrive(driveId),
23436
- this.legacyStorage.deleteDrive(driveId)
23629
+ this.documentStorage.delete(driveId)
23437
23630
  ]);
23438
23631
  this.eventEmitter.emit("driveDeleted", driveId);
23439
23632
  result.forEach((r) => {
@@ -23442,8 +23635,16 @@ class BaseDocumentDriveServer {
23442
23635
  }
23443
23636
  });
23444
23637
  }
23445
- getDrives() {
23446
- return this.legacyStorage.getDrives();
23638
+ // TODO: paginate
23639
+ async getDrives() {
23640
+ const drives = [];
23641
+ let cursor;
23642
+ do {
23643
+ const { documents, nextCursor } = await this.documentStorage.findByType("powerhouse/document-drive", 100, cursor);
23644
+ drives.push(...documents);
23645
+ cursor = nextCursor;
23646
+ } while (cursor);
23647
+ return drives;
23447
23648
  }
23448
23649
  async getDrive(driveId, options) {
23449
23650
  let document;
@@ -23517,8 +23718,13 @@ class BaseDocumentDriveServer {
23517
23718
  state = doc.state;
23518
23719
  }
23519
23720
  const document = input.document ?? this.getDocumentModelModule(input.documentType).utils.createDocument();
23721
+ if (input.id && input.id.length > 0) {
23722
+ document.id = input.id;
23723
+ }
23520
23724
  const documentStorage = {
23725
+ id: document.id,
23521
23726
  name: document.name,
23727
+ slug: document.slug,
23522
23728
  revision: document.revision,
23523
23729
  documentType: document.documentType,
23524
23730
  created: document.created,
@@ -23528,7 +23734,7 @@ class BaseDocumentDriveServer {
23528
23734
  clipboard: [],
23529
23735
  state: state ?? document.state
23530
23736
  };
23531
- await this.documentStorage.create(input.id, documentStorage);
23737
+ await this.documentStorage.create(documentStorage);
23532
23738
  try {
23533
23739
  await this.documentStorage.addChild(driveId, input.id);
23534
23740
  } catch (e) {
@@ -23667,12 +23873,18 @@ class BaseDocumentDriveServer {
23667
23873
  handler = () => this.deleteDocument(driveId, signal.input.id);
23668
23874
  break;
23669
23875
  case "COPY_CHILD_DOCUMENT":
23670
- handler = () => this.getDocument(driveId, signal.input.id).then((documentToCopy) => this.createDocument(driveId, {
23671
- id: signal.input.newId,
23672
- documentType: documentToCopy.documentType,
23673
- document: documentToCopy,
23674
- synchronizationUnits: signal.input.synchronizationUnits
23675
- }));
23876
+ handler = () => this.getDocument(driveId, signal.input.id).then((documentToCopy) => {
23877
+ const doc = {
23878
+ ...documentToCopy,
23879
+ slug: signal.input.newId
23880
+ };
23881
+ return this.createDocument(driveId, {
23882
+ id: signal.input.newId,
23883
+ documentType: documentToCopy.documentType,
23884
+ document: doc,
23885
+ synchronizationUnits: signal.input.synchronizationUnits
23886
+ });
23887
+ });
23676
23888
  break;
23677
23889
  }
23678
23890
  if (handler) {
@@ -23929,13 +24141,6 @@ class BaseDocumentDriveServer {
23929
24141
  addDriveOperation(driveId, operation, options) {
23930
24142
  return this.addDriveOperations(driveId, [operation], options);
23931
24143
  }
23932
- async clearStorage() {
23933
- var _a2, _b;
23934
- for (const drive of await this.getDrives()) {
23935
- await this.deleteDrive(drive);
23936
- }
23937
- await ((_b = (_a2 = this.legacyStorage).clearStorage) == null ? void 0 : _b.call(_a2));
23938
- }
23939
24144
  async _addDriveOperations(driveId, callback) {
23940
24145
  if (!this.legacyStorage.addDriveOperationsWithTransaction) {
23941
24146
  const documentStorage = await this.documentStorage.get(driveId);
@@ -24210,17 +24415,32 @@ class MemoryStorage {
24210
24415
  exists(documentId) {
24211
24416
  return Promise.resolve(!!this.documents[documentId]);
24212
24417
  }
24213
- // TODO: this should throw an error if the document already exists.
24214
- create(documentId, document) {
24215
- var _a2;
24418
+ create(document) {
24419
+ const documentId = document.id;
24420
+ if (!isValidDocumentId(documentId)) {
24421
+ throw new DocumentIdValidationError(documentId);
24422
+ }
24423
+ if (this.documents[documentId]) {
24424
+ throw new DocumentAlreadyExistsError(documentId);
24425
+ }
24426
+ const slug = document.slug.length > 0 ? document.slug : documentId;
24427
+ if (!isValidSlug(slug)) {
24428
+ throw new DocumentSlugValidationError(slug);
24429
+ }
24430
+ if (slug && this.slugToDocumentId[slug]) {
24431
+ throw new DocumentAlreadyExistsError(documentId);
24432
+ }
24433
+ document.slug = slug;
24216
24434
  this.documents[documentId] = document;
24217
- const slug = (_a2 = document.initialState.state.global) == null ? void 0 : _a2.slug;
24218
24435
  if (slug) {
24219
24436
  if (this.slugToDocumentId[slug]) {
24220
- throw new Error(`Document with slug ${slug} already exists`);
24437
+ throw new DocumentAlreadyExistsError(documentId);
24221
24438
  }
24222
24439
  this.slugToDocumentId[slug] = documentId;
24223
24440
  }
24441
+ if (document.documentType === "powerhouse/document-drive") {
24442
+ this.updateDriveManifest(documentId, { documentIds: /* @__PURE__ */ new Set() });
24443
+ }
24224
24444
  return Promise.resolve();
24225
24445
  }
24226
24446
  get(documentId) {
@@ -24237,20 +24457,56 @@ class MemoryStorage {
24237
24457
  }
24238
24458
  return this.get(documentId);
24239
24459
  }
24460
+ async findByType(documentModelType, limit = 100, cursor) {
24461
+ const documentsAndIds = Object.entries(this.documents).filter(([_, doc]) => doc.documentType === documentModelType).map(([id, doc]) => ({
24462
+ id,
24463
+ document: doc
24464
+ }));
24465
+ documentsAndIds.sort((a, b) => {
24466
+ const aDate = new Date(a.document.created);
24467
+ const bDate = new Date(b.document.created);
24468
+ if (aDate.getTime() === bDate.getTime()) {
24469
+ const aId = a.id;
24470
+ const bId = b.id;
24471
+ return aId.localeCompare(bId);
24472
+ }
24473
+ return aDate.getTime() - bDate.getTime();
24474
+ });
24475
+ let startIndex = 0;
24476
+ if (cursor) {
24477
+ const index = documentsAndIds.findIndex(({ id }) => id === cursor);
24478
+ if (index !== -1) {
24479
+ startIndex = index;
24480
+ }
24481
+ }
24482
+ const endIndex = Math.min(startIndex + limit, documentsAndIds.length);
24483
+ let nextCursor;
24484
+ if (endIndex < documentsAndIds.length) {
24485
+ nextCursor = documentsAndIds[endIndex].id;
24486
+ }
24487
+ return {
24488
+ documents: documentsAndIds.slice(startIndex, endIndex).map(({ id }) => id),
24489
+ nextCursor
24490
+ };
24491
+ }
24240
24492
  async delete(documentId) {
24241
- var _a2;
24242
24493
  const document = this.documents[documentId];
24243
24494
  if (document) {
24244
- const slug = (_a2 = document.initialState.state.global) == null ? void 0 : _a2.slug;
24495
+ const slug = document.slug.length > 0 ? document.slug : documentId;
24245
24496
  if (slug && this.slugToDocumentId[slug] === documentId) {
24246
24497
  delete this.slugToDocumentId[slug];
24247
24498
  }
24248
24499
  }
24249
- const drives = await this.getDrives();
24250
- for (const driveId of drives) {
24251
- if (driveId === documentId)
24252
- continue;
24253
- await this.removeChild(driveId, documentId);
24500
+ const parents = await this.getParents(documentId);
24501
+ for (const parent of parents) {
24502
+ await this.removeChild(parent, documentId);
24503
+ }
24504
+ const children = await this.getChildren(documentId);
24505
+ for (const child of children) {
24506
+ const childParents = await this.getParents(child);
24507
+ if (childParents.length === 1) {
24508
+ await this.delete(child);
24509
+ }
24254
24510
  }
24255
24511
  delete this.driveManifests[documentId];
24256
24512
  if (this.documents[documentId]) {
@@ -24284,14 +24540,26 @@ class MemoryStorage {
24284
24540
  const manifest = this.getManifest(parentId);
24285
24541
  return [...manifest.documentIds];
24286
24542
  }
24543
+ async getParents(childId) {
24544
+ const parents = [];
24545
+ for (const [driveId, manifest] of Object.entries(this.driveManifests)) {
24546
+ if (manifest.documentIds.has(childId)) {
24547
+ parents.push(driveId);
24548
+ }
24549
+ }
24550
+ return parents;
24551
+ }
24287
24552
  ////////////////////////////////
24288
- // IDriveStorage
24553
+ // IDocumentAdminStorage
24289
24554
  ////////////////////////////////
24290
- async clearStorage() {
24555
+ async clear() {
24291
24556
  this.documents = {};
24292
24557
  this.driveManifests = {};
24293
24558
  this.slugToDocumentId = {};
24294
24559
  }
24560
+ ////////////////////////////////
24561
+ // IDriveStorage
24562
+ ////////////////////////////////
24295
24563
  async addDocumentOperations(drive, id, operations, header) {
24296
24564
  const document = await this.get(id);
24297
24565
  if (!document) {
@@ -24304,13 +24572,6 @@ class MemoryStorage {
24304
24572
  operations: mergedOperations
24305
24573
  };
24306
24574
  }
24307
- async getDrives() {
24308
- return Object.keys(this.driveManifests);
24309
- }
24310
- async createDrive(id, drive) {
24311
- await this.create(id, drive);
24312
- this.updateDriveManifest(id, { documentIds: /* @__PURE__ */ new Set() });
24313
- }
24314
24575
  async addDriveOperations(id, operations, header) {
24315
24576
  const drive = await this.get(id);
24316
24577
  const mergedOperations = mergeOperations(drive.operations, operations);
@@ -24320,32 +24581,6 @@ class MemoryStorage {
24320
24581
  operations: mergedOperations
24321
24582
  };
24322
24583
  }
24323
- async deleteDrive(id) {
24324
- const manifest = this.getManifest(id);
24325
- const drives = await this.getDrives();
24326
- await Promise.all([...manifest.documentIds].map((docId) => {
24327
- var _a2;
24328
- for (const driveId of drives) {
24329
- if (driveId === id) {
24330
- continue;
24331
- }
24332
- const manifest2 = this.getManifest(driveId);
24333
- if (manifest2.documentIds.has(docId)) {
24334
- return;
24335
- }
24336
- }
24337
- const document = this.documents[docId];
24338
- if (document) {
24339
- const slug = (_a2 = document.initialState.state.global) == null ? void 0 : _a2.slug;
24340
- if (slug && this.slugToDocumentId[slug] === docId) {
24341
- delete this.slugToDocumentId[slug];
24342
- }
24343
- }
24344
- delete this.documents[docId];
24345
- }));
24346
- delete this.driveManifests[id];
24347
- delete this.documents[id];
24348
- }
24349
24584
  async getSynchronizationUnitsRevision(units) {
24350
24585
  const results = await Promise.allSettled(units.map(async (unit) => {
24351
24586
  try {
@@ -25548,6 +25783,9 @@ function Syncing(props) {
25548
25783
  function Tabler(props) {
25549
25784
  return jsxs("svg", { ...props, width: "18", height: "18", viewBox: "0 0 18 18", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [jsx("path", { d: "M4.5 9V7.5C4.5 6.30653 4.97411 5.16193 5.81802 4.31802C6.66193 3.47411 7.80653 3 9 3C10.1935 3 11.3381 3.47411 12.182 4.31802C13.0259 5.16193 13.5 6.30653 13.5 7.5V9M3 13.5C3 13.8978 3.15804 14.2794 3.43934 14.5607C3.72064 14.842 4.10218 15 4.5 15C4.89782 15 5.27936 14.842 5.56066 14.5607C5.84196 14.2794 6 13.8978 6 13.5C6 13.1022 5.84196 12.7206 5.56066 12.4393C5.27936 12.158 4.89782 12 4.5 12C4.10218 12 3.72064 12.158 3.43934 12.4393C3.15804 12.7206 3 13.1022 3 13.5ZM12 13.5C12 13.8978 12.158 14.2794 12.4393 14.5607C12.7206 14.842 13.1022 15 13.5 15C13.8978 15 14.2794 14.842 14.5607 14.5607C14.842 14.2794 15 13.8978 15 13.5C15 13.1022 14.842 12.7206 14.5607 12.4393C14.2794 12.158 13.8978 12 13.5 12C13.1022 12 12.7206 12.158 12.4393 12.4393C12.158 12.7206 12 13.1022 12 13.5Z", stroke: "currentcolor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }), jsx("path", { d: "M11.25 6.75L13.5 9L15.75 6.75", stroke: "currentcolor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" })] });
25550
25785
  }
25786
+ function TimelineCaret(props) {
25787
+ return jsx("svg", { ...props, width: "10", height: "7", viewBox: "0 0 10 7", fill: "currentcolor", children: jsx("path", { d: "M0.539174 0.830403L0.539396 0.830693L4.81717 6.41675L0.539174 0.830403ZM0.539174 0.830403C0.492941 0.770121 0.486776 0.69618 0.524599 0.622069C0.562768 0.547277 0.632849 0.5 0.721373 0.5L9.27711 0.5C9.36895 0.5 9.44336 0.552912 9.47789 0.620069C9.51177 0.686686 9.50789 0.767089 9.45938 0.830307L9.45889 0.83095M0.539174 0.830403L9.45889 0.83095M9.45889 0.83095C9.05222 1.36269 7.09357 3.91999 5.94678 5.41729C5.588 5.88573 5.30868 6.25042 5.18122 6.41687M9.45889 0.83095L5.18122 6.41687M5.18122 6.41687C5.1428 6.46691 5.07824 6.5 4.99924 6.5M5.18122 6.41687L4.99924 6.5M4.99924 6.5C4.92023 6.5 4.85567 6.46691 4.81726 6.41687L4.99924 6.5Z", fill: "currentcolor", stroke: "currentcolor" }) });
25788
+ }
25551
25789
  function Timeline(props) {
25552
25790
  return jsxs("svg", { ...props, width: "16", height: "16", viewBox: "0 0 16 16", fill: "currentcolor", children: [jsx("rect", { width: "16", height: "16", fill: "url(#pattern0_1256_1508)" }), jsxs("defs", { children: [jsx("pattern", { id: "pattern0_1256_1508", patternContentUnits: "objectBoundingBox", width: "1", height: "1", children: jsx("use", { href: "#image0_1256_1508", transform: "scale(0.00195312)" }) }), jsx("image", { id: "image0_1256_1508", width: "512", height: "512", preserveAspectRatio: "none", href: "data:image/png;base64,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" })] })] });
25553
25791
  }
@@ -25688,6 +25926,7 @@ const iconComponents = {
25688
25926
  Synced,
25689
25927
  Syncing,
25690
25928
  Tabler,
25929
+ TimelineCaret,
25691
25930
  Timeline,
25692
25931
  TrashFill,
25693
25932
  Trash,
@@ -25750,7 +25989,12 @@ const ADD_TRIGGER = "ADD_TRIGGER";
25750
25989
  const ADD_INVALID_TRIGGER = "ADD_INVALID_TRIGGER";
25751
25990
  const defaultDriveOptions = [NEW_FOLDER, RENAME, SETTINGS];
25752
25991
  const defaultFileOptions = [RENAME, DELETE, DUPLICATE];
25753
- const defaultFolderOptions = [RENAME, DELETE, DUPLICATE];
25992
+ const defaultFolderOptions = [
25993
+ NEW_FOLDER,
25994
+ RENAME,
25995
+ DELETE,
25996
+ DUPLICATE
25997
+ ];
25754
25998
  const debugNodeOptions = [
25755
25999
  ADD_TRIGGER,
25756
26000
  REMOVE_TRIGGER,
@@ -25830,7 +26074,7 @@ const nodeOptionsMap = {
25830
26074
  };
25831
26075
  const name = "@powerhousedao/connect";
25832
26076
  const productName = "Powerhouse-Connect";
25833
- const version$1 = "1.0.23-staging.1";
26077
+ const version$1 = "1.0.24-dev.0";
25834
26078
  const description = "Powerhouse Connect";
25835
26079
  const main = "./dist/index.html";
25836
26080
  const type = "module";
@@ -25841,8 +26085,8 @@ const author = "acaldas@powerhouse.inc";
25841
26085
  const repository = { "type": "git", "url": "git+https://github.com/powerhouse-inc/document-model-electron.git" };
25842
26086
  const bugs = { "url": "https://github.com/powerhouse-inc/document-model-electron/issues" };
25843
26087
  const homepage = "https://github.com/powerhouse-inc/document-model-electron#readme";
25844
- const scripts = { "build:tsc": "tsc --build", "start": "electron-forge start", "package": "electron-forge package", "make": "PH_CONNECT_BASE_HREF=./ electron-forge make", "make:mac": "PH_CONNECT_BASE_HREF=./ electron-forge make -p darwin", "make:linux": "PH_CONNECT_BASE_HREF=./ electron-forge make -p linux", "make:windows": "PH_CONNECT_BASE_HREF=./ electron-forge make -p win32", "publish:electron": "electron-forge publish", "prepublishOnly": "npm run build", "lint": "eslint .", "lint:fix": "eslint --fix .", "lint:nx": "eslint --quiet --fix .", "format": 'prettier --write "**/*.+(js|ts|jsx|tsx|json)"', "dev": "vite -c vite.renderer.config.mts", "dev:nocache": "rm -rf node_modules/.vite && rm -rf node_modules/.cache && npm run dev", "prebuild": "tsc --build --noEmit", "build": "NODE_OPTIONS=--max-old-space-size=6144 vite build -c vite.renderer.config.mts", "preview:web": "vite preview -c vite.renderer.config.mts", "e2e": "playwright test", "cy:open": "cypress open", "build:service-worker": "tsc --build ./tsconfig.sw.json", "clean": "rimraf dist", "clean:node_modules": "rimraf node_modules" };
25845
- const devDependencies = { "@electron-forge/cli": "^6.1.1", "@electron-forge/maker-deb": "^6.1.1", "@electron-forge/maker-rpm": "^6.1.1", "@electron-forge/maker-squirrel": "^6.1.1", "@electron-forge/maker-zip": "^6.1.1", "@electron-forge/plugin-vite": "^6.1.1", "@electron-forge/publisher-electron-release-server": "^6.2.1", "@electron-forge/publisher-github": "^7.2.0", "@electron-forge/shared-types": "^7.7.0", "@playwright/test": "^1.41.2", "@powerhousedao/builder-tools": "workspace:*", "@powerhousedao/common": "workspace:*", "@powerhousedao/config": "workspace:*", "@powerhousedao/design-system": "workspace:*", "@powerhousedao/reactor-browser": "workspace:*", "@powerhousedao/scalars": "workspace:*", "@rollup/plugin-node-resolve": "^15.2.3", "@sentry/browser": "^9.1.0", "@sentry/react": "^7.109.0", "@sentry/vite-plugin": "^2.23.0", "@tailwindcss/vite": "^4.1.4", "@tanstack/react-virtual": "^3.8.1", "@types/node": "^22.13.10", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.18", "@types/uuid": "^9.0.7", "@types/wicg-file-system-access": "^2020.9.6", "@vitejs/plugin-basic-ssl": "^2.0.0", "@vitejs/plugin-react": "^4.4.1", "asar": "^3.2.0", "did-key-creator": "^1.2.0", "document-drive": "workspace:*", "document-model": "workspace:*", "electron": "30.0.0", "electron-is-dev": "^3.0.1", "electron-playwright-helpers": "^1.7.1", "electron-squirrel-startup": "^1.0.0", "electron-store": "^8.1.0", "esbuild": "^0.24.0", "graphql": "^16.8.1", "graphql-request": "^6.1.0", "i18next": "^23.7.6", "jotai": "^2.1.0", "jotai-effect": "^1.1.6", "localforage": "^1.10.0", "lz-string": "^1.5.0", "playwright": "^1.41.2", "playwright-core": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-error-boundary": "^4.0.11", "react-hotkeys-hook": "^4.5.0", "react-i18next": "^13.5.0", "react-router-dom": "^6.11.2", "tailwind-merge": "^3.0.2", "tailwindcss": "^4.1.4", "uuid": "^9.0.1", "viem": "^2.8.13", "vite": "^6.3.3", "vite-envs": "^4.6.0", "vite-plugin-html": "^3.2.2", "vite-plugin-node-polyfills": "^0.23.0", "vite-plugin-svgr": "^4.3.0", "vite-tsconfig-paths": "^5.1.4", "xvfb-maybe": "^0.2.1" };
26088
+ const scripts = { "build:tsc": "tsc --build", "start": "electron-forge start", "package": "electron-forge package", "make": "PH_CONNECT_BASE_HREF=./ electron-forge make", "make:mac": "PH_CONNECT_BASE_HREF=./ electron-forge make -p darwin", "make:linux": "PH_CONNECT_BASE_HREF=./ electron-forge make -p linux", "make:windows": "PH_CONNECT_BASE_HREF=./ electron-forge make -p win32", "publish:electron": "electron-forge publish", "prepublishOnly": "npm run build", "lint": "eslint .", "lint:fix": "eslint --fix .", "lint:nx": "eslint --quiet --fix .", "format": 'prettier --write "**/*.+(js|ts|jsx|tsx|json)"', "dev": "vite -c vite.renderer.config.mts", "dev:nocache": "rm -rf node_modules/.vite && rm -rf node_modules/.cache && npm run dev", "prebuild": "npm run clean && tsc --build --noEmit", "build": "NODE_OPTIONS=--max-old-space-size=6144 vite build -c vite.renderer.config.mts", "preview:web": "vite preview -c vite.renderer.config.mts", "e2e": "playwright test", "cy:open": "cypress open", "build:service-worker": "tsc --build ./tsconfig.sw.json", "clean": "rimraf dist", "clean:node_modules": "rimraf node_modules" };
26089
+ const devDependencies = { "@electron-forge/cli": "^6.1.1", "@electron-forge/maker-deb": "^6.1.1", "@electron-forge/maker-rpm": "^6.1.1", "@electron-forge/maker-squirrel": "^6.1.1", "@electron-forge/maker-zip": "^6.1.1", "@electron-forge/plugin-vite": "^6.1.1", "@electron-forge/publisher-electron-release-server": "^6.2.1", "@electron-forge/publisher-github": "^7.2.0", "@electron-forge/shared-types": "^7.7.0", "@playwright/test": "^1.41.2", "@powerhousedao/builder-tools": "workspace:*", "@powerhousedao/common": "workspace:*", "@powerhousedao/config": "workspace:*", "@powerhousedao/design-system": "workspace:*", "@powerhousedao/diff-analyzer": "^0.0.0-dev.4", "@powerhousedao/reactor-browser": "workspace:*", "@powerhousedao/scalars": "workspace:*", "@rollup/plugin-node-resolve": "^15.2.3", "@sentry/browser": "^9.1.0", "@sentry/react": "^7.109.0", "@sentry/vite-plugin": "^2.22.2", "@tailwindcss/vite": "^4.0.9", "@tanstack/react-virtual": "^3.8.1", "@types/node": "^22.15.17", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.18", "@types/uuid": "^9.0.7", "@types/wicg-file-system-access": "^2020.9.6", "@vitejs/plugin-basic-ssl": "^1.2.0", "@vitejs/plugin-react": "^4.2.1", "asar": "^3.2.0", "did-key-creator": "^1.2.0", "document-drive": "workspace:*", "document-model": "workspace:*", "electron": "30.0.0", "electron-is-dev": "^3.0.1", "electron-playwright-helpers": "^1.7.1", "electron-squirrel-startup": "^1.0.0", "electron-store": "^8.1.0", "esbuild": "^0.24.0", "graphql": "^16.8.1", "graphql-request": "^6.1.0", "i18next": "^23.7.6", "jotai": "^2.1.0", "jotai-effect": "^1.1.6", "localforage": "^1.10.0", "lz-string": "^1.5.0", "playwright": "^1.41.2", "playwright-core": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-error-boundary": "^4.0.11", "react-hotkeys-hook": "^4.5.0", "react-i18next": "^13.5.0", "react-router-dom": "^6.11.2", "tailwind-merge": "^3.0.2", "tailwindcss": "^4.0.9", "uuid": "^9.0.1", "viem": "^2.8.13", "vite": "^6.2.2", "vite-envs": "^4.4.11", "vite-plugin-html": "^3.2.2", "vite-plugin-node-polyfills": "^0.23.0", "vite-plugin-svgr": "^4.2.0", "vite-tsconfig-paths": "^4.3.2", "xvfb-maybe": "^0.2.1" };
25846
26090
  const optionalDependencies = { "@esbuild/linux-x64": "^0.21.4", "@rollup/rollup-linux-x64-musl": "4.14.3" };
25847
26091
  const packageJson = {
25848
26092
  name,
@@ -25883,13 +26127,15 @@ const PH_CONNECT_SENTRY_ENV = window.__VITE_ENVS.PH_CONNECT_SENTRY_ENV || "dev";
25883
26127
  const PH_CONNECT_SENTRY_TRACING_ENABLED = window.__VITE_ENVS.PH_CONNECT_SENTRY_TRACING_ENABLED || "false";
25884
26128
  const GA_TRACKING_ID = window.__VITE_ENVS.PH_CONNECT_GA_TRACKING_ID;
25885
26129
  const PH_CONNECT_CLI_VERSION = window.__VITE_ENVS.PH_CONNECT_CLI_VERSION || void 0;
25886
- setLogLevel(window.__VITE_ENVS.LOG_LEVEL);
25887
- logger$1.info(`Setting log level to ${window.__VITE_ENVS.LOG_LEVEL}.`);
26130
+ const LOG_LEVEL = isLogLevel(window.__VITE_ENVS.LOG_LEVEL) ? window.__VITE_ENVS.LOG_LEVEL : "info";
26131
+ setLogLevel(LOG_LEVEL);
26132
+ logger$1.debug(`Setting log level to ${window.__VITE_ENVS.LOG_LEVEL}.`);
25888
26133
  const connectConfig = {
25889
26134
  appVersion: APP_VERSION,
25890
26135
  studioMode: PH_CONNECT_STUDIO_MODE.toString() === "true",
25891
26136
  warnOutdatedApp: WARN_OUTDATED_APP === "true",
25892
26137
  routerBasename: PH_CONNECT_ROUTER_BASENAME,
26138
+ analyticsDatabaseName: `${PH_CONNECT_ROUTER_BASENAME}:analytics`,
25893
26139
  sentry: {
25894
26140
  dsn: PH_CONNECT_SENTRY_DSN,
25895
26141
  env: PH_CONNECT_SENTRY_ENV,
@@ -25983,6 +26229,7 @@ DriveSections.filter(
25983
26229
  };
25984
26230
  });
25985
26231
  var lzString = { exports: {} };
26232
+ lzString.exports;
25986
26233
  var hasRequiredLzString;
25987
26234
  function requireLzString() {
25988
26235
  if (hasRequiredLzString) return lzString.exports;
@@ -28623,6 +28870,9 @@ const _BrowserStorage = class _BrowserStorage {
28623
28870
  name: namespace ? `${namespace}:${_BrowserStorage.DBName}` : _BrowserStorage.DBName
28624
28871
  }));
28625
28872
  }
28873
+ ////////////////////////////////
28874
+ // IDocumentAdminStorage
28875
+ ////////////////////////////////
28626
28876
  async clear() {
28627
28877
  const db = await this.db;
28628
28878
  await db.clear();
@@ -28635,19 +28885,35 @@ const _BrowserStorage = class _BrowserStorage {
28635
28885
  const document = await db.getItem(this.buildDocumentKey(documentId));
28636
28886
  return !!document;
28637
28887
  }
28638
- // TODO: this should throw an error if the document already exists.
28639
- async create(documentId, document) {
28640
- var _a2;
28888
+ async create(document) {
28889
+ const documentId = document.id;
28890
+ if (!isValidDocumentId(documentId)) {
28891
+ throw new DocumentIdValidationError(documentId);
28892
+ }
28641
28893
  const db = await this.db;
28894
+ if (await this.exists(documentId)) {
28895
+ throw new DocumentAlreadyExistsError(documentId);
28896
+ }
28897
+ const slug = document.slug.length > 0 ? document.slug : documentId;
28898
+ if (!isValidSlug(slug)) {
28899
+ throw new DocumentSlugValidationError(slug);
28900
+ }
28901
+ const slugManifest = await this.getSlugManifest();
28902
+ if (slugManifest.slugToId[slug]) {
28903
+ throw new DocumentAlreadyExistsError(documentId);
28904
+ }
28905
+ document.slug = slug;
28642
28906
  await db.setItem(this.buildDocumentKey(documentId), document);
28643
- const slug = ((_a2 = document.initialState.state.global) == null ? void 0 : _a2.slug) ?? documentId;
28644
28907
  if (slug) {
28645
- const slugManifest = await this.getSlugManifest();
28646
- if (slugManifest.slugToId[slug]) {
28908
+ const slugManifest2 = await this.getSlugManifest();
28909
+ if (slugManifest2.slugToId[slug]) {
28647
28910
  throw new Error(`Document with slug ${slug} already exists`);
28648
28911
  }
28649
- slugManifest.slugToId[slug] = documentId;
28650
- await this.updateSlugManifest(slugManifest);
28912
+ slugManifest2.slugToId[slug] = documentId;
28913
+ await this.updateSlugManifest(slugManifest2);
28914
+ }
28915
+ if (document.documentType === "powerhouse/document-drive") {
28916
+ this.updateDriveManifest(documentId, { documentIds: [] });
28651
28917
  }
28652
28918
  }
28653
28919
  async get(documentId) {
@@ -28666,15 +28932,56 @@ const _BrowserStorage = class _BrowserStorage {
28666
28932
  }
28667
28933
  return this.get(documentId);
28668
28934
  }
28935
+ async findByType(documentModelType, limit = 100, cursor) {
28936
+ const db = await this.db;
28937
+ const keys = await db.keys();
28938
+ const documentKeys = keys.filter((key) => key.startsWith(`${_BrowserStorage.DOCUMENT_KEY}${_BrowserStorage.SEP}`));
28939
+ const documentsAndIds = [];
28940
+ for (const key of documentKeys) {
28941
+ const documentId = key.slice(_BrowserStorage.DOCUMENT_KEY.length + _BrowserStorage.SEP.length);
28942
+ try {
28943
+ const document = await db.getItem(key);
28944
+ if (!document || document.documentType !== documentModelType) {
28945
+ continue;
28946
+ }
28947
+ documentsAndIds.push({ id: documentId, document });
28948
+ } catch (error) {
28949
+ continue;
28950
+ }
28951
+ }
28952
+ documentsAndIds.sort((a, b) => {
28953
+ const aDate = new Date(a.document.created);
28954
+ const bDate = new Date(b.document.created);
28955
+ if (aDate.getTime() === bDate.getTime()) {
28956
+ return a.id.localeCompare(b.id);
28957
+ }
28958
+ return aDate.getTime() - bDate.getTime();
28959
+ });
28960
+ let startIndex = 0;
28961
+ if (cursor) {
28962
+ const index = documentsAndIds.findIndex(({ id }) => id === cursor);
28963
+ if (index !== -1) {
28964
+ startIndex = index;
28965
+ }
28966
+ }
28967
+ const endIndex = Math.min(startIndex + limit, documentsAndIds.length);
28968
+ let nextCursor;
28969
+ if (endIndex < documentsAndIds.length) {
28970
+ nextCursor = documentsAndIds[endIndex].id;
28971
+ }
28972
+ return {
28973
+ documents: documentsAndIds.slice(startIndex, endIndex).map(({ id }) => id),
28974
+ nextCursor
28975
+ };
28976
+ }
28669
28977
  async delete(documentId) {
28670
- var _a2;
28671
28978
  const db = await this.db;
28672
28979
  const document = await db.getItem(this.buildDocumentKey(documentId));
28673
28980
  if (!document) {
28674
28981
  return false;
28675
28982
  }
28983
+ const slug = document.slug.length > 0 ? document.slug : documentId;
28676
28984
  try {
28677
- const slug = (_a2 = document.initialState.state.global) == null ? void 0 : _a2.slug;
28678
28985
  if (slug) {
28679
28986
  const slugManifest = await this.getSlugManifest();
28680
28987
  if (slugManifest.slugToId[slug] === documentId) {
@@ -28684,11 +28991,16 @@ const _BrowserStorage = class _BrowserStorage {
28684
28991
  }
28685
28992
  } catch (error) {
28686
28993
  }
28687
- const drives = await this.getDrives();
28688
- for (const driveId of drives) {
28689
- if (driveId === documentId)
28690
- continue;
28691
- await this.removeChild(driveId, documentId);
28994
+ const parents = await this.getParents(documentId);
28995
+ for (const parent of parents) {
28996
+ await this.removeChild(parent, documentId);
28997
+ }
28998
+ const children = await this.getChildren(documentId);
28999
+ for (const child of children) {
29000
+ const childParents = await this.getParents(child);
29001
+ if (childParents.length === 1 && childParents[0] === documentId) {
29002
+ await this.delete(child);
29003
+ }
28692
29004
  }
28693
29005
  await db.removeItem(this.buildManifestKey(documentId));
28694
29006
  await db.removeItem(this.buildDocumentKey(documentId));
@@ -28722,6 +29034,20 @@ const _BrowserStorage = class _BrowserStorage {
28722
29034
  const manifest = await this.getManifest(parentId);
28723
29035
  return manifest.documentIds;
28724
29036
  }
29037
+ async getParents(childId) {
29038
+ const db = await this.db;
29039
+ const keys = await db.keys();
29040
+ const parents = [];
29041
+ const manifestKeys = keys.filter((key) => key.startsWith(`${_BrowserStorage.MANIFEST_KEY}${_BrowserStorage.SEP}`));
29042
+ for (const key of manifestKeys) {
29043
+ const driveId = key.slice(_BrowserStorage.MANIFEST_KEY.length + _BrowserStorage.SEP.length);
29044
+ const manifest = await this.getManifest(driveId);
29045
+ if (manifest.documentIds.includes(childId)) {
29046
+ parents.push(driveId);
29047
+ }
29048
+ }
29049
+ return parents;
29050
+ }
28725
29051
  ////////////////////////////////
28726
29052
  // IDriveStorage
28727
29053
  ////////////////////////////////
@@ -28743,9 +29069,6 @@ const _BrowserStorage = class _BrowserStorage {
28743
29069
  const db = await this.db;
28744
29070
  await db.setItem(_BrowserStorage.SLUG_MANIFEST_KEY, manifest);
28745
29071
  }
28746
- async clearStorage() {
28747
- return (await this.db).clear();
28748
- }
28749
29072
  async addDocumentOperations(drive, id, operations, header) {
28750
29073
  const document = await this.get(id);
28751
29074
  if (!document) {
@@ -28759,22 +29082,6 @@ const _BrowserStorage = class _BrowserStorage {
28759
29082
  operations: mergedOperations
28760
29083
  });
28761
29084
  }
28762
- async getDrives() {
28763
- const db = await this.db;
28764
- const keys = await db.keys();
28765
- return keys.filter((key) => key.startsWith(_BrowserStorage.MANIFEST_KEY)).map((key) => key.slice(_BrowserStorage.MANIFEST_KEY.length + _BrowserStorage.SEP.length));
28766
- }
28767
- async createDrive(id, drive) {
28768
- await this.create(id, drive);
28769
- await this.updateDriveManifest(id, { documentIds: [] });
28770
- }
28771
- async deleteDrive(id) {
28772
- const documents = await this.getChildren(id);
28773
- await Promise.all(documents.map((doc) => this.delete(doc)));
28774
- const db = await this.db;
28775
- await db.removeItem(this.buildManifestKey(id));
28776
- return db.removeItem(this.buildDocumentKey(id));
28777
- }
28778
29085
  async addDriveOperations(id, operations, header) {
28779
29086
  const drive = await this.get(id);
28780
29087
  const mergedOperations = mergeOperations(drive.operations, operations);
@@ -28815,12 +29122,16 @@ const _BrowserStorage = class _BrowserStorage {
28815
29122
  }
28816
29123
  // migrates all stored operations from legacy signature to signatures array
28817
29124
  async migrateOperationSignatures() {
28818
- const drives = await this.getDrives();
28819
- for (const drive of drives) {
28820
- await this.migrateDrive(drive);
28821
- const documents = await this.getChildren(drive);
28822
- await Promise.all(documents.map(async (docId) => this.migrateDocument(drive, docId)));
28823
- }
29125
+ let cursor;
29126
+ do {
29127
+ const { documents: drives, nextCursor } = await this.findByType("powerhouse/document-drive", 100, cursor);
29128
+ for (const drive of drives) {
29129
+ await this.migrateDrive(drive);
29130
+ const documents = await this.getChildren(drive);
29131
+ await Promise.all(documents.map(async (docId) => this.migrateDocument(drive, docId)));
29132
+ }
29133
+ cursor = nextCursor;
29134
+ } while (cursor);
28824
29135
  }
28825
29136
  async migrateDrive(driveId) {
28826
29137
  const drive = await this.get(driveId);
@@ -28894,8 +29205,11 @@ const getReactorDefaultDrivesConfig = () => {
28894
29205
  }
28895
29206
  };
28896
29207
  };
28897
- function createBrowserDocumentDriveServer(documentModels, routerBasename) {
28898
- return new ReactorBuilder(documentModels).withStorage(new BrowserStorage(routerBasename)).withCache(new InMemoryCache()).withQueueManager(new BaseQueueManager(1, 10)).withOptions({ ...getReactorDefaultDrivesConfig() }).build();
29208
+ function createBrowserStorage(routerBasename) {
29209
+ return new BrowserStorage(routerBasename);
29210
+ }
29211
+ function createBrowserDocumentDriveServer(documentModels, storage) {
29212
+ return new ReactorBuilder(documentModels).withStorage(storage).withCache(new InMemoryCache()).withQueueManager(new BaseQueueManager(1, 10)).withOptions({ ...getReactorDefaultDrivesConfig() }).build();
28899
29213
  }
28900
29214
  const VERSION_CHECK_INTERVAL = parseInt(window.__VITE_ENVS.PH_CONNECT_VERSION_CHECK_INTERVAL) || 60 * 60 * 1e3;
28901
29215
  const basePath = connectConfig.routerBasename;
@@ -31454,14 +31768,14 @@ if (window.__VITE_ENVS.MODE === "development") {
31454
31768
  } else {
31455
31769
  serviceWorkerManager.registerServiceWorker(false);
31456
31770
  }
31457
- const App = lazy(() => __vitePreload(() => import("./app-L-nqsJL1.js").then((n) => n.a_), true ? __vite__mapDeps([0,1,2]) : void 0));
31771
+ const App = lazy(() => __vitePreload(() => import("./app-B5yYl0zv.js").then((n) => n.bs), true ? __vite__mapDeps([0,1,2]) : void 0));
31458
31772
  const AppLoader = /* @__PURE__ */ jsx(Suspense, { children: /* @__PURE__ */ jsx(App, {}) });
31459
31773
  const appLoader = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
31460
31774
  __proto__: null,
31461
31775
  default: AppLoader
31462
31776
  }, Symbol.toStringTag, { value: "Module" }));
31463
31777
  export {
31464
- getDefaultExportFromCjs as $,
31778
+ Icon as $,
31465
31779
  AddStateExampleInputSchema as A,
31466
31780
  SetModuleDescriptionInputSchema as B,
31467
31781
  SetModuleNameInputSchema as C,
@@ -31488,148 +31802,148 @@ export {
31488
31802
  baseLoadFromFile as X,
31489
31803
  baseLoadFromInput as Y,
31490
31804
  pascalCase as Z,
31491
- Icon as _,
31805
+ logger$1 as _,
31492
31806
  createReducer as a,
31493
- DELETE as a$,
31494
- LOCAL as a0,
31495
- commonjsGlobal as a1,
31496
- PUBLIC as a2,
31807
+ getNamedType as a$,
31808
+ getDefaultExportFromCjs as a0,
31809
+ LOCAL as a1,
31810
+ commonjsGlobal as a2,
31497
31811
  SWITCHBOARD as a3,
31498
- locationInfoByLocation as a4,
31499
- sharingTypeOptions as a5,
31500
- objectType as a6,
31501
- recordType as a7,
31812
+ PUBLIC as a4,
31813
+ locationInfoByLocation as a5,
31814
+ sharingTypeOptions as a6,
31815
+ objectType as a7,
31502
31816
  stringType as a8,
31503
- capitalCase as a9,
31504
- moveNode as aA,
31505
- generateNodesCopy as aB,
31506
- copyNode as aC,
31507
- createState as aD,
31508
- setDriveName as aE,
31509
- setAvailableOffline as aF,
31510
- setSharingType as aG,
31511
- SynchronizationUnitNotFoundError as aH,
31512
- removeTrigger as aI,
31513
- generateUUID as aJ,
31514
- PullResponderTransmitter as aK,
31515
- addTrigger as aL,
31516
- ReadDriveNotFoundError as aM,
31517
- openUrl as aN,
31518
- getNodeOptions as aO,
31519
- DRIVE as aP,
31520
- FOLDER as aQ,
31521
- requestPublicDrive as aR,
31522
- serviceWorkerManager as aS,
31523
- packageJson as aT,
31524
- t as aU,
31525
- gql as aV,
31526
- request as aW,
31527
- getDimensions as aX,
31528
- READ as aY,
31529
- nodeOptionsMap as aZ,
31530
- defaultFileOptions as a_,
31531
- CLOUD as aa,
31532
- createZip as ab,
31533
- logger$1 as ac,
31817
+ recordType as a9,
31818
+ updateNode as aA,
31819
+ FILE as aB,
31820
+ moveNode as aC,
31821
+ generateNodesCopy as aD,
31822
+ copyNode as aE,
31823
+ createState as aF,
31824
+ setDriveName as aG,
31825
+ setAvailableOffline as aH,
31826
+ setSharingType as aI,
31827
+ SynchronizationUnitNotFoundError as aJ,
31828
+ removeTrigger as aK,
31829
+ PullResponderTransmitter as aL,
31830
+ addTrigger as aM,
31831
+ ReadDriveNotFoundError as aN,
31832
+ openUrl as aO,
31833
+ getNodeOptions as aP,
31834
+ DRIVE as aQ,
31835
+ FOLDER as aR,
31836
+ requestPublicDrive as aS,
31837
+ serviceWorkerManager as aT,
31838
+ packageJson as aU,
31839
+ t as aV,
31840
+ gql as aW,
31841
+ request as aX,
31842
+ inspect as aY,
31843
+ GraphQLError as aZ,
31844
+ invariant as a_,
31845
+ capitalCase as aa,
31846
+ CLOUD as ab,
31847
+ createZip as ac,
31534
31848
  LZString as ad,
31535
31849
  buildSignedOperation as ae,
31536
- getI18n as af,
31537
- getDefaults as ag,
31850
+ getDefaults as af,
31851
+ getI18n as ag,
31538
31852
  connectConfig as ah,
31539
31853
  hashDocumentStateForScope as ai,
31540
31854
  getAugmentedNamespace as aj,
31541
- setErrorHandler as ak,
31542
- driveDocumentModelModule as al,
31543
- createBrowserDocumentDriveServer as am,
31544
- hashKey as an,
31545
- childLogger as ao,
31546
- reducer as ap,
31547
- isDocumentDrive as aq,
31548
- generateAddNodeAction as ar,
31549
- isFileNode as as,
31550
- uploadDocumentOperations as at,
31551
- updateFile as au,
31552
- addFolder as av,
31553
- isFolderNode as aw,
31554
- deleteNode as ax,
31555
- updateNode as ay,
31556
- FILE as az,
31855
+ childLogger as ak,
31856
+ process as al,
31857
+ setErrorHandler as am,
31858
+ driveDocumentModelModule as an,
31859
+ createBrowserStorage as ao,
31860
+ createBrowserDocumentDriveServer as ap,
31861
+ generateId as aq,
31862
+ reducer as ar,
31863
+ isDocumentDrive as as,
31864
+ generateAddNodeAction as at,
31865
+ isFileNode as au,
31866
+ uploadDocumentOperations as av,
31867
+ updateFile as aw,
31868
+ addFolder as ax,
31869
+ isFolderNode as ay,
31870
+ deleteNode as az,
31557
31871
  SetStateSchemaInputSchema as b,
31558
- TypeNameMetaFieldDef as b$,
31559
- RENAME as b0,
31560
- WRITE as b1,
31561
- DUPLICATE as b2,
31562
- defaultFolderOptions as b3,
31563
- garbageCollect as b4,
31564
- sortOperations as b5,
31565
- UI_NODE as b6,
31566
- generateId as b7,
31567
- undo as b8,
31568
- redo as b9,
31569
- GraphQLInt as bA,
31570
- GraphQLDirective as bB,
31571
- GraphQLObjectType as bC,
31572
- GraphQLInterfaceType as bD,
31573
- GraphQLUnionType as bE,
31574
- GraphQLInputObjectType as bF,
31575
- GraphQLEnumType as bG,
31576
- isListType as bH,
31577
- GraphQLList as bI,
31578
- isNonNullType as bJ,
31579
- GraphQLNonNull as bK,
31580
- isNamedType as bL,
31581
- getNullableType as bM,
31582
- isLeafType as bN,
31583
- GraphQLSchema as bO,
31584
- buildSchema as bP,
31585
- buildASTSchema as bQ,
31586
- parse as bR,
31587
- validate as bS,
31588
- visit as bT,
31589
- extendSchema as bU,
31590
- snakeCase as bV,
31591
- constantCase as bW,
31592
- isAbstractType as bX,
31593
- BREAK as bY,
31594
- SchemaMetaFieldDef as bZ,
31595
- TypeMetaFieldDef as b_,
31596
- useDocumentDispatch as ba,
31597
- inspect as bb,
31598
- GraphQLError as bc,
31599
- getNamedType as bd,
31600
- invariant as be,
31601
- isInputObjectType as bf,
31602
- isScalarType as bg,
31603
- isObjectType as bh,
31604
- isInterfaceType as bi,
31605
- isUnionType as bj,
31606
- isEnumType as bk,
31607
- print as bl,
31608
- isPrintableAsBlockString as bm,
31609
- Kind as bn,
31610
- astFromValue as bo,
31611
- DEFAULT_DEPRECATION_REASON as bp,
31612
- isSpecifiedDirective as bq,
31613
- isSpecifiedScalarType as br,
31614
- isIntrospectionType as bs,
31615
- z as bt,
31616
- GraphQLScalarType as bu,
31617
- specifiedRules as bv,
31618
- GraphQLID as bw,
31619
- GraphQLBoolean as bx,
31620
- GraphQLString as by,
31621
- GraphQLFloat as bz,
31872
+ DUPLICATE as b$,
31873
+ isInputObjectType as b0,
31874
+ isScalarType as b1,
31875
+ isObjectType as b2,
31876
+ isInterfaceType as b3,
31877
+ isUnionType as b4,
31878
+ isEnumType as b5,
31879
+ astFromValue as b6,
31880
+ print as b7,
31881
+ DEFAULT_DEPRECATION_REASON as b8,
31882
+ Kind as b9,
31883
+ isInputType as bA,
31884
+ GraphQLBoolean as bB,
31885
+ assertAbstractType as bC,
31886
+ doTypesOverlap as bD,
31887
+ DirectiveLocation as bE,
31888
+ specifiedRules as bF,
31889
+ NoUnusedFragmentsRule as bG,
31890
+ ExecutableDefinitionsRule as bH,
31891
+ validate as bI,
31892
+ validateSchema as bJ,
31893
+ GraphQLID as bK,
31894
+ GraphQLString as bL,
31895
+ GraphQLFloat as bM,
31896
+ GraphQLInt as bN,
31897
+ GraphQLDirective as bO,
31898
+ GraphQLUnionType as bP,
31899
+ isNonNullType as bQ,
31900
+ GraphQLNonNull as bR,
31901
+ isNamedType as bS,
31902
+ isLeafType as bT,
31903
+ GraphQLSchema as bU,
31904
+ buildSchema as bV,
31905
+ sentenceCase as bW,
31906
+ getDimensions as bX,
31907
+ READ as bY,
31908
+ nodeOptionsMap as bZ,
31909
+ defaultFileOptions as b_,
31910
+ isPrintableAsBlockString as ba,
31911
+ isSpecifiedDirective as bb,
31912
+ isSpecifiedScalarType as bc,
31913
+ isIntrospectionType as bd,
31914
+ z as be,
31915
+ GraphQLScalarType as bf,
31916
+ parse as bg,
31917
+ visit as bh,
31918
+ buildASTSchema as bi,
31919
+ extendSchema as bj,
31920
+ getNullableType as bk,
31921
+ isListType as bl,
31922
+ snakeCase as bm,
31923
+ constantCase as bn,
31924
+ isAbstractType as bo,
31925
+ BREAK as bp,
31926
+ GraphQLInputObjectType as bq,
31927
+ GraphQLList as br,
31928
+ GraphQLEnumType as bs,
31929
+ GraphQLObjectType as bt,
31930
+ GraphQLInterfaceType as bu,
31931
+ SchemaMetaFieldDef as bv,
31932
+ TypeMetaFieldDef as bw,
31933
+ TypeNameMetaFieldDef as bx,
31934
+ isCompositeType as by,
31935
+ isOutputType as bz,
31622
31936
  createAction as c,
31623
- isCompositeType as c0,
31624
- isOutputType as c1,
31625
- isInputType as c2,
31626
- assertAbstractType as c3,
31627
- doTypesOverlap as c4,
31628
- DirectiveLocation as c5,
31629
- NoUnusedFragmentsRule as c6,
31630
- ExecutableDefinitionsRule as c7,
31631
- validateSchema as c8,
31632
- sentenceCase as c9,
31937
+ RENAME as c0,
31938
+ WRITE as c1,
31939
+ DELETE as c2,
31940
+ defaultFolderOptions as c3,
31941
+ garbageCollect as c4,
31942
+ sortOperations as c5,
31943
+ UI_NODE as c6,
31944
+ undo as c7,
31945
+ redo as c8,
31946
+ useDocumentDispatch as c9,
31633
31947
  appLoader as ca,
31634
31948
  ReorderModuleOperationsInputSchema as d,
31635
31949
  DeleteOperationInputSchema as e,
@@ -31655,3 +31969,4 @@ export {
31655
31969
  ReorderModulesInputSchema as y,
31656
31970
  DeleteModuleInputSchema as z
31657
31971
  };
31972
+ //# sourceMappingURL=app-loader-CmEZOj3m.js.map