@jbrowse/core 2.0.1 → 2.1.0
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.
- package/BaseFeatureWidget/BaseFeatureDetail.d.ts +6 -0
- package/BaseFeatureWidget/BaseFeatureDetail.js +313 -592
- package/BaseFeatureWidget/SequenceFeatureDetails.js +213 -479
- package/BaseFeatureWidget/index.js +88 -126
- package/BaseFeatureWidget/types.js +1 -4
- package/BaseFeatureWidget/util.js +40 -75
- package/CorePlugin.js +55 -94
- package/Plugin.js +9 -34
- package/PluginLoader.js +153 -422
- package/PluginManager.d.ts +17 -14
- package/PluginManager.js +377 -666
- package/ReExports/Attributes.js +3 -10
- package/ReExports/BaseCard.js +3 -10
- package/ReExports/DataGrid.js +5 -12
- package/ReExports/FeatureDetails.js +3 -10
- package/ReExports/index.js +6 -12
- package/ReExports/list.d.ts +5 -0
- package/ReExports/list.js +271 -7
- package/ReExports/material-ui-colors.js +15 -16
- package/ReExports/modules.d.ts +0 -1
- package/ReExports/modules.js +453 -798
- package/TextSearch/BaseResults.js +51 -123
- package/TextSearch/TextSearchManager.js +66 -144
- package/assemblyManager/assembly.js +280 -555
- package/assemblyManager/assemblyConfigSchema.js +47 -64
- package/assemblyManager/assemblyManager.js +126 -272
- package/assemblyManager/index.js +9 -22
- package/configuration/configurationSchema.js +167 -203
- package/configuration/configurationSlot.js +248 -326
- package/configuration/index.js +19 -35
- package/configuration/util.js +131 -173
- package/data_adapters/BaseAdapter.d.ts +2 -2
- package/data_adapters/BaseAdapter.js +132 -521
- package/data_adapters/CytobandAdapter.js +40 -126
- package/data_adapters/dataAdapterCache.js +77 -158
- package/package.json +4 -5
- package/pluggableElementTypes/AdapterType.js +24 -79
- package/pluggableElementTypes/AddTrackWorkflowType.d.ts +17 -0
- package/pluggableElementTypes/AddTrackWorkflowType.js +20 -0
- package/pluggableElementTypes/ConnectionType.js +22 -65
- package/pluggableElementTypes/DisplayType.js +35 -82
- package/pluggableElementTypes/InternetAccountType.js +23 -64
- package/pluggableElementTypes/PluggableElementBase.js +8 -20
- package/pluggableElementTypes/RpcMethodType.js +85 -427
- package/pluggableElementTypes/TextSearchAdapterType.js +16 -55
- package/pluggableElementTypes/TrackType.js +26 -70
- package/pluggableElementTypes/ViewType.js +21 -63
- package/pluggableElementTypes/WidgetType.js +21 -64
- package/pluggableElementTypes/index.d.ts +4 -3
- package/pluggableElementTypes/index.js +42 -125
- package/pluggableElementTypes/models/BaseConnectionModelFactory.js +28 -43
- package/pluggableElementTypes/models/BaseDisplayModel.js +58 -95
- package/pluggableElementTypes/models/BaseTrackModel.js +139 -199
- package/pluggableElementTypes/models/BaseViewModel.js +24 -40
- package/pluggableElementTypes/models/InternetAccountModel.js +116 -263
- package/pluggableElementTypes/models/baseConnectionConfig.js +14 -25
- package/pluggableElementTypes/models/baseInternetAccountConfig.js +29 -38
- package/pluggableElementTypes/models/baseTrackConfig.js +106 -133
- package/pluggableElementTypes/models/index.js +21 -70
- package/pluggableElementTypes/renderers/BoxRendererType.js +132 -291
- package/pluggableElementTypes/renderers/CircularChordRendererType.js +8 -38
- package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.js +60 -192
- package/pluggableElementTypes/renderers/FeatureRendererType.d.ts +0 -2
- package/pluggableElementTypes/renderers/FeatureRendererType.js +89 -264
- package/pluggableElementTypes/renderers/RendererType.js +31 -105
- package/pluggableElementTypes/renderers/ServerSideRenderedContent.js +61 -72
- package/pluggableElementTypes/renderers/ServerSideRendererType.js +112 -265
- package/pluggableElementTypes/renderers/index.js +19 -62
- package/pluggableElementTypes/renderers/util/serializableFilterChain.js +27 -65
- package/rpc/BaseRpcDriver.js +169 -405
- package/rpc/MainThreadRpcDriver.js +27 -150
- package/rpc/RpcManager.js +58 -159
- package/rpc/WebWorkerRpcDriver.js +54 -171
- package/rpc/configSchema.js +25 -49
- package/rpc/coreRpcMethods.js +221 -959
- package/rpc/remoteAbortSignals.js +46 -70
- package/tsconfig.build.tsbuildinfo +1 -1
- package/ui/AboutDialog.js +106 -162
- package/ui/App.js +157 -242
- package/ui/AssemblySelector.js +59 -120
- package/ui/CascadingMenu.js +101 -196
- package/ui/ColorPicker.d.ts +16 -0
- package/ui/ColorPicker.js +97 -0
- package/ui/Drawer.js +28 -61
- package/ui/DrawerWidget.js +108 -202
- package/ui/DropDownMenu.js +60 -91
- package/ui/EditableTypography.js +87 -149
- package/ui/ErrorMessage.js +41 -56
- package/ui/FactoryResetDialog.js +24 -57
- package/ui/FatalErrorDialog.js +59 -91
- package/ui/FileSelector/FileSelector.js +123 -189
- package/ui/FileSelector/LocalFileChooser.js +44 -75
- package/ui/FileSelector/UrlChooser.js +17 -38
- package/ui/FileSelector/index.js +6 -12
- package/ui/Icons.js +45 -69
- package/ui/Logo.js +57 -110
- package/ui/Menu.js +232 -354
- package/ui/PrerenderedCanvas.js +63 -87
- package/ui/ResizeHandle.js +87 -116
- package/ui/ReturnToImportFormDialog.js +32 -63
- package/ui/SanitizedHTML.js +64 -47
- package/ui/Snackbar.js +74 -101
- package/ui/SnackbarModel.js +37 -51
- package/ui/Tooltip.js +49 -76
- package/ui/ViewContainer.js +113 -196
- package/ui/colors.d.ts +10 -0
- package/ui/colors.js +78 -0
- package/ui/index.js +51 -181
- package/ui/react-colorful.d.ts +17 -0
- package/ui/react-colorful.js +455 -0
- package/ui/theme.js +199 -247
- package/util/Base1DUtils.js +163 -202
- package/util/Base1DViewModel.js +121 -168
- package/util/QuickLRU.js +84 -332
- package/util/TimeTraveller.d.ts +19 -0
- package/util/TimeTraveller.js +86 -0
- package/util/aborting.js +49 -127
- package/util/analytics.js +91 -154
- package/util/blockTypes.js +106 -240
- package/util/calculateDynamicBlocks.js +98 -128
- package/util/calculateStaticBlocks.js +105 -125
- package/util/color/cssColorsLevel4.js +156 -160
- package/util/color/index.js +33 -55
- package/util/compositeMap.js +49 -333
- package/util/formatFastaStrings.js +9 -14
- package/util/idMaker.js +18 -31
- package/util/index.d.ts +7 -20
- package/util/index.js +742 -1188
- package/util/io/RemoteFileWithRangeCache.js +88 -257
- package/util/io/index.js +95 -169
- package/util/jexl.js +60 -115
- package/util/jexlStrings.js +24 -29
- package/util/layouts/BaseLayout.js +1 -4
- package/util/layouts/GranularRectLayout.js +388 -555
- package/util/layouts/MultiLayout.js +41 -109
- package/util/layouts/PrecomputedLayout.js +56 -112
- package/util/layouts/PrecomputedMultiLayout.js +22 -59
- package/util/layouts/SceneGraph.js +127 -197
- package/util/layouts/index.js +29 -66
- package/util/mst-reflection.js +55 -71
- package/util/offscreenCanvasPonyfill.js +66 -134
- package/util/offscreenCanvasUtils.d.ts +2 -7
- package/util/offscreenCanvasUtils.js +49 -146
- package/util/range.js +29 -40
- package/util/rxjs.js +20 -27
- package/util/simpleFeature.js +88 -152
- package/util/stats.js +91 -151
- package/util/tracks.js +130 -173
- package/util/types/index.js +110 -179
- package/util/types/mst.js +91 -146
- package/util/types/util.js +1 -4
- package/util/when.js +54 -101
- package/BaseFeatureWidget/SequenceFeatureDetails.test.js +0 -122
- package/BaseFeatureWidget/index.test.js +0 -69
- package/TextSearch/BaseResults.test.js +0 -42
- package/configuration/configurationSchema.test.js +0 -266
- package/configuration/configurationSlot.test.js +0 -69
- package/configuration/util.test.js +0 -39
- package/data_adapters/BaseAdapter.test.js +0 -200
- package/declare.d.js +0 -1
- package/pluggableElementTypes/RpcMethodType.test.js +0 -118
- package/pluggableElementTypes/renderers/declare.d.js +0 -1
- package/pluggableElementTypes/renderers/util/serializableFilterChain.test.js +0 -20
- package/rpc/BaseRpcDriver.test.js +0 -540
- package/rpc/declaration.d.js +0 -1
- package/ui/FatalErrorDialog.test.js +0 -82
- package/ui/SanitizedHTML.test.js +0 -36
- package/ui/theme.test.js +0 -92
- package/util/Base1DViewModel.test.js +0 -130
- package/util/calculateDynamicBlocks.test.js +0 -74
- package/util/calculateStaticBlocks.test.js +0 -297
- package/util/declare.d.js +0 -1
- package/util/formatFastaStrings.test.js +0 -40
- package/util/index.test.js +0 -213
- package/util/jexlStrings.test.js +0 -48
- package/util/layouts/GranularRectLayout.test.js +0 -99
- package/util/range.test.js +0 -64
- package/util/simpleFeature.test.js +0 -34
- package/util/stats.test.js +0 -172
package/util/index.js
CHANGED
|
@@ -1,435 +1,207 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
9
17
|
});
|
|
10
|
-
var
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
springAnimate: true,
|
|
17
|
-
findParentThatIs: true,
|
|
18
|
-
getSession: true,
|
|
19
|
-
getContainingView: true,
|
|
20
|
-
getContainingTrack: true,
|
|
21
|
-
getContainingDisplay: true,
|
|
22
|
-
assembleLocString: true,
|
|
23
|
-
parseLocStringOneBased: true,
|
|
24
|
-
parseLocString: true,
|
|
25
|
-
compareLocs: true,
|
|
26
|
-
compareLocStrings: true,
|
|
27
|
-
clamp: true,
|
|
28
|
-
bpToPx: true,
|
|
29
|
-
radToDeg: true,
|
|
30
|
-
degToRad: true,
|
|
31
|
-
polarToCartesian: true,
|
|
32
|
-
cartesianToPolar: true,
|
|
33
|
-
featureSpanPx: true,
|
|
34
|
-
bpSpanPx: true,
|
|
35
|
-
iterMap: true,
|
|
36
|
-
mergeConfigs: true,
|
|
37
|
-
findLastIndex: true,
|
|
38
|
-
makeAbortableReaction: true,
|
|
39
|
-
renameRegionIfNeeded: true,
|
|
40
|
-
renameRegionsIfNeeded: true,
|
|
41
|
-
minmax: true,
|
|
42
|
-
stringify: true,
|
|
43
|
-
isElectron: true,
|
|
44
|
-
revcom: true,
|
|
45
|
-
complement: true,
|
|
46
|
-
blobToDataURL: true,
|
|
47
|
-
rIC: true,
|
|
48
|
-
measureText: true,
|
|
49
|
-
defaultStarts: true,
|
|
50
|
-
defaultStops: true,
|
|
51
|
-
defaultCodonTable: true,
|
|
52
|
-
generateCodonTable: true,
|
|
53
|
-
updateStatus: true,
|
|
54
|
-
hashCode: true,
|
|
55
|
-
objectHash: true,
|
|
56
|
-
bytesForRegions: true,
|
|
57
|
-
supportedIndexingAdapters: true,
|
|
58
|
-
getBpDisplayStr: true,
|
|
59
|
-
toLocale: true,
|
|
60
|
-
getTickDisplayStr: true,
|
|
61
|
-
getViewParams: true,
|
|
62
|
-
getLayoutId: true,
|
|
63
|
-
SimpleFeature: true,
|
|
64
|
-
isFeature: true
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
65
24
|
};
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
exports
|
|
73
|
-
exports.blobToDataURL =
|
|
74
|
-
exports.
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
exports.
|
|
82
|
-
exports.
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
exports
|
|
87
|
-
exports
|
|
88
|
-
exports
|
|
89
|
-
exports
|
|
90
|
-
exports
|
|
91
|
-
exports
|
|
92
|
-
exports.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
exports.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
exports.minmax = minmax;
|
|
109
|
-
exports.objectHash = objectHash;
|
|
110
|
-
exports.parseLocString = parseLocString;
|
|
111
|
-
exports.parseLocStringOneBased = parseLocStringOneBased;
|
|
112
|
-
exports.polarToCartesian = polarToCartesian;
|
|
113
|
-
exports.rIC = void 0;
|
|
114
|
-
exports.radToDeg = radToDeg;
|
|
115
|
-
exports.renameRegionIfNeeded = renameRegionIfNeeded;
|
|
116
|
-
exports.renameRegionsIfNeeded = renameRegionsIfNeeded;
|
|
117
|
-
exports.revcom = revcom;
|
|
118
|
-
exports.springAnimate = springAnimate;
|
|
119
|
-
exports.stringify = stringify;
|
|
120
|
-
exports.supportedIndexingAdapters = supportedIndexingAdapters;
|
|
121
|
-
exports.toLocale = toLocale;
|
|
122
|
-
exports.updateStatus = updateStatus;
|
|
25
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
26
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
27
|
+
};
|
|
28
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
29
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
30
|
+
};
|
|
31
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
+
exports.toLocale = exports.getBpDisplayStr = exports.supportedIndexingAdapters = exports.bytesForRegions = exports.objectHash = exports.hashCode = exports.updateStatus = exports.generateCodonTable = exports.defaultCodonTable = exports.defaultStops = exports.defaultStarts = exports.measureText = exports.rIC = exports.blobToDataURL = exports.complement = exports.revcom = exports.isElectron = exports.stringify = exports.minmax = exports.renameRegionsIfNeeded = exports.renameRegionIfNeeded = exports.makeAbortableReaction = exports.findLastIndex = exports.iterMap = exports.bpSpanPx = exports.featureSpanPx = exports.cartesianToPolar = exports.polarToCartesian = exports.degToRad = exports.radToDeg = exports.bpToPx = exports.clamp = exports.compareLocStrings = exports.compareLocs = exports.parseLocString = exports.parseLocStringOneBased = exports.assembleLocString = exports.getContainingDisplay = exports.getContainingTrack = exports.getContainingView = exports.getSession = exports.findParentThatIs = exports.springAnimate = exports.findParentThat = exports.useDebouncedCallback = exports.useDebounce = exports.inProduction = exports.inDevelopment = exports.isFeature = exports.SimpleFeature = void 0;
|
|
33
|
+
exports.measureGridWidth = exports.getStr = exports.getUriLink = exports.useLocalStorage = exports.getLayoutId = exports.getViewParams = exports.getTickDisplayStr = void 0;
|
|
34
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
35
|
+
const react_1 = require("react");
|
|
36
|
+
const is_object_1 = __importDefault(require("is-object"));
|
|
37
|
+
const mobx_state_tree_1 = require("mobx-state-tree");
|
|
38
|
+
const mobx_1 = require("mobx");
|
|
39
|
+
const simpleFeature_1 = __importStar(require("./simpleFeature"));
|
|
40
|
+
exports.SimpleFeature = simpleFeature_1.default;
|
|
41
|
+
Object.defineProperty(exports, "isFeature", { enumerable: true, get: function () { return simpleFeature_1.isFeature; } });
|
|
42
|
+
const types_1 = require("./types");
|
|
43
|
+
const aborting_1 = require("./aborting");
|
|
44
|
+
const types_2 = require("./types");
|
|
45
|
+
__exportStar(require("./types"), exports);
|
|
46
|
+
__exportStar(require("./aborting"), exports);
|
|
47
|
+
__exportStar(require("./when"), exports);
|
|
48
|
+
__exportStar(require("./range"), exports);
|
|
49
|
+
__exportStar(require("./offscreenCanvasPonyfill"), exports);
|
|
50
|
+
__exportStar(require("./offscreenCanvasUtils"), exports);
|
|
51
|
+
exports.inDevelopment = typeof process === 'object' &&
|
|
52
|
+
process.env &&
|
|
53
|
+
process.env.NODE_ENV === 'development';
|
|
54
|
+
exports.inProduction = !exports.inDevelopment;
|
|
55
|
+
function useDebounce(value, delay) {
|
|
56
|
+
const [debouncedValue, setDebouncedValue] = (0, react_1.useState)(value);
|
|
57
|
+
(0, react_1.useEffect)(() => {
|
|
58
|
+
const handle = setTimeout(() => {
|
|
59
|
+
setDebouncedValue(value);
|
|
60
|
+
}, delay);
|
|
61
|
+
return () => {
|
|
62
|
+
clearTimeout(handle);
|
|
63
|
+
};
|
|
64
|
+
}, [value, delay]);
|
|
65
|
+
return debouncedValue;
|
|
66
|
+
}
|
|
123
67
|
exports.useDebounce = useDebounce;
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
135
|
-
|
|
136
|
-
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
137
|
-
|
|
138
|
-
var _react = require("react");
|
|
139
|
-
|
|
140
|
-
var _mobxStateTree = require("mobx-state-tree");
|
|
141
|
-
|
|
142
|
-
var _mobx = require("mobx");
|
|
143
|
-
|
|
144
|
-
var _deepmerge = _interopRequireDefault(require("deepmerge"));
|
|
145
|
-
|
|
146
|
-
var _simpleFeature = _interopRequireWildcard(require("./simpleFeature"));
|
|
147
|
-
|
|
148
|
-
var _types = require("./types");
|
|
149
|
-
|
|
150
|
-
Object.keys(_types).forEach(function (key) {
|
|
151
|
-
if (key === "default" || key === "__esModule") return;
|
|
152
|
-
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
153
|
-
if (key in exports && exports[key] === _types[key]) return;
|
|
154
|
-
Object.defineProperty(exports, key, {
|
|
155
|
-
enumerable: true,
|
|
156
|
-
get: function get() {
|
|
157
|
-
return _types[key];
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
var _aborting = require("./aborting");
|
|
163
|
-
|
|
164
|
-
Object.keys(_aborting).forEach(function (key) {
|
|
165
|
-
if (key === "default" || key === "__esModule") return;
|
|
166
|
-
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
167
|
-
if (key in exports && exports[key] === _aborting[key]) return;
|
|
168
|
-
Object.defineProperty(exports, key, {
|
|
169
|
-
enumerable: true,
|
|
170
|
-
get: function get() {
|
|
171
|
-
return _aborting[key];
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
var _when = require("./when");
|
|
177
|
-
|
|
178
|
-
Object.keys(_when).forEach(function (key) {
|
|
179
|
-
if (key === "default" || key === "__esModule") return;
|
|
180
|
-
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
181
|
-
if (key in exports && exports[key] === _when[key]) return;
|
|
182
|
-
Object.defineProperty(exports, key, {
|
|
183
|
-
enumerable: true,
|
|
184
|
-
get: function get() {
|
|
185
|
-
return _when[key];
|
|
186
|
-
}
|
|
187
|
-
});
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
var _range = require("./range");
|
|
191
|
-
|
|
192
|
-
Object.keys(_range).forEach(function (key) {
|
|
193
|
-
if (key === "default" || key === "__esModule") return;
|
|
194
|
-
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
195
|
-
if (key in exports && exports[key] === _range[key]) return;
|
|
196
|
-
Object.defineProperty(exports, key, {
|
|
197
|
-
enumerable: true,
|
|
198
|
-
get: function get() {
|
|
199
|
-
return _range[key];
|
|
200
|
-
}
|
|
201
|
-
});
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
var _offscreenCanvasPonyfill = require("./offscreenCanvasPonyfill");
|
|
205
|
-
|
|
206
|
-
Object.keys(_offscreenCanvasPonyfill).forEach(function (key) {
|
|
207
|
-
if (key === "default" || key === "__esModule") return;
|
|
208
|
-
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
209
|
-
if (key in exports && exports[key] === _offscreenCanvasPonyfill[key]) return;
|
|
210
|
-
Object.defineProperty(exports, key, {
|
|
211
|
-
enumerable: true,
|
|
212
|
-
get: function get() {
|
|
213
|
-
return _offscreenCanvasPonyfill[key];
|
|
214
|
-
}
|
|
215
|
-
});
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
var _offscreenCanvasUtils = require("./offscreenCanvasUtils");
|
|
219
|
-
|
|
220
|
-
Object.keys(_offscreenCanvasUtils).forEach(function (key) {
|
|
221
|
-
if (key === "default" || key === "__esModule") return;
|
|
222
|
-
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
223
|
-
if (key in exports && exports[key] === _offscreenCanvasUtils[key]) return;
|
|
224
|
-
Object.defineProperty(exports, key, {
|
|
225
|
-
enumerable: true,
|
|
226
|
-
get: function get() {
|
|
227
|
-
return _offscreenCanvasUtils[key];
|
|
68
|
+
// https://stackoverflow.com/questions/56283920/how-to-debounce-a-callback-in-functional-component-using-hooks
|
|
69
|
+
function useDebouncedCallback(callback, wait = 400) {
|
|
70
|
+
// track args & timeout handle between calls
|
|
71
|
+
const argsRef = (0, react_1.useRef)();
|
|
72
|
+
const timeout = (0, react_1.useRef)();
|
|
73
|
+
function cleanup() {
|
|
74
|
+
if (timeout.current) {
|
|
75
|
+
clearTimeout(timeout.current);
|
|
76
|
+
}
|
|
228
77
|
}
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
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); }
|
|
243
|
-
|
|
244
|
-
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; }
|
|
245
|
-
|
|
246
|
-
var inDevelopment = (typeof process === "undefined" ? "undefined" : (0, _typeof2.default)(process)) === 'object' && process.env && process.env.NODE_ENV === 'development';
|
|
247
|
-
exports.inDevelopment = inDevelopment;
|
|
248
|
-
var inProduction = !inDevelopment;
|
|
249
|
-
exports.inProduction = inProduction;
|
|
250
|
-
|
|
251
|
-
function useDebounce(value, delay) {
|
|
252
|
-
var _useState = (0, _react.useState)(value),
|
|
253
|
-
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
254
|
-
debouncedValue = _useState2[0],
|
|
255
|
-
setDebouncedValue = _useState2[1];
|
|
256
|
-
|
|
257
|
-
(0, _react.useEffect)(function () {
|
|
258
|
-
var handle = setTimeout(function () {
|
|
259
|
-
setDebouncedValue(value);
|
|
260
|
-
}, delay);
|
|
261
|
-
return function () {
|
|
262
|
-
clearTimeout(handle);
|
|
78
|
+
// make sure our timeout gets cleared if our consuming component gets unmounted
|
|
79
|
+
(0, react_1.useEffect)(() => cleanup, []);
|
|
80
|
+
return function debouncedCallback(...args) {
|
|
81
|
+
// capture latest args
|
|
82
|
+
argsRef.current = args;
|
|
83
|
+
// clear debounce timer
|
|
84
|
+
cleanup();
|
|
85
|
+
// start waiting again
|
|
86
|
+
timeout.current = setTimeout(() => {
|
|
87
|
+
if (argsRef.current) {
|
|
88
|
+
callback(...argsRef.current);
|
|
89
|
+
}
|
|
90
|
+
}, wait);
|
|
263
91
|
};
|
|
264
|
-
}, [value, delay]);
|
|
265
|
-
return debouncedValue;
|
|
266
|
-
} // https://stackoverflow.com/questions/56283920/how-to-debounce-a-callback-in-functional-component-using-hooks
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
function useDebouncedCallback(callback) {
|
|
270
|
-
var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 400;
|
|
271
|
-
// track args & timeout handle between calls
|
|
272
|
-
var argsRef = (0, _react.useRef)();
|
|
273
|
-
var timeout = (0, _react.useRef)();
|
|
274
|
-
|
|
275
|
-
function cleanup() {
|
|
276
|
-
if (timeout.current) {
|
|
277
|
-
clearTimeout(timeout.current);
|
|
278
|
-
}
|
|
279
|
-
} // make sure our timeout gets cleared if our consuming component gets unmounted
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
(0, _react.useEffect)(function () {
|
|
283
|
-
return cleanup;
|
|
284
|
-
}, []);
|
|
285
|
-
return function debouncedCallback() {
|
|
286
|
-
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
287
|
-
args[_key] = arguments[_key];
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
// capture latest args
|
|
291
|
-
argsRef.current = args; // clear debounce timer
|
|
292
|
-
|
|
293
|
-
cleanup(); // start waiting again
|
|
294
|
-
|
|
295
|
-
timeout.current = setTimeout(function () {
|
|
296
|
-
if (argsRef.current) {
|
|
297
|
-
callback.apply(void 0, (0, _toConsumableArray2.default)(argsRef.current));
|
|
298
|
-
}
|
|
299
|
-
}, wait);
|
|
300
|
-
};
|
|
301
92
|
}
|
|
93
|
+
exports.useDebouncedCallback = useDebouncedCallback;
|
|
302
94
|
/** find the first node in the hierarchy that matches the given predicate */
|
|
303
|
-
|
|
304
|
-
|
|
305
95
|
function findParentThat(node, predicate) {
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
var currentNode = (0, _mobxStateTree.getParent)(node);
|
|
311
|
-
|
|
312
|
-
while (currentNode && (0, _mobxStateTree.isAlive)(currentNode)) {
|
|
313
|
-
if (predicate(currentNode)) {
|
|
314
|
-
return currentNode;
|
|
96
|
+
if (!(0, mobx_state_tree_1.hasParent)(node)) {
|
|
97
|
+
throw new Error('node does not have parent');
|
|
315
98
|
}
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
99
|
+
let currentNode = (0, mobx_state_tree_1.getParent)(node);
|
|
100
|
+
while (currentNode && (0, mobx_state_tree_1.isAlive)(currentNode)) {
|
|
101
|
+
if (predicate(currentNode)) {
|
|
102
|
+
return currentNode;
|
|
103
|
+
}
|
|
104
|
+
if ((0, mobx_state_tree_1.hasParent)(currentNode)) {
|
|
105
|
+
currentNode = (0, mobx_state_tree_1.getParent)(currentNode);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
321
110
|
}
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
throw new Error('no matching node found');
|
|
111
|
+
throw new Error('no matching node found');
|
|
325
112
|
}
|
|
326
|
-
|
|
113
|
+
exports.findParentThat = findParentThat;
|
|
327
114
|
// based on https://github.com/react-spring/react-spring/blob/cd5548a987383b8023efd620f3726a981f9e18ea/src/animated/FrameLoop.ts
|
|
328
|
-
function springAnimate(fromValue, toValue, setValue) {
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
var friction = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 26;
|
|
333
|
-
var mass = 1;
|
|
334
|
-
|
|
335
|
-
if (!precision) {
|
|
336
|
-
precision = Math.abs(toValue - fromValue) / 1000;
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
var animationFrameId;
|
|
340
|
-
|
|
341
|
-
function update(animation) {
|
|
342
|
-
var time = Date.now();
|
|
343
|
-
var position = animation.lastPosition;
|
|
344
|
-
var lastTime = animation.lastTime || time;
|
|
345
|
-
var velocity = animation.lastVelocity || 0; // If we lost a lot of frames just jump to the end.
|
|
346
|
-
|
|
347
|
-
if (time > lastTime + 64) {
|
|
348
|
-
lastTime = time;
|
|
349
|
-
} // http://gafferongames.com/game-physics/fix-your-timestep/
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
var numSteps = Math.floor(time - lastTime);
|
|
353
|
-
|
|
354
|
-
for (var i = 0; i < numSteps; ++i) {
|
|
355
|
-
var force = -tension * (position - toValue);
|
|
356
|
-
var damping = -friction * velocity;
|
|
357
|
-
var acceleration = (force + damping) / mass;
|
|
358
|
-
velocity += acceleration * 1 / 1000;
|
|
359
|
-
position += velocity * 1 / 1000;
|
|
115
|
+
function springAnimate(fromValue, toValue, setValue, onFinish = () => { }, precision = 0, tension = 170, friction = 26) {
|
|
116
|
+
const mass = 1;
|
|
117
|
+
if (!precision) {
|
|
118
|
+
precision = Math.abs(toValue - fromValue) / 1000;
|
|
360
119
|
}
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
120
|
+
let animationFrameId;
|
|
121
|
+
function update(animation) {
|
|
122
|
+
const time = Date.now();
|
|
123
|
+
let position = animation.lastPosition;
|
|
124
|
+
let lastTime = animation.lastTime || time;
|
|
125
|
+
let velocity = animation.lastVelocity || 0;
|
|
126
|
+
// If we lost a lot of frames just jump to the end.
|
|
127
|
+
if (time > lastTime + 64) {
|
|
128
|
+
lastTime = time;
|
|
129
|
+
}
|
|
130
|
+
// http://gafferongames.com/game-physics/fix-your-timestep/
|
|
131
|
+
const numSteps = Math.floor(time - lastTime);
|
|
132
|
+
for (let i = 0; i < numSteps; ++i) {
|
|
133
|
+
const force = -tension * (position - toValue);
|
|
134
|
+
const damping = -friction * velocity;
|
|
135
|
+
const acceleration = (force + damping) / mass;
|
|
136
|
+
velocity += (acceleration * 1) / 1000;
|
|
137
|
+
position += (velocity * 1) / 1000;
|
|
138
|
+
}
|
|
139
|
+
const isVelocity = Math.abs(velocity) <= precision;
|
|
140
|
+
const isDisplacement = tension !== 0 ? Math.abs(toValue - position) <= precision : true;
|
|
141
|
+
const endOfAnimation = isVelocity && isDisplacement;
|
|
142
|
+
if (endOfAnimation) {
|
|
143
|
+
setValue(toValue);
|
|
144
|
+
onFinish();
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
setValue(position);
|
|
148
|
+
animationFrameId = requestAnimationFrame(() => update({
|
|
149
|
+
lastPosition: position,
|
|
150
|
+
lastTime: time,
|
|
151
|
+
lastVelocity: velocity,
|
|
152
|
+
}));
|
|
153
|
+
}
|
|
378
154
|
}
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
lastPosition: fromValue
|
|
384
|
-
});
|
|
385
|
-
}, function () {
|
|
386
|
-
return cancelAnimationFrame(animationFrameId);
|
|
387
|
-
}];
|
|
155
|
+
return [
|
|
156
|
+
() => update({ lastPosition: fromValue }),
|
|
157
|
+
() => cancelAnimationFrame(animationFrameId),
|
|
158
|
+
];
|
|
388
159
|
}
|
|
160
|
+
exports.springAnimate = springAnimate;
|
|
389
161
|
/** find the first node in the hierarchy that matches the given 'is' typescript type guard predicate */
|
|
390
|
-
|
|
391
|
-
|
|
392
162
|
function findParentThatIs(node, predicate) {
|
|
393
|
-
|
|
163
|
+
return findParentThat(node, predicate);
|
|
394
164
|
}
|
|
165
|
+
exports.findParentThatIs = findParentThatIs;
|
|
395
166
|
/** get the current JBrowse session model, starting at any node in the state tree */
|
|
396
|
-
|
|
397
|
-
|
|
398
167
|
function getSession(node) {
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
168
|
+
try {
|
|
169
|
+
return findParentThatIs(node, types_1.isSessionModel);
|
|
170
|
+
}
|
|
171
|
+
catch (e) {
|
|
172
|
+
throw new Error('no session model found!');
|
|
173
|
+
}
|
|
404
174
|
}
|
|
175
|
+
exports.getSession = getSession;
|
|
405
176
|
/** get the state model of the view in the state tree that contains the given node */
|
|
406
|
-
|
|
407
|
-
|
|
408
177
|
function getContainingView(node) {
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
178
|
+
try {
|
|
179
|
+
return findParentThatIs(node, types_1.isViewModel);
|
|
180
|
+
}
|
|
181
|
+
catch (e) {
|
|
182
|
+
throw new Error('no containing view found');
|
|
183
|
+
}
|
|
414
184
|
}
|
|
185
|
+
exports.getContainingView = getContainingView;
|
|
415
186
|
/** get the state model of the view in the state tree that contains the given node */
|
|
416
|
-
|
|
417
|
-
|
|
418
187
|
function getContainingTrack(node) {
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
188
|
+
try {
|
|
189
|
+
return findParentThatIs(node, types_1.isTrackModel);
|
|
190
|
+
}
|
|
191
|
+
catch (e) {
|
|
192
|
+
throw new Error('no containing track found');
|
|
193
|
+
}
|
|
424
194
|
}
|
|
425
|
-
|
|
195
|
+
exports.getContainingTrack = getContainingTrack;
|
|
426
196
|
function getContainingDisplay(node) {
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
197
|
+
try {
|
|
198
|
+
return findParentThatIs(node, types_1.isDisplayModel);
|
|
199
|
+
}
|
|
200
|
+
catch (e) {
|
|
201
|
+
throw new Error('no containing display found');
|
|
202
|
+
}
|
|
432
203
|
}
|
|
204
|
+
exports.getContainingDisplay = getContainingDisplay;
|
|
433
205
|
/**
|
|
434
206
|
* Assemble a 1-based "locString" from an interbase genomic location
|
|
435
207
|
* @param region - Region
|
|
@@ -464,155 +236,122 @@ function getContainingDisplay(node) {
|
|
|
464
236
|
* // ↳ 'chr1:1'
|
|
465
237
|
* ```
|
|
466
238
|
*/
|
|
467
|
-
|
|
468
|
-
|
|
469
239
|
function assembleLocString(region) {
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
rev = '[rev]';
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
return "".concat(assemblyNameString).concat(refName).concat(startString).concat(endString).concat(rev);
|
|
240
|
+
const { assemblyName, refName, start, end, reversed } = region;
|
|
241
|
+
const assemblyNameString = assemblyName ? `{${assemblyName}}` : '';
|
|
242
|
+
let startString;
|
|
243
|
+
if (start !== undefined) {
|
|
244
|
+
startString = `:${(start + 1).toLocaleString('en-US')}`;
|
|
245
|
+
}
|
|
246
|
+
else if (end !== undefined) {
|
|
247
|
+
startString = ':1';
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
startString = '';
|
|
251
|
+
}
|
|
252
|
+
let endString;
|
|
253
|
+
if (end !== undefined) {
|
|
254
|
+
endString =
|
|
255
|
+
start !== undefined && start + 1 === end
|
|
256
|
+
? ''
|
|
257
|
+
: `..${end.toLocaleString('en-US')}`;
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
endString = start !== undefined ? '..' : '';
|
|
261
|
+
}
|
|
262
|
+
let rev = '';
|
|
263
|
+
if (reversed) {
|
|
264
|
+
rev = '[rev]';
|
|
265
|
+
}
|
|
266
|
+
return `${assemblyNameString}${refName}${startString}${endString}${rev}`;
|
|
501
267
|
}
|
|
502
|
-
|
|
268
|
+
exports.assembleLocString = assembleLocString;
|
|
503
269
|
function parseLocStringOneBased(locString, isValidRefName) {
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
var _assemblyMatch = (0, _slicedToArray2.default)(assemblyMatch, 4),
|
|
525
|
-
assemblyName = _assemblyMatch[2],
|
|
526
|
-
location = _assemblyMatch[3];
|
|
527
|
-
|
|
528
|
-
if (!assemblyName && location.startsWith('{}')) {
|
|
529
|
-
throw new Error("no assembly name was provided in location \"".concat(location, "\""));
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
var lastColonIdx = location.lastIndexOf(':');
|
|
533
|
-
|
|
534
|
-
if (lastColonIdx === -1) {
|
|
535
|
-
if (isValidRefName(location, assemblyName)) {
|
|
536
|
-
return {
|
|
537
|
-
assemblyName: assemblyName,
|
|
538
|
-
refName: location,
|
|
539
|
-
reversed: reversed
|
|
540
|
-
};
|
|
270
|
+
if (!locString) {
|
|
271
|
+
throw new Error('no location string provided, could not parse');
|
|
272
|
+
}
|
|
273
|
+
let reversed = false;
|
|
274
|
+
if (locString.endsWith('[rev]')) {
|
|
275
|
+
reversed = true;
|
|
276
|
+
locString = locString.replace(/\[rev\]$/, '');
|
|
277
|
+
}
|
|
278
|
+
// remove any whitespace
|
|
279
|
+
locString = locString.replace(/\s/, '');
|
|
280
|
+
// refNames can have colons, ref https://samtools.github.io/hts-specs/SAMv1.pdf Appendix A
|
|
281
|
+
const assemblyMatch = locString.match(/(\{(.+)\})?(.+)/);
|
|
282
|
+
if (!assemblyMatch) {
|
|
283
|
+
throw new Error(`invalid location string: "${locString}"`);
|
|
284
|
+
}
|
|
285
|
+
const [, , assemblyName, location] = assemblyMatch;
|
|
286
|
+
if (!assemblyName && location.startsWith('{}')) {
|
|
287
|
+
throw new Error(`no assembly name was provided in location "${location}"`);
|
|
541
288
|
}
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
var prefix = location.slice(0, lastColonIdx);
|
|
547
|
-
var suffix = location.slice(lastColonIdx + 1);
|
|
548
|
-
|
|
549
|
-
if (isValidRefName(prefix, assemblyName) && isValidRefName(location, assemblyName)) {
|
|
550
|
-
throw new Error("ambiguous location string: \"".concat(locString, "\""));
|
|
551
|
-
} else if (isValidRefName(prefix, assemblyName)) {
|
|
552
|
-
if (suffix) {
|
|
553
|
-
// see if it's a range
|
|
554
|
-
var rangeMatch = suffix.match(/^(-?(\d+|\d{1,3}(,\d{3})*))(\.\.|-)(-?(\d+|\d{1,3}(,\d{3})*))$/); // see if it's a single point
|
|
555
|
-
|
|
556
|
-
var singleMatch = suffix.match(/^(-?(\d+|\d{1,3}(,\d{3})*))(\.\.|-)?$/);
|
|
557
|
-
|
|
558
|
-
if (rangeMatch) {
|
|
559
|
-
var _rangeMatch = (0, _slicedToArray2.default)(rangeMatch, 6),
|
|
560
|
-
_start = _rangeMatch[1],
|
|
561
|
-
_end = _rangeMatch[5];
|
|
562
|
-
|
|
563
|
-
if (_start !== undefined && _end !== undefined) {
|
|
564
|
-
return {
|
|
565
|
-
assemblyName: assemblyName,
|
|
566
|
-
refName: prefix,
|
|
567
|
-
start: +_start.replace(/,/g, ''),
|
|
568
|
-
end: +_end.replace(/,/g, ''),
|
|
569
|
-
reversed: reversed
|
|
570
|
-
};
|
|
289
|
+
const lastColonIdx = location.lastIndexOf(':');
|
|
290
|
+
if (lastColonIdx === -1) {
|
|
291
|
+
if (isValidRefName(location, assemblyName)) {
|
|
292
|
+
return { assemblyName, refName: location, reversed };
|
|
571
293
|
}
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
};
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
294
|
+
throw new Error(`Unknown reference sequence "${location}"`);
|
|
295
|
+
}
|
|
296
|
+
const prefix = location.slice(0, lastColonIdx);
|
|
297
|
+
const suffix = location.slice(lastColonIdx + 1);
|
|
298
|
+
if (isValidRefName(prefix, assemblyName) &&
|
|
299
|
+
isValidRefName(location, assemblyName)) {
|
|
300
|
+
throw new Error(`ambiguous location string: "${locString}"`);
|
|
301
|
+
}
|
|
302
|
+
else if (isValidRefName(prefix, assemblyName)) {
|
|
303
|
+
if (suffix) {
|
|
304
|
+
// see if it's a range
|
|
305
|
+
const rangeMatch = suffix.match(/^(-?(\d+|\d{1,3}(,\d{3})*))(\.\.|-)(-?(\d+|\d{1,3}(,\d{3})*))$/);
|
|
306
|
+
// see if it's a single point
|
|
307
|
+
const singleMatch = suffix.match(/^(-?(\d+|\d{1,3}(,\d{3})*))(\.\.|-)?$/);
|
|
308
|
+
if (rangeMatch) {
|
|
309
|
+
const [, start, , , , end] = rangeMatch;
|
|
310
|
+
if (start !== undefined && end !== undefined) {
|
|
311
|
+
return {
|
|
312
|
+
assemblyName,
|
|
313
|
+
refName: prefix,
|
|
314
|
+
start: +start.replace(/,/g, ''),
|
|
315
|
+
end: +end.replace(/,/g, ''),
|
|
316
|
+
reversed,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
else if (singleMatch) {
|
|
321
|
+
const [, start, , , separator] = singleMatch;
|
|
322
|
+
if (start !== undefined) {
|
|
323
|
+
if (separator) {
|
|
324
|
+
// indefinite end
|
|
325
|
+
return {
|
|
326
|
+
assemblyName,
|
|
327
|
+
refName: prefix,
|
|
328
|
+
start: +start.replace(/,/g, ''),
|
|
329
|
+
reversed,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
assemblyName,
|
|
334
|
+
refName: prefix,
|
|
335
|
+
start: +start.replace(/,/g, ''),
|
|
336
|
+
end: +start.replace(/,/g, ''),
|
|
337
|
+
reversed,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
throw new Error(`could not parse range "${suffix}" on location "${locString}"`);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
return { assemblyName, refName: prefix, reversed };
|
|
595
347
|
}
|
|
596
|
-
} else {
|
|
597
|
-
throw new Error("could not parse range \"".concat(suffix, "\" on location \"").concat(locString, "\""));
|
|
598
|
-
}
|
|
599
|
-
} else {
|
|
600
|
-
return {
|
|
601
|
-
assemblyName: assemblyName,
|
|
602
|
-
refName: prefix,
|
|
603
|
-
reversed: reversed
|
|
604
|
-
};
|
|
605
348
|
}
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
reversed: reversed
|
|
611
|
-
};
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
throw new Error("unknown reference sequence name in location \"".concat(locString, "\""));
|
|
349
|
+
else if (isValidRefName(location, assemblyName)) {
|
|
350
|
+
return { assemblyName, refName: location, reversed };
|
|
351
|
+
}
|
|
352
|
+
throw new Error(`unknown reference sequence name in location "${locString}"`);
|
|
615
353
|
}
|
|
354
|
+
exports.parseLocStringOneBased = parseLocStringOneBased;
|
|
616
355
|
/**
|
|
617
356
|
* Parse a 1-based location string into an interbase genomic location
|
|
618
357
|
* @param locString - Location string
|
|
@@ -650,55 +389,48 @@ function parseLocStringOneBased(locString, isValidRefName) {
|
|
|
650
389
|
* // ↳ { refName: 'chr1', start: 0}
|
|
651
390
|
* ```
|
|
652
391
|
*/
|
|
653
|
-
|
|
654
|
-
|
|
655
392
|
function parseLocString(locString, isValidRefName) {
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
return parsed;
|
|
393
|
+
const parsed = parseLocStringOneBased(locString, isValidRefName);
|
|
394
|
+
if (typeof parsed.start === 'number') {
|
|
395
|
+
parsed.start -= 1;
|
|
396
|
+
}
|
|
397
|
+
return parsed;
|
|
663
398
|
}
|
|
664
|
-
|
|
399
|
+
exports.parseLocString = parseLocString;
|
|
665
400
|
function compareLocs(locA, locB) {
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
var refComp = locA.refName || locB.refName ? (locA.refName || '').localeCompare(locB.refName || '') : 0;
|
|
673
|
-
|
|
674
|
-
if (refComp) {
|
|
675
|
-
return refComp;
|
|
676
|
-
}
|
|
677
|
-
|
|
678
|
-
if (locA.start !== undefined && locB.start !== undefined) {
|
|
679
|
-
var startComp = locA.start - locB.start;
|
|
680
|
-
|
|
681
|
-
if (startComp) {
|
|
682
|
-
return startComp;
|
|
401
|
+
const assemblyComp = locA.assemblyName || locB.assemblyName
|
|
402
|
+
? (locA.assemblyName || '').localeCompare(locB.assemblyName || '')
|
|
403
|
+
: 0;
|
|
404
|
+
if (assemblyComp) {
|
|
405
|
+
return assemblyComp;
|
|
683
406
|
}
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
if (endComp) {
|
|
690
|
-
return endComp;
|
|
407
|
+
const refComp = locA.refName || locB.refName
|
|
408
|
+
? (locA.refName || '').localeCompare(locB.refName || '')
|
|
409
|
+
: 0;
|
|
410
|
+
if (refComp) {
|
|
411
|
+
return refComp;
|
|
691
412
|
}
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
413
|
+
if (locA.start !== undefined && locB.start !== undefined) {
|
|
414
|
+
const startComp = locA.start - locB.start;
|
|
415
|
+
if (startComp) {
|
|
416
|
+
return startComp;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
if (locA.end !== undefined && locB.end !== undefined) {
|
|
420
|
+
const endComp = locA.end - locB.end;
|
|
421
|
+
if (endComp) {
|
|
422
|
+
return endComp;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
return 0;
|
|
695
426
|
}
|
|
696
|
-
|
|
427
|
+
exports.compareLocs = compareLocs;
|
|
697
428
|
function compareLocStrings(a, b, isValidRefName) {
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
429
|
+
const locA = parseLocString(a, isValidRefName);
|
|
430
|
+
const locB = parseLocString(b, isValidRefName);
|
|
431
|
+
return compareLocs(locA, locB);
|
|
701
432
|
}
|
|
433
|
+
exports.compareLocStrings = compareLocStrings;
|
|
702
434
|
/**
|
|
703
435
|
* Ensure that a number is at least min and at most max.
|
|
704
436
|
*
|
|
@@ -706,116 +438,78 @@ function compareLocStrings(a, b, isValidRefName) {
|
|
|
706
438
|
* @param min -
|
|
707
439
|
* @param max -
|
|
708
440
|
*/
|
|
709
|
-
|
|
710
|
-
|
|
711
441
|
function clamp(num, min, max) {
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
return num;
|
|
442
|
+
if (num < min) {
|
|
443
|
+
return min;
|
|
444
|
+
}
|
|
445
|
+
if (num > max) {
|
|
446
|
+
return max;
|
|
447
|
+
}
|
|
448
|
+
return num;
|
|
721
449
|
}
|
|
722
|
-
|
|
450
|
+
exports.clamp = clamp;
|
|
723
451
|
function roundToNearestPointOne(num) {
|
|
724
|
-
|
|
452
|
+
return Math.round(num * 10) / 10;
|
|
725
453
|
}
|
|
726
454
|
/**
|
|
727
455
|
* @param bp -
|
|
728
456
|
* @param region -
|
|
729
457
|
* @param bpPerPx -
|
|
730
458
|
*/
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
function bpToPx(bp, _ref, bpPerPx) {
|
|
734
|
-
var reversed = _ref.reversed,
|
|
735
|
-
_ref$end = _ref.end,
|
|
736
|
-
end = _ref$end === void 0 ? 0 : _ref$end,
|
|
737
|
-
_ref$start = _ref.start,
|
|
738
|
-
start = _ref$start === void 0 ? 0 : _ref$start;
|
|
739
|
-
return roundToNearestPointOne((reversed ? end - bp : bp - start) / bpPerPx);
|
|
459
|
+
function bpToPx(bp, { reversed, end = 0, start = 0, }, bpPerPx) {
|
|
460
|
+
return roundToNearestPointOne((reversed ? end - bp : bp - start) / bpPerPx);
|
|
740
461
|
}
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
462
|
+
exports.bpToPx = bpToPx;
|
|
463
|
+
const oneEightyOverPi = 180.0 / Math.PI;
|
|
464
|
+
const piOverOneEighty = Math.PI / 180.0;
|
|
745
465
|
function radToDeg(radians) {
|
|
746
|
-
|
|
466
|
+
return (radians * oneEightyOverPi) % 360;
|
|
747
467
|
}
|
|
748
|
-
|
|
468
|
+
exports.radToDeg = radToDeg;
|
|
749
469
|
function degToRad(degrees) {
|
|
750
|
-
|
|
470
|
+
return (degrees * piOverOneEighty) % (2 * Math.PI);
|
|
751
471
|
}
|
|
472
|
+
exports.degToRad = degToRad;
|
|
752
473
|
/**
|
|
753
474
|
* @returns [x, y]
|
|
754
475
|
*/
|
|
755
|
-
|
|
756
|
-
|
|
757
476
|
function polarToCartesian(rho, theta) {
|
|
758
|
-
|
|
477
|
+
return [rho * Math.cos(theta), rho * Math.sin(theta)];
|
|
759
478
|
}
|
|
479
|
+
exports.polarToCartesian = polarToCartesian;
|
|
760
480
|
/**
|
|
761
481
|
* @param x - the x
|
|
762
482
|
* @param y - the y
|
|
763
483
|
* @returns [rho, theta]
|
|
764
484
|
*/
|
|
765
|
-
|
|
766
|
-
|
|
767
485
|
function cartesianToPolar(x, y) {
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
486
|
+
const rho = Math.sqrt(x * x + y * y);
|
|
487
|
+
const theta = Math.atan(y / x);
|
|
488
|
+
return [rho, theta];
|
|
771
489
|
}
|
|
772
|
-
|
|
490
|
+
exports.cartesianToPolar = cartesianToPolar;
|
|
773
491
|
function featureSpanPx(feature, region, bpPerPx) {
|
|
774
|
-
|
|
492
|
+
return bpSpanPx(feature.get('start'), feature.get('end'), region, bpPerPx);
|
|
775
493
|
}
|
|
776
|
-
|
|
494
|
+
exports.featureSpanPx = featureSpanPx;
|
|
777
495
|
function bpSpanPx(leftBp, rightBp, region, bpPerPx) {
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
}
|
|
782
|
-
|
|
783
|
-
|
|
496
|
+
const start = bpToPx(leftBp, region, bpPerPx);
|
|
497
|
+
const end = bpToPx(rightBp, region, bpPerPx);
|
|
498
|
+
return region.reversed ? [end, start] : [start, end];
|
|
499
|
+
}
|
|
500
|
+
exports.bpSpanPx = bpSpanPx;
|
|
501
|
+
// do an array map of an iterable
|
|
784
502
|
function iterMap(iterable, func, sizeHint) {
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
try {
|
|
792
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
793
|
-
var _item = _step.value;
|
|
794
|
-
results[counter] = func(_item);
|
|
795
|
-
counter += 1;
|
|
503
|
+
const results = sizeHint ? new Array(sizeHint) : [];
|
|
504
|
+
let counter = 0;
|
|
505
|
+
for (const item of iterable) {
|
|
506
|
+
results[counter] = func(item);
|
|
507
|
+
counter += 1;
|
|
796
508
|
}
|
|
797
|
-
|
|
798
|
-
_iterator.e(err);
|
|
799
|
-
} finally {
|
|
800
|
-
_iterator.f();
|
|
801
|
-
}
|
|
802
|
-
|
|
803
|
-
return results;
|
|
509
|
+
return results;
|
|
804
510
|
}
|
|
805
|
-
|
|
806
|
-
//
|
|
807
|
-
function mergeConfigs(A, B) {
|
|
808
|
-
var merged = (0, _deepmerge.default)(A, B);
|
|
809
|
-
|
|
810
|
-
if (B.defaultSession) {
|
|
811
|
-
merged.defaultSession = B.defaultSession;
|
|
812
|
-
} else if (A.defaultSession) {
|
|
813
|
-
merged.defaultSession = A.defaultSession;
|
|
814
|
-
}
|
|
815
|
-
|
|
816
|
-
return merged;
|
|
817
|
-
} // https://stackoverflow.com/a/53187807
|
|
818
|
-
|
|
511
|
+
exports.iterMap = iterMap;
|
|
512
|
+
// https://stackoverflow.com/a/53187807
|
|
819
513
|
/**
|
|
820
514
|
* Returns the index of the last element in the array where predicate is true,
|
|
821
515
|
* and -1 otherwise.
|
|
@@ -825,19 +519,16 @@ function mergeConfigs(A, B) {
|
|
|
825
519
|
* element is found, findLastIndex immediately returns that element index.
|
|
826
520
|
* Otherwise, findLastIndex returns -1.
|
|
827
521
|
*/
|
|
828
|
-
|
|
829
|
-
|
|
830
522
|
function findLastIndex(array, predicate) {
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
523
|
+
let l = array.length;
|
|
524
|
+
while (l--) {
|
|
525
|
+
if (predicate(array[l], l, array)) {
|
|
526
|
+
return l;
|
|
527
|
+
}
|
|
836
528
|
}
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
return -1;
|
|
529
|
+
return -1;
|
|
840
530
|
}
|
|
531
|
+
exports.findLastIndex = findLastIndex;
|
|
841
532
|
/**
|
|
842
533
|
* makes a mobx reaction with the given functions, that calls actions on the
|
|
843
534
|
* model for each stage of execution, and to abort the reaction function when
|
|
@@ -855,567 +546,430 @@ function findLastIndex(array, predicate) {
|
|
|
855
546
|
* @param successFunction -
|
|
856
547
|
* @param errorFunction -
|
|
857
548
|
*/
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
function makeAbortableReaction(self, dataFunction, asyncReactionFunction, // @ts-ignore
|
|
549
|
+
function makeAbortableReaction(self, dataFunction, asyncReactionFunction,
|
|
550
|
+
// @ts-ignore
|
|
861
551
|
reactionOptions, startedFunction, successFunction, errorFunction) {
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
}
|
|
873
|
-
|
|
874
|
-
(0, _mobxStateTree.addDisposer)(self, (0, _mobx.reaction)(function () {
|
|
875
|
-
try {
|
|
876
|
-
return dataFunction(self);
|
|
877
|
-
} catch (e) {
|
|
878
|
-
handleError(e);
|
|
879
|
-
return undefined;
|
|
552
|
+
let inProgress;
|
|
553
|
+
function handleError(error) {
|
|
554
|
+
if (!(0, aborting_1.isAbortException)(error)) {
|
|
555
|
+
if ((0, mobx_state_tree_1.isAlive)(self)) {
|
|
556
|
+
errorFunction(error);
|
|
557
|
+
}
|
|
558
|
+
else {
|
|
559
|
+
console.error(error);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
880
562
|
}
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
return asyncReactionFunction(data, thisInProgress.signal, self, // @ts-ignore
|
|
906
|
-
mobxReactionHandle);
|
|
907
|
-
|
|
908
|
-
case 9:
|
|
909
|
-
result = _context.sent;
|
|
910
|
-
(0, _aborting.checkAbortSignal)(thisInProgress.signal);
|
|
911
|
-
|
|
912
|
-
if ((0, _mobxStateTree.isAlive)(self)) {
|
|
563
|
+
(0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.reaction)(() => {
|
|
564
|
+
try {
|
|
565
|
+
return dataFunction(self);
|
|
566
|
+
}
|
|
567
|
+
catch (e) {
|
|
568
|
+
handleError(e);
|
|
569
|
+
return undefined;
|
|
570
|
+
}
|
|
571
|
+
}, async (data, mobxReactionHandle) => {
|
|
572
|
+
if (inProgress && !inProgress.signal.aborted) {
|
|
573
|
+
inProgress.abort();
|
|
574
|
+
}
|
|
575
|
+
if (!(0, mobx_state_tree_1.isAlive)(self)) {
|
|
576
|
+
return;
|
|
577
|
+
}
|
|
578
|
+
inProgress = new AbortController();
|
|
579
|
+
const thisInProgress = inProgress;
|
|
580
|
+
startedFunction(thisInProgress);
|
|
581
|
+
try {
|
|
582
|
+
const result = await asyncReactionFunction(data, thisInProgress.signal, self,
|
|
583
|
+
// @ts-ignore
|
|
584
|
+
mobxReactionHandle);
|
|
585
|
+
(0, aborting_1.checkAbortSignal)(thisInProgress.signal);
|
|
586
|
+
if ((0, mobx_state_tree_1.isAlive)(self)) {
|
|
913
587
|
successFunction(result);
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
case 14:
|
|
920
|
-
_context.prev = 14;
|
|
921
|
-
_context.t0 = _context["catch"](6);
|
|
922
|
-
|
|
923
|
-
if (thisInProgress && !thisInProgress.signal.aborted) {
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
catch (e) {
|
|
591
|
+
if (thisInProgress && !thisInProgress.signal.aborted) {
|
|
924
592
|
thisInProgress.abort();
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
handleError(_context.t0);
|
|
928
|
-
|
|
929
|
-
case 18:
|
|
930
|
-
case "end":
|
|
931
|
-
return _context.stop();
|
|
932
|
-
}
|
|
593
|
+
}
|
|
594
|
+
handleError(e);
|
|
933
595
|
}
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
};
|
|
940
|
-
}(), reactionOptions));
|
|
941
|
-
(0, _mobxStateTree.addDisposer)(self, function () {
|
|
942
|
-
if (inProgress && !inProgress.signal.aborted) {
|
|
943
|
-
inProgress.abort();
|
|
944
|
-
}
|
|
945
|
-
});
|
|
596
|
+
}, reactionOptions));
|
|
597
|
+
(0, mobx_state_tree_1.addDisposer)(self, () => {
|
|
598
|
+
if (inProgress && !inProgress.signal.aborted) {
|
|
599
|
+
inProgress.abort();
|
|
600
|
+
}
|
|
601
|
+
});
|
|
946
602
|
}
|
|
947
|
-
|
|
603
|
+
exports.makeAbortableReaction = makeAbortableReaction;
|
|
948
604
|
function renameRegionIfNeeded(refNameMap, region) {
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
}
|
|
952
|
-
|
|
953
|
-
if (region && refNameMap && refNameMap[region.refName]) {
|
|
954
|
-
// clone the region so we don't modify it
|
|
955
|
-
if ((0, _mobxStateTree.isStateTreeNode)(region)) {
|
|
956
|
-
// @ts-ignore
|
|
957
|
-
region = _objectSpread({}, (0, _mobxStateTree.getSnapshot)(region));
|
|
958
|
-
} else {
|
|
959
|
-
region = _objectSpread({}, region);
|
|
960
|
-
} // modify it directly in the container
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
var newRef = refNameMap[region.refName];
|
|
964
|
-
|
|
965
|
-
if (newRef) {
|
|
966
|
-
return _objectSpread(_objectSpread({}, region), {}, {
|
|
967
|
-
refName: newRef,
|
|
968
|
-
originalRefName: region.refName
|
|
969
|
-
});
|
|
605
|
+
if ((0, mobx_state_tree_1.isStateTreeNode)(region) && !(0, mobx_state_tree_1.isAlive)(region)) {
|
|
606
|
+
return region;
|
|
970
607
|
}
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
}
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
return _regenerator.default.wrap(function _callee3$(_context3) {
|
|
985
|
-
while (1) {
|
|
986
|
-
switch (_context3.prev = _context3.next) {
|
|
987
|
-
case 0:
|
|
988
|
-
_args$regions = args.regions, regions = _args$regions === void 0 ? [] : _args$regions, adapterConfig = args.adapterConfig;
|
|
989
|
-
|
|
990
|
-
if (args.sessionId) {
|
|
991
|
-
_context3.next = 3;
|
|
992
|
-
break;
|
|
993
|
-
}
|
|
994
|
-
|
|
995
|
-
throw new Error('sessionId is required');
|
|
996
|
-
|
|
997
|
-
case 3:
|
|
998
|
-
assemblyNames = regions.map(function (region) {
|
|
999
|
-
return region.assemblyName;
|
|
1000
|
-
});
|
|
1001
|
-
_context3.t0 = Object;
|
|
1002
|
-
_context3.next = 7;
|
|
1003
|
-
return Promise.all(assemblyNames.map( /*#__PURE__*/function () {
|
|
1004
|
-
var _ref5 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(assemblyName) {
|
|
1005
|
-
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
1006
|
-
while (1) {
|
|
1007
|
-
switch (_context2.prev = _context2.next) {
|
|
1008
|
-
case 0:
|
|
1009
|
-
_context2.t0 = assemblyName;
|
|
1010
|
-
_context2.next = 3;
|
|
1011
|
-
return assemblyManager.getRefNameMapForAdapter(adapterConfig, assemblyName, args);
|
|
1012
|
-
|
|
1013
|
-
case 3:
|
|
1014
|
-
_context2.t1 = _context2.sent;
|
|
1015
|
-
return _context2.abrupt("return", [_context2.t0, _context2.t1]);
|
|
1016
|
-
|
|
1017
|
-
case 5:
|
|
1018
|
-
case "end":
|
|
1019
|
-
return _context2.stop();
|
|
1020
|
-
}
|
|
1021
|
-
}
|
|
1022
|
-
}, _callee2);
|
|
1023
|
-
}));
|
|
1024
|
-
|
|
1025
|
-
return function (_x10) {
|
|
1026
|
-
return _ref5.apply(this, arguments);
|
|
1027
|
-
};
|
|
1028
|
-
}()));
|
|
1029
|
-
|
|
1030
|
-
case 7:
|
|
1031
|
-
_context3.t1 = _context3.sent;
|
|
1032
|
-
assemblyMaps = _context3.t0.fromEntries.call(_context3.t0, _context3.t1);
|
|
1033
|
-
return _context3.abrupt("return", _objectSpread(_objectSpread({}, args), {}, {
|
|
1034
|
-
regions: regions.map(function (region, i) {
|
|
1035
|
-
return (// note: uses assemblyNames defined above since region could be dead now
|
|
1036
|
-
renameRegionIfNeeded(assemblyMaps[assemblyNames[i]], region)
|
|
1037
|
-
);
|
|
1038
|
-
})
|
|
1039
|
-
}));
|
|
1040
|
-
|
|
1041
|
-
case 10:
|
|
1042
|
-
case "end":
|
|
1043
|
-
return _context3.stop();
|
|
608
|
+
if (region && refNameMap && refNameMap[region.refName]) {
|
|
609
|
+
// clone the region so we don't modify it
|
|
610
|
+
if ((0, mobx_state_tree_1.isStateTreeNode)(region)) {
|
|
611
|
+
// @ts-ignore
|
|
612
|
+
region = { ...(0, mobx_state_tree_1.getSnapshot)(region) };
|
|
613
|
+
}
|
|
614
|
+
else {
|
|
615
|
+
region = { ...region };
|
|
616
|
+
}
|
|
617
|
+
// modify it directly in the container
|
|
618
|
+
const newRef = refNameMap[region.refName];
|
|
619
|
+
if (newRef) {
|
|
620
|
+
return { ...region, refName: newRef, originalRefName: region.refName };
|
|
1044
621
|
}
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
}));
|
|
1048
|
-
return _renameRegionsIfNeeded.apply(this, arguments);
|
|
622
|
+
}
|
|
623
|
+
return region;
|
|
1049
624
|
}
|
|
1050
|
-
|
|
625
|
+
exports.renameRegionIfNeeded = renameRegionIfNeeded;
|
|
626
|
+
async function renameRegionsIfNeeded(assemblyManager, args) {
|
|
627
|
+
const { regions = [], adapterConfig } = args;
|
|
628
|
+
if (!args.sessionId) {
|
|
629
|
+
throw new Error('sessionId is required');
|
|
630
|
+
}
|
|
631
|
+
const assemblyNames = regions.map(region => region.assemblyName);
|
|
632
|
+
const assemblyMaps = Object.fromEntries(await Promise.all(assemblyNames.map(async (assemblyName) => {
|
|
633
|
+
return [
|
|
634
|
+
assemblyName,
|
|
635
|
+
await assemblyManager.getRefNameMapForAdapter(adapterConfig, assemblyName, args),
|
|
636
|
+
];
|
|
637
|
+
})));
|
|
638
|
+
return {
|
|
639
|
+
...args,
|
|
640
|
+
regions: regions.map((region, i) =>
|
|
641
|
+
// note: uses assemblyNames defined above since region could be dead now
|
|
642
|
+
renameRegionIfNeeded(assemblyMaps[assemblyNames[i]], region)),
|
|
643
|
+
};
|
|
644
|
+
}
|
|
645
|
+
exports.renameRegionsIfNeeded = renameRegionsIfNeeded;
|
|
1051
646
|
function minmax(a, b) {
|
|
1052
|
-
|
|
647
|
+
return [Math.min(a, b), Math.max(a, b)];
|
|
648
|
+
}
|
|
649
|
+
exports.minmax = minmax;
|
|
650
|
+
function stringify({ refName, coord, oob, }) {
|
|
651
|
+
return refName
|
|
652
|
+
? `${refName}:${coord.toLocaleString('en-US')}${oob ? ' (out of bounds)' : ''}`
|
|
653
|
+
: '';
|
|
1053
654
|
}
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
var refName = _ref3.refName,
|
|
1057
|
-
coord = _ref3.coord,
|
|
1058
|
-
oob = _ref3.oob;
|
|
1059
|
-
return refName ? "".concat(refName, ":").concat(coord.toLocaleString('en-US')).concat(oob ? ' (out of bounds)' : '') : '';
|
|
1060
|
-
} // this is recommended in a later comment in https://github.com/electron/electron/issues/2288
|
|
655
|
+
exports.stringify = stringify;
|
|
656
|
+
// this is recommended in a later comment in https://github.com/electron/electron/issues/2288
|
|
1061
657
|
// for detecting electron in a renderer process, which is the one that has node enabled for us
|
|
1062
658
|
// const isElectron = process.versions.electron
|
|
1063
659
|
// const i2 = process.versions.hasOwnProperty('electron')
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
var isElectron = /electron/i.test(typeof navigator !== 'undefined' ? navigator.userAgent : '');
|
|
1067
|
-
exports.isElectron = isElectron;
|
|
1068
|
-
|
|
660
|
+
exports.isElectron = /electron/i.test(typeof navigator !== 'undefined' ? navigator.userAgent : '');
|
|
1069
661
|
function revcom(seqString) {
|
|
1070
|
-
|
|
662
|
+
return (0, exports.complement)(seqString).split('').reverse().join('');
|
|
1071
663
|
}
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
};
|
|
1112
|
-
return function (seqString) {
|
|
1113
|
-
return seqString.replace(complementRegex, function (m) {
|
|
1114
|
-
return complementTable[m] || '';
|
|
1115
|
-
});
|
|
1116
|
-
};
|
|
1117
|
-
}();
|
|
1118
|
-
|
|
1119
|
-
exports.complement = complement;
|
|
1120
|
-
|
|
1121
|
-
function blobToDataURL(blob) {
|
|
1122
|
-
var a = new FileReader();
|
|
1123
|
-
return new Promise(function (resolve, reject) {
|
|
1124
|
-
a.onload = function (e) {
|
|
1125
|
-
if (e.target) {
|
|
1126
|
-
resolve(e.target.result);
|
|
1127
|
-
} else {
|
|
1128
|
-
reject(new Error('unknown result reading blob from canvas'));
|
|
1129
|
-
}
|
|
664
|
+
exports.revcom = revcom;
|
|
665
|
+
exports.complement = (() => {
|
|
666
|
+
const complementRegex = /[ACGT]/gi;
|
|
667
|
+
// from bioperl: tr/acgtrymkswhbvdnxACGTRYMKSWHBVDNX/tgcayrkmswdvbhnxTGCAYRKMSWDVBHNX/
|
|
668
|
+
// generated with:
|
|
669
|
+
// perl -MJSON -E '@l = split "","acgtrymkswhbvdnxACGTRYMKSWHBVDNX"; print to_json({ map { my $in = $_; tr/acgtrymkswhbvdnxACGTRYMKSWHBVDNX/tgcayrkmswdvbhnxTGCAYRKMSWDVBHNX/; $in => $_ } @l})'
|
|
670
|
+
const complementTable = {
|
|
671
|
+
S: 'S',
|
|
672
|
+
w: 'w',
|
|
673
|
+
T: 'A',
|
|
674
|
+
r: 'y',
|
|
675
|
+
a: 't',
|
|
676
|
+
N: 'N',
|
|
677
|
+
K: 'M',
|
|
678
|
+
x: 'x',
|
|
679
|
+
d: 'h',
|
|
680
|
+
Y: 'R',
|
|
681
|
+
V: 'B',
|
|
682
|
+
y: 'r',
|
|
683
|
+
M: 'K',
|
|
684
|
+
h: 'd',
|
|
685
|
+
k: 'm',
|
|
686
|
+
C: 'G',
|
|
687
|
+
g: 'c',
|
|
688
|
+
t: 'a',
|
|
689
|
+
A: 'T',
|
|
690
|
+
n: 'n',
|
|
691
|
+
W: 'W',
|
|
692
|
+
X: 'X',
|
|
693
|
+
m: 'k',
|
|
694
|
+
v: 'b',
|
|
695
|
+
B: 'V',
|
|
696
|
+
s: 's',
|
|
697
|
+
H: 'D',
|
|
698
|
+
c: 'g',
|
|
699
|
+
D: 'H',
|
|
700
|
+
b: 'v',
|
|
701
|
+
R: 'Y',
|
|
702
|
+
G: 'C',
|
|
1130
703
|
};
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
}
|
|
704
|
+
return (seqString) => {
|
|
705
|
+
return seqString.replace(complementRegex, m => complementTable[m] || '');
|
|
706
|
+
};
|
|
707
|
+
})();
|
|
708
|
+
function blobToDataURL(blob) {
|
|
709
|
+
const a = new FileReader();
|
|
710
|
+
return new Promise((resolve, reject) => {
|
|
711
|
+
a.onload = e => {
|
|
712
|
+
if (e.target) {
|
|
713
|
+
resolve(e.target.result);
|
|
714
|
+
}
|
|
715
|
+
else {
|
|
716
|
+
reject(new Error('unknown result reading blob from canvas'));
|
|
717
|
+
}
|
|
718
|
+
};
|
|
719
|
+
a.readAsDataURL(blob);
|
|
720
|
+
});
|
|
721
|
+
}
|
|
722
|
+
exports.blobToDataURL = blobToDataURL;
|
|
723
|
+
// requires immediate execution in jest environment, because (hypothesis) it
|
|
1135
724
|
// otherwise listens for prerendered_canvas but reads empty pixels, and doesn't
|
|
1136
725
|
// get the contents of the canvas
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
window.requestIdleCallback
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
for (var i = 0; i < s.length; i++) {
|
|
1159
|
-
var _widths$code;
|
|
1160
|
-
|
|
1161
|
-
var code = s.charCodeAt(i);
|
|
1162
|
-
total += (_widths$code = widths[code]) !== null && _widths$code !== void 0 ? _widths$code : avg;
|
|
1163
|
-
}
|
|
1164
|
-
|
|
1165
|
-
return total * fontSize;
|
|
726
|
+
exports.rIC = typeof jest === 'undefined'
|
|
727
|
+
? // @ts-ignore
|
|
728
|
+
typeof window !== 'undefined' && window.requestIdleCallback
|
|
729
|
+
? // @ts-ignore
|
|
730
|
+
window.requestIdleCallback
|
|
731
|
+
: (cb) => setTimeout(() => cb(), 1)
|
|
732
|
+
: (cb) => cb();
|
|
733
|
+
// prettier-ignore
|
|
734
|
+
const widths = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2796875, 0.2765625, 0.3546875, 0.5546875, 0.5546875, 0.8890625, 0.665625, 0.190625, 0.3328125, 0.3328125, 0.3890625, 0.5828125, 0.2765625, 0.3328125, 0.2765625, 0.3015625, 0.5546875, 0.5546875, 0.5546875, 0.5546875, 0.5546875, 0.5546875, 0.5546875, 0.5546875, 0.5546875, 0.5546875, 0.2765625, 0.2765625, 0.584375, 0.5828125, 0.584375, 0.5546875, 1.0140625, 0.665625, 0.665625, 0.721875, 0.721875, 0.665625, 0.609375, 0.7765625, 0.721875, 0.2765625, 0.5, 0.665625, 0.5546875, 0.8328125, 0.721875, 0.7765625, 0.665625, 0.7765625, 0.721875, 0.665625, 0.609375, 0.721875, 0.665625, 0.94375, 0.665625, 0.665625, 0.609375, 0.2765625, 0.3546875, 0.2765625, 0.4765625, 0.5546875, 0.3328125, 0.5546875, 0.5546875, 0.5, 0.5546875, 0.5546875, 0.2765625, 0.5546875, 0.5546875, 0.221875, 0.240625, 0.5, 0.221875, 0.8328125, 0.5546875, 0.5546875, 0.5546875, 0.5546875, 0.3328125, 0.5, 0.2765625, 0.5546875, 0.5, 0.721875, 0.5, 0.5, 0.5, 0.3546875, 0.259375, 0.353125, 0.5890625];
|
|
735
|
+
// xref https://gist.github.com/tophtucker/62f93a4658387bb61e4510c37e2e97cf
|
|
736
|
+
function measureText(str, fontSize = 10) {
|
|
737
|
+
var _a;
|
|
738
|
+
const avg = 0.5279276315789471;
|
|
739
|
+
const s = String(str);
|
|
740
|
+
let total = 0;
|
|
741
|
+
for (let i = 0; i < s.length; i++) {
|
|
742
|
+
const code = s.charCodeAt(i);
|
|
743
|
+
total += (_a = widths[code]) !== null && _a !== void 0 ? _a : avg;
|
|
744
|
+
}
|
|
745
|
+
return total * fontSize;
|
|
1166
746
|
}
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
exports.
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
GGG: 'G',
|
|
1236
|
-
GGT: 'G'
|
|
747
|
+
exports.measureText = measureText;
|
|
748
|
+
exports.defaultStarts = ['ATG'];
|
|
749
|
+
exports.defaultStops = ['TAA', 'TAG', 'TGA'];
|
|
750
|
+
exports.defaultCodonTable = {
|
|
751
|
+
TCA: 'S',
|
|
752
|
+
TCC: 'S',
|
|
753
|
+
TCG: 'S',
|
|
754
|
+
TCT: 'S',
|
|
755
|
+
TTC: 'F',
|
|
756
|
+
TTT: 'F',
|
|
757
|
+
TTA: 'L',
|
|
758
|
+
TTG: 'L',
|
|
759
|
+
TAC: 'Y',
|
|
760
|
+
TAT: 'Y',
|
|
761
|
+
TAA: '*',
|
|
762
|
+
TAG: '*',
|
|
763
|
+
TGC: 'C',
|
|
764
|
+
TGT: 'C',
|
|
765
|
+
TGA: '*',
|
|
766
|
+
TGG: 'W',
|
|
767
|
+
CTA: 'L',
|
|
768
|
+
CTC: 'L',
|
|
769
|
+
CTG: 'L',
|
|
770
|
+
CTT: 'L',
|
|
771
|
+
CCA: 'P',
|
|
772
|
+
CCC: 'P',
|
|
773
|
+
CCG: 'P',
|
|
774
|
+
CCT: 'P',
|
|
775
|
+
CAC: 'H',
|
|
776
|
+
CAT: 'H',
|
|
777
|
+
CAA: 'Q',
|
|
778
|
+
CAG: 'Q',
|
|
779
|
+
CGA: 'R',
|
|
780
|
+
CGC: 'R',
|
|
781
|
+
CGG: 'R',
|
|
782
|
+
CGT: 'R',
|
|
783
|
+
ATA: 'I',
|
|
784
|
+
ATC: 'I',
|
|
785
|
+
ATT: 'I',
|
|
786
|
+
ATG: 'M',
|
|
787
|
+
ACA: 'T',
|
|
788
|
+
ACC: 'T',
|
|
789
|
+
ACG: 'T',
|
|
790
|
+
ACT: 'T',
|
|
791
|
+
AAC: 'N',
|
|
792
|
+
AAT: 'N',
|
|
793
|
+
AAA: 'K',
|
|
794
|
+
AAG: 'K',
|
|
795
|
+
AGC: 'S',
|
|
796
|
+
AGT: 'S',
|
|
797
|
+
AGA: 'R',
|
|
798
|
+
AGG: 'R',
|
|
799
|
+
GTA: 'V',
|
|
800
|
+
GTC: 'V',
|
|
801
|
+
GTG: 'V',
|
|
802
|
+
GTT: 'V',
|
|
803
|
+
GCA: 'A',
|
|
804
|
+
GCC: 'A',
|
|
805
|
+
GCG: 'A',
|
|
806
|
+
GCT: 'A',
|
|
807
|
+
GAC: 'D',
|
|
808
|
+
GAT: 'D',
|
|
809
|
+
GAA: 'E',
|
|
810
|
+
GAG: 'E',
|
|
811
|
+
GGA: 'G',
|
|
812
|
+
GGC: 'G',
|
|
813
|
+
GGG: 'G',
|
|
814
|
+
GGT: 'G',
|
|
1237
815
|
};
|
|
1238
816
|
/**
|
|
1239
817
|
* take CodonTable above and generate larger codon table that includes
|
|
1240
818
|
* all permutations of upper and lower case nucleotides
|
|
1241
819
|
*/
|
|
1242
|
-
|
|
1243
|
-
exports.defaultCodonTable = defaultCodonTable;
|
|
1244
|
-
|
|
1245
820
|
function generateCodonTable(table) {
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
nucs[i][1] = nuc.toLowerCase();
|
|
1256
|
-
}
|
|
1257
|
-
|
|
1258
|
-
for (var _i = 0; _i < 2; _i++) {
|
|
1259
|
-
var n0 = nucs[0][_i];
|
|
1260
|
-
|
|
1261
|
-
for (var j = 0; j < 2; j++) {
|
|
1262
|
-
var n1 = nucs[1][j];
|
|
1263
|
-
|
|
1264
|
-
for (var k = 0; k < 2; k++) {
|
|
1265
|
-
var n2 = nucs[2][k];
|
|
1266
|
-
var triplet = n0 + n1 + n2;
|
|
1267
|
-
tempCodonTable[triplet] = aa;
|
|
821
|
+
const tempCodonTable = {};
|
|
822
|
+
Object.keys(table).forEach(codon => {
|
|
823
|
+
const aa = table[codon];
|
|
824
|
+
const nucs = [];
|
|
825
|
+
for (let i = 0; i < 3; i++) {
|
|
826
|
+
const nuc = codon.charAt(i);
|
|
827
|
+
nucs[i] = [];
|
|
828
|
+
nucs[i][0] = nuc.toUpperCase();
|
|
829
|
+
nucs[i][1] = nuc.toLowerCase();
|
|
1268
830
|
}
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
}
|
|
1279
|
-
|
|
1280
|
-
function _updateStatus() {
|
|
1281
|
-
_updateStatus = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(msg, cb, fn) {
|
|
1282
|
-
var res;
|
|
1283
|
-
return _regenerator.default.wrap(function _callee4$(_context4) {
|
|
1284
|
-
while (1) {
|
|
1285
|
-
switch (_context4.prev = _context4.next) {
|
|
1286
|
-
case 0:
|
|
1287
|
-
cb(msg);
|
|
1288
|
-
_context4.next = 3;
|
|
1289
|
-
return fn();
|
|
1290
|
-
|
|
1291
|
-
case 3:
|
|
1292
|
-
res = _context4.sent;
|
|
1293
|
-
cb('');
|
|
1294
|
-
return _context4.abrupt("return", res);
|
|
1295
|
-
|
|
1296
|
-
case 6:
|
|
1297
|
-
case "end":
|
|
1298
|
-
return _context4.stop();
|
|
831
|
+
for (let i = 0; i < 2; i++) {
|
|
832
|
+
const n0 = nucs[0][i];
|
|
833
|
+
for (let j = 0; j < 2; j++) {
|
|
834
|
+
const n1 = nucs[1][j];
|
|
835
|
+
for (let k = 0; k < 2; k++) {
|
|
836
|
+
const n2 = nucs[2][k];
|
|
837
|
+
const triplet = n0 + n1 + n2;
|
|
838
|
+
tempCodonTable[triplet] = aa;
|
|
839
|
+
}
|
|
840
|
+
}
|
|
1299
841
|
}
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
842
|
+
});
|
|
843
|
+
return tempCodonTable;
|
|
844
|
+
}
|
|
845
|
+
exports.generateCodonTable = generateCodonTable;
|
|
846
|
+
// call statusCallback with current status and clear when finished
|
|
847
|
+
async function updateStatus(msg, cb, fn) {
|
|
848
|
+
cb(msg);
|
|
849
|
+
const res = await fn();
|
|
850
|
+
cb('');
|
|
851
|
+
return res;
|
|
1304
852
|
}
|
|
1305
|
-
|
|
853
|
+
exports.updateStatus = updateStatus;
|
|
1306
854
|
function hashCode(str) {
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
855
|
+
let hash = 0;
|
|
856
|
+
if (str.length === 0) {
|
|
857
|
+
return hash;
|
|
858
|
+
}
|
|
859
|
+
for (let i = 0; i < str.length; i++) {
|
|
860
|
+
const chr = str.charCodeAt(i);
|
|
861
|
+
hash = (hash << 5) - hash + chr;
|
|
862
|
+
hash |= 0; // Convert to 32bit integer
|
|
863
|
+
}
|
|
1310
864
|
return hash;
|
|
1311
|
-
}
|
|
1312
|
-
|
|
1313
|
-
for (var i = 0; i < str.length; i++) {
|
|
1314
|
-
var chr = str.charCodeAt(i);
|
|
1315
|
-
hash = (hash << 5) - hash + chr;
|
|
1316
|
-
hash |= 0; // Convert to 32bit integer
|
|
1317
|
-
}
|
|
1318
|
-
|
|
1319
|
-
return hash;
|
|
1320
865
|
}
|
|
1321
|
-
|
|
866
|
+
exports.hashCode = hashCode;
|
|
1322
867
|
function objectHash(obj) {
|
|
1323
|
-
|
|
868
|
+
return `${hashCode(JSON.stringify(obj))}`;
|
|
1324
869
|
}
|
|
1325
|
-
|
|
1326
|
-
function bytesForRegions(
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
switch (_context5.prev = _context5.next) {
|
|
1336
|
-
case 0:
|
|
1337
|
-
_context5.next = 2;
|
|
1338
|
-
return Promise.all(regions.map(function (r) {
|
|
1339
|
-
return index.blocksForRange(r.refName, r.start, r.end);
|
|
1340
|
-
}));
|
|
1341
|
-
|
|
1342
|
-
case 2:
|
|
1343
|
-
blockResults = _context5.sent;
|
|
1344
|
-
return _context5.abrupt("return", blockResults.flat().map(function (block) {
|
|
1345
|
-
return {
|
|
1346
|
-
start: block.minv.blockPosition,
|
|
1347
|
-
end: block.maxv.blockPosition + 65535
|
|
1348
|
-
};
|
|
1349
|
-
}).reduce(function (a, b) {
|
|
1350
|
-
return a + b.end - b.start;
|
|
1351
|
-
}, 0));
|
|
1352
|
-
|
|
1353
|
-
case 4:
|
|
1354
|
-
case "end":
|
|
1355
|
-
return _context5.stop();
|
|
1356
|
-
}
|
|
1357
|
-
}
|
|
1358
|
-
}, _callee5);
|
|
1359
|
-
}));
|
|
1360
|
-
return _bytesForRegions.apply(this, arguments);
|
|
870
|
+
exports.objectHash = objectHash;
|
|
871
|
+
async function bytesForRegions(regions, index) {
|
|
872
|
+
const blockResults = await Promise.all(regions.map(r => index.blocksForRange(r.refName, r.start, r.end)));
|
|
873
|
+
return blockResults
|
|
874
|
+
.flat()
|
|
875
|
+
.map(block => ({
|
|
876
|
+
start: block.minv.blockPosition,
|
|
877
|
+
end: block.maxv.blockPosition + 65535,
|
|
878
|
+
}))
|
|
879
|
+
.reduce((a, b) => a + b.end - b.start, 0);
|
|
1361
880
|
}
|
|
1362
|
-
|
|
881
|
+
exports.bytesForRegions = bytesForRegions;
|
|
1363
882
|
// supported adapter types by text indexer
|
|
1364
883
|
// ensure that this matches the method found in @jbrowse/text-indexing/util
|
|
1365
884
|
function supportedIndexingAdapters(type) {
|
|
1366
|
-
|
|
885
|
+
return [
|
|
886
|
+
'Gff3TabixAdapter',
|
|
887
|
+
'VcfTabixAdapter',
|
|
888
|
+
'Gff3Adapter',
|
|
889
|
+
'VcfAdapter',
|
|
890
|
+
].includes(type);
|
|
1367
891
|
}
|
|
1368
|
-
|
|
892
|
+
exports.supportedIndexingAdapters = supportedIndexingAdapters;
|
|
1369
893
|
function getBpDisplayStr(totalBp) {
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
894
|
+
let str;
|
|
895
|
+
if (Math.floor(totalBp / 1000000) > 0) {
|
|
896
|
+
str = `${parseFloat((totalBp / 1000000).toPrecision(3))}Mbp`;
|
|
897
|
+
}
|
|
898
|
+
else if (Math.floor(totalBp / 1000) > 0) {
|
|
899
|
+
str = `${parseFloat((totalBp / 1000).toPrecision(3))}Kbp`;
|
|
900
|
+
}
|
|
901
|
+
else {
|
|
902
|
+
str = `${toLocale(Math.floor(totalBp))}bp`;
|
|
903
|
+
}
|
|
904
|
+
return str;
|
|
1381
905
|
}
|
|
1382
|
-
|
|
906
|
+
exports.getBpDisplayStr = getBpDisplayStr;
|
|
1383
907
|
function toLocale(n) {
|
|
1384
|
-
|
|
908
|
+
return n.toLocaleString('en-US');
|
|
1385
909
|
}
|
|
1386
|
-
|
|
910
|
+
exports.toLocale = toLocale;
|
|
1387
911
|
function getTickDisplayStr(totalBp, bpPerPx) {
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
return str;
|
|
912
|
+
let str;
|
|
913
|
+
if (Math.floor(bpPerPx / 1000) > 0) {
|
|
914
|
+
str = `${toLocale(parseFloat((totalBp / 1000000).toFixed(2)))}M`;
|
|
915
|
+
}
|
|
916
|
+
else {
|
|
917
|
+
str = `${toLocale(Math.floor(totalBp))}`;
|
|
918
|
+
}
|
|
919
|
+
return str;
|
|
1397
920
|
}
|
|
1398
|
-
|
|
921
|
+
exports.getTickDisplayStr = getTickDisplayStr;
|
|
1399
922
|
function getViewParams(model, exportSVG) {
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
offsetPx1: exportSVG ? 0 : offsetPx - staticblock1.offsetPx,
|
|
1412
|
-
start: b.start,
|
|
1413
|
-
end: b.end
|
|
1414
|
-
};
|
|
923
|
+
// @ts-ignore
|
|
924
|
+
const { dynamicBlocks, staticBlocks, offsetPx } = getContainingView(model);
|
|
925
|
+
const b = (dynamicBlocks === null || dynamicBlocks === void 0 ? void 0 : dynamicBlocks.contentBlocks[0]) || {};
|
|
926
|
+
const staticblock = (staticBlocks === null || staticBlocks === void 0 ? void 0 : staticBlocks.contentBlocks[0]) || {};
|
|
927
|
+
const staticblock1 = (staticBlocks === null || staticBlocks === void 0 ? void 0 : staticBlocks.contentBlocks[1]) || {};
|
|
928
|
+
return {
|
|
929
|
+
offsetPx: exportSVG ? 0 : offsetPx - staticblock.offsetPx,
|
|
930
|
+
offsetPx1: exportSVG ? 0 : offsetPx - staticblock1.offsetPx,
|
|
931
|
+
start: b.start,
|
|
932
|
+
end: b.end,
|
|
933
|
+
};
|
|
1415
934
|
}
|
|
1416
|
-
|
|
1417
|
-
function getLayoutId(
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
935
|
+
exports.getViewParams = getViewParams;
|
|
936
|
+
function getLayoutId({ sessionId, layoutId, }) {
|
|
937
|
+
return sessionId + '-' + layoutId;
|
|
938
|
+
}
|
|
939
|
+
exports.getLayoutId = getLayoutId;
|
|
940
|
+
// similar to https://blog.logrocket.com/using-localstorage-react-hooks/
|
|
941
|
+
const useLocalStorage = (key, defaultValue = '') => {
|
|
942
|
+
const [value, setValue] = (0, react_1.useState)(() => localStorage.getItem(key) || defaultValue);
|
|
943
|
+
(0, react_1.useEffect)(() => {
|
|
944
|
+
localStorage.setItem(key, value);
|
|
945
|
+
}, [key, value]);
|
|
946
|
+
// without this cast, tsc complained that the type of setValue could be a
|
|
947
|
+
// string or a callback
|
|
948
|
+
return [value, setValue];
|
|
949
|
+
};
|
|
950
|
+
exports.useLocalStorage = useLocalStorage;
|
|
951
|
+
function getUriLink(value) {
|
|
952
|
+
const { uri, baseUri = '' } = value;
|
|
953
|
+
let href;
|
|
954
|
+
try {
|
|
955
|
+
href = new URL(uri, baseUri).href;
|
|
956
|
+
}
|
|
957
|
+
catch (e) {
|
|
958
|
+
href = uri;
|
|
959
|
+
}
|
|
960
|
+
return href;
|
|
961
|
+
}
|
|
962
|
+
exports.getUriLink = getUriLink;
|
|
963
|
+
function getStr(obj) {
|
|
964
|
+
return (0, is_object_1.default)(obj)
|
|
965
|
+
? (0, types_2.isUriLocation)(obj)
|
|
966
|
+
? getUriLink(obj)
|
|
967
|
+
: JSON.stringify(obj)
|
|
968
|
+
: String(obj);
|
|
969
|
+
}
|
|
970
|
+
exports.getStr = getStr;
|
|
971
|
+
// heuristic measurement for a column of a @mui/x-data-grid, pass in values from a column
|
|
972
|
+
function measureGridWidth(elements) {
|
|
973
|
+
return Math.max(...elements.map(element => Math.min(Math.max(measureText(getStr(element), 14) + 50, 80), 1000)));
|
|
974
|
+
}
|
|
975
|
+
exports.measureGridWidth = measureGridWidth;
|