@jbrowse/core 2.13.0 → 2.14.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 (149) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +2 -2
  2. package/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +1 -1
  3. package/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.js +3 -1
  4. package/BaseFeatureWidget/BaseFeatureDetail/index.js +28 -25
  5. package/BaseFeatureWidget/BaseFeatureDetail/util.js +1 -1
  6. package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.js +11 -5
  7. package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +1 -1
  8. package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.js +11 -7
  9. package/BaseFeatureWidget/SequenceFeatureDetails/SequencePanel.js +1 -1
  10. package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/HelpDialog.js +6 -2
  11. package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.js +11 -5
  12. package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceFeatureMenu.js +15 -5
  13. package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceTypeSelector.js +4 -2
  14. package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SettingsDialog.js +15 -5
  15. package/BaseFeatureWidget/SequenceFeatureDetails/hooks.js +2 -2
  16. package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDNASequence.js +2 -2
  17. package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/SequenceDisplay.js +5 -3
  18. package/BaseFeatureWidget/stateModelFactory.js +0 -2
  19. package/PluginLoader.d.ts +1 -2
  20. package/PluginLoader.js +16 -6
  21. package/PluginManager.d.ts +13 -13
  22. package/PluginManager.js +7 -2
  23. package/ReExports/modules.js +2 -11
  24. package/assemblyManager/assembly.d.ts +18 -12
  25. package/assemblyManager/assembly.js +75 -52
  26. package/assemblyManager/assemblyConfigSchema.d.ts +9 -7
  27. package/assemblyManager/assemblyConfigSchema.js +15 -16
  28. package/assemblyManager/assemblyManager.d.ts +109 -81
  29. package/assemblyManager/assemblyManager.js +3 -6
  30. package/configuration/configurationSchema.d.ts +1 -1
  31. package/configuration/configurationSchema.js +1 -2
  32. package/configuration/configurationSlot.js +7 -8
  33. package/configuration/util.js +0 -7
  34. package/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +6 -6
  35. package/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +6 -6
  36. package/data_adapters/BaseAdapter/BaseRefNameAliasAdapter.d.ts +1 -0
  37. package/data_adapters/CytobandAdapter/CytobandAdapter.d.ts +0 -1
  38. package/data_adapters/CytobandAdapter/CytobandAdapter.js +4 -8
  39. package/data_adapters/dataAdapterCache.d.ts +9 -6
  40. package/data_adapters/dataAdapterCache.js +16 -22
  41. package/package.json +3 -3
  42. package/pluggableElementTypes/AddTrackWorkflowType.js +0 -6
  43. package/pluggableElementTypes/ConnectionType.js +0 -6
  44. package/pluggableElementTypes/DisplayType.js +0 -20
  45. package/pluggableElementTypes/InternetAccountType.js +0 -11
  46. package/pluggableElementTypes/RpcMethodType.d.ts +1 -1
  47. package/pluggableElementTypes/TextSearchAdapterType.js +0 -3
  48. package/pluggableElementTypes/TrackType.js +0 -11
  49. package/pluggableElementTypes/ViewType.js +0 -6
  50. package/pluggableElementTypes/WidgetType.js +0 -6
  51. package/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +4 -3
  52. package/pluggableElementTypes/models/BaseConnectionModelFactory.js +1 -3
  53. package/pluggableElementTypes/models/BaseDisplayModel.d.ts +4 -5
  54. package/pluggableElementTypes/models/BaseDisplayModel.js +6 -14
  55. package/pluggableElementTypes/models/BaseTrackModel.js +8 -5
  56. package/pluggableElementTypes/models/InternetAccountModel.d.ts +1 -1
  57. package/pluggableElementTypes/models/InternetAccountModel.js +19 -13
  58. package/pluggableElementTypes/models/baseTrackConfig.js +2 -5
  59. package/pluggableElementTypes/renderers/BoxRendererType.d.ts +10 -4
  60. package/pluggableElementTypes/renderers/BoxRendererType.js +10 -26
  61. package/pluggableElementTypes/renderers/CircularChordRendererType.d.ts +1 -1
  62. package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.d.ts +9 -12
  63. package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.js +12 -19
  64. package/pluggableElementTypes/renderers/FeatureRendererType.d.ts +5 -5
  65. package/pluggableElementTypes/renderers/FeatureRendererType.js +6 -13
  66. package/pluggableElementTypes/renderers/RendererType.js +0 -10
  67. package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.d.ts +1 -1
  68. package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.js +8 -9
  69. package/pluggableElementTypes/renderers/ServerSideRenderedContent.js +11 -14
  70. package/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +4 -4
  71. package/pluggableElementTypes/renderers/ServerSideRendererType.js +7 -5
  72. package/pluggableElementTypes/renderers/util/serializableFilterChain.js +0 -1
  73. package/rpc/BaseRpcDriver.d.ts +1 -1
  74. package/rpc/BaseRpcDriver.js +12 -11
  75. package/rpc/MainThreadRpcDriver.d.ts +2 -2
  76. package/rpc/MainThreadRpcDriver.js +3 -0
  77. package/rpc/RpcManager.d.ts +1 -1
  78. package/rpc/RpcManager.js +11 -8
  79. package/rpc/configSchema.js +0 -1
  80. package/rpc/methods/CoreFreeResources.d.ts +2 -2
  81. package/rpc/methods/CoreGetFeatureDensityStats.d.ts +2 -2
  82. package/rpc/methods/CoreGetFeatureDetails.d.ts +1 -1
  83. package/rpc/methods/CoreGetFeatureDetails.js +3 -3
  84. package/rpc/methods/CoreGetFeatures.d.ts +1 -1
  85. package/rpc/methods/CoreGetFileInfo.d.ts +1 -1
  86. package/rpc/methods/CoreGetMetadata.d.ts +1 -1
  87. package/rpc/methods/CoreGetRefNames.d.ts +1 -1
  88. package/rpc/methods/util.d.ts +2 -2
  89. package/rpc/methods/util.js +0 -3
  90. package/tsconfig.build.tsbuildinfo +1 -1
  91. package/ui/AssemblySelector.js +3 -1
  92. package/ui/CascadingMenu.js +2 -1
  93. package/ui/CascadingMenuButton.js +3 -1
  94. package/ui/ColorPicker.js +14 -4
  95. package/ui/DropDownMenu.js +3 -1
  96. package/ui/EditableTypography.js +6 -2
  97. package/ui/ErrorMessage.d.ts +2 -2
  98. package/ui/ErrorMessage.js +37 -20
  99. package/ui/ErrorMessageStackTraceDialog.js +11 -9
  100. package/ui/FactoryResetDialog.d.ts +1 -1
  101. package/ui/FactoryResetDialog.js +9 -3
  102. package/ui/FatalErrorDialog.js +9 -3
  103. package/ui/FileSelector/FileSelector.js +8 -4
  104. package/ui/FileSelector/LocalFileChooser.js +7 -6
  105. package/ui/LoadingEllipses.js +1 -1
  106. package/ui/Menu.d.ts +4 -4
  107. package/ui/Menu.js +6 -9
  108. package/ui/MenuButton.js +6 -2
  109. package/ui/PrerenderedCanvas.js +8 -5
  110. package/ui/RedErrorMessageBox.js +13 -8
  111. package/ui/ResizeHandle.d.ts +1 -1
  112. package/ui/ReturnToImportFormDialog.js +3 -1
  113. package/ui/SanitizedHTML.js +1 -3
  114. package/ui/SnackbarModel.d.ts +12 -1
  115. package/ui/SnackbarModel.js +19 -3
  116. package/ui/theme.js +5 -5
  117. package/util/Base1DViewModel.js +3 -1
  118. package/util/QuickLRU.js +8 -8
  119. package/util/TimeTraveller.js +12 -4
  120. package/util/analytics.js +0 -1
  121. package/util/blockTypes.js +5 -9
  122. package/util/calculateStaticBlocks.d.ts +1 -1
  123. package/util/compositeMap.js +2 -2
  124. package/util/idMaker.js +0 -1
  125. package/util/index.d.ts +9 -8
  126. package/util/index.js +91 -51
  127. package/util/io/RemoteFileWithRangeCache.js +1 -3
  128. package/util/io/index.js +3 -5
  129. package/util/jexlStrings.js +5 -8
  130. package/util/layouts/GranularRectLayout.js +1 -4
  131. package/util/layouts/SceneGraph.d.ts +1 -1
  132. package/util/layouts/SceneGraph.js +2 -6
  133. package/util/map-obj.js +15 -7
  134. package/util/mst-reflection.js +1 -2
  135. package/util/nanoid.js +9 -8
  136. package/util/offscreenCanvasPonyfill.d.ts +1 -1
  137. package/util/offscreenCanvasPonyfill.js +7 -10
  138. package/util/offscreenCanvasUtils.d.ts +1 -1
  139. package/util/offscreenCanvasUtils.js +1 -3
  140. package/util/rxjs.js +4 -2
  141. package/util/simpleFeature.d.ts +2 -3
  142. package/util/simpleFeature.js +9 -12
  143. package/util/stats.js +3 -1
  144. package/util/tracks.d.ts +4 -2
  145. package/util/tracks.js +10 -11
  146. package/util/types/index.d.ts +5 -5
  147. package/util/types/index.js +8 -1
  148. package/util/types/mst.js +1 -0
  149. package/util/when.js +7 -2
