@jbrowse/core 3.6.5 → 3.7.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 (62) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +1 -1
  2. package/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.d.ts +1 -1
  3. package/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +31 -33
  4. package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.js +15 -7
  5. package/BaseFeatureWidget/SequenceFeatureDetails/consts.d.ts +6 -0
  6. package/BaseFeatureWidget/SequenceFeatureDetails/consts.js +9 -0
  7. package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.d.ts +1 -1
  8. package/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.js +17 -7
  9. package/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +6 -3
  10. package/BaseFeatureWidget/SequenceFeatureDetails/model.js +1 -1
  11. package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDNASequence.js +4 -3
  12. package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDSSequence.js +2 -1
  13. package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/GenomicSequence.js +4 -3
  14. package/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/ProteinSequence.js +11 -10
  15. package/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.d.ts +13 -0
  16. package/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +67 -0
  17. package/BaseFeatureWidget/SequenceFeatureDetails/util.d.ts +2 -9
  18. package/BaseFeatureWidget/SequenceFeatureDetails/util.js +36 -39
  19. package/BaseFeatureWidget/stateModelFactory.d.ts +4 -4
  20. package/BaseFeatureWidget/util.d.ts +5 -2
  21. package/BaseFeatureWidget/util.js +41 -12
  22. package/PluginLoader.js +1 -1
  23. package/assemblyManager/assembly.d.ts +1 -0
  24. package/assemblyManager/assembly.js +3 -0
  25. package/assemblyManager/assemblyManager.d.ts +8 -0
  26. package/assemblyManager/assemblyManager.js +4 -0
  27. package/configuration/configurationSchema.js +1 -1
  28. package/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +2 -2
  29. package/package.json +3 -4
  30. package/tsconfig.build.tsbuildinfo +1 -1
  31. package/ui/BaseTooltip.d.ts +1 -1
  32. package/ui/CascadingMenu.js +25 -3
  33. package/ui/ConfirmDialog.d.ts +10 -0
  34. package/ui/ConfirmDialog.js +18 -0
  35. package/ui/EditableTypography.js +1 -8
  36. package/ui/LoadingEllipses.d.ts +2 -1
  37. package/ui/LoadingEllipses.js +1 -1
  38. package/ui/Menu.d.ts +1 -0
  39. package/ui/Menu.js +2 -2
  40. package/ui/SanitizedHTML.js +13 -10
  41. package/util/aborting.js +1 -1
  42. package/util/cluster.js +17 -11
  43. package/util/color/index.d.ts +1 -0
  44. package/util/color/index.js +8 -0
  45. package/util/compositeMap.d.ts +2 -2
  46. package/util/convertCodingSequenceToPeptides.d.ts +6 -0
  47. package/util/convertCodingSequenceToPeptides.js +12 -0
  48. package/util/fetchSeq.d.ts +8 -0
  49. package/util/fetchSeq.js +27 -0
  50. package/util/flatbush/index.d.ts +25 -0
  51. package/util/flatbush/index.js +362 -0
  52. package/util/flatqueue/index.d.ts +11 -0
  53. package/util/flatqueue/index.js +66 -0
  54. package/util/index.js +10 -10
  55. package/util/jexl.js +1 -0
  56. package/util/layouts/PrecomputedLayout.d.ts +3 -1
  57. package/util/layouts/PrecomputedLayout.js +23 -14
  58. package/util/tracks.js +1 -1
  59. package/util/useFeatureSequence.d.ts +19 -0
  60. package/util/useFeatureSequence.js +90 -0
  61. package/BaseFeatureWidget/SequenceFeatureDetails/hooks.d.ts +0 -10
  62. package/BaseFeatureWidget/SequenceFeatureDetails/hooks.js +0 -65
@@ -26,5 +26,5 @@ function CoreDetails(props) {
26
26
  return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SimpleField_1.default, { name: "Position", value: (0, jsx_runtime_1.jsx)(Position_1.default, { ...props, feature: formattedFeat }) }), Object.entries(coreRenderedDetails)
27
27
  .map(([key, name]) => [name, displayedDetails[key]])
28
28
  .filter(([, value]) => value != null)
29
- .map(([name, value]) => ((0, jsx_runtime_1.jsx)(SimpleField_1.default, { name: name, value: value }, name)))] }));
29
+ .map(([name, value]) => ((0, jsx_runtime_1.jsx)(SimpleField_1.default, { name: name, value: Array.isArray(value) ? value.join(', ') : value }, name)))] }));
30
30
  }
@@ -6,5 +6,5 @@ declare const SequenceContents: ({ mode, feature, sequence, model, }: {
6
6
  feature: SimpleFeatureSerialized;
7
7
  sequence: SeqState;
8
8
  model: SequenceFeatureDetailsModel;
9
- }) => import("react/jsx-runtime").JSX.Element;
9
+ }) => import("react/jsx-runtime").JSX.Element | null;
10
10
  export default SequenceContents;
@@ -6,43 +6,41 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const jsx_runtime_1 = require("react/jsx-runtime");
7
7
  const mobx_react_1 = require("mobx-react");
8
8
  const util_1 = require("../../util");
9
- const util_2 = require("../util");
10
9
  const CDNASequence_1 = __importDefault(require("./seqtypes/CDNASequence"));
11
10
  const CDSSequence_1 = __importDefault(require("./seqtypes/CDSSequence"));
12
11
  const GenomicSequence_1 = __importDefault(require("./seqtypes/GenomicSequence"));
13
12
  const ProteinSequence_1 = __importDefault(require("./seqtypes/ProteinSequence"));
