@jbrowse/core 3.3.0 → 3.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 (42) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +2 -1
  2. package/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +2 -1
  3. package/BaseFeatureWidget/BaseFeatureDetail/index.js +2 -2
  4. package/BaseFeatureWidget/stateModelFactory.d.ts +15 -10
  5. package/BaseFeatureWidget/stateModelFactory.js +7 -12
  6. package/BaseFeatureWidget/types.d.ts +9 -1
  7. package/BaseFeatureWidget/util.d.ts +4 -1
  8. package/BaseFeatureWidget/util.js +11 -0
  9. package/PluginManager.d.ts +1 -143
  10. package/PluginManager.js +3 -2
  11. package/ReExports/BaseFeatureDetails.d.ts +1 -0
  12. package/ReExports/BaseFeatureDetails.js +45 -0
  13. package/ReExports/MuiDataGridReExports.d.ts +2 -0
  14. package/ReExports/MuiDataGridReExports.js +167 -0
  15. package/ReExports/MuiReExports.d.ts +133 -0
  16. package/ReExports/MuiReExports.js +150 -0
  17. package/ReExports/lazify.d.ts +2 -0
  18. package/ReExports/lazify.js +14 -0
  19. package/ReExports/list.js +1 -0
  20. package/ReExports/modules.d.ts +1 -173
  21. package/ReExports/modules.js +36 -308
  22. package/TextSearch/TextSearchManager.d.ts +17 -2
  23. package/TextSearch/TextSearchManager.js +23 -3
  24. package/data_adapters/CytobandAdapter/CytobandAdapter.d.ts +0 -1
  25. package/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
  26. package/package.json +7 -6
  27. package/pluggableElementTypes/models/baseTrackConfig.js +25 -8
  28. package/pluggableElementTypes/renderers/FeatureRendererType.js +8 -2
  29. package/tsconfig.build.tsbuildinfo +1 -1
  30. package/ui/Dialog.d.ts +1 -0
  31. package/ui/Dialog.js +9 -3
  32. package/ui/ErrorMessageStackTraceDialog.js +2 -4
  33. package/ui/ExternalLink.d.ts +2 -0
  34. package/ui/ExternalLink.js +13 -0
  35. package/ui/index.d.ts +2 -0
  36. package/ui/index.js +5 -1
  37. package/ui/theme.d.ts +2 -2
  38. package/ui/theme.js +13 -5
  39. package/util/index.d.ts +1 -0
  40. package/util/index.js +7 -3
  41. package/util/offscreenCanvasUtils.d.ts +7 -6
  42. package/util/offscreenCanvasUtils.js +6 -6
package/ui/Dialog.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { DialogProps } from '@mui/material';
2
2
  interface Props extends DialogProps {
3
3
  header?: React.ReactNode;
4
+ titleNode?: React.ReactNode;
4
5
  }
5
6
  declare const Dialog: (props: Props) => import("react/jsx-runtime").JSX.Element;
6
7
  export default Dialog;
package/ui/Dialog.js CHANGED
@@ -19,15 +19,21 @@ const useStyles = (0, mui_1.makeStyles)()(theme => ({
19
19
  top: theme.spacing(1),
20
20
  color: theme.palette.grey[500],
21
21
  },
22
+ errorBox: {
23
+ width: 800,
24
+ margin: 40,
25
+ },
22
26
  }));
23
27
  function DialogError({ error }) {
24
- return ((0, jsx_runtime_1.jsx)("div", { style: { width: 800, margin: 40 }, children: (0, jsx_runtime_1.jsx)(ErrorMessage_1.default, { error: error }) }));
28
+ const { classes } = useStyles();
29
+ return ((0, jsx_runtime_1.jsx)("div", { className: classes.errorBox, children: (0, jsx_runtime_1.jsx)(ErrorMessage_1.default, { error: error }) }));
25
30
  }