@@ -1,16 +1,15 @@
1
1
  import { Feature } from '../../util/simpleFeature';
2
+ import { Region } from '../../util/types';
2
3
  import ServerSideRenderer, { RenderArgs as ServerSideRenderArgs, RenderArgsSerialized as ServerSideRenderArgsSerialized, RenderArgsDeserialized as ServerSideRenderArgsDeserialized, ResultsSerialized as ServerSideResultsSerialized, ResultsDeserialized as ServerSideResultsDeserialized } from './ServerSideRendererType';
3
4
  import RpcManager from '../../rpc/RpcManager';
5
+ import { AnyConfigurationModel } from '../../configuration';
4
6
  export interface RenderArgs extends ServerSideRenderArgs {
5
- displayModel: {};
6
7
  blockKey: string;
7
8
  }
8
9
  export interface RenderArgsSerialized extends ServerSideRenderArgsSerialized {
9
- displayModel: {};
10
10
  blockKey: string;
11
11
  }
12
12
  export interface RenderArgsDeserialized extends ServerSideRenderArgsDeserialized {
13
- displayModel: {};
14
13
  blockKey: string;
15
14
  }
16
15
  export type ResultsSerialized = ServerSideResultsSerialized;
@@ -25,14 +24,8 @@ export interface ResultsSerializedSvgExport extends ResultsSerialized {
25
24
  }
