@jbrowse/core 2.2.1 → 2.3.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.
Files changed (96) hide show
  1. package/BaseFeatureWidget/SequenceFeatureDetails.js +1 -0
  2. package/BaseFeatureWidget/SequenceFeatureSettingsDialog.js +2 -17
  3. package/BaseFeatureWidget/SequenceHelpDialog.js +3 -19
  4. package/PluginManager.d.ts +4 -0
  5. package/PluginManager.js +12 -0
  6. package/README.md +6 -2
  7. package/data_adapters/BaseAdapter.d.ts +1 -1
  8. package/package.json +3 -3
  9. package/pluggableElementTypes/AdapterType.d.ts +4 -4
  10. package/pluggableElementTypes/AdapterType.js +0 -1
  11. package/pluggableElementTypes/AddTrackWorkflowType.d.ts +3 -3
  12. package/pluggableElementTypes/ConnectionType.d.ts +0 -1
  13. package/pluggableElementTypes/ConnectionType.js +0 -1
  14. package/pluggableElementTypes/DisplayType.d.ts +9 -0
  15. package/pluggableElementTypes/DisplayType.js +1 -0
  16. package/pluggableElementTypes/PluggableElementBase.d.ts +3 -0
  17. package/pluggableElementTypes/PluggableElementBase.js +4 -0
  18. package/pluggableElementTypes/TextSearchAdapterType.d.ts +1 -0
  19. package/pluggableElementTypes/TrackType.d.ts +2 -1
  20. package/pluggableElementTypes/ViewType.d.ts +4 -3
  21. package/pluggableElementTypes/WidgetType.d.ts +10 -9
  22. package/pluggableElementTypes/models/BaseDisplayModel.js +1 -0
  23. package/pluggableElementTypes/models/BaseTrackModel.d.ts +19 -8
  24. package/pluggableElementTypes/models/BaseTrackModel.js +32 -26
  25. package/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +0 -3
  26. package/pluggableElementTypes/renderers/BoxRendererType.js +1 -14
  27. package/pluggableElementTypes/renderers/CircularChordRendererType.d.ts +9 -0
  28. package/pluggableElementTypes/renderers/CircularChordRendererType.js +23 -0
  29. package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.js +4 -1
  30. package/pluggableElementTypes/renderers/FeatureRendererType.d.ts +4 -4
  31. package/pluggableElementTypes/renderers/FeatureRendererType.js +11 -13
  32. package/pluggableElementTypes/renderers/RendererType.d.ts +1 -0
  33. package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.d.ts +8 -0
  34. package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.js +60 -0
  35. package/pluggableElementTypes/renderers/ServerSideRenderedContent.d.ts +2 -2
  36. package/pluggableElementTypes/renderers/ServerSideRenderedContent.js +6 -6
  37. package/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +5 -5
  38. package/pluggableElementTypes/renderers/ServerSideRendererType.js +14 -13
  39. package/rpc/BaseRpcDriver.d.ts +1 -1
  40. package/rpc/BaseRpcDriver.js +8 -18
  41. package/rpc/coreRpcMethods.d.ts +11 -99
  42. package/rpc/coreRpcMethods.js +17 -241
  43. package/rpc/methods/CoreEstimateRegionStats.d.ts +18 -0
  44. package/rpc/methods/CoreEstimateRegionStats.js +37 -0
  45. package/rpc/methods/CoreFreeResources.d.ts +12 -0
  46. package/rpc/methods/CoreFreeResources.js +35 -0
  47. package/rpc/methods/CoreGetFeatureDetails.d.ts +16 -0
  48. package/rpc/methods/CoreGetFeatureDetails.js +44 -0
  49. package/rpc/methods/CoreGetFeatures.d.ts +17 -0
  50. package/rpc/methods/CoreGetFeatures.js +44 -0
  51. package/rpc/methods/CoreGetFileInfo.d.ts +10 -0
  52. package/rpc/methods/CoreGetFileInfo.js +24 -0
  53. package/rpc/methods/CoreGetMetadata.d.ts +10 -0
  54. package/rpc/methods/CoreGetMetadata.js +24 -0
  55. package/rpc/methods/CoreGetRefNames.d.ts +10 -0
  56. package/rpc/methods/CoreGetRefNames.js +25 -0
  57. package/rpc/methods/CoreRender.d.ts +14 -0
  58. package/rpc/methods/CoreRender.js +57 -0
  59. package/rpc/methods/util.d.ts +14 -0
  60. package/rpc/methods/util.js +21 -0
  61. package/rpc/remoteAbortSignals.d.ts +3 -1
  62. package/rpc/remoteAbortSignals.js +3 -1
  63. package/tsconfig.build.tsbuildinfo +1 -1
  64. package/ui/AboutDialog.d.ts +1 -1
  65. package/ui/AboutDialog.js +8 -18
  66. package/ui/App.js +9 -77
  67. package/ui/AppLogo.d.ts +8 -0
  68. package/ui/AppLogo.js +22 -0
  69. package/ui/AppToolbar.d.ts +19 -0
  70. package/ui/AppToolbar.js +56 -0
  71. package/ui/AssemblySelector.d.ts +5 -3
  72. package/ui/AssemblySelector.js +4 -4
  73. package/ui/Dialog.d.ts +7 -0
  74. package/ui/Dialog.js +35 -0
  75. package/ui/FactoryResetDialog.js +8 -13
  76. package/ui/PrerenderedCanvas.d.ts +3 -20
  77. package/ui/PrerenderedCanvas.js +1 -19
  78. package/ui/ReturnToImportFormDialog.js +2 -17
  79. package/ui/Snackbar.js +7 -53
  80. package/ui/ViewLauncher.d.ts +18 -0
  81. package/ui/ViewLauncher.js +50 -0
  82. package/ui/index.d.ts +9 -8
  83. package/ui/index.js +19 -17
  84. package/util/Base1DUtils.js +1 -1
  85. package/util/analytics.js +3 -0
  86. package/util/dedupe.d.ts +3 -0
  87. package/util/dedupe.js +18 -0
  88. package/util/formatFastaStrings.d.ts +1 -1
  89. package/util/formatFastaStrings.js +1 -1
  90. package/util/index.d.ts +1 -0
  91. package/util/index.js +1 -0
  92. package/util/offscreenCanvasUtils.js +1 -1
  93. package/util/stats.d.ts +7 -3
  94. package/util/stats.js +33 -24
  95. package/util/tracks.d.ts +1 -1
  96. package/util/tracks.js +1 -1
