@airtable/blocks 1.8.0 → 1.9.0-experimental

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 (93) hide show
  1. package/CHANGELOG.md +16 -2
  2. package/dist/cjs/error_utils.js +17 -0
  3. package/dist/cjs/models/base.js +16 -5
  4. package/dist/cjs/models/cursor.js +2 -0
  5. package/dist/cjs/models/field.js +146 -27
  6. package/dist/cjs/models/grouped_record_query_result.js +5 -14
  7. package/dist/cjs/models/linked_records_query_result.js +75 -27
  8. package/dist/cjs/models/mutation_constants.js +3 -1
  9. package/dist/cjs/models/mutations.js +67 -176
  10. package/dist/cjs/models/query_manager.js +327 -0
  11. package/dist/cjs/models/record.js +308 -55
  12. package/dist/cjs/models/record_query_result.js +4 -1
  13. package/dist/cjs/models/record_store.js +554 -765
  14. package/dist/cjs/models/table.js +22 -13
  15. package/dist/cjs/models/table_or_view_query_result.js +480 -414
  16. package/dist/cjs/models/view_data_store.js +243 -295
  17. package/dist/cjs/private_utils.js +50 -0
  18. package/dist/cjs/sdk.js +12 -2
  19. package/dist/cjs/testing/{mock_airtable_interface.js → abstract_mock_airtable_interface.js} +71 -22
  20. package/dist/cjs/types/block_query_spec.js +85 -0
  21. package/dist/cjs/types/mutations.js +1 -0
  22. package/dist/cjs/ui/icon_config.js +4 -2
  23. package/dist/cjs/ui/use_global_config.js +1 -1
  24. package/dist/cjs/ui/use_records.js +5 -1
  25. package/dist/cjs/unstable_testing_utils.js +2 -2
  26. package/dist/cjs/watchable.js +123 -71
  27. package/dist/types/src/models/base.d.ts +10 -3
  28. package/dist/types/src/models/base.d.ts.map +1 -1
  29. package/dist/types/src/models/cursor.d.ts +2 -0
  30. package/dist/types/src/models/cursor.d.ts.map +1 -1
  31. package/dist/types/src/models/field.d.ts +65 -1
  32. package/dist/types/src/models/field.d.ts.map +1 -1
  33. package/dist/types/src/models/grouped_record_query_result.d.ts +3 -3
  34. package/dist/types/src/models/grouped_record_query_result.d.ts.map +1 -1
  35. package/dist/types/src/models/linked_records_query_result.d.ts.map +1 -1
  36. package/dist/types/src/models/mutation_constants.d.ts +1 -0
  37. package/dist/types/src/models/mutation_constants.d.ts.map +1 -1
  38. package/dist/types/src/models/mutations.d.ts.map +1 -1
  39. package/dist/types/src/models/query_manager.d.ts +2 -0
  40. package/dist/types/src/models/query_manager.d.ts.map +1 -0
  41. package/dist/types/src/models/record.d.ts +12 -3
  42. package/dist/types/src/models/record.d.ts.map +1 -1
  43. package/dist/types/src/models/record_query_result.d.ts +3 -2
  44. package/dist/types/src/models/record_query_result.d.ts.map +1 -1
  45. package/dist/types/src/models/record_store.d.ts.map +1 -1
  46. package/dist/types/src/models/table.d.ts +8 -4
  47. package/dist/types/src/models/table.d.ts.map +1 -1
  48. package/dist/types/src/models/table_or_view_query_result.d.ts +3 -5
  49. package/dist/types/src/models/table_or_view_query_result.d.ts.map +1 -1
  50. package/dist/types/src/models/view_data_store.d.ts +0 -1
  51. package/dist/types/src/models/view_data_store.d.ts.map +1 -1
  52. package/dist/types/src/models/view_metadata_query_result.d.ts +1 -1
  53. package/dist/types/src/models/view_metadata_query_result.d.ts.map +1 -1
  54. package/dist/types/src/private_utils.d.ts +30 -1
  55. package/dist/types/src/private_utils.d.ts.map +1 -1
  56. package/dist/types/src/sdk.d.ts.map +1 -1
  57. package/dist/types/src/testing/{mock_airtable_interface.d.ts → abstract_mock_airtable_interface.d.ts} +20 -15
  58. package/dist/types/src/testing/abstract_mock_airtable_interface.d.ts.map +1 -0
  59. package/dist/types/src/types/airtable_interface.d.ts +43 -19
  60. package/dist/types/src/types/airtable_interface.d.ts.map +1 -1
  61. package/dist/types/src/types/block_query_spec.d.ts +139 -0
  62. package/dist/types/src/types/block_query_spec.d.ts.map +1 -0
  63. package/dist/types/src/types/field.d.ts +80 -44
  64. package/dist/types/src/types/field.d.ts.map +1 -1
  65. package/dist/types/src/types/mutations.d.ts +31 -3
  66. package/dist/types/src/types/mutations.d.ts.map +1 -1
  67. package/dist/types/src/types/table.d.ts +0 -2
  68. package/dist/types/src/types/table.d.ts.map +1 -1
  69. package/dist/types/src/types/view.d.ts +3 -8
  70. package/dist/types/src/types/view.d.ts.map +1 -1
  71. package/dist/types/src/ui/icon_config.d.ts +5 -3
  72. package/dist/types/src/ui/icon_config.d.ts.map +1 -1
  73. package/dist/types/src/ui/link.d.ts +1 -1
  74. package/dist/types/src/ui/link.d.ts.map +1 -1
  75. package/dist/types/src/ui/use_global_config.d.ts +1 -1
  76. package/dist/types/src/unstable_testing_utils.d.ts +1 -1
  77. package/dist/types/src/unstable_testing_utils.d.ts.map +1 -1
  78. package/dist/types/src/watchable.d.ts.map +1 -1
  79. package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts +121 -0
  80. package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts.map +1 -0
  81. package/dist/types/test/airtable_interface_mocks/linked_records.d.ts +2 -2
  82. package/dist/types/test/airtable_interface_mocks/linked_records.d.ts.map +1 -1
  83. package/dist/types/test/airtable_interface_mocks/{mock_airtable_interface_internal.d.ts → mock_airtable_interface.d.ts} +26 -18
  84. package/dist/types/test/airtable_interface_mocks/mock_airtable_interface.d.ts.map +1 -0
  85. package/dist/types/test/airtable_interface_mocks/mock_base_data_stores.d.ts +51 -0
  86. package/dist/types/test/airtable_interface_mocks/mock_base_data_stores.d.ts.map +1 -0
  87. package/dist/types/test/airtable_interface_mocks/project_tracker.d.ts +2 -2
  88. package/dist/types/test/airtable_interface_mocks/project_tracker.d.ts.map +1 -1
  89. package/dist/types/test/test_helpers.d.ts +2 -0
  90. package/dist/types/test/test_helpers.d.ts.map +1 -1
  91. package/package.json +3 -1
  92. package/dist/types/src/testing/mock_airtable_interface.d.ts.map +0 -1
  93. package/dist/types/test/airtable_interface_mocks/mock_airtable_interface_internal.d.ts.map +0 -1