26
25
  export default class ComparativeServerSideRenderer extends ServerSideRenderer {
27
26
  /**
28
- * directly modifies the render arguments to prepare
29
- * them to be serialized and sent to the worker.
30
- *
31
- * the base class replaces the `displayModel` param
32
- * (which on the client is a MST model) with a stub
33
- * that only contains the `selectedFeature`, since
34
- * this is the only part of the track model that most
35
- * renderers read.
27
+ * directly modifies the render arguments to prepare them to be serialized
28
+ * and sent to the worker.
36
29
  *
37
30
  * @param args - the arguments passed to render
38
31
  * @returns the same object
@@ -51,6 +44,10 @@ export default class ComparativeServerSideRenderer extends ServerSideRenderer {
51
44
  * @returns true if this feature passes all configured filters
52
45
  */
53
46
  featurePassesFilters(renderArgs: RenderArgsDeserialized, feature: Feature): boolean;
54
- getFeatures(renderArgs: any): Promise<Feature[]>;
47
+ getFeatures(renderArgs: {
48
+ regions: Region[];
49
+ sessionId: string;
50
+ adapterConfig: AnyConfigurationModel;
51
+ }): Promise<Feature[]>;
55
52
  }
56
53
  export { type RenderResults } from './ServerSideRendererType';
@@ -3,7 +3,6 @@ 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
- /* eslint-disable @typescript-eslint/no-explicit-any */
7
6
  const operators_1 = require("rxjs/operators");
8
7
  const ServerSideRendererType_1 = __importDefault(require("./ServerSideRendererType"));
9
8
  const dataAdapterCache_1 = require("../../data_adapters/dataAdapterCache");
@@ -14,14 +13,8 @@ function isSvgExport(e) {
14
13
  }
