@airtable/blocks 1.10.1 → 1.10.2-experimental-640bd10-20220211

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 (74) hide show
  1. package/CHANGELOG.md +5 -1
  2. package/dist/cjs/error_utils.js +44 -2
  3. package/dist/cjs/models/grouped_record_query_result.js +5 -14
  4. package/dist/cjs/models/linked_records_query_result.js +78 -27
  5. package/dist/cjs/models/mutations.js +18 -162
  6. package/dist/cjs/models/query_manager.js +328 -0
  7. package/dist/cjs/models/record.js +310 -55
  8. package/dist/cjs/models/record_query_result.js +4 -1
  9. package/dist/cjs/models/record_store.js +557 -765
  10. package/dist/cjs/models/table.js +6 -6
  11. package/dist/cjs/models/table_or_view_query_result.js +526 -419
  12. package/dist/cjs/models/view_data_store.js +255 -295
  13. package/dist/cjs/private_utils.js +40 -0
  14. package/dist/cjs/sdk.js +12 -2
  15. package/dist/cjs/testing/abstract_mock_airtable_interface.js +57 -11
  16. package/dist/cjs/testing/fixture_data.js +268 -0
  17. package/dist/cjs/testing/mock_base_data_stores.js +876 -0
  18. package/dist/cjs/types/airtable_interface.js +17 -2
  19. package/dist/cjs/types/block_query_spec.js +85 -0
  20. package/dist/cjs/ui/use_records.js +5 -1
  21. package/dist/cjs/unstable_testing_utils.js +55 -1
  22. package/dist/cjs/watchable.js +15 -1
  23. package/dist/types/src/error_utils.d.ts +6 -0
  24. package/dist/types/src/error_utils.d.ts.map +1 -1
  25. package/dist/types/src/models/grouped_record_query_result.d.ts +3 -3
  26. package/dist/types/src/models/grouped_record_query_result.d.ts.map +1 -1
  27. package/dist/types/src/models/linked_records_query_result.d.ts.map +1 -1
  28. package/dist/types/src/models/mutations.d.ts.map +1 -1
  29. package/dist/types/src/models/query_manager.d.ts +2 -0
  30. package/dist/types/src/models/query_manager.d.ts.map +1 -0
  31. package/dist/types/src/models/record.d.ts +12 -3
  32. package/dist/types/src/models/record.d.ts.map +1 -1
  33. package/dist/types/src/models/record_query_result.d.ts +3 -2
  34. package/dist/types/src/models/record_query_result.d.ts.map +1 -1
  35. package/dist/types/src/models/record_store.d.ts.map +1 -1
  36. package/dist/types/src/models/table_or_view_query_result.d.ts +3 -5
  37. package/dist/types/src/models/table_or_view_query_result.d.ts.map +1 -1
  38. package/dist/types/src/models/view_data_store.d.ts +0 -1
  39. package/dist/types/src/models/view_data_store.d.ts.map +1 -1
  40. package/dist/types/src/models/view_metadata_query_result.d.ts +1 -1
  41. package/dist/types/src/models/view_metadata_query_result.d.ts.map +1 -1
  42. package/dist/types/src/private_utils.d.ts +24 -1
  43. package/dist/types/src/private_utils.d.ts.map +1 -1
  44. package/dist/types/src/sdk.d.ts.map +1 -1
  45. package/dist/types/src/testing/abstract_mock_airtable_interface.d.ts +11 -11
  46. package/dist/types/src/testing/abstract_mock_airtable_interface.d.ts.map +1 -1
  47. package/dist/types/{test/airtable_interface_mocks → src/testing}/fixture_data.d.ts +42 -19
  48. package/dist/types/src/testing/fixture_data.d.ts.map +1 -0
  49. package/dist/types/src/testing/mock_base_data_stores.d.ts +55 -0
  50. package/dist/types/src/testing/mock_base_data_stores.d.ts.map +1 -0
  51. package/dist/types/src/types/airtable_interface.d.ts +59 -20
  52. package/dist/types/src/types/airtable_interface.d.ts.map +1 -1
  53. package/dist/types/src/types/block_query_spec.d.ts +139 -0
  54. package/dist/types/src/types/block_query_spec.d.ts.map +1 -0
  55. package/dist/types/src/types/table.d.ts +0 -2
  56. package/dist/types/src/types/table.d.ts.map +1 -1
  57. package/dist/types/src/types/view.d.ts +3 -8
  58. package/dist/types/src/types/view.d.ts.map +1 -1
  59. package/dist/types/src/ui/record_card.d.ts +1 -1
  60. package/dist/types/src/unstable_testing_utils.d.ts +4 -1
  61. package/dist/types/src/unstable_testing_utils.d.ts.map +1 -1
  62. package/dist/types/src/watchable.d.ts.map +1 -1
  63. package/dist/types/test/airtable_interface_mocks/linked_records.d.ts +1 -1
  64. package/dist/types/test/airtable_interface_mocks/linked_records.d.ts.map +1 -1
  65. package/dist/types/test/airtable_interface_mocks/mock_airtable_interface.d.ts +19 -12
  66. package/dist/types/test/airtable_interface_mocks/mock_airtable_interface.d.ts.map +1 -1
  67. package/dist/types/test/airtable_interface_mocks/project_tracker.d.ts +1 -1
  68. package/dist/types/test/airtable_interface_mocks/project_tracker.d.ts.map +1 -1
  69. package/dist/types/test/test_helpers.d.ts +2 -0
  70. package/dist/types/test/test_helpers.d.ts.map +1 -1
  71. package/dist/types/test/testing/fixture_data.test.d.ts +2 -0
  72. package/dist/types/test/testing/fixture_data.test.d.ts.map +1 -0
  73. package/package.json +2 -1
  74. package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts.map +0 -1
