@jbrowse/core 3.0.5 → 3.2.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 (35) hide show
  1. package/CorePlugin.js +2 -2
  2. package/PluginLoader.js +3 -3
  3. package/PluginManager.js +15 -14
  4. package/configuration/configurationSchema.js +2 -2
  5. package/configuration/util.js +2 -2
  6. package/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +9 -2
  7. package/data_adapters/BaseAdapter/BaseOptions.d.ts +0 -1
  8. package/data_adapters/BaseAdapter/types.d.ts +1 -1
  9. package/data_adapters/CytobandAdapter/configSchema.js +17 -2
  10. package/data_adapters/dataAdapterCache.js +4 -4
  11. package/package.json +2 -2
  12. package/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +3 -1
  13. package/pluggableElementTypes/models/BaseTrackModel.d.ts +2 -0
  14. package/pluggableElementTypes/models/BaseTrackModel.js +7 -1
  15. package/pluggableElementTypes/models/baseTrackConfig.js +2 -2
  16. package/pluggableElementTypes/renderers/BoxRendererType.js +3 -1
  17. package/pluggableElementTypes/renderers/FeatureRendererType.js +1 -0
  18. package/rpc/methods/CoreFreeResources.js +2 -2
  19. package/rpc/methods/CoreRender.js +4 -12
  20. package/tsconfig.build.tsbuildinfo +1 -1
  21. package/ui/index.d.ts +1 -0
  22. package/ui/index.js +2 -1
  23. package/ui/theme.d.ts +41 -52
  24. package/ui/theme.js +35 -38
  25. package/util/Base1DUtils.js +1 -1
  26. package/util/analytics.js +2 -2
  27. package/util/idMaker.d.ts +1 -1
  28. package/util/idMaker.js +1 -1
  29. package/util/index.d.ts +3 -1
  30. package/util/index.js +36 -10
  31. package/util/layouts/PrecomputedMultiLayout.js +2 -2
  32. package/util/map-obj.js +2 -2
  33. package/util/rxjs.d.ts +1 -1
  34. package/util/rxjs.js +3 -1
  35. package/util/stopToken.d.ts +1 -1
package/ui/index.d.ts CHANGED
@@ -14,3 +14,4 @@ export { default as PrerenderedCanvas } from './PrerenderedCanvas';
14
14
  export { default as ResizeHandle } from './ResizeHandle';
15
15
  export { default as SanitizedHTML } from './SanitizedHTML';
16
16
  export * from './Menu';