15
14
  class ComparativeServerSideRenderer extends ServerSideRendererType_1.default {
16
15
  /**
17
- * directly modifies the render arguments to prepare
18
- * them to be serialized and sent to the worker.
19
- *
20
- * the base class replaces the `displayModel` param
21
- * (which on the client is a MST model) with a stub
22
- * that only contains the `selectedFeature`, since
23
- * this is the only part of the track model that most
24
- * renderers read.
16
+ * directly modifies the render arguments to prepare them to be serialized
17
+ * and sent to the worker.
25
18
  *
26
19
  * @param args - the arguments passed to render
27
20
  * @returns the same object
@@ -32,14 +25,17 @@ class ComparativeServerSideRenderer extends ServerSideRendererType_1.default {
32
25
  serializeArgsInClient(args) {
33
26
  const deserializedArgs = {
34
27
  ...args,
35
- displayModel: {},
28
+ displayModel: undefined,
36
29
  };
37
30
  return super.serializeArgsInClient(deserializedArgs);
38
31
  }
39
32
  // deserialize some of the results that came back from the worker
40
33
  deserializeResultsInClient(result, args) {
41
34
  const deserialized = super.deserializeResultsInClient(result, args);
42
- return { ...deserialized, blockKey: args.blockKey };
35
+ return {
36
+ ...deserialized,
37
+ blockKey: args.blockKey,
38
+ };
43
39
  }
44
40
  /**
45
41
  * Render method called on the client. Serializes args, then
@@ -49,7 +45,7 @@ class ComparativeServerSideRenderer extends ServerSideRendererType_1.default {
49
45
  const results = (await rpcManager.call(args.sessionId, 'ComparativeRender', args));
50
46
  if (isSvgExport(results)) {
51
47
  results.html = await (0, util_1.getSerializedSvg)(results);
52
- delete results.reactElement;
48
+ results.reactElement = undefined;
53
49
  }
54
50
  return results;
55
51
  }
@@ -65,13 +61,8 @@ class ComparativeServerSideRenderer extends ServerSideRendererType_1.default {
65
61
  }
66
62
  async getFeatures(renderArgs) {
67
63
  const pm = this.pluginManager;
68
- const { sessionId, adapterConfig } = renderArgs;
64
+ const { regions, sessionId, adapterConfig } = renderArgs;
69
65
  const { dataAdapter } = await (0, dataAdapterCache_1.getAdapter)(pm, sessionId, adapterConfig);
70
- const regions = renderArgs.regions;
71
- if (!regions || regions.length === 0) {
72
- console.warn('no regions supplied to comparative renderer');
73
- return [];
74
- }
75
66
  const requestRegions = regions.map(r => {
76
67
  // make sure the requested region's start and end are integers, if
77
68
  // there is a region specification.
@@ -87,7 +78,9 @@ class ComparativeServerSideRenderer extends ServerSideRendererType_1.default {
87
78
  // note that getFeaturesInMultipleRegions does not do glyph expansion
88
79
  const res = await (0, rxjs_1.firstValueFrom)(dataAdapter
89
80
  .getFeaturesInMultipleRegions(requestRegions, renderArgs)
90
- .pipe((0, operators_1.filter)(f => this.featurePassesFilters(renderArgs, f)), (0, operators_1.toArray)()));
81
+ .pipe(
82
+ // @ts-expect-error
83
+ (0, operators_1.filter)(f => this.featurePassesFilters(renderArgs, f)), (0, operators_1.toArray)()));
91
84
  // dedupe needed xref https://github.com/GMOD/jbrowse-components/pull/3404/
92
85
  return (0, util_1.dedupe)(res, f => f.id());
93
86
  }
@@ -3,7 +3,7 @@ import { AugmentedRegion as Region } from '../../util/types';
3
3
  import ServerSideRendererType, { RenderArgs as ServerSideRenderArgs, RenderArgsSerialized as ServerSideRenderArgsSerialized, RenderArgsDeserialized as ServerSideRenderArgsDeserialized, RenderResults as ServerSideRenderResults, ResultsDeserialized as ServerSideResultsDeserialized, ResultsSerialized as ServerSideResultsSerialized } from './ServerSideRendererType';
4
4
  import { AnyConfigurationModel } from '../../configuration';
5
5
  export interface RenderArgs extends ServerSideRenderArgs {
6
- displayModel: {
6
+ displayModel?: {
7
7
  id: string;
8
8
  selectedFeatureId?: string;
9
9
  };
@@ -11,7 +11,7 @@ export interface RenderArgs extends ServerSideRenderArgs {
11
11
  blockKey: string;
12
12
  }
13
13
  export interface RenderArgsSerialized extends ServerSideRenderArgsSerialized {
14
- displayModel: {
14
+ displayModel?: {
15
15
  id: string;
16
16
  selectedFeatureId?: string;
17
17
  };
@@ -40,9 +40,9 @@ export interface ResultsDeserialized extends ServerSideResultsDeserialized {
40
40
  export default class FeatureRendererType extends ServerSideRendererType {
41
41
  /**
42
42
  * replaces the `displayModel` param (which on the client is a MST model)
43
- * with a stub that only contains the `selectedFeature`, since this is the only
44
- * part of the track model that most renderers read. also serializes the config
45
- * and regions to JSON from MST objects.
43
+ * with a stub that only contains the `selectedFeature`, since this is the
44
+ * only part of the track model that most renderers read. also serializes the
45
+ * config and regions to JSON from MST objects.
46
46
  *
47
47
  * @param args - the arguments passed to render
48
48
  */
@@ -15,20 +15,17 @@ const BaseAdapter_1 = require("../../data_adapters/BaseAdapter");
15
15
  class FeatureRendererType extends ServerSideRendererType_1.default {
16
16
  /**
17
17
  * replaces the `displayModel` param (which on the client is a MST model)
18
- * with a stub that only contains the `selectedFeature`, since this is the only
19
- * part of the track model that most renderers read. also serializes the config
20
- * and regions to JSON from MST objects.
18
+ * with a stub that only contains the `selectedFeature`, since this is the
19
+ * only part of the track model that most renderers read. also serializes the
20
+ * config and regions to JSON from MST objects.
21
21
  *
22
22
  * @param args - the arguments passed to render
23
23
  */
24
24
  serializeArgsInClient(args) {
25
- const { displayModel, regions } = args;
25
+ const { regions } = args;
26
26
  const serializedArgs = {
27
27
  ...args,
28
- displayModel: displayModel && {
29
- id: displayModel.id,
30
- selectedFeatureId: displayModel.selectedFeatureId,
31
- },
28
+ displayModel: undefined,
32
29
  regions: (0, clone_1.default)(regions),
33
30
  };
34
31
  return super.serializeArgsInClient(serializedArgs);
@@ -88,13 +85,9 @@ class FeatureRendererType extends ServerSideRendererType_1.default {
88
85
  if (!(0, BaseAdapter_1.isFeatureAdapter)(dataAdapter)) {
89
86
  throw new Error('Adapter does not support retrieving features');
90
87
  }
91
- const features = new Map();
92
- if (!regions || regions.length === 0) {
93
- return features;
94
- }
95
88
  // make sure the requested region's start and end are integers, if
96
89
  // there is a region specification.
97
- const requestRegions = regions.map((r) => {
90
+ const requestRegions = regions.map(r => {
98
91
  const requestRegion = { ...r };
99
92
  if (requestRegion.start) {
100
93
  requestRegion.start = Math.floor(requestRegion.start);
@@ -4,7 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = __importDefault(require("react"));
7
- const mst_reflection_1 = require("../../util/mst-reflection");
8
7
  const PluggableElementBase_1 = __importDefault(require("../PluggableElementBase"));
9
8
  class RendererType extends PluggableElementBase_1.default {
10
9
  constructor(stuff) {
@@ -13,15 +12,6 @@ class RendererType extends PluggableElementBase_1.default {
13
12
  this.ReactComponent = stuff.ReactComponent;
14
13
  this.configSchema = stuff.configSchema;
15
14
  this.pluginManager = stuff.pluginManager;
16
- if (!this.ReactComponent) {
17
- throw new Error(`no ReactComponent defined for renderer ${this.name}`);
18
- }
19
- if (!(0, mst_reflection_1.getDefaultValue)(this.configSchema).type) {
20
- throw new Error(`${this.name} config schema ${this.configSchema.name} is not explicitlyTyped`);
21
- }
22
- if (!this.pluginManager) {
23
- throw new Error(`no plugin manager defined for renderer ${this.name}`);
24
- }
25
15
  }
26
16
  async render(props) {
27
17
  return {
@@ -5,7 +5,7 @@ interface Props {
5
5
  html: string;
6
6
  features: Map<string, Feature>;
7
7
  theme: ThemeOptions;
8
- displayModel: any;
8
+ displayModel?: any;
9
9
  RenderingComponent: AnyReactComponentType;
10
10
  }
11
11
  declare const RpcRenderedSvgGroup: (props: Props) => React.JSX.Element;
@@ -36,9 +36,7 @@ const NewHydrate = (0, mobx_react_1.observer)(function RpcRenderedSvgGroup(props
36
36
  const { html, theme, RenderingComponent, ...rest } = props;
37
37
  const ref = (0, react_1.useRef)(null);
38
38
  // this `any` is a react-dom/client::Root
39
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
40
39
  const rootRef = (0, react_1.useRef)();
41
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
40
  const root = (0, mobx_state_tree_1.getRoot)(props.displayModel);
43
41
  const hydrateRoot = root.hydrateFn;
44
42
  (0, react_1.useEffect)(() => {
@@ -53,15 +51,17 @@ const NewHydrate = (0, mobx_react_1.observer)(function RpcRenderedSvgGroup(props
53
51
  react_1.default.createElement(RenderingComponent, { ...rest })));
54
52
  });
55
53
  return () => {
56
- clearTimeout(renderTimeout);
54
+ if (renderTimeout !== undefined) {
55
+ clearTimeout(renderTimeout);
56
+ }
57
57
  const root = rootRef.current;
58
58
  rootRef.current = undefined;
59
59
  setTimeout(() => {
60
60
  root === null || root === void 0 ? void 0 : root.unmount();
61
61
  });
62
62
  };
63
- }, [html, RenderingComponent, hydrateRoot, theme, props, rest]);
64
- // eslint-disable-next-line react/no-danger
63
+ // biome-ignore lint/correctness/useExhaustiveDependencies:
64
+ }, [RenderingComponent, hydrateRoot, theme, rest]);
65
65
  return react_1.default.createElement("g", { ref: ref, dangerouslySetInnerHTML: { __html: html } });
66
66
  });
67
67
  const OldHydrate = (0, mobx_react_1.observer)(function OldHydrate(props) {
@@ -78,9 +78,9 @@ const OldHydrate = (0, mobx_react_1.observer)(function OldHydrate(props) {
78
78
  // https://github.com/GMOD/jbrowse-components/issues/2160
79
79
  domNode.style.outline = 'none';
80
80
  domNode.innerHTML = html;
81
- // use requestIdleCallback to defer main-thread rendering
82
- // and hydration for when we have some free time. helps
83
- // keep the framerate up.
81
+ // use requestIdleCallback to defer main-thread rendering and
82
+ // hydration for when we have some free time. helps keep the
83
+ // framerate up.
84
84
  (0, util_1.rIC)(() => {
85
85
  (0, react_dom_1.hydrate)(react_1.default.createElement(RenderingComponent, { ...props }), domNode);
86
86
  });
@@ -96,7 +96,6 @@ const OldHydrate = (0, mobx_react_1.observer)(function OldHydrate(props) {
96
96
  return react_1.default.createElement("g", { ref: ref });
97
97
  });
98
98
  const RpcRenderedSvgGroup = (0, mobx_react_1.observer)(function (props) {
99
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
100
99
  const root = (0, mobx_state_tree_1.getRoot)(props.displayModel);
101
100
  return root.hydrateFn ? react_1.default.createElement(NewHydrate, { ...props }) : react_1.default.createElement(OldHydrate, { ...props });
102
101
  });
@@ -34,14 +34,12 @@ const react_dom_1 = require("react-dom");
34
34
  const util_1 = require("../../util");
35
35
  const NewHydrate = (0, mobx_react_1.observer)(function ServerSideRenderedContent({ theme, html, RenderingComponent, ...rest }) {
36
36
  const ref = (0, react_1.useRef)(null);
37
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
37
  const rootRef = (0, react_1.useRef)();
39
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
40
38
  const { hydrateFn } = (0, mobx_state_tree_1.getRoot)(rest.displayModel);
41
39
  (0, react_1.useEffect)(() => {
42
- // requestIdleCallback here helps to avoid hydration mismatch
43
- // because it provides time for dangerouslySetInnerHTML to set the innerHTML
44
- // contents of the node, otherwise ref.current.innerHTML can be empty
40
+ // requestIdleCallback here helps to avoid hydration mismatch because it
41
+ // provides time for dangerouslySetInnerHTML to set the innerHTML contents
42
+ // of the node, otherwise ref.current.innerHTML can be empty
45
43
  const renderTimeout = (0, util_1.rIC)(() => {
46
44
  var _a;
47
45
  if (!ref.current) {
@@ -57,17 +55,18 @@ const NewHydrate = (0, mobx_react_1.observer)(function ServerSideRenderedContent
57
55
  react_1.default.createElement(RenderingComponent, { ...rest })));
58
56
  });
59
57
  return () => {
60
- clearTimeout(renderTimeout);
58
+ if (renderTimeout !== undefined) {
59
+ clearTimeout(renderTimeout);
60
+ }
61
61
  const root = rootRef.current;
62
62
  rootRef.current = undefined;
63
63
  setTimeout(() => {
64
64
  root === null || root === void 0 ? void 0 : root.unmount();
65
65
  });
66
66
  };
67
- }, [html, theme, rest, hydrateFn, RenderingComponent]);
68
- return (react_1.default.createElement("div", { "data-testid": "hydrationContainer", ref: ref,
69
- // eslint-disable-next-line react/no-danger
70
- dangerouslySetInnerHTML: { __html: html } }));
67
+ /* biome-ignore lint/correctness/useExhaustiveDependencies: */
68
+ }, [theme, rest, hydrateFn, RenderingComponent]);
69
+ return (react_1.default.createElement("div", { "data-testid": "hydrationContainer", ref: ref, dangerouslySetInnerHTML: { __html: html } }));
71
70
  });
72
71
  const OldHydrate = (0, mobx_react_1.observer)(function ({ theme, html, RenderingComponent, ...rest }) {
73
72
  const ref = (0, react_1.useRef)(null);
@@ -76,9 +75,7 @@ const OldHydrate = (0, mobx_react_1.observer)(function ({ theme, html, Rendering
76
75
  const domNode = ref.current;
77
76
  function doHydrate() {
78
77
  if (domNode) {
79
- if (domNode) {
80
- (0, react_dom_1.unmountComponentAtNode)(domNode);
81
- }
78
+ (0, react_dom_1.unmountComponentAtNode)(domNode);
82
79
  domNode.innerHTML = html;
83
80
  (0, util_1.rIC)(() => {
84
81
  (0, react_dom_1.hydrate)(react_1.default.createElement(styles_1.ThemeProvider, { theme: jbrowseTheme },
@@ -92,11 +89,11 @@ const OldHydrate = (0, mobx_react_1.observer)(function ({ theme, html, Rendering
92
89
  (0, react_dom_1.unmountComponentAtNode)(domNode);
93
90
  }
94
91
  };
92
+ /* biome-ignore lint/correctness/useExhaustiveDependencies: */
95
93
  }, [html, jbrowseTheme, rest, RenderingComponent]);
96
94
  return react_1.default.createElement("div", { ref: ref });
97
95
  });
98
96
  const ServerSideRenderedContent = (0, mobx_react_1.observer)(function (props) {
99
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
100
97
  const root = (0, mobx_state_tree_1.getRoot)(props.displayModel);
101
98
  return root.hydrateFn ? react_1.default.createElement(NewHydrate, { ...props }) : react_1.default.createElement(OldHydrate, { ...props });
102
99
  });
@@ -8,22 +8,22 @@ interface BaseRenderArgs extends RenderProps {
8
8
  sessionId: string;
9
9
  signal?: AbortSignal;
10
10
  theme: ThemeOptions;
11
- exportSVG: {
11
+ exportSVG?: {
12
12
  rasterizeLayers?: boolean;
13
13
  };
14
14
  }
15
15
  export interface RenderArgs extends BaseRenderArgs {
16
16
  config: SnapshotOrInstance<AnyConfigurationModel>;
17
- filters: SerializableFilterChain;
17
+ filters?: SerializableFilterChain;
18
18
  }
19
19
  export interface RenderArgsSerialized extends BaseRenderArgs {
20
20
  statusCallback?: (arg: string) => void;
21
21
  config: SnapshotIn<AnyConfigurationModel>;
22
- filters: SerializedFilterChain;
22
+ filters?: SerializedFilterChain;
23
23
  }
24
24
  export interface RenderArgsDeserialized extends BaseRenderArgs {
25
25
  config: AnyConfigurationModel;
26
- filters: SerializableFilterChain;
26
+ filters?: SerializableFilterChain;
27
27
  }
28
28
  export interface ResultsSerialized extends Omit<RenderResults, 'reactElement'> {
29
29
  html: string;
@@ -72,9 +72,11 @@ class ServerSideRenderer extends RendererType_1.default {
72
72
  deserialized.config = this.configSchema.create(args.config || {}, {
73
73
  pluginManager: this.pluginManager,
74
74
  });
75
- deserialized.filters = new serializableFilterChain_1.default({
76
- filters: args.filters,
77
- });
75
+ deserialized.filters = args.filters
76
+ ? new serializableFilterChain_1.default({
77
+ filters: args.filters,
78
+ })
79
+ : undefined;
78
80
  return deserialized;
79
81
  }
80
82
  /**
@@ -87,7 +89,7 @@ class ServerSideRenderer extends RendererType_1.default {
87
89
  */
88
90
  serializeResultsInWorker(results, args) {
89
91
  const html = (0, server_1.renderToString)(react_1.default.createElement(styles_1.ThemeProvider, { theme: (0, ui_1.createJBrowseTheme)(args.theme) }, results.reactElement));
90
- delete results.reactElement;
92
+ results.reactElement = undefined;
91
93
  return { ...results, html };
92
94
  }
93
95
  /**
@@ -101,7 +103,7 @@ class ServerSideRenderer extends RendererType_1.default {
101
103
  const results = (await rpcManager.call(args.sessionId, 'CoreRender', args));
102
104
  if (isSvgExport(results)) {
103
105
  results.html = await (0, util_1.getSerializedSvg)(results);
104
- delete results.reactElement;
106
+ results.reactElement = undefined;
105
107
  }
106
108
  return results;
107
109
  }
@@ -14,7 +14,6 @@ class SerializableFilterChain {
14
14
  throw new Error(`invalid inputFilter string "${inputFilter}"`);
15
15
  });
16
16
  }
17
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
17
  passes(...args) {
19
18
  for (const entry of this.filterChain) {
20
19
  if (
@@ -2,7 +2,7 @@ import PluginManager from '../PluginManager';
2
2
  import { AnyConfigurationModel } from '../configuration';
3
3
  export interface WorkerHandle {
4
4
  status?: string;
5
- error?: Error;
5
+ error?: unknown;
6
6
  on?: (channel: string, callback: (message: unknown) => void) => void;
7
7
  off?: (channel: string, callback: (message: unknown) => void) => void;
8
8
  destroy(): void;
@@ -12,7 +12,7 @@ function isClonable(thing) {
12
12
  // the worker times out
13
13
  async function watchWorker(worker, pingTime, rpcDriverClassName) {
14
14
  // after first ping succeeds, apply wait for timeout
15
- // eslint-disable-next-line no-constant-condition
15
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
16
16
  while (true) {
17
17
  await worker.call('ping', [], {
18
18
  timeout: pingTime * 2,
@@ -38,19 +38,17 @@ class LazyWorker {
38
38
  this.workerP = this.driver
39
39
  .makeWorker()
40
40
  .then(worker => {
41
- watchWorker(worker, this.driver.maxPingTime, this.driver.name).catch(error => {
42
- if (worker) {
43
- console.error('worker did not respond, killing and generating new one');
44
- console.error(error);
45
- worker.destroy();
46
- worker.status = 'killed';
47
- worker.error = error;
48
- this.workerP = undefined;
49
- }
41
+ watchWorker(worker, this.driver.maxPingTime, this.driver.name).catch((error) => {
42
+ console.error('worker did not respond, killing and generating new one');
43
+ console.error(error);
44
+ worker.destroy();
45
+ worker.status = 'killed';
46
+ worker.error = error;
47
+ this.workerP = undefined;
50
48
  });
51
49
  return worker;
52
50
  })
53
- .catch(e => {
51
+ .catch((e) => {
54
52
  this.workerP = undefined;
55
53
  throw e;
56
54
  });
@@ -133,6 +131,9 @@ class BaseRpcDriver {
133
131
  const unextendedWorker = await this.getWorker(sessionId);
134
132
  const worker = pluginManager.evaluateExtensionPoint('Core-extendWorker', unextendedWorker);
135
133
  const rpcMethod = pluginManager.getRpcMethodType(functionName);
134
+ if (!rpcMethod) {
135
+ throw new Error(`unknown RPC method ${functionName}`);
136
+ }
136
137
  const serializedArgs = await rpcMethod.serializeArguments(args, this.name);
137
138
  const filteredAndSerializedArgs = this.filterArgs(serializedArgs, sessionId);
138
139
  // now actually call the worker
@@ -2,7 +2,7 @@ import BaseRpcDriver, { RpcDriverConstructorArgs } from './BaseRpcDriver';
2
2
  import PluginManager from '../PluginManager';
3
3
  declare class DummyHandle {
4
4
  destroy(): void;
5
- call(_functionName: string, _filteredArgs?: {}, _options?: {}): Promise<unknown>;
5
+ call(_functionName: string, _filteredArgs?: Record<string, unknown>, _options?: {}): Promise<unknown>;
6
6
  }
7
7
  /**
8
8
  * Stub RPC driver class that runs RPC functions in-band in the main thread.
@@ -13,6 +13,6 @@ export default class MainThreadRpcDriver extends BaseRpcDriver {
13
13
  name: string;
14
14
  makeWorker: () => Promise<DummyHandle>;
15
15
  constructor(args: RpcDriverConstructorArgs);
16
- call(pm: PluginManager, sessionId: string, funcName: string, args: {}): Promise<unknown>;
16
+ call(pm: PluginManager, sessionId: string, funcName: string, args: Record<string, unknown>): Promise<unknown>;
17
17
  }
18
18
  export {};
@@ -26,6 +26,9 @@ class MainThreadRpcDriver extends BaseRpcDriver_1.default {
26
26
  throw new TypeError('sessionId is required');
27
27
  }
28
28
  const rpcMethod = pm.getRpcMethodType(funcName);
29
+ if (!rpcMethod) {
30
+ throw new Error(`unknown RPC method ${funcName}`);
31
+ }
29
32
  const serializedArgs = await rpcMethod.serializeArguments(args, this.name);
30
33
  const result = await rpcMethod.execute(serializedArgs, this.name);
31
34
  return rpcMethod.deserializeReturn(result, args, this.name);
@@ -29,6 +29,6 @@ export default class RpcManager {
29
29
  getDriverForCall(_sessionId: string, _functionName: string, args: {
30
30
  rpcDriverName?: string;
31
31
  }): Promise<DriverClass>;
32
- call(sessionId: string, functionName: string, args: {}, opts?: {}): Promise<unknown>;
32
+ call(sessionId: string, functionName: string, args: Record<string, unknown>, opts?: {}): Promise<unknown>;
33
33
  }
34
34
  export {};
package/rpc/RpcManager.js CHANGED
@@ -7,6 +7,7 @@ const configuration_1 = require("../configuration");
7
7
  const configSchema_1 = __importDefault(require("./configSchema"));
8
8
  const WebWorkerRpcDriver_1 = __importDefault(require("./WebWorkerRpcDriver"));
9
9
  const MainThreadRpcDriver_1 = __importDefault(require("./MainThreadRpcDriver"));
10
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
10
11
  const DriverClasses = {
11
12
  WebWorkerRpcDriver: WebWorkerRpcDriver_1.default,
12
13
  MainThreadRpcDriver: MainThreadRpcDriver_1.default,
@@ -16,9 +17,6 @@ class RpcManager {
16
17
  this.pluginManager = pluginManager;
17
18
  this.mainConfiguration = mainConfiguration;
18
19
  this.backendConfigurations = backendConfigurations;
19
- if (!mainConfiguration) {
20
- throw new Error('RpcManager requires at least a main configuration');
21
- }
22
20
  this.driverObjects = new Map();
23
21
  }
24
22
  getDriver(backendName) {
@@ -26,30 +24,35 @@ class RpcManager {
26
24
  if (driver) {
27
25
  return driver;
28
26
  }
29
- let newDriver;
30
27
  const config = this.mainConfiguration.drivers.get('WebWorkerRpcDriver');
31
28
  if (backendName === 'MainThreadRpcDriver') {
32
29
  const backendConfiguration = this.backendConfigurations.MainThreadRpcDriver;
33
30
  if (!backendConfiguration) {
34
31
  throw new Error(`requested RPC driver "${backendName}" is missing config`);
35
32
  }
36
- newDriver = new MainThreadRpcDriver_1.default({ ...backendConfiguration, config });
33
+ const newDriver = new MainThreadRpcDriver_1.default({
34
+ ...backendConfiguration,
35
+ config,
36
+ });
37
+ this.driverObjects.set(backendName, newDriver);
38
+ return newDriver;
37
39
  }
40
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
38
41
  else if (backendName === 'WebWorkerRpcDriver') {
39
42
  const backendConfiguration = this.backendConfigurations.WebWorkerRpcDriver;
40
43
  if (!backendConfiguration) {
41
44
  throw new Error(`requested RPC driver "${backendName}" is missing config`);
42
45
  }
43
- newDriver = new WebWorkerRpcDriver_1.default({ ...backendConfiguration, config }, {
46
+ const newDriver = new WebWorkerRpcDriver_1.default({ ...backendConfiguration, config }, {
44
47
  plugins: this.pluginManager.runtimePluginDefinitions,
45
48
  windowHref: window.location.href,
46
49
  });
50
+ this.driverObjects.set(backendName, newDriver);
51
+ return newDriver;
47
52
  }
48
53
  else {
49
54
  throw new Error(`requested RPC driver "${backendName}" is not installed`);
50
55
  }
51
- this.driverObjects.set(backendName, newDriver);
52
- return newDriver;
53
56
  }
54
57
  async getDriverForCall(_sessionId, _functionName, args) {
55
58
  const backendName = args.rpcDriverName ||
@@ -28,7 +28,6 @@ exports.default = (0, configuration_1.ConfigurationSchema)('RpcOptions', {
28
28
  WebWorkerRpcDriver: { type: 'WebWorkerRpcDriver' },
29
29
  }),
30
30
  }, {
31
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
31
  actions: (self) => ({
33
32
  addDriverConfig(configName, configSnapshot) {
34
33
  self.drivers.set(configName, configSnapshot);
@@ -7,6 +7,6 @@ import RpcMethodType from '../../pluggableElementTypes/RpcMethodType';
7
7
  */
8
8
  export default class CoreFreeResources extends RpcMethodType {
9
9
  name: string;
10
- execute(specification: {}): Promise<number>;
11
- serializeArguments(args: {}, _rpcDriver: string): Promise<{}>;
10
+ execute(specification: Record<string, unknown>): Promise<number>;
11
+ serializeArguments(args: Record<string, unknown>, _rpcDriver: string): Promise<Record<string, unknown>>;
12
12
  }
@@ -7,9 +7,9 @@ export default class CoreGetFeatureDensityStats extends RpcMethodType {
7
7
  serializeArguments(args: RenderArgs & {
8
8
  signal?: AbortSignal;
9
9
  statusCallback?: (arg: string) => void;
10
- }, rpcDriver: string): Promise<{}>;
10
+ }, rpcDriver: string): Promise<Record<string, unknown>>;
11
11
  execute(args: {
12
- adapterConfig: {};
12
+ adapterConfig: Record<string, unknown>;
13
13
  regions: Region[];
14
14
  signal?: RemoteAbortSignal;
15
15
  headers?: Record<string, string>;
@@ -7,7 +7,7 @@ import { RenderArgsSerialized } from './util';
7
7
  */
8
8
  export default class CoreGetFeatureDetails extends RpcMethodType {
9
9
  name: string;
10
- serializeArguments(args: RenderArgs, rpcDriver: string): Promise<import("../../pluggableElementTypes/renderers/ServerSideRendererType").RenderArgsSerialized | RenderArgs>;
10
+ serializeArguments(args: RenderArgs, rpcDriver: string): Promise<any>;
11
11
  execute(args: RenderArgsSerialized & {
12
12
  signal?: RemoteAbortSignal;
13
13
  }, rpcDriver: string): Promise<{
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const RpcMethodType_1 = __importDefault(require("../../pluggableElementTypes/RpcMethodType"));
7
7
  const util_1 = require("../../util");
8
- const util_2 = require("./util");
9
8
  /**
10
9
  * fetches features from an adapter and call a renderer with them
11
10
  */
@@ -23,7 +22,8 @@ class CoreGetFeatureDetails extends RpcMethodType_1.default {
23
22
  return superArgs;
24
23
  }
25
24
  const { rendererType } = args;
26
- const RendererType = (0, util_2.validateRendererType)(rendererType, this.pluginManager.getRendererType(rendererType));
25
+ const RendererType = this.pluginManager.getRendererType(rendererType);
26
+ // @ts-expect-error
27
27
  return RendererType.serializeArgsInClient(superArgs);
28
28
  }
29
29
  async execute(args, rpcDriver) {
@@ -33,7 +33,7 @@ class CoreGetFeatureDetails extends RpcMethodType_1.default {
33
33
  deserializedArgs = await this.deserializeArguments(args, rpcDriver);
34
34
  }
35
35
  const { rendererType, featureId } = deserializedArgs;
36
- const RendererType = (0, util_2.validateRendererType)(rendererType, this.pluginManager.getRendererType(rendererType));
36
+ const RendererType = this.pluginManager.getRendererType(rendererType);
37
37
  return {
38
38
  // @ts-expect-error
39
39
  feature: (_b = (_a = RendererType.sessions[(0, util_1.getLayoutId)(args)]) === null || _a === void 0 ? void 0 : _a.cachedLayout.layout.getDataByID(featureId)) === null || _b === void 0 ? void 0 : _b.toJSON(),