@jbrowse/core 2.4.2 → 2.5.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 (164) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +16 -0
  2. package/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +46 -0
  3. package/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +15 -0
  4. package/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +69 -0
  5. package/BaseFeatureWidget/BaseFeatureDetail/BasicField.d.ts +17 -0
  6. package/BaseFeatureWidget/BaseFeatureDetail/BasicField.js +23 -0
  7. package/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +12 -0
  8. package/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +26 -0
  9. package/BaseFeatureWidget/BaseFeatureDetail/DataGrid.d.ts +14 -0
  10. package/BaseFeatureWidget/BaseFeatureDetail/DataGrid.js +98 -0
  11. package/BaseFeatureWidget/BaseFeatureDetail/FieldName.d.ts +16 -0
  12. package/BaseFeatureWidget/BaseFeatureDetail/FieldName.js +32 -0
  13. package/BaseFeatureWidget/BaseFeatureDetail/UriField.d.ts +17 -0
  14. package/BaseFeatureWidget/BaseFeatureDetail/UriField.js +31 -0
  15. package/BaseFeatureWidget/BaseFeatureDetail/UriLink.d.ts +6 -0
  16. package/BaseFeatureWidget/BaseFeatureDetail/UriLink.js +13 -0
  17. package/BaseFeatureWidget/{BaseFeatureDetail.d.ts → BaseFeatureDetail/index.d.ts} +4 -4
  18. package/BaseFeatureWidget/{BaseFeatureDetail.js → BaseFeatureDetail/index.js} +12 -9
  19. package/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +4 -0
  20. package/BaseFeatureWidget/BaseFeatureDetail/util.js +23 -0
  21. package/BaseFeatureWidget/SequenceFeatureDetails/CDNASequence.d.ts +12 -0
  22. package/BaseFeatureWidget/SequenceFeatureDetails/CDNASequence.js +25 -0
  23. package/BaseFeatureWidget/SequenceFeatureDetails/CDSSequence.d.ts +5 -0
  24. package/BaseFeatureWidget/SequenceFeatureDetails/CDSSequence.js +12 -0
  25. package/BaseFeatureWidget/SequenceFeatureDetails/GenomicSequence.d.ts +5 -0
  26. package/BaseFeatureWidget/SequenceFeatureDetails/GenomicSequence.js +14 -0
  27. package/BaseFeatureWidget/SequenceFeatureDetails/ProteinSequence.d.ts +8 -0
  28. package/BaseFeatureWidget/SequenceFeatureDetails/ProteinSequence.js +18 -0
  29. package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.d.ts +2 -0
  30. package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.js +146 -0
  31. package/BaseFeatureWidget/{SequenceFeatureSettingsDialog.d.ts → SequenceFeatureDetails/SequenceFeatureSettingsDialog.d.ts} +0 -1
  32. package/BaseFeatureWidget/{SequenceFeatureSettingsDialog.js → SequenceFeatureDetails/SequenceFeatureSettingsDialog.js} +1 -1
  33. package/BaseFeatureWidget/{SequenceHelpDialog.d.ts → SequenceFeatureDetails/SequenceHelpDialog.d.ts} +0 -1
  34. package/BaseFeatureWidget/{SequenceHelpDialog.js → SequenceFeatureDetails/SequenceHelpDialog.js} +6 -9
  35. package/BaseFeatureWidget/{SequencePanel.d.ts → SequenceFeatureDetails/SequencePanel.d.ts} +1 -1
  36. package/BaseFeatureWidget/{SequencePanel.js → SequenceFeatureDetails/SequencePanel.js} +10 -8
  37. package/BaseFeatureWidget/SequenceFeatureDetails/hooks.d.ts +10 -0
  38. package/BaseFeatureWidget/SequenceFeatureDetails/hooks.js +73 -0
  39. package/BaseFeatureWidget/SequenceFeatureDetails/index.d.ts +2 -0
  40. package/BaseFeatureWidget/SequenceFeatureDetails/index.js +68 -0
  41. package/BaseFeatureWidget/SequenceFeatureDetails/util.d.ts +6 -0
  42. package/BaseFeatureWidget/SequenceFeatureDetails/util.js +11 -0
  43. package/BaseFeatureWidget/index.d.ts +4 -1
  44. package/BaseFeatureWidget/index.js +29 -17
  45. package/BaseFeatureWidget/types.d.ts +2 -2
  46. package/Plugin.d.ts +1 -1
  47. package/PluginLoader.js +17 -0
  48. package/PluginManager.d.ts +5 -2
  49. package/PluginManager.js +3 -0
  50. package/ReExports/list.js +1 -0
  51. package/ReExports/modules.d.ts +5 -2
  52. package/ReExports/modules.js +7 -4
  53. package/TextSearch/TextSearchManager.d.ts +2 -9
  54. package/assemblyManager/assembly.d.ts +91 -8
  55. package/assemblyManager/assembly.js +92 -8
  56. package/assemblyManager/assemblyConfigSchema.d.ts +50 -1
  57. package/assemblyManager/assemblyManager.d.ts +115 -58
  58. package/assemblyManager/assemblyManager.js +60 -12
  59. package/configuration/configurationSchema.d.ts +14 -16
  60. package/configuration/configurationSchema.js +4 -2
  61. package/configuration/index.d.ts +1 -1
  62. package/configuration/types.d.ts +13 -0
  63. package/configuration/types.js +2 -0
  64. package/configuration/util.d.ts +5 -3
  65. package/configuration/util.js +18 -18
  66. package/data_adapters/BaseAdapter/BaseAdapter.d.ts +23 -0
  67. package/data_adapters/BaseAdapter/BaseAdapter.js +37 -0
  68. package/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +128 -0
  69. package/data_adapters/{BaseAdapter.js → BaseAdapter/BaseFeatureDataAdapter.js} +58 -88
  70. package/data_adapters/BaseAdapter/BaseOptions.d.ts +16 -0
  71. package/data_adapters/BaseAdapter/BaseOptions.js +2 -0
  72. package/data_adapters/BaseAdapter/BaseRefNameAliasAdapter.d.ts +9 -0
  73. package/data_adapters/BaseAdapter/BaseRefNameAliasAdapter.js +2 -0
  74. package/data_adapters/BaseAdapter/BaseSequenceAdapter.d.ts +13 -0
  75. package/data_adapters/BaseAdapter/BaseSequenceAdapter.js +10 -0
  76. package/data_adapters/BaseAdapter/BaseTextSearchAdapter.d.ts +6 -0
  77. package/data_adapters/BaseAdapter/BaseTextSearchAdapter.js +2 -0
  78. package/data_adapters/BaseAdapter/RegionsAdapter.d.ts +6 -0
  79. package/data_adapters/BaseAdapter/RegionsAdapter.js +2 -0
  80. package/data_adapters/BaseAdapter/index.d.ts +15 -0
  81. package/data_adapters/BaseAdapter/index.js +25 -0
  82. package/data_adapters/BaseAdapter/types.d.ts +21 -0
  83. package/data_adapters/BaseAdapter/types.js +2 -0
  84. package/data_adapters/BaseAdapter/util.d.ts +12 -0
  85. package/data_adapters/BaseAdapter/util.js +23 -0
  86. package/data_adapters/CytobandAdapter/configSchema.d.ts +11 -1
  87. package/package.json +4 -4
  88. package/pluggableElementTypes/AdapterType.d.ts +1 -1
  89. package/pluggableElementTypes/ConnectionType.d.ts +1 -1
  90. package/pluggableElementTypes/DisplayType.d.ts +1 -1
  91. package/pluggableElementTypes/InternetAccountType.d.ts +1 -1
  92. package/pluggableElementTypes/TextSearchAdapterType.d.ts +1 -1
  93. package/pluggableElementTypes/models/BaseTrackModel.d.ts +1 -1
  94. package/pluggableElementTypes/models/BaseTrackModel.js +3 -2
  95. package/pluggableElementTypes/models/InternetAccountModel.d.ts +30 -0
  96. package/pluggableElementTypes/models/InternetAccountModel.js +6 -1
  97. package/pluggableElementTypes/models/baseConnectionConfig.d.ts +18 -1
  98. package/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +42 -1
  99. package/pluggableElementTypes/models/baseTrackConfig.d.ts +118 -1
  100. package/pluggableElementTypes/renderers/CircularChordRendererType.d.ts +0 -1
  101. package/pluggableElementTypes/renderers/FeatureRendererType.d.ts +1 -1
  102. package/pluggableElementTypes/renderers/RendererType.d.ts +1 -1
  103. package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.d.ts +0 -1
  104. package/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +1 -1
  105. package/rpc/RpcManager.d.ts +8 -1
  106. package/rpc/RpcManager.js +1 -1
  107. package/rpc/baseRpcConfig.d.ts +10 -1
  108. package/rpc/configSchema.d.ts +14 -1
  109. package/rpc/coreRpcMethods.d.ts +1 -1
  110. package/rpc/coreRpcMethods.js +3 -3
  111. package/rpc/mainThreadRpcConfig.d.ts +7 -1
  112. package/rpc/methods/{CoreEstimateRegionStats.d.ts → CoreGetFeatureDensityStats.d.ts} +2 -2
  113. package/rpc/methods/{CoreEstimateRegionStats.js → CoreGetFeatureDensityStats.js} +4 -4
  114. package/rpc/methods/CoreGetFeatureDetails.js +5 -5
  115. package/rpc/webWorkerRpcConfig.d.ts +7 -1
  116. package/tsconfig.build.tsbuildinfo +1 -1
  117. package/ui/AboutDialog.d.ts +0 -1
  118. package/ui/AppLogo.d.ts +0 -1
  119. package/ui/AssemblySelector.d.ts +0 -1
  120. package/ui/CascadingMenu.d.ts +0 -1
  121. package/ui/ColorPicker.d.ts +0 -1
  122. package/ui/Dialog.d.ts +0 -1
  123. package/ui/Dialog.js +14 -1
  124. package/ui/DrawerWidget.d.ts +1 -2
  125. package/ui/DrawerWidget.js +5 -3
  126. package/ui/DropDownMenu.d.ts +0 -1
  127. package/ui/ErrorMessage.d.ts +0 -1
  128. package/ui/FactoryResetDialog.d.ts +0 -1
  129. package/ui/FatalErrorDialog.d.ts +0 -1
  130. package/ui/FileSelector/FileSelector.d.ts +0 -1
  131. package/ui/FileSelector/LocalFileChooser.d.ts +0 -1
  132. package/ui/FileSelector/UrlChooser.d.ts +0 -1
  133. package/ui/Icons.d.ts +0 -1
  134. package/ui/LoadingEllipses.d.ts +0 -1
  135. package/ui/Logo.d.ts +0 -1
  136. package/ui/PrerenderedCanvas.d.ts +0 -1
  137. package/ui/ResizeBar.js +1 -1
  138. package/ui/ResizeHandle.d.ts +0 -1
  139. package/ui/ReturnToImportFormDialog.d.ts +0 -1
  140. package/ui/SanitizedHTML.d.ts +0 -1
  141. package/ui/SanitizedHTML.js +6 -0
  142. package/ui/Snackbar.d.ts +0 -1
  143. package/ui/Tooltip.d.ts +0 -1
  144. package/ui/ViewContainerTitle.d.ts +0 -1
  145. package/ui/ViewLauncher.d.ts +0 -1
  146. package/ui/ViewMenu.d.ts +1 -2
  147. package/ui/ViewPanel.d.ts +0 -1
  148. package/ui/react-colorful.d.ts +1 -1
  149. package/ui/theme.js +3 -18
  150. package/util/index.d.ts +4 -2
  151. package/util/index.js +13 -4
  152. package/util/layouts/PrecomputedMultiLayout.d.ts +1 -1
  153. package/util/stats.d.ts +5 -5
  154. package/util/types/index.d.ts +3 -1
  155. package/util/types/mst.d.ts +12 -9
  156. package/BaseFeatureWidget/SequenceBox.d.ts +0 -29
  157. package/BaseFeatureWidget/SequenceBox.js +0 -63
  158. package/BaseFeatureWidget/SequenceFeatureDetails.d.ts +0 -3
  159. package/BaseFeatureWidget/SequenceFeatureDetails.js +0 -230
  160. package/data_adapters/BaseAdapter.d.ts +0 -138
  161. /package/BaseFeatureWidget/{test_data → SequenceFeatureDetails/test_data}/DLGAP3.d.ts +0 -0
  162. /package/BaseFeatureWidget/{test_data → SequenceFeatureDetails/test_data}/DLGAP3.js +0 -0
  163. /package/BaseFeatureWidget/{test_data → SequenceFeatureDetails/test_data}/NCDN.d.ts +0 -0
  164. /package/BaseFeatureWidget/{test_data → SequenceFeatureDetails/test_data}/NCDN.js +0 -0
