@jbrowse/core 3.6.4 → 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 (63) 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 +33 -4
  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 +18 -12
  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/types/index.d.ts +2 -2
  60. package/util/useFeatureSequence.d.ts +19 -0
  61. package/util/useFeatureSequence.js +90 -0
  62. package/BaseFeatureWidget/SequenceFeatureDetails/hooks.d.ts +0 -10
  63. package/BaseFeatureWidget/SequenceFeatureDetails/hooks.js +0 -65
@@ -1,5 +1,5 @@
1
1
  export default function BaseTooltip({ clientPoint: clientPointCoords, children, placement, }: {
2
- placement?: 'left' | 'right';
2
+ placement?: 'top' | 'top-start' | 'top-end' | 'right' | 'right-start' | 'right-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end';
3
3
  clientPoint?: {
4
4
  x: number;
5
5
  y: number;
@@ -6,7 +6,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const jsx_runtime_1 = require("react/jsx-runtime");
7
7
  const react_1 = require("react");
8
8
  const ChevronRight_1 = __importDefault(require("@mui/icons-material/ChevronRight"));
9
+ const HelpOutline_1 = __importDefault(require("@mui/icons-material/HelpOutline"));
9
10
  const material_1 = require("@mui/material");
11
+ const Dialog_1 = __importDefault(require("./Dialog"));
10
12
  const HoverMenu_1 = __importDefault(require("./HoverMenu"));
11
13
  const Menu_1 = require("./Menu");
12
14
  const hooks_1 = require("./hooks");
@@ -14,7 +16,24 @@ const CascadingContext = (0, react_1.createContext)({
14
16
  parentPopupState: undefined,
15
17
  rootPopupState: undefined,
16
18
  });
17
- function CascadingMenuItem({ onClick, closeAfterItemClick, ...props }) {
19
+ function HelpIconButton({ helpText }) {
20
+ const [helpDialogOpen, setHelpDialogOpen] = (0, react_1.useState)(false);
21
+ const handleHelpClick = (event) => {
22
+ event.stopPropagation();
23
+ setHelpDialogOpen(true);
24
+ };
25
+ const handleClose = (event) => {
26
+ event.stopPropagation();
27
+ setHelpDialogOpen(false);
28
+ };
29
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.IconButton, { size: "small", onClick: handleHelpClick, style: { marginLeft: 4, padding: 4 }, children: (0, jsx_runtime_1.jsx)(HelpOutline_1.default, { fontSize: "small" }) }), (0, jsx_runtime_1.jsx)(Dialog_1.default, { open: helpDialogOpen, onClose: handleClose, title: "Help", onClick: e => {
30
+ e.stopPropagation();
31
+ }, children: (0, jsx_runtime_1.jsx)(material_1.DialogContent, { children: helpText }) })] }));
32
+ }
33
+ function HelpIconSpacer() {
34
+ return (0, jsx_runtime_1.jsx)("div", { style: { marginLeft: 4, padding: 4, width: 28, height: 28 } });
35
+ }
36
+ function CascadingMenuItem({ onClick, closeAfterItemClick, children, ...props }) {
18
37
  const { rootPopupState, parentPopupState } = (0, react_1.useContext)(CascadingContext);
19
38
  if (!rootPopupState) {
20
39
  throw new Error('must be used inside a CascadingMenu');
@@ -29,14 +48,21 @@ function CascadingMenuItem({ onClick, closeAfterItemClick, ...props }) {
29
48
  parentPopupState.childHandle.close();
30
49
  parentPopupState.setChildHandle(undefined);
31
50
  }
32
- } }));
51
+ }, children: children }));
33
52
  }