@@ -0,0 +1,50 @@
1
+ "use strict";
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;
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
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const react_1 = __importStar(require("react"));
27
+ const material_1 = require("@mui/material");
28
+ const mobx_react_1 = require("mobx-react");
29
+ const mui_1 = require("tss-react/mui");
30
+ // locals
31
+ const util_1 = require("../util");
32
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
33
+ selectPaper: {
34
+ padding: theme.spacing(4),
35
+ },
36
+ }));
37
+ const ViewLauncher = (0, mobx_react_1.observer)(({ session }) => {
38
+ var _a;
39
+ const { classes } = useStyles();
40
+ const { pluginManager } = (0, util_1.getEnv)(session);
41
+ const viewTypes = pluginManager.getElementTypeRecord('view').all();
42
+ const [value, setValue] = (0, react_1.useState)((_a = viewTypes[0]) === null || _a === void 0 ? void 0 : _a.name);
43
+ return (react_1.default.createElement(material_1.Paper, { className: classes.selectPaper },
44
+ react_1.default.createElement(material_1.Typography, null, "Select a view to launch"),
45
+ react_1.default.createElement(material_1.FormControl, { style: { margin: 2 } },
46
+ react_1.default.createElement(material_1.Select, { value: value, onChange: event => setValue(event.target.value) }, viewTypes.map(({ displayName, name }) => (react_1.default.createElement(material_1.MenuItem, { key: name, value: name }, displayName))))),
47
+ react_1.default.createElement(material_1.FormControl, { style: { margin: 2 } },
48
+ react_1.default.createElement(material_1.Button, { onClick: () => session.addView(value, {}), variant: "contained", color: "primary" }, "Launch view"))));
49
+ });
50
+ exports.default = ViewLauncher;
package/ui/index.d.ts CHANGED
@@ -1,18 +1,19 @@
1
1
  export * from './theme';