14
- const SequenceContents = (0, mobx_react_1.observer)(function ({ mode, feature, sequence, model, }) {
15
- var _a;
16
- let { seq, upstream = '', downstream = '' } = sequence;
17
- const children = ((_a = feature.subfeatures) === null || _a === void 0 ? void 0 : _a.sort((a, b) => a.start - b.start).map(sub => ({
18
- ...sub,
19
- start: sub.start - feature.start,
20
- end: sub.end - feature.start,
21
- }))) || [];
22
- let cds = (0, util_2.dedupe)(children.filter(sub => sub.type === 'CDS'));
23
- let utr = (0, util_2.dedupe)(children.filter(sub => { var _a; return (_a = sub.type) === null || _a === void 0 ? void 0 : _a.match(/utr/i); }));
24
- let exons = (0, util_2.dedupe)(children.filter(sub => sub.type === 'exon'));
25
- if (!utr.length && cds.length && exons.length) {
26
- utr = (0, util_2.calculateUTRs)(cds, exons);
27
- }
28
- if (!utr.length && cds.length && !exons.length) {
29
- utr = (0, util_2.calculateUTRs2)(cds, {
30
- start: 0,
31
- end: feature.end - feature.start,
32
- type: 'gene',
33
- });
13
+ const useSequenceData_1 = require("./useSequenceData");
14
+ function RenderedSequenceComponent({ mode, feature, model, sequenceData, }) {
15
+ const { seq, upstream, downstream, cds, exons, utr } = sequenceData;
16
+ switch (mode) {
17
+ case 'genomic':
18
+ return (0, jsx_runtime_1.jsx)(GenomicSequence_1.default, { feature: feature, model: model, sequence: seq });
19
+ case 'genomic_sequence_updownstream':
20
+ return ((0, jsx_runtime_1.jsx)(GenomicSequence_1.default, { model: model, feature: feature, sequence: seq, upstream: upstream, downstream: downstream }));
21
+ case 'cds':
22
+ return (0, jsx_runtime_1.jsx)(CDSSequence_1.default, { model: model, cds: cds, sequence: seq });
23
+ case 'cdna':
24
+ return ((0, jsx_runtime_1.jsx)(CDNASequence_1.default, { model: model, exons: exons, feature: feature, cds: cds, utr: utr, sequence: seq }));
25
+ case 'protein':
26
+ return ((0, jsx_runtime_1.jsx)(ProteinSequence_1.default, { model: model, cds: cds, codonTable: (0, util_1.generateCodonTable)(util_1.defaultCodonTable), sequence: seq }));
27
+ case 'gene':
28
+ return ((0, jsx_runtime_1.jsx)(CDNASequence_1.default, { model: model, exons: exons, feature: feature, cds: cds, utr: utr, sequence: seq, includeIntrons: true }));
29
+ case 'gene_collapsed_intron':
30
+ return ((0, jsx_runtime_1.jsx)(CDNASequence_1.default, { model: model, exons: exons, feature: feature, cds: cds, sequence: seq, utr: utr, includeIntrons: true, collapseIntron: true }));
31
+ case 'gene_updownstream':
32
+ return ((0, jsx_runtime_1.jsx)(CDNASequence_1.default, { model: model, exons: exons, feature: feature, cds: cds, sequence: seq, utr: utr, upstream: upstream, downstream: downstream, includeIntrons: true }));
33
+ case 'gene_updownstream_collapsed_intron':
34
+ return ((0, jsx_runtime_1.jsx)(CDNASequence_1.default, { model: model, exons: exons, feature: feature, cds: cds, sequence: seq, utr: utr, upstream: upstream, downstream: downstream, includeIntrons: true, collapseIntron: true }));
35
+ default:
36
+ return (0, jsx_runtime_1.jsx)("div", { children: "Unknown type" });
34
37
  }
35
- if (feature.strand === -1) {
36
- ;
37
- [seq, upstream, downstream] = [
38
- (0, util_1.revcom)(seq),
39
- (0, util_1.revcom)(downstream),
40
- (0, util_1.revcom)(upstream),
41
- ];
42
- cds = (0, util_2.revlist)(cds, seq.length);
43
- exons = (0, util_2.revlist)(exons, seq.length);
44
- utr = (0, util_2.revlist)(utr, seq.length);
45
- }
46
- return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: mode === 'genomic' ? ((0, jsx_runtime_1.jsx)(GenomicSequence_1.default, { feature: feature, model: model, sequence: seq })) : mode === 'genomic_sequence_updownstream' ? ((0, jsx_runtime_1.jsx)(GenomicSequence_1.default, { model: model, feature: feature, sequence: seq, upstream: upstream, downstream: downstream })) : mode === 'cds' ? ((0, jsx_runtime_1.jsx)(CDSSequence_1.default, { model: model, cds: cds, sequence: seq })) : mode === 'cdna' ? ((0, jsx_runtime_1.jsx)(CDNASequence_1.default, { model: model, exons: exons, feature: feature, cds: cds, utr: utr, sequence: seq })) : mode === 'protein' ? ((0, jsx_runtime_1.jsx)(ProteinSequence_1.default, { model: model, cds: cds, codonTable: (0, util_1.generateCodonTable)(util_1.defaultCodonTable), sequence: seq })) : mode === 'gene' ? ((0, jsx_runtime_1.jsx)(CDNASequence_1.default, { model: model, exons: exons, feature: feature, cds: cds, utr: utr, sequence: seq, includeIntrons: true })) : mode === 'gene_collapsed_intron' ? ((0, jsx_runtime_1.jsx)(CDNASequence_1.default, { model: model, exons: exons, feature: feature, cds: cds, sequence: seq, utr: utr, includeIntrons: true, collapseIntron: true })) : mode === 'gene_updownstream' ? ((0, jsx_runtime_1.jsx)(CDNASequence_1.default, { model: model, exons: exons, feature: feature, cds: cds, sequence: seq, utr: utr, upstream: upstream, downstream: downstream, includeIntrons: true })) : mode === 'gene_updownstream_collapsed_intron' ? ((0, jsx_runtime_1.jsx)(CDNASequence_1.default, { model: model, exons: exons, feature: feature, cds: cds, sequence: seq, utr: utr, upstream: upstream, downstream: downstream, includeIntrons: true, collapseIntron: true })) : ((0, jsx_runtime_1.jsx)("div", { children: "Unknown type" })) }));
38
+ }
39
+ const SequenceContents = (0, mobx_react_1.observer)(function ({ mode, feature, sequence, model, }) {
40
+ const sequenceData = (0, useSequenceData_1.useSequenceData)({
41
+ feature,
42
+ sequence,
43
+ });
44
+ return sequenceData ? ((0, jsx_runtime_1.jsx)(RenderedSequenceComponent, { mode: mode, feature: feature, model: model, sequenceData: sequenceData })) : null;
47
45
  });