@@ -0,0 +1,327 @@
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.iterator");
10
+
11
+ require("core-js/modules/es.map");
12
+
13
+ require("core-js/modules/es.object.to-string");
14
+
15
+ require("core-js/modules/es.promise");
16
+
17
+ require("core-js/modules/web.dom-collections.for-each");
18
+
19
+ require("core-js/modules/web.dom-collections.iterator");
20
+
21
+ Object.defineProperty(exports, "__esModule", {
22
+ value: true
23
+ });
24
+ exports.QueryManager = void 0;
25
+
26
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
27
+
28
+ require("regenerator-runtime/runtime");
29
+
30
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
31
+
32
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
33
+
34
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
35
+
36
+ var _error_utils = require("../error_utils");
37
+
38
+ var _private_utils = require("../private_utils");
39
+
40
+ /**
41
+ * This provides a singleton instance which is responsible for all queries sent
42
+ * to PublicAirtableInterface.
43
+ *
44
+ * This can allow looking up queries by queryId.
45
+ *
46
+ * @internal
47
+ */
48
+ var QueryManager =
49
+ /*#__PURE__*/
50
+ function () {
51
+ function QueryManager(sdk) {
52
+ (0, _classCallCheck2.default)(this, QueryManager);
53
+ (0, _defineProperty2.default)(this, "_airtableInterface", void 0);
54
+ (0, _defineProperty2.default)(this, "_sdk", void 0);
55
+ (0, _defineProperty2.default)(this, "_queryRegistrationInfosByWatchKey", new Map());
56
+ (0, _defineProperty2.default)(this, "fetchAndSubscribeToQueryAsync", (query, querySubscriptionOptions) => {
57
+ var queryResponse;
58
+ return _regenerator.default.async(function _callee$(_context) {
59
+ while (1) {
60
+ switch (_context.prev = _context.next) {
61
+ case 0:
62
+ _context.next = 2;
63
+ return _regenerator.default.awrap(this._airtableInterface.subscribeToQueryAndPopulateStoresAsync(query, querySubscriptionOptions !== null && querySubscriptionOptions !== void 0 ? querySubscriptionOptions : {}));
64
+
65
+ case 2:
66
+ queryResponse = _context.sent;
67
+
68
+ if (queryResponse.success) {
69
+ _context.next = 5;
70
+ break;
71
+ }
72
+
73
+ throw (0, _error_utils.spawnError)('Subscription to query failed - unhandled error');
74
+
75
+ case 5:
76
+ return _context.abrupt("return", queryResponse.blockQueryId);
77
+
78
+ case 6:
79
+ case "end":
80
+ return _context.stop();
81
+ }
82
+ }
83
+ }, null, this);
84
+ });
85
+ (0, _defineProperty2.default)(this, "unsubscribeFromQueryIds", queryIds => {
86
+ var _iteratorNormalCompletion = true;
87
+ var _didIteratorError = false;
88
+ var _iteratorError = undefined;
89
+
90
+ try {
91
+ for (var _iterator = queryIds[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
92
+ var queryId = _step.value;
93
+ // TODO: (#proj-blocks-sdk-record-limits) Add support for unsubscribing multiple at the same time
94
+ this.unsubscribeFromQueryId(queryId);
95
+ }
96
+ } catch (err) {
97
+ _didIteratorError = true;
98
+ _iteratorError = err;
99
+ } finally {
100
+ try {
101
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
102
+ _iterator.return();
103
+ }
104
+ } finally {
105
+ if (_didIteratorError) {
106
+ throw _iteratorError;
107
+ }
108
+ }
109
+ }
110
+ });
111
+ (0, _defineProperty2.default)(this, "unsubscribeFromQueryId", queryId => {
112
+ (0, _private_utils.fireAndForgetPromise)(() => this._airtableInterface.unsubscribeFromQueryIdsAsync([queryId]));
113
+ });
114
+ (0, _defineProperty2.default)(this, "watchWithQuerySpec", (query, watchableModel, watchKey, watchOnChangeCallback, callbackForRegistration, context) => {
115
+ var isOnChangeCallbackCanceled = false;
116
+
117
+ var callbackForCancelOnChange = () => isOnChangeCallbackCanceled = true;
118
+
119
+ var onChangeCallback = changes => {
120
+ if (isOnChangeCallbackCanceled) {
121
+ return;
122
+ }
123
+
124
+ watchableModel.__incrementOnChangeCount();
125
+
126
+ watchOnChangeCallback(changes);
127
+ };
128
+
129
+ var blockQueryIdPromise = this.fetchAndSubscribeToQueryAsync(query, {
130
+ onChangeCallback
131
+ });
132
+
133
+ var queryRegistrationInfosForKey = this._queryRegistrationInfosByWatchKey.get(watchKey);
134
+
135
+ if (!queryRegistrationInfosForKey) {
136
+ queryRegistrationInfosForKey = [];
137
+
138
+ this._queryRegistrationInfosByWatchKey.set(watchKey, queryRegistrationInfosForKey);
139
+ } // It is safe to push onto queryRegistrationInfosForKey (vs copying) as long
140
+ // as we don't release the event loop when we iterate over it, which only
141
+ // happens in unwatchFromQueryKeys
142
+
143
+
144
+ queryRegistrationInfosForKey.push({
145
+ blockQueryIdPromise,
146
+ callbackForCancelOnChange,
147
+ callbackForRegistration,
148
+ context,
149
+ onChangeCallback,
150
+ watchableModel
151
+ });
152
+ });
153
+ (0, _defineProperty2.default)(this, "_unwatchFromQueryRegistrationInfoAsync", queryRegistrationInfo => {
154
+ var blockQueryIdPromise, callbackForCancelOnChange, queryId;
155
+ return _regenerator.default.async(function _callee2$(_context2) {
156
+ while (1) {
157
+ switch (_context2.prev = _context2.next) {
158
+ case 0:
159
+ blockQueryIdPromise = queryRegistrationInfo.blockQueryIdPromise, callbackForCancelOnChange = queryRegistrationInfo.callbackForCancelOnChange;
160
+ callbackForCancelOnChange();
161
+ _context2.next = 4;
162
+ return _regenerator.default.awrap(blockQueryIdPromise);
163
+
164
+ case 4:
165
+ queryId = _context2.sent;
166
+ this.unsubscribeFromQueryId(queryId);
167
+
168
+ case 6:
169
+ case "end":
170
+ return _context2.stop();
171
+ }
172
+ }
173
+ }, null, this);
174
+ });
175
+ (0, _defineProperty2.default)(this, "unwatchFromQueryKey", (watchKey, callbackForRegistration, context) => {
176
+ var queryRegistrationInfos = this._queryRegistrationInfosByWatchKey.get(watchKey);
177
+
178
+ if (queryRegistrationInfos) {
179
+ var watchersToUnwatch = [];
180
+ var watchersToKeep = [];
181
+ queryRegistrationInfos.forEach(watcher => {
182
+ var isCallbackToUnwatch = watcher.callbackForRegistration === callbackForRegistration && watcher.context === context;
183
+
184
+ if (isCallbackToUnwatch) {
185
+ watchersToUnwatch.push(watcher);
186
+ } else {
187
+ watchersToKeep.push(watcher);
188
+ }
189
+ });
190
+
191
+ if (watchersToKeep.length > 0) {
192
+ this._queryRegistrationInfosByWatchKey.set(watchKey, watchersToKeep);
193
+ } else {
194
+ this._queryRegistrationInfosByWatchKey.delete(watchKey);
195
+ }
196
+
197
+ if (watchersToUnwatch.length > 0) {
198
+ // Do not await the response since unwatch is not async
199
+ watchersToUnwatch.forEach(this._unwatchFromQueryRegistrationInfoAsync);
200
+ }
201
+ }
202
+ });
203
+ this._airtableInterface = sdk.__airtableInterface;
204
+ this._sdk = sdk;
205
+ }
206
+
207
+ (0, _createClass2.default)(QueryManager, [{
208
+ key: "_onChange",
209
+ value: function _onChange(watchableModel, watchKey) {
210
+ var queryRegistrationInfos = this._queryRegistrationInfosByWatchKey.get(watchKey);
211
+
212
+ if (!queryRegistrationInfos) {
213
+ return;
214
+ }
215
+
216
+ var _iteratorNormalCompletion2 = true;
217
+ var _didIteratorError2 = false;
218
+ var _iteratorError2 = undefined;
219
+
220
+ try {
221
+ for (var _iterator2 = queryRegistrationInfos[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
222
+ var watcher = _step2.value;
223
+
224
+ if (watcher.watchableModel === watchableModel) {
225
+ watcher.onChangeCallback([]);
226
+ }
227
+ }
228
+ } catch (err) {
229
+ _didIteratorError2 = true;
230
+ _iteratorError2 = err;
231
+ } finally {
232
+ try {
233
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
234
+ _iterator2.return();
235
+ }
236
+ } finally {
237
+ if (_didIteratorError2) {
238
+ throw _iteratorError2;
239
+ }
240
+ }
241
+ }
242
+ }
243
+ }, {
244
+ key: "onLoadKeys",
245
+ value: function onLoadKeys(watchableModel, watchKeys) {
246
+ var _iteratorNormalCompletion3 = true;
247
+ var _didIteratorError3 = false;
248
+ var _iteratorError3 = undefined;
249
+
250
+ try {
251
+ for (var _iterator3 = watchKeys[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
252
+ var key = _step3.value;
253
+
254
+ this._onChange(watchableModel, key);
255
+ }
256
+ } catch (err) {
257
+ _didIteratorError3 = true;
258
+ _iteratorError3 = err;
259
+ } finally {
260
+ try {
261
+ if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
262
+ _iterator3.return();
263
+ }
264
+ } finally {
265
+ if (_didIteratorError3) {
266
+ throw _iteratorError3;
267
+ }
268
+ }
269
+ }
270
+ }
271
+ }, {
272
+ key: "forceUnloadWatchesOnWatchableModel",
273
+ value: function forceUnloadWatchesOnWatchableModel(watchableModel) {
274
+ var _iteratorNormalCompletion4 = true;
275
+ var _didIteratorError4 = false;
276
+ var _iteratorError4 = undefined;
277
+
278
+ try {
279
+ for (var _iterator4 = this._queryRegistrationInfosByWatchKey.values()[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
280
+ var queryRegistrationInfos = _step4.value;
281
+ var _iteratorNormalCompletion5 = true;
282
+ var _didIteratorError5 = false;
283
+ var _iteratorError5 = undefined;
284
+
285
+ try {
286
+ for (var _iterator5 = queryRegistrationInfos[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
287
+ var watcher = _step5.value;
288
+
289
+ if (watcher.watchableModel === watchableModel) {
290
+ this._unwatchFromQueryRegistrationInfoAsync(watcher);
291
+ }
292
+ }
293
+ } catch (err) {
294
+ _didIteratorError5 = true;
295
+ _iteratorError5 = err;
296
+ } finally {
297
+ try {
298
+ if (!_iteratorNormalCompletion5 && _iterator5.return != null) {
299
+ _iterator5.return();
300
+ }
301
+ } finally {
302
+ if (_didIteratorError5) {
303
+ throw _iteratorError5;
304
+ }
305
+ }
306
+ }
307
+ }
308
+ } catch (err) {
309
+ _didIteratorError4 = true;
310
+ _iteratorError4 = err;
311
+ } finally {
312
+ try {
313
+ if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
314
+ _iterator4.return();
315
+ }
316
+ } finally {
317
+ if (_didIteratorError4) {
318
+ throw _iteratorError4;
319
+ }
320
+ }
321
+ }
322
+ }
323
+ }]);
324
+ return QueryManager;
325
+ }();
326
+
327
+ exports.QueryManager = QueryManager;