2
2
  export { LogoFull, Logomark } from './Logo';
3
3
  export { default as App } from './App';
4
- export { default as ReturnToImportFormDialog } from './ReturnToImportFormDialog';
5
- export { default as ErrorMessage } from './ErrorMessage';
6
4
  export { default as AssemblySelector } from './AssemblySelector';
7
- export { default as FileSelector } from './FileSelector';
8
- export { default as PrerenderedCanvas } from './PrerenderedCanvas';
9
- export { default as ResizeHandle } from './ResizeHandle';
5
+ export { default as CascadingMenu } from './CascadingMenu';
6
+ export { default as Dialog } from './Dialog';
10
7
  export { default as EditableTypography } from './EditableTypography';
8
+ export { default as ErrorMessage } from './ErrorMessage';
11
9
  export { default as FactoryResetDialog } from './FactoryResetDialog';
12
- export { default as Tooltip } from './Tooltip';
13
10
  export { default as FatalErrorDialog } from './FatalErrorDialog';
11
+ export { default as FileSelector } from './FileSelector';
12
+ export { default as LoadingEllipses } from './LoadingEllipses';
14
13
  export { default as Menu } from './Menu';
15
- export { default as CascadingMenu } from './CascadingMenu';
14
+ export { default as PrerenderedCanvas } from './PrerenderedCanvas';
15
+ export { default as Tooltip } from './Tooltip';
16
+ export { default as ReturnToImportFormDialog } from './ReturnToImportFormDialog';
17
+ export { default as ResizeHandle } from './ResizeHandle';
16
18
  export { default as SanitizedHTML } from './SanitizedHTML';
17
- export { default as LoadingEllipses } from './LoadingEllipses';
18
19
  export * from './Menu';
package/ui/index.js CHANGED
@@ -17,39 +17,41 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.LoadingEllipses = exports.SanitizedHTML = exports.CascadingMenu = exports.Menu = exports.FatalErrorDialog = exports.Tooltip = exports.FactoryResetDialog = exports.EditableTypography = exports.ResizeHandle = exports.PrerenderedCanvas = exports.FileSelector = exports.AssemblySelector = exports.ErrorMessage = exports.ReturnToImportFormDialog = exports.App = exports.Logomark = exports.LogoFull = void 0;
20
+ exports.SanitizedHTML = exports.ResizeHandle = exports.ReturnToImportFormDialog = exports.Tooltip = exports.PrerenderedCanvas = exports.Menu = exports.LoadingEllipses = exports.FileSelector = exports.FatalErrorDialog = exports.FactoryResetDialog = exports.ErrorMessage = exports.EditableTypography = exports.Dialog = exports.CascadingMenu = exports.AssemblySelector = exports.App = exports.Logomark = exports.LogoFull = void 0;
21
21
  __exportStar(require("./theme"), exports);
22
22
  var Logo_1 = require("./Logo");
23
23
  Object.defineProperty(exports, "LogoFull", { enumerable: true, get: function () { return Logo_1.LogoFull; } });
24
24
  Object.defineProperty(exports, "Logomark", { enumerable: true, get: function () { return Logo_1.Logomark; } });
25
25
  var App_1 = require("./App");
26
26
  Object.defineProperty(exports, "App", { enumerable: true, get: function () { return __importDefault(App_1).default; } });
27
- var ReturnToImportFormDialog_1 = require("./ReturnToImportFormDialog");
28
- Object.defineProperty(exports, "ReturnToImportFormDialog", { enumerable: true, get: function () { return __importDefault(ReturnToImportFormDialog_1).default; } });
29
- var ErrorMessage_1 = require("./ErrorMessage");
30
- Object.defineProperty(exports, "ErrorMessage", { enumerable: true, get: function () { return __importDefault(ErrorMessage_1).default; } });
31
27
  var AssemblySelector_1 = require("./AssemblySelector");