48
46
  exports.default = SequenceContents;
@@ -40,19 +40,29 @@ const jsx_runtime_1 = require("react/jsx-runtime");
40
40
  const react_1 = require("react");
41
41
  const material_1 = require("@mui/material");
42
42
  const mobx_react_1 = require("mobx-react");
43
- const hooks_1 = require("./hooks");
44
43
  const ui_1 = require("../../ui");
45
44
  const SequenceFeatureMenu_1 = __importDefault(require("./dialogs/SequenceFeatureMenu"));
46
45
  const SequenceTypeSelector_1 = __importDefault(require("./dialogs/SequenceTypeSelector"));
46
+ const util_1 = require("../../util");
47
+ const useFeatureSequence_1 = require("../../util/useFeatureSequence");
47
48
  const SequencePanel = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./SequencePanel'))));
48
49
  const SequenceDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./dialogs/SequenceDialog'))));
49
50
  const SequenceFeatureDetails = (0, mobx_react_1.observer)(function ({ model, feature, }) {
51
+ var _a, _b;
50
52
  const { sequenceFeatureDetails } = model;
51
53
  const { upDownBp } = sequenceFeatureDetails;
52
54
  const seqPanelRef = (0, react_1.useRef)(null);
53
55
  const [openInDialog, setOpenInDialog] = (0, react_1.useState)(false);
54
- const [force, setForce] = (0, react_1.useState)(false);
55
- const { sequence, error } = (0, hooks_1.useFeatureSequence)(model, feature, upDownBp, force);
56
+ const [forceLoad, setForceLoad] = (0, react_1.useState)(false);
57
+ const session = (0, util_1.getSession)(model);
58
+ const assemblyName = (_b = (_a = model.view) === null || _a === void 0 ? void 0 : _a.assemblyNames) === null || _b === void 0 ? void 0 : _b[0];
59
+ const { sequence, error } = (0, useFeatureSequence_1.useFeatureSequence)({
60
+ assemblyName,
61
+ session,
62
+ feature: new util_1.SimpleFeature(feature),
63
+ upDownBp,
64
+ forceLoad,
65
+ });
56
66
  (0, react_1.useEffect)(() => {
57
67
  sequenceFeatureDetails.setFeature(feature);
58
68
  }, [sequenceFeatureDetails, feature]);
@@ -60,15 +70,13 @@ const SequenceFeatureDetails = (0, mobx_react_1.observer)(function ({ model, fea
60
70
  {
61
71
  label: 'Open in dialog',
62
72
  onClick: () => {
63
- setTimeout(() => {
64
- setOpenInDialog(true);
65
- }, 1);
73
+ setOpenInDialog(true);
66
74
  },
67
75
  },
68
76
  ] })] }), openInDialog ? ((0, jsx_runtime_1.jsxs)("div", { children: ["Open in dialog...", (0, jsx_runtime_1.jsx)(react_1.Suspense, { fallback: (0, jsx_runtime_1.jsx)(ui_1.LoadingEllipses, {}), children: (0, jsx_runtime_1.jsx)(SequenceDialog, { model: model, feature: feature, handleClose: () => {
69
77
  setOpenInDialog(false);
70
78
  } }) })] })) : ((0, jsx_runtime_1.jsxs)("div", { children: [feature.type === 'gene' ? ((0, jsx_runtime_1.jsx)(material_1.Typography, { children: "Note: inspect subfeature sequences for protein/CDS computations" })) : null, error ? ((0, jsx_runtime_1.jsx)(ui_1.ErrorMessage, { error: error })) : !sequence ? ((0, jsx_runtime_1.jsx)(ui_1.LoadingEllipses, {})) : 'error' in sequence ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.Typography, { color: "error", children: sequence.error }), (0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", color: "inherit", onClick: () => {
71
- setForce(true);
79
+ setForceLoad(true);
72
80
  }, children: "Force load" })] })) : ((0, jsx_runtime_1.jsx)(react_1.Suspense, { fallback: (0, jsx_runtime_1.jsx)(ui_1.LoadingEllipses, {}), children: (0, jsx_runtime_1.jsx)(SequencePanel, { ref: seqPanelRef, feature: feature, sequence: sequence, model: sequenceFeatureDetails }) }))] }))] }));
73
81
  });
74
82
  exports.default = SequenceFeatureDetails;
@@ -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,9 @@
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
+ exports.intronColor = undefined;
5
+ exports.utrColor = 'rgb(200,240,240)';
6
+ exports.proteinColor = 'rgb(220,160,220)';
7
+ exports.cdsColor = 'rgb(220,220,180)';
8
+ exports.updownstreamColor = 'rgba(250,200,200)';
9
+ exports.genomeColor = 'rgb(200,280,200)';
@@ -1,4 +1,4 @@
1
- import type { SimpleFeatureSerialized } from '../../../util';
1
+ import { type SimpleFeatureSerialized } from '../../../util';
2
2
  import type { BaseFeatureWidgetModel } from '../../stateModelFactory';
