@jbrowse/core 3.2.0 → 3.3.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 (29) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +2 -1
  2. package/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +4 -4
  3. package/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +10 -9
  4. package/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.js +3 -13
  5. package/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +2 -1
  6. package/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +2 -2
  7. package/PluginManager.d.ts +1 -1
  8. package/ReExports/modules.d.ts +1 -1
  9. package/ReExports/modules.js +1 -22
  10. package/assemblyManager/assemblyManager.js +1 -1
  11. package/data_adapters/BaseAdapter/BaseAdapter.d.ts +2 -2
  12. package/data_adapters/BaseAdapter/BaseAdapter.js +1 -0
  13. package/package.json +5 -5
  14. package/pluggableElementTypes/renderers/CircularChordRendererType.js +8 -9
  15. package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.d.ts +2 -4
  16. package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.js +2 -30
  17. package/pluggableElementTypes/renderers/ServerSideRenderedContent.d.ts +1 -1
  18. package/pluggableElementTypes/renderers/ServerSideRenderedContent.js +2 -30
  19. package/pluggableElementTypes/renderers/ServerSideRendererType.js +6 -7
  20. package/tsconfig.build.tsbuildinfo +1 -1
  21. package/ui/DataGridFlexContainer.d.ts +3 -0
  22. package/ui/DataGridFlexContainer.js +15 -0
  23. package/ui/theme.js +5 -5
  24. package/util/cluster.d.ts +17 -0
  25. package/util/cluster.js +96 -0
  26. package/util/index.d.ts +2 -1
  27. package/util/index.js +6 -1
  28. package/util/offscreenCanvasUtils.d.ts +11 -11
  29. package/util/offscreenCanvasUtils.js +4 -1
