@powerhousedao/connect 1.0.21-staging.0 → 1.0.22-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-CDOWlDp2.css → app-CmlD3Pwe.css} +119 -1
  3. package/dist/assets/{app-B2txMMB6.js → app-DOR_8r1B.js} +8655 -3165
  4. package/dist/assets/app-DOR_8r1B.js.map +1 -0
  5. package/dist/assets/{app-loader-DiF8OhX3.css → app-loader-DaCxVT0x.css} +134 -0
  6. package/dist/assets/{app-loader-uTr5bb-C.js → app-loader-uXeiy6sl.js} +653 -356
  7. package/dist/assets/app-loader-uXeiy6sl.js.map +1 -0
  8. package/dist/assets/browser-B5bfipse.js +27234 -0
  9. package/dist/assets/browser-B5bfipse.js.map +1 -0
  10. package/dist/assets/{ccip-Eu5ix3yZ.js → ccip-Cu6cyUtU.js} +4 -3
  11. package/dist/assets/ccip-Cu6cyUtU.js.map +1 -0
  12. package/dist/assets/{content-ZNvpO_Bf.js → content-Cxj0K1dm.js} +1051 -374
  13. package/dist/assets/content-Cxj0K1dm.js.map +1 -0
  14. package/dist/assets/{index-BQuSynqj.js → index-B7pq58I6.js} +7 -6
  15. package/dist/assets/index-B7pq58I6.js.map +1 -0
  16. package/dist/assets/{index-CXtQlZED.js → index-BBO5Ckrr.js} +21 -15
  17. package/dist/assets/index-BBO5Ckrr.js.map +1 -0
  18. package/dist/assets/index-CT91u5m_.js +208 -0
  19. package/dist/assets/index-CT91u5m_.js.map +1 -0
  20. package/dist/assets/{index-CdCNoFiu.js → index-Ct3xGcDm.js} +4 -3
  21. package/dist/assets/index-Ct3xGcDm.js.map +1 -0
  22. package/dist/assets/{main.D6_W-5oY.js → main.CMSwP7lX.js} +2 -1
  23. package/dist/assets/main.CMSwP7lX.js.map +1 -0
  24. package/dist/assets/reactor-analytics-CrWekgnx.js +44 -0
  25. package/dist/assets/reactor-analytics-CrWekgnx.js.map +1 -0
  26. package/dist/assets/router-BDGkWvYS.js +1585 -0
  27. package/dist/assets/router-BDGkWvYS.js.map +1 -0
  28. package/dist/assets/{style-Ce3V83BE.css → style-BPUyhu8E.css} +3 -0
  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 +10 -9
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/app-B2txMMB6.js","assets/main.D6_W-5oY.js","assets/app-CDOWlDp2.css"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/app-DOR_8r1B.js","assets/main.CMSwP7lX.js","assets/app-CmlD3Pwe.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.D6_W-5oY.js";
14
+ import { _ as __vitePreload } from "./main.CMSwP7lX.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,7 +170,7 @@ 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
  }
