@jbrowse/core 2.0.0 → 2.1.2

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 (184) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail.d.ts +9 -3
  2. package/BaseFeatureWidget/BaseFeatureDetail.js +313 -581
  3. package/BaseFeatureWidget/SequenceFeatureDetails.js +213 -478
  4. package/BaseFeatureWidget/index.js +88 -126
  5. package/BaseFeatureWidget/types.d.ts +1 -0
  6. package/BaseFeatureWidget/types.js +1 -4
  7. package/BaseFeatureWidget/util.js +40 -75
  8. package/CorePlugin.js +55 -94
  9. package/Plugin.js +9 -34
  10. package/PluginLoader.js +153 -422
  11. package/PluginManager.d.ts +28 -33
  12. package/PluginManager.js +377 -666
  13. package/ReExports/Attributes.js +3 -10
  14. package/ReExports/BaseCard.js +3 -10
  15. package/ReExports/DataGrid.js +5 -12
  16. package/ReExports/FeatureDetails.js +3 -10
  17. package/ReExports/index.js +6 -12
  18. package/ReExports/list.d.ts +5 -0
  19. package/ReExports/list.js +271 -7
  20. package/ReExports/material-ui-colors.js +15 -16
  21. package/ReExports/modules.d.ts +11 -20
  22. package/ReExports/modules.js +453 -798
  23. package/TextSearch/BaseResults.js +51 -123
  24. package/TextSearch/TextSearchManager.js +66 -144
  25. package/assemblyManager/assembly.js +280 -555
  26. package/assemblyManager/assemblyConfigSchema.js +47 -64
  27. package/assemblyManager/assemblyManager.js +126 -272
  28. package/assemblyManager/index.js +9 -22
  29. package/configuration/configurationSchema.js +167 -203
  30. package/configuration/configurationSlot.js +248 -326
  31. package/configuration/index.js +19 -35
  32. package/configuration/util.js +131 -173
  33. package/data_adapters/BaseAdapter.d.ts +2 -2
  34. package/data_adapters/BaseAdapter.js +132 -521
  35. package/data_adapters/CytobandAdapter.js +40 -126
  36. package/data_adapters/dataAdapterCache.js +77 -158
  37. package/package.json +4 -5
  38. package/pluggableElementTypes/AdapterType.js +24 -79
  39. package/pluggableElementTypes/AddTrackWorkflowType.d.ts +17 -0
  40. package/pluggableElementTypes/AddTrackWorkflowType.js +20 -0
  41. package/pluggableElementTypes/ConnectionType.js +22 -65
  42. package/pluggableElementTypes/DisplayType.js +35 -82
  43. package/pluggableElementTypes/InternetAccountType.js +23 -64
  44. package/pluggableElementTypes/PluggableElementBase.js +8 -20
  45. package/pluggableElementTypes/RpcMethodType.js +85 -427
  46. package/pluggableElementTypes/TextSearchAdapterType.js +16 -55
  47. package/pluggableElementTypes/TrackType.js +26 -70
  48. package/pluggableElementTypes/ViewType.js +21 -63
  49. package/pluggableElementTypes/WidgetType.js +21 -64
  50. package/pluggableElementTypes/index.d.ts +4 -3
  51. package/pluggableElementTypes/index.js +42 -125
  52. package/pluggableElementTypes/models/BaseConnectionModelFactory.js +28 -43
  53. package/pluggableElementTypes/models/BaseDisplayModel.js +58 -95
  54. package/pluggableElementTypes/models/BaseTrackModel.js +139 -199
  55. package/pluggableElementTypes/models/BaseViewModel.js +24 -40
  56. package/pluggableElementTypes/models/InternetAccountModel.js +116 -263
  57. package/pluggableElementTypes/models/baseConnectionConfig.js +14 -25
  58. package/pluggableElementTypes/models/baseInternetAccountConfig.js +29 -38
  59. package/pluggableElementTypes/models/baseTrackConfig.js +106 -133
  60. package/pluggableElementTypes/models/index.js +21 -70
  61. package/pluggableElementTypes/renderers/BoxRendererType.js +132 -291
  62. package/pluggableElementTypes/renderers/CircularChordRendererType.js +8 -38
  63. package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.js +60 -192
  64. package/pluggableElementTypes/renderers/FeatureRendererType.d.ts +0 -2
  65. package/pluggableElementTypes/renderers/FeatureRendererType.js +89 -255
  66. package/pluggableElementTypes/renderers/RendererType.js +31 -105
  67. package/pluggableElementTypes/renderers/ServerSideRenderedContent.js +61 -72
  68. package/pluggableElementTypes/renderers/ServerSideRendererType.js +112 -265
  69. package/pluggableElementTypes/renderers/index.js +19 -62
  70. package/pluggableElementTypes/renderers/util/serializableFilterChain.js +27 -65
  71. package/rpc/BaseRpcDriver.js +169 -405
  72. package/rpc/MainThreadRpcDriver.js +27 -150
  73. package/rpc/RpcManager.js +58 -159
  74. package/rpc/WebWorkerRpcDriver.js +54 -171
  75. package/rpc/configSchema.js +25 -49
  76. package/rpc/coreRpcMethods.d.ts +1 -3
  77. package/rpc/coreRpcMethods.js +221 -959
  78. package/rpc/remoteAbortSignals.js +46 -70
  79. package/tsconfig.build.tsbuildinfo +1 -1
  80. package/ui/AboutDialog.js +106 -162
  81. package/ui/App.js +157 -242
  82. package/ui/AssemblySelector.js +59 -120
  83. package/ui/CascadingMenu.js +101 -196
  84. package/ui/ColorPicker.d.ts +16 -0
  85. package/ui/ColorPicker.js +97 -0
  86. package/ui/Drawer.js +28 -61
  87. package/ui/DrawerWidget.js +108 -202
  88. package/ui/DropDownMenu.js +60 -91
  89. package/ui/EditableTypography.js +87 -149
  90. package/ui/ErrorMessage.js +41 -56
  91. package/ui/FactoryResetDialog.js +24 -57
  92. package/ui/FatalErrorDialog.js +59 -91
  93. package/ui/FileSelector/FileSelector.js +123 -189
  94. package/ui/FileSelector/LocalFileChooser.js +44 -75
  95. package/ui/FileSelector/UrlChooser.js +17 -38
  96. package/ui/FileSelector/index.js +6 -12
  97. package/ui/Icons.js +45 -69
  98. package/ui/Logo.js +57 -110
  99. package/ui/Menu.js +232 -354
  100. package/ui/PrerenderedCanvas.js +63 -87
  101. package/ui/ResizeHandle.js +87 -116
  102. package/ui/ReturnToImportFormDialog.js +32 -63
  103. package/ui/SanitizedHTML.js +64 -47
  104. package/ui/Snackbar.js +74 -101
  105. package/ui/SnackbarModel.js +37 -51
  106. package/ui/Tooltip.js +49 -76
  107. package/ui/ViewContainer.js +113 -196
  108. package/ui/colors.d.ts +10 -0
  109. package/ui/colors.js +78 -0
  110. package/ui/index.js +51 -181
  111. package/ui/react-colorful.d.ts +17 -0
  112. package/ui/react-colorful.js +455 -0
  113. package/ui/theme.d.ts +23 -1
  114. package/ui/theme.js +199 -247
  115. package/util/Base1DUtils.d.ts +32 -0
  116. package/util/Base1DUtils.js +174 -0
  117. package/util/Base1DViewModel.d.ts +16 -30
  118. package/util/Base1DViewModel.js +116 -293
  119. package/util/QuickLRU.js +84 -332
  120. package/util/TimeTraveller.d.ts +19 -0
  121. package/util/TimeTraveller.js +86 -0
  122. package/util/aborting.js +49 -127
  123. package/util/analytics.js +91 -154
  124. package/util/blockTypes.js +106 -240
  125. package/util/calculateDynamicBlocks.js +98 -128
  126. package/util/calculateStaticBlocks.js +105 -125
  127. package/util/color/cssColorsLevel4.js +156 -160
  128. package/util/color/index.js +33 -55
  129. package/util/compositeMap.js +49 -333
  130. package/util/formatFastaStrings.js +9 -14
  131. package/util/idMaker.js +18 -31
  132. package/util/index.d.ts +18 -32
  133. package/util/index.js +747 -1226
  134. package/util/io/RemoteFileWithRangeCache.js +88 -257
  135. package/util/io/index.js +95 -169
  136. package/util/jexl.js +60 -115
  137. package/util/jexlStrings.js +24 -29
  138. package/util/layouts/BaseLayout.js +1 -4
  139. package/util/layouts/GranularRectLayout.js +388 -555
  140. package/util/layouts/MultiLayout.js +41 -109
  141. package/util/layouts/PrecomputedLayout.js +56 -112
  142. package/util/layouts/PrecomputedMultiLayout.js +22 -59
  143. package/util/layouts/SceneGraph.js +127 -197
  144. package/util/layouts/index.js +29 -66
  145. package/util/mst-reflection.js +55 -71
  146. package/util/offscreenCanvasPonyfill.js +66 -134
  147. package/util/offscreenCanvasUtils.d.ts +2 -7
  148. package/util/offscreenCanvasUtils.js +49 -146
  149. package/util/range.js +29 -40
  150. package/util/rxjs.js +20 -27
  151. package/util/simpleFeature.js +88 -152
  152. package/util/stats.js +91 -151
  153. package/util/tracks.js +130 -173
  154. package/util/types/index.js +110 -179
  155. package/util/types/mst.js +91 -146
  156. package/util/types/util.js +1 -4
  157. package/util/when.js +54 -101
  158. package/BaseFeatureWidget/SequenceFeatureDetails.test.js +0 -122
  159. package/BaseFeatureWidget/index.test.js +0 -69
  160. package/TextSearch/BaseResults.test.js +0 -42
  161. package/configuration/configurationSchema.test.js +0 -266
  162. package/configuration/configurationSlot.test.js +0 -69
  163. package/configuration/util.test.js +0 -39
  164. package/data_adapters/BaseAdapter.test.js +0 -200
  165. package/declare.d.js +0 -1
  166. package/pluggableElementTypes/RpcMethodType.test.js +0 -118
  167. package/pluggableElementTypes/renderers/declare.d.js +0 -1
  168. package/pluggableElementTypes/renderers/util/serializableFilterChain.test.js +0 -20
  169. package/rpc/BaseRpcDriver.test.js +0 -540
  170. package/rpc/declaration.d.js +0 -1
  171. package/ui/FatalErrorDialog.test.js +0 -82
  172. package/ui/SanitizedHTML.test.js +0 -36
  173. package/ui/theme.test.js +0 -92
  174. package/util/Base1DViewModel.test.js +0 -130
  175. package/util/calculateDynamicBlocks.test.js +0 -74
  176. package/util/calculateStaticBlocks.test.js +0 -297
  177. package/util/declare.d.js +0 -1
  178. package/util/formatFastaStrings.test.js +0 -40
  179. package/util/index.test.js +0 -213
  180. package/util/jexlStrings.test.js +0 -48
  181. package/util/layouts/GranularRectLayout.test.js +0 -99
  182. package/util/range.test.js +0 -64
  183. package/util/simpleFeature.test.js +0 -34
  184. package/util/stats.test.js +0 -172