@@ -0,0 +1,876 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ require("core-js/modules/es.symbol");
6
+
7
+ require("core-js/modules/es.symbol.description");
8
+
9
+ require("core-js/modules/es.array.concat");
10
+
11
+ require("core-js/modules/es.array.filter");
12
+
13
+ require("core-js/modules/es.array.find");
14
+
15
+ require("core-js/modules/es.array.find-index");
16
+
17
+ require("core-js/modules/es.array.includes");
18
+
19
+ require("core-js/modules/es.array.index-of");
20
+
21
+ require("core-js/modules/es.array.iterator");
22
+
23
+ require("core-js/modules/es.array.map");
24
+
25
+ require("core-js/modules/es.array.slice");
26
+
27
+ require("core-js/modules/es.array.splice");
28
+
29
+ require("core-js/modules/es.object.get-own-property-descriptors");
30
+
31
+ require("core-js/modules/es.object.to-string");
32
+
33
+ require("core-js/modules/es.object.values");
34
+
35
+ require("core-js/modules/es.promise");
36
+
37
+ require("core-js/modules/es.string.includes");
38
+
39
+ require("core-js/modules/web.dom-collections.for-each");
40
+
41
+ require("core-js/modules/web.dom-collections.iterator");
42
+
43
+ Object.defineProperty(exports, "__esModule", {
44
+ value: true
45
+ });
46
+ exports.MockBaseDataStore = void 0;
47
+
48
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
49
+
50
+ require("regenerator-runtime/runtime");
51
+
52
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
53
+
54
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
55
+
56
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
57
+
58
+ var _airtable_interface = require("../types/airtable_interface");
59
+
60
+ var _block_query_spec = require("../types/block_query_spec");
61
+
62
+ var _view = require("../types/view");
63
+
64
+ var _private_utils = require("../private_utils");
65
+
66
+ var _error_utils = require("../error_utils");
67
+
68
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
69
+
70
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
71
+
72
+ var blockQueryIdCounter = 0;
73
+ /** @internal */
74
+
75
+ var unmodifiableTableData = {
76
+ lock: null,
77
+ externalSyncById: null
78
+ };
79
+ /** @internal */
80
+
81
+ var unmodifiableFieldData = {
82
+ lock: null
83
+ };
84
+ /** @hidden */
85
+
86
+ var MockBaseDataStore =
87
+ /*#__PURE__*/
88
+ function () {
89
+ function MockBaseDataStore(mockAirtableInterface, fixtureData) {
90
+ (0, _classCallCheck2.default)(this, MockBaseDataStore);
91
+ (0, _defineProperty2.default)(this, "_mockAirtableInterface", void 0);
92
+ (0, _defineProperty2.default)(this, "_fixtureData", void 0);
93
+ (0, _defineProperty2.default)(this, "_tablesById", {});
94
+ (0, _defineProperty2.default)(this, "_subscribedQuerySpecs", {});
95
+ (0, _defineProperty2.default)(this, "_deletedRecordIds", []);
96
+ (0, _defineProperty2.default)(this, "_onUnsubscribeFromQueryCallback", null);
97
+ (0, _defineProperty2.default)(this, "_upperQueryIdsFromPreviousTests", 0);
98
+ (0, _defineProperty2.default)(this, "_shouldQueriesFail", false);
99
+ this._mockAirtableInterface = mockAirtableInterface;
100
+ this._fixtureData = fixtureData;
101
+ this._upperQueryIdsFromPreviousTests = blockQueryIdCounter;
102
+ fixtureData.base.tables.forEach(table => {
103
+ this._tablesById[table.id] = table;
104
+ });
105
+ }
106
+
107
+ (0, _createClass2.default)(MockBaseDataStore, [{
108
+ key: "setSubscribeToQueryFailureMode",
109
+ value: function setSubscribeToQueryFailureMode(shouldQueriesFail) {
110
+ this._shouldQueriesFail = shouldQueriesFail;
111
+ } // Subscribing / unsubscribing from queries
112
+
113
+ }, {
114
+ key: "subscribeToQueryAndPopulateStoresAsync",
115
+ value: function subscribeToQueryAndPopulateStoresAsync(querySpec, options) {
116
+ var blockQueryId;
117
+ return _regenerator.default.async(function subscribeToQueryAndPopulateStoresAsync$(_context) {
118
+ while (1) {
119
+ switch (_context.prev = _context.next) {
120
+ case 0:
121
+ if (!this._shouldQueriesFail) {
122
+ _context.next = 2;
123
+ break;
124
+ }
125
+
126
+ return _context.abrupt("return", {
127
+ success: false
128
+ });
129
+
130
+ case 2:
131
+ blockQueryId = "bqy".concat(blockQueryIdCounter++);
132
+ this._subscribedQuerySpecs[blockQueryId] = {
133
+ querySpec,
134
+ onChangeCallback: options.onChangeCallback,
135
+ callbackPriority: options.callbackPriority
136
+ };
137
+ return _context.abrupt("return", {
138
+ success: true,
139
+ blockQueryId
140
+ });
141
+
142
+ case 5:
143
+ case "end":
144
+ return _context.stop();
145
+ }
146
+ }
147
+ }, null, this);
148
+ }
149
+ }, {
150
+ key: "unsubscribeFromQueryIdsAsync",
151
+ value: function unsubscribeFromQueryIdsAsync(querySpecIds) {
152
+ var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, querySpecId, querySpecIdCount;
153
+
154
+ return _regenerator.default.async(function unsubscribeFromQueryIdsAsync$(_context2) {
155
+ while (1) {
156
+ switch (_context2.prev = _context2.next) {
157
+ case 0:
158
+ _iteratorNormalCompletion = true;
159
+ _didIteratorError = false;
160
+ _iteratorError = undefined;
161
+ _context2.prev = 3;
162
+ _iterator = querySpecIds[Symbol.iterator]();
163
+
164
+ case 5:
165
+ if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
166
+ _context2.next = 18;
167
+ break;
168
+ }
169
+
170
+ querySpecId = _step.value;
171
+
172
+ if (this._subscribedQuerySpecs[querySpecId]) {
173
+ _context2.next = 14;
174
+ break;
175
+ }
176
+
177
+ querySpecIdCount = parseInt(querySpecId.slice(3), 10);
178
+
179
+ if (!(querySpecIdCount <= this._upperQueryIdsFromPreviousTests)) {
180
+ _context2.next = 13;
181
+ break;
182
+ }
183
+
184
+ // TODO: Remove this console.log / special case by forcing all tests to clean up
185
+ // eslint-disable-next-line no-console
186
+ console.log("unsubscribed querySpecId from previous test ".concat(querySpecId));
187
+ _context2.next = 14;
188
+ break;
189
+
190
+ case 13:
191
+ throw (0, _error_utils.spawnError)('Unexpected querySpecId %s', querySpecId);
192
+
193
+ case 14:
194
+ delete this._subscribedQuerySpecs[querySpecId];
195
+
196
+ case 15:
197
+ _iteratorNormalCompletion = true;
198
+ _context2.next = 5;
199
+ break;
200
+
201
+ case 18:
202
+ _context2.next = 24;
203
+ break;
204
+
205
+ case 20:
206
+ _context2.prev = 20;
207
+ _context2.t0 = _context2["catch"](3);
208
+ _didIteratorError = true;
209
+ _iteratorError = _context2.t0;
210
+
211
+ case 24:
212
+ _context2.prev = 24;
213
+ _context2.prev = 25;
214
+
215
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
216
+ _iterator.return();
217
+ }
218
+
219
+ case 27:
220
+ _context2.prev = 27;
221
+
222
+ if (!_didIteratorError) {
223
+ _context2.next = 30;
224
+ break;
225
+ }
226
+
227
+ throw _iteratorError;
228
+
229
+ case 30:
230
+ return _context2.finish(27);
231
+
232
+ case 31:
233
+ return _context2.finish(24);
234
+
235
+ case 32:
236
+ if (this._onUnsubscribeFromQueryCallback) {
237
+ this._onUnsubscribeFromQueryCallback();
238
+ }
239
+
240
+ return _context2.abrupt("return", {
241
+ status: true
242
+ });
243
+
244
+ case 34:
245
+ case "end":
246
+ return _context2.stop();
247
+ }
248
+ }
249
+ }, null, this, [[3, 20, 24, 32], [25,, 27, 31]]);
250
+ }
251
+ }, {
252
+ key: "setTableRecordsAsync",
253
+ value: function setTableRecordsAsync(tableId, fixtureRecords) {
254
+ var table;
255
+ return _regenerator.default.async(function setTableRecordsAsync$(_context3) {
256
+ while (1) {
257
+ switch (_context3.prev = _context3.next) {
258
+ case 0:
259
+ table = this._tablesById[tableId];
260
+ (0, _error_utils.invariant)(table, 'setTableRecordsAsync called with missing table %s', tableId);
261
+ table.records = fixtureRecords;
262
+
263
+ case 3:
264
+ case "end":
265
+ return _context3.stop();
266
+ }
267
+ }
268
+ }, null, this);
269
+ }
270
+ }, {
271
+ key: "deleteRecordAsync",
272
+ value: function deleteRecordAsync(tableId, recordId) {
273
+ var table, record, _i, _Object$values, _Object$values$_i, querySpec, onChangeCallback;
274
+
275
+ return _regenerator.default.async(function deleteRecordAsync$(_context4) {
276
+ while (1) {
277
+ switch (_context4.prev = _context4.next) {
278
+ case 0:
279
+ // Need to simulate two hyperbase updates:
280
+ // 1. delete the record in the RecordStoreForTable
281
+ // 2. simulate the ModelChange update
282
+ table = this._tablesById[tableId];
283
+ (0, _error_utils.invariant)(table, 'deleteRecordAsync called with missing table %s', tableId);
284
+ record = table.records.find(r => r.id === recordId);
285
+ (0, _error_utils.invariant)(record, 'deleteRecordAsync called with missing record %s', recordId); // We don't update table.records or record here to ensure that the
286
+ // mock implementation of isRecordPartiallyLoaded still returns `true`
287
+ // for this given recordId
288
+
289
+ this._deletedRecordIds.push(recordId);
290
+
291
+ _i = 0, _Object$values = Object.values(this._subscribedQuerySpecs);
292
+
293
+ case 6:
294
+ if (!(_i < _Object$values.length)) {
295
+ _context4.next = 16;
296
+ break;
297
+ }
298
+
299
+ _Object$values$_i = _Object$values[_i], querySpec = _Object$values$_i.querySpec, onChangeCallback = _Object$values$_i.onChangeCallback;
300
+
301
+ if (onChangeCallback) {
302
+ _context4.next = 10;
303
+ break;
304
+ }
305
+
306
+ return _context4.abrupt("continue", 13);
307
+
308
+ case 10:
309
+ if (!(querySpec.sourceTableId !== tableId)) {
310
+ _context4.next = 12;
311
+ break;
312
+ }
313
+
314
+ return _context4.abrupt("continue", 13);
315
+
316
+ case 12:
317
+ onChangeCallback([{
318
+ type: _block_query_spec.BlockQuerySubscriptionChangeType.REMOVED_RECORD_IDS,
319
+ tableId,
320
+ recordIds: [recordId]
321
+ }]);
322
+
323
+ case 13:
324
+ _i++;
325
+ _context4.next = 6;
326
+ break;
327
+
328
+ case 16:
329
+ case "end":
330
+ return _context4.stop();
331
+ }
332
+ }
333
+ }, null, this);
334
+ }
335
+ }, {
336
+ key: "createRecordAsync",
337
+ value: function createRecordAsync(tableId, initialFixtureRecord) {
338
+ var table, _i2, _Object$values2, _Object$values2$_i, querySpec, onChangeCallback;
339
+
340
+ return _regenerator.default.async(function createRecordAsync$(_context5) {
341
+ while (1) {
342
+ switch (_context5.prev = _context5.next) {
343
+ case 0:
344
+ table = this._tablesById[tableId];
345
+ (0, _error_utils.invariant)(table, 'updateRecord called with missing table %s', tableId);
346
+ table.records.push(initialFixtureRecord);
347
+ _i2 = 0, _Object$values2 = Object.values(this._subscribedQuerySpecs);
348
+
349
+ case 4:
350
+ if (!(_i2 < _Object$values2.length)) {
351
+ _context5.next = 14;
352
+ break;
353
+ }
354
+
355
+ _Object$values2$_i = _Object$values2[_i2], querySpec = _Object$values2$_i.querySpec, onChangeCallback = _Object$values2$_i.onChangeCallback;
356
+
357
+ if (onChangeCallback) {
358
+ _context5.next = 8;
359
+ break;
360
+ }
361
+
362
+ return _context5.abrupt("continue", 11);
363
+
364
+ case 8:
365
+ if (!(querySpec.sourceTableId !== tableId)) {
366
+ _context5.next = 10;
367
+ break;
368
+ }
369
+
370
+ return _context5.abrupt("continue", 11);
371
+
372
+ case 10:
373
+ onChangeCallback([{
374
+ type: _block_query_spec.BlockQuerySubscriptionChangeType.ADDED_RECORD_IDS,
375
+ tableId,
376
+ recordIds: [initialFixtureRecord.id]
377
+ }]);
378
+
379
+ case 11:
380
+ _i2++;
381
+ _context5.next = 4;
382
+ break;
383
+
384
+ case 14:
385
+ case "end":
386
+ return _context5.stop();
387
+ }
388
+ }
389
+ }, null, this);
390
+ }
391
+ }, {
392
+ key: "updateRecord",
393
+ value: function updateRecord(tableId, recordId, fieldId, newValue, opts) {
394
+ var _ref = opts !== null && opts !== void 0 ? opts : {},
395
+ allowUnexpected = _ref.allowUnexpected,
396
+ shouldForceOnChangeCallbackWhenNoQueriesMatchRecord = _ref.shouldForceOnChangeCallbackWhenNoQueriesMatchRecord,
397
+ shouldCallSubscriptionChangesWithEmptyArray = _ref.shouldCallSubscriptionChangesWithEmptyArray;
398
+
399
+ var table = this._tablesById[tableId];
400
+ (0, _error_utils.invariant)(table, 'updateRecord called with missing table %s', tableId);
401
+ var record = table.records.find(r => r.id === recordId);
402
+
403
+ if (!allowUnexpected) {
404
+ (0, _error_utils.invariant)(record, 'updateRecord called with missing record %s', recordId);
405
+ }
406
+
407
+ var field = table.fields.find(f => f.id === fieldId);
408
+ (0, _error_utils.invariant)(field, 'updateRecord called with missing field %s', fieldId);
409
+
410
+ if (record) {
411
+ record.cellValuesByFieldId[fieldId] = newValue;
412
+ }
413
+
414
+ for (var _i3 = 0, _Object$values3 = Object.values(this._subscribedQuerySpecs); _i3 < _Object$values3.length; _i3++) {
415
+ var _querySpec$recordSele, _querySpec$recordSele2, _querySpec$recordSele3, _querySpec$recordSele4, _querySpec$recordSele5;
416
+
417
+ var _Object$values3$_i = _Object$values3[_i3],
418
+ querySpec = _Object$values3$_i.querySpec,
419
+ onChangeCallback = _Object$values3$_i.onChangeCallback;
420
+
421
+ if (!onChangeCallback) {
422
+ continue;
423
+ }
424
+
425
+ if (querySpec.sourceTableId !== tableId) {
426
+ continue;
427
+ }
428
+
429
+ var isMatchingFieldQuery = ((_querySpec$recordSele = querySpec.recordSelection) === null || _querySpec$recordSele === void 0 ? void 0 : (_querySpec$recordSele2 = _querySpec$recordSele.fieldSelection) === null || _querySpec$recordSele2 === void 0 ? void 0 : _querySpec$recordSele2.type) === _block_query_spec.BlockFieldSelectionSpecType.ALL_FIELDS_FROM_TABLE || ((_querySpec$recordSele3 = querySpec.recordSelection) === null || _querySpec$recordSele3 === void 0 ? void 0 : (_querySpec$recordSele4 = _querySpec$recordSele3.fieldSelection) === null || _querySpec$recordSele4 === void 0 ? void 0 : _querySpec$recordSele4.type) === _block_query_spec.BlockFieldSelectionSpecType.SPECIFIED_FIELDS && querySpec.recordSelection.fieldSelection.fieldIds.includes(fieldId);
430
+
431
+ if (!isMatchingFieldQuery) {
432
+ continue;
433
+ }
434
+
435
+ if (((_querySpec$recordSele5 = querySpec.recordSelection) === null || _querySpec$recordSele5 === void 0 ? void 0 : _querySpec$recordSele5.recordIds) && !shouldForceOnChangeCallbackWhenNoQueriesMatchRecord && !querySpec.recordSelection.recordIds.includes(recordId)) {
436
+ return;
437
+ } // TODO(#proj-blocks-record-limits) filter rows based on querySpec
438
+
439
+
440
+ if (shouldCallSubscriptionChangesWithEmptyArray) {
441
+ onChangeCallback([]);
442
+ } else {
443
+ onChangeCallback([{
444
+ type: _block_query_spec.BlockQuerySubscriptionChangeType.MODIFIED_CELL_VALUES_FOR_TABLE,
445
+ tableId,
446
+ fieldIdsByRecordId: {
447
+ [recordId]: [fieldId]
448
+ },
449
+ fieldIds: [fieldId]
450
+ }]);
451
+ }
452
+ }
453
+ }
454
+ }, {
455
+ key: "updateCommentCount",
456
+ value: function updateCommentCount(tableId, recordId, newCommentCount) {
457
+ var table = this._tablesById[tableId];
458
+ (0, _error_utils.invariant)(table, 'updateCommentCount called with missing table %s', tableId);
459
+ var record = table.records.find(r => r.id === recordId);
460
+ (0, _error_utils.invariant)(record, 'updateCommentCount called with missing record %s', recordId);
461
+ record.commentCount = newCommentCount;
462
+
463
+ for (var _i4 = 0, _Object$values4 = Object.values(this._subscribedQuerySpecs); _i4 < _Object$values4.length; _i4++) {
464
+ var _querySpec$recordSele6, _querySpec$recordSele7;
465
+
466
+ var _Object$values4$_i = _Object$values4[_i4],
467
+ querySpec = _Object$values4$_i.querySpec,
468
+ onChangeCallback = _Object$values4$_i.onChangeCallback;
469
+
470
+ if (!onChangeCallback) {
471
+ continue;
472
+ }
473
+
474
+ if (querySpec.sourceTableId !== tableId) {
475
+ continue;
476
+ }
477
+
478
+ var isMatchingFieldQuery = ((_querySpec$recordSele6 = querySpec.recordSelection) === null || _querySpec$recordSele6 === void 0 ? void 0 : _querySpec$recordSele6.fieldSelection.type) === _block_query_spec.BlockFieldSelectionSpecType.ALL_FIELDS_FROM_TABLE || ((_querySpec$recordSele7 = querySpec.recordSelection) === null || _querySpec$recordSele7 === void 0 ? void 0 : _querySpec$recordSele7.fieldSelection.type) === _block_query_spec.BlockFieldSelectionSpecType.SPECIFIED_FIELDS && querySpec.recordSelection.fieldSelection.shouldIncludeCommentCount;
479
+
480
+ if (!isMatchingFieldQuery) {
481
+ continue;
482
+ }
483
+
484
+ onChangeCallback([]);
485
+ }
486
+ }
487
+ }, {
488
+ key: "updateColorInView",
489
+ value: function updateColorInView(tableId, viewId, recordId, newColor) {
490
+ var table = this._tablesById[tableId];
491
+ (0, _error_utils.invariant)(table, 'updateColorInView called with missing table %s', tableId);
492
+ var view = table.views.find(v => v.id === viewId);
493
+ (0, _error_utils.invariant)(view, 'updateColorInView called with missing view %s', viewId);
494
+ var record = view.records.find(r => r.id === recordId);
495
+ (0, _error_utils.invariant)(record, 'updateColorInView called with missing record %s', recordId);
496
+ record.color = newColor;
497
+
498
+ for (var _i5 = 0, _Object$values5 = Object.values(this._subscribedQuerySpecs); _i5 < _Object$values5.length; _i5++) {
499
+ var _querySpec$viewMetada;
500
+
501
+ var _Object$values5$_i = _Object$values5[_i5],
502
+ onChangeCallback = _Object$values5$_i.onChangeCallback,
503
+ querySpec = _Object$values5$_i.querySpec;
504
+
505
+ if (!onChangeCallback) {
506
+ continue;
507
+ }
508
+
509
+ if (querySpec.sourceType !== _block_query_spec.BlockQuerySourceType.VIEW) {
510
+ continue;
511
+ }
512
+
513
+ if (querySpec.sourceTableId !== tableId || querySpec.sourceViewId !== viewId) {
514
+ continue;
515
+ }
516
+
517
+ if ((_querySpec$viewMetada = querySpec.viewMetadataSelection) === null || _querySpec$viewMetada === void 0 ? void 0 : _querySpec$viewMetada.shouldIncludeColorsForRecordId) {
518
+ onChangeCallback([{
519
+ type: _block_query_spec.BlockQuerySubscriptionChangeType.CHANGED_COLORS_BY_RECORD_ID_FOR_VIEW,
520
+ tableId,
521
+ viewId,
522
+ recordIds: [recordId]
523
+ }]);
524
+ }
525
+ }
526
+ } // Allows access to record cell values that have been subscribed using queries
527
+
528
+ }, {
529
+ key: "getTableRecordStoreIfExists",
530
+ value: function getTableRecordStoreIfExists(tableId) {
531
+ var fixtureTable = this._tablesById[tableId];
532
+
533
+ if (!fixtureTable) {
534
+ return null;
535
+ }
536
+
537
+ return {
538
+ getTableId: () => fixtureTable.id,
539
+ getPartiallyLoadedRecordIds: () => this._getPartiallyLoadedRecordIds(fixtureTable),
540
+ isRecordPartiallyLoaded: recordId => this._getPartiallyLoadedRecordIds(fixtureTable).includes(recordId),
541
+ isRecordDeleted: recordId => this._deletedRecordIds.includes(recordId),
542
+ isRecordCellValueLoadedForFieldId: (recordId, fieldId) => this._isRecordCellValueLoadedForFieldId(fixtureTable, recordId, fieldId),
543
+ getRecordCellValueByFieldId: (recordId, fieldId) => this._getRecordCellValueByFieldId(fixtureTable, recordId, fieldId),
544
+ getRecordCommentCount: recordId => this._getRecordCommentCount(fixtureTable, recordId),
545
+ getRecordCreatedTime: recordId => this._getRecordCreatedTime(fixtureTable, recordId)
546
+ };
547
+ }
548
+ }, {
549
+ key: "_getPartiallyLoadedRecordIds",
550
+ value: function _getPartiallyLoadedRecordIds(fixtureTable) {
551
+ var _this = this;
552
+
553
+ for (var _i6 = 0, _Object$values6 = Object.values(this._subscribedQuerySpecs); _i6 < _Object$values6.length; _i6++) {
554
+ var querySpec = _Object$values6[_i6].querySpec;
555
+
556
+ if (querySpec.sourceType === _block_query_spec.BlockQuerySourceType.TABLE && querySpec.sourceTableId === fixtureTable.id) {
557
+ return fixtureTable.records.map(r => r.id);
558
+ }
559
+
560
+ if (querySpec.sourceType === _block_query_spec.BlockQuerySourceType.VIEW && querySpec.sourceTableId === fixtureTable.id) {
561
+ var _ret = function () {
562
+ var viewId = querySpec.sourceViewId;
563
+ return {
564
+ v: fixtureTable.records.filter(r => {
565
+ var _this$getViewMetadata, _this$getViewMetadata2;
566
+
567
+ return (_this$getViewMetadata = _this.getViewMetadataStoreIfExists(fixtureTable.id, viewId)) === null || _this$getViewMetadata === void 0 ? void 0 : (_this$getViewMetadata2 = _this$getViewMetadata.getVisibleRecordIds()) === null || _this$getViewMetadata2 === void 0 ? void 0 : _this$getViewMetadata2.includes(r.id);
568
+ }).map(r => r.id)
569
+ };
570
+ }();
571
+
572
+ if (typeof _ret === "object") return _ret.v;
573
+ }
574
+ }
575
+
576
+ return [];
577
+ }
578
+ }, {
579
+ key: "createTable",
580
+ value: function createTable(tableId, name, fields) {
581
+ var fieldData = fields.map(field => {
582
+ return _objectSpread({
583
+ id: this._mockAirtableInterface.idGenerator.generateFieldId(),
584
+ name: field.name,
585
+ description: '',
586
+ type: field.type,
587
+ typeOptions: field.options
588
+ }, unmodifiableFieldData);
589
+ });
590
+ var viewData = {
591
+ id: this._mockAirtableInterface.idGenerator.generateViewId(),
592
+ name: 'Dynamically-generated Grid view',
593
+ type: _view.ViewType.GRID
594
+ };
595
+ var viewMetadata = {
596
+ fieldOrder: {
597
+ fieldIds: fieldData.map((_ref2) => {
598
+ var id = _ref2.id;
599
+ return id;
600
+ }),
601
+ visibleFieldCount: fieldData.length
602
+ }
603
+ };
604
+ this._tablesById[tableId] = {
605
+ id: tableId,
606
+ name,
607
+ description: '',
608
+ fields,
609
+ views: [_objectSpread({}, viewData, {}, viewMetadata, {
610
+ records: []
611
+ })],
612
+ records: []
613
+ };
614
+
615
+ this._mockAirtableInterface.triggerModelUpdates([{
616
+ path: ['tablesById', tableId],
617
+ value: _objectSpread({
618
+ id: tableId,
619
+ name: name,
620
+ primaryFieldId: fieldData[0].id,
621
+ viewOrder: [viewData.id],
622
+ viewsById: {
623
+ [viewData.id]: viewData
624
+ },
625
+ fieldsById: (0, _private_utils.keyBy)(fieldData, _private_utils.getId)
626
+ }, unmodifiableTableData)
627
+ }, {
628
+ path: ['tableOrder'],
629
+ value: this._mockAirtableInterface.sdkInitData.baseData.tableOrder.concat(tableId)
630
+ }]);
631
+ }
632
+ }, {
633
+ key: "addFieldToFixtureTable",
634
+ value: function addFieldToFixtureTable(tableId, fieldFixtureData) {
635
+ var fixtureTable = this._tablesById[tableId];
636
+
637
+ if (!fixtureTable) {
638
+ throw (0, _error_utils.spawnError)('Table (%s) is not loaded when loading adding Field to it', tableId);
639
+ }
640
+
641
+ fixtureTable.fields = [...fixtureTable.fields, fieldFixtureData];
642
+
643
+ this._mockAirtableInterface.triggerModelUpdates([{
644
+ path: ['tablesById', tableId, 'fieldsById', fieldFixtureData.id],
645
+ value: {
646
+ id: fieldFixtureData.id,
647
+ name: fieldFixtureData.name,
648
+ type: fieldFixtureData.type,
649
+ typeOptions: fieldFixtureData.options,
650
+ description: fieldFixtureData.description,
651
+ lock: null
652
+ }
653
+ }]);
654
+ }
655
+ }, {
656
+ key: "removeFieldFromFixtureTable",
657
+ value: function removeFieldFromFixtureTable(tableId, fieldId) {
658
+ var fixtureTable = this._tablesById[tableId];
659
+
660
+ if (!fixtureTable) {
661
+ throw (0, _error_utils.spawnError)('Table (%s) is not loaded when removing Field from it', tableId);
662
+ }
663
+
664
+ var fields = fixtureTable.fields,
665
+ views = fixtureTable.views;
666
+ var indexToRemove = fields.findIndex(f => f.id === fieldId);
667
+
668
+ if (indexToRemove === -1) {
669
+ throw (0, _error_utils.spawnError)('Table (%s) does not have Field %d for removal', tableId, fieldId);
670
+ }
671
+
672
+ fields.splice(indexToRemove, 1);
673
+ var modelUpdates = [{
674
+ path: ['tablesById', tableId, 'fieldsById', fieldId],
675
+ value: undefined
676
+ }];
677
+ var _iteratorNormalCompletion2 = true;
678
+ var _didIteratorError2 = false;
679
+ var _iteratorError2 = undefined;
680
+
681
+ try {
682
+ for (var _iterator2 = views[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
683
+ var view = _step2.value;
684
+ var fieldOrder = view.fieldOrder;
685
+ var index = fieldOrder.fieldIds.indexOf(fieldId);
686
+ var fieldIds = fieldOrder.fieldIds;
687
+ fieldIds.splice(index, 1);
688
+ var visibleFieldCount = index < fieldOrder.visibleFieldCount ? fieldOrder.visibleFieldCount - 1 : fieldOrder.visibleFieldCount;
689
+ fieldOrder.visibleFieldCount = visibleFieldCount;
690
+ modelUpdates.push({
691
+ path: ['tablesById', tableId, 'viewsById', view.id, 'fieldOrder'],
692
+ value: {
693
+ fieldIds,
694
+ visibleFieldCount
695
+ }
696
+ });
697
+ }
698
+ } catch (err) {
699
+ _didIteratorError2 = true;
700
+ _iteratorError2 = err;
701
+ } finally {
702
+ try {
703
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
704
+ _iterator2.return();
705
+ }
706
+ } finally {
707
+ if (_didIteratorError2) {
708
+ throw _iteratorError2;
709
+ }
710
+ }
711
+ }
712
+
713
+ this._mockAirtableInterface.triggerModelUpdates(modelUpdates);
714
+ }
715
+ }, {
716
+ key: "_isRecordCellValueLoadedForFieldId",
717
+ value: function _isRecordCellValueLoadedForFieldId(fixtureTable, recordId, fieldId) {
718
+ var _querySpec$recordSele8;
719
+
720
+ if (!fixtureTable.fields.find(f => f.id === fieldId)) {
721
+ return false;
722
+ }
723
+
724
+ for (var _i7 = 0, _Object$values7 = Object.values(this._subscribedQuerySpecs); _i7 < _Object$values7.length; _i7++) {
725
+ var querySpec = _Object$values7[_i7].querySpec;
726
+
727
+ if (querySpec.sourceTableId === fixtureTable.id && fixtureTable.records.find(r => r.id === recordId)) {
728
+ switch ((_querySpec$recordSele8 = querySpec.recordSelection) === null || _querySpec$recordSele8 === void 0 ? void 0 : _querySpec$recordSele8.fieldSelection.type) {
729
+ case _block_query_spec.BlockFieldSelectionSpecType.ALL_FIELDS_FROM_TABLE:
730
+ return true;
731
+
732
+ case _block_query_spec.BlockFieldSelectionSpecType.SPECIFIED_FIELDS:
733
+ return querySpec.recordSelection.fieldSelection.fieldIds.includes(fieldId);
734
+
735
+ default:
736
+ break;
737
+ }
738
+ }
739
+ }
740
+
741
+ return false;
742
+ }
743
+ }, {
744
+ key: "_getRecordCellValueByFieldId",
745
+ value: function _getRecordCellValueByFieldId(fixtureTable, recordId, fieldId) {
746
+ if (!this._isRecordCellValueLoadedForFieldId(fixtureTable, recordId, fieldId)) {
747
+ return undefined;
748
+ }
749
+
750
+ var cellValue = fixtureTable.records.find(r => r.id === recordId).cellValuesByFieldId[fieldId]; // Hyperbase is responsible for always returning null if the cell is undefined
751
+
752
+ if (cellValue === undefined) {
753
+ return null;
754
+ }
755
+
756
+ return cellValue;
757
+ }
758
+ }, {
759
+ key: "_getRecordCommentCount",
760
+ value: function _getRecordCommentCount(fixtureTable, recordId) {
761
+ var specifiedRecord = fixtureTable.records.find(r => r.id === recordId);
762
+
763
+ if (!specifiedRecord) {
764
+ throw (0, _error_utils.spawnError)('Record is not loaded %s when loading commentCount', recordId);
765
+ }
766
+
767
+ return specifiedRecord.commentCount;
768
+ }
769
+ }, {
770
+ key: "_getRecordCreatedTime",
771
+ value: function _getRecordCreatedTime(fixtureTable, recordId) {
772
+ var specifiedRecord = fixtureTable.records.find(r => r.id === recordId);
773
+
774
+ if (!specifiedRecord) {
775
+ throw (0, _error_utils.spawnError)('Record is not loaded %s when loading createdTime', recordId);
776
+ }
777
+
778
+ return new Date(specifiedRecord.createdTime);
779
+ }
780
+ }, {
781
+ key: "setViewData",
782
+ value: function setViewData(tableId, viewId, viewFixtureData) {
783
+ var table = this._tablesById[tableId];
784
+ (0, _error_utils.invariant)(table, 'setViewData called with missing table %s', tableId);
785
+ var view = table.views.find(v => v.id === viewId);
786
+ (0, _error_utils.invariant)(view, 'setViewData called with missing view %s, got %s', viewId, JSON.stringify(table.views.map(v => v.id)));
787
+ Object.assign(view, viewFixtureData);
788
+ var sdkPriorityCallbacks = [];
789
+ var blockCodePriorityCallbacks = [];
790
+
791
+ for (var _i8 = 0, _Object$values8 = Object.values(this._subscribedQuerySpecs); _i8 < _Object$values8.length; _i8++) {
792
+ var _querySpec$viewMetada2, _querySpec$viewMetada3, _querySpec$viewMetada4, _querySpec$viewMetada5, _querySpec$viewMetada6;
793
+
794
+ var _Object$values8$_i = _Object$values8[_i8],
795
+ querySpec = _Object$values8$_i.querySpec,
796
+ onChangeCallback = _Object$values8$_i.onChangeCallback,
797
+ callbackPriority = _Object$values8$_i.callbackPriority;
798
+
799
+ if (!onChangeCallback) {
800
+ continue;
801
+ }
802
+
803
+ if (querySpec.sourceType !== _block_query_spec.BlockQuerySourceType.VIEW) {
804
+ continue;
805
+ }
806
+
807
+ if (querySpec.sourceTableId !== tableId || querySpec.sourceViewId !== viewId) {
808
+ continue;
809
+ }
810
+
811
+ if (viewFixtureData.groups && ((_querySpec$viewMetada2 = querySpec.viewMetadataSelection) === null || _querySpec$viewMetada2 === void 0 ? void 0 : _querySpec$viewMetada2.shouldIncludeGroups) || viewFixtureData.groupLevels && ((_querySpec$viewMetada3 = querySpec.viewMetadataSelection) === null || _querySpec$viewMetada3 === void 0 ? void 0 : _querySpec$viewMetada3.shouldIncludeGroupingLevels) || viewFixtureData.fieldOrder && ((_querySpec$viewMetada4 = querySpec.viewMetadataSelection) === null || _querySpec$viewMetada4 === void 0 ? void 0 : _querySpec$viewMetada4.shouldIncludeFieldOrder) || viewFixtureData.records && ((_querySpec$viewMetada5 = querySpec.viewMetadataSelection) === null || _querySpec$viewMetada5 === void 0 ? void 0 : _querySpec$viewMetada5.shouldIncludeVisibleRecordIds) || viewFixtureData.records && ((_querySpec$viewMetada6 = querySpec.viewMetadataSelection) === null || _querySpec$viewMetada6 === void 0 ? void 0 : _querySpec$viewMetada6.shouldIncludeColorsForRecordId)) {
812
+ if (callbackPriority === _airtable_interface.BlockQueryCallbackPriority.SDK) {
813
+ sdkPriorityCallbacks.push(onChangeCallback);
814
+ } else {
815
+ blockCodePriorityCallbacks.push(onChangeCallback);
816
+ }
817
+ }
818
+ }
819
+
820
+ for (var _i9 = 0, _arr = [...sdkPriorityCallbacks, ...blockCodePriorityCallbacks]; _i9 < _arr.length; _i9++) {
821
+ var callback = _arr[_i9];
822
+ callback([]);
823
+ }
824
+ } // Allows access to view data that has been subscribed using queries
825
+
826
+ }, {
827
+ key: "getViewMetadataStoreIfExists",
828
+ value: function getViewMetadataStoreIfExists(tableId, viewId) {
829
+ var fixtureTable = this._tablesById[tableId];
830
+
831
+ if (!fixtureTable) {
832
+ return null;
833
+ }
834
+
835
+ var fixtureView = fixtureTable.views.find(v => v.id === viewId);
836
+
837
+ if (!fixtureView) {
838
+ return null;
839
+ }
840
+
841
+ return {
842
+ getViewId: () => fixtureView.id,
843
+ getVisibleRecordIds: () => fixtureView.records.map(r => r.id),
844
+ getFieldOrder: () => fixtureView.fieldOrder,
845
+ getGroups: () => {
846
+ var _fixtureView$groups;
847
+
848
+ return (_fixtureView$groups = fixtureView.groups) !== null && _fixtureView$groups !== void 0 ? _fixtureView$groups : null;
849
+ },
850
+ getGroupLevels: () => {
851
+ var _fixtureView$groupLev;
852
+
853
+ return (_fixtureView$groupLev = fixtureView.groupLevels) !== null && _fixtureView$groupLev !== void 0 ? _fixtureView$groupLev : null;
854
+ },
855
+ getColorForRecordId: recordId => {
856
+ var _ref3, _fixtureView$records$;
857
+
858
+ return (_ref3 = (_fixtureView$records$ = fixtureView.records.find(r => r.id === recordId)) === null || _fixtureView$records$ === void 0 ? void 0 : _fixtureView$records$.color) !== null && _ref3 !== void 0 ? _ref3 : null;
859
+ }
860
+ };
861
+ }
862
+ }, {
863
+ key: "getCountOfQueriesSubscribed",
864
+ value: function getCountOfQueriesSubscribed() {
865
+ return Object.keys(this._subscribedQuerySpecs).length;
866
+ }
867
+ }, {
868
+ key: "onUnsubscribeFromQuery",
869
+ value: function onUnsubscribeFromQuery(onUnsubscribeFromQueryCallback) {
870
+ this._onUnsubscribeFromQueryCallback = onUnsubscribeFromQueryCallback;
871
+ }
872
+ }]);
873
+ return MockBaseDataStore;
874
+ }();
875
+
876
+ exports.MockBaseDataStore = MockBaseDataStore;