34
53
  function CascadingSubmenu({ title, Icon, inset, ...props }) {
35
54
  const { parentPopupState } = (0, react_1.useContext)(CascadingContext);
36
55
  const popupState = (0, hooks_1.usePopupState)({
37
56
  parentPopupState,
38
57
  });
39
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(material_1.MenuItem, { ...(0, hooks_1.bindFocus)(popupState), ...(0, hooks_1.bindHover)(popupState), children: [Icon ? ((0, jsx_runtime_1.jsx)(material_1.ListItemIcon, { children: (0, jsx_runtime_1.jsx)(Icon, {}) })) : null, (0, jsx_runtime_1.jsx)(material_1.ListItemText, { primary: title, inset: inset }), (0, jsx_runtime_1.jsx)(ChevronRight_1.default, {})] }), (0, jsx_runtime_1.jsx)(CascadingSubmenuHover, { ...props, anchorOrigin: { vertical: 'top', horizontal: 'right' }, transformOrigin: { vertical: 'top', horizontal: 'left' }, popupState: popupState })] }));
58
+ const { onMouseOver: originalOnMouseOver, ...hoverProps } = (0, hooks_1.bindHover)(popupState);
59
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(material_1.MenuItem, { ...(0, hooks_1.bindFocus)(popupState), ...hoverProps, onMouseOver: event => {
60
+ if (parentPopupState === null || parentPopupState === void 0 ? void 0 : parentPopupState.childHandle) {
61
+ parentPopupState.childHandle.close();
62
+ parentPopupState.setChildHandle(undefined);
63
+ }
64
+ originalOnMouseOver(event);
65
+ }, children: [Icon ? ((0, jsx_runtime_1.jsx)(material_1.ListItemIcon, { children: (0, jsx_runtime_1.jsx)(Icon, {}) })) : null, (0, jsx_runtime_1.jsx)(material_1.ListItemText, { primary: title, inset: inset }), (0, jsx_runtime_1.jsx)(ChevronRight_1.default, {})] }), (0, jsx_runtime_1.jsx)(CascadingSubmenuHover, { ...props, anchorOrigin: { vertical: 'top', horizontal: 'right' }, transformOrigin: { vertical: 'top', horizontal: 'left' }, popupState: popupState })] }));
40
66
  }
41
67
  function CascadingSubmenuHover({ popupState, onMenuItemClick, menuItems, classes, ...props }) {
42
68
  const { rootPopupState } = (0, react_1.useContext)(CascadingContext);
@@ -65,6 +91,9 @@ function EndDecoration({ item }) {
65
91
  }
66
92
  function CascadingMenuList({ onMenuItemClick, closeAfterItemClick, menuItems, ...props }) {
67
93
  const hasIcon = menuItems.some(m => 'icon' in m && m.icon);
94
+ const hasCheckboxOrRadioWithHelp = menuItems.some(m => (m.type === 'checkbox' || m.type === 'radio') &&
95
+ 'helpText' in m &&
96
+ m.helpText);
68
97
  return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: menuItems
69
98
  .toSorted((a, b) => (b.priority || 0) - (a.priority || 0))
70
99
  .map((item, idx) => {
@@ -72,7 +101,7 @@ function CascadingMenuList({ onMenuItemClick, closeAfterItemClick, menuItems, ..
72
101
  ? event => {
73
102
  onMenuItemClick(event, item.onClick);
74
103
  }
75
- : undefined, disabled: Boolean(item.disabled), children: [item.icon ? ((0, jsx_runtime_1.jsx)(material_1.ListItemIcon, { children: (0, jsx_runtime_1.jsx)(item.icon, {}) })) : null, ' ', (0, jsx_runtime_1.jsx)(material_1.ListItemText, { primary: item.label, secondary: item.subLabel, inset: hasIcon && !item.icon }), (0, jsx_runtime_1.jsx)(CascadingSpacer, {}), (0, jsx_runtime_1.jsx)(EndDecoration, { item: item })] }, `${item.label}-${idx}`));
104
+ : undefined, disabled: Boolean(item.disabled), children: [item.icon ? ((0, jsx_runtime_1.jsx)(material_1.ListItemIcon, { children: (0, jsx_runtime_1.jsx)(item.icon, {}) })) : null, ' ', (0, jsx_runtime_1.jsx)(material_1.ListItemText, { primary: item.label, secondary: item.subLabel, inset: hasIcon && !item.icon }), (0, jsx_runtime_1.jsx)(CascadingSpacer, {}), (0, jsx_runtime_1.jsx)(EndDecoration, { item: item }), item.type === 'checkbox' || item.type === 'radio' ? ('helpText' in item && item.helpText ? ((0, jsx_runtime_1.jsx)(HelpIconButton, { helpText: item.helpText })) : hasCheckboxOrRadioWithHelp ? ((0, jsx_runtime_1.jsx)(HelpIconSpacer, {})) : null) : 'helpText' in item && item.helpText ? ((0, jsx_runtime_1.jsx)(HelpIconButton, { helpText: item.helpText })) : null] }, `${item.label}-${idx}`));
76
105
  }) }));
77
106
  }