3
3
  declare const SequenceDialog: ({ handleClose, model, feature, }: {
4
4
  handleClose: () => void;
@@ -9,10 +9,11 @@ const ui_1 = require("@jbrowse/core/ui");
9
9
  const material_1 = require("@mui/material");
10
10
  const mobx_react_1 = require("mobx-react");
11
11
  const mui_1 = require("tss-react/mui");
12
- const SequencePanel_1 = __importDefault(require("../SequencePanel"));
13
- const hooks_1 = require("../hooks");
14
12
  const SequenceFeatureMenu_1 = __importDefault(require("./SequenceFeatureMenu"));
15
13
  const SequenceTypeSelector_1 = __importDefault(require("./SequenceTypeSelector"));
14
+ const util_1 = require("../../../util");
15
+ const useFeatureSequence_1 = require("../../../util/useFeatureSequence");
16
+ const SequencePanel_1 = __importDefault(require("../SequencePanel"));
16
17
  const useStyles = (0, mui_1.makeStyles)()({
17
18
  dialogContent: {
18
19
  width: '80em',
@@ -23,16 +24,25 @@ const useStyles = (0, mui_1.makeStyles)()({
23
24
  },
24
25
  });
25
26
  const SequenceDialog = (0, mobx_react_1.observer)(function ({ handleClose, model, feature, }) {
27
+ var _a, _b;
26
28
  const { sequenceFeatureDetails } = model;
27
29
  const { upDownBp } = sequenceFeatureDetails;
28
30
  const { classes } = useStyles();
29
31
  const seqPanelRef = (0, react_1.useRef)(null);
30
- const [force, setForce] = (0, react_1.useState)(false);
31
- const { sequence, error } = (0, hooks_1.useFeatureSequence)(model, feature, upDownBp, force);
32
- return ((0, jsx_runtime_1.jsxs)(ui_1.Dialog, { maxWidth: "xl", open: true, onClose: () => {
32
+ const [forceLoad, setForceLoad] = (0, react_1.useState)(false);
33
+ const session = (0, util_1.getSession)(model);
34
+ const assemblyName = (_b = (_a = model.view) === null || _a === void 0 ? void 0 : _a.assemblyNames) === null || _b === void 0 ? void 0 : _b[0];
35
+ const { sequence, error } = (0, useFeatureSequence_1.useFeatureSequence)({
36
+ assemblyName,
37
+ session,
38
+ feature: new util_1.SimpleFeature(feature),
39
+ upDownBp,
40
+ forceLoad,
41
+ });
42
+ return ((0, jsx_runtime_1.jsxs)(ui_1.Dialog, { maxWidth: "xl", open: true, title: "Sequence view", onClose: () => {
33
43
  handleClose();
34
- }, title: "Sequence view", children: [(0, jsx_runtime_1.jsxs)(material_1.DialogContent, { className: classes.dialogContent, children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(SequenceTypeSelector_1.default, { model: sequenceFeatureDetails }), (0, jsx_runtime_1.jsx)(SequenceFeatureMenu_1.default, { ref: seqPanelRef, model: sequenceFeatureDetails })] }), (0, jsx_runtime_1.jsxs)("div", { children: [feature.type === 'gene' ? ((0, jsx_runtime_1.jsx)(material_1.Typography, { children: "Note: inspect subfeature sequences for protein/CDS computations" })) : null, error ? ((0, jsx_runtime_1.jsx)(ui_1.ErrorMessage, { error: error })) : !sequence ? ((0, jsx_runtime_1.jsx)(ui_1.LoadingEllipses, {})) : 'error' in sequence ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.Typography, { color: "error", children: sequence.error }), (0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", color: "inherit", onClick: () => {
35
- setForce(true);
44
+ }, children: [(0, jsx_runtime_1.jsxs)(material_1.DialogContent, { className: classes.dialogContent, children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(SequenceTypeSelector_1.default, { model: sequenceFeatureDetails }), (0, jsx_runtime_1.jsx)(SequenceFeatureMenu_1.default, { ref: seqPanelRef, model: sequenceFeatureDetails })] }), (0, jsx_runtime_1.jsxs)("div", { children: [feature.type === 'gene' ? ((0, jsx_runtime_1.jsx)(material_1.Typography, { children: "Note: inspect subfeature sequences for protein/CDS computations" })) : null, error ? ((0, jsx_runtime_1.jsx)(ui_1.ErrorMessage, { error: error })) : !sequence ? ((0, jsx_runtime_1.jsx)(ui_1.LoadingEllipses, {})) : 'error' in sequence ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.Typography, { color: "error", children: sequence.error }), (0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", color: "inherit", onClick: () => {
45
+ setForceLoad(true);
36
46
  }, children: "Force load" })] })) : ((0, jsx_runtime_1.jsx)(react_1.Suspense, { fallback: (0, jsx_runtime_1.jsx)(ui_1.LoadingEllipses, {}), children: (0, jsx_runtime_1.jsx)(SequencePanel_1.default, { ref: seqPanelRef, feature: feature, sequence: sequence, model: sequenceFeatureDetails }) }))] })] }), (0, jsx_runtime_1.jsx)(material_1.DialogActions, { children: (0, jsx_runtime_1.jsx)(material_1.Button, { onClick: () => {
37
47
  handleClose();
38
48
  }, variant: "contained", children: "Close" }) })] }));
@@ -1,5 +1,7 @@
1
1
  import type { SimpleFeatureSerialized } from '../../util';
2
2
  import type { Instance } from 'mobx-state-tree';
3
+ type ShowCoordinatesMode = 'none' | 'relative' | 'genomic';
4
+ type SequenceDisplayMode = '' | 'gene' | 'gene_collapsed_intron' | 'gene_updownstream' | 'cdna' | 'cds' | 'genomic' | 'genomic_sequence_updownstream' | 'protein';
3
5
  export declare function SequenceFeatureDetailsF(): import("mobx-state-tree").IModelType<{}, {
4
6
  showCoordinatesSetting: string;
5
7
  intronBp: number;
@@ -7,14 +9,14 @@ export declare function SequenceFeatureDetailsF(): import("mobx-state-tree").IMo
7
9
  upperCaseCDS: boolean;
8
10
  charactersPerRow: number;
9
11
  feature: SimpleFeatureSerialized | undefined;
10
- mode: string;
12
+ mode: SequenceDisplayMode;
11
13
  } & {
12
14
  setFeature(f: SimpleFeatureSerialized): void;
13
15
  setUpDownBp(f: number): void;
14
16
  setIntronBp(f: number): void;
15
17
  setUpperCaseCDS(f: boolean): void;
16
- setShowCoordinates(f: "none" | "relative" | "genomic"): void;
17
- setMode(mode: string): void;
18
+ setShowCoordinates(f: ShowCoordinatesMode): void;
19
+ setMode(mode: SequenceDisplayMode): void;
18
20
  } & {
19
21
  readonly showCoordinates: boolean;
20
22
  readonly showGenomicCoordsOption: boolean;
@@ -26,3 +28,4 @@ export declare function SequenceFeatureDetailsF(): import("mobx-state-tree").IMo
26
28
  }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
27
29
  export type SequenceFeatureDetailsStateModel = ReturnType<typeof SequenceFeatureDetailsF>;
28
30
  export type SequenceFeatureDetailsModel = Instance<SequenceFeatureDetailsStateModel>;
31
+ export {};
@@ -55,7 +55,7 @@ function SequenceFeatureDetailsF() {
55
55
  },
56
56
  get hasCDS() {
57
57
  var _a, _b;
58
- return (_b = (_a = self.feature) === null || _a === void 0 ? void 0 : _a.subfeatures) === null || _b === void 0 ? void 0 : _b.some(sub => sub.type === 'CDS');
58
+ return (_b = (_a = self.feature) === null || _a === void 0 ? void 0 : _a.subfeatures) === null || _b === void 0 ? void 0 : _b.some(sub => { var _a; return ((_a = sub.type) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === 'cds'; });
59
59
  },
60
60
  get hasExon() {
61
61
  var _a, _b;
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const jsx_runtime_1 = require("react/jsx-runtime");
7
7
  const mobx_react_1 = require("mobx-react");
8
+ const consts_1 = require("../consts");
8
9
  const util_1 = require("../util");
9
10
  const SequenceDisplay_1 = __importDefault(require("./SequenceDisplay"));
10
11
  const CDNASequence = (0, mobx_react_1.observer)(function ({ utr, cds, exons, sequence, upstream, downstream, feature, includeIntrons, collapseIntron, model, }) {
@@ -31,7 +32,7 @@ const CDNASequence = (0, mobx_react_1.observer)(function ({ utr, cds, exons, seq
31
32
  charactersPerRow,
32
33
  showCoordinates,
33
34
  });
34
- upstreamChunk = ((0, jsx_runtime_1.jsx)(SequenceDisplay_1.default, { model: model, color: util_1.updownstreamColor, strand: mult, start: currStart, coordStart: coordStart, chunks: segments }));
35
+ upstreamChunk = ((0, jsx_runtime_1.jsx)(SequenceDisplay_1.default, { model: model, color: consts_1.updownstreamColor, strand: mult, start: currStart, coordStart: coordStart, chunks: segments }));
35
36
  currRemainder = remainder;
36
37
  currStart = currStart + upstream.length * mult;
37
38
  coordStart = coordStart + upstream.length * mult;
@@ -51,7 +52,7 @@ const CDNASequence = (0, mobx_react_1.observer)(function ({ utr, cds, exons, seq
51
52
  currRemainder,
52
53
  showCoordinates,
53
54
  });
54
- middleChunks.push((0, jsx_runtime_1.jsx)(SequenceDisplay_1.default, { model: model, color: chunk.type === 'CDS' ? util_1.cdsColor : util_1.utrColor, strand: mult, start: currStart, coordStart: coordStart, chunks: segments }, `${JSON.stringify(chunk)}-mid`));
55
+ middleChunks.push((0, jsx_runtime_1.jsx)(SequenceDisplay_1.default, { model: model, color: chunk.type === 'CDS' ? consts_1.cdsColor : consts_1.utrColor, strand: mult, start: currStart, coordStart: coordStart, chunks: segments }, `${JSON.stringify(chunk)}-mid`));
55
56
  currRemainder = remainder;
56
57
  currStart = currStart + s.length * mult;
57
58
  coordStart = coordStart + s.length * mult;
@@ -81,7 +82,7 @@ const CDNASequence = (0, mobx_react_1.observer)(function ({ utr, cds, exons, seq
81
82
  currRemainder,
82
83
  showCoordinates,
83
84
  });
84
- downstreamChunk = ((0, jsx_runtime_1.jsx)(SequenceDisplay_1.default, { start: currStart, model: model, strand: mult, chunks: segments, coordStart: coordStart, color: util_1.updownstreamColor }));
85
+ downstreamChunk = ((0, jsx_runtime_1.jsx)(SequenceDisplay_1.default, { start: currStart, model: model, strand: mult, chunks: segments, coordStart: coordStart, color: consts_1.updownstreamColor }));
85
86
  }
86
87
  return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [upstreamChunk, middleChunks, downstreamChunk] }));
87
88
  });
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const jsx_runtime_1 = require("react/jsx-runtime");
7
7
  const mobx_react_1 = require("mobx-react");
8
8
  const util_1 = require("../../util");
9
+ const consts_1 = require("../consts");
9
10
  const util_2 = require("../util");
10
11
  const SequenceDisplay_1 = __importDefault(require("./SequenceDisplay"));
11
12
  const CDSSequence = (0, mobx_react_1.observer)(function ({ cds, sequence, model, }) {
@@ -15,6 +16,6 @@ const CDSSequence = (0, mobx_react_1.observer)(function ({ cds, sequence, model,
15
16
  charactersPerRow,
16
17
  showCoordinates,
17
18
  });
18
- return ((0, jsx_runtime_1.jsx)(SequenceDisplay_1.default, { model: model, color: util_2.cdsColor, chunks: segments, start: 0 }));
19
+ return ((0, jsx_runtime_1.jsx)(SequenceDisplay_1.default, { model: model, color: consts_1.cdsColor, chunks: segments, start: 0 }));
19
20
  });
20
21
  exports.default = CDSSequence;
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const jsx_runtime_1 = require("react/jsx-runtime");
7
7
  const mobx_react_1 = require("mobx-react");
8
+ const consts_1 = require("../consts");
8
9
  const util_1 = require("../util");
9
10
  const SequenceDisplay_1 = __importDefault(require("./SequenceDisplay"));
10
11
  const GenomicSequence = (0, mobx_react_1.observer)(function ({ sequence, upstream, feature, downstream, model, }) {
@@ -26,7 +27,7 @@ const GenomicSequence = (0, mobx_react_1.observer)(function ({ sequence, upstrea
26
27
  charactersPerRow,
27
28
  showCoordinates,
28
29
  });
29
- upstreamChunk = ((0, jsx_runtime_1.jsx)(SequenceDisplay_1.default, { model: model, color: util_1.updownstreamColor, start: currStart, coordStart: coordStart, chunks: segments }));
30
+ upstreamChunk = ((0, jsx_runtime_1.jsx)(SequenceDisplay_1.default, { model: model, color: consts_1.updownstreamColor, start: currStart, coordStart: coordStart, chunks: segments }));
30
31
  currRemainder = remainder;
31
32
  currStart = currStart + upstream.length * mult;
32
33
  coordStart = coordStart + upstream.length * mult;
@@ -37,7 +38,7 @@ const GenomicSequence = (0, mobx_react_1.observer)(function ({ sequence, upstrea
37
38
  showCoordinates,
38
39
  currRemainder,
39
40
  });
40
- const middleChunk = ((0, jsx_runtime_1.jsx)(SequenceDisplay_1.default, { model: model, color: util_1.genomeColor, start: currStart, coordStart: coordStart, chunks: segments }));
41
+ const middleChunk = ((0, jsx_runtime_1.jsx)(SequenceDisplay_1.default, { model: model, color: consts_1.genomeColor, start: currStart, coordStart: coordStart, chunks: segments }));
41
42
  currRemainder = remainder;
42
43
  currStart += sequence.length * mult;
43
44
  coordStart = coordStart + sequence.length * mult;
@@ -49,7 +50,7 @@ const GenomicSequence = (0, mobx_react_1.observer)(function ({ sequence, upstrea
49
50
  currRemainder,
50
51
  showCoordinates,
51
52
  });
52
- downstreamChunk = ((0, jsx_runtime_1.jsx)(SequenceDisplay_1.default, { start: currStart, model: model, chunks: segments, coordStart: coordStart, color: util_1.updownstreamColor }));
53
+ downstreamChunk = ((0, jsx_runtime_1.jsx)(SequenceDisplay_1.default, { start: currStart, model: model, chunks: segments, coordStart: coordStart, color: consts_1.updownstreamColor }));
53
54
  }
54
55
  return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [upstreamChunk, middleChunk, downstreamChunk] }));
55
56
  });
@@ -5,21 +5,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const jsx_runtime_1 = require("react/jsx-runtime");
7
7
  const mobx_react_1 = require("mobx-react");
8
- const util_1 = require("../../util");
9
- const util_2 = require("../util");
8
+ const consts_1 = require("../consts");
9
+ const util_1 = require("../util");
10
10
  const SequenceDisplay_1 = __importDefault(require("./SequenceDisplay"));
11
+ const convertCodingSequenceToPeptides_1 = require("../../../util/convertCodingSequenceToPeptides");
11
12
  const ProteinSequence = (0, mobx_react_1.observer)(function ({ cds, sequence, codonTable, model, }) {
12
13
  const { charactersPerRow, showCoordinates } = model;
13
- const str = (0, util_1.stitch)(cds, sequence);
14
- let protein = '';
15
- for (let i = 0; i < str.length; i += 3) {
16
- protein += codonTable[str.slice(i, i + 3)] || '&';
17
- }
18
- const { segments } = (0, util_2.splitString)({
19
- str: protein,
14
+ const str = (0, convertCodingSequenceToPeptides_1.convertCodingSequenceToPeptides)({
15
+ cds,
16
+ sequence,
17
+ codonTable,
18
+ });
19
+ const { segments } = (0, util_1.splitString)({
20
+ str,
20
21
  charactersPerRow,
21
22
  showCoordinates,
22
23
  });
23
- return ((0, jsx_runtime_1.jsx)(SequenceDisplay_1.default, { model: model, color: util_2.proteinColor, chunks: segments, start: 0 }));
24
+ return ((0, jsx_runtime_1.jsx)(SequenceDisplay_1.default, { model: model, color: consts_1.proteinColor, chunks: segments, start: 0 }));
24
25
  });
25
26
  exports.default = ProteinSequence;
@@ -0,0 +1,13 @@
1
+ import type { SimpleFeatureSerialized } from '../../util';
2
+ import type { ErrorState, SeqState } from '../util';
3
+ export declare function useSequenceData({ feature, sequence, }: {
4
+ feature: SimpleFeatureSerialized;
5
+ sequence?: SeqState | ErrorState;
6
+ }): {
7
+ seq: string;
8
+ upstream: string | undefined;
9
+ downstream: string | undefined;
10
+ cds: any[];
11
+ exons: any[];
12
+ utr: any[];
13
+ } | undefined;
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useSequenceData = useSequenceData;
4
+ const util_1 = require("../../util");
5
+ const util_2 = require("../util");
6
+ function prepareSubfeatures(feature) {
7
+ const { start, subfeatures } = feature;
8
+ return ((subfeatures === null || subfeatures === void 0 ? void 0 : subfeatures.sort((a, b) => a.start - b.start).map(sub => ({
9
+ ...sub,
10
+ start: sub.start - start,
11
+ end: sub.end - start,
12
+ }))) || []);
13
+ }
14
+ function processFeatureData(children, feature) {
15
+ const cds = (0, util_2.filterSuccessiveElementsWithSameStartAndEndCoord)(children.filter(sub => { var _a; return ((_a = sub.type) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === 'cds'; }));
16
+ const exons = (0, util_2.filterSuccessiveElementsWithSameStartAndEndCoord)(children.filter(sub => sub.type === 'exon'));
17
+ let utr = (0, util_2.filterSuccessiveElementsWithSameStartAndEndCoord)(children.filter(sub => { var _a; return (_a = sub.type) === null || _a === void 0 ? void 0 : _a.match(/utr/i); }));
18
+ if (!utr.length && cds.length && exons.length) {
19
+ utr = (0, util_2.calculateUTRs)(cds, exons);
20
+ }
21
+ else if (!utr.length && cds.length && !exons.length) {
22
+ utr = (0, util_2.calculateUTRs2)(cds, {
23
+ start: 0,
24
+ end: feature.end - feature.start,
25
+ type: 'gene',
26
+ });
27
+ }
28
+ return {
29
+ cds,
30
+ exons,
31
+ utr,
32
+ };
33
+ }
34
+ function handleReverseStrand(sequence, cds, exons, utr) {
35
+ const { seq = '', upstream = '', downstream = '' } = sequence;
36
+ return {
37
+ sequence: {
38
+ seq: (0, util_1.revcom)(seq),
39
+ upstream: downstream ? (0, util_1.revcom)(downstream) : '',
40
+ downstream: upstream ? (0, util_1.revcom)(upstream) : '',
41
+ },
42
+ cds: (0, util_2.revlist)(cds, seq.length),
43
+ exons: (0, util_2.revlist)(exons, seq.length),
44
+ utr: (0, util_2.revlist)(utr, seq.length),
45
+ };
46
+ }
47
+ function useSequenceData({ feature, sequence, }) {
48
+ const children = prepareSubfeatures(feature);
49
+ const { cds, exons, utr } = processFeatureData(children, feature);
50
+ if (!sequence || 'error' in sequence) {
51
+ return undefined;
52
+ }
53
+ else {
54
+ const { sequence: adjustedSequence, cds: adjustedCds, exons: adjustedExons, utr: adjustedUtr, } = feature.strand === -1
55
+ ? handleReverseStrand(sequence, cds, exons, utr)
56
+ : { sequence, cds, exons, utr };
57
+ const { seq, upstream, downstream } = adjustedSequence;
58
+ return {
59
+ seq,
60
+ upstream,
61
+ downstream,
62
+ cds: adjustedCds,
63
+ exons: adjustedExons,
64
+ utr: adjustedUtr,
65
+ };
66
+ }
67
+ }
@@ -1,16 +1,9 @@
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)";
7
- export declare function splitString({ str, charactersPerRow, showCoordinates, currRemainder, splitSize, }: {
1
+ export declare function splitString({ str, charactersPerRow, showCoordinates, currRemainder, spacingInterval, }: {
8
2
  str: string;
9
3
  charactersPerRow: number;
10
4
  showCoordinates: boolean;
11
5
  currRemainder?: number;
12
- splitStart?: number;
13
- splitSize?: number;
6
+ spacingInterval?: number;
14
7
  }): {
15
8
  segments: any[];
16
9
  remainder: number;
@@ -1,49 +1,46 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.genomeColor = exports.updownstreamColor = exports.cdsColor = exports.proteinColor = exports.utrColor = exports.intronColor = void 0;
4
3
  exports.splitString = splitString;
5
- exports.intronColor = undefined;
6
- exports.utrColor = 'rgb(200,240,240)';
7
- exports.proteinColor = 'rgb(220,160,220)';
8
- exports.cdsColor = 'rgb(220,220,180)';
9
- exports.updownstreamColor = 'rgba(250,200,200)';
10
- exports.genomeColor = 'rgb(200,280,200)';
11
- function splitString({ str, charactersPerRow, showCoordinates, currRemainder = 0, splitSize = 10, }) {
12
- var _a;
4
+ function splitString({ str, charactersPerRow, showCoordinates, currRemainder = 0, spacingInterval = 10, }) {
13
5
  const numChunks = Math.ceil(str.length / charactersPerRow);
14
- const chunks = new Array(numChunks);
15
- let splitStart = currRemainder % 10;
16
- let iter = 0;
17
- let offset = 0;
18
- for (; iter < numChunks + 1; ++iter) {
19
- const inc = iter === 0 ? charactersPerRow - currRemainder : charactersPerRow;
20
- const r = str.slice(offset, offset + inc);
21
- if (!r) {
6
+ const segments = new Array(numChunks);
7
+ let positionCounter = currRemainder % spacingInterval;
8
+ let chunkIndex = 0;
9
+ let stringOffset = 0;
10
+ for (; chunkIndex < numChunks + 1; ++chunkIndex) {
11
+ const chunkSize = chunkIndex === 0 ? charactersPerRow - currRemainder : charactersPerRow;
12
+ const currentChunk = str.slice(stringOffset, stringOffset + chunkSize);
13
+ if (!currentChunk) {
22
14
  break;
23
15
  }
24
- if (showCoordinates) {
25
- let res = '';
26
- for (let i = 0, j = splitStart; i < r.length; i++, j++) {
27
- if (j % splitSize === 0) {
28
- res += ' ';
29
- j = 0;
30
- }
31
- res += r[i];
32
- }
33
- if (res) {
34
- chunks[iter] = res;
35
- }
36
- }
37
- else {
38
- chunks[iter] = r;
39
- }
40
- splitStart = 0;
41
- offset += inc;
16
+ segments[chunkIndex] = showCoordinates
17
+ ? formatWithCoordinateSpacing(currentChunk, positionCounter, spacingInterval)
18
+ : currentChunk;
19
+ positionCounter = 0;
20
+ stringOffset += chunkSize;
42
21
  }
43
22
  return {
44
- segments: chunks,
45
- remainder: ((((_a = chunks.at(-1)) === null || _a === void 0 ? void 0 : _a.replaceAll(' ', '').length) || 0) +
46
- (iter < 2 ? currRemainder : 0)) %
47
- charactersPerRow,
23
+ segments,
24
+ remainder: calculateRemainder(segments, chunkIndex, currRemainder, charactersPerRow),
48
25
  };
49
26
  }
27
+ function formatWithCoordinateSpacing(chunk, startPosition, spacingInterval) {
28
+ if (!chunk) {
29
+ return '';
30
+ }
31
+ let formattedChunk = '';
32
+ for (let i = 0, j = startPosition; i < chunk.length; i++, j++) {
33
+ if (j % spacingInterval === 0) {
34
+ formattedChunk += ' ';
35
+ j = 0;
36
+ }
37
+ formattedChunk += chunk[i];
38
+ }
39
+ return formattedChunk;
40
+ }
41
+ function calculateRemainder(segments, chunkIndex, currRemainder, charactersPerRow) {
42
+ var _a;
43
+ const lastSegmentLength = ((_a = segments.at(-1)) === null || _a === void 0 ? void 0 : _a.replaceAll(' ', '').length) || 0;
44
+ const additionalRemainder = chunkIndex < 2 ? currRemainder : 0;
45
+ return (lastSegmentLength + additionalRemainder) % charactersPerRow;
46
+ }
@@ -20,14 +20,14 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
20
20
  upperCaseCDS: boolean;
21
21
  charactersPerRow: number;
22
22
  feature: SimpleFeatureSerialized | undefined;
23
- mode: string;
23
+ mode: "" | "genomic" | "gene" | "gene_collapsed_intron" | "gene_updownstream" | "cdna" | "cds" | "genomic_sequence_updownstream" | "protein";
24
24
  } & {
25
25
  setFeature(f: SimpleFeatureSerialized): void;
26
26
  setUpDownBp(f: number): void;
27
27
  setIntronBp(f: number): void;
28
28
  setUpperCaseCDS(f: boolean): void;
29
29
  setShowCoordinates(f: "none" | "relative" | "genomic"): void;
30
- setMode(mode: string): void;
30
+ setMode(mode: "" | "genomic" | "gene" | "gene_collapsed_intron" | "gene_updownstream" | "cdna" | "cds" | "genomic_sequence_updownstream" | "protein"): void;
31
31
  } & {
32
32
  readonly showCoordinates: boolean;
33
33
  readonly showGenomicCoordsOption: boolean;
@@ -66,14 +66,14 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
66
66
  upperCaseCDS: boolean;
67
67
  charactersPerRow: number;
68
68
  feature: SimpleFeatureSerialized | undefined;
69
- mode: string;
69
+ mode: "" | "genomic" | "gene" | "gene_collapsed_intron" | "gene_updownstream" | "cdna" | "cds" | "genomic_sequence_updownstream" | "protein";
70
70
  } & {
71
71
  setFeature(f: SimpleFeatureSerialized): void;
72
72
  setUpDownBp(f: number): void;
73
73
  setIntronBp(f: number): void;
74
74
  setUpperCaseCDS(f: boolean): void;
75
75
  setShowCoordinates(f: "none" | "relative" | "genomic"): void;
76
- setMode(mode: string): void;
76
+ setMode(mode: "" | "genomic" | "gene" | "gene_collapsed_intron" | "gene_updownstream" | "cdna" | "cds" | "genomic_sequence_updownstream" | "protein"): void;
77
77
  } & {
78
78
  readonly showCoordinates: boolean;
79
79
  readonly showGenomicCoordsOption: boolean;
@@ -22,8 +22,11 @@ export interface SeqState {
22
22
  export interface ErrorState {
23
23
  error: string;
24
24
  }
25
- export declare function stitch(subfeats: Feat[], sequence: string): string;
26
- export declare function dedupe(list: Feat[]): Feat[];
25
+ export declare function stitch(subfeats: {
26
+ start: number;
27
+ end: number;
28
+ }[], sequence: string): string;
29
+ export declare function filterSuccessiveElementsWithSameStartAndEndCoord(list: Feat[]): Feat[];
27
30
  export declare function revlist(list: Feat[], seqlen: number): {
28
31
  start: number;
29
32
  end: number;