@jbrowse/core 2.1.4 → 2.1.6

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 (65) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail.d.ts +4 -3
  2. package/BaseFeatureWidget/BaseFeatureDetail.js +16 -17
  3. package/BaseFeatureWidget/SequenceBox.d.ts +29 -0
  4. package/BaseFeatureWidget/SequenceBox.js +61 -0
  5. package/BaseFeatureWidget/SequenceFeatureDetails.d.ts +2 -8
  6. package/BaseFeatureWidget/SequenceFeatureDetails.js +123 -135
  7. package/BaseFeatureWidget/SequenceFeatureSettingsDialog.d.ts +9 -0
  8. package/BaseFeatureWidget/SequenceFeatureSettingsDialog.js +71 -0
  9. package/BaseFeatureWidget/SequenceHelpDialog.d.ts +4 -0
  10. package/BaseFeatureWidget/SequenceHelpDialog.js +51 -0
  11. package/BaseFeatureWidget/SequencePanel.d.ts +10 -0
  12. package/BaseFeatureWidget/SequencePanel.js +72 -0
  13. package/BaseFeatureWidget/index.d.ts +7 -0
  14. package/BaseFeatureWidget/index.js +21 -5
  15. package/BaseFeatureWidget/test_data/DLGAP3.d.ts +80 -0
  16. package/BaseFeatureWidget/test_data/DLGAP3.js +585 -0
  17. package/BaseFeatureWidget/test_data/NCDN.d.ts +141 -0
  18. package/BaseFeatureWidget/test_data/NCDN.js +1118 -0
  19. package/BaseFeatureWidget/types.d.ts +2 -2
  20. package/BaseFeatureWidget/util.d.ts +13 -2
  21. package/BaseFeatureWidget/util.js +13 -1
  22. package/PluginLoader.d.ts +29 -13
  23. package/PluginLoader.js +47 -77
  24. package/PluginManager.d.ts +4 -3
  25. package/PluginManager.js +16 -8
  26. package/assemblyManager/assembly.d.ts +8 -15
  27. package/assemblyManager/assembly.js +14 -17
  28. package/assemblyManager/assemblyManager.d.ts +37 -86
  29. package/assemblyManager/assemblyManager.js +2 -1
  30. package/configuration/configurationSlot.js +2 -1
  31. package/data_adapters/CytobandAdapter.js +1 -1
  32. package/package.json +3 -3
  33. package/pluggableElementTypes/ViewType.d.ts +2 -0
  34. package/pluggableElementTypes/ViewType.js +1 -0
  35. package/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +7 -5
  36. package/pluggableElementTypes/models/BaseConnectionModelFactory.js +3 -2
  37. package/pluggableElementTypes/models/BaseDisplayModel.d.ts +1 -1
  38. package/pluggableElementTypes/models/BaseDisplayModel.js +3 -2
  39. package/pluggableElementTypes/models/BaseTrackModel.d.ts +1 -1
  40. package/pluggableElementTypes/models/BaseTrackModel.js +1 -1
  41. package/pluggableElementTypes/models/baseTrackConfig.js +16 -4
  42. package/rpc/RpcManager.d.ts +1 -1
  43. package/rpc/RpcManager.js +4 -1
  44. package/rpc/WebWorkerRpcDriver.d.ts +2 -0
  45. package/rpc/WebWorkerRpcDriver.js +21 -11
  46. package/rpc/configSchema.js +4 -1
  47. package/tsconfig.build.tsbuildinfo +1 -1
  48. package/ui/AboutDialog.d.ts +6 -0
  49. package/ui/AboutDialog.js +42 -20
  50. package/ui/App.d.ts +1 -1
  51. package/ui/App.js +49 -42
  52. package/ui/DrawerWidget.js +11 -6
  53. package/ui/FatalErrorDialog.d.ts +6 -22
  54. package/ui/FatalErrorDialog.js +10 -29
  55. package/ui/theme.d.ts +18 -171
  56. package/ui/theme.js +17 -20
  57. package/util/calculateStaticBlocks.js +3 -8
  58. package/util/index.d.ts +5 -1
  59. package/util/index.js +34 -11
  60. package/util/simpleFeature.d.ts +1 -2
  61. package/util/stats.js +7 -5
  62. package/util/tracks.d.ts +5 -2
  63. package/util/tracks.js +15 -5
  64. package/util/types/index.d.ts +1 -1
  65. package/util/types/index.js +3 -1