@@ -0,0 +1,5 @@
1
+ export default function GenomicSequence({ sequence, upstream, downstream, }: {
2
+ sequence: string;
3
+ upstream?: string;
4
+ downstream?: string;
5
+ }): JSX.Element;
@@ -0,0 +1,14 @@
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
+ const react_1 = __importDefault(require("react"));
7
+ const util_1 = require("./util");
8
+ function GenomicSequence({ sequence, upstream, downstream, }) {
9
+ return (react_1.default.createElement(react_1.default.Fragment, null,
10
+ upstream ? (react_1.default.createElement("span", { style: { background: util_1.updownstreamColor } }, upstream)) : null,
11
+ react_1.default.createElement("span", { style: { background: util_1.genomeColor } }, sequence),
12
+ downstream ? (react_1.default.createElement("span", { style: { background: util_1.updownstreamColor } }, downstream)) : null));
13
+ }
14
+ exports.default = GenomicSequence;
@@ -0,0 +1,8 @@
1
+ import { Feat } from '../util';
2
+ export default function ProteinSequence({ cds, sequence, codonTable, }: {
3
+ cds: Feat[];
4
+ sequence: string;
5
+ codonTable: {
6
+ [key: string]: string;
7
+ };
8
+ }): JSX.Element;
@@ -0,0 +1,18 @@
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
+ const react_1 = __importDefault(require("react"));
7
+ const util_1 = require("../util");
8
+ const util_2 = require("./util");
9
+ function ProteinSequence({ cds, sequence, codonTable, }) {
10
+ const str = (0, util_1.stitch)(cds, sequence);
11
+ let protein = '';
12
+ for (let i = 0; i < str.length; i += 3) {
13
+ // use & symbol for undefined codon, or partial slice
14
+ protein += codonTable[str.slice(i, i + 3)] || '&';
15
+ }
16
+ return react_1.default.createElement("span", { style: { background: util_2.proteinColor } }, protein);
17
+ }
18
+ exports.default = ProteinSequence;
@@ -0,0 +1,2 @@
1
+ import { BaseProps } from './../types';
2
+ export default function SequenceFeatureDetails({ model, feature: prefeature, }: BaseProps): JSX.Element;
@@ -0,0 +1,146 @@
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
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const react_1 = __importStar(require("react"));
30
+ const material_1 = require("@mui/material");
31
+ const mui_1 = require("tss-react/mui");
32
+ const copy_to_clipboard_1 = __importDefault(require("copy-to-clipboard"));
33
+ // locals
34
+ const util_1 = require("../../util");
35
+ const ui_1 = require("../../ui");
36
+ // icons
37
+ const Settings_1 = __importDefault(require("@mui/icons-material/Settings"));
38
+ const hooks_1 = require("./hooks");
39
+ // lazies
40
+ const SettingsDlg = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./SequenceFeatureSettingsDialog'))));
41
+ const SequencePanel = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./SequencePanel'))));
42
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
43
+ button: {
44
+ margin: theme.spacing(1),
45
+ },
46
+ formControl: {
47
+ margin: 0,
48
+ },
49
+ container2: {
50
+ marginTop: theme.spacing(1),
51
+ },
52
+ }));
53
+ // set the key on this component to feature.id to clear state after new feature
54
+ // is selected
55
+ function SequenceFeatureDetails({ model, feature: prefeature, }) {
56
+ var _a, _b;
57
+ const { classes } = useStyles();
58
+ const feature = prefeature;
59
+ const hasCDS = (_a = feature.subfeatures) === null || _a === void 0 ? void 0 : _a.some(sub => sub.type === 'CDS');
60
+ const hasExon = (_b = feature.subfeatures) === null || _b === void 0 ? void 0 : _b.some(sub => sub.type === 'exon');
61
+ const seqPanelRef = (0, react_1.useRef)(null);
62
+ const [intronBp, setIntronBp] = (0, util_1.useLocalStorage)('intronBp', 10);
63
+ const [upDownBp, setUpDownBp] = (0, util_1.useLocalStorage)('upDownBp', 500);
64
+ const [copied, setCopied] = (0, react_1.useState)(false);
65
+ const [copiedHtml, setCopiedHtml] = (0, react_1.useState)(false);
66
+ const [force, setForce] = (0, react_1.useState)(false);
67
+ const { sequence, error } = (0, hooks_1.useFeatureSequence)(model, prefeature, upDownBp, force);
68
+ const [mode, setMode] = (0, react_1.useState)(hasCDS ? 'cds' : hasExon ? 'cdna' : 'genomic');
69
+ const rest = {
70
+ ...(hasCDS ? { cds: 'CDS' } : {}),
71
+ ...(hasCDS ? { protein: 'Protein' } : {}),
72
+ ...(hasExon ? { cdna: 'cDNA' } : {}),
73
+ ...(hasExon
74
+ ? {
75
+ gene: `Genomic w/ full introns`,
76
+ }
77
+ : {}),
78
+ ...(hasExon
79
+ ? {
80
+ gene_updownstream: `Genomic w/ full introns +/- ${upDownBp}bp up+down stream`,
81
+ }
82
+ : {}),
83
+ ...(hasExon
84
+ ? { gene_collapsed_intron: `Genomic w/ ${intronBp}bp intron` }
85
+ : {}),
86
+ ...(hasExon
87
+ ? {
88
+ gene_updownstream_collapsed_intron: `Genomic w/ ${intronBp}bp intron +/- ${upDownBp}bp up+down stream `,
89
+ }
90
+ : {}),
91
+ ...(!hasExon ? { genomic: 'Genomic' } : {}),
92
+ ...(!hasExon
93
+ ? {
94
+ genomic_sequence_updownstream: `Genomic +/- ${upDownBp}bp up+down stream`,
95
+ }
96
+ : {}),
97
+ };
98
+ return (react_1.default.createElement("div", { className: classes.container2 },
99
+ react_1.default.createElement(material_1.FormControl, { className: classes.formControl },
100
+ react_1.default.createElement(material_1.Select, { value: mode, onChange: event => setMode(event.target.value) }, Object.entries(rest).map(([key, val]) => (react_1.default.createElement(material_1.MenuItem, { key: key, value: key }, val))))),
101
+ react_1.default.createElement(material_1.FormControl, { className: classes.formControl },
102
+ react_1.default.createElement(material_1.Button, { className: classes.button, variant: "contained", onClick: () => {
103
+ const ref = seqPanelRef.current;
104
+ if (ref) {
105
+ (0, copy_to_clipboard_1.default)(ref.textContent || '', { format: 'text/plain' });
106
+ setCopied(true);
107
+ setTimeout(() => setCopied(false), 1000);
108
+ }
109
+ } }, copied ? 'Copied to clipboard!' : 'Copy plaintext')),
110
+ react_1.default.createElement(material_1.FormControl, { className: classes.formControl },
111
+ react_1.default.createElement(material_1.Tooltip, { title: "The 'Copy HTML' function retains the colors from the sequence panel but cannot be pasted into some programs like notepad that only expect plain text" },
112
+ react_1.default.createElement(material_1.Button, { className: classes.button, variant: "contained", onClick: () => {
113
+ const ref = seqPanelRef.current;
114
+ if (!ref) {
115
+ return;
116
+ }
117
+ (0, copy_to_clipboard_1.default)(ref.innerHTML, { format: 'text/html' });
118
+ setCopiedHtml(true);
119
+ setTimeout(() => setCopiedHtml(false), 1000);
120
+ } }, copiedHtml ? 'Copied to clipboard!' : 'Copy HTML'))),
121
+ react_1.default.createElement(Settings, { upDownBp: upDownBp, intronBp: intronBp, setIntronBp: setIntronBp, setUpDownBp: setUpDownBp }),
122
+ react_1.default.createElement("br", null),
123
+ feature.type === 'gene' ? (react_1.default.createElement(material_1.Typography, null, "Note: inspect subfeature sequences for protein/CDS computations")) : null,
124
+ error ? (react_1.default.createElement(material_1.Typography, { color: "error" }, `${error}`)) : !sequence ? (react_1.default.createElement(ui_1.LoadingEllipses, null)) : sequence ? ('error' in sequence ? (react_1.default.createElement(react_1.default.Fragment, null,
125
+ react_1.default.createElement(material_1.Typography, { color: "error" }, sequence.error),
126
+ react_1.default.createElement(material_1.Button, { variant: "contained", color: "inherit", onClick: () => setForce(true) }, "Force load"))) : (react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement(ui_1.LoadingEllipses, null) },
127
+ react_1.default.createElement(SequencePanel, { ref: seqPanelRef, feature: feature, mode: mode, sequence: sequence, intronBp: intronBp })))) : (react_1.default.createElement(material_1.Typography, null, "No sequence found"))));
128
+ }
129
+ exports.default = SequenceFeatureDetails;
130
+ function Settings({ intronBp, upDownBp, setIntronBp, setUpDownBp, }) {
131
+ const { classes } = useStyles();
132
+ const [settingsDlgOpen, setSettingsDlgOpen] = (0, react_1.useState)(false);
133
+ return (react_1.default.createElement(react_1.default.Fragment, null,
134
+ react_1.default.createElement(material_1.FormControl, { className: classes.formControl },
135
+ react_1.default.createElement(material_1.IconButton, { onClick: () => setSettingsDlgOpen(true) },
136
+ react_1.default.createElement(Settings_1.default, null))),
137
+ settingsDlgOpen ? (react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement("div", null) },
138
+ react_1.default.createElement(SettingsDlg, { handleClose: arg => {
139
+ if (arg) {
140
+ const { upDownBp, intronBp } = arg;
141
+ setIntronBp(intronBp);
142
+ setUpDownBp(upDownBp);
143
+ }
144
+ setSettingsDlgOpen(false);
145
+ }, upDownBp: upDownBp, intronBp: intronBp }))) : null));
146
+ }
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  export default function SequenceFeatureSettingsDialog({ handleClose, intronBp: intronBpArg, upDownBp: upDownBpArg, }: {
3
2
  handleClose: (arg?: {
4
3
  intronBp: number;
@@ -42,7 +42,7 @@ function SequenceFeatureSettingsDialog({ handleClose, intronBp: intronBpArg, upD
42
42
  const [upDownBp, setUpDownBp] = (0, react_1.useState)(`${upDownBpArg}`);
43
43
  const intronBpValid = !Number.isNaN(+intronBp);
44
44
  const upDownBpValid = !Number.isNaN(+upDownBp);
45
- return (react_1.default.createElement(ui_1.Dialog, { maxWidth: "xl", open: true, onClose: () => handleClose(), title: 'Feature sequence settings' },
45
+ return (react_1.default.createElement(ui_1.Dialog, { maxWidth: "xl", open: true, onClose: () => handleClose(), title: "Feature sequence settings" },
46
46
  react_1.default.createElement(material_1.DialogContent, { className: classes.dialogContent },
47
47
  react_1.default.createElement(material_1.TextField, { label: "Number of intronic bases around splice site to display", className: classes.formElt, value: intronBp, helperText: !intronBpValid ? 'Not a number' : '', error: !intronBpValid, onChange: event => setIntronBp(event.target.value) }),
48
48
  react_1.default.createElement(material_1.TextField, { label: "Number of bases up/down stream of feature to display", className: classes.formElt, value: upDownBp, helperText: !upDownBpValid ? 'Not a number' : '', error: !upDownBpValid, onChange: event => setUpDownBp(event.target.value) })),
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  export default function HelpDialog({ handleClose, }: {
3
2
  handleClose: () => void;
4
3
  }): JSX.Element;
@@ -16,19 +16,16 @@ function HelpDialog({ handleClose, }) {
16
16
  react_1.default.createElement("ul", null,
17
17
  react_1.default.createElement("li", null, "CDS - shows the stitched together CDS sequences"),
18
18
  react_1.default.createElement("li", null, "Protein - the translated coding sequence, with the \"standard\" genetic code"),
19
- react_1.default.createElement("li", null, "cDNA - shows the UTRs and stitched together CDS sequences"),
20
- react_1.default.createElement("li", null, "Gene w/ introns - the sequence underlying the entire gene including including introns, with UTR and CDS highlighted"),
21
- react_1.default.createElement("li", null, "Gene w/ Nbp introns - same \"Gene w/ introns\", but limiting to a subset of the intron sequence displayed"),
22
- react_1.default.createElement("li", null, "Gene +/- Nbp up+down stream - same as \"Gene w/ introns\" but with up and downstream sequence displayed"),
23
- react_1.default.createElement("li", null, "Gene +/- Nbp up+down stream, Nbp introns - same as \"Gene w/ introns\", but with limited intron sequence displayed and up and downstream sequence")),
19
+ react_1.default.createElement("li", null, "cDNA - shows the 'DNA' version of transcript, formed from exons, including non-coding genes"),
20
+ react_1.default.createElement("li", null, "Genomic w/ introns +/- Nbp up+down stream - the sequence underlying the entire gene including including introns, with UTR and CDS highlighted")),
24
21
  react_1.default.createElement(material_1.Typography, { paragraph: true }, "For other feature types, the options are:"),
25
22
  react_1.default.createElement("ul", null,
26
- react_1.default.createElement("li", null, "Feature sequence - the reference genome sequence underlying the feature"),
27
- react_1.default.createElement("li", null, "Feature sequence +/- Nbp up+down stream - the reference genome sequence underlying the feature, with the up and downstream sequence")),
23
+ react_1.default.createElement("li", null, "Genomic +/- Nbp up+down stream - the reference genome sequence underlying the feature, with the up and downstream sequence")),
28
24
  react_1.default.createElement(material_1.Typography, null,
29
- "Note: you can use the \"gear icon\" ",
25
+ "Note 1: you can use the \"gear icon\" ",
30
26
  react_1.default.createElement(Settings_1.default, null),
31
- " to edit the number of bp displayed up/downstream and in the intron region")),
27
+ " to edit the number of bp displayed up/downstream and in the intron region"),
28
+ react_1.default.createElement(material_1.Typography, null, "Note 2: The 'Copy HTML' function retains the colors from the sequence panel but cannot be pasted into some programs like notepad that only expect plain text.")),
32
29
  react_1.default.createElement(material_1.DialogActions, null,
33
30
  react_1.default.createElement(material_1.Button, { onClick: () => handleClose(), autoFocus: true, variant: "contained" }, "Close"))));
34
31
  }
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { ParentFeat, SeqState } from './util';
2
+ import { ParentFeat, SeqState } from '../util';
3
3
  interface SeqPanelProps {
4
4
  sequence: SeqState;
5
5
  feature: ParentFeat;
@@ -4,9 +4,12 @@ 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 util_1 = require("../util");
8
- const util_2 = require("./util");
9
- const SequenceBox_1 = require("./SequenceBox");
7
+ const util_1 = require("../../util");
8
+ const util_2 = require("../util");
9
+ const CDNASequence_1 = __importDefault(require("./CDNASequence"));
10
+ const ProteinSequence_1 = __importDefault(require("./ProteinSequence"));
11
+ const GenomicSequence_1 = __importDefault(require("./GenomicSequence"));
12
+ const CDSSequence_1 = __importDefault(require("./CDSSequence"));
10
13
  const SeqPanel = react_1.default.forwardRef(function (props, ref) {
11
14
  const { feature, mode, intronBp = 10 } = props;
12
15
  let { sequence: { seq, upstream = '', downstream = '' }, } = props;
@@ -55,21 +58,20 @@ const SeqPanel = react_1.default.forwardRef(function (props, ref) {
55
58
  }
56
59
  const codonTable = (0, util_1.generateCodonTable)(util_1.defaultCodonTable);
57
60
  return (react_1.default.createElement("div", { ref: ref, "data-testid": "sequence_panel" },
58
- react_1.default.createElement("div", { style:
59
- /* raw styles so that html copy works */
60
- {
61
+ react_1.default.createElement("div", { style: {
62
+ /* raw styles instead of className so that html copy works */
61
63
  fontFamily: 'monospace',
62
64
  wordWrap: 'break-word',
63
65
  overflow: 'auto',
64
66
  color: 'black',
65
67
  fontSize: 12,
66
68
  maxWidth: 600,
67
- maxHeight: 500,
69
+ maxHeight: 300,
68
70
  } },
69
71
  react_1.default.createElement("span", { style: { background: 'white' } }, `>${feature.name ||
70
72
  feature.id ||
71
73
  `${feature.refName}:${feature.start + 1}-${feature.end}`}-${mode}\n`),
72
74
  react_1.default.createElement("br", null),
73
- mode === 'genomic' ? (react_1.default.createElement(SequenceBox_1.Genomic, { sequence: seq })) : mode === 'genomic_sequence_updown' ? (react_1.default.createElement(SequenceBox_1.Genomic, { sequence: seq, upstream: upstream, downstream: downstream })) : mode === 'cds' ? (react_1.default.createElement(SequenceBox_1.GeneCDS, { cds: cds, sequence: seq })) : mode === 'cdna' ? (react_1.default.createElement(SequenceBox_1.GenecDNA, { exons: exons, cds: cds, utr: utr, sequence: seq, intronBp: intronBp })) : mode === 'protein' ? (react_1.default.createElement(SequenceBox_1.GeneProtein, { cds: cds, codonTable: codonTable, sequence: seq })) : mode === 'gene' ? (react_1.default.createElement(SequenceBox_1.GenecDNA, { exons: exons, cds: cds, utr: utr, sequence: seq, includeIntrons: true, intronBp: intronBp })) : mode === 'gene_collapsed_intron' ? (react_1.default.createElement(SequenceBox_1.GenecDNA, { exons: exons, cds: cds, sequence: seq, utr: utr, includeIntrons: true, collapseIntron: true, intronBp: intronBp })) : mode === 'gene_updownstream' ? (react_1.default.createElement(SequenceBox_1.GenecDNA, { exons: exons, cds: cds, sequence: seq, utr: utr, upstream: upstream, downstream: downstream, includeIntrons: true, intronBp: intronBp })) : mode === 'gene_updownstream_collapsed_intron' ? (react_1.default.createElement(SequenceBox_1.GenecDNA, { exons: exons, cds: cds, sequence: seq, utr: utr, upstream: upstream, downstream: downstream, includeIntrons: true, collapseIntron: true, intronBp: intronBp })) : (react_1.default.createElement("div", null, "Unknown type")))));
75
+ mode === 'genomic' ? (react_1.default.createElement(GenomicSequence_1.default, { sequence: seq })) : mode === 'genomic_sequence_updownstream' ? (react_1.default.createElement(GenomicSequence_1.default, { sequence: seq, upstream: upstream, downstream: downstream })) : mode === 'cds' ? (react_1.default.createElement(CDSSequence_1.default, { cds: cds, sequence: seq })) : mode === 'cdna' ? (react_1.default.createElement(CDNASequence_1.default, { exons: exons, cds: cds, utr: utr, sequence: seq, intronBp: intronBp })) : mode === 'protein' ? (react_1.default.createElement(ProteinSequence_1.default, { cds: cds, codonTable: codonTable, sequence: seq })) : mode === 'gene' ? (react_1.default.createElement(CDNASequence_1.default, { exons: exons, cds: cds, utr: utr, sequence: seq, includeIntrons: true, intronBp: intronBp })) : mode === 'gene_collapsed_intron' ? (react_1.default.createElement(CDNASequence_1.default, { exons: exons, cds: cds, sequence: seq, utr: utr, includeIntrons: true, collapseIntron: true, intronBp: intronBp })) : mode === 'gene_updownstream' ? (react_1.default.createElement(CDNASequence_1.default, { exons: exons, cds: cds, sequence: seq, utr: utr, upstream: upstream, downstream: downstream, includeIntrons: true, intronBp: intronBp })) : mode === 'gene_updownstream_collapsed_intron' ? (react_1.default.createElement(CDNASequence_1.default, { exons: exons, cds: cds, sequence: seq, utr: utr, upstream: upstream, downstream: downstream, includeIntrons: true, collapseIntron: true, intronBp: intronBp })) : (react_1.default.createElement("div", null, "Unknown type")))));
74
76
  });
75
77
  exports.default = SeqPanel;
@@ -0,0 +1,10 @@
1
+ import { SeqState, ErrorState } from '../util';
2
+ import { SimpleFeatureSerialized } from '../../util';
3
+ export declare function useFeatureSequence(model: {
4
+ view: {
5
+ assemblyNames: string[];
6
+ };
7
+ } | undefined, feature: SimpleFeatureSerialized, upDownBp: number, forceLoad: boolean): {
8
+ sequence: SeqState | ErrorState | undefined;
9
+ error: unknown;
10
+ };
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useFeatureSequence = void 0;
4
+ const react_1 = require("react");
5
+ const util_1 = require("../../util");
6
+ const configuration_1 = require("../../configuration");
7
+ const BPLIMIT = 500000;
8
+ function useFeatureSequence(model, feature, upDownBp, forceLoad) {
9
+ const [sequence, setSequence] = (0, react_1.useState)();
10
+ const [error, setError] = (0, react_1.useState)();
11
+ (0, react_1.useEffect)(() => {
12
+ var _a;
13
+ let finished = false;
14
+ if (!model) {
15
+ return () => { };
16
+ }
17
+ const { assemblyManager, rpcManager } = (0, util_1.getSession)(model);
18
+ const [assemblyName] = ((_a = model.view) === null || _a === void 0 ? void 0 : _a.assemblyNames) || [];
19
+ async function fetchSeq(start, end, refName) {
20
+ const assembly = await assemblyManager.waitForAssembly(assemblyName);
21
+ if (!assembly) {
22
+ throw new Error('assembly not found');
23
+ }
24
+ const sessionId = 'getSequence';
25
+ const feats = await rpcManager.call(sessionId, 'CoreGetFeatures', {
26
+ adapterConfig: (0, configuration_1.getConf)(assembly, ['sequence', 'adapter']),
27
+ sessionId,
28
+ regions: [
29
+ {
30
+ start,
31
+ end,
32
+ refName: assembly.getCanonicalRefName(refName),
33
+ assemblyName,
34
+ },
35
+ ],
36
+ });
37
+ const [feat] = feats;
38
+ return (feat === null || feat === void 0 ? void 0 : feat.get('seq')) || '';
39
+ }
40
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
41
+ ;
42
+ (async () => {
43
+ try {
44
+ setError(undefined);
45
+ const { start, end, refName } = feature;
46
+ if (!forceLoad && end - start > BPLIMIT) {
47
+ setSequence({
48
+ error: `Genomic sequence larger than ${BPLIMIT}bp, use "force load" button to display`,
49
+ });
50
+ }
51
+ else {
52
+ const b = start - upDownBp;
53
+ const e = end + upDownBp;
54
+ const seq = await fetchSeq(start, end, refName);
55
+ const up = await fetchSeq(Math.max(0, b), start, refName);
56
+ const down = await fetchSeq(end, e, refName);
57
+ if (!finished) {
58
+ setSequence({ seq, upstream: up, downstream: down });
59
+ }
60
+ }
61
+ }
62
+ catch (e) {
63
+ console.error(e);
64
+ setError(e);
65
+ }
66
+ })();
67
+ return () => {
68
+ finished = true;
69
+ };
70
+ }, [feature, model, upDownBp, forceLoad]);
71
+ return { sequence, error };
72
+ }
73
+ exports.useFeatureSequence = useFeatureSequence;
@@ -0,0 +1,2 @@
1
+ import { BaseProps } from './../types';
2
+ export default function SequenceFeaturePanel({ model, feature }: BaseProps): JSX.Element | null;
@@ -0,0 +1,68 @@
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
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const react_1 = __importStar(require("react"));
30
+ const material_1 = require("@mui/material");
31
+ const mui_1 = require("tss-react/mui");
32
+ const ui_1 = require("../../ui");
33
+ // icons
34
+ const Help_1 = __importDefault(require("@mui/icons-material/Help"));
35
+ // lazies
36
+ const HelpDlg = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./SequenceHelpDialog'))));
37
+ const SequenceFeatureDetails = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./SequenceFeatureDetails'))));
38
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
39
+ formControl: {
40
+ margin: 0,
41
+ },
42
+ container: {
43
+ marginTop: theme.spacing(4),
44
+ marginBottom: theme.spacing(4),
45
+ },
46
+ }));
47
+ // display the stitched-together sequence of a gene's CDS, cDNA, or protein
48
+ // sequence. this is a best effort and weird genomic phenomena could lead these
49
+ // to not be 100% accurate
50
+ function SequenceFeaturePanel({ model, feature }) {
51
+ const { classes } = useStyles();
52
+ const [shown, setShown] = (0, react_1.useState)(false);
53
+ const [helpShown, setHelpShown] = (0, react_1.useState)(false);
54
+ return !model ? null : (react_1.default.createElement("div", { className: classes.container },
55
+ react_1.default.createElement(material_1.Button, { variant: "contained", onClick: () => setShown(!shown) }, shown ? 'Hide feature sequence' : 'Show feature sequence'),
56
+ react_1.default.createElement(material_1.FormControl, { className: classes.formControl },
57
+ react_1.default.createElement(material_1.IconButton, { onClick: () => setHelpShown(true) },
58
+ react_1.default.createElement(Help_1.default, null))),
59
+ shown ? (react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement(ui_1.LoadingEllipses, null) },
60
+ react_1.default.createElement(SequenceFeatureDetails
61
+ /* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion */
62
+ , {
63
+ /* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion */
64
+ key: feature.uniqueId, model: model, feature: feature }))) : null,
65
+ helpShown ? (react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement("div", null) },
66
+ react_1.default.createElement(HelpDlg, { handleClose: () => setHelpShown(false) }))) : null));
67
+ }
68
+ exports.default = SequenceFeaturePanel;
@@ -0,0 +1,6 @@
1
+ export declare const intronColor: undefined;
2
+ export declare const utrColor = "rgb(200,240,240)";
3
+ export declare const proteinColor = "rgb(220,160,220)";
4
+ export declare const cdsColor = "rgb(220,220,180)";
5
+ export declare const updownstreamColor = "rgba(250,200,200)";
6
+ export declare const genomeColor = "rgb(200,280,200)";
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.genomeColor = exports.updownstreamColor = exports.cdsColor = exports.proteinColor = exports.utrColor = exports.intronColor = void 0;
4
+ // note that these are currently put into the style section instead of being
5
+ // defined in classes to aid copy and paste to an external document e.g. word
6
+ exports.intronColor = undefined;
7
+ exports.utrColor = 'rgb(200,240,240)';
8
+ exports.proteinColor = 'rgb(220,160,220)';
9
+ exports.cdsColor = 'rgb(220,220,180)';
10
+ exports.updownstreamColor = 'rgba(250,200,200)';
11
+ exports.genomeColor = 'rgb(200,280,200)';
@@ -1,5 +1,5 @@
1
1
  import PluginManager from '../PluginManager';
