@jbrowse/core 2.1.7 → 2.2.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 (104) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail.d.ts +3 -2
  2. package/BaseFeatureWidget/BaseFeatureDetail.js +43 -28
  3. package/BaseFeatureWidget/SequenceBox.js +4 -8
  4. package/BaseFeatureWidget/SequenceFeatureDetails.js +2 -1
  5. package/Plugin.d.ts +1 -1
  6. package/PluginLoader.d.ts +2 -2
  7. package/PluginManager.d.ts +6 -6
  8. package/ReExports/modules.d.ts +3 -3
  9. package/assemblyManager/assembly.d.ts +23 -17
  10. package/assemblyManager/assembly.js +75 -76
  11. package/assemblyManager/assemblyConfigSchema.d.ts +6 -2
  12. package/assemblyManager/assemblyConfigSchema.js +39 -2
  13. package/assemblyManager/assemblyManager.d.ts +76 -214
  14. package/assemblyManager/assemblyManager.js +17 -39
  15. package/configuration/configurationSchema.d.ts +2 -2
  16. package/data_adapters/BaseAdapter.d.ts +2 -2
  17. package/data_adapters/CytobandAdapter.js +7 -0
  18. package/data_adapters/dataAdapterCache.d.ts +1 -1
  19. package/package.json +2 -2
  20. package/pluggableElementTypes/AdapterType.d.ts +1 -1
  21. package/pluggableElementTypes/AddTrackWorkflowType.d.ts +2 -2
  22. package/pluggableElementTypes/RpcMethodType.d.ts +1 -1
  23. package/pluggableElementTypes/ViewType.d.ts +2 -2
  24. package/pluggableElementTypes/index.d.ts +2 -2
  25. package/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +23 -2
  26. package/pluggableElementTypes/models/BaseConnectionModelFactory.js +24 -2
  27. package/pluggableElementTypes/models/BaseDisplayModel.d.ts +62 -3
  28. package/pluggableElementTypes/models/BaseDisplayModel.js +138 -92
  29. package/pluggableElementTypes/models/BaseTrackModel.d.ts +49 -4
  30. package/pluggableElementTypes/models/BaseTrackModel.js +77 -26
  31. package/pluggableElementTypes/models/BaseViewModel.d.ts +22 -0
  32. package/pluggableElementTypes/models/BaseViewModel.js +41 -2
  33. package/pluggableElementTypes/models/InternetAccountModel.d.ts +53 -6
  34. package/pluggableElementTypes/models/InternetAccountModel.js +57 -6
  35. package/pluggableElementTypes/models/baseConnectionConfig.js +17 -1
  36. package/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +2 -2
  37. package/pluggableElementTypes/models/baseInternetAccountConfig.js +27 -1
  38. package/pluggableElementTypes/models/baseTrackConfig.d.ts +5 -2
  39. package/pluggableElementTypes/models/baseTrackConfig.js +52 -1
  40. package/pluggableElementTypes/renderers/BoxRendererType.d.ts +2 -2
  41. package/pluggableElementTypes/renderers/BoxRendererType.js +2 -0
  42. package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.d.ts +1 -1
  43. package/pluggableElementTypes/renderers/RendererType.d.ts +1 -1
  44. package/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +1 -1
  45. package/pluggableElementTypes/renderers/util/serializableFilterChain.d.ts +2 -2
  46. package/rpc/MainThreadRpcDriver.d.ts +1 -1
  47. package/rpc/MainThreadRpcDriver.js +2 -2
  48. package/rpc/RpcManager.d.ts +2 -2
  49. package/rpc/WebWorkerRpcDriver.d.ts +5 -4
  50. package/rpc/WebWorkerRpcDriver.js +2 -2
  51. package/rpc/baseRpcConfig.d.ts +2 -0
  52. package/rpc/baseRpcConfig.js +18 -0
  53. package/rpc/configSchema.js +16 -10
  54. package/rpc/coreRpcMethods.d.ts +14 -14
  55. package/rpc/coreRpcMethods.js +60 -63
  56. package/rpc/mainThreadRpcConfig.d.ts +2 -0
  57. package/rpc/mainThreadRpcConfig.js +19 -0
  58. package/rpc/remoteAbortSignals.d.ts +1 -1
  59. package/rpc/webWorkerRpcConfig.d.ts +2 -0
  60. package/rpc/webWorkerRpcConfig.js +19 -0
  61. package/tsconfig.build.tsbuildinfo +1 -1
  62. package/ui/AboutDialog.js +2 -1
  63. package/ui/App.d.ts +2 -2
  64. package/ui/App.js +11 -10
  65. package/ui/AssemblySelector.d.ts +1 -1
  66. package/ui/AssemblySelector.js +12 -10
  67. package/ui/DrawerWidget.js +2 -1
  68. package/ui/EditableTypography.d.ts +4 -4
  69. package/ui/EditableTypography.js +7 -11
  70. package/ui/LoadingEllipses.d.ts +7 -0
  71. package/ui/LoadingEllipses.js +38 -0
  72. package/ui/Logo.d.ts +1 -1
  73. package/ui/Menu.d.ts +2 -2
  74. package/ui/Snackbar.d.ts +1 -1
  75. package/ui/ViewContainer.d.ts +2 -1
  76. package/ui/ViewContainer.js +34 -22
  77. package/ui/index.d.ts +1 -0
  78. package/ui/index.js +3 -1
  79. package/util/Base1DUtils.js +9 -3
  80. package/util/Base1DViewModel.d.ts +72 -2
  81. package/util/Base1DViewModel.js +94 -3
  82. package/util/blockTypes.d.ts +1 -1
  83. package/util/calculateDynamicBlocks.js +1 -1
  84. package/util/calculateStaticBlocks.js +1 -1
  85. package/util/index.d.ts +3 -1
  86. package/util/index.js +19 -9
  87. package/util/io/RemoteFileWithRangeCache.d.ts +1 -2
  88. package/util/io/RemoteFileWithRangeCache.js +2 -2
  89. package/util/io/index.js +3 -3
  90. package/util/jexl.d.ts +1 -1
  91. package/util/layouts/BaseLayout.d.ts +1 -1
  92. package/util/layouts/GranularRectLayout.d.ts +7 -2
  93. package/util/layouts/GranularRectLayout.js +29 -45
  94. package/util/layouts/MultiLayout.d.ts +2 -2
  95. package/util/layouts/MultiLayout.js +4 -6
  96. package/util/offscreenCanvasPonyfill.d.ts +2 -2
  97. package/util/offscreenCanvasUtils.d.ts +1 -1
  98. package/util/simpleFeature.d.ts +3 -0
  99. package/util/stats.d.ts +26 -0
  100. package/util/stats.js +9 -9
  101. package/util/tracks.d.ts +2 -2
  102. package/util/types/index.d.ts +15 -8
  103. package/util/types/index.js +8 -1
  104. package/util/types/util.d.ts +5 -5