package/ui/theme.js CHANGED
@@ -3,7 +3,7 @@ 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.createJBrowseTheme = exports.jbrowseBaseTheme = exports.createJBrowseDefaultOverrides = exports.createJBrowseDefaultProps = exports.jbrowseDefaultPalette = void 0;
6
+ exports.createJBrowseTheme = exports.createJBrowseBaseTheme = exports.createJBrowseDefaultOverrides = exports.createJBrowseDefaultProps = exports.jbrowseDefaultPalette = void 0;
7
7
  const colors_1 = require("@mui/material/colors");
8
8
  const styles_1 = require("@mui/material/styles");
9
9
  const deepmerge_1 = __importDefault(require("deepmerge"));
@@ -168,38 +168,35 @@ function createJBrowseDefaultOverrides(palette = {}) {
168
168
  };
169
169
  }
170
170
  exports.createJBrowseDefaultOverrides = createJBrowseDefaultOverrides;
171
- exports.jbrowseBaseTheme = {
172
- palette: exports.jbrowseDefaultPalette,
173
- typography: { fontSize: 12 },
174
- spacing: 4,
175
- ...(0, deepmerge_1.default)(createJBrowseDefaultProps(), createJBrowseDefaultOverrides()),
176
- };
177
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
171
+ function createJBrowseBaseTheme(palette) {
172
+ return {
173
+ palette: exports.jbrowseDefaultPalette,
174
+ typography: { fontSize: 12 },
175
+ spacing: 4,
176
+ ...(0, deepmerge_1.default)(createJBrowseDefaultProps(), createJBrowseDefaultOverrides(palette)),
177
+ };
178
+ }
179
+ exports.createJBrowseBaseTheme = createJBrowseBaseTheme;
178
180
  function createJBrowseTheme(theme) {
179
- var _a, _b, _c, _d;
181
+ var _a, _b;
180
182
  if ((_a = theme === null || theme === void 0 ? void 0 : theme.palette) === null || _a === void 0 ? void 0 : _a.tertiary) {
181
183
  theme = (0, deepmerge_1.default)(theme, {
182
184
  palette: {
183
- tertiary: refTheme.palette.augmentColor(((_b = theme.palette.tertiary) === null || _b === void 0 ? void 0 : _b.color)
185
+ tertiary: refTheme.palette.augmentColor('color' in theme.palette.tertiary
184
186
  ? theme.palette.tertiary
185
- : {
186
- color: theme.palette.tertiary,
187
- }),
187
+ : { color: theme.palette.tertiary }),
188
188
  },
189
189
  });
190
190
  }
191
- if ((_c = theme === null || theme === void 0 ? void 0 : theme.palette) === null || _c === void 0 ? void 0 : _c.quaternary) {
191
+ if ((_b = theme === null || theme === void 0 ? void 0 : theme.palette) === null || _b === void 0 ? void 0 : _b.quaternary) {
192
192
  theme = (0, deepmerge_1.default)(theme, {
193
193
  palette: {
194
- quaternary: refTheme.palette.augmentColor(((_d = theme.palette.quaternary) === null || _d === void 0 ? void 0 : _d.color)
194
+ quaternary: refTheme.palette.augmentColor('color' in theme.palette.quaternary
195
195
  ? theme.palette.quaternary
196
- : {
197
- color: theme.palette.quaternary,
198
- }),
196
+ : { color: theme.palette.quaternary }),
199
197
  },
200
198
  });
201
199
  }
202
- // @ts-ignore
203
- return (0, styles_1.createTheme)((0, deepmerge_1.default)(exports.jbrowseBaseTheme, theme || {}));
200
+ return (0, styles_1.createTheme)((0, deepmerge_1.default)(createJBrowseBaseTheme(theme === null || theme === void 0 ? void 0 : theme.palette), theme || {}));
204
201
  }
205
202
  exports.createJBrowseTheme = createJBrowseTheme;
@@ -3,15 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const mobx_state_tree_1 = require("mobx-state-tree");
4
4
  const _1 = require(".");
5
5
  const blockTypes_1 = require("./blockTypes");
6
- function calculateStaticBlocks(model, padding = true, elision = true, extra = 0,
7
- // on the main thread, window.innerWidth is used because this reduces
8
- // recalculating the blocks, otherwise, model.width for cases such as
9
- // off-main-thread. also this is not a ternary because our window.innerWidth
10
- // might be undefined on off-main-thread, so instead use || model.width
11
- width = (typeof window !== 'undefined' && window.innerWidth) || model.width) {
12
- const { offsetPx, displayedRegions, bpPerPx, minimumBlockWidth, interRegionPaddingWidth, } = model;
6
+ function calculateStaticBlocks(model, padding = true, elision = true, extra = 0, width = 800) {
7
+ const { offsetPx, displayedRegions, bpPerPx, minimumBlockWidth, interRegionPaddingWidth, width: modelWidth, } = model;
13
8
  const windowLeftBp = offsetPx * bpPerPx;
14
- const windowRightBp = (offsetPx + width) * bpPerPx;
9
+ const windowRightBp = (offsetPx + modelWidth) * bpPerPx;
15
10
  const blockSizePx = width;
16
11
  const blockSizeBp = Math.ceil(blockSizePx * bpPerPx);
17
12
  // for each displayed region
package/util/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import PluginManager from '../PluginManager';
1
2
  import { IAnyStateTreeNode, IStateTreeNode } from 'mobx-state-tree';
2
3
  import { IReactionPublic, IReactionOptions } from 'mobx';
3
4
  import SimpleFeature, { Feature, isFeature } from './simpleFeature';
@@ -327,10 +328,13 @@ export declare function getLayoutId({ sessionId, layoutId, }: {
327
328
  sessionId: string;
328
329
  layoutId: string;
329
330
  }): string;
330
- export declare const useLocalStorage: (key: string, defaultValue?: string) => [string, (arg: string) => void];
331
+ export declare function useLocalStorage<T>(key: string, initialValue: T): readonly [T, (value: T | ((val: T) => T)) => void];
331
332
  export declare function getUriLink(value: {
332
333
  uri: string;
333
334
  baseUri?: string;
334
335
  }): string;
335
336
  export declare function getStr(obj: unknown): string;
336
337
  export declare function measureGridWidth(elements: string[]): number;
338
+ export declare function getEnv(obj: any): {
339
+ pluginManager: PluginManager;
340
+ };
package/util/index.js CHANGED
@@ -30,7 +30,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
30
30
  };
31
31
  Object.defineProperty(exports, "__esModule", { value: true });
32
32
  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.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 = exports.toLocale = void 0;
33
+ exports.getEnv = exports.measureGridWidth = exports.getStr = exports.getUriLink = exports.useLocalStorage = exports.getLayoutId = exports.getViewParams = exports.getTickDisplayStr = exports.toLocale = void 0;
34
34
  /* eslint-disable @typescript-eslint/no-explicit-any */
35
35
  const react_1 = require("react");
36
36
  const is_object_1 = __importDefault(require("is-object"));
@@ -941,16 +941,35 @@ function getLayoutId({ sessionId, layoutId, }) {
941
941
  return sessionId + '-' + layoutId;
942
942
  }
943
943
  exports.getLayoutId = getLayoutId;
944
- // similar to https://blog.logrocket.com/using-localstorage-react-hooks/
945
- const useLocalStorage = (key, defaultValue = '') => {
946
- const [value, setValue] = (0, react_1.useState)(() => localStorage.getItem(key) || defaultValue);
947
- (0, react_1.useEffect)(() => {
948
- localStorage.setItem(key, value);
949
- }, [key, value]);
950
- // without this cast, tsc complained that the type of setValue could be a
951
- // string or a callback
952
- return [value, setValue];
953
- };
944
+ // Hook from https://usehooks.com/useLocalStorage/
945
+ function useLocalStorage(key, initialValue) {
946
+ const [storedValue, setStoredValue] = (0, react_1.useState)(() => {
947
+ if (typeof window === 'undefined') {
948
+ return initialValue;
949
+ }
950
+ try {
951
+ const item = window.localStorage.getItem(key);
952
+ return item ? JSON.parse(item) : initialValue;
953
+ }
954
+ catch (error) {
955
+ console.error(error);
956
+ return initialValue;
957
+ }
958
+ });
959
+ const setValue = (value) => {
960
+ try {
961
+ const valueToStore = value instanceof Function ? value(storedValue) : value;
962
+ setStoredValue(valueToStore);
963
+ if (typeof window !== 'undefined') {
964
+ window.localStorage.setItem(key, JSON.stringify(valueToStore));
965
+ }
966
+ }
967
+ catch (error) {
968
+ console.error(error);
969
+ }
970
+ };
971
+ return [storedValue, setValue];
972
+ }
954
973
  exports.useLocalStorage = useLocalStorage;
955
974
  function getUriLink(value) {
956
975
  const { uri, baseUri = '' } = value;
@@ -977,3 +996,7 @@ function measureGridWidth(elements) {
977
996
  return Math.max(...elements.map(element => Math.min(Math.max(measureText(getStr(element), 14) + 50, 80), 1000)));
978
997
  }
979
998
  exports.measureGridWidth = measureGridWidth;
999
+ function getEnv(obj) {
1000
+ return (0, mobx_state_tree_1.getEnv)(obj);
1001
+ }
1002
+ exports.getEnv = getEnv;
@@ -42,7 +42,7 @@ export interface SimpleFeatureArgs {
42
42
  /** unique identifier. can also be in data.uniqueId */
43
43
  id: string | number;
44
44
  }
45
- interface SimpleFeatureSerializedNoId {
45
+ export interface SimpleFeatureSerializedNoId {
46
46
  [key: string]: unknown;
47
47
  parentId?: string;
48
48
  subfeatures?: SimpleFeatureSerializedNoId[];
@@ -94,4 +94,3 @@ export default class SimpleFeature implements Feature {
94
94
  toJSON(): SimpleFeatureSerialized;
95
95
  static fromJSON(json: SimpleFeatureSerialized): SimpleFeature;
96
96
  }
97
- export {};
package/util/stats.js CHANGED
@@ -86,11 +86,13 @@ async function scoresToStats(region, features) {
86
86
  const { start, end } = region;
87
87
  const { scoreMin, scoreMax, scoreSum, scoreSumSquares, featureCount } = await features
88
88
  .pipe((0, operators_1.reduce)((seed, f) => {
89
- const score = f.get('score');
90
- seed.scoreMax = Math.max(seed.scoreMax, f.get('summary') ? f.get('maxScore') : score);
91
- seed.scoreMin = Math.min(seed.scoreMin, f.get('summary') ? f.get('minScore') : score);
92
- seed.scoreSum += score;
93
- seed.scoreSumSquares += score * score;
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;
94
96
  seed.featureCount += 1;
95
97
  return seed;
96
98
  }, {
package/util/tracks.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { IAnyStateTreeNode } from 'mobx-state-tree';
2
2
  import { PreFileLocation, FileLocation } from './types';
3
- import { AnyConfigurationModel } from '../configuration/configurationSchema';
3
+ import { AnyConfigurationModel } from '../configuration';
4
4
  export declare function getTrackAssemblyNames(track: IAnyStateTreeNode & {
5
5
  configuration: AnyConfigurationModel;
6
- }): any[];
6
+ }): string[];
7
7
  /** return the rpcSessionId of the highest parent node in the tree that has an rpcSessionId */
8
8
  export declare function getRpcSessionId(thisNode: IAnyStateTreeNode): string;
9
9
  /**
@@ -73,3 +73,6 @@ export declare function generateUnknownTrackConf(trackName: string, trackUrl: st
73
73
  category: string[] | undefined;
74
74
  trackId: string;
75
75
  };
76
+ export declare function getTrackName(conf: AnyConfigurationModel, session: {
77
+ assemblies: AnyConfigurationModel[];
78
+ }): any;
package/util/tracks.js CHANGED
@@ -1,13 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateUnknownTrackConf = exports.generateUnsupportedTrackConf = exports.guessTrackType = exports.guessAdapter = exports.getFileName = exports.makeIndexType = exports.makeIndex = exports.storeBlobLocation = exports.setBlobMap = exports.getBlobMap = exports.getBlob = exports.UNSUPPORTED = exports.UNKNOWN = exports.getParentRenderProps = exports.getRpcSessionId = exports.getTrackAssemblyNames = void 0;
3
+ exports.getTrackName = exports.generateUnknownTrackConf = exports.generateUnsupportedTrackConf = exports.guessTrackType = exports.guessAdapter = exports.getFileName = exports.makeIndexType = exports.makeIndex = exports.storeBlobLocation = exports.setBlobMap = exports.getBlobMap = exports.getBlob = exports.UNSUPPORTED = exports.UNKNOWN = exports.getParentRenderProps = exports.getRpcSessionId = exports.getTrackAssemblyNames = void 0;
4
4
  const mobx_state_tree_1 = require("mobx-state-tree");
5
5
  const index_1 = require("./index");
6
6
  const configuration_1 = require("../configuration");
7
7
  /* utility functions for use by track models and so forth */
8
8
  function getTrackAssemblyNames(track) {
9
- const trackConf = track.configuration;
10
- const trackAssemblyNames = (0, configuration_1.readConfObject)(trackConf, 'assemblyNames');
9
+ const trackAssemblyNames = (0, configuration_1.getConf)(track, 'assemblyNames');
11
10
  if (!trackAssemblyNames) {
12
11
  // Check if it's an assembly sequence track
13
12
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -126,7 +125,7 @@ function getFileName(track) {
126
125
  exports.getFileName = getFileName;
127
126
  function guessAdapter(file, index, adapterHint, model) {
128
127
  if (model) {
129
- const { pluginManager } = (0, mobx_state_tree_1.getEnv)(model);
128
+ const { pluginManager } = (0, index_1.getEnv)(model);
130
129
  const adapterGuesser = pluginManager.evaluateExtensionPoint('Core-guessAdapterForLocation', (_file, _index, _adapterHint) => {
131
130
  return undefined;
132
131
  });
@@ -144,7 +143,7 @@ function guessTrackType(adapterType, model) {
144
143
  if (model) {
145
144
  // @ts-ignore
146
145
  const session = (0, index_1.getSession)(model);
147
- const trackTypeGuesser = (0, mobx_state_tree_1.getEnv)(session).pluginManager.evaluateExtensionPoint('Core-guessTrackTypeForLocation', (_adapterName) => {
146
+ const trackTypeGuesser = (0, index_1.getEnv)(session).pluginManager.evaluateExtensionPoint('Core-guessTrackTypeForLocation', (_adapterName) => {
148
147
  return undefined;
149
148
  });
150
149
  const trackType = trackTypeGuesser(adapterType);
@@ -179,3 +178,14 @@ function generateUnknownTrackConf(trackName, trackUrl, categories) {
179
178
  return conf;
180
179
  }
181
180
  exports.generateUnknownTrackConf = generateUnknownTrackConf;
181
+ function getTrackName(conf, session) {
182
+ const trackName = (0, configuration_1.readConfObject)(conf, 'name');
183
+ if (!trackName && (0, configuration_1.readConfObject)(conf, 'type') === 'ReferenceSequenceTrack') {
184
+ const asm = session.assemblies.find(a => a.sequence === conf);
185
+ return asm
186
+ ? `Reference sequence (${(0, configuration_1.readConfObject)(asm, 'displayName') || (0, configuration_1.readConfObject)(asm, 'name')})`
187
+ : 'Reference sequence';
188
+ }
189
+ return trackName;
190
+ }
191
+ exports.getTrackName = getTrackName;
@@ -73,7 +73,7 @@ export interface AbstractSessionModel extends AbstractViewContainer {
73
73
  addWidget?: Function;
74
74
  DialogComponent?: DialogComponentType;
75
75
  DialogProps: any;
76
- queueDialog: (callback: (doneCallback: Function) => [DialogComponentType, any]) => void;
76
+ queueDialog<T extends DialogComponentType>(callback: (doneCallback: () => void) => [T, React.ComponentProps<T>]): void;
77
77
  name: string;
78
78
  id?: string;
79
79
  tracks: AnyConfigurationModel[];
@@ -36,7 +36,9 @@ function isSessionModelWithConfigEditing(thing) {
36
36
  }
37
37
  exports.isSessionModelWithConfigEditing = isSessionModelWithConfigEditing;
38
38
  function isSessionWithAddTracks(thing) {
39
- return isSessionModel(thing) && 'addTrackConf' in thing;
39
+ return (
40
+ // @ts-ignore
41
+ isSessionModel(thing) && 'addTrackConf' in thing && !thing.disableAddTracks);
40
42
  }
41
43
  exports.isSessionWithAddTracks = isSessionWithAddTracks;
42
44
  function isSessionModelWithWidgets(thing) {