@jbrowse/plugin-linear-comparative-view 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/dist/LGVSyntenyDisplay/model.d.ts +1 -1
- package/dist/LinearComparativeView/model.d.ts +8 -6
- package/dist/LinearSyntenyView/components/ImportForm/ImportSyntenyOpenCustomTrack.js +2 -2
- package/dist/LinearSyntenyView/model.d.ts +8 -6
- package/dist/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.js +1 -1
- package/dist/SyntenyFeatureDetail/Formatter.d.ts +3 -0
- package/dist/SyntenyFeatureDetail/Formatter.js +23 -0
- package/dist/SyntenyFeatureDetail/LinkToSyntenyView.d.ts +3 -1
- package/dist/SyntenyFeatureDetail/LinkToSyntenyView.js +7 -7
- package/dist/SyntenyFeatureDetail/SyntenyFeatureDetail.d.ts +1 -1
- package/dist/SyntenyFeatureDetail/SyntenyFeatureDetail.js +7 -3
- package/dist/SyntenyFeatureDetail/types.d.ts +1 -1
- package/esm/LGVSyntenyDisplay/model.d.ts +1 -1
- package/esm/LinearComparativeView/model.d.ts +8 -6
- package/esm/LinearSyntenyView/components/ImportForm/ImportSyntenyOpenCustomTrack.js +3 -3
- package/esm/LinearSyntenyView/model.d.ts +8 -6
- package/esm/LinearSyntenyView/svgcomponents/SVGLinearSyntenyView.js +1 -1
- package/esm/SyntenyFeatureDetail/Formatter.d.ts +3 -0
- package/esm/SyntenyFeatureDetail/Formatter.js +17 -0
- package/esm/SyntenyFeatureDetail/LinkToSyntenyView.d.ts +3 -1
- package/esm/SyntenyFeatureDetail/LinkToSyntenyView.js +7 -7
- package/esm/SyntenyFeatureDetail/SyntenyFeatureDetail.d.ts +1 -1
- package/esm/SyntenyFeatureDetail/SyntenyFeatureDetail.js +7 -3
- package/esm/SyntenyFeatureDetail/types.d.ts +1 -1
- package/package.json +7 -7
|
@@ -201,7 +201,7 @@ declare function stateModelFactory(schema: AnyConfigurationSchemaType): import("
|
|
|
201
201
|
} & {
|
|
202
202
|
addBlock(key: string, block: import("@jbrowse/core/util/blockTypes").BaseBlock): void;
|
|
203
203
|
deleteBlock(key: string): void;
|
|
204
|
-
selectFeature(feature: Feature): void
|
|
204
|
+
selectFeature(feature: Feature): Promise<void>;
|
|
205
205
|
navToFeature(feature: Feature): void;
|
|
206
206
|
clearFeatureSelection(): void;
|
|
207
207
|
setFeatureIdUnderMouse(feature?: string): void;
|
|
@@ -188,12 +188,13 @@ declare function stateModelFactory(pluginManager: PluginManager): import("mobx-s
|
|
|
188
188
|
setCoarseDynamicBlocks(blocks: import("@jbrowse/core/util/blockTypes").BlockSet): void;
|
|
189
189
|
} & {
|
|
190
190
|
moveTo(start?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset, end?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset): void;
|
|
191
|
-
navToLocString(input: string, optAssemblyName?: string): Promise<void>;
|
|
191
|
+
navToLocString(input: string, optAssemblyName?: string, grow?: number): Promise<void>;
|
|
192
192
|
navToSearchString({ input, assembly, }: {
|
|
193
193
|
input: string;
|
|
194
194
|
assembly: import("@jbrowse/core/assemblyManager/assembly").Assembly;
|
|
195
195
|
}): Promise<void>;
|
|
196
|
-
|
|
196
|
+
navToLocation(parsedLocString: import("@jbrowse/core/util").ParsedLocString, assemblyName?: string, grow?: number): Promise<void>;
|
|
197
|
+
navToLocations(regions: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string, grow?: number): Promise<void>;
|
|
197
198
|
navTo(query: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation): void;
|
|
198
199
|
navToMultiple(locations: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation[]): void;
|
|
199
200
|
} & {
|
|
@@ -261,9 +262,9 @@ declare function stateModelFactory(pluginManager: PluginManager): import("mobx-s
|
|
|
261
262
|
displayName: string | undefined;
|
|
262
263
|
tracks: any[];
|
|
263
264
|
minimized: boolean;
|
|
264
|
-
displayedRegions: import("@jbrowse/core/util").Region[];
|
|
265
265
|
offsetPx: number;
|
|
266
266
|
bpPerPx: number;
|
|
267
|
+
displayedRegions: import("@jbrowse/core/util").Region[];
|
|
267
268
|
hideHeader: boolean;
|
|
268
269
|
hideHeaderOverview: boolean;
|
|
269
270
|
hideNoTracksActive: boolean;
|
|
@@ -502,12 +503,13 @@ declare function stateModelFactory(pluginManager: PluginManager): import("mobx-s
|
|
|
502
503
|
setCoarseDynamicBlocks(blocks: import("@jbrowse/core/util/blockTypes").BlockSet): void;
|
|
503
504
|
} & {
|
|
504
505
|
moveTo(start?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset, end?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset): void;
|
|
505
|
-
navToLocString(input: string, optAssemblyName?: string): Promise<void>;
|
|
506
|
+
navToLocString(input: string, optAssemblyName?: string, grow?: number): Promise<void>;
|
|
506
507
|
navToSearchString({ input, assembly, }: {
|
|
507
508
|
input: string;
|
|
508
509
|
assembly: import("@jbrowse/core/assemblyManager/assembly").Assembly;
|
|
509
510
|
}): Promise<void>;
|
|
510
|
-
|
|
511
|
+
navToLocation(parsedLocString: import("@jbrowse/core/util").ParsedLocString, assemblyName?: string, grow?: number): Promise<void>;
|
|
512
|
+
navToLocations(regions: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string, grow?: number): Promise<void>;
|
|
511
513
|
navTo(query: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation): void;
|
|
512
514
|
navToMultiple(locations: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation[]): void;
|
|
513
515
|
} & {
|
|
@@ -575,9 +577,9 @@ declare function stateModelFactory(pluginManager: PluginManager): import("mobx-s
|
|
|
575
577
|
displayName: string | undefined;
|
|
576
578
|
tracks: any[];
|
|
577
579
|
minimized: boolean;
|
|
578
|
-
displayedRegions: import("@jbrowse/core/util").Region[];
|
|
579
580
|
offsetPx: number;
|
|
580
581
|
bpPerPx: number;
|
|
582
|
+
displayedRegions: import("@jbrowse/core/util").Region[];
|
|
581
583
|
hideHeader: boolean;
|
|
582
584
|
hideHeaderOverview: boolean;
|
|
583
585
|
hideNoTracksActive: boolean;
|
|
@@ -73,7 +73,7 @@ const ImportSyntenyOpenCustomTrack = (0, mobx_react_1.observer)(function ({ mode
|
|
|
73
73
|
};
|
|
74
74
|
return ((0, jsx_runtime_1.jsxs)(material_1.Paper, { style: { padding: 12 }, children: [error ? (0, jsx_runtime_1.jsx)(ui_1.ErrorMessage, { error: error }) : null, (0, jsx_runtime_1.jsx)(material_1.Typography, { style: { textAlign: 'center' }, children: "Add a .paf (minimap2), .delta (Mummer), .chain (UCSC liftover), .anchors or .anchors.simple (MCScan), or .pif.gz (jbrowse CLI make-pif) file to view. These file types can also be gzipped." }), (0, jsx_runtime_1.jsx)(material_1.RadioGroup, { value: radioOption, onChange: event => {
|
|
75
75
|
setValue(event.target.value);
|
|
76
|
-
}, children: (0, jsx_runtime_1.jsx)(material_1.
|
|
76
|
+
}, children: (0, jsx_runtime_1.jsx)(material_1.Grid, { container: true, justifyContent: "center", children: [
|
|
77
77
|
'.paf',
|
|
78
78
|
'.delta',
|
|
79
79
|
'.out',
|
|
@@ -81,7 +81,7 @@ const ImportSyntenyOpenCustomTrack = (0, mobx_react_1.observer)(function ({ mode
|
|
|
81
81
|
'.anchors',
|
|
82
82
|
'.anchors.simple',
|
|
83
83
|
'.pif.gz',
|
|
84
|
-
].map(extension => ((0, jsx_runtime_1.jsx)(material_1.FormControlLabel, { value: extension, control: (0, jsx_runtime_1.jsx)(material_1.Radio, {}), label: extension }, extension))) }) }), (0, jsx_runtime_1.jsx)(material_1.
|
|
84
|
+
].map(extension => ((0, jsx_runtime_1.jsx)(material_1.FormControlLabel, { value: extension, control: (0, jsx_runtime_1.jsx)(material_1.Radio, {}), label: extension }, extension))) }) }), (0, jsx_runtime_1.jsx)(material_1.Grid, { container: true, justifyContent: "center", children: radioOption === '.paf' ||
|
|
85
85
|
radioOption === '.out' ||
|
|
86
86
|
radioOption === '.delta' ||
|
|
87
87
|
radioOption === '.chain' ||
|
|
@@ -205,12 +205,13 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
|
|
|
205
205
|
setCoarseDynamicBlocks(blocks: import("@jbrowse/core/util/blockTypes").BlockSet): void;
|
|
206
206
|
} & {
|
|
207
207
|
moveTo(start?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset, end?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset): void;
|
|
208
|
-
navToLocString(input: string, optAssemblyName?: string): Promise<void>;
|
|
208
|
+
navToLocString(input: string, optAssemblyName?: string, grow?: number): Promise<void>;
|
|
209
209
|
navToSearchString({ input, assembly, }: {
|
|
210
210
|
input: string;
|
|
211
211
|
assembly: import("@jbrowse/core/assemblyManager/assembly").Assembly;
|
|
212
212
|
}): Promise<void>;
|
|
213
|
-
|
|
213
|
+
navToLocation(parsedLocString: import("@jbrowse/core/util").ParsedLocString, assemblyName?: string, grow?: number): Promise<void>;
|
|
214
|
+
navToLocations(regions: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string, grow?: number): Promise<void>;
|
|
214
215
|
navTo(query: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation): void;
|
|
215
216
|
navToMultiple(locations: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation[]): void;
|
|
216
217
|
} & {
|
|
@@ -278,9 +279,9 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
|
|
|
278
279
|
displayName: string | undefined;
|
|
279
280
|
tracks: any[];
|
|
280
281
|
minimized: boolean;
|
|
281
|
-
displayedRegions: import("@jbrowse/core/util").Region[];
|
|
282
282
|
offsetPx: number;
|
|
283
283
|
bpPerPx: number;
|
|
284
|
+
displayedRegions: import("@jbrowse/core/util").Region[];
|
|
284
285
|
hideHeader: boolean;
|
|
285
286
|
hideHeaderOverview: boolean;
|
|
286
287
|
hideNoTracksActive: boolean;
|
|
@@ -586,12 +587,13 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
|
|
|
586
587
|
setCoarseDynamicBlocks(blocks: import("@jbrowse/core/util/blockTypes").BlockSet): void;
|
|
587
588
|
} & {
|
|
588
589
|
moveTo(start?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset, end?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset): void;
|
|
589
|
-
navToLocString(input: string, optAssemblyName?: string): Promise<void>;
|
|
590
|
+
navToLocString(input: string, optAssemblyName?: string, grow?: number): Promise<void>;
|
|
590
591
|
navToSearchString({ input, assembly, }: {
|
|
591
592
|
input: string;
|
|
592
593
|
assembly: import("@jbrowse/core/assemblyManager/assembly").Assembly;
|
|
593
594
|
}): Promise<void>;
|
|
594
|
-
|
|
595
|
+
navToLocation(parsedLocString: import("@jbrowse/core/util").ParsedLocString, assemblyName?: string, grow?: number): Promise<void>;
|
|
596
|
+
navToLocations(regions: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string, grow?: number): Promise<void>;
|
|
595
597
|
navTo(query: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation): void;
|
|
596
598
|
navToMultiple(locations: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation[]): void;
|
|
597
599
|
} & {
|
|
@@ -659,9 +661,9 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
|
|
|
659
661
|
displayName: string | undefined;
|
|
660
662
|
tracks: any[];
|
|
661
663
|
minimized: boolean;
|
|
662
|
-
displayedRegions: import("@jbrowse/core/util").Region[];
|
|
663
664
|
offsetPx: number;
|
|
664
665
|
bpPerPx: number;
|
|
666
|
+
displayedRegions: import("@jbrowse/core/util").Region[];
|
|
665
667
|
hideHeader: boolean;
|
|
666
668
|
hideHeaderOverview: boolean;
|
|
667
669
|
hideNoTracksActive: boolean;
|
|
@@ -73,7 +73,7 @@ async function renderToSvg(model, opts) {
|
|
|
73
73
|
const rendering = renderings[i - 1];
|
|
74
74
|
const height = heights[i];
|
|
75
75
|
const levelHeight = level.height || 0;
|
|
76
|
-
RenderList.push((0, jsx_runtime_1.jsxs)("g", { transform: `translate(0 ${currOffset})`, children: [levelHeight ? ((0, jsx_runtime_1.jsx)("defs", { children: (0, jsx_runtime_1.jsx)("clipPath", { id: `synclip-${i}`, children: (0, jsx_runtime_1.jsx)("rect", { x: 0, y: 0, width: width, height: levelHeight }) }) })) : null, (0, jsx_runtime_1.jsx)("g", { transform: `translate(${shift + trackLabelOffset} ${fontSize})`, clipPath: `url(#synclip-${i})`, children: rendering === null || rendering === void 0 ? void 0 : rendering.map((r, i) => (
|
|
76
|
+
RenderList.push((0, jsx_runtime_1.jsxs)("g", { transform: `translate(0 ${currOffset})`, children: [levelHeight ? ((0, jsx_runtime_1.jsx)("defs", { children: (0, jsx_runtime_1.jsx)("clipPath", { id: `synclip-${i}`, children: (0, jsx_runtime_1.jsx)("rect", { x: 0, y: 0, width: width, height: levelHeight }) }) })) : null, (0, jsx_runtime_1.jsx)("g", { transform: `translate(${shift + trackLabelOffset} ${fontSize})`, clipPath: `url(#synclip-${i})`, children: rendering === null || rendering === void 0 ? void 0 : rendering.map((r, i) => (0, jsx_runtime_1.jsx)(util_1.ReactRendering, { rendering: r }, i)) }), (0, jsx_runtime_1.jsx)("g", { transform: `translate(0 ${levelHeight})`, children: (0, jsx_runtime_1.jsx)(SVGLinearGenomeView_1.default, { rulerHeight: rulerHeight, shift: shift, trackLabelOffset: trackLabelOffset, textHeight: textHeight, trackLabels: trackLabels, displayResults: displayResults[i], view: view, fontSize: fontSize }, view.id) })] }, view.id));
|
|
77
77
|
currOffset += height + fontSize + rulerHeight + levelHeight;
|
|
78
78
|
}
|
|
79
79
|
return (0, util_1.renderToStaticMarkup)((0, jsx_runtime_1.jsx)(material_1.ThemeProvider, { theme: theme, children: (0, jsx_runtime_1.jsx)(Wrapper, { children: (0, jsx_runtime_1.jsxs)("svg", { width: width, height: totalHeightSvg, xmlns: "http://www.w3.org/2000/svg", xmlnsXlink: "http://www.w3.org/1999/xlink", viewBox: [0, 0, w + shift * 2, totalHeightSvg].toString(), children: [(0, jsx_runtime_1.jsx)(SVGBackground_1.default, { width: w, height: totalHeightSvg, shift: shift }), RenderList] }) }) }));
|
|
@@ -0,0 +1,23 @@
|
|
|
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 = Formatter;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
const react_1 = require("react");
|
|
9
|
+
const copy_to_clipboard_1 = __importDefault(require("copy-to-clipboard"));
|
|
10
|
+
function Formatter({ value }) {
|
|
11
|
+
const [show, setShow] = (0, react_1.useState)(false);
|
|
12
|
+
const [copied, setCopied] = (0, react_1.useState)(false);
|
|
13
|
+
const display = String(value);
|
|
14
|
+
return display.length > 100 ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => {
|
|
15
|
+
(0, copy_to_clipboard_1.default)(display);
|
|
16
|
+
setCopied(true);
|
|
17
|
+
setTimeout(() => {
|
|
18
|
+
setCopied(false);
|
|
19
|
+
}, 700);
|
|
20
|
+
}, children: copied ? 'Copied to clipboard' : 'Copy' }), (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => {
|
|
21
|
+
setShow(val => !val);
|
|
22
|
+
}, children: show ? 'Show less' : 'Show more' }), (0, jsx_runtime_1.jsx)("div", { children: show ? display : `${display.slice(0, 100)}...` })] })) : ((0, jsx_runtime_1.jsx)("div", { children: display }));
|
|
23
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { SyntenyFeatureDetailModel } from './types';
|
|
2
|
-
|
|
2
|
+
import type { SimpleFeatureSerialized } from '@jbrowse/core/util';
|
|
3
|
+
declare const LinkToSyntenyView: ({ model, feat, }: {
|
|
3
4
|
model: SyntenyFeatureDetailModel;
|
|
5
|
+
feat: SimpleFeatureSerialized;
|
|
4
6
|
}) => import("react/jsx-runtime").JSX.Element;
|
|
5
7
|
export default LinkToSyntenyView;
|
|
@@ -39,19 +39,19 @@ const util_1 = require("@jbrowse/core/util");
|
|
|
39
39
|
const material_1 = require("@mui/material");
|
|
40
40
|
const mobx_react_1 = require("mobx-react");
|
|
41
41
|
const LaunchSyntenyViewDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('../LGVSyntenyDisplay/components/LaunchSyntenyViewDialog'))));
|
|
42
|
-
const LinkToSyntenyView = (0, mobx_react_1.observer)(function ({ model, }) {
|
|
43
|
-
const {
|
|
42
|
+
const LinkToSyntenyView = (0, mobx_react_1.observer)(function ({ model, feat, }) {
|
|
43
|
+
const { view, level, trackId } = model;
|
|
44
44
|
return ((0, jsx_runtime_1.jsxs)("ul", { children: [view.type === 'LinearSyntenyView' ? ((0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsx)(material_1.Link, { href: "#", onClick: event => {
|
|
45
45
|
var _a, _b;
|
|
46
46
|
event.preventDefault();
|
|
47
47
|
const { views } = view;
|
|
48
48
|
if (level !== undefined) {
|
|
49
|
-
(_a = views[level]) === null || _a === void 0 ? void 0 : _a.navTo(
|
|
50
|
-
(_b = views[level + 1]) === null || _b === void 0 ? void 0 : _b.navTo(
|
|
49
|
+
(_a = views[level]) === null || _a === void 0 ? void 0 : _a.navTo(feat);
|
|
50
|
+
(_b = views[level + 1]) === null || _b === void 0 ? void 0 : _b.navTo(feat.mate);
|
|
51
51
|
}
|
|
52
52
|
else {
|
|
53
|
-
const f1 =
|
|
54
|
-
const f2 =
|
|
53
|
+
const f1 = feat;
|
|
54
|
+
const f2 = feat.mate;
|
|
55
55
|
const r1 = f1.assemblyName;
|
|
56
56
|
const r2 = f2.assemblyName;
|
|
57
57
|
const v1 = views.find(view => view.assemblyNames[0] === r1);
|
|
@@ -71,7 +71,7 @@ const LinkToSyntenyView = (0, mobx_react_1.observer)(function ({ model, }) {
|
|
|
71
71
|
}
|
|
72
72
|
}, children: "Center view on this feature" }) })) : null, (0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsx)(material_1.Link, { href: "#", onClick: event => {
|
|
73
73
|
event.preventDefault();
|
|
74
|
-
const feature = new util_1.SimpleFeature(
|
|
74
|
+
const feature = new util_1.SimpleFeature(feat);
|
|
75
75
|
const session = (0, util_1.getSession)(model);
|
|
76
76
|
session.queueDialog(handleClose => [
|
|
77
77
|
LaunchSyntenyViewDialog,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SyntenyFeatureDetailModel } from './types';
|
|
2
|
-
declare const SyntenyFeatureDetail: (
|
|
2
|
+
declare const SyntenyFeatureDetail: (props: {
|
|
3
3
|
model: SyntenyFeatureDetailModel;
|
|
4
4
|
}) => import("react/jsx-runtime").JSX.Element;
|
|
5
5
|
export default SyntenyFeatureDetail;
|
|
@@ -4,12 +4,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
-
const BaseFeatureDetail_1 = __importDefault(require("@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail"));
|
|
8
7
|
const BaseCard_1 = __importDefault(require("@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail/BaseCard"));
|
|
8
|
+
const FeatureDetails_1 = __importDefault(require("@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails"));
|
|
9
9
|
const material_1 = require("@mui/material");
|
|
10
10
|
const mobx_react_1 = require("mobx-react");
|
|
11
|
+
const Formatter_1 = __importDefault(require("./Formatter"));
|
|
11
12
|
const LinkToSyntenyView_1 = __importDefault(require("./LinkToSyntenyView"));
|
|
12
|
-
const SyntenyFeatureDetail = (0, mobx_react_1.observer)(function (
|
|
13
|
-
|
|
13
|
+
const SyntenyFeatureDetail = (0, mobx_react_1.observer)(function (props) {
|
|
14
|
+
const { model } = props;
|
|
15
|
+
const { featureData } = model;
|
|
16
|
+
const feat = structuredClone(featureData);
|
|
17
|
+
return feat ? ((0, jsx_runtime_1.jsxs)(material_1.Paper, { children: [(0, jsx_runtime_1.jsx)(FeatureDetails_1.default, { ...props, feature: feat, formatter: value => (0, jsx_runtime_1.jsx)(Formatter_1.default, { value: value }) }), (0, jsx_runtime_1.jsx)(BaseCard_1.default, { title: "Link to view", children: (0, jsx_runtime_1.jsx)(LinkToSyntenyView_1.default, { model: model, feat: feat }) })] })) : ((0, jsx_runtime_1.jsx)("div", { children: "No feature loaded, may not be available after page refresh because it was too large for localStorage" }));
|
|
14
18
|
});
|
|
15
19
|
exports.default = SyntenyFeatureDetail;
|
|
@@ -201,7 +201,7 @@ declare function stateModelFactory(schema: AnyConfigurationSchemaType): import("
|
|
|
201
201
|
} & {
|
|
202
202
|
addBlock(key: string, block: import("@jbrowse/core/util/blockTypes").BaseBlock): void;
|
|
203
203
|
deleteBlock(key: string): void;
|
|
204
|
-
selectFeature(feature: Feature): void
|
|
204
|
+
selectFeature(feature: Feature): Promise<void>;
|
|
205
205
|
navToFeature(feature: Feature): void;
|
|
206
206
|
clearFeatureSelection(): void;
|
|
207
207
|
setFeatureIdUnderMouse(feature?: string): void;
|
|
@@ -188,12 +188,13 @@ declare function stateModelFactory(pluginManager: PluginManager): import("mobx-s
|
|
|
188
188
|
setCoarseDynamicBlocks(blocks: import("@jbrowse/core/util/blockTypes").BlockSet): void;
|
|
189
189
|
} & {
|
|
190
190
|
moveTo(start?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset, end?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset): void;
|
|
191
|
-
navToLocString(input: string, optAssemblyName?: string): Promise<void>;
|
|
191
|
+
navToLocString(input: string, optAssemblyName?: string, grow?: number): Promise<void>;
|
|
192
192
|
navToSearchString({ input, assembly, }: {
|
|
193
193
|
input: string;
|
|
194
194
|
assembly: import("@jbrowse/core/assemblyManager/assembly").Assembly;
|
|
195
195
|
}): Promise<void>;
|
|
196
|
-
|
|
196
|
+
navToLocation(parsedLocString: import("@jbrowse/core/util").ParsedLocString, assemblyName?: string, grow?: number): Promise<void>;
|
|
197
|
+
navToLocations(regions: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string, grow?: number): Promise<void>;
|
|
197
198
|
navTo(query: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation): void;
|
|
198
199
|
navToMultiple(locations: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation[]): void;
|
|
199
200
|
} & {
|
|
@@ -261,9 +262,9 @@ declare function stateModelFactory(pluginManager: PluginManager): import("mobx-s
|
|
|
261
262
|
displayName: string | undefined;
|
|
262
263
|
tracks: any[];
|
|
263
264
|
minimized: boolean;
|
|
264
|
-
displayedRegions: import("@jbrowse/core/util").Region[];
|
|
265
265
|
offsetPx: number;
|
|
266
266
|
bpPerPx: number;
|
|
267
|
+
displayedRegions: import("@jbrowse/core/util").Region[];
|
|
267
268
|
hideHeader: boolean;
|
|
268
269
|
hideHeaderOverview: boolean;
|
|
269
270
|
hideNoTracksActive: boolean;
|
|
@@ -502,12 +503,13 @@ declare function stateModelFactory(pluginManager: PluginManager): import("mobx-s
|
|
|
502
503
|
setCoarseDynamicBlocks(blocks: import("@jbrowse/core/util/blockTypes").BlockSet): void;
|
|
503
504
|
} & {
|
|
504
505
|
moveTo(start?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset, end?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset): void;
|
|
505
|
-
navToLocString(input: string, optAssemblyName?: string): Promise<void>;
|
|
506
|
+
navToLocString(input: string, optAssemblyName?: string, grow?: number): Promise<void>;
|
|
506
507
|
navToSearchString({ input, assembly, }: {
|
|
507
508
|
input: string;
|
|
508
509
|
assembly: import("@jbrowse/core/assemblyManager/assembly").Assembly;
|
|
509
510
|
}): Promise<void>;
|
|
510
|
-
|
|
511
|
+
navToLocation(parsedLocString: import("@jbrowse/core/util").ParsedLocString, assemblyName?: string, grow?: number): Promise<void>;
|
|
512
|
+
navToLocations(regions: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string, grow?: number): Promise<void>;
|
|
511
513
|
navTo(query: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation): void;
|
|
512
514
|
navToMultiple(locations: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation[]): void;
|
|
513
515
|
} & {
|
|
@@ -575,9 +577,9 @@ declare function stateModelFactory(pluginManager: PluginManager): import("mobx-s
|
|
|
575
577
|
displayName: string | undefined;
|
|
576
578
|
tracks: any[];
|
|
577
579
|
minimized: boolean;
|
|
578
|
-
displayedRegions: import("@jbrowse/core/util").Region[];
|
|
579
580
|
offsetPx: number;
|
|
580
581
|
bpPerPx: number;
|
|
582
|
+
displayedRegions: import("@jbrowse/core/util").Region[];
|
|
581
583
|
hideHeader: boolean;
|
|
582
584
|
hideHeaderOverview: boolean;
|
|
583
585
|
hideNoTracksActive: boolean;
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useEffect, useState } from 'react';
|
|
3
3
|
import { ErrorMessage, FileSelector } from '@jbrowse/core/ui';
|
|
4
4
|
import HelpIcon from '@mui/icons-material/Help';
|
|
5
|
-
import { Button, FormControlLabel,
|
|
5
|
+
import { Button, FormControlLabel, Grid, Paper, Radio, RadioGroup, Tooltip, Typography, } from '@mui/material';
|
|
6
6
|
import { observer } from 'mobx-react';
|
|
7
7
|
import { getAdapter } from './getAdapter';
|
|
8
8
|
import { basename, extName, getName, stripGz } from './util';
|
|
@@ -68,7 +68,7 @@ const ImportSyntenyOpenCustomTrack = observer(function ({ model, assembly1, asse
|
|
|
68
68
|
};
|
|
69
69
|
return (_jsxs(Paper, { style: { padding: 12 }, children: [error ? _jsx(ErrorMessage, { error: error }) : null, _jsx(Typography, { style: { textAlign: 'center' }, children: "Add a .paf (minimap2), .delta (Mummer), .chain (UCSC liftover), .anchors or .anchors.simple (MCScan), or .pif.gz (jbrowse CLI make-pif) file to view. These file types can also be gzipped." }), _jsx(RadioGroup, { value: radioOption, onChange: event => {
|
|
70
70
|
setValue(event.target.value);
|
|
71
|
-
}, children: _jsx(
|
|
71
|
+
}, children: _jsx(Grid, { container: true, justifyContent: "center", children: [
|
|
72
72
|
'.paf',
|
|
73
73
|
'.delta',
|
|
74
74
|
'.out',
|
|
@@ -76,7 +76,7 @@ const ImportSyntenyOpenCustomTrack = observer(function ({ model, assembly1, asse
|
|
|
76
76
|
'.anchors',
|
|
77
77
|
'.anchors.simple',
|
|
78
78
|
'.pif.gz',
|
|
79
|
-
].map(extension => (_jsx(FormControlLabel, { value: extension, control: _jsx(Radio, {}), label: extension }, extension))) }) }), _jsx(
|
|
79
|
+
].map(extension => (_jsx(FormControlLabel, { value: extension, control: _jsx(Radio, {}), label: extension }, extension))) }) }), _jsx(Grid, { container: true, justifyContent: "center", children: radioOption === '.paf' ||
|
|
80
80
|
radioOption === '.out' ||
|
|
81
81
|
radioOption === '.delta' ||
|
|
82
82
|
radioOption === '.chain' ||
|
|
@@ -205,12 +205,13 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
|
|
|
205
205
|
setCoarseDynamicBlocks(blocks: import("@jbrowse/core/util/blockTypes").BlockSet): void;
|
|
206
206
|
} & {
|
|
207
207
|
moveTo(start?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset, end?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset): void;
|
|
208
|
-
navToLocString(input: string, optAssemblyName?: string): Promise<void>;
|
|
208
|
+
navToLocString(input: string, optAssemblyName?: string, grow?: number): Promise<void>;
|
|
209
209
|
navToSearchString({ input, assembly, }: {
|
|
210
210
|
input: string;
|
|
211
211
|
assembly: import("@jbrowse/core/assemblyManager/assembly").Assembly;
|
|
212
212
|
}): Promise<void>;
|
|
213
|
-
|
|
213
|
+
navToLocation(parsedLocString: import("@jbrowse/core/util").ParsedLocString, assemblyName?: string, grow?: number): Promise<void>;
|
|
214
|
+
navToLocations(regions: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string, grow?: number): Promise<void>;
|
|
214
215
|
navTo(query: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation): void;
|
|
215
216
|
navToMultiple(locations: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation[]): void;
|
|
216
217
|
} & {
|
|
@@ -278,9 +279,9 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
|
|
|
278
279
|
displayName: string | undefined;
|
|
279
280
|
tracks: any[];
|
|
280
281
|
minimized: boolean;
|
|
281
|
-
displayedRegions: import("@jbrowse/core/util").Region[];
|
|
282
282
|
offsetPx: number;
|
|
283
283
|
bpPerPx: number;
|
|
284
|
+
displayedRegions: import("@jbrowse/core/util").Region[];
|
|
284
285
|
hideHeader: boolean;
|
|
285
286
|
hideHeaderOverview: boolean;
|
|
286
287
|
hideNoTracksActive: boolean;
|
|
@@ -586,12 +587,13 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
|
|
|
586
587
|
setCoarseDynamicBlocks(blocks: import("@jbrowse/core/util/blockTypes").BlockSet): void;
|
|
587
588
|
} & {
|
|
588
589
|
moveTo(start?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset, end?: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").BpOffset): void;
|
|
589
|
-
navToLocString(input: string, optAssemblyName?: string): Promise<void>;
|
|
590
|
+
navToLocString(input: string, optAssemblyName?: string, grow?: number): Promise<void>;
|
|
590
591
|
navToSearchString({ input, assembly, }: {
|
|
591
592
|
input: string;
|
|
592
593
|
assembly: import("@jbrowse/core/assemblyManager/assembly").Assembly;
|
|
593
594
|
}): Promise<void>;
|
|
594
|
-
|
|
595
|
+
navToLocation(parsedLocString: import("@jbrowse/core/util").ParsedLocString, assemblyName?: string, grow?: number): Promise<void>;
|
|
596
|
+
navToLocations(regions: import("@jbrowse/core/util").ParsedLocString[], assemblyName?: string, grow?: number): Promise<void>;
|
|
595
597
|
navTo(query: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation): void;
|
|
596
598
|
navToMultiple(locations: import("@jbrowse/plugin-linear-genome-view/src/LinearGenomeView/types").NavLocation[]): void;
|
|
597
599
|
} & {
|
|
@@ -659,9 +661,9 @@ export default function stateModelFactory(pluginManager: PluginManager): import(
|
|
|
659
661
|
displayName: string | undefined;
|
|
660
662
|
tracks: any[];
|
|
661
663
|
minimized: boolean;
|
|
662
|
-
displayedRegions: import("@jbrowse/core/util").Region[];
|
|
663
664
|
offsetPx: number;
|
|
664
665
|
bpPerPx: number;
|
|
666
|
+
displayedRegions: import("@jbrowse/core/util").Region[];
|
|
665
667
|
hideHeader: boolean;
|
|
666
668
|
hideHeaderOverview: boolean;
|
|
667
669
|
hideNoTracksActive: boolean;
|
|
@@ -67,7 +67,7 @@ export async function renderToSvg(model, opts) {
|
|
|
67
67
|
const rendering = renderings[i - 1];
|
|
68
68
|
const height = heights[i];
|
|
69
69
|
const levelHeight = level.height || 0;
|
|
70
|
-
RenderList.push(_jsxs("g", { transform: `translate(0 ${currOffset})`, children: [levelHeight ? (_jsx("defs", { children: _jsx("clipPath", { id: `synclip-${i}`, children: _jsx("rect", { x: 0, y: 0, width: width, height: levelHeight }) }) })) : null, _jsx("g", { transform: `translate(${shift + trackLabelOffset} ${fontSize})`, clipPath: `url(#synclip-${i})`, children: rendering === null || rendering === void 0 ? void 0 : rendering.map((r, i) =>
|
|
70
|
+
RenderList.push(_jsxs("g", { transform: `translate(0 ${currOffset})`, children: [levelHeight ? (_jsx("defs", { children: _jsx("clipPath", { id: `synclip-${i}`, children: _jsx("rect", { x: 0, y: 0, width: width, height: levelHeight }) }) })) : null, _jsx("g", { transform: `translate(${shift + trackLabelOffset} ${fontSize})`, clipPath: `url(#synclip-${i})`, children: rendering === null || rendering === void 0 ? void 0 : rendering.map((r, i) => _jsx(ReactRendering, { rendering: r }, i)) }), _jsx("g", { transform: `translate(0 ${levelHeight})`, children: _jsx(SVGLinearGenomeView, { rulerHeight: rulerHeight, shift: shift, trackLabelOffset: trackLabelOffset, textHeight: textHeight, trackLabels: trackLabels, displayResults: displayResults[i], view: view, fontSize: fontSize }, view.id) })] }, view.id));
|
|
71
71
|
currOffset += height + fontSize + rulerHeight + levelHeight;
|
|
72
72
|
}
|
|
73
73
|
return renderToStaticMarkup(_jsx(ThemeProvider, { theme: theme, children: _jsx(Wrapper, { children: _jsxs("svg", { width: width, height: totalHeightSvg, xmlns: "http://www.w3.org/2000/svg", xmlnsXlink: "http://www.w3.org/1999/xlink", viewBox: [0, 0, w + shift * 2, totalHeightSvg].toString(), children: [_jsx(SVGBackground, { width: w, height: totalHeightSvg, shift: shift }), RenderList] }) }) }));
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import copy from 'copy-to-clipboard';
|
|
4
|
+
export default function Formatter({ value }) {
|
|
5
|
+
const [show, setShow] = useState(false);
|
|
6
|
+
const [copied, setCopied] = useState(false);
|
|
7
|
+
const display = String(value);
|
|
8
|
+
return display.length > 100 ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: () => {
|
|
9
|
+
copy(display);
|
|
10
|
+
setCopied(true);
|
|
11
|
+
setTimeout(() => {
|
|
12
|
+
setCopied(false);
|
|
13
|
+
}, 700);
|
|
14
|
+
}, children: copied ? 'Copied to clipboard' : 'Copy' }), _jsx("button", { type: "button", onClick: () => {
|
|
15
|
+
setShow(val => !val);
|
|
16
|
+
}, children: show ? 'Show less' : 'Show more' }), _jsx("div", { children: show ? display : `${display.slice(0, 100)}...` })] })) : (_jsx("div", { children: display }));
|
|
17
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { SyntenyFeatureDetailModel } from './types';
|
|
2
|
-
|
|
2
|
+
import type { SimpleFeatureSerialized } from '@jbrowse/core/util';
|
|
3
|
+
declare const LinkToSyntenyView: ({ model, feat, }: {
|
|
3
4
|
model: SyntenyFeatureDetailModel;
|
|
5
|
+
feat: SimpleFeatureSerialized;
|
|
4
6
|
}) => import("react/jsx-runtime").JSX.Element;
|
|
5
7
|
export default LinkToSyntenyView;
|
|
@@ -4,19 +4,19 @@ import { SimpleFeature, assembleLocString, getSession, } from '@jbrowse/core/uti
|
|
|
4
4
|
import { Link } from '@mui/material';
|
|
5
5
|
import { observer } from 'mobx-react';
|
|
6
6
|
const LaunchSyntenyViewDialog = lazy(() => import('../LGVSyntenyDisplay/components/LaunchSyntenyViewDialog'));
|
|
7
|
-
const LinkToSyntenyView = observer(function ({ model, }) {
|
|
8
|
-
const {
|
|
7
|
+
const LinkToSyntenyView = observer(function ({ model, feat, }) {
|
|
8
|
+
const { view, level, trackId } = model;
|
|
9
9
|
return (_jsxs("ul", { children: [view.type === 'LinearSyntenyView' ? (_jsx("li", { children: _jsx(Link, { href: "#", onClick: event => {
|
|
10
10
|
var _a, _b;
|
|
11
11
|
event.preventDefault();
|
|
12
12
|
const { views } = view;
|
|
13
13
|
if (level !== undefined) {
|
|
14
|
-
(_a = views[level]) === null || _a === void 0 ? void 0 : _a.navTo(
|
|
15
|
-
(_b = views[level + 1]) === null || _b === void 0 ? void 0 : _b.navTo(
|
|
14
|
+
(_a = views[level]) === null || _a === void 0 ? void 0 : _a.navTo(feat);
|
|
15
|
+
(_b = views[level + 1]) === null || _b === void 0 ? void 0 : _b.navTo(feat.mate);
|
|
16
16
|
}
|
|
17
17
|
else {
|
|
18
|
-
const f1 =
|
|
19
|
-
const f2 =
|
|
18
|
+
const f1 = feat;
|
|
19
|
+
const f2 = feat.mate;
|
|
20
20
|
const r1 = f1.assemblyName;
|
|
21
21
|
const r2 = f2.assemblyName;
|
|
22
22
|
const v1 = views.find(view => view.assemblyNames[0] === r1);
|
|
@@ -36,7 +36,7 @@ const LinkToSyntenyView = observer(function ({ model, }) {
|
|
|
36
36
|
}
|
|
37
37
|
}, children: "Center view on this feature" }) })) : null, _jsx("li", { children: _jsx(Link, { href: "#", onClick: event => {
|
|
38
38
|
event.preventDefault();
|
|
39
|
-
const feature = new SimpleFeature(
|
|
39
|
+
const feature = new SimpleFeature(feat);
|
|
40
40
|
const session = getSession(model);
|
|
41
41
|
session.queueDialog(handleClose => [
|
|
42
42
|
LaunchSyntenyViewDialog,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SyntenyFeatureDetailModel } from './types';
|
|
2
|
-
declare const SyntenyFeatureDetail: (
|
|
2
|
+
declare const SyntenyFeatureDetail: (props: {
|
|
3
3
|
model: SyntenyFeatureDetailModel;
|
|
4
4
|
}) => import("react/jsx-runtime").JSX.Element;
|
|
5
5
|
export default SyntenyFeatureDetail;
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import BaseFeatureDetail from '@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail';
|
|
3
2
|
import BaseCard from '@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail/BaseCard';
|
|
3
|
+
import FeatureDetails from '@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails';
|
|
4
4
|
import { Paper } from '@mui/material';
|
|
5
5
|
import { observer } from 'mobx-react';
|
|
6
|
+
import Formatter from './Formatter';
|
|
6
7
|
import LinkToSyntenyView from './LinkToSyntenyView';
|
|
7
|
-
const SyntenyFeatureDetail = observer(function (
|
|
8
|
-
|
|
8
|
+
const SyntenyFeatureDetail = observer(function (props) {
|
|
9
|
+
const { model } = props;
|
|
10
|
+
const { featureData } = model;
|
|
11
|
+
const feat = structuredClone(featureData);
|
|
12
|
+
return feat ? (_jsxs(Paper, { children: [_jsx(FeatureDetails, { ...props, feature: feat, formatter: value => _jsx(Formatter, { value: value }) }), _jsx(BaseCard, { title: "Link to view", children: _jsx(LinkToSyntenyView, { model: model, feat: feat }) })] })) : (_jsx("div", { children: "No feature loaded, may not be available after page refresh because it was too large for localStorage" }));
|
|
9
13
|
});
|
|
10
14
|
export default SyntenyFeatureDetail;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jbrowse/plugin-linear-comparative-view",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.0",
|
|
4
4
|
"description": "JBrowse 2 linear comparative view",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jbrowse",
|
|
@@ -36,11 +36,11 @@
|
|
|
36
36
|
"clean": "rimraf dist esm *.tsbuildinfo"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@jbrowse/core": "^3.
|
|
40
|
-
"@jbrowse/plugin-alignments": "^3.
|
|
41
|
-
"@jbrowse/plugin-linear-genome-view": "^3.
|
|
42
|
-
"@mui/icons-material": "^
|
|
43
|
-
"@mui/material": "^
|
|
39
|
+
"@jbrowse/core": "^3.4.0",
|
|
40
|
+
"@jbrowse/plugin-alignments": "^3.4.0",
|
|
41
|
+
"@jbrowse/plugin-linear-genome-view": "^3.4.0",
|
|
42
|
+
"@mui/icons-material": "^7.0.0",
|
|
43
|
+
"@mui/material": "^7.0.0",
|
|
44
44
|
"copy-to-clipboard": "^3.3.1",
|
|
45
45
|
"file-saver": "^2.0.0",
|
|
46
46
|
"mobx": "^6.0.0",
|
|
@@ -59,5 +59,5 @@
|
|
|
59
59
|
"publishConfig": {
|
|
60
60
|
"access": "public"
|
|
61
61
|
},
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "a9f1ac35fc2dd810bae92cdaf1fc19995bee4413"
|
|
63
63
|
}
|