@jbrowse/core 3.2.0 → 3.4.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.
- package/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +2 -1
- package/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +4 -4
- package/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +2 -1
- package/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +10 -9
- package/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.js +3 -13
- package/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +2 -1
- package/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +2 -1
- package/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +2 -2
- package/BaseFeatureWidget/BaseFeatureDetail/index.js +2 -2
- package/BaseFeatureWidget/stateModelFactory.d.ts +15 -10
- package/BaseFeatureWidget/stateModelFactory.js +7 -12
- package/BaseFeatureWidget/types.d.ts +9 -1
- package/BaseFeatureWidget/util.d.ts +4 -1
- package/BaseFeatureWidget/util.js +11 -0
- package/PluginManager.d.ts +1 -143
- package/PluginManager.js +3 -2
- package/ReExports/BaseFeatureDetails.d.ts +1 -0
- package/ReExports/BaseFeatureDetails.js +45 -0
- package/ReExports/MuiDataGridReExports.d.ts +2 -0
- package/ReExports/MuiDataGridReExports.js +167 -0
- package/ReExports/MuiReExports.d.ts +133 -0
- package/ReExports/MuiReExports.js +150 -0
- package/ReExports/lazify.d.ts +2 -0
- package/ReExports/lazify.js +14 -0
- package/ReExports/list.js +1 -0
- package/ReExports/modules.d.ts +1 -173
- package/ReExports/modules.js +36 -329
- package/TextSearch/TextSearchManager.d.ts +17 -2
- package/TextSearch/TextSearchManager.js +23 -3
- package/assemblyManager/assemblyManager.js +1 -1
- package/data_adapters/BaseAdapter/BaseAdapter.d.ts +2 -2
- package/data_adapters/BaseAdapter/BaseAdapter.js +1 -0
- package/data_adapters/CytobandAdapter/CytobandAdapter.d.ts +0 -1
- package/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
- package/package.json +10 -9
- package/pluggableElementTypes/models/baseTrackConfig.js +25 -8
- package/pluggableElementTypes/renderers/CircularChordRendererType.js +8 -9
- package/pluggableElementTypes/renderers/FeatureRendererType.js +8 -2
- package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.d.ts +2 -4
- package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.js +2 -30
- package/pluggableElementTypes/renderers/ServerSideRenderedContent.d.ts +1 -1
- package/pluggableElementTypes/renderers/ServerSideRenderedContent.js +2 -30
- package/pluggableElementTypes/renderers/ServerSideRendererType.js +6 -7
- package/tsconfig.build.tsbuildinfo +1 -1
- package/ui/DataGridFlexContainer.d.ts +3 -0
- package/ui/DataGridFlexContainer.js +15 -0
- package/ui/index.d.ts +1 -0
- package/ui/index.js +3 -1
- package/ui/theme.d.ts +2 -2
- package/ui/theme.js +18 -10
- package/util/cluster.d.ts +17 -0
- package/util/cluster.js +96 -0
- package/util/index.d.ts +3 -1
- package/util/index.js +13 -4
- package/util/offscreenCanvasUtils.d.ts +13 -12
- package/util/offscreenCanvasUtils.js +9 -6
|
@@ -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/index.d.ts
CHANGED
|
@@ -13,5 +13,6 @@ export { default as Menu } from './Menu';
|
|
|
13
13
|
export { default as PrerenderedCanvas } from './PrerenderedCanvas';
|
|
14
14
|
export { default as ResizeHandle } from './ResizeHandle';
|
|
15
15
|
export { default as SanitizedHTML } from './SanitizedHTML';
|
|
16
|
+
export { default as BaseTooltip } from './BaseTooltip';
|
|
16
17
|
export * from './Menu';
|
|
17
18
|
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.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; } });
|
|
@@ -48,5 +48,7 @@ var ResizeHandle_1 = require("./ResizeHandle");
|
|
|
48
48
|
Object.defineProperty(exports, "ResizeHandle", { enumerable: true, get: function () { return __importDefault(ResizeHandle_1).default; } });
|
|
49
49
|
var SanitizedHTML_1 = require("./SanitizedHTML");
|
|
50
50
|
Object.defineProperty(exports, "SanitizedHTML", { enumerable: true, get: function () { return __importDefault(SanitizedHTML_1).default; } });
|
|
51
|
+
var BaseTooltip_1 = require("./BaseTooltip");
|
|
52
|
+
Object.defineProperty(exports, "BaseTooltip", { enumerable: true, get: function () { return __importDefault(BaseTooltip_1).default; } });
|
|
51
53
|
__exportStar(require("./Menu"), exports);
|
|
52
54
|
exports.VIEW_HEADER_HEIGHT = 28;
|
package/ui/theme.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ThemeOptions } from '@mui/material
|
|
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
|
|
58
|
+
export declare function createJBrowseTheme(configTheme?: ThemeOptions, themes?: ThemeMap, themeName?: string): import("@mui/material").Theme;
|
|
59
59
|
export {};
|
package/ui/theme.js
CHANGED
|
@@ -6,12 +6,12 @@ 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,
|
|
13
|
-
const midnight = '#0D233F';
|
|
14
|
-
const grape = '#721E63';
|
|
12
|
+
const refTheme = (0, material_1.createTheme)();
|
|
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: {
|
|
@@ -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,
|
|
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 [
|
|
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
|
-
: {
|
|
356
|
+
: {
|
|
357
|
+
color: theme.palette[entry],
|
|
358
|
+
}),
|
|
351
359
|
},
|
|
352
360
|
});
|
|
353
361
|
}
|
|
@@ -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
|
+
};
|
package/util/cluster.js
ADDED
|
@@ -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,8 @@ 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
|
|
262
|
+
export declare function localStorageSetBoolean(key: string, value: boolean): void;
|
|
263
|
+
export declare function forEachWithStopTokenCheck<T>(iter: Iterable<T>, stopToken: string | undefined, arg: (arg: T, idx: number) => void, durationMs?: number): void;
|
|
262
264
|
export declare function testAdapter(fileName: string, regex: RegExp, adapterHint: string | undefined, expected: string): boolean;
|
|
263
265
|
export { type Feature, type SimpleFeatureSerialized, type SimpleFeatureSerializedNoId, default as SimpleFeature, isFeature, } from './simpleFeature';
|
|
264
266
|
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;
|
|
@@ -95,6 +96,7 @@ exports.fetchAndMaybeUnzipText = fetchAndMaybeUnzipText;
|
|
|
95
96
|
exports.isObject = isObject;
|
|
96
97
|
exports.localStorageGetNumber = localStorageGetNumber;
|
|
97
98
|
exports.localStorageGetBoolean = localStorageGetBoolean;
|
|
99
|
+
exports.localStorageSetBoolean = localStorageSetBoolean;
|
|
98
100
|
exports.forEachWithStopTokenCheck = forEachWithStopTokenCheck;
|
|
99
101
|
exports.testAdapter = testAdapter;
|
|
100
102
|
const react_1 = require("react");
|
|
@@ -530,6 +532,9 @@ function shorten(name, max = 70, short = 30) {
|
|
|
530
532
|
? `${name.slice(0, short)}...${name.slice(-short)}`
|
|
531
533
|
: name;
|
|
532
534
|
}
|
|
535
|
+
function shorten2(name, max = 70) {
|
|
536
|
+
return name.length > max ? `${name.slice(0, max)}...` : name;
|
|
537
|
+
}
|
|
533
538
|
function stringify({ refName, coord, assemblyName, oob, }, useAssemblyName) {
|
|
534
539
|
return [
|
|
535
540
|
assemblyName && useAssemblyName ? `{${assemblyName}}` : '',
|
|
@@ -980,9 +985,9 @@ function renderToStaticMarkup(node) {
|
|
|
980
985
|
function isGzip(buf) {
|
|
981
986
|
return buf[0] === 31 && buf[1] === 139 && buf[2] === 8;
|
|
982
987
|
}
|
|
983
|
-
async function fetchAndMaybeUnzip(loc, opts) {
|
|
984
|
-
const { statusCallback = () => { } } = opts
|
|
985
|
-
const buf =
|
|
988
|
+
async function fetchAndMaybeUnzip(loc, opts = {}) {
|
|
989
|
+
const { statusCallback = () => { } } = opts;
|
|
990
|
+
const buf = await updateStatus('Downloading file', statusCallback, () => loc.readFile(opts));
|
|
986
991
|
return isGzip(buf)
|
|
987
992
|
? await updateStatus('Unzipping', statusCallback, () => (0, bgzf_filehandle_1.unzip)(buf))
|
|
988
993
|
: buf;
|
|
@@ -1004,14 +1009,18 @@ function localStorageGetNumber(key, defaultVal) {
|
|
|
1004
1009
|
function localStorageGetBoolean(key, defaultVal) {
|
|
1005
1010
|
return Boolean(JSON.parse(localStorageGetItem(key) || JSON.stringify(defaultVal)));
|
|
1006
1011
|
}
|
|
1012
|
+
function localStorageSetBoolean(key, value) {
|
|
1013
|
+
localStorageSetItem(key, JSON.stringify(value));
|
|
1014
|
+
}
|
|
1007
1015
|
function forEachWithStopTokenCheck(iter, stopToken, arg, durationMs = 400) {
|
|
1008
1016
|
let start = performance.now();
|
|
1017
|
+
let i = 0;
|
|
1009
1018
|
for (const t of iter) {
|
|
1010
1019
|
if (performance.now() - start > durationMs) {
|
|
1011
1020
|
(0, stopToken_1.checkStopToken)(stopToken);
|
|
1012
1021
|
start = performance.now();
|
|
1013
1022
|
}
|
|
1014
|
-
arg(t);
|
|
1023
|
+
arg(t, i++);
|
|
1015
1024
|
}
|
|
1016
1025
|
}
|
|
1017
1026
|
function testAdapter(fileName, regex, adapterHint, expected) {
|
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
};
|
|
1
|
+
interface ExportSVGOptions {
|
|
2
|
+
rasterizeLayers?: boolean;
|
|
3
|
+
scale?: number;
|
|
4
|
+
}
|
|
5
|
+
interface RenderToAbstractCanvasOptions {
|
|
6
|
+
exportSVG?: ExportSVGOptions;
|
|
8
7
|
highResolutionScaling?: number;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
reactElement: import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
}
|
|
9
|
+
type R<T extends Record<string, unknown> | undefined> = Omit<T, never> & ({
|
|
10
|
+
canvasRecordedData: Record<string, unknown>;
|
|
13
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
|
|
49
|
+
const callbackResult = await cb(fakeCtx);
|
|
50
50
|
return {
|
|
51
|
-
...
|
|
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
|
|
63
|
+
const callbackResult = await cb(ctx);
|
|
64
64
|
return {
|
|
65
|
-
...
|
|
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,8 +79,11 @@ 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
|
|
83
|
-
return {
|
|
82
|
+
const callbackResult = await cb(ctx);
|
|
83
|
+
return {
|
|
84
|
+
...callbackResult,
|
|
85
|
+
imageData: await (0, offscreenCanvasPonyfill_1.createImageBitmap)(canvas),
|
|
86
|
+
};
|
|
84
87
|
}
|
|
85
88
|
}
|
|
86
89
|
async function getSerializedSvg(results) {
|