@@ -10,8 +10,8 @@ export declare const useStyles: (params: void, styleOverrides?: {
10
10
  } | undefined) => {
11
11
  classes: Record<"expansionPanelDetails" | "expandIcon" | "field" | "fieldDescription" | "fieldName" | "fieldValue" | "fieldSubvalue", string>;
12
12
  theme: import("@mui/material").Theme;
13
- css: import("tss-react/types").Css;
14
- cx: import("tss-react/types").Cx;
13
+ css: import("tss-react").Css;
14
+ cx: import("tss-react").Cx;
15
15
  };
16
16
  export declare function BaseCard({ children, title, defaultExpanded, }: BaseCardProps): JSX.Element;
17
17
  export declare const FieldName: ({ description, name, width, prefix, }: {
@@ -34,6 +34,7 @@ export declare const BaseCoreDetails: (props: BaseProps) => JSX.Element;
34
34
  interface AttributeProps {
35
35
  attributes: Record<string, any>;
36
36
  omit?: string[];
37
+ omitSingleLevel?: string[];
37
38
  formatter?: (val: unknown, key: string) => React.ReactNode;
38
39
  descriptions?: Record<string, React.ReactNode>;
39
40
  prefix?: string[];
@@ -156,35 +156,41 @@ const ArrayValue = ({ name, value, description, prefix = [], }) => {
156
156
  }
157
157
  };
158
158
  const toLocale = (n) => n.toLocaleString('en-US');
159
- function CoreDetails(props) {
159
+ function Position(props) {
160
160
  const { feature } = props;
161
- const obj = feature;
162
- // eslint-disable-next-line no-underscore-dangle
163
- const formattedFeat = { ...obj, ...obj.__jbrowsefmt };
164
- const { start, strand, end, refName } = formattedFeat;
161
+ const strand = feature.strand;
165
162
  const strandMap = {
166
163
  '-1': '-',
167
164
  '0': '',
168
165
  '1': '+',
169
166
  };
170
167
  const str = strandMap[strand] ? `(${strandMap[strand]})` : '';
168
+ // @ts-ignore
169
+ const loc = (0, util_1.assembleLocString)(feature);
170
+ return react_1.default.createElement(react_1.default.Fragment, null, `${loc} ${str}`);
171
+ }
172
+ function CoreDetails(props) {
173
+ const { feature } = props;
174
+ const obj = feature;
175
+ // eslint-disable-next-line no-underscore-dangle
176
+ const formattedFeat = { ...obj, ...obj.__jbrowsefmt };
177
+ const { start, end } = formattedFeat;
171
178
  const displayedDetails = {
172
179
  ...formattedFeat,
173
180
  length: toLocale(end - start),
174
- position: `${refName}:${toLocale(start + 1)}..${toLocale(end)} ${str}`,
175
181
  };
176
182
  const coreRenderedDetails = {
177
- position: 'Position',
178
183
  description: 'Description',
179
184
  name: 'Name',
180
185
  length: 'Length',
181
186
  type: 'Type',
182
- assemblyName: 'Assembly name',
183
187
  };
184
- return (react_1.default.createElement(react_1.default.Fragment, null, Object.entries(coreRenderedDetails)
185
- .map(([key, name]) => [name, displayedDetails[key]])
186
- .filter(([, value]) => value !== null && value !== undefined)
187
- .map(([name, value]) => (react_1.default.createElement(exports.SimpleValue, { key: name, name: name, value: value })))));
188
+ return (react_1.default.createElement(react_1.default.Fragment, null,
189
+ react_1.default.createElement(exports.SimpleValue, { name: "Position", value: react_1.default.createElement(Position, { ...props, feature: formattedFeat }) }),
190
+ Object.entries(coreRenderedDetails)
191
+ .map(([key, name]) => [name, displayedDetails[key]])
192
+ .filter(([, value]) => value != null)
193
+ .map(([name, value]) => (react_1.default.createElement(exports.SimpleValue, { key: name, name: name, value: value })))));
188
194
  }
189
195
  const BaseCoreDetails = (props) => {
190
196
  return (react_1.default.createElement(BaseCard, { ...props, title: "Primary data" },
@@ -229,23 +235,25 @@ const DataGridDetails = ({ value, prefix, name, }) => {
229
235
  width: (0, util_1.measureGridWidth)(rows.map(r => r[val])),
230
236
  }));
231
237
  const rowHeight = 25;
232
- const hideFooter = rows.length < 100;
233
- const headerHeight = 80;
238
+ const hideFoot = rows.length < 100;
239
+ const headHeight = 80;
240
+ const height = Math.min(rows.length, 100) * rowHeight + headHeight + (hideFoot ? 0 : 50);
234
241
  // disableSelection on click helps avoid
235
242
  // https://github.com/mui-org/material-ui-x/issues/1197
236
243
  return (react_1.default.createElement(react_1.default.Fragment, null,
237
244
  react_1.default.createElement(exports.FieldName, { prefix: prefix, name: name }),
238
245
  react_1.default.createElement("div", { style: {
239
- height: Math.min(rows.length, 100) * rowHeight +
240
- headerHeight +
241
- (hideFooter ? 0 : 50),
246
+ height,
242
247
  width: '100%',
243
248
  } },
244
- react_1.default.createElement(x_data_grid_1.DataGrid, { disableSelectionOnClick: true, rowHeight: rowHeight, rows: rows, rowsPerPageOptions: [], hideFooterSelectedRowCount: true, columns: columns, hideFooter: hideFooter }))));
249
+ react_1.default.createElement(x_data_grid_1.DataGrid, { disableSelectionOnClick: true, rowHeight: rowHeight, rows: rows, hideFooterSelectedRowCount: true, columns: columns, hideFooter: hideFoot }))));
245
250
  }