78
107
  function CascadingSpacer() {
@@ -0,0 +1,10 @@
1
+ import type { DialogProps } from '@mui/material';
2
+ interface Props extends DialogProps {
3
+ header?: React.ReactNode;
4
+ onCancel: () => void;
5
+ onSubmit: () => void;
6
+ cancelText?: string;
7
+ submitText?: string;
8
+ }
9
+ declare const ConfirmDialog: (props: Props) => import("react/jsx-runtime").JSX.Element;
10
+ export default ConfirmDialog;
@@ -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 jsx_runtime_1 = require("react/jsx-runtime");
7
+ const material_1 = require("@mui/material");
8
+ const mobx_react_1 = require("mobx-react");
9
+ const Dialog_1 = __importDefault(require("./Dialog"));
10
+ const ConfirmDialog = (0, mobx_react_1.observer)(function (props) {
11
+ const { onSubmit, onCancel, cancelText = 'Cancel', submitText = 'OK', children, } = props;
12
+ return ((0, jsx_runtime_1.jsxs)(Dialog_1.default, { onClose: onCancel, ...props, children: [(0, jsx_runtime_1.jsx)(material_1.DialogContent, { children: children }), (0, jsx_runtime_1.jsxs)(material_1.DialogActions, { children: [(0, jsx_runtime_1.jsx)(material_1.Button, { color: "secondary", variant: "contained", onClick: () => {
13
+ onCancel();
14
+ }, children: cancelText }), (0, jsx_runtime_1.jsx)(material_1.Button, { color: "primary", variant: "contained", onClick: () => {
15
+ onSubmit();
16
+ }, children: submitText })] })] }));
17
+ });
18
+ exports.default = ConfirmDialog;
@@ -31,13 +31,6 @@ const EditableTypography = (0, react_1.forwardRef)(function EditableTypography2(
31
31
  const [ref2, { width }] = (0, useMeasure_1.default)();
32
32
  const [editedValue, setEditedValue] = (0, react_1.useState)();
33
33
  const [inputNode, setInputNode] = (0, react_1.useState)(null);
34
- const [blur, setBlur] = (0, react_1.useState)(false);
35
- (0, react_1.useEffect)(() => {
36
- if (blur) {
37
- inputNode === null || inputNode === void 0 ? void 0 : inputNode.blur();
38
- setBlur(false);
39
- }
40
- }, [blur, inputNode]);
41
34
  const { classes } = useStyles(props, { props });
42
35
  const theme = (0, material_1.useTheme)();
43
36
  const val = editedValue === undefined ? value : editedValue;
@@ -62,7 +55,7 @@ const EditableTypography = (0, react_1.forwardRef)(function EditableTypography2(
62
55
  }
63
56
  else if (event.key === 'Escape') {
64
57
  setEditedValue(undefined);
65
- setBlur(true);
58
+ inputNode === null || inputNode === void 0 ? void 0 : inputNode.blur();
66
59
  }
67
60
  }, onBlur: () => {
68
61
  setValue(editedValue || value || '');
@@ -1,6 +1,7 @@
1
1
  import type { TypographyProps } from '@mui/material';
2
2
  interface Props extends TypographyProps {
3
3
  message?: string;
4
+ children?: never;
4
5
  }
5
- export default function LoadingEllipses({ message, variant, ...rest }: Props): import("react/jsx-runtime").JSX.Element;
6
+ export default function LoadingEllipses({ message, children, variant, ...rest }: Props): import("react/jsx-runtime").JSX.Element;
6
7
  export {};
@@ -29,7 +29,7 @@ const useStyles = (0, mui_1.makeStyles)()({
29
29
  },
30
30
  },
31
31
  });
32
- function LoadingEllipses({ message, variant = 'body2', ...rest }) {
32
+ function LoadingEllipses({ message, children, variant = 'body2', ...rest }) {
33
33
  const { cx, classes } = useStyles();
34
34
  return ((0, jsx_runtime_1.jsx)(material_1.Typography, { className: cx(classes.dots, rest.className), ...rest, variant: variant, children: message || 'Loading' }));
35
35
  }
package/ui/Menu.d.ts CHANGED
@@ -25,6 +25,7 @@ export interface BaseMenuItem {
25
25
  subLabel?: string;
26
26
  icon?: React.ComponentType<SvgIconProps>;
27
27
  disabled?: boolean;
28
+ helpText?: string;
28
29
  }
29
30
  export interface NormalMenuItem extends BaseMenuItem {
30
31
  type?: 'normal';
package/ui/Menu.js CHANGED
@@ -116,7 +116,7 @@ const MenuPage = (0, react_1.forwardRef)(function MenuPage2(props, ref) {
116
116
  clearTimeout(timer);
117
117
  };
118
118
  }, [isSubMenuOpen, open, subMenuAnchorEl]);
119
- (0, react_1.useEffect)(() => {
119
+ (0, react_1.useLayoutEffect)(() => {
120
120
  if (anchorEl) {
121
121
  const rect = anchorEl.getBoundingClientRect();
122
122
  if (position) {
@@ -220,7 +220,7 @@ const MenuPage = (0, react_1.forwardRef)(function MenuPage2(props, ref) {
220
220
  });
221
221
  function Menu(props) {
222
222
  const { open, onClose, menuItems, onMenuItemClick, ...other } = props;
223
- return ((0, jsx_runtime_1.jsx)(material_1.Popover, { open: open, onClose: onClose, anchorOrigin: {
223
+ return ((0, jsx_runtime_1.jsx)(material_1.Popover, { open: open, onClose: onClose, style: { zIndex: 10000, ...other.style }, anchorOrigin: {
224
224
  vertical: 'bottom',
225
225
  horizontal: 'right',
226
226
  ...other.anchorOrigin,
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.default = SanitizedHTML;
7
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = require("react");
8
9
  const dompurify_1 = __importDefault(require("dompurify"));
9
10
  const escape_html_1 = __importDefault(require("escape-html"));
10
11
  const util_1 = require("../util");
@@ -42,22 +43,24 @@ const htmlTags = [
42
43
  'ul',
43
44
  ];
44
45
  let added = false;
45
- const full = new RegExp(htmlTags.map(tag => `<${tag}\\b[^>]*>`).join('|'), 'i');
46
+ const full = new RegExp(htmlTags.map(tag => String.raw `<${tag}\b[^>]*>`).join('|'), 'i');
46
47
  function isHTML(str) {
47
48
  return full.test(str);
48
49
  }
49
50
  function SanitizedHTML({ html: pre, className, }) {
50
51
  const html = (0, util_1.linkify)(`${pre}`);
51
52
  const value = isHTML(html) ? html : (0, escape_html_1.default)(html);
52
- if (!added) {
53
- added = true;
54
- dompurify_1.default.addHook('afterSanitizeAttributes', node => {
55
- if (node.tagName === 'A') {
56
- node.setAttribute('rel', 'noopener noreferrer');
57
- node.setAttribute('target', '_blank');
58
- }
59
- });
60
- }
53
+ (0, react_1.useEffect)(() => {
54
+ if (!added) {
55
+ added = true;
56
+ dompurify_1.default.addHook('afterSanitizeAttributes', node => {
57
+ if (node.tagName === 'A') {
58
+ node.setAttribute('rel', 'noopener noreferrer');
59
+ node.setAttribute('target', '_blank');
60
+ }
61
+ });
62
+ }
63
+ }, []);
61
64
  return ((0, jsx_runtime_1.jsx)("span", { className: className, dangerouslySetInnerHTML: {
62
65
  __html: dompurify_1.default.sanitize(value),
63
66
  } }));
package/util/aborting.js CHANGED
@@ -44,5 +44,5 @@ function isAbortException(exception) {
44
44
  return (exception instanceof Error &&
45
45
  (exception.name === 'AbortError' ||
46
46
  exception.code === 'ERR_ABORTED' ||
47
- !!/\b(aborted|aborterror)\b/i.test(exception.message)));
47
+ /\b(aborted|aborterror)\b/i.test(exception.message)));
48
48
  }
package/util/cluster.js CHANGED
@@ -27,15 +27,18 @@ function averageDistance(setA, setB, distances) {
27
27
  return distance / setA.length / setB.length;
28
28
  }
29
29
  function clusterData({ data, distance = euclideanDistance, linkage = averageDistance, onProgress, stopToken, }) {
30
- let start = performance.now();
30
+ let stopTokenCheckerStart = performance.now();
31
+ let progressStart = performance.now();
31
32
  const distances = [];
32
33
  for (let i = 0; i < data.length; i++) {
33
- if (performance.now() - start > 400) {
34
+ const r = performance.now();
35
+ if (r - stopTokenCheckerStart > 400) {
34
36
  (0, stopToken_1.checkStopToken)(stopToken);
35
- start = performance.now();
37
+ stopTokenCheckerStart = performance.now();
36
38
  }
37
- if (onProgress) {
38
- onProgress(`Making distance matrix: ${toP(i / (data.length - 1))}%`);
39
+ if (r - progressStart > 50) {
40
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress(`Making distance matrix: ${toP(i / (data.length - 1))}%`);
41
+ progressStart = performance.now();
39
42
  }
40
43
  const row = [];
41
44
  for (let j = 0; j < data.length; j++) {
@@ -45,17 +48,20 @@ function clusterData({ data, distance = euclideanDistance, linkage = averageDist
45
48
  }
46
49
  const clusters = data.map((_datum, index) => ({
47
50
  height: 0,
48
- indexes: [Number(index)],
51
+ indexes: [index],
49
52
  }));
50
53
  let clustersGivenK = [];
51
- start = performance.now();
54
+ stopTokenCheckerStart = performance.now();
55
+ progressStart = performance.now();
52
56
  for (let iteration = 0; iteration < data.length; iteration++) {
53
- if (performance.now() - start > 400) {
57
+ const r = performance.now();
58
+ if (r - stopTokenCheckerStart > 400) {
54
59
  (0, stopToken_1.checkStopToken)(stopToken);
55
- start = performance.now();
60
+ stopTokenCheckerStart = performance.now();
56
61
  }
57
- if (onProgress) {
58
- onProgress(`Clustering: ${toP((iteration + 1) / data.length)}%`);
62
+ if (r - progressStart > 50) {
63
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress(`Clustering: ${toP((iteration + 1) / data.length)}%`);
64
+ progressStart = performance.now();
59
65
  }
60
66
  clustersGivenK.push(clusters.map(cluster => cluster.indexes));
61
67
  if (iteration >= data.length - 1) {
@@ -2,3 +2,4 @@ export declare function contrastingTextColor(color: string): string;
2
2
  export declare function emphasize(color: string, coefficient?: number): string;
3
3
  export declare function makeContrasting(foreground: string, background?: string, minContrastRatio?: number): string;
4
4
  export { isNamedColor, namedColorToHex } from './cssColorsLevel4';
5
+ export declare function randomColor(str: string): string;
@@ -4,6 +4,7 @@ exports.namedColorToHex = exports.isNamedColor = void 0;
4
4
  exports.contrastingTextColor = contrastingTextColor;
5
5
  exports.emphasize = emphasize;
6
6
  exports.makeContrasting = makeContrasting;
7
+ exports.randomColor = randomColor;
7
8
  const styles_1 = require("@mui/material/styles");
8
9
  const cssColorsLevel4_1 = require("./cssColorsLevel4");
9
10
  function contrastingTextColor(color) {
@@ -38,3 +39,10 @@ function makeContrasting(foreground, background = 'white', minContrastRatio = 3)
38
39
  var cssColorsLevel4_2 = require("./cssColorsLevel4");
39
40
  Object.defineProperty(exports, "isNamedColor", { enumerable: true, get: function () { return cssColorsLevel4_2.isNamedColor; } });
40
41
  Object.defineProperty(exports, "namedColorToHex", { enumerable: true, get: function () { return cssColorsLevel4_2.namedColorToHex; } });
42
+ function randomColor(str) {
43
+ let sum = 0;
44
+ for (let i = 0; i < str.length; i++) {
45
+ sum += str.charCodeAt(i);
46
+ }
47
+ return `hsl(${sum * 10}, 50%, 50%)`;
48
+ }
@@ -6,6 +6,6 @@ export default class CompositeMap<T, U> {
6
6
  values(): Generator<U, void, unknown>;
7
7
  keys(): Generator<T, void, unknown>;
8
8
  find<V>(f: (arg0: U) => V): U | undefined;
9
- [Symbol.iterator](): Generator<(T | U | undefined)[], void, unknown>;
10
- entries(): Generator<(T | U | undefined)[], void, unknown>;
9
+ [Symbol.iterator](): Generator<readonly [T, U | undefined], void, unknown>;
10
+ entries(): Generator<readonly [T, U | undefined], void, unknown>;
11
11
  }
@@ -0,0 +1,6 @@
1
+ import type { Feat } from '../BaseFeatureWidget/util';
2
+ export declare function convertCodingSequenceToPeptides({ cds, sequence, codonTable, }: {
3
+ cds: Feat[];
4
+ sequence: string;
5
+ codonTable: Record<string, string>;
6
+ }): string;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertCodingSequenceToPeptides = convertCodingSequenceToPeptides;
4
+ const util_1 = require("../BaseFeatureWidget/util");
5
+ function convertCodingSequenceToPeptides({ cds, sequence, codonTable, }) {
6
+ const str = (0, util_1.stitch)(cds, sequence);
7
+ let protein = '';
8
+ for (let i = 0; i < str.length; i += 3) {
9
+ protein += codonTable[str.slice(i, i + 3)] || '&';
10
+ }
11
+ return protein;
12
+ }
@@ -0,0 +1,8 @@
1
+ import type { AbstractSessionModel } from './types';
2
+ export declare function fetchSeq({ start, end, refName, assemblyName, session, }: {
3
+ start: number;
4
+ end: number;
5
+ refName: string;
6
+ assemblyName: string;
7
+ session: AbstractSessionModel;
8
+ }): Promise<string>;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchSeq = fetchSeq;
4
+ const configuration_1 = require("../configuration");
5
+ async function fetchSeq({ start, end, refName, assemblyName, session, }) {
6
+ const { rpcManager, assemblyManager } = session;
7
+ const assembly = await assemblyManager.waitForAssembly(assemblyName);
8
+ if (!assembly) {
9
+ throw new Error('assembly not found');
10
+ }
11
+ const sessionId = 'getSequence';
12
+ const canonicalRefName = assembly.getCanonicalRefName(refName);
13
+ const feats = await rpcManager.call(sessionId, 'CoreGetFeatures', {
14
+ adapterConfig: (0, configuration_1.getConf)(assembly, ['sequence', 'adapter']),
15
+ sessionId,
16
+ regions: [
17
+ {
18
+ start,
19
+ end,
20
+ refName: canonicalRefName,
21
+ assemblyName,
22
+ },
23
+ ],
24
+ });
25
+ const [feat] = feats;
26
+ return (feat === null || feat === void 0 ? void 0 : feat.get('seq')) || '';
27
+ }
@@ -0,0 +1,25 @@
1
+ export default class Flatbush {
2
+ static from(data: ArrayBufferLike, byteOffset?: number): Flatbush;
3
+ constructor(numItems: number, nodeSize?: number, ArrayType?: TypedArrayConstructor, ArrayBufferType?: ArrayBufferConstructor | SharedArrayBufferConstructor, data?: ArrayBufferLike, byteOffset?: number);
4
+ numItems: number;
5
+ nodeSize: number;
6
+ byteOffset: number;
7
+ _levelBounds: number[];
8
+ ArrayType: TypedArrayConstructor;
9
+ IndexArrayType: Uint16ArrayConstructor | Uint32ArrayConstructor;
10
+ data: ArrayBufferLike;
11
+ _boxes: Int8Array<ArrayBuffer> | Float64Array<ArrayBuffer> | Uint8Array<ArrayBuffer> | Uint8ClampedArray<ArrayBuffer> | Int16Array<ArrayBuffer> | Uint16Array<ArrayBuffer> | Int32Array<ArrayBuffer> | Uint32Array<ArrayBuffer> | Float32Array<ArrayBuffer>;
12
+ _indices: Uint16Array<ArrayBuffer> | Uint32Array<ArrayBuffer>;
13
+ _pos: number;
14
+ minX: number | undefined;
15
+ minY: number | undefined;
16
+ maxX: number | undefined;
17
+ maxY: number | undefined;
18
+ _queue: FlatQueue<number>;
19
+ add(minX: number, minY: number, maxX?: number, maxY?: number): number;
20
+ finish(): void;
21
+ search(minX: number, minY: number, maxX: number, maxY: number, filterFn?: (index: number, x0: number, y0: number, x1: number, y1: number) => boolean): number[];
22
+ neighbors(x: number, y: number, maxResults?: number, maxDistance?: number, filterFn?: (index: number) => boolean): number[];
23
+ }
24
+ export type TypedArrayConstructor = Int8ArrayConstructor | Uint8ArrayConstructor | Uint8ClampedArrayConstructor | Int16ArrayConstructor | Uint16ArrayConstructor | Int32ArrayConstructor | Uint32ArrayConstructor | Float32ArrayConstructor | Float64ArrayConstructor;
25
+ import FlatQueue from '../flatqueue';