32
28
  Object.defineProperty(exports, "AssemblySelector", { enumerable: true, get: function () { return __importDefault(AssemblySelector_1).default; } });
33
- var FileSelector_1 = require("./FileSelector");
34
- Object.defineProperty(exports, "FileSelector", { enumerable: true, get: function () { return __importDefault(FileSelector_1).default; } });
35
- var PrerenderedCanvas_1 = require("./PrerenderedCanvas");
36
- Object.defineProperty(exports, "PrerenderedCanvas", { enumerable: true, get: function () { return __importDefault(PrerenderedCanvas_1).default; } });
37
- var ResizeHandle_1 = require("./ResizeHandle");
38
- Object.defineProperty(exports, "ResizeHandle", { enumerable: true, get: function () { return __importDefault(ResizeHandle_1).default; } });
29
+ var CascadingMenu_1 = require("./CascadingMenu");
30
+ Object.defineProperty(exports, "CascadingMenu", { enumerable: true, get: function () { return __importDefault(CascadingMenu_1).default; } });
31
+ var Dialog_1 = require("./Dialog");
32
+ Object.defineProperty(exports, "Dialog", { enumerable: true, get: function () { return __importDefault(Dialog_1).default; } });
39
33
  var EditableTypography_1 = require("./EditableTypography");
40
34
  Object.defineProperty(exports, "EditableTypography", { enumerable: true, get: function () { return __importDefault(EditableTypography_1).default; } });
35
+ var ErrorMessage_1 = require("./ErrorMessage");
36
+ Object.defineProperty(exports, "ErrorMessage", { enumerable: true, get: function () { return __importDefault(ErrorMessage_1).default; } });
41
37
  var FactoryResetDialog_1 = require("./FactoryResetDialog");
42
38
  Object.defineProperty(exports, "FactoryResetDialog", { enumerable: true, get: function () { return __importDefault(FactoryResetDialog_1).default; } });
43
- var Tooltip_1 = require("./Tooltip");
44
- Object.defineProperty(exports, "Tooltip", { enumerable: true, get: function () { return __importDefault(Tooltip_1).default; } });
45
39
  var FatalErrorDialog_1 = require("./FatalErrorDialog");
46
40
  Object.defineProperty(exports, "FatalErrorDialog", { enumerable: true, get: function () { return __importDefault(FatalErrorDialog_1).default; } });
41
+ var FileSelector_1 = require("./FileSelector");
42
+ Object.defineProperty(exports, "FileSelector", { enumerable: true, get: function () { return __importDefault(FileSelector_1).default; } });
43
+ var LoadingEllipses_1 = require("./LoadingEllipses");
44
+ Object.defineProperty(exports, "LoadingEllipses", { enumerable: true, get: function () { return __importDefault(LoadingEllipses_1).default; } });
47
45
  var Menu_1 = require("./Menu");
48
46
  Object.defineProperty(exports, "Menu", { enumerable: true, get: function () { return __importDefault(Menu_1).default; } });
49
- var CascadingMenu_1 = require("./CascadingMenu");
50
- Object.defineProperty(exports, "CascadingMenu", { enumerable: true, get: function () { return __importDefault(CascadingMenu_1).default; } });
47
+ var PrerenderedCanvas_1 = require("./PrerenderedCanvas");
48
+ Object.defineProperty(exports, "PrerenderedCanvas", { enumerable: true, get: function () { return __importDefault(PrerenderedCanvas_1).default; } });
49
+ var Tooltip_1 = require("./Tooltip");
50
+ Object.defineProperty(exports, "Tooltip", { enumerable: true, get: function () { return __importDefault(Tooltip_1).default; } });
51
+ var ReturnToImportFormDialog_1 = require("./ReturnToImportFormDialog");
52
+ Object.defineProperty(exports, "ReturnToImportFormDialog", { enumerable: true, get: function () { return __importDefault(ReturnToImportFormDialog_1).default; } });
53
+ var ResizeHandle_1 = require("./ResizeHandle");
54
+ Object.defineProperty(exports, "ResizeHandle", { enumerable: true, get: function () { return __importDefault(ResizeHandle_1).default; } });
51
55
  var SanitizedHTML_1 = require("./SanitizedHTML");