246
251
  return null;
247
252
  };
248
- // arr = ['a','b'], obj = {a:{b:'hello}}, returns hello (with special addition to grab description also)
253
+ // pick using a path from an object, similar to _.get from lodash with special logic
254
+ // for Descriptions from e.g. VCF headers
255
+ // @param arr example ['a','b'], obj = {a:{b:'hello}}
256
+ // @returns hello (with special addition to grab description also)
249
257
  function accessNested(arr, obj = {}) {
250
258
  arr.forEach(elt => {
251
259
  if (obj) {
@@ -259,13 +267,11 @@ function accessNested(arr, obj = {}) {
259
267
  : undefined;
260
268
  }
261
269
  function generateMaxWidth(array, prefix) {
262
- // @ts-ignore
263
270
  const arr = [];
264
- array.forEach((key, value) => {
271
+ array.forEach(key => {
265
272
  const val = [...prefix, key[0]].join('.');
266
273
  arr.push((0, util_1.measureText)(val, 12));
267
274
  });
268
- // @ts-ignore
269
275
  return Math.ceil(Math.max(...arr)) + 10;
270
276
  }
271
277
  function UriAttribute({ value, prefix, name, }) {
@@ -283,8 +289,8 @@ function UriAttribute({ value, prefix, name, }) {
283
289
  react_1.default.createElement(exports.BasicValue, { value: href })));
284
290
  }
285
291
  function Attributes(props) {
286
- const { attributes, omit = [], descriptions, formatter = val => val, hideUris, prefix = [], } = props;
287
- const omits = [...omit, ...globalOmit];
292
+ const { attributes, omit = [], omitSingleLevel = [], descriptions, formatter = val => val, hideUris, prefix = [], } = props;
293
+ const omits = [...omit, ...globalOmit, ...omitSingleLevel];
288
294
  const { __jbrowsefmt, ...rest } = attributes;
289
295
  const formattedAttributes = { ...rest, ...__jbrowsefmt };
290
296
  const maxLabelWidth = generateMaxWidth(Object.entries(formattedAttributes).filter(([k, v]) => v !== undefined && !omits.includes(k)), prefix);
@@ -298,7 +304,8 @@ function Attributes(props) {
298
304
  return value.length > 1 && value.every(val => (0, is_object_1.default)(val)) ? (react_1.default.createElement(DataGridDetails, { key: key, name: key, prefix: prefix, value: value })) : (react_1.default.createElement(ArrayValue, { key: key, name: key, value: value, description: description, prefix: prefix }));
299
305
  }
300
306
  else if ((0, is_object_1.default)(value)) {
301
- return (0, util_1.isUriLocation)(value) ? (hideUris ? null : (react_1.default.createElement(UriAttribute, { key: key, name: key, prefix: prefix, value: value }))) : (react_1.default.createElement(Attributes, { ...props, omit: omits, key: key, attributes: value, descriptions: descriptions, prefix: [...prefix, key] }));
307
+ const { omitSingleLevel, ...rest } = props;
308
+ return (0, util_1.isUriLocation)(value) ? (hideUris ? null : (react_1.default.createElement(UriAttribute, { key: key, name: key, prefix: prefix, value: value }))) : (react_1.default.createElement(Attributes, { ...rest, key: key, attributes: value, descriptions: descriptions, prefix: [...prefix, key] }));
302
309
  }
303
310
  else {
304
311
  return (react_1.default.createElement(exports.SimpleValue, { key: key, name: key, value: formatter(value, key), description: description, prefix: prefix, width: Math.min(maxLabelWidth, MAX_FIELD_NAME_WIDTH) }));
@@ -323,15 +330,23 @@ function generateTitle(name, id, type) {
323
330
  const FeatureDetails = (props) => {
324
331
  const { omit = [], model, feature, depth = 0 } = props;
325
332
  const { name = '', id = '', type = '', subfeatures } = feature;
326
- const { pluginManager } = (0, util_1.getEnv)(model);
333
+ const pm = (0, util_1.getEnv)(model).pluginManager;
327
334
  const session = (0, util_1.getSession)(model);
328
- const ExtraPanel = pluginManager === null || pluginManager === void 0 ? void 0 : pluginManager.evaluateExtensionPoint('Core-extraFeaturePanel', null, { session, feature, model });
335
+ const ExtraPanel = pm.evaluateExtensionPoint('Core-extraFeaturePanel', null, {
336
+ session,
337
+ feature,
338
+ model,
339
+ });
329
340
  return (react_1.default.createElement(BaseCard, { title: generateTitle(name, id, type) },
330
341
  react_1.default.createElement(material_1.Typography, null, "Core details"),
331
342
  react_1.default.createElement(CoreDetails, { ...props }),
343
+ feature.mate ? (react_1.default.createElement(react_1.default.Fragment, null,
344
+ react_1.default.createElement(material_1.Divider, null),
345
+ react_1.default.createElement(material_1.Typography, null, "Mate details"),
346
+ react_1.default.createElement(CoreDetails, { ...props, feature: feature.mate }))) : null,
332
347
  react_1.default.createElement(material_1.Divider, null),
333
348
  react_1.default.createElement(material_1.Typography, null, "Attributes"),
334
- react_1.default.createElement(Attributes, { attributes: feature, ...props, omit: [...omit, ...coreDetails] }),
349
+ react_1.default.createElement(Attributes, { attributes: feature, ...props, omit: omit, omitSingleLevel: coreDetails }),
335
350
  react_1.default.createElement(react_error_boundary_1.ErrorBoundary, { FallbackComponent: ({ error }) => react_1.default.createElement(ui_1.ErrorMessage, { error: error }) },
336
351
  react_1.default.createElement(SequenceFeatureDetails_1.default, { ...props })),
337
352
  ExtraPanel ? (react_1.default.createElement(react_1.default.Fragment, null,
@@ -29,21 +29,17 @@ function GeneProtein({ cds, sequence, codonTable, }) {
29
29
  }
30
30
  exports.GeneProtein = GeneProtein;
31
31
  function GenecDNA({ utr, cds, exons, sequence, upstream, downstream, includeIntrons, collapseIntron, intronBp, }) {
32
- const chunks = cds.length
33
- ? [...cds, ...utr].sort((a, b) => a.start - b.start)
34
- : exons;
32
+ const chunks = (cds.length ? [...cds, ...utr].sort((a, b) => a.start - b.start) : exons).filter(f => f.start !== f.end);
35
33
  return (react_1.default.createElement(react_1.default.Fragment, null,
36
34
  upstream ? (react_1.default.createElement("span", { style: { background: updownstreamColor } }, upstream)) : null,
37
- chunks
38
- .filter(f => f.start !== f.end)
39
- .map((chunk, index) => {
35
+ chunks.map((chunk, idx) => {
40
36
  var _a;
41
- const intron = sequence.slice(chunk.end, (_a = chunks[index + 1]) === null || _a === void 0 ? void 0 : _a.start);
37
+ const intron = sequence.slice(chunk.end, (_a = chunks[idx + 1]) === null || _a === void 0 ? void 0 : _a.start);
42
38
  return (react_1.default.createElement(react_1.default.Fragment, { key: JSON.stringify(chunk) },
43
39
  react_1.default.createElement("span", { style: {
44
40
  background: chunk.type === 'CDS' ? cdsColor : utrColor,
45
41
  } }, sequence.slice(chunk.start, chunk.end)),
46
- includeIntrons && index < chunks.length - 1 ? (react_1.default.createElement("span", { style: { background: intronColor } }, collapseIntron && intron.length > intronBp * 2
42
+ includeIntrons && idx < chunks.length - 1 ? (react_1.default.createElement("span", { style: { background: intronColor } }, collapseIntron && intron.length > intronBp * 2
47
43
  ? `${intron.slice(0, intronBp)}...${intron.slice(-intronBp)}`
48
44
  : intron)) : null));
49
45
  }),
@@ -36,6 +36,7 @@ const SequenceHelpDialog_1 = __importDefault(require("./SequenceHelpDialog"));
36
36
  const SequencePanel_1 = __importDefault(require("./SequencePanel"));
37
37
  const util_1 = require("../util");
38
38
  const configuration_1 = require("../configuration");
39
+ const ui_1 = require("../ui");
39
40
  // icons
40
41
  const Settings_1 = __importDefault(require("@mui/icons-material/Settings"));
41
42
  const Help_1 = __importDefault(require("@mui/icons-material/Help"));
@@ -201,7 +202,7 @@ function SequenceFeatureDetails({ model, feature }) {
201
202
  react_1.default.createElement(material_1.IconButton, { onClick: () => setSettingsDlgOpen(true) },
202
203
  react_1.default.createElement(Settings_1.default, null))),
203
204
  react_1.default.createElement("br", null),
204
- react_1.default.createElement(react_1.default.Fragment, null, error ? (react_1.default.createElement(material_1.Typography, { color: "error" }, `${error}`)) : loading ? (react_1.default.createElement(material_1.Typography, null, "Loading gene sequence...")) : sequence ? ('error' in sequence ? (react_1.default.createElement(react_1.default.Fragment, null,
205
+ react_1.default.createElement(react_1.default.Fragment, null, error ? (react_1.default.createElement(material_1.Typography, { color: "error" }, `${error}`)) : loading ? (react_1.default.createElement(ui_1.LoadingEllipses, null)) : sequence ? ('error' in sequence ? (react_1.default.createElement(react_1.default.Fragment, null,
205
206
  react_1.default.createElement(material_1.Typography, { color: "error" }, sequence.error),
206
207
  react_1.default.createElement(material_1.Button, { variant: "contained", color: "inherit", onClick: () => setForceLoad({ ...forceLoad, force: true }) }, "Force load"))) : (react_1.default.createElement(SequencePanel_1.default, { ref: seqPanelRef, feature: parentFeature, mode: mode, sequence: sequence, intronBp: intronBp }))) : (react_1.default.createElement(material_1.Typography, null, "No sequence found"))))) : null,
207
208
  settingsDlgOpen ? (react_1.default.createElement(SequenceFeatureSettingsDialog_1.default, { handleClose: arg => {
package/Plugin.d.ts CHANGED
@@ -11,4 +11,4 @@ export default abstract class Plugin {
11
11
  configure(_pluginManager: PluginManager): void;
12
12
  configurationSchema: AnyConfigurationSchemaType | undefined;
13
13
  }
14
- export declare type PluginConstructor = new (...args: unknown[]) => Plugin;
14
+ export type PluginConstructor = new (...args: unknown[]) => Plugin;
package/PluginLoader.d.ts CHANGED
@@ -14,7 +14,7 @@ export interface LegacyUMDPluginDefinition {
14
14
  url: string;
15
15
  name: string;
16
16
  }
17
- declare type UMDPluginDefinition = UMDLocPluginDefinition | UMDUrlPluginDefinition;
17
+ type UMDPluginDefinition = UMDLocPluginDefinition | UMDUrlPluginDefinition;
18
18
  export declare function isUMDPluginDefinition(def: PluginDefinition): def is UMDPluginDefinition | LegacyUMDPluginDefinition;
19
19
  export interface ESMLocPluginDefinition {
20
20
  esmLoc: {
@@ -25,7 +25,7 @@ export interface ESMLocPluginDefinition {
25
25
  export interface ESMUrlPluginDefinition {
26
26
  esmUrl: string;
27
27
  }
28
- export declare type ESMPluginDefinition = ESMLocPluginDefinition | ESMUrlPluginDefinition;
28
+ export type ESMPluginDefinition = ESMLocPluginDefinition | ESMUrlPluginDefinition;
29
29
  export declare function isESMPluginDefinition(def: PluginDefinition): def is ESMPluginDefinition;
30
30
  export interface CJSPluginDefinition {
31
31
  cjsUrl: string;
@@ -26,7 +26,7 @@ declare class PhasedScheduler<PhaseName extends string> {
26
26
  add(phase: PhaseName, callback: Function): void;
27
27
  run(): void;
28
28
  }
29
- declare type PluggableElementTypeGroup = 'renderer' | 'adapter' | 'display' | 'track' | 'connection' | 'view' | 'widget' | 'rpc method' | 'internet account' | 'text search adapter' | 'add track workflow';
29
+ type PluggableElementTypeGroup = 'renderer' | 'adapter' | 'display' | 'track' | 'connection' | 'view' | 'widget' | 'rpc method' | 'internet account' | 'text search adapter' | 'add track workflow';
30
30
  /** internal class that holds the info for a certain element type */
31
31
  declare class TypeRecord<ElementClass extends PluggableElementBase> {
32
32
  typeName: string;
@@ -48,7 +48,7 @@ declare class TypeRecord<ElementClass extends PluggableElementBase> {
48
48
  get(name: string): ElementClass;
49
49
  all(): ElementClass[];
50
50
  }
51
- declare type AnyFunction = (...args: any) => any;
51
+ type AnyFunction = (...args: any) => any;
52
52
  /**
53
53
  * free-form string-to-unknown mapping of metadata related to the instance
54
54
  * of this plugin. `isCore` is typically set to `Boolean(true)` if the plugin was
@@ -56,7 +56,7 @@ declare type AnyFunction = (...args: any) => any;
56
56
  * Can also use this metadata to stash other things about why the plugin is
57
57
  * loaded, such as where it came from, what plugin depends on it, etc.
58
58
  */
59
- export declare type PluginMetadata = Record<string, unknown>;
59
+ export type PluginMetadata = Record<string, unknown>;
60
60
  export interface PluginLoadRecord {
61
61
  metadata?: PluginMetadata;
62
62
  plugin: Plugin;
@@ -223,7 +223,7 @@ export default class PluginManager {
223
223
  makeStyles: <Params = void, RuleNameSubsetReferencableInNestedSelectors extends string = never>(params?: {
224
224
  name?: string | Record<string, unknown> | undefined;
225
225
  uniqId?: string | undefined;
226
- } | undefined) => <RuleName extends string>(cssObjectByRuleNameOrGetCssObjectByRuleName: Record<RuleName, import("tss-react/types").CSSObject> | ((theme: import("@mui/material").Theme, params: Params, classes: Record<RuleNameSubsetReferencableInNestedSelectors, string>) => Record<RuleNameSubsetReferencableInNestedSelectors | RuleName, import("tss-react/types").CSSObject>)) => (params: Params, styleOverrides?: {
226
+ } | undefined) => <RuleName extends string>(cssObjectByRuleNameOrGetCssObjectByRuleName: Record<RuleName, import("tss-react").CSSObject> | ((theme: import("@mui/material").Theme, params: Params, classes: Record<RuleNameSubsetReferencableInNestedSelectors, string>) => Record<RuleNameSubsetReferencableInNestedSelectors | RuleName, import("tss-react").CSSObject>)) => (params: Params, styleOverrides?: {
227
227
  props: {
228
228
  classes?: Record<string, string> | undefined;
229
229
  } & Record<string, unknown>;
@@ -231,8 +231,8 @@ export default class PluginManager {
231
231
  } | undefined) => {
232
232
  classes: Record<RuleName, string>;
233
233
  theme: import("@mui/material").Theme;
234
- css: import("tss-react/types").Css;
235
- cx: import("tss-react/types").Cx;
234
+ css: import("tss-react").Css;
235
+ cx: import("tss-react").Cx;
236
236
  };
237
237
  };
238
238
  '@material-ui/core': {
@@ -144,7 +144,7 @@ declare const libs: {
144
144
  makeStyles: <Params = void, RuleNameSubsetReferencableInNestedSelectors extends string = never>(params?: {
145
145
  name?: string | Record<string, unknown> | undefined;
146
146
  uniqId?: string | undefined;
147
- } | undefined) => <RuleName extends string>(cssObjectByRuleNameOrGetCssObjectByRuleName: Record<RuleName, import("tss-react/types").CSSObject> | ((theme: MUIStyles.Theme, params: Params, classes: Record<RuleNameSubsetReferencableInNestedSelectors, string>) => Record<RuleNameSubsetReferencableInNestedSelectors | RuleName, import("tss-react/types").CSSObject>)) => (params: Params, styleOverrides?: {
147
+ } | undefined) => <RuleName extends string>(cssObjectByRuleNameOrGetCssObjectByRuleName: Record<RuleName, import("tss-react").CSSObject> | ((theme: MUIStyles.Theme, params: Params, classes: Record<RuleNameSubsetReferencableInNestedSelectors, string>) => Record<RuleNameSubsetReferencableInNestedSelectors | RuleName, import("tss-react").CSSObject>)) => (params: Params, styleOverrides?: {
148
148
  props: {
149
149
  classes?: Record<string, string> | undefined;
150
150
  } & Record<string, unknown>;
@@ -152,8 +152,8 @@ declare const libs: {
152
152
  } | undefined) => {
153
153
  classes: Record<RuleName, string>;
154
154
  theme: MUIStyles.Theme;
155
- css: import("tss-react/types").Css;
156
- cx: import("tss-react/types").Cx;
155
+ css: import("tss-react").Css;
156
+ cx: import("tss-react").Cx;
157
157
  };
158
158
  };
159
159
  '@material-ui/core': {
@@ -1,7 +1,7 @@
1
1
  import { Instance, IAnyType } from 'mobx-state-tree';
2
2
  import PluginManager from '../PluginManager';
3
3
  import { Region, Feature } from '../util';
4
- declare type RefNameAliases = Record<string, string>;
4
+ type RefNameAliases = Record<string, string>;
5
5
  export interface BaseOptions {
6
6
  signal?: AbortSignal;
7
7
  sessionId: string;
@@ -17,44 +17,50 @@ export interface BasicRegion {
17
17
  refName: string;
18
18
  assemblyName: string;
19
19
  }
20
- export default function assemblyFactory(assemblyConfigType: IAnyType, pluginManager: PluginManager): import("mobx-state-tree").IModelType<{
20
+ export interface Loading {
21
+ adapterRegionsWithAssembly: Region[];
22
+ refNameAliases: RefNameAliases;
23
+ lowerCaseRefNameAliases: RefNameAliases;
24
+ cytobands: Feature[];
25
+ }
26
+ export default function assemblyFactory(assemblyConfigType: IAnyType, pm: PluginManager): import("mobx-state-tree").IModelType<{
21
27
  configuration: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<IAnyType>>;
22
28
  }, {
23
- error: Error | undefined;
24
- regions: BasicRegion[] | undefined;
29
+ error: unknown;
30
+ loaded: boolean;
31
+ loadingP: Promise<void> | undefined;
32
+ volatileRegions: BasicRegion[] | undefined;
25
33
  refNameAliases: RefNameAliases | undefined;
26
34
  lowerCaseRefNameAliases: RefNameAliases | undefined;
27
35
  cytobands: Feature[] | undefined;
28
36
  } & {
29
37
  readonly initialized: boolean;
30
38
  readonly name: string;
39
+ readonly regions: BasicRegion[] | undefined;
31
40
  readonly aliases: string[];
32
41
  readonly displayName: string | undefined;
33
42
  hasName(name: string): boolean;
34
43
  readonly allAliases: string[];
35
- readonly refNames: string[] | undefined;
36
44
  readonly allRefNames: string[] | undefined;
37
45
  readonly lowerCaseRefNames: string[] | undefined;
38
46
  readonly allRefNamesWithLowerCase: string[] | undefined;
39
47
  readonly rpcManager: any;
40
48
  readonly refNameColors: string[];
49
+ } & {
50
+ readonly refNames: string[] | undefined;
41
51
  } & {
42
52
  getCanonicalRefName(refName: string): string;
43
53
  getRefNameColor(refName: string): string | undefined;
44
54
  isValidRefName(refName: string): boolean;
45
55
  } & {
46
- setLoading(): void;
47
- setLoaded({ adapterRegionsWithAssembly, refNameAliases, lowerCaseRefNameAliases, cytobands, }: {
48
- adapterRegionsWithAssembly: Region[];
49
- refNameAliases: RefNameAliases;
50
- lowerCaseRefNameAliases: RefNameAliases;
51
- cytobands: Feature[];
52
- }): void;
53
- setError(e: Error): void;
56
+ setLoaded({ adapterRegionsWithAssembly, refNameAliases, lowerCaseRefNameAliases, cytobands, }: Loading): void;
57
+ setError(e: unknown): void;
54
58
  setRegions(regions: Region[]): void;
55
- setRefNameAliases(aliases: RefNameAliases, lowerCase: RefNameAliases): void;
59
+ setRefNameAliases(aliases: RefNameAliases, lcAliases: RefNameAliases): void;
56
60
  setCytobands(cytobands: Feature[]): void;
57
- afterAttach(): void;
61
+ setLoadingP(p?: Promise<void>): void;
62
+ load(): Promise<void>;
63
+ loadPre(): Promise<void>;
58
64
  } & {
59
65
  getAdapterMapEntry(adapterConf: unknown, options: BaseOptions): Promise<RefNameMap>;
60
66
  /**
@@ -66,6 +72,6 @@ export default function assemblyFactory(assemblyConfigType: IAnyType, pluginMana
66
72
  */
67
73
  getReverseRefNameMapForAdapter(adapterConf: unknown, opts: BaseOptions): Promise<RefNameAliases>;
68
74
  }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
69
- export declare type AssemblyModel = ReturnType<typeof assemblyFactory>;
70
- export declare type Assembly = Instance<AssemblyModel>;
75
+ export type AssemblyModel = ReturnType<typeof assemblyFactory>;
76
+ export type Assembly = Instance<AssemblyModel>;
71
77
  export {};
@@ -3,8 +3,8 @@ 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
- const json_stable_stringify_1 = __importDefault(require("json-stable-stringify"));
7
6
  const mobx_state_tree_1 = require("mobx-state-tree");
7
+ const json_stable_stringify_1 = __importDefault(require("json-stable-stringify"));
8
8
  const abortable_promise_cache_1 = __importDefault(require("abortable-promise-cache"));
9
9
  // locals
10
10
  const configuration_1 = require("../configuration");
@@ -45,7 +45,7 @@ const refNameColors = [
45
45
  ];
46
46
  async function loadRefNameMap(assembly, adapterConfig, options, signal) {
47
47
  const { sessionId } = options;
48
- await (0, util_1.when)(() => Boolean(assembly.regions && assembly.refNameAliases), {
48
+ await (0, util_1.when)(() => !!(assembly.regions && assembly.refNameAliases), {
49
49
  signal,
50
50
  name: 'when assembly ready',
51
51
  });
@@ -81,7 +81,7 @@ function checkRefName(refName) {
81
81
  function getAdapterId(adapterConf) {
82
82
  return (0, json_stable_stringify_1.default)(adapterConf);
83
83
  }
84
- function assemblyFactory(assemblyConfigType, pluginManager) {
84
+ function assemblyFactory(assemblyConfigType, pm) {
85
85
  const adapterLoads = new abortable_promise_cache_1.default({
86
86
  cache: new QuickLRU_1.default({ maxSize: 1000 }),
87
87
  async fill(args, signal, statusCallback) {
@@ -95,18 +95,27 @@ function assemblyFactory(assemblyConfigType, pluginManager) {
95
95
  })
96
96
  .volatile(() => ({
97
97
  error: undefined,
98
- regions: undefined,
98
+ loaded: false,
99
+ loadingP: undefined,
100
+ volatileRegions: undefined,
99
101
  refNameAliases: undefined,
100
102
  lowerCaseRefNameAliases: undefined,
101
103
  cytobands: undefined,
102
104
  }))
103
105
  .views(self => ({
104
106
  get initialized() {
107
+ // @ts-ignore
108
+ self.load();
105
109
  return !!self.refNameAliases;
106
110
  },
107
111
  get name() {
108
112
  return (0, configuration_1.getConf)(self, 'name');
109
113
  },
114
+ get regions() {
115
+ // @ts-ignore
116
+ self.load();
117
+ return self.volatileRegions;
118
+ },
110
119
  get aliases() {
111
120
  return (0, configuration_1.getConf)(self, 'aliases');
112
121
  },
@@ -119,10 +128,6 @@ function assemblyFactory(assemblyConfigType, pluginManager) {
119
128
  get allAliases() {
120
129
  return [this.name, ...this.aliases];
121
130
  },
122
- get refNames() {
123
- var _a;
124
- return (_a = self.regions) === null || _a === void 0 ? void 0 : _a.map(region => region.refName);
125
- },
126
131
  // note: lowerCaseRefNameAliases not included here: this allows the list
127
132
  // of refnames to be just the "normal casing", but things like
128
133
  // getCanonicalRefName can resolve a lower-case name if needed
@@ -149,6 +154,12 @@ function assemblyFactory(assemblyConfigType, pluginManager) {
149
154
  const colors = (0, configuration_1.getConf)(self, 'refNameColors');
150
155
  return colors.length === 0 ? refNameColors : colors;
151
156
  },
157
+ }))
158
+ .views(self => ({
159
+ get refNames() {
160
+ var _a;
161
+ return (_a = self.regions) === null || _a === void 0 ? void 0 : _a.map(region => region.refName);
162
+ },
152
163
  }))
153
164
  .views(self => ({
154
165
  getCanonicalRefName(refName) {
@@ -158,9 +169,11 @@ function assemblyFactory(assemblyConfigType, pluginManager) {
158
169
  return (self.refNameAliases[refName] || self.lowerCaseRefNameAliases[refName]);
159
170
  },
160
171
  getRefNameColor(refName) {
161
- var _a;
162
- const idx = (_a = self.refNames) === null || _a === void 0 ? void 0 : _a.findIndex(r => r === refName);
163
- if (idx === undefined || idx === -1) {
172
+ if (!self.refNames) {
173
+ return undefined;
174
+ }
175
+ const idx = self.refNames.findIndex(r => r === refName);
176
+ if (idx === -1) {
164
177
  return undefined;
165
178
  }
166
179
  return self.refNameColors[idx % self.refNameColors.length];
@@ -173,8 +186,8 @@ function assemblyFactory(assemblyConfigType, pluginManager) {
173
186
  },
174
187
  }))
175
188
  .actions(self => ({
176
- setLoading() { },
177
189
  setLoaded({ adapterRegionsWithAssembly, refNameAliases, lowerCaseRefNameAliases, cytobands, }) {
190
+ self.loaded = true;
178
191
  this.setRegions(adapterRegionsWithAssembly);
179
192
  this.setRefNameAliases(refNameAliases, lowerCaseRefNameAliases);
180
193
  this.setCytobands(cytobands);
@@ -184,21 +197,62 @@ function assemblyFactory(assemblyConfigType, pluginManager) {
184
197
  self.error = e;
185
198
  },
186
199
  setRegions(regions) {
187
- self.regions = regions;
200
+ self.volatileRegions = regions;
188
201
  },
189
- setRefNameAliases(aliases, lowerCase) {
202
+ setRefNameAliases(aliases, lcAliases) {
190
203
  self.refNameAliases = aliases;
191
- self.lowerCaseRefNameAliases = lowerCase;
204
+ self.lowerCaseRefNameAliases = lcAliases;
192
205
  },
193
206
  setCytobands(cytobands) {
194
207
  self.cytobands = cytobands;
195
208
  },
196
- afterAttach() {
197
- (0, util_1.makeAbortableReaction)(
198
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
199
- self,
200
- // @ts-ignore
201
- makeLoadAssemblyData(pluginManager), loadAssemblyReaction, { name: `${self.name} assembly loading`, fireImmediately: true }, this.setLoading, this.setLoaded, this.setError);
209
+ setLoadingP(p) {
210
+ self.loadingP = p;
211
+ },
212
+ load() {
213
+ if (!self.loadingP) {
214
+ self.loadingP = this.loadPre().catch(e => {
215
+ this.setLoadingP(undefined);
216
+ this.setError(e);
217
+ });
218
+ }
219
+ return self.loadingP;
220
+ },
221
+ async loadPre() {
222
+ var _a, _b;
223
+ const conf = self.configuration;
224
+ const refNameAliasesAdapterConf = (_a = conf.refNameAliases) === null || _a === void 0 ? void 0 : _a.adapter;
225
+ const cytobandAdapterConf = (_b = conf.cytobands) === null || _b === void 0 ? void 0 : _b.adapter;
226
+ const sequenceAdapterConf = conf.sequence.adapter;
227
+ const assemblyName = self.name;
228
+ const regions = await getAssemblyRegions(sequenceAdapterConf, pm);
229
+ const adapterRegionsWithAssembly = regions.map(r => {
230
+ checkRefName(r.refName);
231
+ return { ...r, assemblyName };
232
+ });
233
+ const refNameAliases = {};
234
+ const ret = await getRefNameAliases(refNameAliasesAdapterConf, pm);
235
+ const cytobands = await getCytobands(cytobandAdapterConf, pm);
236
+ ret.forEach(({ refName, aliases }) => {
237
+ aliases.forEach(a => {
238
+ checkRefName(a);
239
+ refNameAliases[a] = refName;
240
+ });
241
+ });
242
+ // add identity to the refNameAliases list
243
+ adapterRegionsWithAssembly.forEach(region => {
244
+ refNameAliases[region.refName] = region.refName;
245
+ });
246
+ const lowerCaseRefNameAliases = Object.fromEntries(Object.entries(refNameAliases).map(([key, val]) => [
247
+ key.toLowerCase(),
248
+ val,
249
+ ]));
250
+ this.setLoaded({
251
+ adapterRegionsWithAssembly,
252
+ refNameAliases,
253
+ lowerCaseRefNameAliases,
254
+ cytobands,
255
+ });
202
256
  },
203
257
  }))
204
258
  .views(self => ({
@@ -237,61 +291,6 @@ function assemblyFactory(assemblyConfigType, pluginManager) {
237
291
  }));
238
292
  }
239
293
  exports.default = assemblyFactory;
240
- function makeLoadAssemblyData(pluginManager) {
241
- return (self) => {
242
- if (self.configuration) {
243
- // use full configuration instead of snapshot of the config, the
244
- // rpcManager normally receives a snapshot but we bypass rpcManager here
245
- // to avoid spinning up a webworker
246
- const { sequence, refNameAliases, cytobands } = self.configuration;
247
- const sequenceAdapterConfig = sequence.adapter;
248
- const refNameAliasesAdapterConfig = refNameAliases === null || refNameAliases === void 0 ? void 0 : refNameAliases.adapter;
249
- const cytobandAdapterConfig = cytobands === null || cytobands === void 0 ? void 0 : cytobands.adapter;
250
- return {
251
- sequenceAdapterConfig,
252
- assemblyName: self.name,
253
- refNameAliasesAdapterConfig,
254
- cytobandAdapterConfig,
255
- pluginManager,
256
- };
257
- }
258
- return undefined;
259
- };
260
- }
261
- async function loadAssemblyReaction(props, signal) {
262
- if (!props) {
263
- return;
264
- }
265
- const { sequenceAdapterConfig, assemblyName, refNameAliasesAdapterConfig, cytobandAdapterConfig, pluginManager, } = props;
266
- const adapterRegions = await getAssemblyRegions(sequenceAdapterConfig, pluginManager, signal);
267
- const adapterRegionsWithAssembly = adapterRegions.map(adapterRegion => {
268
- checkRefName(adapterRegion.refName);
269
- return { ...adapterRegion, assemblyName };
270
- });
271
- const refNameAliases = {};
272
- const aliases = await getRefNameAliases(refNameAliasesAdapterConfig, pluginManager, signal);
273
- const cytobands = await getCytobands(cytobandAdapterConfig, pluginManager);
274
- aliases.forEach(({ refName, aliases }) => {
275
- aliases.forEach(alias => {
276
- checkRefName(alias);
277
- refNameAliases[alias] = refName;
278
- });
279
- });
280
- // add identity to the refNameAliases list
281
- adapterRegionsWithAssembly.forEach(region => {
282
- refNameAliases[region.refName] = region.refName;
283
- });
284
- const lowerCaseRefNameAliases = Object.fromEntries(Object.entries(refNameAliases).map(([key, val]) => [
285
- key.toLowerCase(),
286
- val,
287
- ]));
288
- return {
289
- adapterRegionsWithAssembly,
290
- refNameAliases,
291
- lowerCaseRefNameAliases,
292
- cytobands,
293
- };
294
- }
295
294
  async function getRefNameAliases(config, pm, signal) {
296
295
  const type = pm.getAdapterType(config.type);
297
296
  const CLASS = await type.getAdapterClass();
@@ -1,3 +1,7 @@
1
1
  import PluginManager from '../PluginManager';
2
- declare const _default: (pluginManager: PluginManager) => import("../configuration").AnyConfigurationSchemaType;
3
- export default _default;
2
+ /**
3
+ * #config BaseAssembly
4
+ * This corresponds to the assemblies section of the config
5
+ */
6
+ declare function assemblyConfigSchema(pluginManager: PluginManager): import("../configuration").AnyConfigurationSchemaType;
7
+ export default assemblyConfigSchema;