26
31
  const Dialog = (0, mobx_react_1.observer)(function (props) {
27
32
  const { classes } = useStyles();
28
- const { title, header, children, onClose } = props;
33
+ const { titleNode, ...rest } = props;
34
+ const { title, header, children, onClose } = rest;
29
35
  const theme = (0, material_1.useTheme)();
30
- return ((0, jsx_runtime_1.jsx)(material_1.Dialog, { ...props, children: (0, jsx_runtime_1.jsxs)(material_1.ScopedCssBaseline, { children: [(0, react_1.isValidElement)(header) ? (header) : ((0, jsx_runtime_1.jsxs)(material_1.DialogTitle, { children: [(0, jsx_runtime_1.jsx)(SanitizedHTML_1.default, { html: title || '' }), onClose ? ((0, jsx_runtime_1.jsx)(material_1.IconButton, { className: classes.closeButton, onClick: () => {
36
+ return ((0, jsx_runtime_1.jsx)(material_1.Dialog, { ...rest, children: (0, jsx_runtime_1.jsxs)(material_1.ScopedCssBaseline, { children: [(0, react_1.isValidElement)(header) ? (header) : ((0, jsx_runtime_1.jsxs)(material_1.DialogTitle, { children: [titleNode || (0, jsx_runtime_1.jsx)(SanitizedHTML_1.default, { html: title || '' }), onClose ? ((0, jsx_runtime_1.jsx)(material_1.IconButton, { className: classes.closeButton, onClick: () => {
31
37
  onClose();
32
38
  }, children: (0, jsx_runtime_1.jsx)(Close_1.default, {}) })) : null] })), (0, jsx_runtime_1.jsx)(material_1.Divider, {}), (0, jsx_runtime_1.jsx)(ErrorBoundary_1.ErrorBoundary, { FallbackComponent: DialogError, children: (0, jsx_runtime_1.jsx)(material_1.ThemeProvider, { theme: (0, material_1.createTheme)(theme, {
33
39
  components: {
@@ -11,10 +11,8 @@ const copy_to_clipboard_1 = __importDefault(require("copy-to-clipboard"));
11
11
  const source_map_js_1 = require("source-map-js");
12
12
  const mui_1 = require("tss-react/mui");
13
13
  const Dialog_1 = __importDefault(require("./Dialog"));
14
+ const ExternalLink_1 = __importDefault(require("./ExternalLink"));
14
15
  const LoadingEllipses_1 = __importDefault(require("./LoadingEllipses"));
15
- function Link2({ href, children, }) {
16
- return ((0, jsx_runtime_1.jsx)(material_1.Link, { target: "_blank", href: href, children: children }));
17
- }
18
16
  async function myfetch(uri) {
19
17
  const res = await fetch(uri);
20
18
  if (!res.ok) {
@@ -106,7 +104,7 @@ function Contents({ text, extra }) {
106
104
  const email = 'jbrowse2@berkeley.edu';
107
105
  const githubLink = `https://github.com/GMOD/jbrowse-components/issues/new?labels=bug&title=JBrowse+issue&body=${err}`;
108
106
  const emailLink = `mailto:${email}?subject=JBrowse%202%20error&body=${err}`;
109
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(material_1.Typography, { children: ["Post a new issue at ", (0, jsx_runtime_1.jsx)(Link2, { href: githubLink, children: "GitHub" }), " or send an email to ", (0, jsx_runtime_1.jsx)(Link2, { href: emailLink, children: email }), ' '] }), (0, jsx_runtime_1.jsx)("pre", { className: classes.pre, children: err2 })] }));
107
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(material_1.Typography, { children: ["Post a new issue at", ' ', (0, jsx_runtime_1.jsx)(ExternalLink_1.default, { href: githubLink, children: "GitHub" }), " or send an email to ", (0, jsx_runtime_1.jsx)(ExternalLink_1.default, { href: emailLink, children: email }), ' '] }), (0, jsx_runtime_1.jsx)("pre", { className: classes.pre, children: err2 })] }));
110
108
  }
111
109
  function ErrorMessageStackTraceDialog({ error, onClose, extra, }) {
112
110
  const [mappedStackTrace, setMappedStackTrace] = (0, react_1.useState)();
@@ -0,0 +1,2 @@
1
+ import type { LinkProps } from '@mui/material';
2
+ export default function ExternalLink(props: LinkProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,13 @@
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
+ exports.default = ExternalLink;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const OpenInNew_1 = __importDefault(require("@mui/icons-material/OpenInNew"));
9
+ const material_1 = require("@mui/material");
10
+ function ExternalLink(props) {
11
+ const { children, ...rest } = props;
12
+ return ((0, jsx_runtime_1.jsxs)(material_1.Link, { ...rest, target: "_blank", rel: "noopener noreferrer", children: [children, " ", (0, jsx_runtime_1.jsx)(OpenInNew_1.default, { fontSize: "small" })] }));
13
+ }
package/ui/index.d.ts CHANGED
@@ -12,6 +12,8 @@ export { default as LoadingEllipses } from './LoadingEllipses';
12
12
  export { default as Menu } from './Menu';
13
13
  export { default as PrerenderedCanvas } from './PrerenderedCanvas';
14
14
  export { default as ResizeHandle } from './ResizeHandle';
15
+ export { default as ExternalLink } from './ExternalLink';
15
16
  export { default as SanitizedHTML } from './SanitizedHTML';
17
+ export { default as BaseTooltip } from './BaseTooltip';
16
18
  export * from './Menu';
17
19
  export declare const VIEW_HEADER_HEIGHT = 28;
package/ui/index.js CHANGED
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.VIEW_HEADER_HEIGHT = exports.SanitizedHTML = exports.ResizeHandle = exports.PrerenderedCanvas = exports.Menu = exports.LoadingEllipses = exports.FileSelector = exports.FatalErrorDialog = exports.ErrorMessage = exports.EditableTypography = exports.Dialog = exports.CascadingMenuButton = exports.CascadingMenu = exports.AssemblySelector = exports.Logomark = exports.LogoFull = void 0;
20
+ exports.VIEW_HEADER_HEIGHT = exports.BaseTooltip = exports.SanitizedHTML = exports.ExternalLink = exports.ResizeHandle = exports.PrerenderedCanvas = exports.Menu = exports.LoadingEllipses = exports.FileSelector = exports.FatalErrorDialog = exports.ErrorMessage = exports.EditableTypography = exports.Dialog = exports.CascadingMenuButton = exports.CascadingMenu = exports.AssemblySelector = exports.Logomark = exports.LogoFull = void 0;
21
21
  __exportStar(require("./theme"), exports);
22
22
  var Logo_1 = require("./Logo");
23
23
  Object.defineProperty(exports, "LogoFull", { enumerable: true, get: function () { return Logo_1.LogoFull; } });
@@ -46,7 +46,11 @@ var PrerenderedCanvas_1 = require("./PrerenderedCanvas");
46
46
  Object.defineProperty(exports, "PrerenderedCanvas", { enumerable: true, get: function () { return __importDefault(PrerenderedCanvas_1).default; } });
47
47
  var ResizeHandle_1 = require("./ResizeHandle");
48
48
  Object.defineProperty(exports, "ResizeHandle", { enumerable: true, get: function () { return __importDefault(ResizeHandle_1).default; } });
49
+ var ExternalLink_1 = require("./ExternalLink");
50
+ Object.defineProperty(exports, "ExternalLink", { enumerable: true, get: function () { return __importDefault(ExternalLink_1).default; } });
49
51
  var SanitizedHTML_1 = require("./SanitizedHTML");
50
52
  Object.defineProperty(exports, "SanitizedHTML", { enumerable: true, get: function () { return __importDefault(SanitizedHTML_1).default; } });
53
+ var BaseTooltip_1 = require("./BaseTooltip");
54
+ Object.defineProperty(exports, "BaseTooltip", { enumerable: true, get: function () { return __importDefault(BaseTooltip_1).default; } });
51
55
  __exportStar(require("./Menu"), exports);
52
56
  exports.VIEW_HEADER_HEIGHT = 28;
package/ui/theme.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { ThemeOptions } from '@mui/material/styles';
1
+ import type { ThemeOptions } from '@mui/material';
2
2
  import type { PaletteColor } from '@mui/material/styles/createPalette';
3
3
  type MaybePaletteColor = PaletteColor | undefined;
4
4
  type Frames = [
@@ -55,5 +55,5 @@ declare module '@mui/material/styles/createPalette' {
55
55
  export declare const defaultThemes: ThemeMap;
56
56
  export declare function createJBrowseBaseTheme(theme?: ThemeOptions): ThemeOptions;
57
57
  type ThemeMap = Record<string, ThemeOptions>;
58
- export declare function createJBrowseTheme(configTheme?: ThemeOptions, themes?: ThemeMap, themeName?: string): import("@mui/material/styles").Theme;
58
+ export declare function createJBrowseTheme(configTheme?: ThemeOptions, themes?: ThemeMap, themeName?: string): import("@mui/material").Theme;
59
59
  export {};
package/ui/theme.js CHANGED
@@ -6,10 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.defaultThemes = void 0;
7
7
  exports.createJBrowseBaseTheme = createJBrowseBaseTheme;
8
8
  exports.createJBrowseTheme = createJBrowseTheme;
9
+ const material_1 = require("@mui/material");
9
10
  const colors_1 = require("@mui/material/colors");
10
- const styles_1 = require("@mui/material/styles");
11
11
  const deepmerge_1 = __importDefault(require("deepmerge"));
12
- const refTheme = (0, styles_1.createTheme)();
12
+ const refTheme = (0, material_1.createTheme)();
13
13
  const midnight = refTheme.palette.augmentColor({ color: { main: '#0D233F' } });
14
14
  const grape = refTheme.palette.augmentColor({ color: { main: '#721E63' } });
15
15
  const forest = refTheme.palette.augmentColor({ color: { main: '#135560' } });
@@ -333,7 +333,7 @@ function createJBrowseBaseTheme(theme) {
333
333
  return (0, deepmerge_1.default)(themeP, theme || {}, { arrayMerge: overwriteArrayMerge });
334
334
  }
335
335
  function createJBrowseTheme(configTheme = {}, themes = exports.defaultThemes, themeName = 'default') {
336
- return (0, styles_1.createTheme)(createJBrowseBaseTheme(themeName === 'default'
336
+ return (0, material_1.createTheme)(createJBrowseBaseTheme(themeName === 'default'
337
337
  ? (0, deepmerge_1.default)(themes.default, augmentThemeColors(configTheme), {
338
338
  arrayMerge: overwriteArrayMerge,
339
339
  })
@@ -341,13 +341,21 @@ function createJBrowseTheme(configTheme = {}, themes = exports.defaultThemes, th
341
341
  }
342
342
  function augmentThemeColors(theme = {}) {
343
343
  var _a;
344
- for (const entry of ['tertiary', 'quaternary', 'highlight']) {
344
+ for (const entry of [
345
+ 'primary',
346
+ 'secondary',
347
+ 'tertiary',
348
+ 'quaternary',
349
+ 'highlight',
350
+ ]) {
345
351
  if ((_a = theme.palette) === null || _a === void 0 ? void 0 : _a[entry]) {
346
352
  theme = (0, deepmerge_1.default)(theme, {
347
353
  palette: {
348
354
  [entry]: refTheme.palette.augmentColor('color' in theme.palette[entry]
349
355
  ? theme.palette[entry]
350
- : { color: theme.palette[entry] }),
356
+ : {
357
+ color: theme.palette[entry],
358
+ }),
351
359
  },
352
360
  });
353
361
  }
package/util/index.d.ts CHANGED
@@ -259,6 +259,7 @@ export declare function fetchAndMaybeUnzipText(loc: GenericFilehandle, opts?: Ba
259
259
  export declare function isObject(x: unknown): x is Record<string | symbol | number, unknown>;
260
260
  export declare function localStorageGetNumber(key: string, defaultVal: number): number;
261
261
  export declare function localStorageGetBoolean(key: string, defaultVal: boolean): boolean;
262
+ export declare function localStorageSetBoolean(key: string, value: boolean): void;
262
263
  export declare function forEachWithStopTokenCheck<T>(iter: Iterable<T>, stopToken: string | undefined, arg: (arg: T, idx: number) => void, durationMs?: number): void;
263
264
  export declare function testAdapter(fileName: string, regex: RegExp, adapterHint: string | undefined, expected: string): boolean;
264
265
  export { type Feature, type SimpleFeatureSerialized, type SimpleFeatureSerializedNoId, default as SimpleFeature, isFeature, } from './simpleFeature';
package/util/index.js CHANGED
@@ -96,6 +96,7 @@ exports.fetchAndMaybeUnzipText = fetchAndMaybeUnzipText;
96
96
  exports.isObject = isObject;
97
97
  exports.localStorageGetNumber = localStorageGetNumber;
98
98
  exports.localStorageGetBoolean = localStorageGetBoolean;
99
+ exports.localStorageSetBoolean = localStorageSetBoolean;
99
100
  exports.forEachWithStopTokenCheck = forEachWithStopTokenCheck;
100
101
  exports.testAdapter = testAdapter;
101
102
  const react_1 = require("react");
@@ -984,9 +985,9 @@ function renderToStaticMarkup(node) {
984
985
  function isGzip(buf) {
985
986
  return buf[0] === 31 && buf[1] === 139 && buf[2] === 8;
986
987
  }
987
- async function fetchAndMaybeUnzip(loc, opts) {
988
- const { statusCallback = () => { } } = opts || {};
989
- const buf = (await updateStatus('Downloading file', statusCallback, () => loc.readFile(opts)));
988
+ async function fetchAndMaybeUnzip(loc, opts = {}) {
989
+ const { statusCallback = () => { } } = opts;
990
+ const buf = await updateStatus('Downloading file', statusCallback, () => loc.readFile(opts));
990
991
  return isGzip(buf)
991
992
  ? await updateStatus('Unzipping', statusCallback, () => (0, bgzf_filehandle_1.unzip)(buf))
992
993
  : buf;
@@ -1008,6 +1009,9 @@ function localStorageGetNumber(key, defaultVal) {
1008
1009
  function localStorageGetBoolean(key, defaultVal) {
1009
1010
  return Boolean(JSON.parse(localStorageGetItem(key) || JSON.stringify(defaultVal)));
1010
1011
  }
1012
+ function localStorageSetBoolean(key, value) {
1013
+ localStorageSetItem(key, JSON.stringify(value));
1014
+ }
1011
1015
  function forEachWithStopTokenCheck(iter, stopToken, arg, durationMs = 400) {
1012
1016
  let start = performance.now();
1013
1017
  let i = 0;
@@ -6,13 +6,14 @@ interface RenderToAbstractCanvasOptions {
6
6
  exportSVG?: ExportSVGOptions;
7
7
  highResolutionScaling?: number;
8
8
  }
9
- export declare function renderToAbstractCanvas<T>(width: number, height: number, opts: RenderToAbstractCanvasOptions, cb: (ctx: CanvasRenderingContext2D) => T): Promise<(Awaited<T> & {
10
- canvasRecordedData: any;
11
- }) | (Awaited<T> & {
12
- reactElement: import("react/jsx-runtime").JSX.Element;
13
- }) | (Awaited<T> & {
9
+ type R<T extends Record<string, unknown> | undefined> = Omit<T, never> & ({
10
+ canvasRecordedData: Record<string, unknown>;
11
+ } | {
14
12
  imageData: any;
15
- })>;
13
+ } | {
14
+ reactElement: React.ReactElement;
15
+ });
16
+ export declare function renderToAbstractCanvas<T extends Record<string, unknown> | undefined>(width: number, height: number, opts: RenderToAbstractCanvasOptions, cb: (ctx: CanvasRenderingContext2D) => Promise<T> | T): Promise<R<T>>;
16
17
  export declare function getSerializedSvg(results: {
17
18
  width: number;
18
19
  height: number;
@@ -46,9 +46,9 @@ async function renderToAbstractCanvas(width, height, opts, cb) {
46
46
  if (exportSVG) {
47
47
  if (!exportSVG.rasterizeLayers) {
48
48
  const fakeCtx = new canvas_sequencer_1.CanvasSequence();
49
- const result = await cb(fakeCtx);
49
+ const callbackResult = await cb(fakeCtx);
50
50
  return {
51
- ...result,
51
+ ...callbackResult,
52
52
  canvasRecordedData: fakeCtx.toJSON(),
53
53
  };
54
54
  }
@@ -60,9 +60,9 @@ async function renderToAbstractCanvas(width, height, opts, cb) {
60
60
  throw new Error('2d canvas rendering not supported on this platform');
61
61
  }
62
62
  ctx.scale(s, s);
63
- const result = await cb(ctx);
63
+ const callbackResult = await cb(ctx);
64
64
  return {
65
- ...result,
65
+ ...callbackResult,
66
66
  reactElement: ((0, jsx_runtime_1.jsx)("image", { width: width, height: height, xlinkHref: 'convertToBlob' in canvas
67
67
  ? await (0, blobToDataURL_1.blobToDataURL)(await canvas.convertToBlob({
68
68
  type: 'image/png',
@@ -79,9 +79,9 @@ async function renderToAbstractCanvas(width, height, opts, cb) {
79
79
  throw new Error('2d canvas rendering not supported on this platform');
80
80
  }
81
81
  ctx.scale(s, s);
82
- const result = await cb(ctx);
82
+ const callbackResult = await cb(ctx);
83
83
  return {
84
- ...result,
84
+ ...callbackResult,
85
85
  imageData: await (0, offscreenCanvasPonyfill_1.createImageBitmap)(canvas),
86
86
  };
87
87
  }