52
56
  Object.defineProperty(exports, "SanitizedHTML", { enumerable: true, get: function () { return __importDefault(SanitizedHTML_1).default; } });
53
- var LoadingEllipses_1 = require("./LoadingEllipses");
54
- Object.defineProperty(exports, "LoadingEllipses", { enumerable: true, get: function () { return __importDefault(LoadingEllipses_1).default; } });
55
57
  __exportStar(require("./Menu"), exports);
@@ -109,7 +109,7 @@ function pxToBp(self, px) {
109
109
  bpSoFar += len;
110
110
  }
111
111
  }
112
- if (bp >= bpSoFar) {
112
+ if (bp >= bpSoFar && displayedRegions.length) {
113
113
  const region = displayedRegions[displayedRegions.length - 1];
114
114
  const len = region.end - region.start;
115
115
  const offset = bp - bpSoFar + len;
package/util/analytics.js CHANGED
@@ -89,7 +89,10 @@ exports.writeGAAnalytics = writeGAAnalytics;
89
89
  function doAnalytics(rootModel, initialTimestamp, initialSessionQuery) {
90
90
  if (rootModel &&
91
91
  !(0, configuration_1.readConfObject)(rootModel.jbrowse.configuration, 'disableAnalytics')) {
92
+ // ok if these are unhandled
93
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
92
94
  writeAWSAnalytics(rootModel, initialTimestamp, initialSessionQuery);
95
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
93
96
  writeGAAnalytics(rootModel, initialTimestamp);
94
97
  }
95
98
  }
@@ -0,0 +1,3 @@
1
+ type Hasher<T> = (input: T) => string;
2
+ export declare function dedupe<T>(list: T[], hasher?: Hasher<T>): T[];
3
+ export {};
package/util/dedupe.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dedupe = void 0;
4
+ // from https://github.com/seriousManual/dedupe/blob/master/LICENSE
5
+ function dedupe(list, hasher = JSON.stringify) {
6
+ const clone = [];
7
+ const lookup = new Set();
8
+ for (let i = 0; i < list.length; i++) {
9
+ const entry = list[i];
10
+ const hashed = hasher(entry);
11
+ if (!lookup.has(hashed)) {
12
+ clone.push(entry);
13
+ lookup.add(hashed);
14
+ }
15
+ }
16
+ return clone;
17
+ }
18
+ exports.dedupe = dedupe;
@@ -7,7 +7,7 @@ export interface SeqChunk {
7
7
  * ref https://stackoverflow.com/a/51506718/2129219
8
8
  *
9
9
  * @param seqString - string
10
- * @returns formated sequence string
10
+ * @returns formatted sequence string
11
11
  */
12
12
  export declare function formatFastaLines(seqString: string): string;
13
13
  /**
@@ -6,7 +6,7 @@ exports.formatSeqFasta = exports.formatFastaLines = void 0;
6
6
  * ref https://stackoverflow.com/a/51506718/2129219
7
7
  *
8
8
  * @param seqString - string
9
- * @returns formated sequence string
9
+ * @returns formatted sequence string
10
10
  */
11
11
  function formatFastaLines(seqString) {
12
12
  return seqString.replace(/(.{1,80})/g, '$1\n').trimEnd();
package/util/index.d.ts CHANGED
@@ -9,6 +9,7 @@ export * from './types';
9
9
  export * from './aborting';
10
10
  export * from './when';
11
11
  export * from './range';
12
+ export * from './dedupe';
12
13
  export { SimpleFeature, isFeature };
13
14
  export * from './offscreenCanvasPonyfill';
14
15
  export * from './offscreenCanvasUtils';
package/util/index.js CHANGED
@@ -46,6 +46,7 @@ __exportStar(require("./types"), exports);
46
46
  __exportStar(require("./aborting"), exports);
47
47
  __exportStar(require("./when"), exports);
48
48
  __exportStar(require("./range"), exports);
49
+ __exportStar(require("./dedupe"), exports);
49
50
  __exportStar(require("./offscreenCanvasPonyfill"), exports);
50
51
  __exportStar(require("./offscreenCanvasUtils"), exports);
51
52
  exports.inDevelopment = typeof process === 'object' &&
@@ -37,7 +37,7 @@ async function renderToAbstractCanvas(width, height, opts, cb) {
37
37
  ? await (0, index_1.blobToDataURL)(await canvas.convertToBlob({
38
38
  type: 'image/png',
39
39
  }))
40
- : canvas.toDataURL() })),
40
+ : canvas.toDataURL('image/png') })),
41
41
  };
