@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.
Files changed (116) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail.d.ts +18 -19
  2. package/BaseFeatureWidget/BaseFeatureDetail.js +76 -69
  3. package/BaseFeatureWidget/SequenceBox.js +9 -3
  4. package/BaseFeatureWidget/SequenceFeatureDetails.js +70 -52
  5. package/BaseFeatureWidget/SequencePanel.d.ts +3 -3
  6. package/BaseFeatureWidget/SequencePanel.js +8 -5
  7. package/BaseFeatureWidget/index.js +2 -2
  8. package/CorePlugin.js +2 -7
  9. package/PluginLoader.d.ts +1 -1
  10. package/PluginLoader.js +20 -24
  11. package/PluginManager.d.ts +1 -1
  12. package/PluginManager.js +2 -3
  13. package/ReExports/Attributes.d.ts +1 -2
  14. package/ReExports/Attributes.js +4 -3
  15. package/ReExports/BaseCard.d.ts +1 -2
  16. package/ReExports/BaseCard.js +4 -3
  17. package/ReExports/DataGrid.d.ts +1 -2
  18. package/ReExports/DataGrid.js +2 -2
  19. package/ReExports/FeatureDetails.d.ts +1 -2
  20. package/ReExports/FeatureDetails.js +4 -3
  21. package/ReExports/index.d.ts +1 -2
  22. package/ReExports/index.js +3 -2
  23. package/ReExports/modules.d.ts +1 -1
  24. package/ReExports/modules.js +2 -2
  25. package/assemblyManager/assembly.js +5 -5
  26. package/assemblyManager/assemblyConfigSchema.js +2 -2
  27. package/configuration/configurationSchema.js +1 -1
  28. package/configuration/util.js +1 -1
  29. package/data_adapters/BaseAdapter.js +1 -1
  30. package/data_adapters/CytobandAdapter/CytobandAdapter.d.ts +8 -0
  31. package/data_adapters/CytobandAdapter/CytobandAdapter.js +40 -0
  32. package/data_adapters/CytobandAdapter/configSchema.d.ts +2 -0
  33. package/data_adapters/CytobandAdapter/configSchema.js +17 -0
  34. package/data_adapters/CytobandAdapter/index.d.ts +3 -0
  35. package/data_adapters/CytobandAdapter/index.js +37 -0
  36. package/data_adapters/dataAdapterCache.d.ts +3 -2
  37. package/data_adapters/dataAdapterCache.js +2 -3
  38. package/package.json +5 -4
  39. package/pluggableElementTypes/PluggableElementBase.d.ts +1 -1
  40. package/pluggableElementTypes/PluggableElementBase.js +1 -2
  41. package/pluggableElementTypes/RpcMethodType.d.ts +5 -8
  42. package/pluggableElementTypes/RpcMethodType.js +23 -34
  43. package/pluggableElementTypes/index.d.ts +11 -1
  44. package/pluggableElementTypes/index.js +23 -23
  45. package/pluggableElementTypes/models/BaseConnectionModelFactory.js +2 -2
  46. package/pluggableElementTypes/models/BaseTrackModel.js +8 -13
  47. package/pluggableElementTypes/renderers/CircularChordRendererType.d.ts +13 -2
  48. package/pluggableElementTypes/renderers/CircularChordRendererType.js +10 -2
  49. package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.d.ts +8 -2
  50. package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.js +10 -4
  51. package/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +1 -1
  52. package/pluggableElementTypes/renderers/ServerSideRendererType.js +2 -34
  53. package/pluggableElementTypes/renderers/index.d.ts +7 -9
  54. package/pluggableElementTypes/renderers/index.js +15 -15
  55. package/pluggableElementTypes/renderers/util/serializableFilterChain.js +1 -1
  56. package/rpc/BaseRpcDriver.js +7 -8
  57. package/rpc/WebWorkerRpcDriver.js +18 -12
  58. package/rpc/coreRpcMethods.d.ts +9 -11
  59. package/rpc/coreRpcMethods.js +17 -17
  60. package/rpc/methods/CoreGetFeatureDetails.js +1 -1
  61. package/rpc/methods/util.d.ts +2 -2
  62. package/rpc/methods/util.js +2 -2
  63. package/rpc/remoteAbortSignals.js +0 -1
  64. package/tsconfig.build.tsbuildinfo +1 -1
  65. package/ui/App.js +3 -18
  66. package/ui/AppLogo.js +1 -6
  67. package/ui/ColorPicker.js +1 -1
  68. package/ui/Dialog.js +1 -1
  69. package/ui/DrawerWidget.js +4 -4
  70. package/ui/EditableTypography.js +1 -1
  71. package/ui/FileSelector/FileSelector.d.ts +2 -2
  72. package/ui/FileSelector/FileSelector.js +24 -35
  73. package/ui/FileSelector/index.d.ts +1 -2
  74. package/ui/FileSelector/index.js +3 -2
  75. package/ui/LoadingEllipses.js +2 -2
  76. package/ui/Menu.js +45 -32
  77. package/ui/ResizeBar.js +10 -6
  78. package/ui/ResizeHandle.js +3 -6
  79. package/ui/SanitizedHTML.js +2 -0
  80. package/ui/ViewContainer.js +7 -44
  81. package/ui/ViewMenu.d.ts +9 -0
  82. package/ui/ViewMenu.js +69 -0
  83. package/ui/ViewPanel.d.ts +19 -0
  84. package/ui/ViewPanel.js +49 -0
  85. package/ui/theme.d.ts +10 -166
  86. package/ui/theme.js +260 -48
  87. package/util/Base1DUtils.js +16 -14
  88. package/util/Base1DViewModel.d.ts +1 -1
  89. package/util/Base1DViewModel.js +9 -8
  90. package/util/aborting.js +1 -1
  91. package/util/analytics.js +1 -1
  92. package/util/blockTypes.js +10 -10
  93. package/util/color/index.d.ts +1 -2
  94. package/util/color/index.js +4 -3
  95. package/util/idMaker.js +5 -8
  96. package/util/index.d.ts +9 -9
  97. package/util/index.js +35 -52
  98. package/util/io/RemoteFileWithRangeCache.js +2 -2
  99. package/util/io/index.d.ts +1 -2
  100. package/util/io/index.js +6 -6
  101. package/util/jexl.js +3 -1
  102. package/util/layouts/GranularRectLayout.js +10 -4
  103. package/util/layouts/MultiLayout.js +1 -1
  104. package/util/layouts/SceneGraph.js +3 -7
  105. package/util/map-obj.d.ts +3 -0
  106. package/util/map-obj.js +33 -0
  107. package/util/offscreenCanvasPonyfill.js +4 -3
  108. package/util/offscreenCanvasUtils.d.ts +18 -4
  109. package/util/offscreenCanvasUtils.js +49 -7
  110. package/util/tracks.d.ts +1 -1
  111. package/util/tracks.js +0 -1
  112. package/util/types/index.d.ts +1 -1
  113. package/util/types/index.js +3 -3
  114. package/util/types/mst.js +3 -3
  115. package/data_adapters/CytobandAdapter.d.ts +0 -8
  116. package/data_adapters/CytobandAdapter.js +0 -49
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // adapted from map-obj (MIT), with modifications to pass the "whole object"
4
+ // from an array of objects into itself
5
+ const isObject = (value) => typeof value === 'object' && value !== null;
6
+ // Customized for this use-case
7
+ const isObjectCustom = (value) => isObject(value) &&
8
+ !(value instanceof RegExp) &&
9
+ !(value instanceof Error) &&
10
+ !(value instanceof Date) &&
11
+ !(globalThis.Blob && value instanceof globalThis.Blob);
12
+ function map(object, mapper, isSeen = new WeakSet()) {
13
+ if (isSeen.has(object)) {
14
+ return;
15
+ }
16
+ isSeen.add(object);
17
+ const mapArray = (array) => array.forEach(element => {
18
+ mapper(element);
19
+ if (isObject(element)) {
20
+ map(element, mapper, isSeen);
21
+ }
22
+ });
23
+ if (Array.isArray(object)) {
24
+ mapArray(object);
25
+ }
26
+ for (const value of Object.values(object)) {
27
+ mapper(value);
28
+ if (isObjectCustom(value)) {
29
+ Array.isArray(value) ? mapArray(value) : map(value, mapper, isSeen);
30
+ }
31
+ }
32
+ }
33
+ exports.default = map;
@@ -33,19 +33,20 @@ if (weHave.realOffscreenCanvas) {
33
33
  else if (weHave.node) {
34
34
  // use node-canvas if we are running in node (i.e. automated tests)
35
35
  exports.createCanvas = (...args) => {
36
- // @ts-ignore
36
+ // @ts-expect-error
37
37
  // eslint-disable-next-line no-undef
38
38
  return nodeCreateCanvas(...args);
39
39
  };
40
40
  exports.createImageBitmap = async (canvas, ...otherargs) => {
41
- if (otherargs.length) {
41
+ if (otherargs.length > 0) {
42
42
  throw new Error('only one-argument uses of createImageBitmap are supported by the node offscreencanvas ponyfill');
43
43
  }
44
44
  const dataUri = canvas.toDataURL();
45
- // @ts-ignore
45
+ // @ts-expect-error
46
46
  // eslint-disable-next-line no-undef
47
47
  const img = new nodeImage();
48
48
  return new Promise((resolve, reject) => {
49
+ // need onload for jest
49
50
  img.onload = () => resolve(img);
50
51
  img.onerror = reject;
51
52
  img.src = dataUri;
@@ -1,14 +1,28 @@
1
- /// <reference types="react" />
2
- export type RenderReturn = Record<string, unknown>;
1
+ import React from 'react';
2
+ export type RenderReturn = Record<string, unknown> | void;
3
+ type RendererRet = Promise<RenderReturn> | RenderReturn;
3
4
  export declare function renderToAbstractCanvas(width: number, height: number, opts: {
4
5
  exportSVG?: {
5
6
  rasterizeLayers?: boolean;
7
+ scale?: number;
6
8
  };
7
- highResolutionScaling: number;
8
- }, cb: (ctx: CanvasRenderingContext2D) => Promise<RenderReturn | void> | RenderReturn | void): Promise<{
9
+ highResolutionScaling?: number;
10
+ }, cb: (ctx: CanvasRenderingContext2D) => RendererRet): Promise<{
9
11
  canvasRecordedData: any;
10
12
  } | {
11
13
  reactElement: JSX.Element;
12
14
  } | {
13
15
  imageData: any;
14
16
  }>;
17
+ export declare function getSerializedSvg(results: {
18
+ width: number;
19
+ height: number;
20
+ canvasRecordedData: unknown;
21
+ }): Promise<string>;
22
+ export declare function ReactRendering({ rendering, }: {
23
+ rendering: {
24
+ reactElement?: React.ReactNode;
25
+ html?: string;
26
+ };
27
+ }): JSX.Element;
28
+ export {};
@@ -1,16 +1,39 @@
1
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
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
5
28
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.renderToAbstractCanvas = void 0;
29
+ exports.ReactRendering = exports.getSerializedSvg = exports.renderToAbstractCanvas = void 0;
7
30
  const react_1 = __importDefault(require("react"));
8
31
  const canvas_sequencer_1 = require("canvas-sequencer");
9
32
  // locals
10
33
  const offscreenCanvasPonyfill_1 = require("./offscreenCanvasPonyfill");
11
34
  const index_1 = require("./index");
12
35
  async function renderToAbstractCanvas(width, height, opts, cb) {
13
- const { exportSVG, highResolutionScaling: scaling = 1 } = opts;
36
+ const { exportSVG, highResolutionScaling = 1 } = opts;
14
37
  if (exportSVG) {
15
38
  if (!exportSVG.rasterizeLayers) {
16
39
  const fakeCtx = new canvas_sequencer_1.CanvasSequence();
@@ -21,13 +44,13 @@ async function renderToAbstractCanvas(width, height, opts, cb) {
21
44
  };
22
45
  }
23
46
  else {
24
- const scale = 4;
25
- const canvas = (0, offscreenCanvasPonyfill_1.createCanvas)(Math.ceil(width * scale), height * scale);
47
+ const s = exportSVG.scale || highResolutionScaling;
48
+ const canvas = (0, offscreenCanvasPonyfill_1.createCanvas)(Math.ceil(width * s), height * s);
26
49
  const ctx = canvas.getContext('2d');
27
50
  if (!ctx) {
28
51
  throw new Error('2d canvas rendering not supported on this platform');
29
52
  }
30
- ctx.scale(scale, scale);
53
+ ctx.scale(s, s);
31
54
  const result = await cb(ctx);
32
55
  // two methods needed for converting canvas to PNG, one for webworker
33
56
  // offscreen canvas, one for main thread
@@ -42,14 +65,33 @@ async function renderToAbstractCanvas(width, height, opts, cb) {
42
65
  }
43
66
  }
44
67
  else {
45
- const canvas = (0, offscreenCanvasPonyfill_1.createCanvas)(Math.ceil(width * scaling), height * scaling);
68
+ const s = highResolutionScaling;
69
+ const canvas = (0, offscreenCanvasPonyfill_1.createCanvas)(Math.ceil(width * s), height * s);
46
70
  const ctx = canvas.getContext('2d');
47
71
  if (!ctx) {
48
72
  throw new Error('2d canvas rendering not supported on this platform');
49
73
  }
50
- ctx.scale(scaling, scaling);
74
+ ctx.scale(s, s);
51
75
  const result = await cb(ctx);
52
76
  return { ...result, imageData: await (0, offscreenCanvasPonyfill_1.createImageBitmap)(canvas) };
53
77
  }
54
78
  }
55
79
  exports.renderToAbstractCanvas = renderToAbstractCanvas;
80
+ async function getSerializedSvg(results) {
81
+ const { width, height, canvasRecordedData } = results;
82
+ // @ts-ignore needs to be ignore not expect error, produces error in build step
83
+ const C2S = await Promise.resolve().then(() => __importStar(require('canvas2svg')));
84
+ const ctx = new C2S.default(width, height);
85
+ const seq = new canvas_sequencer_1.CanvasSequence(canvasRecordedData);
86
+ seq.execute(ctx);
87
+ // innerHTML strips the outer <svg> element from returned data, we add
88
+ // our own <svg> element in the view's SVG export
89
+ return ctx.getSvg().innerHTML;
90
+ }
91
+ exports.getSerializedSvg = getSerializedSvg;
92
+ function ReactRendering({ rendering, }) {
93
+ return (react_1.default.createElement(react_1.default.Fragment, null, react_1.default.isValidElement(rendering.reactElement) ? (rendering.reactElement) : (react_1.default.createElement("g", {
94
+ /* eslint-disable-next-line react/no-danger */
95
+ dangerouslySetInnerHTML: { __html: rendering.html || '' } }))));
96
+ }
97
+ exports.ReactRendering = ReactRendering;
package/util/tracks.d.ts CHANGED
@@ -75,4 +75,4 @@ export declare function generateUnknownTrackConf(trackName: string, trackUrl: st
75
75
  };
76
76
  export declare function getTrackName(conf: AnyConfigurationModel, session: {
77
77
  assemblies: AnyConfigurationModel[];
78
- }): any;
78
+ }): string;
package/util/tracks.js CHANGED
@@ -141,7 +141,6 @@ function guessAdapter(file, index, adapterHint, model) {
141
141
  exports.guessAdapter = guessAdapter;
142
142
  function guessTrackType(adapterType, model) {
143
143
  if (model) {
144
- // @ts-ignore
145
144
  const session = (0, index_1.getSession)(model);
146
145
  const trackTypeGuesser = (0, index_1.getEnv)(session).pluginManager.evaluateExtensionPoint('Core-guessTrackTypeForLocation', (_adapterName) => {
147
146
  return undefined;
@@ -22,7 +22,6 @@ export interface SnackAction {
22
22
  onClick: () => void;
23
23
  }
24
24
  export type AssemblyManager = Instance<ReturnType<typeof assemblyManager>>;
25
- export type { TextSearchManager };
26
25
  export interface BasePlugin {
27
26
  version?: string;
28
27
  name: string;
@@ -230,3 +229,4 @@ export type PreBlobLocation = {
230
229
  blob: File;
231
230
  };
232
231
  export type PreFileLocation = PreUriLocation | PreLocalPathLocation | PreBlobLocation;
232
+ export { type default as TextSearchManager } from '../../TextSearch/TextSearchManager';
@@ -37,7 +37,7 @@ function isSessionModelWithConfigEditing(thing) {
37
37
  exports.isSessionModelWithConfigEditing = isSessionModelWithConfigEditing;
38
38
  function isSessionWithAddTracks(thing) {
39
39
  return (
40
- // @ts-ignore
40
+ // @ts-expect-error
41
41
  isSessionModel(thing) && 'addTrackConf' in thing && !thing.disableAddTracks);
42
42
  }
43
43
  exports.isSessionWithAddTracks = isSessionWithAddTracks;
@@ -71,7 +71,7 @@ function isTrackModel(thing) {
71
71
  return (typeof thing === 'object' &&
72
72
  thing !== null &&
73
73
  'configuration' in thing &&
74
- // @ts-ignore
74
+ // @ts-expect-error
75
75
  thing.configuration.trackId);
76
76
  }
77
77
  exports.isTrackModel = isTrackModel;
@@ -79,7 +79,7 @@ function isDisplayModel(thing) {
79
79
  return (typeof thing === 'object' &&
80
80
  thing !== null &&
81
81
  'configuration' in thing &&
82
- // @ts-ignore
82
+ // @ts-expect-error
83
83
  thing.configuration.displayId);
84
84
  }
85
85
  exports.isDisplayModel = isDisplayModel;
package/util/types/mst.js CHANGED
@@ -70,16 +70,16 @@ exports.UriLocation = mobx_state_tree_1.types.snapshotProcessor(exports.UriLocat
70
70
  },
71
71
  });
72
72
  exports.FileLocation = mobx_state_tree_1.types.snapshotProcessor(mobx_state_tree_1.types.union(exports.LocalPathLocation, exports.UriLocation, exports.BlobLocation), {
73
- // @ts-ignore
73
+ // @ts-expect-error
74
74
  preProcessor(snap) {
75
75
  if (!snap) {
76
76
  return undefined;
77
77
  }
78
- // @ts-ignore
78
+ // @ts-expect-error
79
79
  // xref https://github.com/mobxjs/mobx-state-tree/issues/1524 for Omit
80
80
  const { locationType, ...rest } = snap;
81
81
  if (!locationType) {
82
- // @ts-ignore
82
+ // @ts-expect-error
83
83
  const { uri, localPath, blob } = rest;
84
84
  let locationType = '';
85
85
  if (uri !== undefined) {
@@ -1,8 +0,0 @@
1
- import SimpleFeature from '../util/simpleFeature';
2
- import { BaseAdapter } from './BaseAdapter';
3
- declare const configSchema: import("../configuration").AnyConfigurationSchemaType;
4
- declare class CytobandAdapter extends BaseAdapter {
5
- getData(): Promise<SimpleFeature[]>;
6
- freeResources(): void;
7
- }
8
- export { configSchema, CytobandAdapter as DataAdapter };
@@ -1,49 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.DataAdapter = exports.configSchema = void 0;
7
- const simpleFeature_1 = __importDefault(require("../util/simpleFeature"));
8
- const configuration_1 = require("../configuration");
9
- const io_1 = require("../util/io");
10
- const BaseAdapter_1 = require("./BaseAdapter");
11
- /**
12
- * #config CytobandAdapter
13
- */
14
- function x() { } // eslint-disable-line @typescript-eslint/no-unused-vars
15
- const configSchema = (0, configuration_1.ConfigurationSchema)('CytobandAdapter', {
16
- /**
17
- * #slot
18
- */
19
- cytobandLocation: {
20
- type: 'fileLocation',
21
- defaultValue: { uri: '/path/to/cytoband.txt.gz' },
22
- },
23
- }, { explicitlyTyped: true });
24
- exports.configSchema = configSchema;
25
- class CytobandAdapter extends BaseAdapter_1.BaseAdapter {
26
- async getData() {
27
- const loc = (0, configuration_1.readConfObject)(this.config, 'cytobandLocation');
28
- if (loc.uri === '' || loc.uri === '/path/to/cytoband.txt.gz') {
29
- return [];
30
- }
31
- const data = await (0, io_1.openLocation)(loc).readFile('utf8');
32
- return data
33
- .split(/\n|\r\n|\r/)
34
- .filter(f => !!f.trim())
35
- .map(line => {
36
- const [refName, start, end, name, type] = line.split('\t');
37
- return new simpleFeature_1.default({
38
- uniqueId: line,
39
- refName,
40
- start: +start,
41
- end: +end,
42
- name,
43
- type,
44
- });
45
- });
46
- }
47
- freeResources( /* { region } */) { }
48
- }
49
- exports.DataAdapter = CytobandAdapter;