@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
@@ -22,6 +22,10 @@ require("core-js/modules/es.object.to-string");
22
22
 
23
23
  require("core-js/modules/es.object.values");
24
24
 
25
+ require("core-js/modules/es.regexp.constructor");
26
+
27
+ require("core-js/modules/es.regexp.to-string");
28
+
25
29
  require("core-js/modules/es.set");
26
30
 
27
31
  require("core-js/modules/es.weak-map");
@@ -57,6 +61,7 @@ exports.getValueAtOwnPath = getValueAtOwnPath;
57
61
  exports.arrayDifference = arrayDifference;
58
62
  exports.debounce = debounce;
59
63
  exports.isBlockDevelopmentRestrictionEnabled = isBlockDevelopmentRestrictionEnabled;
64
+ exports.isFieldId = isFieldId;
60
65
  Object.defineProperty(exports, "isDeepEqual", {
61
66
  enumerable: true,
62
67
  get: function get() {
@@ -140,10 +145,16 @@ function cast(x) {
140
145
  return x;
141
146
  }
142
147
  /**
148
+ * Used to turn a readonly type into a mutable copy: https://stackoverflow.com/a/50769802
149
+ * (used in the cloneDeep function)
150
+ *
143
151
  * @hidden
144
152
  */
145
153
 
146
154
 
155
+ /**
156
+ * @hidden
157
+ */
147
158
  function cloneDeep(obj) {
148
159
  var jsonString = JSON.stringify(obj);
149
160
 
@@ -553,4 +564,33 @@ function debounce(fn, timeoutMs) {
553
564
 
554
565
  function isBlockDevelopmentRestrictionEnabled() {
555
566
  return (0, _airtable_interface.default)().sdkInitData.baseData.isBlockDevelopmentRestrictionEnabled;
567
+ } // This is copied from hyper_id_generator in hyperbase
568
+
569
+ /**
570
+ * Airtable id format. All object ids to have this format:
571
+ * <3 char prefix (lower-case)> + <14 random chars (upper/lower-case & numbers)>
572
+ * e.g. app4iu8QmuwcCbWCE
573
+ *
574
+ * We call it an "objectId" rather than "modelId" because not everything with an id is a model,
575
+ * e.g. worker access tokens.
576
+ */
577
+
578
+
579
+ var ALPHA_NUMERIC_CHAR_PATTERN = '[A-Za-z0-9]';
580
+ var OBJECT_ID_PREFIX_LENGTH = 3; // We allow shorter objectIds because our tests use non-standard AirtableIds
581
+
582
+ var OBJECT_ID_MIN_SUFFIX_LENGTH = 1;
583
+ var OBJECT_ID_SUFFIX_LENGTH = 14;
584
+ var OBJECT_ID_SUFFIX_PATTERN = ALPHA_NUMERIC_CHAR_PATTERN + '{' + OBJECT_ID_MIN_SUFFIX_LENGTH + ',' + OBJECT_ID_SUFFIX_LENGTH + '}';
585
+ var OBJECT_ID_PATTERN = '[a-z]{' + OBJECT_ID_PREFIX_LENGTH + '}' + OBJECT_ID_SUFFIX_PATTERN;
586
+ var OBJECT_ID_REGEX = new RegExp('^' + OBJECT_ID_PATTERN + '$');
587
+
588
+ function _isStringAnObjectId(str) {
589
+ return OBJECT_ID_REGEX.test(str);
590
+ }
591
+ /** @internal */
592
+
593
+
594
+ function isFieldId(str) {
595
+ return typeof str === 'string' && _isStringAnObjectId(str) && str.substr(0, 3) === 'fld';
556
596
  }
package/dist/cjs/sdk.js CHANGED
@@ -45,6 +45,8 @@ var _undo_redo = _interopRequireDefault(require("./undo_redo"));
45
45
 
46
46
  var _perform_record_action = require("./perform_record_action");
47
47
 
48
+ var _query_manager = require("./models/query_manager");
49
+
48
50
  /** @hidden */
49
51
 
50
52
  /** */
@@ -101,6 +103,12 @@ function () {
101
103
 
102
104
  /** Represents the current Airtable {@link Base}. */
103
105
 
106
+ /**
107
+ * Represents active queries and their state
108
+ *
109
+ * @internal
110
+ */
111
+
104
112
  /** Contains information about the current session. */
105
113
 
106
114
  /** @internal */
@@ -152,6 +160,7 @@ function () {
152
160
  (0, _defineProperty2.default)(this, "__airtableInterface", void 0);
153
161
  (0, _defineProperty2.default)(this, "globalConfig", void 0);
154
162
  (0, _defineProperty2.default)(this, "base", void 0);
163
+ (0, _defineProperty2.default)(this, "_queryManager", void 0);
155
164
  (0, _defineProperty2.default)(this, "session", void 0);
156
165
  (0, _defineProperty2.default)(this, "__mutations", void 0);
157
166
  (0, _defineProperty2.default)(this, "installationId", void 0);
@@ -167,6 +176,7 @@ function () {
167
176
  var sdkInitData = airtableInterface.sdkInitData;
168
177
  this.globalConfig = new _global_config.default(sdkInitData.initialKvValuesByKey, this);
169
178
  this.base = new _base.default(this);
179
+ this._queryManager = new _query_manager.QueryManager(this);
170
180
  this.installationId = sdkInitData.blockInstallationId; // Bind the public methods on this class so users can import
171
181
  // just the method, e.g.
172
182
  // import {reload} from '@airtable/blocks';
@@ -176,7 +186,7 @@ function () {
176
186
  this.viewport = new _viewport.default(sdkInitData.isFullscreen, airtableInterface);
177
187
  this.cursor = new _cursor.default(this);
178
188
  this.session = new _session.default(this);
179
- this.__mutations = new _mutations.default(this, this.session, this.base, changes => this.__applyModelChanges(changes), updates => this.__applyGlobalConfigUpdates(updates));
189
+ this.__mutations = new _mutations.default(this, this.session, this.base, updates => this.__applyGlobalConfigUpdates(updates));
180
190
  this.settingsButton = new _settings_button.default(airtableInterface);
181
191
  this.undoRedo = new _undo_redo.default(airtableInterface);
182
192
  this.performRecordAction = new _perform_record_action.PerformRecordAction(this, airtableInterface);
@@ -330,4 +340,4 @@ function () {
330
340
  }();
331
341
 
332
342
  exports.default = BlockSdk;
333
- (0, _defineProperty2.default)(BlockSdk, "VERSION", "1.10.1");
343
+ (0, _defineProperty2.default)(BlockSdk, "VERSION", "1.10.2-experimental-640bd10-20220211");
@@ -4,17 +4,23 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
 
5
5
  require("core-js/modules/es.array.concat");
6
6
 
7
- require("core-js/modules/es.array.map");
7
+ require("core-js/modules/es.array.iterator");
8
8
 
9
9
  require("core-js/modules/es.object.to-string");
10
10
 
11
11
  require("core-js/modules/es.promise");
12
12
 
13
+ require("core-js/modules/web.dom-collections.iterator");
14
+
13
15
  Object.defineProperty(exports, "__esModule", {
14
16
  value: true
15
17
  });
16
18
  exports.AbstractMockAirtableInterface = void 0;
17
19
 
20
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
21
+
22
+ require("regenerator-runtime/runtime");
23
+
18
24
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
19
25
 
20
26
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
@@ -155,7 +161,8 @@ var globalConfigHelpers = {
155
161
  var idGenerator = {
156
162
  generateRecordId: () => 'recGeneratedMockId',
157
163
  generateFieldId: () => 'fldGeneratedMockId',
158
- generateTableId: () => 'tblGeneratedMockId'
164
+ generateTableId: () => 'tblGeneratedMockId',
165
+ generateViewId: () => 'viwGeneratedMockId'
159
166
  };
160
167
  /**
161
168
  * An abstract base class with a common interface exposed to both Blocks SDK's
@@ -214,18 +221,15 @@ function (_EventEmitter) {
214
221
  };
215
222
  }
216
223
  }, {
217
- key: "createVisList",
218
- value: function createVisList(appInterface, recordDatas, fieldDatas, sorts) {
224
+ key: "createVisListWithRecordIds",
225
+ value: function createVisListWithRecordIds(recordIds, fieldDatas, sorts, tableId) {
219
226
  return {
220
- removeRecordIds(recordIds) {},
227
+ removeRecordIds(removedRecordIds) {},
221
228
 
222
- addRecordData(recordData) {},
229
+ addRecordIds(addedRecordIds) {},
223
230
 
224
231
  getOrderedRecordIds() {
225
- return recordDatas.map((_ref) => {
226
- var id = _ref.id;
227
- return id;
228
- });
232
+ return [...recordIds];
229
233
  }
230
234
 
231
235
  };
@@ -237,7 +241,49 @@ function (_EventEmitter) {
237
241
  }
238
242
  }, {
239
243
  key: "setActiveViewOrTable",
240
- value: function setActiveViewOrTable(tableId, viewId) {} // TODO(jugglinmike): Implement
244
+ value: function setActiveViewOrTable(tableId, viewId) {}
245
+ }, {
246
+ key: "subscribeToQueryAndPopulateStoresAsync",
247
+ value: function subscribeToQueryAndPopulateStoresAsync(query, options) {
248
+ return _regenerator.default.async(function subscribeToQueryAndPopulateStoresAsync$(_context) {
249
+ while (1) {
250
+ switch (_context.prev = _context.next) {
251
+ case 0:
252
+ throw (0, _error_utils.spawnError)('subscribeToQueryAndPopulateStoresAsync unimplemented');
253
+
254
+ case 1:
255
+ case "end":
256
+ return _context.stop();
257
+ }
258
+ }
259
+ });
260
+ }
261
+ }, {
262
+ key: "unsubscribeFromQueryIdsAsync",
263
+ value: function unsubscribeFromQueryIdsAsync(querySpecIds) {
264
+ return _regenerator.default.async(function unsubscribeFromQueryIdsAsync$(_context2) {
265
+ while (1) {
266
+ switch (_context2.prev = _context2.next) {
267
+ case 0:
268
+ throw (0, _error_utils.spawnError)('unsubscribeFromQueryIdsAsync unimplemented');
269
+
270
+ case 1:
271
+ case "end":
272
+ return _context2.stop();
273
+ }
274
+ }
275
+ });
276
+ }
277
+ }, {
278
+ key: "getTableRecordStoreIfExists",
279
+ value: function getTableRecordStoreIfExists(tableId) {
280
+ throw (0, _error_utils.spawnError)('getTableRecordStoreIfExists unimplemented');
281
+ }
282
+ }, {
283
+ key: "getViewMetadataStoreIfExists",
284
+ value: function getViewMetadataStoreIfExists(tableId, viewId) {
285
+ throw (0, _error_utils.spawnError)('getViewMetadataStoreIfExists unimplemented');
286
+ } // TODO(jugglinmike): Implement
241
287
 
242
288
  }, {
243
289
  key: "subscribeToGlobalConfigUpdates",
@@ -0,0 +1,268 @@
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.filter");
10
+
11
+ require("core-js/modules/es.array.includes");
12
+
13
+ require("core-js/modules/es.array.iterator");
14
+
15
+ require("core-js/modules/es.array.map");
16
+
17
+ require("core-js/modules/es.object.get-own-property-descriptors");
18
+
19
+ require("core-js/modules/es.object.to-string");
20
+
21
+ require("core-js/modules/es.string.includes");
22
+
23
+ require("core-js/modules/web.dom-collections.for-each");
24
+
25
+ require("core-js/modules/web.dom-collections.iterator");
26
+
27
+ Object.defineProperty(exports, "__esModule", {
28
+ value: true
29
+ });
30
+ exports.convertFixtureDataToSdkInitData = convertFixtureDataToSdkInitData;
31
+
32
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
33
+
34
+ var _private_utils = require("../private_utils");
35
+
36
+ var _airtable_interface = require("../types/airtable_interface");
37
+
38
+ var _error_utils = require("../error_utils");
39
+
40
+ 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; }
41
+
42
+ 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; }
43
+
44
+ // There are some values that FixtureData does not cover but SdkInitData
45
+ // requires, so we fill in some mock values for them if needed.
46
+ var MOCK_BLOCK_INSTALLATION_ID = 'blicPfOILwejF6HL2';
47
+ var MOCK_BLOCK_RUN_CONTEXT_TYPE = _airtable_interface.BlockRunContextType.DASHBOARD_APP;
48
+ var MOCK_BASE_PERMISSION_LEVEL = 'create';
49
+ var MOCK_CURRENT_USER_ID = 'usrGalSamari';
50
+ var MOCK_BASE_COLOR = 'purple';
51
+ var MOCK_BILLING_GROUP = 'pro';
52
+ /** @hidden */
53
+
54
+ function convertFixtureDataToSdkInitData(fixtureData) {
55
+ var _fixtureData$base = fixtureData.base,
56
+ id = _fixtureData$base.id,
57
+ name = _fixtureData$base.name,
58
+ color = _fixtureData$base.color,
59
+ tables = _fixtureData$base.tables,
60
+ collaborators = _fixtureData$base.collaborators,
61
+ globalConfig = fixtureData.globalConfig;
62
+ var tablesById = {};
63
+
64
+ if (tables.length === 0) {
65
+ throw (0, _error_utils.spawnError)('Fixture data must include at least one table');
66
+ }
67
+
68
+ var _iteratorNormalCompletion = true;
69
+ var _didIteratorError = false;
70
+ var _iteratorError = undefined;
71
+
72
+ try {
73
+ for (var _iterator = tables[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
74
+ var table = _step.value;
75
+ var tableData = convertTableFixtureDataToTableData(table);
76
+
77
+ if (tablesById[table.id]) {
78
+ throw (0, _error_utils.spawnError)('repeated table ID: %s', table.id);
79
+ }
80
+
81
+ tablesById[table.id] = tableData;
82
+ }
83
+ } catch (err) {
84
+ _didIteratorError = true;
85
+ _iteratorError = err;
86
+ } finally {
87
+ try {
88
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
89
+ _iterator.return();
90
+ }
91
+ } finally {
92
+ if (_didIteratorError) {
93
+ throw _iteratorError;
94
+ }
95
+ }
96
+ }
97
+
98
+ return {
99
+ isDevelopmentMode: false,
100
+ blockInstallationId: MOCK_BLOCK_INSTALLATION_ID,
101
+ isFirstRun: false,
102
+ isFullscreen: false,
103
+ initialKvValuesByKey: _objectSpread({}, globalConfig),
104
+ runContext: {
105
+ type: MOCK_BLOCK_RUN_CONTEXT_TYPE
106
+ },
107
+ baseData: {
108
+ id,
109
+ name,
110
+ color: color !== null && color !== void 0 ? color : MOCK_BASE_COLOR,
111
+ activeTableId: tables[0].id,
112
+ tableOrder: tables.map(t => t.id),
113
+ tablesById,
114
+ permissionLevel: MOCK_BASE_PERMISSION_LEVEL,
115
+ currentUserId: MOCK_CURRENT_USER_ID,
116
+ enabledFeatureNames: [],
117
+ collaboratorsById: (0, _private_utils.keyBy)(collaborators.map(c => {
118
+ // filter out c.isActive
119
+ var email = c.email,
120
+ profilePicUrl = c.profilePicUrl;
121
+ return {
122
+ id: c.id,
123
+ name: c.name,
124
+ email,
125
+ profilePicUrl
126
+ };
127
+ }), _private_utils.getId),
128
+ activeCollaboratorIds: collaborators.filter(c => c.isActive).map(c => c.id),
129
+ cursorData: null,
130
+ billingPlanGrouping: MOCK_BILLING_GROUP,
131
+ appInterface: {},
132
+ isBlockDevelopmentRestrictionEnabled: false
133
+ },
134
+ intentData: null
135
+ };
136
+ }
137
+ /** @internal */
138
+
139
+
140
+ function convertTableFixtureDataToTableData(tableFixtureData) {
141
+ var id = tableFixtureData.id,
142
+ name = tableFixtureData.name,
143
+ description = tableFixtureData.description,
144
+ fields = tableFixtureData.fields,
145
+ views = tableFixtureData.views,
146
+ records = tableFixtureData.records;
147
+ var tableRecordIds = records.map(_private_utils.getId);
148
+ var fieldsById = {};
149
+
150
+ if (fields.length === 0) {
151
+ throw (0, _error_utils.spawnError)('Every table in fixture data must specify at least one field, but table "%s" specified zero fields', id);
152
+ }
153
+
154
+ var _iteratorNormalCompletion2 = true;
155
+ var _didIteratorError2 = false;
156
+ var _iteratorError2 = undefined;
157
+
158
+ try {
159
+ for (var _iterator2 = fields[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
160
+ var field = _step2.value;
161
+ var fieldData = convertFieldFixtureDataToFieldData(field);
162
+
163
+ if (fieldsById[field.id]) {
164
+ throw (0, _error_utils.spawnError)('repeated field ID: %s', field.id);
165
+ }
166
+
167
+ fieldsById[field.id] = fieldData;
168
+ }
169
+ } catch (err) {
170
+ _didIteratorError2 = true;
171
+ _iteratorError2 = err;
172
+ } finally {
173
+ try {
174
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
175
+ _iterator2.return();
176
+ }
177
+ } finally {
178
+ if (_didIteratorError2) {
179
+ throw _iteratorError2;
180
+ }
181
+ }
182
+ }
183
+
184
+ var viewsById = {};
185
+
186
+ if (views.length === 0) {
187
+ throw (0, _error_utils.spawnError)('Every table in fixture data must specify at least one view, but table "%s" specified zero views', id);
188
+ }
189
+
190
+ var _iteratorNormalCompletion3 = true;
191
+ var _didIteratorError3 = false;
192
+ var _iteratorError3 = undefined;
193
+
194
+ try {
195
+ for (var _iterator3 = views[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
196
+ var view = _step3.value;
197
+ var viewData = view;
198
+
199
+ if (viewsById[view.id]) {
200
+ throw (0, _error_utils.spawnError)('repeated view ID: %s', view.id);
201
+ }
202
+
203
+ view.records.map(_private_utils.getId).forEach(viewRecordId => {
204
+ if (!tableRecordIds.includes(viewRecordId)) {
205
+ throw (0, _error_utils.spawnError)('record %s not present in table %s', viewRecordId, id);
206
+ }
207
+ });
208
+ viewsById[view.id] = viewData;
209
+ }
210
+ } catch (err) {
211
+ _didIteratorError3 = true;
212
+ _iteratorError3 = err;
213
+ } finally {
214
+ try {
215
+ if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
216
+ _iterator3.return();
217
+ }
218
+ } finally {
219
+ if (_didIteratorError3) {
220
+ throw _iteratorError3;
221
+ }
222
+ }
223
+ }
224
+
225
+ return {
226
+ id,
227
+ name,
228
+ description,
229
+ primaryFieldId: fields[0].id,
230
+ fieldsById,
231
+ activeViewId: views[0].id,
232
+ viewOrder: views.map(v => v.id),
233
+ viewsById,
234
+ lock: null,
235
+ externalSyncById: null
236
+ };
237
+ }
238
+ /** @internal */
239
+
240
+
241
+ function convertFieldFixtureDataToFieldData(fieldFixtureData) {
242
+ var id = fieldFixtureData.id,
243
+ name = fieldFixtureData.name,
244
+ description = fieldFixtureData.description,
245
+ type = fieldFixtureData.type,
246
+ options = fieldFixtureData.options;
247
+ return {
248
+ id,
249
+ name,
250
+ type,
251
+ description,
252
+ typeOptions: options,
253
+ lock: null
254
+ };
255
+ }
256
+ /**
257
+ * A complete set of information necessary to initialize a simulated Airtable
258
+ * Base in automated test environments. This is currently copied from
259
+ * block-testing.
260
+ *
261
+ * Unlike SdkInitData which does not contain record data by design,
262
+ * FixtureData contains it in fixtureData.base.tables[number].records,
263
+ * and relies on dependent modules to simulate the hyperbase behavior of
264
+ * only making those records after corresponding necessary calls to
265
+ * AirtableInterface.
266
+ *
267
+ * @hidden
268
+ */