42
42
  }
43
43
  }
package/util/stats.d.ts CHANGED
@@ -26,12 +26,15 @@ export interface FeatureStats extends UnrectifiedFeatureStats {
26
26
  */
27
27
  export declare function calcStdFromSums(sum: number, sumSquares: number, n: number, population?: boolean): number;
28
28
  /**
29
- * @param stats - a summary stats object with scoreSum, featureCount, scoreSumSquares, and basesCovered
30
- * @returns - a summary stats object with scoreMean, scoreStdDev, and featureDensity added
29
+ * @param stats - a summary stats object with scoreSum, featureCount,
30
+ * scoreSumSquares, and basesCovered
31
+ * @returns - a summary stats object with
32
+ * scoreMean, scoreStdDev, and featureDensity added
31
33
  */
32
34
  export declare function rectifyStats(s: UnrectifiedFeatureStats): FeatureStats;
33
35
  /**
34
36
  * calculates per-base scores for variable width features over a region
37
+ *
35
38
  * @param region - object contains start, end
36
39
  * @param features - list of features with start, end, score
37
40
  * @returns array of numeric scores
@@ -39,9 +42,10 @@ export declare function rectifyStats(s: UnrectifiedFeatureStats): FeatureStats;
39
42
  export declare function calcPerBaseStats(region: NoAssemblyRegion, features: Feature[]): number[];
40
43
  /**
41
44
  * transform a list of scores to summary statistics
45
+ *
42
46
  * @param region - object with start, end
43
47
  * @param features - array of features which are possibly summary features
44
48
  * @returns - object with scoreMax, scoreMin, scoreSum, scoreSumSquares, etc
45
49
  */
46
- export declare function scoresToStats(region: NoAssemblyRegion, features: Observable<Feature>): Promise<FeatureStats>;
50
+ export declare function scoresToStats(region: NoAssemblyRegion, feats: Observable<Feature>): Promise<FeatureStats>;
47
51
  export declare function blankStats(): FeatureStats;
package/util/stats.js CHANGED
@@ -31,8 +31,10 @@ function calcStdFromSums(sum, sumSquares, n, population = false) {
31
31
  }
32
32
  exports.calcStdFromSums = calcStdFromSums;
33
33
  /**
34
- * @param stats - a summary stats object with scoreSum, featureCount, scoreSumSquares, and basesCovered
35
- * @returns - a summary stats object with scoreMean, scoreStdDev, and featureDensity added
34
+ * @param stats - a summary stats object with scoreSum, featureCount,
35
+ * scoreSumSquares, and basesCovered
36
+ * @returns - a summary stats object with
37
+ * scoreMean, scoreStdDev, and featureDensity added
36
38
  */
37
39
  function rectifyStats(s) {
38
40
  return {
@@ -45,6 +47,7 @@ function rectifyStats(s) {
45
47
  exports.rectifyStats = rectifyStats;
46
48
  /**
47
49
  * calculates per-base scores for variable width features over a region
50
+ *
48
51
  * @param region - object contains start, end
49
52
  * @param features - list of features with start, end, score
50
53
  * @returns array of numeric scores
@@ -78,39 +81,45 @@ function calcPerBaseStats(region, features) {
78
81
  exports.calcPerBaseStats = calcPerBaseStats;
79
82
  /**
80
83
  * transform a list of scores to summary statistics
84
+ *
81
85
  * @param region - object with start, end
82
86
  * @param features - array of features which are possibly summary features
83
87
  * @returns - object with scoreMax, scoreMin, scoreSum, scoreSumSquares, etc
84
88
  */
85
- async function scoresToStats(region, features) {
89
+ async function scoresToStats(region, feats) {
86
90
  const { start, end } = region;
87
- const { scoreMin, scoreMax, scoreSum, scoreSumSquares, featureCount } = await features
88
- .pipe((0, operators_1.reduce)((seed, f) => {
89
- const s = f.get('score');
90
- const summary = f.get('summary');
91
- const { scoreMax, scoreMin } = seed;
92
- seed.scoreMax = Math.max(scoreMax, summary ? f.get('maxScore') : s);
93
- seed.scoreMin = Math.min(scoreMin, summary ? f.get('minScore') : s);
94
- seed.scoreSum += s;
95
- seed.scoreSumSquares += s * s;
96
- seed.featureCount += 1;
97
- return seed;
98
- }, {
91
+ const seed = {
99
92
  scoreMin: Number.MAX_VALUE,
100
93
  scoreMax: Number.MIN_VALUE,
101
94
  scoreSum: 0,
102
95
  scoreSumSquares: 0,
103
96
  featureCount: 0,
104
- }))
97
+ };
98
+ let found = false;
99
+ const { scoreMin, scoreMax, scoreSum, scoreSumSquares, featureCount } = await feats
100
+ .pipe((0, operators_1.reduce)((acc, f) => {
101
+ const s = f.get('score');
102
+ const summary = f.get('summary');
103
+ const { scoreMax, scoreMin } = acc;
104
+ acc.scoreMax = Math.max(scoreMax, summary ? f.get('maxScore') : s);
105
+ acc.scoreMin = Math.min(scoreMin, summary ? f.get('minScore') : s);
106
+ acc.scoreSum += s;
107
+ acc.scoreSumSquares += s * s;
108
+ acc.featureCount += 1;
109
+ found = true;
110
+ return acc;
111
+ }, seed))
105
112
  .toPromise();
106
- return rectifyStats({
107
- scoreMax,
108
- scoreMin,
109
- scoreSum,
110
- scoreSumSquares,
111
- featureCount,
112
- basesCovered: end - start + 1,
113
- });
113
+ return found
114
+ ? rectifyStats({
115
+ scoreMax,
116
+ scoreMin,
117
+ scoreSum,
118
+ scoreSumSquares,
119
+ featureCount,
120
+ basesCovered: end - start + 1,
121
+ })
122
+ : blankStats();
114
123
  }
115
124
  exports.scoresToStats = scoresToStats;
116
125
  function blankStats() {
package/util/tracks.d.ts CHANGED
@@ -31,7 +31,7 @@ export declare function storeBlobLocation(location: PreFileLocation): import("./
31
31
  * creates a new location from the provided location including the appropriate suffix and location type
32
32
  * @param location - the FileLocation
33
33
  * @param suffix - the file suffix (e.g. .bam)
34
- * @returns the constructed location object from the provided prameters
34
+ * @returns the constructed location object from the provided parameters
35
35
  */
36
36
  export declare function makeIndex(location: FileLocation, suffix: string): import("./types").BlobLocation | {
37
37
  uri: string;
package/util/tracks.js CHANGED
@@ -87,7 +87,7 @@ exports.storeBlobLocation = storeBlobLocation;
87
87
  * creates a new location from the provided location including the appropriate suffix and location type
88
88
  * @param location - the FileLocation
89
89
  * @param suffix - the file suffix (e.g. .bam)
90
- * @returns the constructed location object from the provided prameters
90
+ * @returns the constructed location object from the provided parameters
91
91
  */
92
92
  function makeIndex(location, suffix) {
93
93
  if ('uri' in location) {