@@ -0,0 +1,3 @@
1
+ export default function DataGridFlexContainer({ children, }: {
2
+ children: React.ReactNode;
3
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = DataGridFlexContainer;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const mui_1 = require("tss-react/mui");
6
+ const useStyles = (0, mui_1.makeStyles)()({
7
+ flexContainer: {
8
+ display: 'flex',
9
+ flexDirection: 'column',
10
+ },
11
+ });
12
+ function DataGridFlexContainer({ children, }) {
13
+ const { classes } = useStyles();
14
+ return (0, jsx_runtime_1.jsx)("div", { className: classes.flexContainer, children: children });
15
+ }
package/ui/theme.js CHANGED
@@ -10,8 +10,8 @@ const colors_1 = require("@mui/material/colors");
10
10
  const styles_1 = require("@mui/material/styles");
11
11
  const deepmerge_1 = __importDefault(require("deepmerge"));
12
12
  const refTheme = (0, styles_1.createTheme)();
13
- const midnight = '#0D233F';
14
- const grape = '#721E63';
13
+ const midnight = refTheme.palette.augmentColor({ color: { main: '#0D233F' } });
14
+ const grape = refTheme.palette.augmentColor({ color: { main: '#721E63' } });
15
15
  const forest = refTheme.palette.augmentColor({ color: { main: '#135560' } });
16
16
  const mandarin = refTheme.palette.augmentColor({ color: { main: '#FFB11D' } });
17
17
  const lightgrey = refTheme.palette.augmentColor({ color: { main: '#aaa' } });
@@ -47,6 +47,9 @@ const hardclip = '#f00';
47
47
  const softclip = '#00f';
48
48
  const skip = '#97b8c9';
49
49
  const defaults = {
50
+ primary: midnight,
51
+ secondary: grape,
52
+ tertiary: forest,
50
53
  quaternary: mandarin,
51
54
  highlight: mandarin,
52
55
  stopCodon,
@@ -65,9 +68,6 @@ function stockTheme() {
65
68
  palette: {
66
69
  ...defaults,
67
70
  mode: undefined,
68
- primary: { main: midnight },
69
- secondary: { main: grape },
70
- tertiary: forest,
71
71
  },
72
72
  components: {
73
73
  MuiLink: {
@@ -0,0 +1,17 @@
1
+ export declare function euclideanDistance(a: number[], b: number[]): number;
2
+ export declare function averageDistance(setA: number[], setB: number[], distances: number[][]): number;
3
+ export declare function clusterData({ data, distance, linkage, onProgress, stopToken, }: {
4
+ data: number[][];
5
+ distance?: (a: number[], b: number[]) => number;
6
+ linkage?: (a: number[], b: number[], distances: number[][]) => number;
7
+ onProgress?: (a: string) => void;
8
+ stopToken?: string;
9
+ }): {
10
+ clusters: {
11
+ height: number;
12
+ indexes: number[];
13
+ } | undefined;
14
+ distances: number[][];
15
+ order: number[];
16
+ clustersGivenK: number[][][];
17
+ };
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.euclideanDistance = euclideanDistance;
4
+ exports.averageDistance = averageDistance;
5
+ exports.clusterData = clusterData;
6
+ const stopToken_1 = require("@jbrowse/core/util/stopToken");
7
+ function toP(n) {
8
+ return Number.parseFloat((n * 100).toFixed(1));
9
+ }
10
+ function euclideanDistance(a, b) {
11
+ const size = Math.min(a.length, b.length);
12
+ let sum = 0;
13
+ for (let index = 0; index < size; index++) {
14
+ sum += (a[index] - b[index]) * (a[index] - b[index]);
15
+ }
16
+ return Math.sqrt(sum);
17
+ }
18
+ function averageDistance(setA, setB, distances) {
19
+ let distance = 0;
20
+ const lenA = setA.length;
21
+ const lenB = setB.length;
22
+ for (let i = 0; i < lenA; i++) {
23
+ for (let j = 0; j < lenB; j++) {
24
+ distance += distances[setA[i]][setB[j]];
25
+ }
26
+ }
27
+ return distance / setA.length / setB.length;
28
+ }
29
+ function clusterData({ data, distance = euclideanDistance, linkage = averageDistance, onProgress, stopToken, }) {
30
+ let start = performance.now();
31
+ const distances = [];
32
+ for (let i = 0; i < data.length; i++) {
33
+ if (performance.now() - start > 400) {
34
+ (0, stopToken_1.checkStopToken)(stopToken);
35
+ start = performance.now();
36
+ }
37
+ if (onProgress) {
38
+ onProgress(`Making distance matrix: ${toP(i / (data.length - 1))}%`);
39
+ }
40
+ const row = [];
41
+ for (let j = 0; j < data.length; j++) {
42
+ row.push(distance(data[i], data[j]));
43
+ }
44
+ distances.push(row);
45
+ }
46
+ const clusters = data.map((_datum, index) => ({
47
+ height: 0,
48
+ indexes: [Number(index)],
49
+ }));
50
+ let clustersGivenK = [];
51
+ start = performance.now();
52
+ for (let iteration = 0; iteration < data.length; iteration++) {
53
+ if (performance.now() - start > 400) {
54
+ (0, stopToken_1.checkStopToken)(stopToken);
55
+ start = performance.now();
56
+ }
57
+ if (onProgress) {
58
+ onProgress(`Clustering: ${toP((iteration + 1) / data.length)}%`);
59
+ }
60
+ clustersGivenK.push(clusters.map(cluster => cluster.indexes));
61
+ if (iteration >= data.length - 1) {
62
+ break;
63
+ }
64
+ let nearestDistance = Infinity;
65
+ let nearestRow = 0;
66
+ let nearestCol = 0;
67
+ for (let row = 0; row < clusters.length; row++) {
68
+ for (let col = row + 1; col < clusters.length; col++) {
69
+ const distance = linkage(clusters[row].indexes, clusters[col].indexes, distances);
70
+ if (distance < nearestDistance) {
71
+ nearestDistance = distance;
72
+ nearestRow = row;
73
+ nearestCol = col;
74
+ }
75
+ }
76
+ }
77
+ const newCluster = {
78
+ indexes: [
79
+ ...clusters[nearestRow].indexes,
80
+ ...clusters[nearestCol].indexes,
81
+ ],
82
+ height: nearestDistance,
83
+ children: [clusters[nearestRow], clusters[nearestCol]],
84
+ };
85
+ clusters.splice(Math.max(nearestRow, nearestCol), 1);
86
+ clusters.splice(Math.min(nearestRow, nearestCol), 1);
87
+ clusters.push(newCluster);
88
+ }
89
+ clustersGivenK = [[], ...clustersGivenK.reverse()];
90
+ return {
91
+ clusters: clusters[0],
92
+ distances: distances,
93
+ order: clusters[0].indexes,
94
+ clustersGivenK: clustersGivenK,
95
+ };
96
+ }
package/util/index.d.ts CHANGED
@@ -75,6 +75,7 @@ export declare function renameRegionsIfNeeded<ARGTYPE extends {
75
75
  }>;
76
76
  export declare function minmax(a: number, b: number): readonly [number, number];
77
77
  export declare function shorten(name: string, max?: number, short?: number): string;
78
+ export declare function shorten2(name: string, max?: number): string;
78
79
  export declare function stringify({ refName, coord, assemblyName, oob, }: {
79
80
  assemblyName?: string;
80
81
  coord: number;
@@ -258,7 +259,7 @@ export declare function fetchAndMaybeUnzipText(loc: GenericFilehandle, opts?: Ba
258
259
  export declare function isObject(x: unknown): x is Record<string | symbol | number, unknown>;
259
260
  export declare function localStorageGetNumber(key: string, defaultVal: number): number;
260
261
  export declare function localStorageGetBoolean(key: string, defaultVal: boolean): boolean;
261
- export declare function forEachWithStopTokenCheck<T>(iter: Iterable<T>, stopToken: string | undefined, arg: (arg: T) => void, durationMs?: number): void;
262
+ export declare function forEachWithStopTokenCheck<T>(iter: Iterable<T>, stopToken: string | undefined, arg: (arg: T, idx: number) => void, durationMs?: number): void;
262
263
  export declare function testAdapter(fileName: string, regex: RegExp, adapterHint: string | undefined, expected: string): boolean;
263
264
  export { type Feature, type SimpleFeatureSerialized, type SimpleFeatureSerializedNoId, default as SimpleFeature, isFeature, } from './simpleFeature';
264
265
  export { blobToDataURL } from './blobToDataURL';
package/util/index.js CHANGED
@@ -49,6 +49,7 @@ exports.renameRegionIfNeeded = renameRegionIfNeeded;
49
49
  exports.renameRegionsIfNeeded = renameRegionsIfNeeded;
50
50
  exports.minmax = minmax;
51
51
  exports.shorten = shorten;
52
+ exports.shorten2 = shorten2;
52
53
  exports.stringify = stringify;
53
54
  exports.revcom = revcom;
54
55
  exports.reverse = reverse;
@@ -530,6 +531,9 @@ function shorten(name, max = 70, short = 30) {
530
531
  ? `${name.slice(0, short)}...${name.slice(-short)}`
531
532
  : name;
532
533
  }
534
+ function shorten2(name, max = 70) {
535
+ return name.length > max ? `${name.slice(0, max)}...` : name;
536
+ }
533
537
  function stringify({ refName, coord, assemblyName, oob, }, useAssemblyName) {
534
538
  return [
535
539
  assemblyName && useAssemblyName ? `{${assemblyName}}` : '',
@@ -1006,12 +1010,13 @@ function localStorageGetBoolean(key, defaultVal) {
1006
1010
  }
1007
1011
  function forEachWithStopTokenCheck(iter, stopToken, arg, durationMs = 400) {
1008
1012
  let start = performance.now();
1013
+ let i = 0;
1009
1014
  for (const t of iter) {
1010
1015
  if (performance.now() - start > durationMs) {
1011
1016
  (0, stopToken_1.checkStopToken)(stopToken);
1012
1017
  start = performance.now();
1013
1018
  }
1014
- arg(t);
1019
+ arg(t, i++);
1015
1020
  }
1016
1021
  }
1017
1022
  function testAdapter(fileName, regex, adapterHint, expected) {
@@ -1,18 +1,18 @@
1
- export type RenderReturn = Record<string, unknown> | undefined;
2
- type RendererRet = Promise<RenderReturn> | RenderReturn;
3
- export declare function renderToAbstractCanvas(width: number, height: number, opts: {
4
- exportSVG?: {
5
- rasterizeLayers?: boolean;
6
- scale?: number;
7
- };
1
+ interface ExportSVGOptions {
2
+ rasterizeLayers?: boolean;
3
+ scale?: number;
4
+ }
5
+ interface RenderToAbstractCanvasOptions {
6
+ exportSVG?: ExportSVGOptions;
8
7
  highResolutionScaling?: number;
9
- }, cb: (ctx: CanvasRenderingContext2D) => RendererRet): Promise<{
8
+ }
9
+ export declare function renderToAbstractCanvas<T>(width: number, height: number, opts: RenderToAbstractCanvasOptions, cb: (ctx: CanvasRenderingContext2D) => T): Promise<(Awaited<T> & {
10
10
  canvasRecordedData: any;
11
- } | {
11
+ }) | (Awaited<T> & {
12
12
  reactElement: import("react/jsx-runtime").JSX.Element;
13
- } | {
13
+ }) | (Awaited<T> & {
14
14
  imageData: any;
15
- }>;
15
+ })>;
16
16
  export declare function getSerializedSvg(results: {
17
17
  width: number;
18
18
  height: number;
@@ -80,7 +80,10 @@ async function renderToAbstractCanvas(width, height, opts, cb) {
80
80
  }
81
81
  ctx.scale(s, s);
82
82
  const result = await cb(ctx);
83
- return { ...result, imageData: await (0, offscreenCanvasPonyfill_1.createImageBitmap)(canvas) };
83
+ return {
84
+ ...result,
85
+ imageData: await (0, offscreenCanvasPonyfill_1.createImageBitmap)(canvas),
86
+ };
84
87
  }
85
88
  }
86
89
  async function getSerializedSvg(results) {