@jbrowse/core 2.3.4 → 2.4.1
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 +18 -19
- package/BaseFeatureWidget/BaseFeatureDetail.js +76 -69
- package/BaseFeatureWidget/SequenceBox.js +9 -3
- package/BaseFeatureWidget/SequenceFeatureDetails.js +70 -52
- package/BaseFeatureWidget/SequencePanel.d.ts +3 -3
- package/BaseFeatureWidget/SequencePanel.js +8 -5
- package/BaseFeatureWidget/index.js +2 -2
- package/CorePlugin.js +2 -7
- package/PluginLoader.d.ts +1 -1
- package/PluginLoader.js +20 -24
- package/PluginManager.d.ts +1 -1
- package/PluginManager.js +2 -3
- package/ReExports/Attributes.d.ts +1 -2
- package/ReExports/Attributes.js +4 -3
- package/ReExports/BaseCard.d.ts +1 -2
- package/ReExports/BaseCard.js +4 -3
- package/ReExports/DataGrid.d.ts +1 -2
- package/ReExports/DataGrid.js +2 -2
- package/ReExports/FeatureDetails.d.ts +1 -2
- package/ReExports/FeatureDetails.js +4 -3
- package/ReExports/index.d.ts +1 -2
- package/ReExports/index.js +3 -2
- package/ReExports/modules.d.ts +1 -1
- package/ReExports/modules.js +2 -2
- package/assemblyManager/assembly.js +5 -5
- package/assemblyManager/assemblyConfigSchema.js +2 -2
- package/configuration/configurationSchema.js +1 -1
- package/configuration/util.js +1 -1
- package/data_adapters/BaseAdapter.js +1 -1
- package/data_adapters/CytobandAdapter/CytobandAdapter.d.ts +8 -0
- package/data_adapters/CytobandAdapter/CytobandAdapter.js +40 -0
- package/data_adapters/CytobandAdapter/configSchema.d.ts +2 -0
- package/data_adapters/CytobandAdapter/configSchema.js +17 -0
- package/data_adapters/CytobandAdapter/index.d.ts +3 -0
- package/data_adapters/CytobandAdapter/index.js +37 -0
- package/data_adapters/dataAdapterCache.d.ts +3 -2
- package/data_adapters/dataAdapterCache.js +2 -3
- package/package.json +5 -4
- package/pluggableElementTypes/PluggableElementBase.d.ts +1 -1
- package/pluggableElementTypes/PluggableElementBase.js +1 -2
- package/pluggableElementTypes/RpcMethodType.d.ts +5 -8
- package/pluggableElementTypes/RpcMethodType.js +23 -34
- package/pluggableElementTypes/index.d.ts +11 -1
- package/pluggableElementTypes/index.js +23 -23
- package/pluggableElementTypes/models/BaseConnectionModelFactory.js +2 -2
- package/pluggableElementTypes/models/BaseTrackModel.js +8 -13
- package/pluggableElementTypes/renderers/CircularChordRendererType.d.ts +13 -2
- package/pluggableElementTypes/renderers/CircularChordRendererType.js +10 -2
- package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.d.ts +8 -2
- package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.js +10 -4
- package/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +1 -1
- package/pluggableElementTypes/renderers/ServerSideRendererType.js +2 -34
- package/pluggableElementTypes/renderers/index.d.ts +7 -9
- package/pluggableElementTypes/renderers/index.js +15 -15
- package/pluggableElementTypes/renderers/util/serializableFilterChain.js +1 -1
- package/rpc/BaseRpcDriver.js +7 -8
- package/rpc/WebWorkerRpcDriver.js +18 -12
- package/rpc/coreRpcMethods.d.ts +9 -11
- package/rpc/coreRpcMethods.js +17 -17
- package/rpc/methods/CoreGetFeatureDetails.js +1 -1
- package/rpc/methods/util.d.ts +2 -2
- package/rpc/methods/util.js +2 -2
- package/rpc/remoteAbortSignals.js +0 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/ui/App.js +3 -18
- package/ui/AppLogo.js +1 -6
- package/ui/ColorPicker.js +1 -1
- package/ui/Dialog.js +1 -1
- package/ui/DrawerWidget.js +4 -4
- package/ui/EditableTypography.js +1 -1
- package/ui/FileSelector/FileSelector.d.ts +2 -2
- package/ui/FileSelector/FileSelector.js +24 -35
- package/ui/FileSelector/index.d.ts +1 -2
- package/ui/FileSelector/index.js +3 -2
- package/ui/LoadingEllipses.js +2 -2
- package/ui/Menu.js +45 -32
- package/ui/ResizeBar.js +10 -6
- package/ui/ResizeHandle.js +3 -6
- package/ui/SanitizedHTML.js +2 -0
- package/ui/ViewContainer.js +7 -44
- package/ui/ViewMenu.d.ts +9 -0
- package/ui/ViewMenu.js +69 -0
- package/ui/ViewPanel.d.ts +19 -0
- package/ui/ViewPanel.js +49 -0
- package/ui/theme.d.ts +10 -166
- package/ui/theme.js +260 -48
- package/util/Base1DUtils.js +16 -14
- package/util/Base1DViewModel.d.ts +1 -1
- package/util/Base1DViewModel.js +9 -8
- package/util/aborting.js +1 -1
- package/util/analytics.js +1 -1
- package/util/blockTypes.js +10 -10
- package/util/color/index.d.ts +1 -2
- package/util/color/index.js +4 -3
- package/util/idMaker.js +5 -8
- package/util/index.d.ts +9 -9
- package/util/index.js +35 -52
- package/util/io/RemoteFileWithRangeCache.js +2 -2
- package/util/io/index.d.ts +1 -2
- package/util/io/index.js +6 -6
- package/util/jexl.js +3 -1
- package/util/layouts/GranularRectLayout.js +10 -4
- package/util/layouts/MultiLayout.js +1 -1
- package/util/layouts/SceneGraph.js +3 -7
- package/util/map-obj.d.ts +3 -0
- package/util/map-obj.js +33 -0
- package/util/offscreenCanvasPonyfill.js +4 -3
- package/util/offscreenCanvasUtils.d.ts +18 -4
- package/util/offscreenCanvasUtils.js +49 -7
- package/util/tracks.d.ts +1 -1
- package/util/tracks.js +0 -1
- package/util/types/index.d.ts +1 -1
- package/util/types/index.js +3 -3
- package/util/types/mst.js +3 -3
- package/data_adapters/CytobandAdapter.d.ts +0 -8
- package/data_adapters/CytobandAdapter.js +0 -49
package/util/Base1DUtils.js
CHANGED
|
@@ -70,7 +70,7 @@ function pxToBp(self, px) {
|
|
|
70
70
|
if (bp < 0) {
|
|
71
71
|
const r = displayedRegions[0];
|
|
72
72
|
const snap = (0, mobx_state_tree_1.getSnapshot)(r);
|
|
73
|
-
// @ts-
|
|
73
|
+
// @ts-expect-error
|
|
74
74
|
return {
|
|
75
75
|
// xref https://github.com/mobxjs/mobx-state-tree/issues/1524 for Omit
|
|
76
76
|
...snap,
|
|
@@ -88,7 +88,7 @@ function pxToBp(self, px) {
|
|
|
88
88
|
const offset = bp - bpSoFar;
|
|
89
89
|
if (len + bpSoFar > bp && bpSoFar <= bp) {
|
|
90
90
|
const snap = (0, mobx_state_tree_1.getSnapshot)(r);
|
|
91
|
-
// @ts-
|
|
91
|
+
// @ts-expect-error
|
|
92
92
|
return {
|
|
93
93
|
// xref https://github.com/mobxjs/mobx-state-tree/issues/1524 for Omit
|
|
94
94
|
...snap,
|
|
@@ -108,12 +108,12 @@ function pxToBp(self, px) {
|
|
|
108
108
|
bpSoFar += len;
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
|
-
if (bp >= bpSoFar && displayedRegions.length) {
|
|
111
|
+
if (bp >= bpSoFar && displayedRegions.length > 0) {
|
|
112
112
|
const r = displayedRegions[displayedRegions.length - 1];
|
|
113
113
|
const len = r.end - r.start;
|
|
114
114
|
const offset = bp - bpSoFar + len;
|
|
115
115
|
const snap = (0, mobx_state_tree_1.getSnapshot)(r);
|
|
116
|
-
// @ts-
|
|
116
|
+
// @ts-expect-error
|
|
117
117
|
return {
|
|
118
118
|
// xref https://github.com/mobxjs/mobx-state-tree/issues/1524 for Omit
|
|
119
119
|
...snap,
|
|
@@ -147,11 +147,12 @@ function bpToPx({ refName, coord, regionNumber, self, }) {
|
|
|
147
147
|
for (; i < displayedRegions.length; i++) {
|
|
148
148
|
const r = displayedRegions[i];
|
|
149
149
|
const len = r.end - r.start;
|
|
150
|
-
if (refName === r.refName &&
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
150
|
+
if (refName === r.refName &&
|
|
151
|
+
coord >= r.start &&
|
|
152
|
+
coord <= r.end &&
|
|
153
|
+
(regionNumber ? regionNumber === i : true)) {
|
|
154
|
+
bpSoFar += r.reversed ? r.end - coord : coord - r.start;
|
|
155
|
+
break;
|
|
155
156
|
}
|
|
156
157
|
// add the interRegionPaddingWidth if the boundary is in the screen e.g. in
|
|
157
158
|
// a static block
|
|
@@ -185,11 +186,12 @@ function bpToPxMap({ refName, coord, regionNumber, self, }) {
|
|
|
185
186
|
for (; i < displayedRegions.length; i++) {
|
|
186
187
|
const r = displayedRegions[i];
|
|
187
188
|
const len = r.end - r.start;
|
|
188
|
-
if (refName === r.refName &&
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
189
|
+
if (refName === r.refName &&
|
|
190
|
+
coord >= r.start &&
|
|
191
|
+
coord <= r.end &&
|
|
192
|
+
(regionNumber === undefined ? true : regionNumber === i)) {
|
|
193
|
+
bpSoFar += r.reversed ? r.end - coord : coord - r.start;
|
|
194
|
+
break;
|
|
193
195
|
}
|
|
194
196
|
// add the interRegionPaddingWidth if the boundary is in the screen e.g. in
|
|
195
197
|
// a static block
|
package/util/Base1DViewModel.js
CHANGED
|
@@ -180,15 +180,16 @@ const Base1DView = mobx_state_tree_1.types
|
|
|
180
180
|
/**
|
|
181
181
|
* #action
|
|
182
182
|
*/
|
|
183
|
-
zoomTo(
|
|
184
|
-
const
|
|
185
|
-
if (bpPerPx === self.bpPerPx) {
|
|
186
|
-
return self.bpPerPx;
|
|
187
|
-
}
|
|
183
|
+
zoomTo(bpPerPx, offset = self.width / 2) {
|
|
184
|
+
const newBpPerPx = (0, index_1.clamp)(bpPerPx, 'minBpPerPx' in self ? self.minBpPerPx : 0, 'maxBpPerPx' in self ? self.maxBpPerPx : Infinity);
|
|
188
185
|
const oldBpPerPx = self.bpPerPx;
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
186
|
+
if (Math.abs(oldBpPerPx - newBpPerPx) < 0.000001) {
|
|
187
|
+
return oldBpPerPx;
|
|
188
|
+
}
|
|
189
|
+
self.bpPerPx = newBpPerPx;
|
|
190
|
+
// tweak the offset so that the center of the view remains at the same
|
|
191
|
+
// coordinate
|
|
192
|
+
self.offsetPx = (0, index_1.clamp)(Math.round(((self.offsetPx + offset) * oldBpPerPx) / newBpPerPx - offset), self.minOffset, self.maxOffset);
|
|
192
193
|
return self.bpPerPx;
|
|
193
194
|
},
|
|
194
195
|
/**
|
package/util/aborting.js
CHANGED
|
@@ -75,6 +75,6 @@ function isAbortException(exception) {
|
|
|
75
75
|
// Error: aborted
|
|
76
76
|
// AbortError: aborted
|
|
77
77
|
// AbortError: The user aborted a request.
|
|
78
|
-
|
|
78
|
+
!!/\b(aborted|aborterror)\b/i.test(exception.message)));
|
|
79
79
|
}
|
|
80
80
|
exports.isAbortException = isAbortException;
|
package/util/analytics.js
CHANGED
|
@@ -83,7 +83,7 @@ async function writeGAAnalytics(rootModel, initialTimestamp) {
|
|
|
83
83
|
analyticsScript += `ga('jbrowseTracker.send', 'pageview',${JSON.stringify(gaData)});`;
|
|
84
84
|
const analyticsScriptNode = document.createElement('script');
|
|
85
85
|
analyticsScriptNode.innerHTML = analyticsScript;
|
|
86
|
-
document.getElementsByTagName('head')[0].
|
|
86
|
+
document.getElementsByTagName('head')[0].append(analyticsScriptNode);
|
|
87
87
|
}
|
|
88
88
|
exports.writeGAAnalytics = writeGAAnalytics;
|
|
89
89
|
function doAnalytics(rootModel, initialTimestamp, initialSessionQuery) {
|
package/util/blockTypes.js
CHANGED
|
@@ -6,13 +6,11 @@ class BlockSet {
|
|
|
6
6
|
this.blocks = blocks;
|
|
7
7
|
}
|
|
8
8
|
push(block) {
|
|
9
|
-
if (block instanceof ElidedBlock) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
9
|
+
if (block instanceof ElidedBlock && this.blocks.length > 0) {
|
|
10
|
+
const lastBlock = this.blocks[this.blocks.length - 1];
|
|
11
|
+
if (lastBlock instanceof ElidedBlock) {
|
|
12
|
+
lastBlock.push(block);
|
|
13
|
+
return;
|
|
16
14
|
}
|
|
17
15
|
}
|
|
18
16
|
this.blocks.push(block);
|
|
@@ -24,21 +22,23 @@ class BlockSet {
|
|
|
24
22
|
return this.blocks.map(block => block.toRegion());
|
|
25
23
|
}
|
|
26
24
|
map(func, thisarg) {
|
|
25
|
+
// eslint-disable-next-line unicorn/no-array-method-this-argument
|
|
27
26
|
return this.blocks.map(func, thisarg);
|
|
28
27
|
}
|
|
29
28
|
forEach(func, thisarg) {
|
|
29
|
+
// eslint-disable-next-line unicorn/no-array-method-this-argument
|
|
30
30
|
return this.blocks.forEach(func, thisarg);
|
|
31
31
|
}
|
|
32
32
|
get length() {
|
|
33
33
|
return this.blocks.length;
|
|
34
34
|
}
|
|
35
35
|
get totalWidthPx() {
|
|
36
|
-
return this.blocks.length
|
|
36
|
+
return this.blocks.length > 0
|
|
37
37
|
? this.blocks.map(blocks => blocks.widthPx).reduce((a, b) => a + b)
|
|
38
38
|
: 0;
|
|
39
39
|
}
|
|
40
40
|
get totalWidthPxWithoutBorders() {
|
|
41
|
-
return this.blocks.length
|
|
41
|
+
return this.blocks.length > 0
|
|
42
42
|
? this.blocks
|
|
43
43
|
.filter(block => block.variant !== 'boundary')
|
|
44
44
|
.map(blocks => blocks.widthPx)
|
|
@@ -46,7 +46,7 @@ class BlockSet {
|
|
|
46
46
|
: 0;
|
|
47
47
|
}
|
|
48
48
|
get offsetPx() {
|
|
49
|
-
return this.blocks.length ? this.blocks[0].offsetPx : 0;
|
|
49
|
+
return this.blocks.length > 0 ? this.blocks[0].offsetPx : 0;
|
|
50
50
|
}
|
|
51
51
|
get contentBlocks() {
|
|
52
52
|
return this.blocks.filter(block => block instanceof ContentBlock);
|
package/util/color/index.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { namedColorToHex, isNamedColor } from './cssColorsLevel4';
|
|
2
|
-
export { namedColorToHex, isNamedColor };
|
|
3
1
|
/**
|
|
4
2
|
* Algorithmically pick a contrasting text color that will
|
|
5
3
|
* be visible on top of the given background color. Either
|
|
@@ -22,3 +20,4 @@ export declare function contrastingTextColor(color: string): string;
|
|
|
22
20
|
*/
|
|
23
21
|
export declare function emphasize(color: string, coefficient?: number): string;
|
|
24
22
|
export declare function makeContrasting(foreground: string, background?: string, minContrastRatio?: number): string;
|
|
23
|
+
export { isNamedColor, namedColorToHex } from './cssColorsLevel4';
|
package/util/color/index.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.namedColorToHex = exports.isNamedColor = exports.makeContrasting = exports.emphasize = exports.contrastingTextColor = void 0;
|
|
4
4
|
const styles_1 = require("@mui/material/styles");
|
|
5
5
|
const cssColorsLevel4_1 = require("./cssColorsLevel4");
|
|
6
|
-
Object.defineProperty(exports, "namedColorToHex", { enumerable: true, get: function () { return cssColorsLevel4_1.namedColorToHex; } });
|
|
7
|
-
Object.defineProperty(exports, "isNamedColor", { enumerable: true, get: function () { return cssColorsLevel4_1.isNamedColor; } });
|
|
8
6
|
/**
|
|
9
7
|
* Algorithmically pick a contrasting text color that will
|
|
10
8
|
* be visible on top of the given background color. Either
|
|
@@ -67,3 +65,6 @@ function makeContrasting(foreground, background = 'white', minContrastRatio = 3)
|
|
|
67
65
|
return convertedForeground;
|
|
68
66
|
}
|
|
69
67
|
exports.makeContrasting = makeContrasting;
|
|
68
|
+
var cssColorsLevel4_2 = require("./cssColorsLevel4");
|
|
69
|
+
Object.defineProperty(exports, "isNamedColor", { enumerable: true, get: function () { return cssColorsLevel4_2.isNamedColor; } });
|
|
70
|
+
Object.defineProperty(exports, "namedColorToHex", { enumerable: true, get: function () { return cssColorsLevel4_2.namedColorToHex; } });
|
package/util/idMaker.js
CHANGED
|
@@ -7,17 +7,14 @@ const _1 = require("./");
|
|
|
7
7
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
8
|
function idMaker(args, id = '') {
|
|
9
9
|
const keys = Object.keys(args);
|
|
10
|
-
for (
|
|
11
|
-
const key = keys[i];
|
|
10
|
+
for (const key of keys) {
|
|
12
11
|
if (id.length > 5000) {
|
|
13
12
|
break;
|
|
14
13
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
id += `${key}-${args[key]};`;
|
|
20
|
-
}
|
|
14
|
+
id +=
|
|
15
|
+
typeof args[key] === 'object' && args[key]
|
|
16
|
+
? idMaker(args[key], id)
|
|
17
|
+
: `${key}-${args[key]};`;
|
|
21
18
|
}
|
|
22
19
|
return (0, _1.hashCode)(id);
|
|
23
20
|
}
|
package/util/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import PluginManager from '../PluginManager';
|
|
2
2
|
import { IAnyStateTreeNode, IStateTreeNode } from 'mobx-state-tree';
|
|
3
3
|
import { IReactionPublic, IReactionOptions } from 'mobx';
|
|
4
|
-
import
|
|
4
|
+
import { Feature } from './simpleFeature';
|
|
5
5
|
import { AssemblyManager, Region, TypeTestedByPredicate } from './types';
|
|
6
6
|
import { BaseBlock } from './blockTypes';
|
|
7
7
|
export * from './types';
|
|
@@ -9,8 +9,6 @@ export * from './aborting';
|
|
|
9
9
|
export * from './when';
|
|
10
10
|
export * from './range';
|
|
11
11
|
export * from './dedupe';
|
|
12
|
-
export { SimpleFeature, isFeature };
|
|
13
|
-
export type { Feature, SimpleFeatureSerialized };
|
|
14
12
|
export * from './offscreenCanvasPonyfill';
|
|
15
13
|
export * from './offscreenCanvasUtils';
|
|
16
14
|
export declare const inDevelopment: boolean;
|
|
@@ -286,7 +284,7 @@ export declare const defaultCodonTable: {
|
|
|
286
284
|
export declare function generateCodonTable(table: any): {
|
|
287
285
|
[key: string]: string;
|
|
288
286
|
};
|
|
289
|
-
export declare function updateStatus<U>(msg: string, cb: (arg: string) => void, fn: () => U): Promise<U>;
|
|
287
|
+
export declare function updateStatus<U>(msg: string, cb: (arg: string) => void, fn: () => U | Promise<U>): Promise<U>;
|
|
290
288
|
export declare function hashCode(str: string): number;
|
|
291
289
|
export declare function objectHash(obj: Record<string, any>): string;
|
|
292
290
|
interface VirtualOffset {
|
|
@@ -324,8 +322,8 @@ export declare function getTickDisplayStr(totalBp: number, bpPerPx: number): str
|
|
|
324
322
|
export declare function getViewParams(model: IAnyStateTreeNode, exportSVG?: boolean): {
|
|
325
323
|
offsetPx: number;
|
|
326
324
|
offsetPx1: number;
|
|
327
|
-
start:
|
|
328
|
-
end:
|
|
325
|
+
start: number;
|
|
326
|
+
end: number;
|
|
329
327
|
};
|
|
330
328
|
export declare function getLayoutId({ sessionId, layoutId, }: {
|
|
331
329
|
sessionId: string;
|
|
@@ -337,7 +335,7 @@ export declare function getUriLink(value: {
|
|
|
337
335
|
baseUri?: string;
|
|
338
336
|
}): string;
|
|
339
337
|
export declare function getStr(obj: unknown): string;
|
|
340
|
-
export declare function measureGridWidth(elements:
|
|
338
|
+
export declare function measureGridWidth(elements: unknown[], args?: {
|
|
341
339
|
minWidth?: number;
|
|
342
340
|
fontSize?: number;
|
|
343
341
|
maxWidth?: number;
|
|
@@ -348,7 +346,9 @@ export declare function getEnv(obj: any): {
|
|
|
348
346
|
pluginManager: PluginManager;
|
|
349
347
|
};
|
|
350
348
|
export declare function localStorageGetItem(item: string): string | null | undefined;
|
|
351
|
-
export declare function
|
|
352
|
-
export declare function
|
|
349
|
+
export declare function localStorageSetItem(str: string, item: string): void;
|
|
350
|
+
export declare function max(arr: number[], init?: number): number;
|
|
351
|
+
export declare function min(arr: number[], init?: number): number;
|
|
353
352
|
export declare function sum(arr: number[]): number;
|
|
354
353
|
export declare function avg(arr: number[]): number;
|
|
354
|
+
export { default as SimpleFeature, type Feature, type SimpleFeatureSerialized, isFeature, } from './simpleFeature';
|
package/util/index.js
CHANGED
|
@@ -10,18 +10,6 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
|
|
|
10
10
|
if (k2 === undefined) k2 = k;
|
|
11
11
|
o[k2] = m[k];
|
|
12
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;
|
|
17
|
-
});
|
|
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;
|
|
24
|
-
};
|
|
25
13
|
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
26
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
27
15
|
};
|
|
@@ -29,16 +17,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
29
17
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
30
18
|
};
|
|
31
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
-
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.reverse = exports.revcom = exports.isElectron = exports.stringify = exports.shorten = 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.assembleLocStringFast = exports.assembleLocString = exports.getContainingDisplay = exports.getContainingTrack = exports.getContainingView = exports.getSession = exports.findParentThatIs = exports.springAnimate = exports.findParentThat = exports.useDebouncedCallback = exports.useDebounce = exports.inProduction = exports.inDevelopment =
|
|
33
|
-
exports.avg = exports.sum = exports.min = exports.max = exports.localStorageGetItem = exports.getEnv = exports.measureGridWidth = exports.getStr = exports.getUriLink = exports.useLocalStorage = exports.getLayoutId = exports.getViewParams = exports.getTickDisplayStr = exports.toLocale =
|
|
20
|
+
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.reverse = exports.revcom = exports.isElectron = exports.stringify = exports.shorten = 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.assembleLocStringFast = exports.assembleLocString = exports.getContainingDisplay = exports.getContainingTrack = exports.getContainingView = exports.getSession = exports.findParentThatIs = exports.springAnimate = exports.findParentThat = exports.useDebouncedCallback = exports.useDebounce = exports.inProduction = exports.inDevelopment = void 0;
|
|
21
|
+
exports.isFeature = exports.SimpleFeature = exports.avg = exports.sum = exports.min = exports.max = exports.localStorageSetItem = exports.localStorageGetItem = exports.getEnv = exports.measureGridWidth = exports.getStr = exports.getUriLink = exports.useLocalStorage = exports.getLayoutId = exports.getViewParams = exports.getTickDisplayStr = exports.toLocale = void 0;
|
|
34
22
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
35
23
|
const react_1 = require("react");
|
|
36
24
|
const is_object_1 = __importDefault(require("is-object"));
|
|
37
25
|
const mobx_state_tree_1 = require("mobx-state-tree");
|
|
38
26
|
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
27
|
const types_1 = require("./types");
|
|
43
28
|
const aborting_1 = require("./aborting");
|
|
44
29
|
const types_2 = require("./types");
|
|
@@ -278,12 +263,12 @@ function parseLocStringOneBased(locString, isValidRefName) {
|
|
|
278
263
|
let reversed = false;
|
|
279
264
|
if (locString.endsWith('[rev]')) {
|
|
280
265
|
reversed = true;
|
|
281
|
-
locString = locString.replace(/\[rev
|
|
266
|
+
locString = locString.replace(/\[rev]$/, '');
|
|
282
267
|
}
|
|
283
268
|
// remove any whitespace
|
|
284
269
|
locString = locString.replace(/\s/, '');
|
|
285
270
|
// refNames can have colons, ref https://samtools.github.io/hts-specs/SAMv1.pdf Appendix A
|
|
286
|
-
const assemblyMatch = locString.match(/(
|
|
271
|
+
const assemblyMatch = locString.match(/({(.+)})?(.+)/);
|
|
287
272
|
if (!assemblyMatch) {
|
|
288
273
|
throw new Error(`invalid location string: "${locString}"`);
|
|
289
274
|
}
|
|
@@ -465,8 +450,8 @@ function bpToPx(bp, { reversed, end = 0, start = 0, }, bpPerPx) {
|
|
|
465
450
|
return roundToNearestPointOne((reversed ? end - bp : bp - start) / bpPerPx);
|
|
466
451
|
}
|
|
467
452
|
exports.bpToPx = bpToPx;
|
|
468
|
-
const oneEightyOverPi = 180
|
|
469
|
-
const piOverOneEighty = Math.PI / 180
|
|
453
|
+
const oneEightyOverPi = 180 / Math.PI;
|
|
454
|
+
const piOverOneEighty = Math.PI / 180;
|
|
470
455
|
function radToDeg(radians) {
|
|
471
456
|
return (radians * oneEightyOverPi) % 360;
|
|
472
457
|
}
|
|
@@ -505,7 +490,7 @@ function bpSpanPx(leftBp, rightBp, region, bpPerPx) {
|
|
|
505
490
|
exports.bpSpanPx = bpSpanPx;
|
|
506
491
|
// do an array map of an iterable
|
|
507
492
|
function iterMap(iter, func, sizeHint) {
|
|
508
|
-
const results = sizeHint
|
|
493
|
+
const results = Array.from({ length: sizeHint || 0 });
|
|
509
494
|
let counter = 0;
|
|
510
495
|
for (const item of iter) {
|
|
511
496
|
results[counter] = func(item);
|
|
@@ -552,7 +537,7 @@ exports.findLastIndex = findLastIndex;
|
|
|
552
537
|
* @param errorFunction -
|
|
553
538
|
*/
|
|
554
539
|
function makeAbortableReaction(self, dataFunction, asyncReactionFunction,
|
|
555
|
-
// @ts-
|
|
540
|
+
// @ts-expect-error
|
|
556
541
|
reactionOptions, startedFunction, successFunction, errorFunction) {
|
|
557
542
|
let inProgress;
|
|
558
543
|
function handleError(error) {
|
|
@@ -585,7 +570,7 @@ reactionOptions, startedFunction, successFunction, errorFunction) {
|
|
|
585
570
|
startedFunction(thisInProgress);
|
|
586
571
|
try {
|
|
587
572
|
const result = await asyncReactionFunction(data, thisInProgress.signal, self,
|
|
588
|
-
// @ts-
|
|
573
|
+
// @ts-expect-error
|
|
589
574
|
mobxReactionHandle);
|
|
590
575
|
(0, aborting_1.checkAbortSignal)(thisInProgress.signal);
|
|
591
576
|
if ((0, mobx_state_tree_1.isAlive)(self)) {
|
|
@@ -610,15 +595,12 @@ function renameRegionIfNeeded(refNameMap, region) {
|
|
|
610
595
|
if ((0, mobx_state_tree_1.isStateTreeNode)(region) && !(0, mobx_state_tree_1.isAlive)(region)) {
|
|
611
596
|
return region;
|
|
612
597
|
}
|
|
613
|
-
if (region && refNameMap
|
|
598
|
+
if (region && (refNameMap === null || refNameMap === void 0 ? void 0 : refNameMap[region.refName])) {
|
|
614
599
|
// clone the region so we don't modify it
|
|
615
|
-
|
|
616
|
-
// @ts-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
else {
|
|
620
|
-
region = { ...region };
|
|
621
|
-
}
|
|
600
|
+
region = (0, mobx_state_tree_1.isStateTreeNode)(region)
|
|
601
|
+
? // @ts-expect-error
|
|
602
|
+
{ ...(0, mobx_state_tree_1.getSnapshot)(region) }
|
|
603
|
+
: { ...region };
|
|
622
604
|
// modify it directly in the container
|
|
623
605
|
const newRef = refNameMap[region.refName];
|
|
624
606
|
if (newRef) {
|
|
@@ -741,11 +723,9 @@ exports.blobToDataURL = blobToDataURL;
|
|
|
741
723
|
// otherwise listens for prerendered_canvas but reads empty pixels, and doesn't
|
|
742
724
|
// get the contents of the canvas
|
|
743
725
|
exports.rIC = typeof jest === 'undefined'
|
|
744
|
-
?
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
window.requestIdleCallback
|
|
748
|
-
: (cb) => setTimeout(() => cb(), 1)
|
|
726
|
+
? typeof window !== 'undefined' && window.requestIdleCallback
|
|
727
|
+
? window.requestIdleCallback
|
|
728
|
+
: (cb) => setTimeout(() => cb(), 1)
|
|
749
729
|
: (cb) => cb();
|
|
750
730
|
// prettier-ignore
|
|
751
731
|
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];
|
|
@@ -910,10 +890,10 @@ exports.supportedIndexingAdapters = supportedIndexingAdapters;
|
|
|
910
890
|
function getBpDisplayStr(totalBp) {
|
|
911
891
|
let str;
|
|
912
892
|
if (Math.floor(totalBp / 1000000) > 0) {
|
|
913
|
-
str = `${parseFloat((totalBp / 1000000).toPrecision(3))}Mbp`;
|
|
893
|
+
str = `${Number.parseFloat((totalBp / 1000000).toPrecision(3))}Mbp`;
|
|
914
894
|
}
|
|
915
895
|
else if (Math.floor(totalBp / 1000) > 0) {
|
|
916
|
-
str = `${parseFloat((totalBp / 1000).toPrecision(3))}Kbp`;
|
|
896
|
+
str = `${Number.parseFloat((totalBp / 1000).toPrecision(3))}Kbp`;
|
|
917
897
|
}
|
|
918
898
|
else {
|
|
919
899
|
str = `${toLocale(Math.floor(totalBp))}bp`;
|
|
@@ -926,18 +906,12 @@ function toLocale(n) {
|
|
|
926
906
|
}
|
|
927
907
|
exports.toLocale = toLocale;
|
|
928
908
|
function getTickDisplayStr(totalBp, bpPerPx) {
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
}
|
|
933
|
-
else {
|
|
934
|
-
str = `${toLocale(Math.floor(totalBp))}`;
|
|
935
|
-
}
|
|
936
|
-
return str;
|
|
909
|
+
return Math.floor(bpPerPx / 1000) > 0
|
|
910
|
+
? `${toLocale(Number.parseFloat((totalBp / 1000000).toFixed(2)))}M`
|
|
911
|
+
: `${toLocale(Math.floor(totalBp))}`;
|
|
937
912
|
}
|
|
938
913
|
exports.getTickDisplayStr = getTickDisplayStr;
|
|
939
914
|
function getViewParams(model, exportSVG) {
|
|
940
|
-
// @ts-ignore
|
|
941
915
|
const { dynamicBlocks, staticBlocks, offsetPx } = getContainingView(model);
|
|
942
916
|
const b = (dynamicBlocks === null || dynamicBlocks === void 0 ? void 0 : dynamicBlocks.contentBlocks[0]) || {};
|
|
943
917
|
const staticblock = (staticBlocks === null || staticBlocks === void 0 ? void 0 : staticBlocks.contentBlocks[0]) || {};
|
|
@@ -1028,16 +1002,22 @@ function localStorageGetItem(item) {
|
|
|
1028
1002
|
: undefined;
|
|
1029
1003
|
}
|
|
1030
1004
|
exports.localStorageGetItem = localStorageGetItem;
|
|
1031
|
-
function
|
|
1032
|
-
|
|
1005
|
+
function localStorageSetItem(str, item) {
|
|
1006
|
+
return typeof localStorage !== 'undefined'
|
|
1007
|
+
? localStorage.setItem(str, item)
|
|
1008
|
+
: undefined;
|
|
1009
|
+
}
|
|
1010
|
+
exports.localStorageSetItem = localStorageSetItem;
|
|
1011
|
+
function max(arr, init = -Infinity) {
|
|
1012
|
+
let max = init;
|
|
1033
1013
|
for (let i = 0; i < arr.length; i++) {
|
|
1034
1014
|
max = arr[i] > max ? arr[i] : max;
|
|
1035
1015
|
}
|
|
1036
1016
|
return max;
|
|
1037
1017
|
}
|
|
1038
1018
|
exports.max = max;
|
|
1039
|
-
function min(arr) {
|
|
1040
|
-
let min =
|
|
1019
|
+
function min(arr, init = Infinity) {
|
|
1020
|
+
let min = init;
|
|
1041
1021
|
for (let i = 0; i < arr.length; i++) {
|
|
1042
1022
|
min = arr[i] < min ? arr[i] : min;
|
|
1043
1023
|
}
|
|
@@ -1056,3 +1036,6 @@ function avg(arr) {
|
|
|
1056
1036
|
return sum(arr) / arr.length;
|
|
1057
1037
|
}
|
|
1058
1038
|
exports.avg = avg;
|
|
1039
|
+
var simpleFeature_1 = require("./simpleFeature");
|
|
1040
|
+
Object.defineProperty(exports, "SimpleFeature", { enumerable: true, get: function () { return __importDefault(simpleFeature_1).default; } });
|
|
1041
|
+
Object.defineProperty(exports, "isFeature", { enumerable: true, get: function () { return simpleFeature_1.isFeature; } });
|
|
@@ -50,8 +50,8 @@ class RemoteFileWithRangeCache extends generic_filehandle_1.RemoteFile {
|
|
|
50
50
|
const rangeParse = /bytes=(\d+)-(\d+)/.exec(range);
|
|
51
51
|
if (rangeParse) {
|
|
52
52
|
const [, start, end] = rangeParse;
|
|
53
|
-
const s = parseInt(start, 10);
|
|
54
|
-
const e = parseInt(end, 10);
|
|
53
|
+
const s = Number.parseInt(start, 10);
|
|
54
|
+
const e = Number.parseInt(end, 10);
|
|
55
55
|
const response = (await globalRangeCache.getRange(url, s, e - s + 1, {
|
|
56
56
|
signal: init && init.signal,
|
|
57
57
|
}));
|
package/util/io/index.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { GenericFilehandle, Fetcher } from 'generic-filehandle';
|
|
2
|
-
import { RemoteFileWithRangeCache } from './RemoteFileWithRangeCache';
|
|
3
2
|
import { FileLocation } from '../types';
|
|
4
3
|
import PluginManager from '../../PluginManager';
|
|
5
|
-
export { RemoteFileWithRangeCache };
|
|
6
4
|
export declare function openLocation(location: FileLocation, pluginManager?: PluginManager): GenericFilehandle;
|
|
7
5
|
export declare function getFetcher(location: FileLocation, pluginManager?: PluginManager): Fetcher;
|
|
6
|
+
export { RemoteFileWithRangeCache } from './RemoteFileWithRangeCache';
|
package/util/io/index.js
CHANGED
|
@@ -3,12 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.RemoteFileWithRangeCache = exports.getFetcher = exports.openLocation = void 0;
|
|
7
7
|
const generic_filehandle_1 = require("generic-filehandle");
|
|
8
8
|
const detect_node_1 = __importDefault(require("detect-node"));
|
|
9
9
|
// locals
|
|
10
10
|
const RemoteFileWithRangeCache_1 = require("./RemoteFileWithRangeCache");
|
|
11
|
-
Object.defineProperty(exports, "RemoteFileWithRangeCache", { enumerable: true, get: function () { return RemoteFileWithRangeCache_1.RemoteFileWithRangeCache; } });
|
|
12
11
|
const types_1 = require("../types");
|
|
13
12
|
const tracks_1 = require("../tracks");
|
|
14
13
|
const __1 = require("../");
|
|
@@ -105,10 +104,11 @@ function getInternetAccount(location, pluginManager) {
|
|
|
105
104
|
async function checkAuthNeededFetch(url, opts) {
|
|
106
105
|
var _a;
|
|
107
106
|
const response = await fetch(url, opts);
|
|
108
|
-
if (response.status === 401
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
107
|
+
if (response.status === 401 &&
|
|
108
|
+
((_a = response.headers.get('WWW-Authenticate')) === null || _a === void 0 ? void 0 : _a.includes('Basic'))) {
|
|
109
|
+
throw new types_1.AuthNeededError('Accessing HTTPBasic resource without authentication', url.toString());
|
|
112
110
|
}
|
|
113
111
|
return response;
|
|
114
112
|
}
|
|
113
|
+
var RemoteFileWithRangeCache_2 = require("./RemoteFileWithRangeCache");
|
|
114
|
+
Object.defineProperty(exports, "RemoteFileWithRangeCache", { enumerable: true, get: function () { return RemoteFileWithRangeCache_2.RemoteFileWithRangeCache; } });
|
package/util/jexl.js
CHANGED
|
@@ -45,7 +45,9 @@ function default_1( /* config?: any*/) {
|
|
|
45
45
|
j.addFunction('replaceAll', (s, match, sub) => s.replaceAll(match, sub));
|
|
46
46
|
j.addFunction('slice', (s, start, end) => s.slice(start, end));
|
|
47
47
|
j.addFunction('startsWith', (s, search, pos) => s.startsWith(search, pos));
|
|
48
|
-
j.addFunction('substring', (s, start, end) =>
|
|
48
|
+
j.addFunction('substring', (s, start, end) =>
|
|
49
|
+
// eslint-disable-next-line unicorn/prefer-string-slice
|
|
50
|
+
s.substring(start, end));
|
|
49
51
|
j.addFunction('toLowerCase', (s) => s.toLowerCase());
|
|
50
52
|
j.addFunction('toUpperCase', (s) => s.toUpperCase());
|
|
51
53
|
j.addFunction('trim', (s) => s.trim());
|
|
@@ -64,7 +64,7 @@ class LayoutRow {
|
|
|
64
64
|
offset: left - rectWidth,
|
|
65
65
|
min: left,
|
|
66
66
|
max: right,
|
|
67
|
-
bits:
|
|
67
|
+
bits: Array.from({ length: 3 * rectWidth }),
|
|
68
68
|
};
|
|
69
69
|
}
|
|
70
70
|
addRect(rect, data) {
|
|
@@ -85,7 +85,10 @@ class LayoutRow {
|
|
|
85
85
|
this.rowState = this.initialize(left, right);
|
|
86
86
|
}
|
|
87
87
|
else if (additionalLength > 0) {
|
|
88
|
-
this.rowState.bits =
|
|
88
|
+
this.rowState.bits = [
|
|
89
|
+
...this.rowState.bits,
|
|
90
|
+
...Array.from({ length: additionalLength }),
|
|
91
|
+
];
|
|
89
92
|
}
|
|
90
93
|
}
|
|
91
94
|
// expand leftward if necessary
|
|
@@ -97,7 +100,10 @@ class LayoutRow {
|
|
|
97
100
|
this.rowState = this.initialize(left, right);
|
|
98
101
|
}
|
|
99
102
|
else {
|
|
100
|
-
this.rowState.bits =
|
|
103
|
+
this.rowState.bits = [
|
|
104
|
+
...Array.from({ length: additionalLength }),
|
|
105
|
+
...this.rowState.bits,
|
|
106
|
+
];
|
|
101
107
|
this.rowState.offset -= additionalLength;
|
|
102
108
|
}
|
|
103
109
|
}
|
|
@@ -370,7 +376,7 @@ class GranularRectLayout {
|
|
|
370
376
|
return this.getTotalHeight();
|
|
371
377
|
}
|
|
372
378
|
getRectangles() {
|
|
373
|
-
return new Map(
|
|
379
|
+
return new Map([...this.rectangles.entries()].map(([id, rect]) => {
|
|
374
380
|
const { l, r, originalHeight, top } = rect;
|
|
375
381
|
const t = (top || 0) * this.pitchY;
|
|
376
382
|
const b = t + originalHeight;
|
|
@@ -32,13 +32,9 @@ class SceneGraph {
|
|
|
32
32
|
addChild(nameOrSceneGraph, left, top, width, height,
|
|
33
33
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
34
34
|
data) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
child = new SceneGraph(nameOrSceneGraph, left, top, width, height, data);
|
|
41
|
-
}
|
|
35
|
+
const child = nameOrSceneGraph instanceof SceneGraph
|
|
36
|
+
? nameOrSceneGraph
|
|
37
|
+
: new SceneGraph(nameOrSceneGraph, left, top, width, height, data);
|
|
42
38
|
if (!(child instanceof SceneGraph)) {
|
|
43
39
|
throw new TypeError('argument to addChild must be an array or a SceneGraph');
|
|
44
40
|
}
|