17
+ export declare const VIEW_HEADER_HEIGHT = 28;
package/ui/index.js CHANGED
@@ -17,7 +17,7 @@ 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.SanitizedHTML = exports.ResizeHandle = exports.PrerenderedCanvas = exports.Menu = exports.LoadingEllipses = exports.FileSelector = exports.FatalErrorDialog = exports.ErrorMessage = exports.EditableTypography = exports.Dialog = exports.CascadingMenuButton = exports.CascadingMenu = exports.AssemblySelector = exports.Logomark = exports.LogoFull = void 0;
20
+ exports.VIEW_HEADER_HEIGHT = exports.SanitizedHTML = exports.ResizeHandle = exports.PrerenderedCanvas = exports.Menu = exports.LoadingEllipses = exports.FileSelector = exports.FatalErrorDialog = exports.ErrorMessage = exports.EditableTypography = exports.Dialog = exports.CascadingMenuButton = exports.CascadingMenu = exports.AssemblySelector = 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; } });
@@ -49,3 +49,4 @@ Object.defineProperty(exports, "ResizeHandle", { enumerable: true, get: function
49
49
  var SanitizedHTML_1 = require("./SanitizedHTML");
50
50
  Object.defineProperty(exports, "SanitizedHTML", { enumerable: true, get: function () { return __importDefault(SanitizedHTML_1).default; } });
51
51
  __exportStar(require("./Menu"), exports);
52
+ exports.VIEW_HEADER_HEIGHT = 28;
package/ui/theme.d.ts CHANGED
@@ -1,66 +1,55 @@
1
1
  import type { ThemeOptions } from '@mui/material/styles';
2
+ import type { PaletteColor } from '@mui/material/styles/createPalette';
3
+ type MaybePaletteColor = PaletteColor | undefined;
4
+ type Frames = [
5
+ null,
6
+ MaybePaletteColor,
7
+ MaybePaletteColor,
8
+ MaybePaletteColor,
9
+ MaybePaletteColor,
10
+ MaybePaletteColor,
11
+ MaybePaletteColor
12
+ ];
2
13
  declare module '@mui/material/styles/createPalette' {
3
14
  interface Palette {
4
- tertiary: Palette['primary'];
5
- quaternary: Palette['primary'];
6
- highlight: Palette['primary'];
7
- stopCodon?: string;
8
- startCodon?: string;
15
+ tertiary: PaletteColor;
16
+ quaternary: PaletteColor;
17
+ highlight: PaletteColor;
18
+ stopCodon: string;
19
+ startCodon: string;
20
+ insertion: string;
21
+ softclip: string;
22
+ skip: string;
23
+ hardclip: string;
24
+ deletion: string;
9
25
  bases: {
10
- A: Palette['primary'];
11
- C: Palette['primary'];
12
- G: Palette['primary'];
13
- T: Palette['primary'];
26
+ A: PaletteColor;
27
+ C: PaletteColor;
28
+ G: PaletteColor;
29
+ T: PaletteColor;
14
30
  };
15
- frames: [
16
- null,
17
- Palette['primary'] | undefined,
18
- Palette['primary'] | undefined,
19
- Palette['primary'] | undefined,
20
- Palette['primary'] | undefined,
21
- Palette['primary'] | undefined,
22
- Palette['primary'] | undefined
23
- ];
24
- framesCDS: [
25
- null,
26
- Palette['primary'] | undefined,
27
- Palette['primary'] | undefined,
28
- Palette['primary'] | undefined,
29
- Palette['primary'] | undefined,
30
- Palette['primary'] | undefined,
31
- Palette['primary'] | undefined
32
- ];
31
+ frames: Frames;
32
+ framesCDS: Frames;
33
33
  }
34
34
  interface PaletteOptions {
35
- tertiary?: PaletteOptions['primary'];
36
- quaternary?: PaletteOptions['primary'];
37
- highlight?: PaletteOptions['primary'];
35
+ tertiary?: PaletteColorOptions;
36
+ quaternary?: PaletteColorOptions;
37
+ highlight?: PaletteColorOptions;
38
38
  stopCodon?: string;
39
39
  startCodon?: string;
40
+ hardclip?: string;
41
+ softclip?: string;
42
+ insertion?: string;
43
+ skip?: string;
44
+ deletion?: string;
40
45
  bases?: {
41
- A?: PaletteOptions['primary'];
42
- C?: PaletteOptions['primary'];
43
- G?: PaletteOptions['primary'];
44
- T?: PaletteOptions['primary'];
46
+ A?: PaletteColorOptions;
47
+ C?: PaletteColorOptions;
48
+ G?: PaletteColorOptions;
49
+ T?: PaletteColorOptions;
45
50
  };
46
- framesCDS?: [
47
- null,
48
- Palette['primary'] | undefined,
49
- Palette['primary'] | undefined,
50
- Palette['primary'] | undefined,
51
- Palette['primary'] | undefined,
52
- Palette['primary'] | undefined,
53
- Palette['primary'] | undefined
54
- ];
55
- frames?: [
56
- null,
57
- Palette['primary'] | undefined,
58
- Palette['primary'] | undefined,
59
- Palette['primary'] | undefined,
60
- Palette['primary'] | undefined,
61
- Palette['primary'] | undefined,
62
- Palette['primary'] | undefined
63
- ];
51
+ framesCDS?: Frames;
52
+ frames?: Frames;
64
53
  }
65
54
  }
66
55
  export declare const defaultThemes: ThemeMap;
package/ui/theme.js CHANGED
@@ -41,20 +41,33 @@ const frames = [
41
41
  ];
42
42
  const stopCodon = '#e22';
43
43
  const startCodon = '#3e3';
44
+ const insertion = '#800080';
45
+ const deletion = '#808080';
46
+ const hardclip = '#f00';
47
+ const softclip = '#00f';
48
+ const skip = '#97b8c9';
49
+ const defaults = {
50
+ quaternary: mandarin,
51
+ highlight: mandarin,
52
+ stopCodon,
53
+ startCodon,
54
+ insertion,
55
+ deletion,
56
+ softclip,
57
+ hardclip,
58
+ bases,
59
+ frames,
60
+ framesCDS,
61
+ skip,
62
+ };
44
63
  function stockTheme() {
45
64
  return {
46
65
  palette: {
66
+ ...defaults,
47
67
  mode: undefined,
48
68
  primary: { main: midnight },
49
69
  secondary: { main: grape },
50
70
  tertiary: forest,
51
- quaternary: mandarin,
52
- highlight: mandarin,
53
- stopCodon,
54
- startCodon,
55
- bases,
56
- frames,
57
- framesCDS,
58
71
  },
59
72
  components: {
60
73
  MuiLink: {
@@ -83,17 +96,8 @@ function getDarkStockTheme() {
83
96
  return {
84
97
  name: 'Dark (stock)',
85
98
  palette: {
99
+ ...defaults,
86
100
  mode: 'dark',
87
- primary: { main: midnight },
88
- secondary: { main: grape },
89
- tertiary: forest,
90
- quaternary: mandarin,
91
- highlight: mandarin,
92
- stopCodon,
93
- startCodon,
94
- bases,
95
- frames,
96
- framesCDS,
97
101
  },
98
102
  components: {
99
103
  MuiAppBar: {
@@ -101,9 +105,7 @@ function getDarkStockTheme() {
101
105
  enableColorOnDark: true,
102
106
  },
103
107
  styleOverrides: {
104
- root: ({ theme }) => {
105
- return theme.palette.primary.main;
106
- },
108
+ root: ({ theme }) => theme.palette.primary.main,
107
109
  },
108
110
  },
109
111
  },
@@ -113,17 +115,11 @@ function getDarkMinimalTheme() {
113
115
  return {
114
116
  name: 'Dark (minimal)',
115
117
  palette: {
118
+ ...defaults,
116
119
  mode: 'dark',
117
120
  primary: { main: colors_1.grey[700] },
118
121
  secondary: { main: colors_1.grey[800] },
119
122
  tertiary: refTheme.palette.augmentColor({ color: { main: colors_1.grey[900] } }),
120
- quaternary: mandarin,
121
- highlight: mandarin,
122
- stopCodon,
123
- startCodon,
124
- bases,
125
- frames,
126
- framesCDS,
127
123
  },
128
124
  };
129
125
  }
@@ -131,16 +127,10 @@ function getMinimalTheme() {
131
127
  return {
132
128
  name: 'Light (minimal)',
133
129
  palette: {
130
+ ...defaults,
134
131
  primary: { main: colors_1.grey[900] },
135
132
  secondary: { main: colors_1.grey[800] },
136
133
  tertiary: refTheme.palette.augmentColor({ color: { main: colors_1.grey[900] } }),
137
- quaternary: mandarin,
138
- highlight: mandarin,
139
- stopCodon,
140
- startCodon,
141
- bases,
142
- frames,
143
- framesCDS,
144
134
  },
145
135
  };
146
136
  }
@@ -365,12 +355,19 @@ function augmentThemeColors(theme = {}) {
365
355
  return theme;
366
356
  }
367
357
  function addMissingColors(theme = {}) {
368
- var _a, _b, _c;
358
+ const { palette } = theme;
369
359
  return augmentThemeColors((0, deepmerge_1.default)(theme, {
370
360
  palette: {
371
- quaternary: ((_a = theme.palette) === null || _a === void 0 ? void 0 : _a.quaternary) || lightgrey,
372
- tertiary: ((_b = theme.palette) === null || _b === void 0 ? void 0 : _b.tertiary) || lightgrey,
373
- highlight: ((_c = theme.palette) === null || _c === void 0 ? void 0 : _c.highlight) || mandarin,
361
+ quaternary: (palette === null || palette === void 0 ? void 0 : palette.quaternary) || lightgrey,
362
+ tertiary: (palette === null || palette === void 0 ? void 0 : palette.tertiary) || lightgrey,
363
+ highlight: (palette === null || palette === void 0 ? void 0 : palette.highlight) || mandarin,
364
+ insertion: (palette === null || palette === void 0 ? void 0 : palette.insertion) || insertion,
365
+ softclip: (palette === null || palette === void 0 ? void 0 : palette.softclip) || softclip,
366
+ skip: (palette === null || palette === void 0 ? void 0 : palette.skip) || skip,
367
+ hardclip: (palette === null || palette === void 0 ? void 0 : palette.hardclip) || hardclip,
368
+ deletion: (palette === null || palette === void 0 ? void 0 : palette.deletion) || deletion,
369
+ startCodon: (palette === null || palette === void 0 ? void 0 : palette.startCodon) || startCodon,
370
+ stopCodon: (palette === null || palette === void 0 ? void 0 : palette.stopCodon) || stopCodon,
374
371
  },
375
372
  }));
376
373
  }
@@ -44,7 +44,7 @@ function moveTo(self, start, end) {
44
44
  extraBp = ((newBpPerPx - targetBpPerPx) * self.width) / 2;
45
45
  }
46
46
  let bpToStart = -extraBp;
47
- for (let i = 0; i < self.displayedRegions.length; i += 1) {
47
+ for (let i = 0; i < self.displayedRegions.length; i++) {
48
48
  const region = self.displayedRegions[i];
49
49
  if (start.index === i) {
50
50
  bpToStart += start.offset;
package/util/analytics.js CHANGED
@@ -68,9 +68,9 @@ async function writeGAAnalytics(rootModel, initialTimestamp) {
68
68
  analyticsScript += `ga('create', '${jbrowseUser}', 'auto', 'jbrowseTracker');`;
69
69
  const gaData = {};
70
70
  const googleDimensions = 'tracks-count ver electron loadTime pluginNames';
71
- googleDimensions.split(/\s+/).forEach((key, index) => {
71
+ for (const [index, key] of googleDimensions.split(/\s+/).entries()) {
72
72
  gaData[`dimension${index + 1}`] = stats[key];
73
- });
73
+ }
74
74
  gaData.metric1 = Math.round(stats.loadTime);
75
75
  analyticsScript += `ga('jbrowseTracker.send', 'pageview',${JSON.stringify(gaData)});`;
76
76
  const analyticsScriptNode = document.createElement('script');
package/util/idMaker.d.ts CHANGED
@@ -1 +1 @@
1
- export default function idMaker(args: Record<string, unknown>, id?: string, len?: number): number;
1
+ export default function idMaker(args: Record<string, unknown>, id?: string, len?: number): string | number;
package/util/idMaker.js CHANGED
@@ -20,5 +20,5 @@ function idMaker(args, id = '', len = 5000) {
20
20
  }
21
21
  }
22
22
  }
23
- return (0, _1.hashCode)(id);
23
+ return `adp-${(0, _1.hashCode)(id)}`;
24
24
  }
package/util/index.d.ts CHANGED
@@ -192,7 +192,8 @@ export interface ViewSnap {
192
192
  })[];
193
193
  }
194
194
  export declare function isSupportedIndexingAdapter(type?: string): boolean;
195
- export declare function getBpDisplayStr(totalBp: number): string;
195
+ export declare function getBpDisplayStr(total: number): string;
196
+ export declare function getProgressDisplayStr(current: number, total: number): string;
196
197
  export declare function toLocale(n: number): string;
197
198
  export declare function getTickDisplayStr(totalBp: number, bpPerPx: number): string;
198
199
  export declare function getViewParams(model: IAnyStateTreeNode, exportSVG?: boolean): {
@@ -257,6 +258,7 @@ export declare function fetchAndMaybeUnzipText(loc: GenericFilehandle, opts?: Ba
257
258
  export declare function isObject(x: unknown): x is Record<string | symbol | number, unknown>;
258
259
  export declare function localStorageGetNumber(key: string, defaultVal: number): number;
259
260
  export declare function localStorageGetBoolean(key: string, defaultVal: boolean): boolean;
261
+ export declare function forEachWithStopTokenCheck<T>(iter: Iterable<T>, stopToken: string | undefined, arg: (arg: T) => void, durationMs?: number): void;
260
262
  export declare function testAdapter(fileName: string, regex: RegExp, adapterHint: string | undefined, expected: string): boolean;
261
263
  export { type Feature, type SimpleFeatureSerialized, type SimpleFeatureSerializedNoId, default as SimpleFeature, isFeature, } from './simpleFeature';
262
264
  export { blobToDataURL } from './blobToDataURL';
package/util/index.js CHANGED
@@ -63,6 +63,7 @@ exports.objectHash = objectHash;
63
63
  exports.bytesForRegions = bytesForRegions;
64
64
  exports.isSupportedIndexingAdapter = isSupportedIndexingAdapter;
65
65
  exports.getBpDisplayStr = getBpDisplayStr;
66
+ exports.getProgressDisplayStr = getProgressDisplayStr;
66
67
  exports.toLocale = toLocale;
67
68
  exports.getTickDisplayStr = getTickDisplayStr;
68
69
  exports.getViewParams = getViewParams;
@@ -94,6 +95,7 @@ exports.fetchAndMaybeUnzipText = fetchAndMaybeUnzipText;
94
95
  exports.isObject = isObject;
95
96
  exports.localStorageGetNumber = localStorageGetNumber;
96
97
  exports.localStorageGetBoolean = localStorageGetBoolean;
98
+ exports.forEachWithStopTokenCheck = forEachWithStopTokenCheck;
97
99
  exports.testAdapter = testAdapter;
98
100
  const react_1 = require("react");
99
101
  const bgzf_filehandle_1 = require("@gmod/bgzf-filehandle");
@@ -589,8 +591,8 @@ function reverse(str) {
589
591
  function complement(str) {
590
592
  var _a;
591
593
  let comp = '';
592
- for (let i = 0; i < str.length; i++) {
593
- comp += (_a = exports.complementTable[str[i]]) !== null && _a !== void 0 ? _a : str[i];
594
+ for (const element of str) {
595
+ comp += (_a = exports.complementTable[element]) !== null && _a !== void 0 ? _a : element;
594
596
  }
595
597
  return comp;
596
598
  }
@@ -691,7 +693,7 @@ exports.defaultCodonTable = {
691
693
  };
692
694
  function generateCodonTable(table) {
693
695
  const tempCodonTable = {};
694
- Object.keys(table).forEach(codon => {
696
+ for (const codon of Object.keys(table)) {
695
697
  const aa = table[codon];
696
698
  const nucs = [];
697
699
  for (let i = 0; i < 3; i++) {
@@ -711,7 +713,7 @@ function generateCodonTable(table) {
711
713
  }
712
714
  }
713
715
  }
714
- });
716
+ }
715
717
  return tempCodonTable;
716
718
  }
717
719
  async function updateStatus(msg, cb, fn) {
@@ -760,15 +762,29 @@ function isSupportedIndexingAdapter(type = '') {
760
762
  'VcfAdapter',
761
763
  ].includes(type);
762
764
  }
763
- function getBpDisplayStr(totalBp) {
764
- if (Math.floor(totalBp / 1000000) > 0) {
765
- return `${Number.parseFloat((totalBp / 1000000).toPrecision(3))}Mbp`;
765
+ function getBpDisplayStr(total) {
766
+ if (Math.floor(total / 1000000) > 0) {
767
+ return `${r(total / 1000000)}Mbp`;
768
+ }
769
+ else if (Math.floor(total / 1000) > 0) {
770
+ return `${r(total / 1000)}Kbp`;
771
+ }
772
+ else {
773
+ return `${Math.floor(total)}bp`;
774
+ }
775
+ }
776
+ function r(s) {
777
+ return toLocale(Number.parseFloat(s.toPrecision(3)));
778
+ }
779
+ function getProgressDisplayStr(current, total) {
780
+ if (Math.floor(total / 1000000) > 0) {
781
+ return `${r(current / 1000000)}/${r(total / 1000000)}Mb`;
766
782
  }
767
- else if (Math.floor(totalBp / 1000) > 0) {
768
- return `${Number.parseFloat((totalBp / 1000).toPrecision(3))}Kbp`;
783
+ else if (Math.floor(total / 1000) > 0) {
784
+ return `${r(current / 1000)}/${r(total / 1000)}Kb`;
769
785
  }
770
786
  else {
771
- return `${toLocale(Math.floor(totalBp))}bp`;
787
+ return `${r(current)}/${r(total)}}bytes`;
772
788
  }
773
789
  }
774
790
  function toLocale(n) {
@@ -988,6 +1004,16 @@ function localStorageGetNumber(key, defaultVal) {
988
1004
  function localStorageGetBoolean(key, defaultVal) {
989
1005
  return Boolean(JSON.parse(localStorageGetItem(key) || JSON.stringify(defaultVal)));
990
1006
  }
1007
+ function forEachWithStopTokenCheck(iter, stopToken, arg, durationMs = 400) {
1008
+ let start = performance.now();
1009
+ for (const t of iter) {
1010
+ if (performance.now() - start > durationMs) {
1011
+ (0, stopToken_1.checkStopToken)(stopToken);
1012
+ start = performance.now();
1013
+ }
1014
+ arg(t);
1015
+ }
1016
+ }
991
1017
  function testAdapter(fileName, regex, adapterHint, expected) {
992
1018
  return (regex.test(fileName) && !adapterHint) || adapterHint === expected;
993
1019
  }
@@ -13,9 +13,9 @@ class ThrowingLayout {
13
13
  class PrecomputedMultiLayout extends MultiLayout_1.default {
14
14
  constructor(json) {
15
15
  super(ThrowingLayout);
16
- Object.entries(json).forEach(([layoutName, sublayoutJson]) => {
16
+ for (const [layoutName, sublayoutJson] of Object.entries(json)) {
17
17
  this.subLayouts.set(layoutName, new PrecomputedLayout_1.default(sublayoutJson));
18
- });
18
+ }
19
19
  }
20
20
  }
21
21
  exports.default = PrecomputedMultiLayout;
package/util/map-obj.js CHANGED
@@ -13,12 +13,12 @@ function map(object, mapper, isSeen = new WeakSet()) {
13
13
  }
14
14
  isSeen.add(object);
15
15
  const mapArray = (array) => {
16
- array.forEach(element => {
16
+ for (const element of array) {
17
17
  mapper(element);
18
18
  if (isObject(element)) {
19
19
  map(element, mapper, isSeen);
20
20
  }
21
- });
21
+ }
22
22
  };
23
23
  if (Array.isArray(object)) {
24
24
  mapArray(object);
package/util/rxjs.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import type { Observer } from 'rxjs';
3
- export declare function ObservableCreate<T>(func: (arg: Observer<T>) => void | Promise<void>, _stopToken?: string): Observable<T>;
3
+ export declare function ObservableCreate<T>(func: (arg: Observer<T>) => void | Promise<void>, stopToken?: string): Observable<T>;
package/util/rxjs.js CHANGED
@@ -2,7 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ObservableCreate = ObservableCreate;
4
4
  const rxjs_1 = require("rxjs");
5
- function ObservableCreate(func, _stopToken) {
5
+ const stopToken_1 = require("./stopToken");
6
+ function ObservableCreate(func, stopToken) {
7
+ (0, stopToken_1.checkStopToken)(stopToken);
6
8
  return new rxjs_1.Observable((observer) => {
7
9
  try {
8
10
  const ret = func(observer);
@@ -1,3 +1,3 @@
1
1
  export declare function createStopToken(): string;
2
2
  export declare function stopStopToken(stopToken: string): void;
3
- export declare function checkStopToken(stopToken?: string): void;
3
+ export declare function checkStopToken(stopToken: string | undefined): void;