@@ -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);
@@ -7117,6 +7154,7 @@ function createReducer(stateReducer2, documentReducer = baseReducer) {
7117
7154
  function baseCreateExtendedState(initialState, createState2) {
7118
7155
  return {
7119
7156
  name: "",
7157
+ slug: "",
7120
7158
  documentType: "",
7121
7159
  revision: {
7122
7160
  global: 0,
@@ -7144,10 +7182,6 @@ function baseCreateDocument(initialState, createState2) {
7144
7182
  function hashDocumentStateForScope(document, scope = "global") {
7145
7183
  return hash(cjsModule(document.state[scope] || ""));
7146
7184
  }
7147
- const hashKey = (date, randomLimit = 1e3) => {
7148
- const random = Math.random() * randomLimit;
7149
- return hash(`${(/* @__PURE__ */ new Date()).toISOString()}${random}`);
7150
- };
7151
7185
  function getDocumentLastModified(document) {
7152
7186
  var _a2;
7153
7187
  const sortedOperations = sortOperations(Object.values(document.operations).flat());
@@ -7196,6 +7230,9 @@ function replayDocument(initialState, operations, reducer2, dispatch, header, sk
7196
7230
  operationsToReplay.push(...Object.values(operations).flat());
7197
7231
  }
7198
7232
  const document = baseCreateDocument(documentState);
7233
+ if (header == null ? void 0 : header.slug) {
7234
+ document.slug = header.slug;
7235
+ }
7199
7236
  document.initialState = initialState;
7200
7237
  document.operations = initialOperations;
7201
7238
  let result = document;
@@ -7534,21 +7571,186 @@ function UpdateStateExampleInputSchema() {
7534
7571
  newExample: z.string()
7535
7572
  });
7536
7573
  }
7574
+ var dist = {};
7575
+ var hasRequiredDist;
7576
+ function requireDist() {
7577
+ if (hasRequiredDist) return dist;
7578
+ hasRequiredDist = 1;
7579
+ (function(exports) {
7580
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
7581
+ function getDefaultExportFromCjs2(x) {
7582
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
7583
+ }
7584
+ var browser = { exports: {} };
7585
+ var process2 = browser.exports = {};
7586
+ var cachedSetTimeout;
7587
+ var cachedClearTimeout;
7588
+ function defaultSetTimout() {
7589
+ throw new Error("setTimeout has not been defined");
7590
+ }
7591
+ function defaultClearTimeout() {
7592
+ throw new Error("clearTimeout has not been defined");
7593
+ }
7594
+ (function() {
7595
+ try {
7596
+ if (typeof setTimeout === "function") {
7597
+ cachedSetTimeout = setTimeout;
7598
+ } else {
7599
+ cachedSetTimeout = defaultSetTimout;
7600
+ }
7601
+ } catch (e) {
7602
+ cachedSetTimeout = defaultSetTimout;
7603
+ }
7604
+ try {
7605
+ if (typeof clearTimeout === "function") {
7606
+ cachedClearTimeout = clearTimeout;
7607
+ } else {
7608
+ cachedClearTimeout = defaultClearTimeout;
7609
+ }
7610
+ } catch (e) {
7611
+ cachedClearTimeout = defaultClearTimeout;
7612
+ }
7613
+ })();
7614
+ function runTimeout(fun) {
7615
+ if (cachedSetTimeout === setTimeout) {
7616
+ return setTimeout(fun, 0);
7617
+ }
7618
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
7619
+ cachedSetTimeout = setTimeout;
7620
+ return setTimeout(fun, 0);
7621
+ }
7622
+ try {
7623
+ return cachedSetTimeout(fun, 0);
7624
+ } catch (e) {
7625
+ try {
7626
+ return cachedSetTimeout.call(null, fun, 0);
7627
+ } catch (e2) {
7628
+ return cachedSetTimeout.call(this, fun, 0);
7629
+ }
7630
+ }
7631
+ }
7632
+ function runClearTimeout(marker) {
7633
+ if (cachedClearTimeout === clearTimeout) {
7634
+ return clearTimeout(marker);
7635
+ }
7636
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
7637
+ cachedClearTimeout = clearTimeout;
7638
+ return clearTimeout(marker);
7639
+ }
7640
+ try {
7641
+ return cachedClearTimeout(marker);
7642
+ } catch (e) {
7643
+ try {
7644
+ return cachedClearTimeout.call(null, marker);
7645
+ } catch (e2) {
7646
+ return cachedClearTimeout.call(this, marker);
7647
+ }
7648
+ }
7649
+ }
7650
+ var queue = [];
7651
+ var draining = false;
7652
+ var currentQueue;
7653
+ var queueIndex = -1;
7654
+ function cleanUpNextTick() {
7655
+ if (!draining || !currentQueue) {
7656
+ return;
7657
+ }
7658
+ draining = false;
7659
+ if (currentQueue.length) {
7660
+ queue = currentQueue.concat(queue);
7661
+ } else {
7662
+ queueIndex = -1;
7663
+ }
7664
+ if (queue.length) {
7665
+ drainQueue();
7666
+ }
7667
+ }
7668
+ function drainQueue() {
7669
+ if (draining) {
7670
+ return;
7671
+ }
7672
+ var timeout = runTimeout(cleanUpNextTick);
7673
+ draining = true;
7674
+ var len = queue.length;
7675
+ while (len) {
7676
+ currentQueue = queue;
7677
+ queue = [];
7678
+ while (++queueIndex < len) {
7679
+ if (currentQueue) {
7680
+ currentQueue[queueIndex].run();
7681
+ }
7682
+ }
7683
+ queueIndex = -1;
7684
+ len = queue.length;
7685
+ }
7686
+ currentQueue = null;
7687
+ draining = false;
7688
+ runClearTimeout(timeout);
7689
+ }
7690
+ process2.nextTick = function(fun) {
7691
+ var args = new Array(arguments.length - 1);
7692
+ if (arguments.length > 1) {
7693
+ for (var i = 1; i < arguments.length; i++) {
7694
+ args[i - 1] = arguments[i];
7695
+ }
7696
+ }
7697
+ queue.push(new Item(fun, args));
7698
+ if (queue.length === 1 && !draining) {
7699
+ runTimeout(drainQueue);
7700
+ }
7701
+ };
7702
+ function Item(fun, array) {
7703
+ this.fun = fun;
7704
+ this.array = array;
7705
+ }
7706
+ Item.prototype.run = function() {
7707
+ this.fun.apply(null, this.array);
7708
+ };
7709
+ process2.title = "browser";
7710
+ process2.browser = true;
7711
+ process2.env = {};
7712
+ process2.argv = [];
7713
+ process2.version = "";
7714
+ process2.versions = {};
7715
+ function noop2() {
7716
+ }
7717
+ process2.on = noop2;
7718
+ process2.addListener = noop2;
7719
+ process2.once = noop2;
7720
+ process2.off = noop2;
7721
+ process2.removeListener = noop2;
7722
+ process2.removeAllListeners = noop2;
7723
+ process2.emit = noop2;
7724
+ process2.prependListener = noop2;
7725
+ process2.prependOnceListener = noop2;
7726
+ process2.listeners = function(name2) {
7727
+ return [];
7728
+ };
7729
+ process2.binding = function(name2) {
7730
+ throw new Error("process.binding is not supported");
7731
+ };
7732
+ process2.cwd = function() {
7733
+ return "/";
7734
+ };
7735
+ process2.chdir = function(dir) {
7736
+ throw new Error("process.chdir is not supported");
7737
+ };
7738
+ process2.umask = function() {
7739
+ return 0;
7740
+ };
7741
+ var browserExports = browser.exports;
7742
+ const process$1 = /* @__PURE__ */ getDefaultExportFromCjs2(browserExports);
7743
+ exports.default = process$1;
7744
+ exports.process = process$1;
7745
+ })(dist);
7746
+ return dist;
7747
+ }
7748
+ var distExports = requireDist();
7749
+ const process = /* @__PURE__ */ getDefaultExportFromCjs(distExports);
7537
7750
  function commonjsRequire(path) {
7538
7751
  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
7752
  }
7540
7753
  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
7754
  var hasRequiredJszip_min;
7553
7755
  function requireJszip_min() {
7554
7756
  if (hasRequiredJszip_min) return jszip_min.exports;
@@ -10323,9 +10525,10 @@ function validateOperations(operations) {
10323
10525
  }
10324
10526
  function createZip(document) {
10325
10527
  const zip = new JSZip();
10326
- const { name: name2, revision, documentType: documentType2, created, lastModified } = document;
10528
+ const { name: name2, slug, revision, documentType: documentType2, created, lastModified } = document;
10327
10529
  const header = {
10328
10530
  name: name2,
10531
+ slug,
10329
10532
  revision,
10330
10533
  documentType: documentType2,
10331
10534
  created,
@@ -10740,40 +10943,60 @@ const reducer$2 = {
10740
10943
  state.triggers = state.triggers.filter((trigger) => trigger.id !== action.input.triggerId);
10741
10944
  }
10742
10945
  };
10743
- const byteToHex = [];
10744
- for (let i = 0; i < 256; ++i) {
10745
- byteToHex.push((i + 256).toString(16).slice(1));
10946
+ class DocumentModelNotFoundError extends Error {
10947
+ constructor(id, cause) {
10948
+ super(`Document model "${id}" not found`, { cause });
10949
+ __publicField(this, "id");
10950
+ this.id = id;
10951
+ }
10952
+ }
10953
+ class OperationError extends Error {
10954
+ constructor(status, operation, message, cause) {
10955
+ super(message, { cause: cause ?? operation });
10956
+ __publicField(this, "status");
10957
+ __publicField(this, "operation");
10958
+ this.status = status;
10959
+ this.operation = operation;
10960
+ }
10746
10961
  }
10747
- function unsafeStringify(arr, offset = 0) {
10748
- 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();
10962
+ class ConflictOperationError extends OperationError {
10963
+ constructor(existingOperation, newOperation) {
10964
+ super("CONFLICT", newOperation, `Conflicting operation on index ${newOperation.index}`, { existingOperation, newOperation });
10965
+ }
10749
10966
  }
10750
- let getRandomValues;
10751
- const rnds8 = new Uint8Array(16);
10752
- function rng() {
10753
- if (!getRandomValues) {
10754
- if (typeof crypto === "undefined" || !crypto.getRandomValues) {
10755
- throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
10756
- }
10757
- getRandomValues = crypto.getRandomValues.bind(crypto);
10967
+ class DocumentIdValidationError extends Error {
10968
+ constructor(documentId) {
10969
+ super(`Invalid document id: ${documentId}`);
10758
10970
  }
10759
- return getRandomValues(rnds8);
10760
10971
  }
10761
- const randomUUID = typeof crypto !== "undefined" && crypto.randomUUID && crypto.randomUUID.bind(crypto);
10762
- const native = { randomUUID };
10763
- function v4(options, buf, offset) {
10764
- var _a2;
10765
- if (native.randomUUID && true && !options) {
10766
- return native.randomUUID();
10972
+ class DocumentSlugValidationError extends Error {
10973
+ constructor(slug) {
10974
+ super(`Invalid slug: ${slug}`);
10975
+ }
10976
+ }
10977
+ class DocumentAlreadyExistsError extends Error {
10978
+ constructor(documentId) {
10979
+ super(`Document with id ${documentId} uses id or slug that already exists`);
10980
+ __publicField(this, "documentId");
10981
+ this.documentId = documentId;
10767
10982
  }
10768
- options = options || {};
10769
- const rnds = options.random ?? ((_a2 = options.rng) == null ? void 0 : _a2.call(options)) ?? rng();
10770
- if (rnds.length < 16) {
10771
- throw new Error("Random bytes length must be >= 16");
10983
+ }
10984
+ class DocumentNotFoundError extends Error {
10985
+ constructor(documentId) {
10986
+ super(`Document with id ${documentId} not found`);
10987
+ __publicField(this, "documentId");
10988
+ this.documentId = documentId;
10772
10989
  }
10773
- rnds[6] = rnds[6] & 15 | 64;
10774
- rnds[8] = rnds[8] & 63 | 128;
10775
- return unsafeStringify(rnds);
10776
10990
  }
10991
+ class SynchronizationUnitNotFoundError extends Error {
10992
+ constructor(message, syncUnitId) {
10993
+ super(message);
10994
+ __publicField(this, "syncUnitId");
10995
+ this.syncUnitId = syncUnitId;
10996
+ }
10997
+ }
10998
+ const isValidDocumentId = (id) => /^[a-zA-Z0-9_-]+$/.test(id);
10999
+ const isValidSlug = (slug) => /^[a-zA-Z0-9_-]+$/.test(slug);
10777
11000
  function isFileNode(node) {
10778
11001
  return node.kind === "file";
10779
11002
  }
@@ -10837,7 +11060,7 @@ function generateNodesCopy(src, idGenerator, nodes) {
10837
11060
  function generateSynchronizationUnitId(nodes) {
10838
11061
  let syncId = "";
10839
11062
  while (!syncId || nodes.find((node) => isFileNode(node) && node.synchronizationUnits.find((unit) => unit.syncId === syncId))) {
10840
- syncId = v4();
11063
+ syncId = generateId();
10841
11064
  }
10842
11065
  return syncId;
10843
11066
  }
@@ -10915,6 +11138,9 @@ const reducer$1 = {
10915
11138
  if (state.nodes.find((node) => node.id === action.input.id)) {
10916
11139
  throw new Error(`Node with id ${action.input.id} already exists!`);
10917
11140
  }
11141
+ if (!isValidDocumentId(action.input.id)) {
11142
+ throw new DocumentIdValidationError(action.input.id);
11143
+ }
10918
11144
  const name2 = handleTargetNameCollisions({
10919
11145
  nodes: state.nodes,
10920
11146
  srcName: action.input.name,
@@ -11007,6 +11233,9 @@ const reducer$1 = {
11007
11233
  if (!node) {
11008
11234
  throw new Error(`Node with id ${action.input.srcId} not found`);
11009
11235
  }
11236
+ if (!isValidDocumentId(action.input.targetId)) {
11237
+ throw new DocumentIdValidationError(action.input.targetId);
11238
+ }
11010
11239
  const duplicatedNode = state.nodes.find((node2) => node2.id === action.input.targetId);
11011
11240
  if (duplicatedNode) {
11012
11241
  throw new Error(`Node with id ${action.input.targetId} already exists`);
@@ -11018,8 +11247,9 @@ const reducer$1 = {
11018
11247
  });
11019
11248
  const newNode = {
11020
11249
  ...node,
11021
- name: name2,
11022
11250
  id: action.input.targetId,
11251
+ slug: action.input.targetId,
11252
+ name: name2,
11023
11253
  parentFolder: action.input.targetParentFolder || null
11024
11254
  };
11025
11255
  const isFile = isFileNode(newNode);
@@ -11154,8 +11384,7 @@ const initialGlobalState = {
11154
11384
  id: "",
11155
11385
  name: "",
11156
11386
  nodes: [],
11157
- icon: null,
11158
- slug: null
11387
+ icon: null
11159
11388
  };
11160
11389
  const initialLocalState = {
11161
11390
  listeners: [],
@@ -11495,7 +11724,7 @@ _errorHandler = new WeakMap();
11495
11724
  _ConsoleLogger_instances = new WeakSet();
11496
11725
  levelValue_get = function() {
11497
11726
  if (__privateGet(this, _levelString) === "env") {
11498
- const envLevel = typeof process !== "undefined" ? define_process_env_default.LOG_LEVEL : void 0;
11727
+ const envLevel = typeof process !== "undefined" && "env" in process ? define_process_env_default.LOG_LEVEL : void 0;
11499
11728
  if (!envLevel) {
11500
11729
  return LEVELS.debug;
11501
11730
  }
@@ -11526,48 +11755,6 @@ const childLogger = (tags) => {
11526
11755
  logger2.errorHandler = errorHandler;
11527
11756
  return logger2;
11528
11757
  };
11529
- class DocumentModelNotFoundError extends Error {
11530
- constructor(id, cause) {
11531
- super(`Document model "${id}" not found`, { cause });
11532
- __publicField(this, "id");
11533
- this.id = id;
11534
- }
11535
- }
11536
- class OperationError extends Error {
11537
- constructor(status, operation, message, cause) {
11538
- super(message, { cause: cause ?? operation });
11539
- __publicField(this, "status");
11540
- __publicField(this, "operation");
11541
- this.status = status;
11542
- this.operation = operation;
11543
- }
11544
- }
11545
- class ConflictOperationError extends OperationError {
11546
- constructor(existingOperation, newOperation) {
11547
- super("CONFLICT", newOperation, `Conflicting operation on index ${newOperation.index}`, { existingOperation, newOperation });
11548
- }
11549
- }
11550
- class DocumentAlreadyExistsError extends Error {
11551
- constructor(documentId) {
11552
- super(`Document with id ${documentId} already exists`);
11553
- __publicField(this, "documentId");
11554
- this.documentId = documentId;
11555
- }
11556
- }
11557
- class DocumentNotFoundError extends Error {
11558
- constructor(documentId) {
11559
- super(`Document with id ${documentId} not found`);
11560
- __publicField(this, "documentId");
11561
- this.documentId = documentId;
11562
- }
11563
- }
11564
- class SynchronizationUnitNotFoundError extends Error {
11565
- constructor(message, syncUnitId) {
11566
- super(message);
11567
- __publicField(this, "syncUnitId");
11568
- this.syncUnitId = syncUnitId;
11569
- }
11570
- }
11571
11758
  var RunAsap;
11572
11759
  (function(RunAsap2) {
11573
11760
  RunAsap2.useMessageChannel = (() => {
@@ -11707,9 +11894,6 @@ function mergeOperations(currentOperations, newOperations) {
11707
11894
  return { ...acc, [curr.scope]: [...existingOperations, curr] };
11708
11895
  }, currentOperations);
11709
11896
  }
11710
- function generateUUID() {
11711
- return generateId();
11712
- }
11713
11897
  function isBefore(dateA, dateB) {
11714
11898
  return new Date(dateA) < new Date(dateB);
11715
11899
  }
@@ -11810,7 +11994,7 @@ class BaseQueueManager {
11810
11994
  if (!this.delegate) {
11811
11995
  throw new Error("No server delegate defined");
11812
11996
  }
11813
- const jobId = generateUUID();
11997
+ const jobId = generateId();
11814
11998
  const queue = this.getQueue(job.driveId, job.documentId);
11815
11999
  if (await queue.isDeleted()) {
11816
12000
  throw new Error("Queue is deleted");
@@ -22234,7 +22418,7 @@ class ReadModeService {
22234
22418
  return Promise.resolve(result ? { ...result.drive, readContext: result.context } : new ReadDriveNotFoundError(id));
22235
22419
  }
22236
22420
  async getReadDriveBySlug(slug) {
22237
- const readDrive = [...__privateGet(this, _drives).values()].find(({ drive }) => drive.state.global.slug === slug);
22421
+ const readDrive = [...__privateGet(this, _drives).values()].find(({ drive }) => drive.slug === slug);
22238
22422
  return Promise.resolve(readDrive ? { ...readDrive.drive, readContext: readDrive.context } : new ReadDriveSlugNotFoundError(slug));
22239
22423
  }
22240
22424
  getReadDriveContext(id) {
@@ -22863,7 +23047,7 @@ class PullResponderTransmitter {
22863
23047
  };
22864
23048
  const listenerId = await PullResponderTransmitter.registerPullResponder(driveId, url, filter);
22865
23049
  const pullTrigger = {
22866
- id: generateUUID(),
23050
+ id: generateId(),
22867
23051
  type: "PullResponder",
22868
23052
  driveId,
22869
23053
  filter,
@@ -23296,7 +23480,7 @@ class BaseDocumentDriveServer {
23296
23480
  async _initializeDrive(driveId) {
23297
23481
  var _a2, _b, _c;
23298
23482
  const drive = await this.getDrive(driveId);
23299
- this.logger.verbose(`[SYNC DEBUG] Initializing drive ${driveId} with slug "${drive.state.global.slug}"`);
23483
+ this.logger.verbose(`[SYNC DEBUG] Initializing drive ${driveId} with slug "${drive.slug}"`);
23300
23484
  await this.synchronizationManager.initializeDriveSyncStatus(driveId, drive);
23301
23485
  if (this.shouldSyncRemoteDrive(drive)) {
23302
23486
  this.logger.verbose(`[SYNC DEBUG] Starting sync for remote drive ${driveId}`);
@@ -23372,23 +23556,22 @@ class BaseDocumentDriveServer {
23372
23556
  return [...this.documentModelModules];
23373
23557
  }
23374
23558
  async addDrive(input, preferredEditor) {
23375
- const id = input.global.id || generateUUID();
23559
+ const id = input.global.id || generateId();
23376
23560
  if (!id) {
23377
23561
  throw new Error("Invalid Drive Id");
23378
23562
  }
23379
- const drives = await this.legacyStorage.getDrives();
23380
- if (drives.includes(id)) {
23381
- throw new DocumentAlreadyExistsError(id);
23382
- }
23383
23563
  const document = createDocument({
23384
23564
  state: input
23385
23565
  });
23566
+ if (input.slug && input.slug.length > 0) {
23567
+ document.slug = input.slug;
23568
+ }
23386
23569
  document.meta = {
23387
23570
  preferredEditor
23388
23571
  };
23389
- await this.legacyStorage.createDrive(id, document);
23390
- if (input.global.slug) {
23391
- await this.cache.deleteDriveBySlug(input.global.slug);
23572
+ await this.documentStorage.create(id, document);
23573
+ if (input.slug && input.slug.length > 0) {
23574
+ await this.cache.deleteDriveBySlug(input.slug);
23392
23575
  }
23393
23576
  await this._initializeDrive(id);
23394
23577
  this.eventEmitter.emit("driveAdded", document);
@@ -23402,10 +23585,10 @@ class BaseDocumentDriveServer {
23402
23585
  pullInterval
23403
23586
  });
23404
23587
  return await this.addDrive({
23588
+ slug,
23405
23589
  global: {
23406
23590
  id,
23407
23591
  name: name2,
23408
- slug,
23409
23592
  icon: icon ?? null
23410
23593
  },
23411
23594
  local: {
@@ -23421,16 +23604,25 @@ class BaseDocumentDriveServer {
23421
23604
  this.stopSyncRemoteDrive(driveId),
23422
23605
  this.listenerManager.removeDrive(driveId),
23423
23606
  this.cache.deleteDrive(driveId),
23424
- this.legacyStorage.deleteDrive(driveId)
23607
+ this.documentStorage.delete(driveId)
23425
23608
  ]);
23609
+ this.eventEmitter.emit("driveDeleted", driveId);
23426
23610
  result.forEach((r) => {
23427
23611
  if (r.status === "rejected") {
23428
23612
  throw r.reason;
23429
23613
  }
23430
23614
  });
23431
23615
  }
23432
- getDrives() {
23433
- return this.legacyStorage.getDrives();
23616
+ // TODO: paginate
23617
+ async getDrives() {
23618
+ const drives = [];
23619
+ let cursor;
23620
+ do {
23621
+ const { documents, nextCursor } = await this.documentStorage.findByType("powerhouse/document-drive", 100, cursor);
23622
+ drives.push(...documents);
23623
+ cursor = nextCursor;
23624
+ } while (cursor);
23625
+ return drives;
23434
23626
  }
23435
23627
  async getDrive(driveId, options) {
23436
23628
  let document;
@@ -23506,6 +23698,7 @@ class BaseDocumentDriveServer {
23506
23698
  const document = input.document ?? this.getDocumentModelModule(input.documentType).utils.createDocument();
23507
23699
  const documentStorage = {
23508
23700
  name: document.name,
23701
+ slug: document.slug,
23509
23702
  revision: document.revision,
23510
23703
  documentType: document.documentType,
23511
23704
  created: document.created,
@@ -23654,12 +23847,18 @@ class BaseDocumentDriveServer {
23654
23847
  handler = () => this.deleteDocument(driveId, signal.input.id);
23655
23848
  break;
23656
23849
  case "COPY_CHILD_DOCUMENT":
23657
- handler = () => this.getDocument(driveId, signal.input.id).then((documentToCopy) => this.createDocument(driveId, {
23658
- id: signal.input.newId,
23659
- documentType: documentToCopy.documentType,
23660
- document: documentToCopy,
23661
- synchronizationUnits: signal.input.synchronizationUnits
23662
- }));
23850
+ handler = () => this.getDocument(driveId, signal.input.id).then((documentToCopy) => {
23851
+ const doc = {
23852
+ ...documentToCopy,
23853
+ slug: signal.input.newId
23854
+ };
23855
+ return this.createDocument(driveId, {
23856
+ id: signal.input.newId,
23857
+ documentType: documentToCopy.documentType,
23858
+ document: doc,
23859
+ synchronizationUnits: signal.input.synchronizationUnits
23860
+ });
23861
+ });
23663
23862
  break;
23664
23863
  }
23665
23864
  if (handler) {
@@ -23916,13 +24115,6 @@ class BaseDocumentDriveServer {
23916
24115
  addDriveOperation(driveId, operation, options) {
23917
24116
  return this.addDriveOperations(driveId, [operation], options);
23918
24117
  }
23919
- async clearStorage() {
23920
- var _a2, _b;
23921
- for (const drive of await this.getDrives()) {
23922
- await this.deleteDrive(drive);
23923
- }
23924
- await ((_b = (_a2 = this.legacyStorage).clearStorage) == null ? void 0 : _b.call(_a2));
23925
- }
23926
24118
  async _addDriveOperations(driveId, callback) {
23927
24119
  if (!this.legacyStorage.addDriveOperationsWithTransaction) {
23928
24120
  const documentStorage = await this.documentStorage.get(driveId);
@@ -24197,17 +24389,30 @@ class MemoryStorage {
24197
24389
  exists(documentId) {
24198
24390
  return Promise.resolve(!!this.documents[documentId]);
24199
24391
  }
24200
- // TODO: this should throw an error if the document already exists.
24201
24392
  create(documentId, document) {
24202
- var _a2;
24393
+ if (!isValidDocumentId(documentId)) {
24394
+ throw new DocumentIdValidationError(documentId);
24395
+ }
24396
+ if (this.documents[documentId]) {
24397
+ throw new DocumentAlreadyExistsError(documentId);
24398
+ }
24399
+ const slug = document.slug.length > 0 ? document.slug : documentId;
24400
+ if (!isValidSlug(slug)) {
24401
+ throw new DocumentSlugValidationError(slug);
24402
+ }
24403
+ if (slug && this.slugToDocumentId[slug]) {
24404
+ throw new DocumentAlreadyExistsError(documentId);
24405
+ }
24203
24406
  this.documents[documentId] = document;
24204
- const slug = (_a2 = document.initialState.state.global) == null ? void 0 : _a2.slug;
24205
24407
  if (slug) {
24206
24408
  if (this.slugToDocumentId[slug]) {
24207
- throw new Error(`Document with slug ${slug} already exists`);
24409
+ throw new DocumentAlreadyExistsError(documentId);
24208
24410
  }
24209
24411
  this.slugToDocumentId[slug] = documentId;
24210
24412
  }
24413
+ if (document.documentType === "powerhouse/document-drive") {
24414
+ this.updateDriveManifest(documentId, { documentIds: /* @__PURE__ */ new Set() });
24415
+ }
24211
24416
  return Promise.resolve();
24212
24417
  }
24213
24418
  get(documentId) {
@@ -24224,20 +24429,56 @@ class MemoryStorage {
24224
24429
  }
24225
24430
  return this.get(documentId);
24226
24431
  }
24432
+ async findByType(documentModelType, limit = 100, cursor) {
24433
+ const documentsAndIds = Object.entries(this.documents).filter(([_, doc]) => doc.documentType === documentModelType).map(([id, doc]) => ({
24434
+ id,
24435
+ document: doc
24436
+ }));
24437
+ documentsAndIds.sort((a, b) => {
24438
+ const aDate = new Date(a.document.created);
24439
+ const bDate = new Date(b.document.created);
24440
+ if (aDate.getTime() === bDate.getTime()) {
24441
+ const aId = a.id;
24442
+ const bId = b.id;
24443
+ return aId.localeCompare(bId);
24444
+ }
24445
+ return aDate.getTime() - bDate.getTime();
24446
+ });
24447
+ let startIndex = 0;
24448
+ if (cursor) {
24449
+ const index = documentsAndIds.findIndex(({ id }) => id === cursor);
24450
+ if (index !== -1) {
24451
+ startIndex = index;
24452
+ }
24453
+ }
24454
+ const endIndex = Math.min(startIndex + limit, documentsAndIds.length);
24455
+ let nextCursor;
24456
+ if (endIndex < documentsAndIds.length) {
24457
+ nextCursor = documentsAndIds[endIndex].id;
24458
+ }
24459
+ return {
24460
+ documents: documentsAndIds.slice(startIndex, endIndex).map(({ id }) => id),
24461
+ nextCursor
24462
+ };
24463
+ }
24227
24464
  async delete(documentId) {
24228
- var _a2;
24229
24465
  const document = this.documents[documentId];
24230
24466
  if (document) {
24231
- const slug = (_a2 = document.initialState.state.global) == null ? void 0 : _a2.slug;
24467
+ const slug = document.slug.length > 0 ? document.slug : documentId;
24232
24468
  if (slug && this.slugToDocumentId[slug] === documentId) {
24233
24469
  delete this.slugToDocumentId[slug];
24234
24470
  }
24235
24471
  }
24236
- const drives = await this.getDrives();
24237
- for (const driveId of drives) {
24238
- if (driveId === documentId)
24239
- continue;
24240
- await this.removeChild(driveId, documentId);
24472
+ const parents = await this.getParents(documentId);
24473
+ for (const parent of parents) {
24474
+ await this.removeChild(parent, documentId);
24475
+ }
24476
+ const children = await this.getChildren(documentId);
24477
+ for (const child of children) {
24478
+ const childParents = await this.getParents(child);
24479
+ if (childParents.length === 1) {
24480
+ await this.delete(child);
24481
+ }
24241
24482
  }
24242
24483
  delete this.driveManifests[documentId];
24243
24484
  if (this.documents[documentId]) {
@@ -24271,14 +24512,26 @@ class MemoryStorage {
24271
24512
  const manifest = this.getManifest(parentId);
24272
24513
  return [...manifest.documentIds];
24273
24514
  }
24515
+ async getParents(childId) {
24516
+ const parents = [];
24517
+ for (const [driveId, manifest] of Object.entries(this.driveManifests)) {
24518
+ if (manifest.documentIds.has(childId)) {
24519
+ parents.push(driveId);
24520
+ }
24521
+ }
24522
+ return parents;
24523
+ }
24274
24524
  ////////////////////////////////
24275
- // IDriveStorage
24525
+ // IDocumentAdminStorage
24276
24526
  ////////////////////////////////
24277
- async clearStorage() {
24527
+ async clear() {
24278
24528
  this.documents = {};
24279
24529
  this.driveManifests = {};
24280
24530
  this.slugToDocumentId = {};
24281
24531
  }
24532
+ ////////////////////////////////
24533
+ // IDriveStorage
24534
+ ////////////////////////////////
24282
24535
  async addDocumentOperations(drive, id, operations, header) {
24283
24536
  const document = await this.get(id);
24284
24537
  if (!document) {
@@ -24291,13 +24544,6 @@ class MemoryStorage {
24291
24544
  operations: mergedOperations
24292
24545
  };
24293
24546
  }
24294
- async getDrives() {
24295
- return Object.keys(this.driveManifests);
24296
- }
24297
- async createDrive(id, drive) {
24298
- await this.create(id, drive);
24299
- this.updateDriveManifest(id, { documentIds: /* @__PURE__ */ new Set() });
24300
- }
24301
24547
  async addDriveOperations(id, operations, header) {
24302
24548
  const drive = await this.get(id);
24303
24549
  const mergedOperations = mergeOperations(drive.operations, operations);
@@ -24307,32 +24553,6 @@ class MemoryStorage {
24307
24553
  operations: mergedOperations
24308
24554
  };
24309
24555
  }
24310
- async deleteDrive(id) {
24311
- const manifest = this.getManifest(id);
24312
- const drives = await this.getDrives();
24313
- await Promise.all([...manifest.documentIds].map((docId) => {
24314
- var _a2;
24315
- for (const driveId of drives) {
24316
- if (driveId === id) {
24317
- continue;
24318
- }
24319
- const manifest2 = this.getManifest(driveId);
24320
- if (manifest2.documentIds.has(docId)) {
24321
- return;
24322
- }
24323
- }
24324
- const document = this.documents[docId];
24325
- if (document) {
24326
- const slug = (_a2 = document.initialState.state.global) == null ? void 0 : _a2.slug;
24327
- if (slug && this.slugToDocumentId[slug] === docId) {
24328
- delete this.slugToDocumentId[slug];
24329
- }
24330
- }
24331
- delete this.documents[docId];
24332
- }));
24333
- delete this.driveManifests[id];
24334
- delete this.documents[id];
24335
- }
24336
24556
  async getSynchronizationUnitsRevision(units) {
24337
24557
  const results = await Promise.allSettled(units.map(async (unit) => {
24338
24558
  try {
@@ -25535,6 +25755,9 @@ function Syncing(props) {
25535
25755
  function Tabler(props) {
25536
25756
  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" })] });
25537
25757
  }
25758
+ function TimelineCaret(props) {
25759
+ 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" }) });
25760
+ }
25538
25761
  function Timeline(props) {
25539
25762
  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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" })] })] });
25540
25763
  }
@@ -25675,6 +25898,7 @@ const iconComponents = {
25675
25898
  Synced,
25676
25899
  Syncing,
25677
25900
  Tabler,
25901
+ TimelineCaret,
25678
25902
  Timeline,
25679
25903
  TrashFill,
25680
25904
  Trash,
@@ -25737,7 +25961,12 @@ const ADD_TRIGGER = "ADD_TRIGGER";
25737
25961
  const ADD_INVALID_TRIGGER = "ADD_INVALID_TRIGGER";
25738
25962
  const defaultDriveOptions = [NEW_FOLDER, RENAME, SETTINGS];
25739
25963
  const defaultFileOptions = [RENAME, DELETE, DUPLICATE];
25740
- const defaultFolderOptions = [RENAME, DELETE, DUPLICATE];
25964
+ const defaultFolderOptions = [
25965
+ NEW_FOLDER,
25966
+ RENAME,
25967
+ DELETE,
25968
+ DUPLICATE
25969
+ ];
25741
25970
  const debugNodeOptions = [
25742
25971
  ADD_TRIGGER,
25743
25972
  REMOVE_TRIGGER,
@@ -25817,7 +26046,7 @@ const nodeOptionsMap = {
25817
26046
  };
25818
26047
  const name = "@powerhousedao/connect";
25819
26048
  const productName = "Powerhouse-Connect";
25820
- const version$1 = "1.0.21-staging.0";
26049
+ const version$1 = "1.0.22-dev.0";
25821
26050
  const description = "Powerhouse Connect";
25822
26051
  const main = "./dist/index.html";
25823
26052
  const type = "module";
@@ -25829,7 +26058,7 @@ const repository = { "type": "git", "url": "git+https://github.com/powerhouse-in
25829
26058
  const bugs = { "url": "https://github.com/powerhouse-inc/document-model-electron/issues" };
25830
26059
  const homepage = "https://github.com/powerhouse-inc/document-model-electron#readme";
25831
26060
  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" };
25832
- 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.22.2", "@tailwindcss/vite": "^4.0.9", "@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": "^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" };
26061
+ 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.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": "^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" };
25833
26062
  const optionalDependencies = { "@esbuild/linux-x64": "^0.21.4", "@rollup/rollup-linux-x64-musl": "4.14.3" };
25834
26063
  const packageJson = {
25835
26064
  name,
@@ -28610,6 +28839,9 @@ const _BrowserStorage = class _BrowserStorage {
28610
28839
  name: namespace ? `${namespace}:${_BrowserStorage.DBName}` : _BrowserStorage.DBName
28611
28840
  }));
28612
28841
  }
28842
+ ////////////////////////////////
28843
+ // IDocumentAdminStorage
28844
+ ////////////////////////////////
28613
28845
  async clear() {
28614
28846
  const db = await this.db;
28615
28847
  await db.clear();
@@ -28622,12 +28854,25 @@ const _BrowserStorage = class _BrowserStorage {
28622
28854
  const document = await db.getItem(this.buildDocumentKey(documentId));
28623
28855
  return !!document;
28624
28856
  }
28625
- // TODO: this should throw an error if the document already exists.
28626
28857
  async create(documentId, document) {
28627
- var _a2;
28858
+ if (!isValidDocumentId(documentId)) {
28859
+ throw new DocumentIdValidationError(documentId);
28860
+ }
28628
28861
  const db = await this.db;
28862
+ if (await this.exists(documentId)) {
28863
+ throw new DocumentAlreadyExistsError(documentId);
28864
+ }
28865
+ const slug = document.slug.length > 0 ? document.slug : documentId;
28866
+ if (!isValidSlug(slug)) {
28867
+ throw new DocumentSlugValidationError(slug);
28868
+ }
28869
+ if (slug) {
28870
+ const slugManifest = await this.getSlugManifest();
28871
+ if (slugManifest.slugToId[slug]) {
28872
+ throw new DocumentAlreadyExistsError(documentId);
28873
+ }
28874
+ }
28629
28875
  await db.setItem(this.buildDocumentKey(documentId), document);
28630
- const slug = ((_a2 = document.initialState.state.global) == null ? void 0 : _a2.slug) ?? documentId;
28631
28876
  if (slug) {
28632
28877
  const slugManifest = await this.getSlugManifest();
28633
28878
  if (slugManifest.slugToId[slug]) {
@@ -28636,6 +28881,9 @@ const _BrowserStorage = class _BrowserStorage {
28636
28881
  slugManifest.slugToId[slug] = documentId;
28637
28882
  await this.updateSlugManifest(slugManifest);
28638
28883
  }
28884
+ if (document.documentType === "powerhouse/document-drive") {
28885
+ this.updateDriveManifest(documentId, { documentIds: [] });
28886
+ }
28639
28887
  }
28640
28888
  async get(documentId) {
28641
28889
  const db = await this.db;
@@ -28653,15 +28901,56 @@ const _BrowserStorage = class _BrowserStorage {
28653
28901
  }
28654
28902
  return this.get(documentId);
28655
28903
  }
28904
+ async findByType(documentModelType, limit = 100, cursor) {
28905
+ const db = await this.db;
28906
+ const keys = await db.keys();
28907
+ const documentKeys = keys.filter((key) => key.startsWith(`${_BrowserStorage.DOCUMENT_KEY}${_BrowserStorage.SEP}`));
28908
+ const documentsAndIds = [];
28909
+ for (const key of documentKeys) {
28910
+ const documentId = key.slice(_BrowserStorage.DOCUMENT_KEY.length + _BrowserStorage.SEP.length);
28911
+ try {
28912
+ const document = await db.getItem(key);
28913
+ if (!document || document.documentType !== documentModelType) {
28914
+ continue;
28915
+ }
28916
+ documentsAndIds.push({ id: documentId, document });
28917
+ } catch (error) {
28918
+ continue;
28919
+ }
28920
+ }
28921
+ documentsAndIds.sort((a, b) => {
28922
+ const aDate = new Date(a.document.created);
28923
+ const bDate = new Date(b.document.created);
28924
+ if (aDate.getTime() === bDate.getTime()) {
28925
+ return a.id.localeCompare(b.id);
28926
+ }
28927
+ return aDate.getTime() - bDate.getTime();
28928
+ });
28929
+ let startIndex = 0;
28930
+ if (cursor) {
28931
+ const index = documentsAndIds.findIndex(({ id }) => id === cursor);
28932
+ if (index !== -1) {
28933
+ startIndex = index;
28934
+ }
28935
+ }
28936
+ const endIndex = Math.min(startIndex + limit, documentsAndIds.length);
28937
+ let nextCursor;
28938
+ if (endIndex < documentsAndIds.length) {
28939
+ nextCursor = documentsAndIds[endIndex].id;
28940
+ }
28941
+ return {
28942
+ documents: documentsAndIds.slice(startIndex, endIndex).map(({ id }) => id),
28943
+ nextCursor
28944
+ };
28945
+ }
28656
28946
  async delete(documentId) {
28657
- var _a2;
28658
28947
  const db = await this.db;
28659
28948
  const document = await db.getItem(this.buildDocumentKey(documentId));
28660
28949
  if (!document) {
28661
28950
  return false;
28662
28951
  }
28952
+ const slug = document.slug.length > 0 ? document.slug : documentId;
28663
28953
  try {
28664
- const slug = (_a2 = document.initialState.state.global) == null ? void 0 : _a2.slug;
28665
28954
  if (slug) {
28666
28955
  const slugManifest = await this.getSlugManifest();
28667
28956
  if (slugManifest.slugToId[slug] === documentId) {
@@ -28671,11 +28960,16 @@ const _BrowserStorage = class _BrowserStorage {
28671
28960
  }
28672
28961
  } catch (error) {
28673
28962
  }
28674
- const drives = await this.getDrives();
28675
- for (const driveId of drives) {
28676
- if (driveId === documentId)
28677
- continue;
28678
- await this.removeChild(driveId, documentId);
28963
+ const parents = await this.getParents(documentId);
28964
+ for (const parent of parents) {
28965
+ await this.removeChild(parent, documentId);
28966
+ }
28967
+ const children = await this.getChildren(documentId);
28968
+ for (const child of children) {
28969
+ const childParents = await this.getParents(child);
28970
+ if (childParents.length === 1 && childParents[0] === documentId) {
28971
+ await this.delete(child);
28972
+ }
28679
28973
  }
28680
28974
  await db.removeItem(this.buildManifestKey(documentId));
28681
28975
  await db.removeItem(this.buildDocumentKey(documentId));
@@ -28709,6 +29003,20 @@ const _BrowserStorage = class _BrowserStorage {
28709
29003
  const manifest = await this.getManifest(parentId);
28710
29004
  return manifest.documentIds;
28711
29005
  }
29006
+ async getParents(childId) {
29007
+ const db = await this.db;
29008
+ const keys = await db.keys();
29009
+ const parents = [];
29010
+ const manifestKeys = keys.filter((key) => key.startsWith(`${_BrowserStorage.MANIFEST_KEY}${_BrowserStorage.SEP}`));
29011
+ for (const key of manifestKeys) {
29012
+ const driveId = key.slice(_BrowserStorage.MANIFEST_KEY.length + _BrowserStorage.SEP.length);
29013
+ const manifest = await this.getManifest(driveId);
29014
+ if (manifest.documentIds.includes(childId)) {
29015
+ parents.push(driveId);
29016
+ }
29017
+ }
29018
+ return parents;
29019
+ }
28712
29020
  ////////////////////////////////
28713
29021
  // IDriveStorage
28714
29022
  ////////////////////////////////
@@ -28730,9 +29038,6 @@ const _BrowserStorage = class _BrowserStorage {
28730
29038
  const db = await this.db;
28731
29039
  await db.setItem(_BrowserStorage.SLUG_MANIFEST_KEY, manifest);
28732
29040
  }
28733
- async clearStorage() {
28734
- return (await this.db).clear();
28735
- }
28736
29041
  async addDocumentOperations(drive, id, operations, header) {
28737
29042
  const document = await this.get(id);
28738
29043
  if (!document) {
@@ -28746,22 +29051,6 @@ const _BrowserStorage = class _BrowserStorage {
28746
29051
  operations: mergedOperations
28747
29052
  });
28748
29053
  }
28749
- async getDrives() {
28750
- const db = await this.db;
28751
- const keys = await db.keys();
28752
- return keys.filter((key) => key.startsWith(_BrowserStorage.MANIFEST_KEY)).map((key) => key.slice(_BrowserStorage.MANIFEST_KEY.length + _BrowserStorage.SEP.length));
28753
- }
28754
- async createDrive(id, drive) {
28755
- await this.create(id, drive);
28756
- await this.updateDriveManifest(id, { documentIds: [] });
28757
- }
28758
- async deleteDrive(id) {
28759
- const documents = await this.getChildren(id);
28760
- await Promise.all(documents.map((doc) => this.delete(doc)));
28761
- const db = await this.db;
28762
- await db.removeItem(this.buildManifestKey(id));
28763
- return db.removeItem(this.buildDocumentKey(id));
28764
- }
28765
29054
  async addDriveOperations(id, operations, header) {
28766
29055
  const drive = await this.get(id);
28767
29056
  const mergedOperations = mergeOperations(drive.operations, operations);
@@ -28802,12 +29091,16 @@ const _BrowserStorage = class _BrowserStorage {
28802
29091
  }
28803
29092
  // migrates all stored operations from legacy signature to signatures array
28804
29093
  async migrateOperationSignatures() {
28805
- const drives = await this.getDrives();
28806
- for (const drive of drives) {
28807
- await this.migrateDrive(drive);
28808
- const documents = await this.getChildren(drive);
28809
- await Promise.all(documents.map(async (docId) => this.migrateDocument(drive, docId)));
28810
- }
29094
+ let cursor;
29095
+ do {
29096
+ const { documents: drives, nextCursor } = await this.findByType("powerhouse/document-drive", 100, cursor);
29097
+ for (const drive of drives) {
29098
+ await this.migrateDrive(drive);
29099
+ const documents = await this.getChildren(drive);
29100
+ await Promise.all(documents.map(async (docId) => this.migrateDocument(drive, docId)));
29101
+ }
29102
+ cursor = nextCursor;
29103
+ } while (cursor);
28811
29104
  }
28812
29105
  async migrateDrive(driveId) {
28813
29106
  const drive = await this.get(driveId);
@@ -28881,8 +29174,11 @@ const getReactorDefaultDrivesConfig = () => {
28881
29174
  }
28882
29175
  };
28883
29176
  };
28884
- function createBrowserDocumentDriveServer(documentModels, routerBasename) {
28885
- return new ReactorBuilder(documentModels).withStorage(new BrowserStorage(routerBasename)).withCache(new InMemoryCache()).withQueueManager(new BaseQueueManager(1, 10)).withOptions({ ...getReactorDefaultDrivesConfig() }).build();
29177
+ function createBrowserStorage(routerBasename) {
29178
+ return new BrowserStorage(routerBasename);
29179
+ }
29180
+ function createBrowserDocumentDriveServer(documentModels, storage) {
29181
+ return new ReactorBuilder(documentModels).withStorage(storage).withCache(new InMemoryCache()).withQueueManager(new BaseQueueManager(1, 10)).withOptions({ ...getReactorDefaultDrivesConfig() }).build();
28886
29182
  }
28887
29183
  const VERSION_CHECK_INTERVAL = parseInt(window.__VITE_ENVS.PH_CONNECT_VERSION_CHECK_INTERVAL) || 60 * 60 * 1e3;
28888
29184
  const basePath = connectConfig.routerBasename;
@@ -31441,14 +31737,14 @@ if (window.__VITE_ENVS.MODE === "development") {
31441
31737
  } else {
31442
31738
  serviceWorkerManager.registerServiceWorker(false);
31443
31739
  }
31444
- const App = lazy(() => __vitePreload(() => import("./app-B2txMMB6.js").then((n) => n.aY), true ? __vite__mapDeps([0,1,2]) : void 0));
31740
+ const App = lazy(() => __vitePreload(() => import("./app-DOR_8r1B.js").then((n) => n.bu), true ? __vite__mapDeps([0,1,2]) : void 0));
31445
31741
  const AppLoader = /* @__PURE__ */ jsx(Suspense, { children: /* @__PURE__ */ jsx(App, {}) });
31446
31742
  const appLoader = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
31447
31743
  __proto__: null,
31448
31744
  default: AppLoader
31449
31745
  }, Symbol.toStringTag, { value: "Module" }));
31450
31746
  export {
31451
- getDefaultExportFromCjs as $,
31747
+ Icon as $,
31452
31748
  AddStateExampleInputSchema as A,
31453
31749
  SetModuleDescriptionInputSchema as B,
31454
31750
  SetModuleNameInputSchema as C,
@@ -31475,49 +31771,49 @@ export {
31475
31771
  baseLoadFromFile as X,
31476
31772
  baseLoadFromInput as Y,
31477
31773
  pascalCase as Z,
31478
- Icon as _,
31774
+ logger$1 as _,
31479
31775
  createReducer as a,
31480
- DELETE as a$,
31481
- LOCAL as a0,
31482
- commonjsGlobal as a1,
31483
- PUBLIC as a2,
31484
- SWITCHBOARD as a3,
31485
- locationInfoByLocation as a4,
31486
- sharingTypeOptions as a5,
31487
- objectType as a6,
31488
- recordType as a7,
31489
- stringType as a8,
31490
- capitalCase as a9,
31491
- moveNode as aA,
31492
- generateNodesCopy as aB,
31493
- copyNode as aC,
31494
- createState as aD,
31495
- setDriveName as aE,
31496
- setAvailableOffline as aF,
31497
- setSharingType as aG,
31498
- SynchronizationUnitNotFoundError as aH,
31499
- removeTrigger as aI,
31500
- generateUUID as aJ,
31501
- PullResponderTransmitter as aK,
31502
- addTrigger as aL,
31503
- ReadDriveNotFoundError as aM,
31504
- openUrl as aN,
31505
- getNodeOptions as aO,
31506
- DRIVE as aP,
31507
- FOLDER as aQ,
31508
- requestPublicDrive as aR,
31509
- serviceWorkerManager as aS,
31510
- packageJson as aT,
31511
- t as aU,
31512
- gql as aV,
31513
- request as aW,
31514
- getDimensions as aX,
31515
- READ as aY,
31516
- nodeOptionsMap as aZ,
31517
- defaultFileOptions as a_,
31518
- CLOUD as aa,
31519
- createZip as ab,
31520
- logger$1 as ac,
31776
+ invariant as a$,
31777
+ getDefaultExportFromCjs as a0,
31778
+ LOCAL as a1,
31779
+ commonjsGlobal as a2,
31780
+ PUBLIC as a3,
31781
+ SWITCHBOARD as a4,
31782
+ locationInfoByLocation as a5,
31783
+ sharingTypeOptions as a6,
31784
+ objectType as a7,
31785
+ recordType as a8,
31786
+ stringType as a9,
31787
+ updateNode as aA,
31788
+ FILE as aB,
31789
+ moveNode as aC,
31790
+ generateNodesCopy as aD,
31791
+ copyNode as aE,
31792
+ createState as aF,
31793
+ setDriveName as aG,
31794
+ setAvailableOffline as aH,
31795
+ setSharingType as aI,
31796
+ SynchronizationUnitNotFoundError as aJ,
31797
+ removeTrigger as aK,
31798
+ PullResponderTransmitter as aL,
31799
+ addTrigger as aM,
31800
+ ReadDriveNotFoundError as aN,
31801
+ openUrl as aO,
31802
+ getNodeOptions as aP,
31803
+ DRIVE as aQ,
31804
+ FOLDER as aR,
31805
+ requestPublicDrive as aS,
31806
+ serviceWorkerManager as aT,
31807
+ packageJson as aU,
31808
+ t as aV,
31809
+ gql as aW,
31810
+ request as aX,
31811
+ inspect as aY,
31812
+ GraphQLError as aZ,
31813
+ getNamedType as a_,
31814
+ capitalCase as aa,
31815
+ CLOUD as ab,
31816
+ createZip as ac,
31521
31817
  LZString as ad,
31522
31818
  buildSignedOperation as ae,
31523
31819
  getI18n as af,
@@ -31525,98 +31821,98 @@ export {
31525
31821
  connectConfig as ah,
31526
31822
  hashDocumentStateForScope as ai,
31527
31823
  getAugmentedNamespace as aj,
31528
- setErrorHandler as ak,
31529
- driveDocumentModelModule as al,
31530
- createBrowserDocumentDriveServer as am,
31531
- hashKey as an,
31532
- childLogger as ao,
31533
- reducer as ap,
31534
- isDocumentDrive as aq,
31535
- generateAddNodeAction as ar,
31536
- isFileNode as as,
31537
- uploadDocumentOperations as at,
31538
- updateFile as au,
31539
- addFolder as av,
31540
- isFolderNode as aw,
31541
- deleteNode as ax,
31542
- updateNode as ay,
31543
- FILE as az,
31824
+ process as ak,
31825
+ setErrorHandler as al,
31826
+ driveDocumentModelModule as am,
31827
+ createBrowserStorage as an,
31828
+ createBrowserDocumentDriveServer as ao,
31829
+ generateId as ap,
31830
+ childLogger as aq,
31831
+ reducer as ar,
31832
+ isDocumentDrive as as,
31833
+ generateAddNodeAction as at,
31834
+ isFileNode as au,
31835
+ uploadDocumentOperations as av,
31836
+ updateFile as aw,
31837
+ addFolder as ax,
31838
+ isFolderNode as ay,
31839
+ deleteNode as az,
31544
31840
  SetStateSchemaInputSchema as b,
31545
- GraphQLFloat as b$,
31546
- RENAME as b0,
31547
- WRITE as b1,
31548
- DUPLICATE as b2,
31549
- defaultFolderOptions as b3,
31550
- garbageCollect as b4,
31551
- sortOperations as b5,
31552
- UI_NODE as b6,
31553
- generateId as b7,
31554
- undo as b8,
31555
- redo as b9,
31556
- isListType as bA,
31557
- snakeCase as bB,
31558
- constantCase as bC,
31559
- isAbstractType as bD,
31560
- BREAK as bE,
31561
- GraphQLInputObjectType as bF,
31562
- GraphQLList as bG,
31563
- GraphQLEnumType as bH,
31564
- GraphQLObjectType as bI,
31565
- GraphQLInterfaceType as bJ,
31566
- SchemaMetaFieldDef as bK,
31567
- TypeMetaFieldDef as bL,
31568
- TypeNameMetaFieldDef as bM,
31569
- isCompositeType as bN,
31570
- isOutputType as bO,
31571
- isInputType as bP,
31572
- GraphQLBoolean as bQ,
31573
- assertAbstractType as bR,
31574
- doTypesOverlap as bS,
31575
- DirectiveLocation as bT,
31576
- specifiedRules as bU,
31577
- NoUnusedFragmentsRule as bV,
31578
- ExecutableDefinitionsRule as bW,
31579
- validate as bX,
31580
- validateSchema as bY,
31581
- GraphQLID as bZ,
31582
- GraphQLString as b_,
31583
- useDocumentDispatch as ba,
31584
- inspect as bb,
31585
- GraphQLError as bc,
31586
- getNamedType as bd,
31587
- invariant as be,
31588
- isInputObjectType as bf,
31589
- isScalarType as bg,
31590
- isObjectType as bh,
31591
- isInterfaceType as bi,
31592
- isUnionType as bj,
31593
- isEnumType as bk,
31594
- print as bl,
31595
- isPrintableAsBlockString as bm,
31596
- Kind as bn,
31597
- astFromValue as bo,
31598
- DEFAULT_DEPRECATION_REASON as bp,
31599
- isSpecifiedDirective as bq,
31600
- isSpecifiedScalarType as br,
31601
- isIntrospectionType as bs,
31602
- z as bt,
31603
- GraphQLScalarType as bu,
31604
- parse as bv,
31605
- visit as bw,
31606
- buildASTSchema as bx,
31607
- extendSchema as by,
31608
- getNullableType as bz,
31841
+ DELETE as b$,
31842
+ isInputObjectType as b0,
31843
+ isScalarType as b1,
31844
+ isObjectType as b2,
31845
+ isInterfaceType as b3,
31846
+ isUnionType as b4,
31847
+ isEnumType as b5,
31848
+ print as b6,
31849
+ isPrintableAsBlockString as b7,
31850
+ Kind as b8,
31851
+ astFromValue as b9,
31852
+ isInputType as bA,
31853
+ GraphQLBoolean as bB,
31854
+ assertAbstractType as bC,
31855
+ doTypesOverlap as bD,
31856
+ DirectiveLocation as bE,
31857
+ specifiedRules as bF,
31858
+ NoUnusedFragmentsRule as bG,
31859
+ ExecutableDefinitionsRule as bH,
31860
+ validate as bI,
31861
+ validateSchema as bJ,
31862
+ GraphQLID as bK,
31863
+ GraphQLString as bL,
31864
+ GraphQLFloat as bM,
31865
+ GraphQLInt as bN,
31866
+ GraphQLDirective as bO,
31867
+ GraphQLUnionType as bP,
31868
+ isNonNullType as bQ,
31869
+ GraphQLNonNull as bR,
31870
+ isNamedType as bS,
31871
+ isLeafType as bT,
31872
+ GraphQLSchema as bU,
31873
+ buildSchema as bV,
31874
+ sentenceCase as bW,
31875
+ getDimensions as bX,
31876
+ READ as bY,
31877
+ nodeOptionsMap as bZ,
31878
+ defaultFileOptions as b_,
31879
+ DEFAULT_DEPRECATION_REASON as ba,
31880
+ isSpecifiedDirective as bb,
31881
+ isSpecifiedScalarType as bc,
31882
+ isIntrospectionType as bd,
31883
+ z as be,
31884
+ GraphQLScalarType as bf,
31885
+ parse as bg,
31886
+ visit as bh,
31887
+ buildASTSchema as bi,
31888
+ extendSchema as bj,
31889
+ getNullableType as bk,
31890
+ isListType as bl,
31891
+ snakeCase as bm,
31892
+ constantCase as bn,
31893
+ isAbstractType as bo,
31894
+ BREAK as bp,
31895
+ GraphQLInputObjectType as bq,
31896
+ GraphQLList as br,
31897
+ GraphQLEnumType as bs,
31898
+ GraphQLObjectType as bt,
31899
+ GraphQLInterfaceType as bu,
31900
+ SchemaMetaFieldDef as bv,
31901
+ TypeMetaFieldDef as bw,
31902
+ TypeNameMetaFieldDef as bx,
31903
+ isCompositeType as by,
31904
+ isOutputType as bz,
31609
31905
  createAction as c,
31610
- GraphQLInt as c0,
31611
- GraphQLDirective as c1,
31612
- GraphQLUnionType as c2,
31613
- isNonNullType as c3,
31614
- GraphQLNonNull as c4,
31615
- isNamedType as c5,
31616
- isLeafType as c6,
31617
- GraphQLSchema as c7,
31618
- buildSchema as c8,
31619
- sentenceCase as c9,
31906
+ RENAME as c0,
31907
+ WRITE as c1,
31908
+ DUPLICATE as c2,
31909
+ defaultFolderOptions as c3,
31910
+ garbageCollect as c4,
31911
+ sortOperations as c5,
31912
+ UI_NODE as c6,
31913
+ undo as c7,
31914
+ redo as c8,
31915
+ useDocumentDispatch as c9,
31620
31916
  appLoader as ca,
31621
31917
  ReorderModuleOperationsInputSchema as d,
31622
31918
  DeleteOperationInputSchema as e,
@@ -31642,3 +31938,4 @@ export {
31642
31938
  ReorderModulesInputSchema as y,
31643
31939
  DeleteModuleInputSchema as z
31644
31940
  };
31941
+ //# sourceMappingURL=app-loader-uXeiy6sl.js.map