mindoodb-app-sdk 0.0.7 → 0.0.9

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.
@@ -172,17 +172,22 @@ function decodeMockListCursor(cursor) {
172
172
  const offset = Number.parseInt(cursor, 10);
173
173
  return Number.isFinite(offset) && offset >= 0 ? offset : 0;
174
174
  }
175
- function createDefaultViewHandle() {
175
+ function createDefaultViewNavigator() {
176
176
  const definition = {
177
177
  title: "Mock View",
178
178
  columns: []
179
179
  };
180
- const expansion = {
181
- mode: "collapsed",
182
- ids: []
180
+ let expansion = {
181
+ expandAllByDefault: false,
182
+ expandLevel: 0,
183
+ entryKeys: []
184
+ };
185
+ let selection = {
186
+ selectAllByDefault: false,
187
+ entryKeys: []
183
188
  };
184
189
  const emptyPage = {
185
- rows: [],
190
+ entries: [],
186
191
  nextPosition: null,
187
192
  hasMore: false
188
193
  };
@@ -192,43 +197,174 @@ function createDefaultViewHandle() {
192
197
  },
193
198
  async refresh() {
194
199
  },
195
- async page(_input) {
200
+ async getCurrentEntry() {
201
+ return null;
202
+ },
203
+ async gotoFirst() {
204
+ return false;
205
+ },
206
+ async gotoLast() {
207
+ return false;
208
+ },
209
+ async gotoNext() {
210
+ return false;
211
+ },
212
+ async gotoPrev() {
213
+ return false;
214
+ },
215
+ async gotoNextSibling() {
216
+ return false;
217
+ },
218
+ async gotoPrevSibling() {
219
+ return false;
220
+ },
221
+ async gotoParent() {
222
+ return false;
223
+ },
224
+ async gotoFirstChild() {
225
+ return false;
226
+ },
227
+ async gotoLastChild() {
228
+ return false;
229
+ },
230
+ async gotoPos(_position) {
231
+ return false;
232
+ },
233
+ async getPos(_position) {
234
+ return null;
235
+ },
236
+ async findCategoryEntryByParts(_parts) {
237
+ return null;
238
+ },
239
+ async entriesForward(_options) {
196
240
  return emptyPage;
197
241
  },
198
- async getExpansionState() {
199
- return expansion;
242
+ async entriesBackward(_options) {
243
+ return emptyPage;
200
244
  },
201
- async setExpansionState(state) {
202
- return state;
245
+ async gotoNextSelected() {
246
+ return false;
203
247
  },
204
- async expand(rowKey) {
205
- return {
206
- mode: "collapsed",
207
- ids: [rowKey]
248
+ async gotoPrevSelected() {
249
+ return false;
250
+ },
251
+ async select(origin, docId, selectParentCategories = false) {
252
+ const key = `${origin}:${docId}`;
253
+ selection = {
254
+ ...selection,
255
+ entryKeys: Array.from(/* @__PURE__ */ new Set([...selection.entryKeys, key]))
208
256
  };
257
+ if (selectParentCategories) {
258
+ selection = {
259
+ ...selection,
260
+ entryKeys: [...selection.entryKeys]
261
+ };
262
+ }
209
263
  },
210
- async collapse(_rowKey) {
211
- return expansion;
264
+ async deselect(origin, docId) {
265
+ const key = `${origin}:${docId}`;
266
+ selection = {
267
+ ...selection,
268
+ entryKeys: selection.entryKeys.filter((entry) => entry !== key)
269
+ };
270
+ },
271
+ async selectAllEntries() {
272
+ selection = {
273
+ selectAllByDefault: true,
274
+ entryKeys: []
275
+ };
276
+ },
277
+ async deselectAllEntries() {
278
+ selection = {
279
+ selectAllByDefault: false,
280
+ entryKeys: []
281
+ };
282
+ },
283
+ async isSelected(origin, docId) {
284
+ const key = `${origin}:${docId}`;
285
+ return selection.selectAllByDefault ? !selection.entryKeys.includes(key) : selection.entryKeys.includes(key);
286
+ },
287
+ async getSelectionState() {
288
+ return selection;
289
+ },
290
+ async setSelectionState(state) {
291
+ selection = {
292
+ selectAllByDefault: state.selectAllByDefault,
293
+ entryKeys: [...state.entryKeys]
294
+ };
295
+ },
296
+ async expand(origin, docId) {
297
+ const key = `${origin}:${docId}`;
298
+ expansion = {
299
+ ...expansion,
300
+ entryKeys: Array.from(/* @__PURE__ */ new Set([...expansion.entryKeys, key]))
301
+ };
302
+ },
303
+ async collapse(origin, docId) {
304
+ const key = `${origin}:${docId}`;
305
+ expansion = {
306
+ ...expansion,
307
+ entryKeys: expansion.entryKeys.filter((entry) => entry !== key)
308
+ };
212
309
  },
213
310
  async expandAll() {
214
- return {
215
- mode: "expanded",
216
- ids: []
311
+ expansion = {
312
+ expandAllByDefault: true,
313
+ expandLevel: expansion.expandLevel,
314
+ entryKeys: []
217
315
  };
218
316
  },
219
317
  async collapseAll() {
318
+ expansion = {
319
+ expandAllByDefault: false,
320
+ expandLevel: 0,
321
+ entryKeys: []
322
+ };
323
+ },
324
+ async expandToLevel(level) {
325
+ expansion = {
326
+ ...expansion,
327
+ expandLevel: level
328
+ };
329
+ },
330
+ async isExpanded(_entryKey) {
331
+ return expansion.expandAllByDefault;
332
+ },
333
+ async getExpansionState() {
220
334
  return expansion;
221
335
  },
222
- async getRow(_rowKey) {
223
- return null;
336
+ async setExpansionState(state) {
337
+ expansion = {
338
+ expandAllByDefault: state.expandAllByDefault,
339
+ expandLevel: state.expandLevel,
340
+ entryKeys: [...state.entryKeys]
341
+ };
224
342
  },
225
- async getCategory(_input) {
226
- return null;
343
+ async childEntries(_entryKey, _descending) {
344
+ return [];
227
345
  },
228
- async pageCategory(_categoryKey, _input) {
229
- return emptyPage;
346
+ async childCategories(_entryKey, _descending) {
347
+ return [];
348
+ },
349
+ async childDocuments(_entryKey, _descending) {
350
+ return [];
351
+ },
352
+ async childCategoriesByKey(_entryKey, _key, _exact, _descending) {
353
+ return [];
354
+ },
355
+ async childDocumentsByKey(_entryKey, _key, _exact, _descending) {
356
+ return [];
357
+ },
358
+ async childCategoriesBetween(_entryKey, _range) {
359
+ return [];
360
+ },
361
+ async childDocumentsBetween(_entryKey, _range) {
362
+ return [];
230
363
  },
231
- async listCategoryDocumentIds(_categoryKey) {
364
+ async getSortedDocIds(_descending) {
365
+ return [];
366
+ },
367
+ async getSortedDocIdsScoped(_entryKey, _descending) {
232
368
  return [];
233
369
  },
234
370
  async dispose() {
@@ -237,7 +373,7 @@ function createDefaultViewHandle() {
237
373
  }
238
374
  function createDatabaseHandle(definition) {
239
375
  let createCounter = 0;
240
- const defaultViewFactory = async () => createDefaultViewHandle();
376
+ const defaultViewFactory = async () => createDefaultViewNavigator();
241
377
  const storedDocuments = /* @__PURE__ */ new Map();
242
378
  const defaultDocuments = {
243
379
  async list(query) {
@@ -341,7 +477,7 @@ function createDatabaseHandle(definition) {
341
477
  }
342
478
  };
343
479
  const defaultViews = {
344
- async create(_definition) {
480
+ async create(_input) {
345
481
  return await defaultViewFactory();
346
482
  },
347
483
  async open(_viewId) {
@@ -393,7 +529,28 @@ function createMockSessionState(options = {}) {
393
529
  const databaseHandles = /* @__PURE__ */ new Map();
394
530
  const databaseViewApis = /* @__PURE__ */ new Map();
395
531
  const sessionViews = /* @__PURE__ */ new Map();
532
+ let activeMenuResolve = null;
396
533
  let databaseInfos = [];
534
+ const menus = {
535
+ async show(_input) {
536
+ if (activeMenuResolve) {
537
+ activeMenuResolve({
538
+ action: "dismissed",
539
+ reason: "replaced"
540
+ });
541
+ }
542
+ return await new Promise((resolve) => {
543
+ activeMenuResolve = resolve;
544
+ });
545
+ },
546
+ async hide() {
547
+ activeMenuResolve?.({
548
+ action: "dismissed",
549
+ reason: "hide"
550
+ });
551
+ activeMenuResolve = null;
552
+ }
553
+ };
397
554
  const setDatabases = (definitions) => {
398
555
  databaseHandles.clear();
399
556
  databaseViewApis.clear();
@@ -404,11 +561,11 @@ function createMockSessionState(options = {}) {
404
561
  for (const definition of definitions) {
405
562
  databaseHandles.set(definition.info.id, createDatabaseHandle(definition));
406
563
  databaseViewApis.set(definition.info.id, {
407
- async create(_definition) {
408
- return await createDefaultViewHandle();
564
+ async create(_input) {
565
+ return await createDefaultViewNavigator();
409
566
  },
410
567
  async open(_viewId) {
411
- return await createDefaultViewHandle();
568
+ return await createDefaultViewNavigator();
412
569
  },
413
570
  ...definition.methods?.views ?? {}
414
571
  });
@@ -433,17 +590,21 @@ function createMockSessionState(options = {}) {
433
590
  }
434
591
  return database;
435
592
  },
436
- async createView(input) {
437
- const api = databaseViewApis.get(input.databaseId);
593
+ async createViewNavigator(input) {
594
+ const firstDatabaseId = input.databaseIds[0];
595
+ if (!firstDatabaseId) {
596
+ throw new Error("At least one test database is required for view creation.");
597
+ }
598
+ const api = databaseViewApis.get(firstDatabaseId);
438
599
  if (!api) {
439
- throw new Error(`Unknown test database for view creation: ${input.databaseId}`);
600
+ throw new Error(`Unknown test database for view creation: ${firstDatabaseId}`);
440
601
  }
441
- const view = await api.create(input.definition);
602
+ const view = await api.create(input);
442
603
  const viewId = input.definition.id || crypto.randomUUID();
443
604
  sessionViews.set(viewId, view);
444
605
  return view;
445
606
  },
446
- async openView(viewId) {
607
+ async openViewNavigator(viewId, options2) {
447
608
  const existing = sessionViews.get(viewId);
448
609
  if (existing) {
449
610
  return existing;
@@ -456,10 +617,11 @@ function createMockSessionState(options = {}) {
456
617
  if (!api) {
457
618
  throw new Error(`Unknown test database for view ${viewId}: ${sourceDatabaseId}`);
458
619
  }
459
- const view = await api.open(viewId);
620
+ const view = await api.open(viewId, options2);
460
621
  sessionViews.set(viewId, view);
461
622
  return view;
462
623
  },
624
+ menus,
463
625
  onThemeChange(listener) {
464
626
  themeListeners.add(listener);
465
627
  return () => {
@@ -503,8 +665,8 @@ function createMockSessionState(options = {}) {
503
665
  }
504
666
  return database;
505
667
  },
506
- createView: session.createView,
507
- openView: session.openView,
668
+ createViewNavigator: session.createViewNavigator,
669
+ openViewNavigator: session.openViewNavigator,
508
670
  bridge,
509
671
  session,
510
672
  emitThemeChange(theme) {
@@ -634,14 +796,14 @@ function createFakeBridgeHost(options = {}) {
634
796
  });
635
797
  installed = true;
636
798
  }
637
- async function resolveViewHandle(viewId) {
799
+ async function resolveViewNavigator(viewId) {
638
800
  const existing = viewSessions.get(viewId);
639
801
  if (existing) {
640
802
  return existing;
641
803
  }
642
- const handle = await state.openView(viewId);
643
- viewSessions.set(viewId, handle);
644
- return handle;
804
+ const navigator = await state.openViewNavigator(viewId);
805
+ viewSessions.set(viewId, navigator);
806
+ return navigator;
645
807
  }
646
808
  function postRpcSuccess(port, requestId, result) {
647
809
  port.postMessage({
@@ -684,17 +846,29 @@ function createFakeBridgeHost(options = {}) {
684
846
  case "session.openDatabase":
685
847
  state.getDatabase(String(params.databaseId));
686
848
  return { ok: true };
687
- case "session.createView": {
688
- const viewId = `view-${viewCounter += 1}`;
689
- const handle = await state.createView({
690
- databaseId: String(params.databaseId),
691
- definition: params.definition
849
+ case "session.createViewNavigator": {
850
+ const navigatorId = `navigator-${viewCounter += 1}`;
851
+ const navigator = await state.createViewNavigator({
852
+ databaseIds: Array.isArray(params.databaseIds) ? params.databaseIds.map((entry) => String(entry)) : [],
853
+ definition: params.definition,
854
+ options: params.options
692
855
  });
693
- viewSessions.set(viewId, handle);
694
- return { viewId };
856
+ viewSessions.set(navigatorId, navigator);
857
+ return { navigatorId };
695
858
  }
696
- case "session.openView":
697
- await state.openView(String(params.viewId));
859
+ case "session.openViewNavigator": {
860
+ const navigatorId = `navigator-${viewCounter += 1}`;
861
+ const navigator = await state.openViewNavigator(
862
+ String(params.viewId),
863
+ params.options
864
+ );
865
+ viewSessions.set(navigatorId, navigator);
866
+ return { navigatorId };
867
+ }
868
+ case "menus.show":
869
+ return await state.session.menus.show(request.params);
870
+ case "menus.hide":
871
+ await state.session.menus.hide();
698
872
  return { ok: true };
699
873
  case "session.disconnect":
700
874
  await state.session.disconnect();
@@ -757,47 +931,131 @@ function createFakeBridgeHost(options = {}) {
757
931
  String(params.attachmentName),
758
932
  typeof params.timestamp === "number" ? { timestamp: params.timestamp } : void 0
759
933
  );
760
- case "views.getDefinition":
761
- return await (await resolveViewHandle(String(params.viewId))).getDefinition();
762
- case "views.refresh":
763
- return await (await resolveViewHandle(String(params.viewId))).refresh();
764
- case "views.page":
765
- return await (await resolveViewHandle(String(params.viewId))).page(
766
- params.request
934
+ case "viewNavigators.getDefinition":
935
+ return await (await resolveViewNavigator(String(params.navigatorId))).getDefinition();
936
+ case "viewNavigators.refresh":
937
+ return await (await resolveViewNavigator(String(params.navigatorId))).refresh();
938
+ case "viewNavigators.current.get":
939
+ return await (await resolveViewNavigator(String(params.navigatorId))).getCurrentEntry();
940
+ case "viewNavigators.goto.first":
941
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoFirst();
942
+ case "viewNavigators.goto.last":
943
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoLast();
944
+ case "viewNavigators.goto.next":
945
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoNext();
946
+ case "viewNavigators.goto.prev":
947
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoPrev();
948
+ case "viewNavigators.goto.nextSibling":
949
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoNextSibling();
950
+ case "viewNavigators.goto.prevSibling":
951
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoPrevSibling();
952
+ case "viewNavigators.goto.parent":
953
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoParent();
954
+ case "viewNavigators.goto.firstChild":
955
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoFirstChild();
956
+ case "viewNavigators.goto.lastChild":
957
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoLastChild();
958
+ case "viewNavigators.goto.pos":
959
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoPos(String(params.position));
960
+ case "viewNavigators.pos.get":
961
+ return await (await resolveViewNavigator(String(params.navigatorId))).getPos(String(params.position));
962
+ case "viewNavigators.category.findByParts":
963
+ return await (await resolveViewNavigator(String(params.navigatorId))).findCategoryEntryByParts(
964
+ Array.isArray(params.parts) ? params.parts : []
965
+ );
966
+ case "viewNavigators.entries.forward":
967
+ return await (await resolveViewNavigator(String(params.navigatorId))).entriesForward(
968
+ params.options
969
+ );
970
+ case "viewNavigators.entries.backward":
971
+ return await (await resolveViewNavigator(String(params.navigatorId))).entriesBackward(
972
+ params.options
973
+ );
974
+ case "viewNavigators.goto.nextSelected":
975
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoNextSelected();
976
+ case "viewNavigators.goto.prevSelected":
977
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoPrevSelected();
978
+ case "viewNavigators.selection.select":
979
+ return await (await resolveViewNavigator(String(params.navigatorId))).select(
980
+ String(params.origin),
981
+ String(params.docId),
982
+ Boolean(params.selectParentCategories)
983
+ );
984
+ case "viewNavigators.selection.deselect":
985
+ return await (await resolveViewNavigator(String(params.navigatorId))).deselect(String(params.origin), String(params.docId));
986
+ case "viewNavigators.selection.selectAll":
987
+ return await (await resolveViewNavigator(String(params.navigatorId))).selectAllEntries();
988
+ case "viewNavigators.selection.deselectAll":
989
+ return await (await resolveViewNavigator(String(params.navigatorId))).deselectAllEntries();
990
+ case "viewNavigators.selection.isSelected":
991
+ return await (await resolveViewNavigator(String(params.navigatorId))).isSelected(String(params.origin), String(params.docId));
992
+ case "viewNavigators.selection.get":
993
+ return await (await resolveViewNavigator(String(params.navigatorId))).getSelectionState();
994
+ case "viewNavigators.selection.set":
995
+ return await (await resolveViewNavigator(String(params.navigatorId))).setSelectionState(
996
+ params.state
997
+ );
998
+ case "viewNavigators.expansion.expand":
999
+ return await (await resolveViewNavigator(String(params.navigatorId))).expand(String(params.origin), String(params.docId));
1000
+ case "viewNavigators.expansion.collapse":
1001
+ return await (await resolveViewNavigator(String(params.navigatorId))).collapse(String(params.origin), String(params.docId));
1002
+ case "viewNavigators.expansion.expandAll":
1003
+ return await (await resolveViewNavigator(String(params.navigatorId))).expandAll();
1004
+ case "viewNavigators.expansion.collapseAll":
1005
+ return await (await resolveViewNavigator(String(params.navigatorId))).collapseAll();
1006
+ case "viewNavigators.expansion.expandToLevel":
1007
+ return await (await resolveViewNavigator(String(params.navigatorId))).expandToLevel(Number(params.level));
1008
+ case "viewNavigators.expansion.isExpanded":
1009
+ return await (await resolveViewNavigator(String(params.navigatorId))).isExpanded(String(params.entryKey));
1010
+ case "viewNavigators.expansion.get":
1011
+ return await (await resolveViewNavigator(String(params.navigatorId))).getExpansionState();
1012
+ case "viewNavigators.expansion.set":
1013
+ return await (await resolveViewNavigator(String(params.navigatorId))).setExpansionState(
1014
+ params.state
1015
+ );
1016
+ case "viewNavigators.children.entries":
1017
+ return await (await resolveViewNavigator(String(params.navigatorId))).childEntries(String(params.entryKey), Boolean(params.descending));
1018
+ case "viewNavigators.children.categories":
1019
+ return await (await resolveViewNavigator(String(params.navigatorId))).childCategories(String(params.entryKey), Boolean(params.descending));
1020
+ case "viewNavigators.children.documents":
1021
+ return await (await resolveViewNavigator(String(params.navigatorId))).childDocuments(String(params.entryKey), Boolean(params.descending));
1022
+ case "viewNavigators.children.categoriesByKey":
1023
+ return await (await resolveViewNavigator(String(params.navigatorId))).childCategoriesByKey(
1024
+ String(params.entryKey),
1025
+ params.key,
1026
+ typeof params.exact === "boolean" ? params.exact : void 0,
1027
+ typeof params.descending === "boolean" ? params.descending : void 0
1028
+ );
1029
+ case "viewNavigators.children.documentsByKey":
1030
+ return await (await resolveViewNavigator(String(params.navigatorId))).childDocumentsByKey(
1031
+ String(params.entryKey),
1032
+ params.key,
1033
+ typeof params.exact === "boolean" ? params.exact : void 0,
1034
+ typeof params.descending === "boolean" ? params.descending : void 0
767
1035
  );
768
- case "views.expansion.get":
769
- return await (await resolveViewHandle(String(params.viewId))).getExpansionState();
770
- case "views.expansion.set":
771
- return await (await resolveViewHandle(String(params.viewId))).setExpansionState(
772
- params.expansion
1036
+ case "viewNavigators.children.categoriesBetween":
1037
+ return await (await resolveViewNavigator(String(params.navigatorId))).childCategoriesBetween(
1038
+ String(params.entryKey),
1039
+ params.range
773
1040
  );
774
- case "views.expansion.expand":
775
- return await (await resolveViewHandle(String(params.viewId))).expand(String(params.rowKey));
776
- case "views.expansion.collapse":
777
- return await (await resolveViewHandle(String(params.viewId))).collapse(String(params.rowKey));
778
- case "views.expansion.expandAll":
779
- return await (await resolveViewHandle(String(params.viewId))).expandAll();
780
- case "views.expansion.collapseAll":
781
- return await (await resolveViewHandle(String(params.viewId))).collapseAll();
782
- case "views.row.get":
783
- return await (await resolveViewHandle(String(params.viewId))).getRow(String(params.rowKey));
784
- case "views.category.get":
785
- return await (await resolveViewHandle(String(params.viewId))).getCategory(
786
- params.lookup
1041
+ case "viewNavigators.children.documentsBetween":
1042
+ return await (await resolveViewNavigator(String(params.navigatorId))).childDocumentsBetween(
1043
+ String(params.entryKey),
1044
+ params.range
787
1045
  );
788
- case "views.category.page":
789
- return await (await resolveViewHandle(String(params.viewId))).pageCategory(
790
- String(params.categoryKey),
791
- params.request
1046
+ case "viewNavigators.sortedDocIds.get":
1047
+ return await (await resolveViewNavigator(String(params.navigatorId))).getSortedDocIds(
1048
+ typeof params.descending === "boolean" ? params.descending : void 0
792
1049
  );
793
- case "views.category.documentIds":
794
- return await (await resolveViewHandle(String(params.viewId))).listCategoryDocumentIds(
795
- String(params.categoryKey)
1050
+ case "viewNavigators.sortedDocIds.scoped":
1051
+ return await (await resolveViewNavigator(String(params.navigatorId))).getSortedDocIdsScoped(
1052
+ String(params.entryKey),
1053
+ typeof params.descending === "boolean" ? params.descending : void 0
796
1054
  );
797
- case "views.dispose": {
798
- const key = String(params.viewId);
799
- const handle = await resolveViewHandle(String(params.viewId));
800
- await handle.dispose();
1055
+ case "viewNavigators.dispose": {
1056
+ const key = String(params.navigatorId);
1057
+ const navigator = await resolveViewNavigator(key);
1058
+ await navigator.dispose();
801
1059
  viewSessions.delete(key);
802
1060
  return void 0;
803
1061
  }
@@ -877,7 +1135,7 @@ function createFakeBridgeHost(options = {}) {
877
1135
  return;
878
1136
  }
879
1137
  const builtinResult = await handleBuiltinRequest(message);
880
- if (builtinResult === void 0 && message.method !== "views.dispose") {
1138
+ if (builtinResult === void 0 && message.method !== "viewNavigators.dispose") {
881
1139
  postRpcError(port, message.id, {
882
1140
  code: "unsupported-method",
883
1141
  message: `No fake bridge handler is configured for ${message.method}.`