mindoodb-app-sdk 0.0.6 → 0.0.8

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) {
@@ -361,6 +497,12 @@ function createDatabaseHandle(definition) {
361
497
  async openWriteStream(_docId, _attachmentName, _contentType) {
362
498
  return createDefaultWritableAttachmentStream();
363
499
  },
500
+ async preparePreviewSession(_docId, _attachmentName, _options) {
501
+ return {
502
+ sessionId: "preview-session-1",
503
+ previewUrl: "about:blank"
504
+ };
505
+ },
364
506
  async openPreview(_docId, _attachmentName, _options) {
365
507
  return { ok: true };
366
508
  }
@@ -398,11 +540,11 @@ function createMockSessionState(options = {}) {
398
540
  for (const definition of definitions) {
399
541
  databaseHandles.set(definition.info.id, createDatabaseHandle(definition));
400
542
  databaseViewApis.set(definition.info.id, {
401
- async create(_definition) {
402
- return await createDefaultViewHandle();
543
+ async create(_input) {
544
+ return await createDefaultViewNavigator();
403
545
  },
404
546
  async open(_viewId) {
405
- return await createDefaultViewHandle();
547
+ return await createDefaultViewNavigator();
406
548
  },
407
549
  ...definition.methods?.views ?? {}
408
550
  });
@@ -427,17 +569,21 @@ function createMockSessionState(options = {}) {
427
569
  }
428
570
  return database;
429
571
  },
430
- async createView(input) {
431
- const api = databaseViewApis.get(input.databaseId);
572
+ async createViewNavigator(input) {
573
+ const firstDatabaseId = input.databaseIds[0];
574
+ if (!firstDatabaseId) {
575
+ throw new Error("At least one test database is required for view creation.");
576
+ }
577
+ const api = databaseViewApis.get(firstDatabaseId);
432
578
  if (!api) {
433
- throw new Error(`Unknown test database for view creation: ${input.databaseId}`);
579
+ throw new Error(`Unknown test database for view creation: ${firstDatabaseId}`);
434
580
  }
435
- const view = await api.create(input.definition);
581
+ const view = await api.create(input);
436
582
  const viewId = input.definition.id || crypto.randomUUID();
437
583
  sessionViews.set(viewId, view);
438
584
  return view;
439
585
  },
440
- async openView(viewId) {
586
+ async openViewNavigator(viewId, options2) {
441
587
  const existing = sessionViews.get(viewId);
442
588
  if (existing) {
443
589
  return existing;
@@ -450,7 +596,7 @@ function createMockSessionState(options = {}) {
450
596
  if (!api) {
451
597
  throw new Error(`Unknown test database for view ${viewId}: ${sourceDatabaseId}`);
452
598
  }
453
- const view = await api.open(viewId);
599
+ const view = await api.open(viewId, options2);
454
600
  sessionViews.set(viewId, view);
455
601
  return view;
456
602
  },
@@ -497,8 +643,8 @@ function createMockSessionState(options = {}) {
497
643
  }
498
644
  return database;
499
645
  },
500
- createView: session.createView,
501
- openView: session.openView,
646
+ createViewNavigator: session.createViewNavigator,
647
+ openViewNavigator: session.openViewNavigator,
502
648
  bridge,
503
649
  session,
504
650
  emitThemeChange(theme) {
@@ -628,14 +774,14 @@ function createFakeBridgeHost(options = {}) {
628
774
  });
629
775
  installed = true;
630
776
  }
631
- async function resolveViewHandle(viewId) {
777
+ async function resolveViewNavigator(viewId) {
632
778
  const existing = viewSessions.get(viewId);
633
779
  if (existing) {
634
780
  return existing;
635
781
  }
636
- const handle = await state.openView(viewId);
637
- viewSessions.set(viewId, handle);
638
- return handle;
782
+ const navigator = await state.openViewNavigator(viewId);
783
+ viewSessions.set(viewId, navigator);
784
+ return navigator;
639
785
  }
640
786
  function postRpcSuccess(port, requestId, result) {
641
787
  port.postMessage({
@@ -678,18 +824,25 @@ function createFakeBridgeHost(options = {}) {
678
824
  case "session.openDatabase":
679
825
  state.getDatabase(String(params.databaseId));
680
826
  return { ok: true };
681
- case "session.createView": {
682
- const viewId = `view-${viewCounter += 1}`;
683
- const handle = await state.createView({
684
- databaseId: String(params.databaseId),
685
- definition: params.definition
827
+ case "session.createViewNavigator": {
828
+ const navigatorId = `navigator-${viewCounter += 1}`;
829
+ const navigator = await state.createViewNavigator({
830
+ databaseIds: Array.isArray(params.databaseIds) ? params.databaseIds.map((entry) => String(entry)) : [],
831
+ definition: params.definition,
832
+ options: params.options
686
833
  });
687
- viewSessions.set(viewId, handle);
688
- return { viewId };
834
+ viewSessions.set(navigatorId, navigator);
835
+ return { navigatorId };
836
+ }
837
+ case "session.openViewNavigator": {
838
+ const navigatorId = `navigator-${viewCounter += 1}`;
839
+ const navigator = await state.openViewNavigator(
840
+ String(params.viewId),
841
+ params.options
842
+ );
843
+ viewSessions.set(navigatorId, navigator);
844
+ return { navigatorId };
689
845
  }
690
- case "session.openView":
691
- await state.openView(String(params.viewId));
692
- return { ok: true };
693
846
  case "session.disconnect":
694
847
  await state.session.disconnect();
695
848
  return { ok: true };
@@ -745,47 +898,137 @@ function createFakeBridgeHost(options = {}) {
745
898
  String(params.attachmentName),
746
899
  typeof params.timestamp === "number" ? { timestamp: params.timestamp } : void 0
747
900
  );
748
- case "views.getDefinition":
749
- return await (await resolveViewHandle(String(params.viewId))).getDefinition();
750
- case "views.refresh":
751
- return await (await resolveViewHandle(String(params.viewId))).refresh();
752
- case "views.page":
753
- return await (await resolveViewHandle(String(params.viewId))).page(
754
- params.request
901
+ case "attachments.preparePreviewSession":
902
+ return await state.getDatabase(String(params.databaseId)).attachments.preparePreviewSession(
903
+ String(params.docId),
904
+ String(params.attachmentName),
905
+ typeof params.timestamp === "number" ? { timestamp: params.timestamp } : void 0
906
+ );
907
+ case "viewNavigators.getDefinition":
908
+ return await (await resolveViewNavigator(String(params.navigatorId))).getDefinition();
909
+ case "viewNavigators.refresh":
910
+ return await (await resolveViewNavigator(String(params.navigatorId))).refresh();
911
+ case "viewNavigators.current.get":
912
+ return await (await resolveViewNavigator(String(params.navigatorId))).getCurrentEntry();
913
+ case "viewNavigators.goto.first":
914
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoFirst();
915
+ case "viewNavigators.goto.last":
916
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoLast();
917
+ case "viewNavigators.goto.next":
918
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoNext();
919
+ case "viewNavigators.goto.prev":
920
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoPrev();
921
+ case "viewNavigators.goto.nextSibling":
922
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoNextSibling();
923
+ case "viewNavigators.goto.prevSibling":
924
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoPrevSibling();
925
+ case "viewNavigators.goto.parent":
926
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoParent();
927
+ case "viewNavigators.goto.firstChild":
928
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoFirstChild();
929
+ case "viewNavigators.goto.lastChild":
930
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoLastChild();
931
+ case "viewNavigators.goto.pos":
932
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoPos(String(params.position));
933
+ case "viewNavigators.pos.get":
934
+ return await (await resolveViewNavigator(String(params.navigatorId))).getPos(String(params.position));
935
+ case "viewNavigators.category.findByParts":
936
+ return await (await resolveViewNavigator(String(params.navigatorId))).findCategoryEntryByParts(
937
+ Array.isArray(params.parts) ? params.parts : []
938
+ );
939
+ case "viewNavigators.entries.forward":
940
+ return await (await resolveViewNavigator(String(params.navigatorId))).entriesForward(
941
+ params.options
942
+ );
943
+ case "viewNavigators.entries.backward":
944
+ return await (await resolveViewNavigator(String(params.navigatorId))).entriesBackward(
945
+ params.options
946
+ );
947
+ case "viewNavigators.goto.nextSelected":
948
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoNextSelected();
949
+ case "viewNavigators.goto.prevSelected":
950
+ return await (await resolveViewNavigator(String(params.navigatorId))).gotoPrevSelected();
951
+ case "viewNavigators.selection.select":
952
+ return await (await resolveViewNavigator(String(params.navigatorId))).select(
953
+ String(params.origin),
954
+ String(params.docId),
955
+ Boolean(params.selectParentCategories)
956
+ );
957
+ case "viewNavigators.selection.deselect":
958
+ return await (await resolveViewNavigator(String(params.navigatorId))).deselect(String(params.origin), String(params.docId));
959
+ case "viewNavigators.selection.selectAll":
960
+ return await (await resolveViewNavigator(String(params.navigatorId))).selectAllEntries();
961
+ case "viewNavigators.selection.deselectAll":
962
+ return await (await resolveViewNavigator(String(params.navigatorId))).deselectAllEntries();
963
+ case "viewNavigators.selection.isSelected":
964
+ return await (await resolveViewNavigator(String(params.navigatorId))).isSelected(String(params.origin), String(params.docId));
965
+ case "viewNavigators.selection.get":
966
+ return await (await resolveViewNavigator(String(params.navigatorId))).getSelectionState();
967
+ case "viewNavigators.selection.set":
968
+ return await (await resolveViewNavigator(String(params.navigatorId))).setSelectionState(
969
+ params.state
970
+ );
971
+ case "viewNavigators.expansion.expand":
972
+ return await (await resolveViewNavigator(String(params.navigatorId))).expand(String(params.origin), String(params.docId));
973
+ case "viewNavigators.expansion.collapse":
974
+ return await (await resolveViewNavigator(String(params.navigatorId))).collapse(String(params.origin), String(params.docId));
975
+ case "viewNavigators.expansion.expandAll":
976
+ return await (await resolveViewNavigator(String(params.navigatorId))).expandAll();
977
+ case "viewNavigators.expansion.collapseAll":
978
+ return await (await resolveViewNavigator(String(params.navigatorId))).collapseAll();
979
+ case "viewNavigators.expansion.expandToLevel":
980
+ return await (await resolveViewNavigator(String(params.navigatorId))).expandToLevel(Number(params.level));
981
+ case "viewNavigators.expansion.isExpanded":
982
+ return await (await resolveViewNavigator(String(params.navigatorId))).isExpanded(String(params.entryKey));
983
+ case "viewNavigators.expansion.get":
984
+ return await (await resolveViewNavigator(String(params.navigatorId))).getExpansionState();
985
+ case "viewNavigators.expansion.set":
986
+ return await (await resolveViewNavigator(String(params.navigatorId))).setExpansionState(
987
+ params.state
988
+ );
989
+ case "viewNavigators.children.entries":
990
+ return await (await resolveViewNavigator(String(params.navigatorId))).childEntries(String(params.entryKey), Boolean(params.descending));
991
+ case "viewNavigators.children.categories":
992
+ return await (await resolveViewNavigator(String(params.navigatorId))).childCategories(String(params.entryKey), Boolean(params.descending));
993
+ case "viewNavigators.children.documents":
994
+ return await (await resolveViewNavigator(String(params.navigatorId))).childDocuments(String(params.entryKey), Boolean(params.descending));
995
+ case "viewNavigators.children.categoriesByKey":
996
+ return await (await resolveViewNavigator(String(params.navigatorId))).childCategoriesByKey(
997
+ String(params.entryKey),
998
+ params.key,
999
+ typeof params.exact === "boolean" ? params.exact : void 0,
1000
+ typeof params.descending === "boolean" ? params.descending : void 0
1001
+ );
1002
+ case "viewNavigators.children.documentsByKey":
1003
+ return await (await resolveViewNavigator(String(params.navigatorId))).childDocumentsByKey(
1004
+ String(params.entryKey),
1005
+ params.key,
1006
+ typeof params.exact === "boolean" ? params.exact : void 0,
1007
+ typeof params.descending === "boolean" ? params.descending : void 0
755
1008
  );
756
- case "views.expansion.get":
757
- return await (await resolveViewHandle(String(params.viewId))).getExpansionState();
758
- case "views.expansion.set":
759
- return await (await resolveViewHandle(String(params.viewId))).setExpansionState(
760
- params.expansion
1009
+ case "viewNavigators.children.categoriesBetween":
1010
+ return await (await resolveViewNavigator(String(params.navigatorId))).childCategoriesBetween(
1011
+ String(params.entryKey),
1012
+ params.range
761
1013
  );
762
- case "views.expansion.expand":
763
- return await (await resolveViewHandle(String(params.viewId))).expand(String(params.rowKey));
764
- case "views.expansion.collapse":
765
- return await (await resolveViewHandle(String(params.viewId))).collapse(String(params.rowKey));
766
- case "views.expansion.expandAll":
767
- return await (await resolveViewHandle(String(params.viewId))).expandAll();
768
- case "views.expansion.collapseAll":
769
- return await (await resolveViewHandle(String(params.viewId))).collapseAll();
770
- case "views.row.get":
771
- return await (await resolveViewHandle(String(params.viewId))).getRow(String(params.rowKey));
772
- case "views.category.get":
773
- return await (await resolveViewHandle(String(params.viewId))).getCategory(
774
- params.lookup
1014
+ case "viewNavigators.children.documentsBetween":
1015
+ return await (await resolveViewNavigator(String(params.navigatorId))).childDocumentsBetween(
1016
+ String(params.entryKey),
1017
+ params.range
775
1018
  );
776
- case "views.category.page":
777
- return await (await resolveViewHandle(String(params.viewId))).pageCategory(
778
- String(params.categoryKey),
779
- params.request
1019
+ case "viewNavigators.sortedDocIds.get":
1020
+ return await (await resolveViewNavigator(String(params.navigatorId))).getSortedDocIds(
1021
+ typeof params.descending === "boolean" ? params.descending : void 0
780
1022
  );
781
- case "views.category.documentIds":
782
- return await (await resolveViewHandle(String(params.viewId))).listCategoryDocumentIds(
783
- String(params.categoryKey)
1023
+ case "viewNavigators.sortedDocIds.scoped":
1024
+ return await (await resolveViewNavigator(String(params.navigatorId))).getSortedDocIdsScoped(
1025
+ String(params.entryKey),
1026
+ typeof params.descending === "boolean" ? params.descending : void 0
784
1027
  );
785
- case "views.dispose": {
786
- const key = String(params.viewId);
787
- const handle = await resolveViewHandle(String(params.viewId));
788
- await handle.dispose();
1028
+ case "viewNavigators.dispose": {
1029
+ const key = String(params.navigatorId);
1030
+ const navigator = await resolveViewNavigator(key);
1031
+ await navigator.dispose();
789
1032
  viewSessions.delete(key);
790
1033
  return void 0;
791
1034
  }
@@ -865,7 +1108,7 @@ function createFakeBridgeHost(options = {}) {
865
1108
  return;
866
1109
  }
867
1110
  const builtinResult = await handleBuiltinRequest(message);
868
- if (builtinResult === void 0 && message.method !== "views.dispose") {
1111
+ if (builtinResult === void 0 && message.method !== "viewNavigators.dispose") {
869
1112
  postRpcError(port, message.id, {
870
1113
  code: "unsupported-method",
871
1114
  message: `No fake bridge handler is configured for ${message.method}.`