2
- declare const configSchema: import("../configuration").AnyConfigurationSchemaType;
2
+ declare const configSchema: import("../configuration/configurationSchema").ConfigurationSchemaType<{}, import("../configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
3
3
  export default function stateModelFactory(pluginManager: PluginManager): import("mobx-state-tree").IModelType<{
4
4
  id: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
5
5
  type: import("mobx-state-tree").ISimpleType<"BaseFeatureWidget">;
@@ -11,10 +11,13 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
11
11
  trackId: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
12
12
  trackType: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
13
13
  }, {
14
+ error: unknown;
15
+ } & {
14
16
  setFeatureData(featureData: Record<string, unknown>): void;
15
17
  clearFeatureData(): void;
16
18
  setFormattedData(feat: Record<string, unknown>): void;
17
19
  setExtra(type?: string, trackId?: string): void;
20
+ setError(e: unknown): void;
18
21
  } & {
19
22
  afterCreate(): void;
20
23
  }, import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
@@ -36,6 +36,9 @@ function stateModelFactory(pluginManager) {
36
36
  trackId: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string),
37
37
  trackType: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string),
38
38
  })
39
+ .volatile(() => ({
40
+ error: undefined,
41
+ }))
39
42
  .actions(self => ({
40
43
  setFeatureData(featureData) {
41
44
  self.unformattedFeatureData = featureData;
@@ -50,30 +53,39 @@ function stateModelFactory(pluginManager) {
50
53
  self.trackId = trackId;
51
54
  self.trackType = type;
52
55
  },
56
+ setError(e) {
57
+ self.error = e;
58
+ },
53
59
  }))
54
60
  .actions(self => ({
55
61
  afterCreate() {
56
62
  (0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.autorun)(() => {
57
63
  var _a, _b;
58
- self.setExtra((_a = self.track) === null || _a === void 0 ? void 0 : _a.type, (_b = self.track) === null || _b === void 0 ? void 0 : _b.configuration.trackId);
59
- const { unformattedFeatureData, track } = self;
60
- const session = (0, util_1.getSession)(self);
61
- if (unformattedFeatureData) {
62
- const feature = (0, clone_1.default)(unformattedFeatureData);
63
- const combine = (arg2, feature) => ({
64
- ...(0, configuration_1.getConf)(session, ['formatDetails', arg2], { feature }),
65
- ...(0, configuration_1.getConf)(track, ['formatDetails', arg2], { feature }),
66
- });
67
- if (track) {
68
- // eslint-disable-next-line no-underscore-dangle
69
- feature.__jbrowsefmt = combine('feature', feature);
70
- const depth = (0, configuration_1.getConf)(track, ['formatDetails', 'depth']);
71
- formatSubfeatures(feature, depth, sub => {
72
- // eslint-disable-next-line no-underscore-dangle
73
- sub.__jbrowsefmt = combine('subfeatures', sub);
64
+ try {
65
+ self.setExtra((_a = self.track) === null || _a === void 0 ? void 0 : _a.type, (_b = self.track) === null || _b === void 0 ? void 0 : _b.configuration.trackId);
66
+ const { unformattedFeatureData, track } = self;
67
+ const session = (0, util_1.getSession)(self);
68
+ if (unformattedFeatureData) {
69
+ const feature = (0, clone_1.default)(unformattedFeatureData);
70
+ const combine = (arg2, feature) => ({
71
+ ...(0, configuration_1.getConf)(session, ['formatDetails', arg2], { feature }),
72
+ ...(0, configuration_1.getConf)(track, ['formatDetails', arg2], { feature }),
74
73
  });
74
+ if (track) {
75
+ // eslint-disable-next-line no-underscore-dangle
76
+ feature.__jbrowsefmt = combine('feature', feature);
77
+ const depth = (0, configuration_1.getConf)(track, ['formatDetails', 'depth']);
78
+ formatSubfeatures(feature, depth, sub => {
79
+ // eslint-disable-next-line no-underscore-dangle
80
+ sub.__jbrowsefmt = combine('subfeatures', sub);
81
+ });
82
+ }
83
+ self.setFormattedData(feature);
75
84
  }
76
- self.setFormattedData(feature);
85
+ }
86
+ catch (e) {
87
+ console.error(e);
88
+ self.setError(e);
77
89
  }
78
90
  }));
79
91
  },
@@ -1,9 +1,9 @@
1
1
  import React from 'react';
2
2
  import { IAnyStateTreeNode } from 'mobx-state-tree';
3
- import { SimpleFeatureSerializedNoId } from '../util/simpleFeature';
3
+ import { SimpleFeatureSerialized } from '../util/simpleFeature';
4
4
  import { AbstractViewModel } from '../util';
5
5
  export interface BaseProps extends BaseCardProps {
6
- feature: SimpleFeatureSerializedNoId;
6
+ feature: SimpleFeatureSerialized;
7
7
  formatter?: (val: unknown, key: string) => React.ReactNode;
8
8
  descriptions?: Record<string, React.ReactNode>;
9
9
  model?: IAnyStateTreeNode & {
package/Plugin.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import PluginManager from './PluginManager';
2
- import { AnyConfigurationSchemaType } from './configuration/configurationSchema';
2
+ import { AnyConfigurationSchemaType } from './configuration';
3
3
  /**
4
4
  * base class for a JBrowse plugin
5
5
  */
package/PluginLoader.js CHANGED
@@ -25,6 +25,20 @@ function isCJSPluginDefinition(def) {
25
25
  return def.cjsUrl !== undefined;
26
26
  }
27
27
  exports.isCJSPluginDefinition = isCJSPluginDefinition;
28
+ function pluginDescriptionString(pluginDefinition) {
29
+ var _a;
30
+ if (isUMDPluginDefinition(pluginDefinition)) {
31
+ return `UMD plugin ${pluginDefinition.name}`;
32
+ }
33
+ if (isESMPluginDefinition(pluginDefinition)) {
34
+ return `ESM plugin ${pluginDefinition.esmUrl ||
35
+ ((_a = pluginDefinition.esmLoc) === null || _a === void 0 ? void 0 : _a.uri)}`;
36
+ }
37
+ if (isCJSPluginDefinition(pluginDefinition)) {
38
+ return `CJS plugin ${pluginDefinition.cjsUrl}`;
39
+ }
40
+ return 'unknown plugin';
41
+ }
28
42
  function isInWebWorker() {
29
43
  return Boolean('WorkerGlobalScope' in globalThis);
30
44
  }
@@ -115,6 +129,9 @@ class PluginLoader {
115
129
  else {
116
130
  throw new Error(`Could not determine plugin type: ${JSON.stringify(def)}`);
117
131
  }
132
+ if (!plugin.default) {
133
+ throw new Error(`${pluginDescriptionString(def)} does not have a default export, cannot load`);
134
+ }
118
135
  return plugin.default;
119
136
  }
120
137
  installGlobalReExports(target) {