package/util/QuickLRU.js CHANGED
@@ -1,352 +1,104 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.default = void 0;
9
-
10
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
-
12
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
-
14
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
15
-
16
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
-
18
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
19
-
20
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
21
-
22
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
23
-
2
+ Object.defineProperty(exports, "__esModule", { value: true });
24
3
  /* eslint-disable no-underscore-dangle */
25
-
26
4
  /**
27
5
  * Heavily based on [quick-lru](https://www.npmjs.com/package/quick-lru)
28
6
  * (quick-lru didn't work for us because the export wouldn't compile in Webpack
29
7
  * properly)
30
8
  */
31
- var QuickLRU = /*#__PURE__*/function (_Symbol$iterator) {
32
- function QuickLRU() {
33
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
34
- (0, _classCallCheck2.default)(this, QuickLRU);
35
-
36
- if (!(options.maxSize && options.maxSize > 0)) {
37
- throw new TypeError('`maxSize` must be a number greater than 0');
38
- }
39
-
40
- this.maxSize = options.maxSize;
41
- this.cache = new Map();
42
- this.oldCache = new Map();
43
- this._size = 0;
44
- }
45
-
46
- (0, _createClass2.default)(QuickLRU, [{
47
- key: "_set",
48
- value: function _set(key, value) {
49
- this.cache.set(key, value);
50
- this._size += 1;
51
-
52
- if (this._size >= this.maxSize) {
53
- this._size = 0;
54
- this.oldCache = this.cache;
9
+ class QuickLRU {
10
+ constructor(options = {}) {
11
+ if (!(options.maxSize && options.maxSize > 0)) {
12
+ throw new TypeError('`maxSize` must be a number greater than 0');
13
+ }
14
+ this.maxSize = options.maxSize;
55
15
  this.cache = new Map();
56
- }
57
- }
58
- }, {
59
- key: "get",
60
- value: function get(key) {
61
- if (this.cache.has(key)) {
62
- return this.cache.get(key);
63
- }
64
-
65
- if (this.oldCache.has(key)) {
66
- var value = this.oldCache.get(key);
67
- this.oldCache.delete(key);
68
-
69
- this._set(key, value);
70
-
71
- return value;
72
- }
73
-
74
- return undefined;
16
+ this.oldCache = new Map();
17
+ this._size = 0;
75
18
  }
76
- }, {
77
- key: "set",
78
- value: function set(key, value) {
79
- if (this.cache.has(key)) {
19
+ _set(key, value) {
80
20
  this.cache.set(key, value);
81
- } else {
82
- this._set(key, value);
83
- }
84
-
85
- return this;
21
+ this._size += 1;
22
+ if (this._size >= this.maxSize) {
23
+ this._size = 0;
24
+ this.oldCache = this.cache;
25
+ this.cache = new Map();
26
+ }
27
+ }
28
+ get(key) {
29
+ if (this.cache.has(key)) {
30
+ return this.cache.get(key);
31
+ }
32
+ if (this.oldCache.has(key)) {
33
+ const value = this.oldCache.get(key);
34
+ this.oldCache.delete(key);
35
+ this._set(key, value);
36
+ return value;
37
+ }
38
+ return undefined;
39
+ }
40
+ set(key, value) {
41
+ if (this.cache.has(key)) {
42
+ this.cache.set(key, value);
43
+ }
44
+ else {
45
+ this._set(key, value);
46
+ }
47
+ return this;
48
+ }
49
+ has(key) {
50
+ return this.cache.has(key) || this.oldCache.has(key);
86
51
  }
87
- }, {
88
- key: "has",
89
- value: function has(key) {
90
- return this.cache.has(key) || this.oldCache.has(key);
52
+ peek(key) {
53
+ if (this.cache.has(key)) {
54
+ return this.cache.get(key);
55
+ }
56
+ if (this.oldCache.has(key)) {
57
+ return this.oldCache.get(key);
58
+ }
59
+ return undefined;
91
60
  }
92
- }, {
93
- key: "peek",
94
- value: function peek(key) {
95
- if (this.cache.has(key)) {
96
- return this.cache.get(key);
97
- }
98
-
99
- if (this.oldCache.has(key)) {
100
- return this.oldCache.get(key);
101
- }
102
-
103
- return undefined;
61
+ delete(key) {
62
+ const deleted = this.cache.delete(key);
63
+ if (deleted) {
64
+ this._size -= 1;
65
+ }
66
+ return this.oldCache.delete(key) || deleted;
104
67
  }
105
- }, {
106
- key: "delete",
107
- value: function _delete(key) {
108
- var deleted = this.cache.delete(key);
109
-
110
- if (deleted) {
111
- this._size -= 1;
112
- }
113
-
114
- return this.oldCache.delete(key) || deleted;
68
+ clear() {
69
+ this.cache.clear();
70
+ this.oldCache.clear();
71
+ this._size = 0;
115
72
  }
116
- }, {
117
- key: "clear",
118
- value: function clear() {
119
- this.cache.clear();
120
- this.oldCache.clear();
121
- this._size = 0;
73
+ *keys() {
74
+ for (const [key] of this) {
75
+ yield key;
76
+ }
122
77
  }
123
- }, {
124
- key: "keys",
125
- value: /*#__PURE__*/_regenerator.default.mark(function keys() {
126
- var _iterator, _step, _step$value, key;
127
-
128
- return _regenerator.default.wrap(function keys$(_context) {
129
- while (1) {
130
- switch (_context.prev = _context.next) {
131
- case 0:
132
- _iterator = _createForOfIteratorHelper(this);
133
- _context.prev = 1;
134
-
135
- _iterator.s();
136
-
137
- case 3:
138
- if ((_step = _iterator.n()).done) {
139
- _context.next = 9;
140
- break;
141
- }
142
-
143
- _step$value = (0, _slicedToArray2.default)(_step.value, 1), key = _step$value[0];
144
- _context.next = 7;
145
- return key;
146
-
147
- case 7:
148
- _context.next = 3;
149
- break;
150
-
151
- case 9:
152
- _context.next = 14;
153
- break;
154
-
155
- case 11:
156
- _context.prev = 11;
157
- _context.t0 = _context["catch"](1);
158
-
159
- _iterator.e(_context.t0);
160
-
161
- case 14:
162
- _context.prev = 14;
163
-
164
- _iterator.f();
165
-
166
- return _context.finish(14);
167
-
168
- case 17:
169
- case "end":
170
- return _context.stop();
171
- }
78
+ *values() {
79
+ for (const [, value] of this) {
80
+ yield value;
172
81
  }
173
- }, keys, this, [[1, 11, 14, 17]]);
174
- })
175
- }, {
176
- key: "values",
177
- value: /*#__PURE__*/_regenerator.default.mark(function values() {
178
- var _iterator2, _step2, _step2$value, value;
179
-
180
- return _regenerator.default.wrap(function values$(_context2) {
181
- while (1) {
182
- switch (_context2.prev = _context2.next) {
183
- case 0:
184
- _iterator2 = _createForOfIteratorHelper(this);
185
- _context2.prev = 1;
186
-
187
- _iterator2.s();
188
-
189
- case 3:
190
- if ((_step2 = _iterator2.n()).done) {
191
- _context2.next = 9;
192
- break;
193
- }
194
-
195
- _step2$value = (0, _slicedToArray2.default)(_step2.value, 2), value = _step2$value[1];
196
- _context2.next = 7;
197
- return value;
198
-
199
- case 7:
200
- _context2.next = 3;
201
- break;
202
-
203
- case 9:
204
- _context2.next = 14;
205
- break;
206
-
207
- case 11:
208
- _context2.prev = 11;
209
- _context2.t0 = _context2["catch"](1);
210
-
211
- _iterator2.e(_context2.t0);
212
-
213
- case 14:
214
- _context2.prev = 14;
215
-
216
- _iterator2.f();
217
-
218
- return _context2.finish(14);
219
-
220
- case 17:
221
- case "end":
222
- return _context2.stop();
223
- }
82
+ }
83
+ *[Symbol.iterator]() {
84
+ for (const item of this.cache) {
85
+ yield item;
224
86
  }
225
- }, values, this, [[1, 11, 14, 17]]);
226
- })
227
- }, {
228
- key: _Symbol$iterator,
229
- value: /*#__PURE__*/_regenerator.default.mark(function value() {
230
- var _iterator3, _step3, item, _iterator4, _step4, _item, _item2, key;
231
-
232
- return _regenerator.default.wrap(function value$(_context3) {
233
- while (1) {
234
- switch (_context3.prev = _context3.next) {
235
- case 0:
236
- _iterator3 = _createForOfIteratorHelper(this.cache);
237
- _context3.prev = 1;
238
-
239
- _iterator3.s();
240
-
241
- case 3:
242
- if ((_step3 = _iterator3.n()).done) {
243
- _context3.next = 9;
244
- break;
245
- }
246
-
247
- item = _step3.value;
248
- _context3.next = 7;
249
- return item;
250
-
251
- case 7:
252
- _context3.next = 3;
253
- break;
254
-
255
- case 9:
256
- _context3.next = 14;
257
- break;
258
-
259
- case 11:
260
- _context3.prev = 11;
261
- _context3.t0 = _context3["catch"](1);
262
-
263
- _iterator3.e(_context3.t0);
264
-
265
- case 14:
266
- _context3.prev = 14;
267
-
268
- _iterator3.f();
269
-
270
- return _context3.finish(14);
271
-
272
- case 17:
273
- _iterator4 = _createForOfIteratorHelper(this.oldCache);
274
- _context3.prev = 18;
275
-
276
- _iterator4.s();
277
-
278
- case 20:
279
- if ((_step4 = _iterator4.n()).done) {
280
- _context3.next = 28;
281
- break;
282
- }
283
-
284
- _item = _step4.value;
285
- _item2 = (0, _slicedToArray2.default)(_item, 1), key = _item2[0];
286
-
287
- if (this.cache.has(key)) {
288
- _context3.next = 26;
289
- break;
290
- }
291
-
292
- _context3.next = 26;
293
- return _item;
294
-
295
- case 26:
296
- _context3.next = 20;
297
- break;
298
-
299
- case 28:
300
- _context3.next = 33;
301
- break;
302
-
303
- case 30:
304
- _context3.prev = 30;
305
- _context3.t1 = _context3["catch"](18);
306
-
307
- _iterator4.e(_context3.t1);
308
-
309
- case 33:
310
- _context3.prev = 33;
311
-
312
- _iterator4.f();
313
-
314
- return _context3.finish(33);
315
-
316
- case 36:
317
- case "end":
318
- return _context3.stop();
319
- }
87
+ for (const item of this.oldCache) {
88
+ const [key] = item;
89
+ if (!this.cache.has(key)) {
90
+ yield item;
91
+ }
320
92
  }
321
- }, value, this, [[1, 11, 14, 17], [18, 30, 33, 36]]);
322
- })
323
- }, {
324
- key: "size",
325
- get: function get() {
326
- var oldCacheSize = 0;
327
-
328
- var _iterator5 = _createForOfIteratorHelper(this.oldCache.keys()),
329
- _step5;
330
-
331
- try {
332
- for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
333
- var key = _step5.value;
334
-
335
- if (!this.cache.has(key)) {
336
- oldCacheSize += 1;
337
- }
93
+ }
94
+ get size() {
95
+ let oldCacheSize = 0;
96
+ for (const key of this.oldCache.keys()) {
97
+ if (!this.cache.has(key)) {
98
+ oldCacheSize += 1;
99
+ }
338
100
  }
339
- } catch (err) {
340
- _iterator5.e(err);
341
- } finally {
342
- _iterator5.f();
343
- }
344
-
345
- return this._size + oldCacheSize;
101
+ return this._size + oldCacheSize;
346
102
  }
347
- }]);
348
- return QuickLRU;
349
- }(Symbol.iterator);
350
-
351
- var _default = QuickLRU;
352
- exports.default = _default;
103
+ }
104
+ exports.default = QuickLRU;
@@ -0,0 +1,19 @@
1
+ declare const TimeTraveller: import("mobx-state-tree").IModelType<{
2
+ undoIdx: import("mobx-state-tree").IType<number | undefined, number, number>;
3
+ targetPath: import("mobx-state-tree").IType<string | undefined, string, string>;
4
+ }, {
5
+ history: unknown[];
6
+ notTrackingUndo: boolean;
7
+ } & {
8
+ readonly canUndo: boolean;
9
+ readonly canRedo: boolean;
10
+ } & {
11
+ stopTrackingUndo(): void;
12
+ resumeTrackingUndo(): void;
13
+ addUndoState(todos: unknown): void;
14
+ beforeDestroy(): void;
15
+ initialize(): void;
16
+ undo(): void;
17
+ redo(): void;
18
+ }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
19
+ export default TimeTraveller;
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // adapted from https://github.com/mobxjs/mobx-state-tree/blob/master/packages/mst-middlewares/src/time-traveller.ts
4
+ const mobx_state_tree_1 = require("mobx-state-tree");
5
+ const MAX_HISTORY_LENGTH = 20;
6
+ function debounce(func, timeout = 300) {
7
+ let timer;
8
+ return (...args) => {
9
+ clearTimeout(timer);
10
+ timer = setTimeout(() => func(...args), timeout);
11
+ };
12
+ }
13
+ const TimeTraveller = mobx_state_tree_1.types
14
+ .model('TimeTraveller', {
15
+ undoIdx: -1,
16
+ targetPath: '',
17
+ })
18
+ .volatile(() => ({
19
+ history: [],
20
+ notTrackingUndo: false,
21
+ }))
22
+ .views(self => ({
23
+ get canUndo() {
24
+ return self.undoIdx > 0 && !self.notTrackingUndo;
25
+ },
26
+ get canRedo() {
27
+ return self.undoIdx < self.history.length - 1 && !self.notTrackingUndo;
28
+ },
29
+ }))
30
+ .actions(self => {
31
+ let targetStore;
32
+ let snapshotDisposer;
33
+ let skipNextUndoState = false;
34
+ return {
35
+ // allows user code to (temporarily) stop tracking undo states
36
+ stopTrackingUndo() {
37
+ self.notTrackingUndo = true;
38
+ },
39
+ // allows user code to resume tracking undo states
40
+ resumeTrackingUndo() {
41
+ self.notTrackingUndo = false;
42
+ },
43
+ addUndoState(todos) {
44
+ if (self.notTrackingUndo) {
45
+ return;
46
+ }
47
+ if (skipNextUndoState) {
48
+ // skip recording if this state was caused by undo / redo
49
+ skipNextUndoState = false;
50
+ return;
51
+ }
52
+ self.history.splice(self.undoIdx + 1);
53
+ self.history.push(todos);
54
+ if (self.history.length > MAX_HISTORY_LENGTH) {
55
+ self.history.shift();
56
+ }
57
+ self.undoIdx = self.history.length - 1;
58
+ },
59
+ beforeDestroy() {
60
+ snapshotDisposer();
61
+ },
62
+ initialize() {
63
+ targetStore = self.targetPath
64
+ ? (0, mobx_state_tree_1.resolvePath)(self, self.targetPath)
65
+ : (0, mobx_state_tree_1.getEnv)(self).targetStore;
66
+ if (!targetStore) {
67
+ throw new Error('Failed to find target store for TimeTraveller. Please provide `targetPath` property, or a `targetStore` in the environment');
68
+ }
69
+ snapshotDisposer = (0, mobx_state_tree_1.onSnapshot)(targetStore, debounce((snapshot) => this.addUndoState(snapshot), 300));
70
+ if (self.history.length === 0) {
71
+ this.addUndoState((0, mobx_state_tree_1.getSnapshot)(targetStore));
72
+ }
73
+ },
74
+ undo() {
75
+ self.undoIdx--;
76
+ skipNextUndoState = true;
77
+ (0, mobx_state_tree_1.applySnapshot)(targetStore, self.history[self.undoIdx]);
78
+ },
79
+ redo() {
80
+ self.undoIdx++;
81
+ skipNextUndoState = true;
82
+ (0, mobx_state_tree_1.applySnapshot)(targetStore, self.history[self.undoIdx]);
83
+ },
84
+ };
85
+ });
86
+ exports.default = TimeTraveller;