@milaboratories/multi-sequence-alignment 1.45.10 → 1.46.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/.turbo/turbo-build.log +13 -13
- package/.turbo/turbo-lint.log +1 -1
- package/.turbo/turbo-test.log +3 -3
- package/.turbo/turbo-type-check.log +1 -1
- package/CHANGELOG.md +13 -0
- package/dist/Consensus.vue3.js +0 -1
- package/dist/Legend.vue3.js +0 -1
- package/dist/MultiSequenceAlignmentView.vue3.js +0 -1
- package/dist/PhylogeneticTree.vue3.js +0 -1
- package/dist/PlMultiSequenceAlignment.vue3.js +0 -1
- package/dist/SeqLogo.vue3.js +0 -1
- package/dist/Toolbar.vue3.js +0 -1
- package/dist/data.d.ts +2 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +112 -106
- package/dist/data.js.map +1 -1
- package/dist/index.js +1 -0
- package/package.json +5 -5
- package/src/data.ts +35 -27
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
WARN Issue while reading "/home/runner/work/visualizations/visualizations/.npmrc". Failed to replace env in config: ${NPMJS_TOKEN}
|
|
2
2
|
|
|
3
|
-
> @milaboratories/multi-sequence-alignment@1.
|
|
3
|
+
> @milaboratories/multi-sequence-alignment@1.46.0 build /home/runner/work/visualizations/visualizations/packages/multi-sequence-alignment
|
|
4
4
|
> ts-builder build --target browser-lib
|
|
5
5
|
|
|
6
6
|
Building browser-lib project...
|
|
7
|
-
↳ vite.js build --config /home/runner/work/visualizations/visualizations/node_modules/.pnpm/@milaboratories+ts-builder@1.2.
|
|
7
|
+
↳ vite.js build --config /home/runner/work/visualizations/visualizations/node_modules/.pnpm/@milaboratories+ts-builder@1.2.4_@microsoft+api-extractor@7.53.2_@types+node@22.19.1__@types+_bfr6qarsl5e55yvmsoxdjakr2i/node_modules/@milaboratories/ts-builder/dist/configs/vite.browser-lib.config.js --mode production
|
|
8
8
|
[36mvite v6.4.1 [32mbuilding for production...[36m[39m
|
|
9
9
|
transforming...
|
|
10
10
|
[32m✓[39m 45 modules transformed.
|
|
@@ -26,9 +26,13 @@ computing gzip size...
|
|
|
26
26
|
[2mdist/[22m[32massets/multi-sequence-alignment.worker-Cm0gZp19.js [39m[1m[2m222.50 kB[22m[1m[22m
|
|
27
27
|
[2mdist/[22m[32massets/phylogenetic-tree.worker-4CrExYEo.js [39m[1m[2m465.75 kB[22m[1m[22m
|
|
28
28
|
[2mdist/[22m[36mcell-size.js [39m[1m[2m 0.11 kB[22m[1m[22m[2m │ gzip: 0.12 kB[22m[2m │ map: 0.24 kB[22m
|
|
29
|
-
[2mdist/[22m[
|
|
29
|
+
[2mdist/[22m[36mSeqLogo.vue3.js [39m[1m[2m 0.14 kB[22m[1m[22m[2m │ gzip: 0.14 kB[22m[2m │ map: 0.10 kB[22m
|
|
30
|
+
[2mdist/[22m[36mConsensus.vue3.js [39m[1m[2m 0.14 kB[22m[1m[22m[2m │ gzip: 0.14 kB[22m[2m │ map: 0.10 kB[22m
|
|
31
|
+
[2mdist/[22m[36mPlMultiSequenceAlignment.vue3.js [39m[1m[2m 0.15 kB[22m[1m[22m[2m │ gzip: 0.15 kB[22m[2m │ map: 0.12 kB[22m
|
|
32
|
+
[2mdist/[22m[36mPhylogeneticTree.vue3.js [39m[1m[2m 0.15 kB[22m[1m[22m[2m │ gzip: 0.14 kB[22m[2m │ map: 0.11 kB[22m
|
|
30
33
|
[2mdist/[22m[36m_virtual/_plugin-vue_export-helper.js [39m[1m[2m 0.19 kB[22m[1m[22m[2m │ gzip: 0.17 kB[22m[2m │ map: 0.12 kB[22m
|
|
31
34
|
[2mdist/[22m[36msettings.js [39m[1m[2m 0.23 kB[22m[1m[22m[2m │ gzip: 0.20 kB[22m[2m │ map: 0.58 kB[22m
|
|
35
|
+
[2mdist/[22m[36mLegend.vue3.js [39m[1m[2m 0.25 kB[22m[1m[22m[2m │ gzip: 0.18 kB[22m[2m │ map: 0.10 kB[22m
|
|
32
36
|
[2mdist/[22m[36mLegend.vue.js [39m[1m[2m 0.27 kB[22m[1m[22m[2m │ gzip: 0.21 kB[22m[2m │ map: 0.10 kB[22m
|
|
33
37
|
[2mdist/[22m[36mresidue-counts.js [39m[1m[2m 0.27 kB[22m[1m[22m[2m │ gzip: 0.20 kB[22m[2m │ map: 4.40 kB[22m
|
|
34
38
|
[2mdist/[22m[36mToolbar.vue.js [39m[1m[2m 0.27 kB[22m[1m[22m[2m │ gzip: 0.21 kB[22m[2m │ map: 0.10 kB[22m
|
|
@@ -37,27 +41,23 @@ computing gzip size...
|
|
|
37
41
|
[2mdist/[22m[36mPhylogeneticTree.vue.js [39m[1m[2m 0.30 kB[22m[1m[22m[2m │ gzip: 0.22 kB[22m[2m │ map: 0.11 kB[22m
|
|
38
42
|
[2mdist/[22m[36mPlMultiSequenceAlignment.vue.js [39m[1m[2m 0.32 kB[22m[1m[22m[2m │ gzip: 0.22 kB[22m[2m │ map: 0.12 kB[22m
|
|
39
43
|
[2mdist/[22m[36mMultiSequenceAlignmentView.vue.js [39m[1m[2m 0.33 kB[22m[1m[22m[2m │ gzip: 0.22 kB[22m[2m │ map: 0.12 kB[22m
|
|
40
|
-
[2mdist/[22m[
|
|
41
|
-
[2mdist/[22m[36mPhylogeneticTree.vue3.js [39m[1m[2m 0.42 kB[22m[1m[22m[2m │ gzip: 0.30 kB[22m[2m │ map: 0.11 kB[22m
|
|
42
|
-
[2mdist/[22m[36mPlMultiSequenceAlignment.vue3.js [39m[1m[2m 0.46 kB[22m[1m[22m[2m │ gzip: 0.33 kB[22m[2m │ map: 0.12 kB[22m
|
|
44
|
+
[2mdist/[22m[36mToolbar.vue3.js [39m[1m[2m 0.44 kB[22m[1m[22m[2m │ gzip: 0.25 kB[22m[2m │ map: 0.10 kB[22m
|
|
43
45
|
[2mdist/[22m[36museMiPlots.js [39m[1m[2m 0.47 kB[22m[1m[22m[2m │ gzip: 0.30 kB[22m[2m │ map: 1.09 kB[22m
|
|
44
|
-
[2mdist/[22m[36mConsensus.vue3.js [39m[1m[2m 0.47 kB[22m[1m[22m[2m │ gzip: 0.32 kB[22m[2m │ map: 0.10 kB[22m
|
|
45
46
|
[2mdist/[22m[36mmigrations.js [39m[1m[2m 0.62 kB[22m[1m[22m[2m │ gzip: 0.37 kB[22m[2m │ map: 2.15 kB[22m
|
|
46
|
-
[2mdist/[22m[36mLegend.vue3.js [39m[1m[2m 0.70 kB[22m[1m[22m[2m │ gzip: 0.42 kB[22m[2m │ map: 0.10 kB[22m
|
|
47
47
|
[2mdist/[22m[36mLegend.vue2.js [39m[1m[2m 0.85 kB[22m[1m[22m[2m │ gzip: 0.49 kB[22m[2m │ map: 1.53 kB[22m
|
|
48
48
|
[2mdist/[22m[36mnode_modules/.pnpm/@milaboratories_helpers@1.13.0/node_modules/@milaboratories/helpers/dist/objects.js [39m[1m[2m 0.89 kB[22m[1m[22m[2m │ gzip: 0.44 kB[22m[2m │ map: 9.12 kB[22m
|
|
49
|
-
[2mdist/[22m[
|
|
49
|
+
[2mdist/[22m[36mMultiSequenceAlignmentView.vue3.js [39m[1m[2m 0.90 kB[22m[1m[22m[2m │ gzip: 0.40 kB[22m[2m │ map: 0.13 kB[22m
|
|
50
50
|
[2mdist/[22m[36mmarkup.js [39m[1m[2m 2.02 kB[22m[1m[22m[2m │ gzip: 1.03 kB[22m[2m │ map: 6.53 kB[22m
|
|
51
51
|
[2mdist/[22m[36mPhylogeneticTree.vue2.js [39m[1m[2m 2.31 kB[22m[1m[22m[2m │ gzip: 1.06 kB[22m[2m │ map: 4.45 kB[22m
|
|
52
52
|
[2mdist/[22m[36mSeqLogo.vue2.js [39m[1m[2m 3.28 kB[22m[1m[22m[2m │ gzip: 1.34 kB[22m[2m │ map: 6.56 kB[22m
|
|
53
|
-
[2mdist/[22m[
|
|
53
|
+
[2mdist/[22m[36mindex.js [39m[1m[2m 3.58 kB[22m[1m[22m[2m │ gzip: 1.30 kB[22m[2m │ map: 0.09 kB[22m
|
|
54
54
|
[2mdist/[22m[36mConsensus.vue2.js [39m[1m[2m 3.64 kB[22m[1m[22m[2m │ gzip: 1.44 kB[22m[2m │ map: 7.18 kB[22m
|
|
55
55
|
[2mdist/[22m[36mMultiSequenceAlignmentView.vue2.js [39m[1m[2m 4.70 kB[22m[1m[22m[2m │ gzip: 1.66 kB[22m[2m │ map: 11.73 kB[22m
|
|
56
56
|
[2mdist/[22m[36mchemical-properties.js [39m[1m[2m 4.76 kB[22m[1m[22m[2m │ gzip: 1.67 kB[22m[2m │ map: 11.74 kB[22m
|
|
57
57
|
[2mdist/[22m[36mPlMultiSequenceAlignment.vue2.js [39m[1m[2m 7.76 kB[22m[1m[22m[2m │ gzip: 2.69 kB[22m[2m │ map: 14.84 kB[22m
|
|
58
58
|
[2mdist/[22m[36mToolbar.vue2.js [39m[1m[2m 8.32 kB[22m[1m[22m[2m │ gzip: 1.98 kB[22m[2m │ map: 12.54 kB[22m
|
|
59
|
-
[2mdist/[22m[36mdata.js [39m[1m[2m 11.
|
|
60
|
-
[vite:dts] Declaration files built in
|
|
59
|
+
[2mdist/[22m[36mdata.js [39m[1m[2m 11.40 kB[22m[1m[22m[2m │ gzip: 3.69 kB[22m[2m │ map: 33.92 kB[22m
|
|
60
|
+
[vite:dts] Declaration files built in 5043ms.
|
|
61
61
|
|
|
62
|
-
[32m✓ built in 6.
|
|
62
|
+
[32m✓ built in 6.81s[39m
|
|
63
63
|
Build completed successfully
|
package/.turbo/turbo-lint.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
WARN Issue while reading "/home/runner/work/visualizations/visualizations/.npmrc". Failed to replace env in config: ${NPMJS_TOKEN}
|
|
2
2
|
|
|
3
|
-
> @milaboratories/multi-sequence-alignment@1.
|
|
3
|
+
> @milaboratories/multi-sequence-alignment@1.46.0 lint /home/runner/work/visualizations/visualizations/packages/multi-sequence-alignment
|
|
4
4
|
> eslint .
|
|
5
5
|
|
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
WARN Issue while reading "/home/runner/work/visualizations/visualizations/.npmrc". Failed to replace env in config: ${NPMJS_TOKEN}
|
|
2
2
|
|
|
3
|
-
> @milaboratories/multi-sequence-alignment@1.
|
|
3
|
+
> @milaboratories/multi-sequence-alignment@1.46.0 test /home/runner/work/visualizations/visualizations/packages/multi-sequence-alignment
|
|
4
4
|
> vitest run --passWithNoTests
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
[1m[46m RUN [49m[22m [36mv4.0.14 [39m[90m/home/runner/work/visualizations/visualizations/packages/multi-sequence-alignment[39m
|
|
8
8
|
|
|
9
|
-
[2minclude: [22m[33m**/*.{test,spec}.?(c|m)[jt]s?(x)[39m
|
|
10
9
|
No test files found, exiting with code 0
|
|
11
|
-
[2mexclude: [22m[33m**/node_modules/**[2m, [22m**/.git/**[39m
|
|
12
10
|
|
|
11
|
+
[2minclude: [22m[33m**/*.{test,spec}.?(c|m)[jt]s?(x)[39m
|
|
12
|
+
[2mexclude: [22m[33m**/node_modules/**[2m, [22m**/.git/**[39m
|
|
13
13
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
WARN Issue while reading "/home/runner/work/visualizations/visualizations/.npmrc". Failed to replace env in config: ${NPMJS_TOKEN}
|
|
2
2
|
|
|
3
|
-
> @milaboratories/multi-sequence-alignment@1.
|
|
3
|
+
> @milaboratories/multi-sequence-alignment@1.46.0 type-check /home/runner/work/visualizations/visualizations/packages/multi-sequence-alignment
|
|
4
4
|
> ts-builder types --target browser-lib
|
|
5
5
|
|
|
6
6
|
↳ vue-tsc.js --noEmit --project ./tsconfig.json --customConditions ,
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @milaboratories/multi-sequence-alignment
|
|
2
2
|
|
|
3
|
+
## 1.46.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 20852d6: extend sequenceColumnPredicate to support selecting default options
|
|
8
|
+
|
|
9
|
+
## 1.45.11
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- Updated dependencies [ac0c05c]
|
|
14
|
+
- @milaboratories/miplots4@1.0.167
|
|
15
|
+
|
|
3
16
|
## 1.45.10
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
package/dist/Consensus.vue3.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._container_1vnon_2{display:flex;flex-direction:column;gap:4px}._container_1vnon_2 svg{display:block}")),document.head.appendChild(e)}}catch(n){console.error("vite-plugin-css-injected-by-js",n)}})();
|
|
2
1
|
const n = "_container_1vnon_2", t = {
|
|
3
2
|
container: n
|
|
4
3
|
};
|
package/dist/Legend.vue3.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._container_5klj5_2{display:flex;flex-wrap:wrap;gap:12px;max-inline-size:fit-content}._item_5klj5_9{display:flex;gap:4px}._colorSample_5klj5_14{display:inline-block;block-size:18px;inline-size:18px;border-radius:3px}")),document.head.appendChild(e)}}catch(i){console.error("vite-plugin-css-injected-by-js",i)}})();
|
|
2
1
|
const o = "_container_5klj5_2", t = "_item_5klj5_9", e = "_colorSample_5klj5_14", l = {
|
|
3
2
|
container: o,
|
|
4
3
|
item: t,
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._root_34869_2{display:flex;flex-direction:column;gap:12px;min-block-size:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;container-type:inline-size}._root_34869_2[data-pre-print]{container-type:unset}._root_34869_2[data-pre-print] ._sidebar_34869_14{max-inline-size:unset}._referenceCell_34869_20{position:fixed;visibility:hidden;font-family:Spline Sans Mono;font-weight:600;line-height:var(--v16792884)}._table_34869_28{display:grid;grid-template-columns:[sidebar-start] auto [sidebar-end] repeat(var(--v5f937812),[column-start] auto [column-end]);grid-template-rows:[header-start] auto [header-end] repeat(var(--v832f3168),[row-start] auto [row-end]);justify-content:start;position:relative}@media print{._table_34869_28{overflow:visible}}._sidebar_34869_14{grid-column:sidebar;grid-row:1 row-start / -1 row-end;display:grid;grid-template-rows:subgrid;position:sticky;inset-inline-start:0;background-color:#fff;inline-size:min-content;max-inline-size:30cqi;overflow:scroll;overscroll-behavior-inline:none;scrollbar-width:none}._phylogeneticTree_34869_60{grid-row:1 row-start / -1 row-end}._labels_34869_64{grid-row:1 row-start / -1 row-end;display:grid;grid-template-columns:repeat(var(--v71429b60),auto);grid-template-rows:subgrid;grid-auto-flow:column;column-gap:12px;padding-inline-end:12px;font-family:Spline Sans Mono;line-height:var(--v16792884);white-space:nowrap}._sequenceColumn_34869_77{grid-row:header-start / -1 row-end;display:grid;grid-template-rows:subgrid}._sequenceColumn_34869_77+._sequenceColumn_34869_77{margin-inline-start:24px}._sequenceHeader_34869_86{grid-row:header;display:flex;flex-direction:column;justify-content:end;min-inline-size:0;position:sticky;inset-block-start:0;background-color:#fff}._sequenceName_34869_97{margin-block-end:4px;font-weight:700;line-height:20px;inline-size:fit-content;position:sticky;inset-inline-start:var(--v49944722)}._sequenceRowsContainer_34869_106{grid-row:1 row-start / -1 row-end;display:grid;grid-template-rows:subgrid}._sequenceRow_34869_106{font-family:Spline Sans Mono;font-weight:600;line-height:var(--v16792884);letter-spacing:var(--v622f88b4);text-indent:calc(var(--v622f88b4) / 2);inline-size:calc-size(min-content,round(down,size,var(--c9eaa2b8)));white-space:nowrap}._corner_34869_125{grid-column:sidebar;grid-row:header;position:sticky;inset-inline-start:0;inset-block-start:0;background-color:#fff}")),document.head.appendChild(e)}}catch(i){console.error("vite-plugin-css-injected-by-js",i)}})();
|
|
2
1
|
const e = "_root_34869_2", n = "_sidebar_34869_14", s = "_referenceCell_34869_20", o = "_table_34869_28", c = "_phylogeneticTree_34869_60", _ = "_labels_34869_64", r = "_sequenceColumn_34869_77", t = "_sequenceHeader_34869_86", l = "_sequenceName_34869_97", a = "_sequenceRowsContainer_34869_106", u = "_sequenceRow_34869_106", q = "_corner_34869_125", b = {
|
|
3
2
|
root: e,
|
|
4
3
|
sidebar: n,
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._container_1uo2b_2 svg{display:block}")),document.head.appendChild(e)}}catch(t){console.error("vite-plugin-css-injected-by-js",t)}})();
|
|
2
1
|
const n = "_container_1uo2b_2", t = {
|
|
3
2
|
container: n
|
|
4
3
|
};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._splash_dk8xp_2{flex:1;display:flex;flex-direction:column;gap:12px;overflow:hidden}")),document.head.appendChild(e)}}catch(d){console.error("vite-plugin-css-injected-by-js",d)}})();
|
|
2
1
|
const s = "_splash_dk8xp_2", a = {
|
|
3
2
|
splash: s
|
|
4
3
|
};
|
package/dist/SeqLogo.vue3.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._container_1uo2b_2 svg{display:block}")),document.head.appendChild(e)}}catch(t){console.error("vite-plugin-css-injected-by-js",t)}})();
|
|
2
1
|
const n = "_container_1uo2b_2", t = {
|
|
3
2
|
container: n
|
|
4
3
|
};
|
package/dist/Toolbar.vue3.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._container_ypn45_2{display:flex;flex-direction:column;gap:24px}._line_ypn45_8{display:flex;justify-content:space-between}._section_ypn45_13{display:flex;flex-wrap:wrap;gap:24px}._buttons_ypn45_19,._pendingChanges_ypn45_23{display:flex}._pendingChanges_ypn45_23 button{min-width:160px}._resetButton_ypn45_30{margin-block-start:auto}._resetButton_ypn45_30 span{text-transform:none}")),document.head.appendChild(e)}}catch(n){console.error("vite-plugin-css-injected-by-js",n)}})();
|
|
2
1
|
const n = "_container_ypn45_2", t = "_line_ypn45_8", e = "_section_ypn45_13", s = "_buttons_ypn45_19", o = "_pendingChanges_ypn45_23", _ = "_resetButton_ypn45_30", c = {
|
|
3
2
|
container: n,
|
|
4
3
|
line: t,
|
package/dist/data.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import { PColumnPredicate, PFrameHandle, PlMultiSequenceAlignmentColorSchemeOption, PlMultiSequenceAlignmentSettings, PlSelectionModel, PObjectId, PTableColumnId } from '@platforma-sdk/model';
|
|
1
2
|
import { ListOptionNormalized } from '@platforma-sdk/ui-vue';
|
|
2
|
-
import { PColumnIdAndSpec, PFrameHandle, PlMultiSequenceAlignmentColorSchemeOption, PlMultiSequenceAlignmentSettings, PlSelectionModel, PObjectId, PTableColumnId } from '@platforma-sdk/model';
|
|
3
3
|
import { HighlightLegend, ResidueCounts } from './types';
|
|
4
4
|
import type * as PhylogeneticTreeWorker from './phylogenetic-tree.worker';
|
|
5
5
|
export declare const SEQUENCE_LIMIT = 1000;
|
|
6
6
|
export declare const useSequenceColumnsOptions: (paramsGetter: () => {
|
|
7
7
|
pFrame: PFrameHandle | undefined;
|
|
8
|
-
sequenceColumnPredicate:
|
|
8
|
+
sequenceColumnPredicate: PColumnPredicate;
|
|
9
9
|
}) => {
|
|
10
10
|
data: import('vue').Ref<OptionsWithDefaults<PObjectId> | undefined, OptionsWithDefaults<PObjectId> | undefined>;
|
|
11
11
|
isLoading: import('vue').Ref<boolean, boolean>;
|
package/dist/data.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKV,gBAAgB,EAChB,YAAY,EACZ,yCAAyC,EACzC,gCAAgC,EAChC,gBAAgB,EAChB,SAAS,EACT,cAAc,EAEf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAGlE,OAAO,KAAK,KAAK,sBAAsB,MAAM,4BAA4B,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AA8B9D,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,eAAO,MAAM,yBAAyB;YAiB5B,YAAY,GAAG,SAAS;6BACP,gBAAgB;;;;;CAhB1C,CAAC;AAEF,eAAO,MAAM,sBAAsB;YAwCzB,YAAY,GAAG,SAAS;uBACb,SAAS,EAAE,GAAG,SAAS;;;;;CAvC3C,CAAC;AAEF,eAAO,MAAM,uBAAuB;YA4G1B,YAAY,GAAG,SAAS;uBACb,SAAS,EAAE,GAAG,SAAS;;;;;CA3G3C,CAAC;AAEF,eAAO,MAAM,wBAAwB;YAmKzB,YAAY,GAAG,SAAS;uBACb,SAAS,EAAE,GAAG,SAAS;oBAC1B,cAAc,EAAE,GAAG,SAAS;eACjC,gBAAgB,GAAG,SAAS;iBAC1B,yCAAyC;qBACrC,gCAAgC,CAAC,iBAAiB,CAAC;iCACvC,OAAO;;;;;CAvKvC,CAAC;AA0kBF,KAAK,qBAAqB,GAAG;IAC3B,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,aAAa,EAAE,aAAa,CAAC;QAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,EAAE,CAAC;IACJ,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,EAAE,CAAC;KAChB,EAAE,CAAC;IACJ,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,gBAAgB,CAAC,EAAE,sBAAsB,CAAC,YAAY,EAAE,CAAC;IACzD,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,KAAK,mBAAmB,CAAC,CAAC,IAAI;IAC5B,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;IACnC,QAAQ,EAAE,CAAC,EAAE,CAAC;CACf,CAAC"}
|
package/dist/data.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { isJsonEqual as O } from "./node_modules/.pnpm/@milaboratories_helpers@1.13.0/node_modules/@milaboratories/helpers/dist/objects.js";
|
|
2
2
|
import { ensureError as T, getRawPlatformaInstance as $, readAnnotation as C, Annotation as h, canonicalizeJson as v, getAxisId as S, parseJson as A, isLabelColumn as j, matchAxisId as B, readAnnotationJson as J, isLinkerColumn as N, createRowSelectionColumn as W, pTableValue as R } from "@platforma-sdk/model";
|
|
3
|
-
import { ref as M, watch as F, onWatcherCleanup as H } from "vue";
|
|
4
3
|
import { objectHash as I } from "@platforma-sdk/ui-vue";
|
|
4
|
+
import { ref as M, watch as F, onWatcherCleanup as H } from "vue";
|
|
5
5
|
import { highlightByChemicalProperties as V } from "./chemical-properties.js";
|
|
6
6
|
import { parseMarkup as z, highlightByMarkup as Q, markupAlignedSequence as Y } from "./markup.js";
|
|
7
7
|
import { getResidueCounts as Z } from "./residue-counts.js";
|
|
@@ -16,15 +16,21 @@ const x = () => $().pFrameDriver, D = 1e3, we = E(
|
|
|
16
16
|
);
|
|
17
17
|
async function _({ pFrame: n, sequenceColumnPredicate: r }) {
|
|
18
18
|
if (!n) return;
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
const e = await x().listColumns(n), a = { options: [], defaults: [] };
|
|
20
|
+
for (const t of e) {
|
|
21
|
+
const c = r(t);
|
|
22
|
+
if (!c) continue;
|
|
23
|
+
const { columnId: i, spec: l } = t;
|
|
24
|
+
(c === !0 || c.default) && a.defaults.push(i), a.options.push({
|
|
25
|
+
label: C(l, h.Label) ?? "Unlabeled column",
|
|
26
|
+
value: i
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return a;
|
|
24
30
|
}
|
|
25
31
|
async function G({ pFrame: n, sequenceColumnIds: r }) {
|
|
26
32
|
if (!n || !r) return;
|
|
27
|
-
const
|
|
33
|
+
const o = x(), e = await o.listColumns(n), a = new Map(
|
|
28
34
|
r.values().flatMap((s) => {
|
|
29
35
|
const u = e.find(({ columnId: m }) => m === s);
|
|
30
36
|
if (!u)
|
|
@@ -32,7 +38,7 @@ async function G({ pFrame: n, sequenceColumnIds: r }) {
|
|
|
32
38
|
return u.spec.axesSpec.values().map((m) => [v(S(m)), m]);
|
|
33
39
|
})
|
|
34
40
|
), t = /* @__PURE__ */ new Map();
|
|
35
|
-
for (const [s, u] of
|
|
41
|
+
for (const [s, u] of a.entries()) {
|
|
36
42
|
const m = A(s), d = e.find(
|
|
37
43
|
({ spec: p }) => j(p) && B(m, S(p.axesSpec[0]))
|
|
38
44
|
);
|
|
@@ -41,12 +47,12 @@ async function G({ pFrame: n, sequenceColumnIds: r }) {
|
|
|
41
47
|
C(d == null ? void 0 : d.spec, h.Label) ?? C(u, h.Label) ?? "Unlabeled axis"
|
|
42
48
|
);
|
|
43
49
|
}
|
|
44
|
-
const { hits:
|
|
50
|
+
const { hits: c } = await o.findColumns(n, {
|
|
45
51
|
columnFilter: {},
|
|
46
|
-
compatibleWith:
|
|
52
|
+
compatibleWith: a.keys().map((s) => A(s)).toArray(),
|
|
47
53
|
strictlyCompatible: !1
|
|
48
54
|
});
|
|
49
|
-
for (const { columnId: s, spec: u } of
|
|
55
|
+
for (const { columnId: s, spec: u } of c) {
|
|
50
56
|
const m = v({
|
|
51
57
|
type: "column",
|
|
52
58
|
id: s
|
|
@@ -56,80 +62,80 @@ async function G({ pFrame: n, sequenceColumnIds: r }) {
|
|
|
56
62
|
C(u, h.Label) ?? "Unlabeled column"
|
|
57
63
|
);
|
|
58
64
|
}
|
|
59
|
-
const
|
|
65
|
+
const i = t.entries().map(([s, u]) => ({ label: u, value: A(s) })).toArray(), l = i.values().filter(({ value: s }) => {
|
|
60
66
|
if (s.type === "axis") return !0;
|
|
61
67
|
const u = e.find(({ columnId: m }) => m === s.id);
|
|
62
68
|
return u && j(u.spec);
|
|
63
69
|
}).map(({ value: s }) => s).toArray();
|
|
64
|
-
return { options:
|
|
70
|
+
return { options: i, defaults: l };
|
|
65
71
|
}
|
|
66
72
|
async function K({ pFrame: n, sequenceColumnIds: r }) {
|
|
67
73
|
if (!n || !r) return;
|
|
68
|
-
const e = await x().listColumns(n), t = r.map((
|
|
69
|
-
const l = e.find((s) => s.columnId ===
|
|
74
|
+
const e = await x().listColumns(n), t = r.map((i) => {
|
|
75
|
+
const l = e.find((s) => s.columnId === i);
|
|
70
76
|
if (!l)
|
|
71
77
|
throw new Error(
|
|
72
78
|
`Couldn't find sequence column (ID: \`${r[0]}\`).`
|
|
73
79
|
);
|
|
74
80
|
return l;
|
|
75
81
|
}).flatMap(
|
|
76
|
-
(
|
|
77
|
-
(l) => J(l.spec, h.Sequence.IsAnnotation) && O(
|
|
82
|
+
(i) => e.filter(
|
|
83
|
+
(l) => J(l.spec, h.Sequence.IsAnnotation) && O(i.spec.axesSpec, l.spec.axesSpec) && Object.entries(i.spec.domain ?? {}).every(([s, u]) => {
|
|
78
84
|
var m;
|
|
79
85
|
return ((m = l.spec.domain) == null ? void 0 : m[s]) === u;
|
|
80
86
|
})
|
|
81
|
-
).map((l) => ({ markupColumn: l, sequenceColumn:
|
|
87
|
+
).map((l) => ({ markupColumn: l, sequenceColumn: i }))
|
|
82
88
|
);
|
|
83
89
|
return Map.groupBy(
|
|
84
90
|
t,
|
|
85
|
-
({ markupColumn:
|
|
91
|
+
({ markupColumn: i, sequenceColumn: l }) => {
|
|
86
92
|
const s = Object.fromEntries(
|
|
87
|
-
Object.entries(
|
|
93
|
+
Object.entries(i.spec.domain ?? {}).filter(([u]) => {
|
|
88
94
|
var m;
|
|
89
95
|
return ((m = l.spec.domain) == null ? void 0 : m[u]) == null;
|
|
90
96
|
})
|
|
91
97
|
);
|
|
92
98
|
return v(s);
|
|
93
99
|
}
|
|
94
|
-
).entries().map(([
|
|
95
|
-
label: Object.values(A(
|
|
100
|
+
).entries().map(([i, l]) => ({
|
|
101
|
+
label: Object.values(A(i)).join(", "),
|
|
96
102
|
value: l.map(({ markupColumn: s }) => s.columnId)
|
|
97
103
|
})).toArray();
|
|
98
104
|
}
|
|
99
105
|
async function X({
|
|
100
106
|
pFrame: n,
|
|
101
107
|
sequenceColumnIds: r,
|
|
102
|
-
labelColumnIds:
|
|
108
|
+
labelColumnIds: o,
|
|
103
109
|
selection: e,
|
|
104
|
-
colorScheme:
|
|
110
|
+
colorScheme: a,
|
|
105
111
|
alignmentParams: t,
|
|
106
|
-
shouldBuildPhylogeneticTree:
|
|
107
|
-
},
|
|
112
|
+
shouldBuildPhylogeneticTree: c
|
|
113
|
+
}, i) {
|
|
108
114
|
var q;
|
|
109
|
-
if (!n || !(r != null && r.length) || !
|
|
115
|
+
if (!n || !(r != null && r.length) || !o) return;
|
|
110
116
|
const l = await ee({
|
|
111
117
|
pFrame: n,
|
|
112
118
|
sequenceColumnIds: r,
|
|
113
|
-
labelColumnIds:
|
|
119
|
+
labelColumnIds: o,
|
|
114
120
|
selection: e,
|
|
115
|
-
colorScheme:
|
|
121
|
+
colorScheme: a
|
|
116
122
|
}), s = ((q = l.at(0)) == null ? void 0 : q.data.data.length) ?? 0;
|
|
117
123
|
if (s < 2) return;
|
|
118
|
-
const u = s > D, m = te(r, l), d = ne(
|
|
124
|
+
const u = s > D, m = te(r, l), d = ne(o, l), p = a.type === "markup" ? re(a.columnIds, l) : void 0, b = {}, y = await Promise.all(
|
|
119
125
|
m.map(async ({ name: w, rows: f }) => ({
|
|
120
126
|
name: w,
|
|
121
|
-
rows: await
|
|
127
|
+
rows: await oe(
|
|
122
128
|
f,
|
|
123
129
|
JSON.parse(JSON.stringify(t)),
|
|
124
|
-
|
|
130
|
+
i
|
|
125
131
|
)
|
|
126
132
|
}))
|
|
127
133
|
);
|
|
128
134
|
let L;
|
|
129
|
-
if (
|
|
135
|
+
if (c) {
|
|
130
136
|
L = await ie(
|
|
131
137
|
y,
|
|
132
|
-
|
|
138
|
+
i
|
|
133
139
|
);
|
|
134
140
|
const w = L.values().filter(({ id: f }) => f >= 0).map(({ id: f }) => f).toArray();
|
|
135
141
|
for (const f of y)
|
|
@@ -142,8 +148,8 @@ async function X({
|
|
|
142
148
|
return {
|
|
143
149
|
sequences: await Promise.all(
|
|
144
150
|
y.map(async ({ name: w, rows: f }, g) => {
|
|
145
|
-
const U = Z(f), k =
|
|
146
|
-
colorScheme:
|
|
151
|
+
const U = Z(f), k = ae({
|
|
152
|
+
colorScheme: a,
|
|
147
153
|
sequences: f,
|
|
148
154
|
residueCounts: U,
|
|
149
155
|
markup: p == null ? void 0 : p.at(g)
|
|
@@ -168,8 +174,8 @@ async function X({
|
|
|
168
174
|
exceedsLimit: u
|
|
169
175
|
};
|
|
170
176
|
}
|
|
171
|
-
async function ee({ pFrame: n, sequenceColumnIds: r, labelColumnIds:
|
|
172
|
-
const t = x(),
|
|
177
|
+
async function ee({ pFrame: n, sequenceColumnIds: r, labelColumnIds: o, selection: e, colorScheme: a }) {
|
|
178
|
+
const t = x(), c = await t.listColumns(n), i = c.filter((p) => N(p.spec)), l = W({ selection: e });
|
|
173
179
|
let s = {
|
|
174
180
|
type: "inner",
|
|
175
181
|
entries: r.map((p) => ({
|
|
@@ -177,10 +183,10 @@ async function ee({ pFrame: n, sequenceColumnIds: r, labelColumnIds: a, selectio
|
|
|
177
183
|
column: p
|
|
178
184
|
}))
|
|
179
185
|
};
|
|
180
|
-
|
|
186
|
+
i.length > 0 && (s = {
|
|
181
187
|
type: "outer",
|
|
182
188
|
primary: s,
|
|
183
|
-
secondary:
|
|
189
|
+
secondary: i.map(({ columnId: p }) => ({
|
|
184
190
|
type: "column",
|
|
185
191
|
column: p
|
|
186
192
|
}))
|
|
@@ -194,14 +200,14 @@ async function ee({ pFrame: n, sequenceColumnIds: r, labelColumnIds: a, selectio
|
|
|
194
200
|
}
|
|
195
201
|
]
|
|
196
202
|
});
|
|
197
|
-
const u =
|
|
198
|
-
if (
|
|
199
|
-
for (const p of
|
|
203
|
+
const u = o.flatMap((p) => p.type !== "column" ? [] : { type: "column", column: p.id });
|
|
204
|
+
if (a.type === "markup")
|
|
205
|
+
for (const p of a.columnIds)
|
|
200
206
|
u.push({ type: "column", column: p });
|
|
201
207
|
const m = Array.from(
|
|
202
208
|
new Set(
|
|
203
209
|
r.values().flatMap((p) => {
|
|
204
|
-
const b =
|
|
210
|
+
const b = c.find(({ columnId: y }) => y === p);
|
|
205
211
|
if (!b)
|
|
206
212
|
throw new Error(`Couldn't find sequence column (ID: ${p})`);
|
|
207
213
|
return b.spec.axesSpec.map((y) => v(S(y)));
|
|
@@ -230,53 +236,53 @@ async function ee({ pFrame: n, sequenceColumnIds: r, labelColumnIds: a, selectio
|
|
|
230
236
|
}
|
|
231
237
|
);
|
|
232
238
|
}
|
|
233
|
-
const te = (n, r) => n.map((
|
|
234
|
-
const e = r.find(({ spec:
|
|
239
|
+
const te = (n, r) => n.map((o) => {
|
|
240
|
+
const e = r.find(({ spec: c }) => c.id === o);
|
|
235
241
|
if (!e)
|
|
236
|
-
throw new Error(`Couldn't find sequence column (ID: \`${
|
|
237
|
-
const
|
|
238
|
-
(
|
|
239
|
-
var
|
|
240
|
-
return ((
|
|
242
|
+
throw new Error(`Couldn't find sequence column (ID: \`${o}\`).`);
|
|
243
|
+
const a = C(e.spec.spec, h.Label) ?? "Unlabeled column", t = e.data.data.keys().take(D).map(
|
|
244
|
+
(c) => {
|
|
245
|
+
var i;
|
|
246
|
+
return ((i = R(e.data, c, { absent: "", na: "" })) == null ? void 0 : i.toString()) ?? "";
|
|
241
247
|
}
|
|
242
248
|
).toArray();
|
|
243
|
-
return { name:
|
|
244
|
-
}), ne = (n, r) => n.map((
|
|
249
|
+
return { name: a, rows: t };
|
|
250
|
+
}), ne = (n, r) => n.map((o) => {
|
|
245
251
|
const e = r.find(({ spec: t }) => {
|
|
246
|
-
if (
|
|
247
|
-
return O(
|
|
248
|
-
if (
|
|
249
|
-
return
|
|
252
|
+
if (o.type === "axis" && t.type === "axis")
|
|
253
|
+
return O(o.id, t.id);
|
|
254
|
+
if (o.type === "column" && t.type === "column")
|
|
255
|
+
return o.id === t.id;
|
|
250
256
|
});
|
|
251
257
|
if (!e)
|
|
252
|
-
throw new Error(`Couldn't find label column (ID: \`${
|
|
258
|
+
throw new Error(`Couldn't find label column (ID: \`${o}\`).`);
|
|
253
259
|
return { rows: e.data.data.keys().take(D).map(
|
|
254
260
|
(t) => {
|
|
255
|
-
var
|
|
256
|
-
return ((
|
|
261
|
+
var c;
|
|
262
|
+
return ((c = R(e.data, t, { absent: "", na: "" })) == null ? void 0 : c.toString()) ?? "";
|
|
257
263
|
}
|
|
258
264
|
).toArray() };
|
|
259
|
-
}), re = (n, r) => n.map((
|
|
260
|
-
const e = r.find(({ spec:
|
|
265
|
+
}), re = (n, r) => n.map((o) => {
|
|
266
|
+
const e = r.find(({ spec: c }) => c.id === o);
|
|
261
267
|
if (!e)
|
|
262
|
-
throw new Error(`Couldn't find markup column (ID: \`${
|
|
263
|
-
const
|
|
268
|
+
throw new Error(`Couldn't find markup column (ID: \`${o}\`).`);
|
|
269
|
+
const a = J(
|
|
264
270
|
e.spec.spec,
|
|
265
271
|
h.Sequence.Annotation.Mapping
|
|
266
272
|
) ?? {}, t = e.data.data.keys().take(D).map(
|
|
267
|
-
(
|
|
268
|
-
var
|
|
273
|
+
(c) => {
|
|
274
|
+
var i;
|
|
269
275
|
return z(
|
|
270
|
-
((
|
|
276
|
+
((i = R(e.data, c, { absent: "", na: "" })) == null ? void 0 : i.toString()) ?? ""
|
|
271
277
|
);
|
|
272
278
|
}
|
|
273
279
|
).toArray();
|
|
274
|
-
return { labels:
|
|
275
|
-
}),
|
|
280
|
+
return { labels: a, rows: t };
|
|
281
|
+
}), oe = /* @__PURE__ */ (() => {
|
|
276
282
|
const n = /* @__PURE__ */ new Map();
|
|
277
|
-
return async (r,
|
|
278
|
-
const
|
|
279
|
-
let t = n.get(
|
|
283
|
+
return async (r, o, e) => {
|
|
284
|
+
const a = await I([r, o]);
|
|
285
|
+
let t = n.get(a);
|
|
280
286
|
return t || (t = await P(
|
|
281
287
|
new Worker(
|
|
282
288
|
new URL(
|
|
@@ -286,38 +292,38 @@ const te = (n, r) => n.map((a) => {
|
|
|
286
292
|
),
|
|
287
293
|
{ type: "module" }
|
|
288
294
|
),
|
|
289
|
-
{ sequences: r, params:
|
|
295
|
+
{ sequences: r, params: o },
|
|
290
296
|
e
|
|
291
|
-
), n.set(
|
|
297
|
+
), n.set(a, t), t);
|
|
292
298
|
};
|
|
293
299
|
})();
|
|
294
|
-
function
|
|
295
|
-
var
|
|
300
|
+
function ae({ colorScheme: n, sequences: r, residueCounts: o, markup: e }) {
|
|
301
|
+
var a;
|
|
296
302
|
if (n.type === "chemical-properties")
|
|
297
|
-
return V({ sequences: r, residueCounts:
|
|
303
|
+
return V({ sequences: r, residueCounts: o });
|
|
298
304
|
if (n.type === "markup") {
|
|
299
305
|
if (!e)
|
|
300
306
|
throw new Error("Missing markup data.");
|
|
301
307
|
return Q({
|
|
302
|
-
markupRows: r.map((t,
|
|
303
|
-
const
|
|
304
|
-
if (!
|
|
305
|
-
return Y(t,
|
|
308
|
+
markupRows: r.map((t, c) => {
|
|
309
|
+
const i = e.rows.at(c);
|
|
310
|
+
if (!i) throw new Error(`Missing markup for row ${c}.`);
|
|
311
|
+
return Y(t, i);
|
|
306
312
|
}),
|
|
307
|
-
columnCount: ((
|
|
313
|
+
columnCount: ((a = r.at(0)) == null ? void 0 : a.length) ?? 0,
|
|
308
314
|
labels: e.labels
|
|
309
315
|
});
|
|
310
316
|
}
|
|
311
317
|
}
|
|
312
|
-
const se = (n) => new Promise((r,
|
|
318
|
+
const se = (n) => new Promise((r, o) => {
|
|
313
319
|
const e = new FileReader();
|
|
314
|
-
e.addEventListener("load", () => r(e.result)), e.addEventListener("error", () =>
|
|
320
|
+
e.addEventListener("load", () => r(e.result)), e.addEventListener("error", () => o(e.error)), e.readAsDataURL(n);
|
|
315
321
|
}), ie = /* @__PURE__ */ (() => {
|
|
316
322
|
const n = /* @__PURE__ */ new Map();
|
|
317
|
-
return async (r,
|
|
318
|
-
var
|
|
319
|
-
const e = ((
|
|
320
|
-
let t = n.get(
|
|
323
|
+
return async (r, o) => {
|
|
324
|
+
var c;
|
|
325
|
+
const e = ((c = r.at(0)) == null ? void 0 : c.rows.keys().map((i) => r.map((l) => l.rows.at(i) ?? "").join("")).toArray()) ?? [], a = await I(e);
|
|
326
|
+
let t = n.get(a);
|
|
321
327
|
return t || (t = await P(
|
|
322
328
|
new Worker(
|
|
323
329
|
new URL(
|
|
@@ -328,37 +334,37 @@ const se = (n) => new Promise((r, a) => {
|
|
|
328
334
|
{ type: "module" }
|
|
329
335
|
),
|
|
330
336
|
e,
|
|
331
|
-
|
|
332
|
-
), n.set(
|
|
337
|
+
o
|
|
338
|
+
), n.set(a, t), t);
|
|
333
339
|
};
|
|
334
|
-
})(), P = (n, r,
|
|
340
|
+
})(), P = (n, r, o) => new Promise((e, a) => {
|
|
335
341
|
n.addEventListener("message", ({ data: t }) => {
|
|
336
342
|
e(t), n.terminate();
|
|
337
|
-
}), n.addEventListener("error", ({ error: t, message:
|
|
338
|
-
|
|
339
|
-
}),
|
|
340
|
-
o
|
|
343
|
+
}), n.addEventListener("error", ({ error: t, message: c }) => {
|
|
344
|
+
a(t ?? c), n.terminate();
|
|
345
|
+
}), o.addEventListener("abort", () => {
|
|
346
|
+
a(o.reason), n.terminate();
|
|
341
347
|
}), n.postMessage(r);
|
|
342
348
|
});
|
|
343
349
|
function E(n) {
|
|
344
|
-
const r = M(),
|
|
345
|
-
let
|
|
346
|
-
return (t) => (F(t, async (
|
|
347
|
-
if (O(
|
|
348
|
-
const l = new AbortController(), s =
|
|
350
|
+
const r = M(), o = M(!0), e = M();
|
|
351
|
+
let a;
|
|
352
|
+
return (t) => (F(t, async (c, i) => {
|
|
353
|
+
if (O(c, i)) return;
|
|
354
|
+
const l = new AbortController(), s = a = Symbol();
|
|
349
355
|
H(() => {
|
|
350
356
|
l.abort();
|
|
351
357
|
});
|
|
352
358
|
try {
|
|
353
|
-
e.value = void 0,
|
|
354
|
-
const u = await n(
|
|
355
|
-
s ===
|
|
359
|
+
e.value = void 0, o.value = !0;
|
|
360
|
+
const u = await n(c, l.signal);
|
|
361
|
+
s === a && (r.value = u);
|
|
356
362
|
} catch (u) {
|
|
357
|
-
console.error(u), s ===
|
|
363
|
+
console.error(u), s === a && (e.value = T(u));
|
|
358
364
|
} finally {
|
|
359
|
-
s ===
|
|
365
|
+
s === a && (o.value = !1);
|
|
360
366
|
}
|
|
361
|
-
}, { immediate: !0 }), { data: r, isLoading:
|
|
367
|
+
}, { immediate: !0 }), { data: r, isLoading: o, error: e });
|
|
362
368
|
}
|
|
363
369
|
export {
|
|
364
370
|
D as SEQUENCE_LIMIT,
|
package/dist/data.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.js","sources":["../src/data.ts"],"sourcesContent":["import { isJsonEqual } from '@milaboratories/helpers';\nimport type { ListOptionNormalized } from '@platforma-sdk/ui-vue';\nimport {\n Annotation,\n type CalculateTableDataRequest,\n type CalculateTableDataResponse,\n type CanonicalizedJson,\n canonicalizeJson,\n createRowSelectionColumn,\n ensureError,\n getAxisId,\n getRawPlatformaInstance,\n isLabelColumn,\n isLinkerColumn,\n type JoinEntry,\n matchAxisId,\n parseJson,\n type PColumnIdAndSpec,\n type PFrameHandle,\n type PlMultiSequenceAlignmentColorSchemeOption,\n type PlMultiSequenceAlignmentSettings,\n type PlSelectionModel,\n type PObjectId,\n type PTableColumnId,\n type PTableSorting,\n pTableValue,\n readAnnotation,\n readAnnotationJson,\n} from '@platforma-sdk/model';\nimport { onWatcherCleanup, ref, watch } from 'vue';\nimport { objectHash } from '@platforma-sdk/ui-vue';\nimport { highlightByChemicalProperties } from './chemical-properties';\nimport type { Markup } from './markup';\nimport {\n highlightByMarkup,\n markupAlignedSequence,\n parseMarkup,\n} from './markup';\nimport type * as MultiSequenceAlignmentWorker from './multi-sequence-alignment.worker';\nimport type * as PhylogeneticTreeWorker from './phylogenetic-tree.worker';\nimport { getResidueCounts } from './residue-counts';\nimport type { HighlightLegend, ResidueCounts } from './types';\n\nconst getPFrameDriver = () => getRawPlatformaInstance().pFrameDriver;\n\nexport const SEQUENCE_LIMIT = 1000;\n\nexport const useSequenceColumnsOptions = refreshOnDeepChange(\n getSequenceColumnsOptions,\n);\n\nexport const useLabelColumnsOptions = refreshOnDeepChange(\n getLabelColumnsOptions,\n);\n\nexport const useMarkupColumnsOptions = refreshOnDeepChange(\n getMarkupColumnsOptions,\n);\n\nexport const useMultipleAlignmentData = refreshOnDeepChange(\n getMultipleAlignmentData,\n);\n\nasync function getSequenceColumnsOptions({ pFrame, sequenceColumnPredicate }: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnPredicate: (column: PColumnIdAndSpec) => boolean;\n}): Promise<OptionsWithDefaults<PObjectId> | undefined> {\n if (!pFrame) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n\n const options = columns.values()\n .filter((column) => sequenceColumnPredicate(column))\n .map(({ spec, columnId }) => ({\n label: readAnnotation(spec, Annotation.Label) ?? 'Unlabeled column',\n value: columnId,\n }))\n .toArray();\n\n const defaults = options.map(({ value }) => value);\n\n return { options, defaults };\n}\n\nasync function getLabelColumnsOptions({ pFrame, sequenceColumnIds }: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<OptionsWithDefaults<PTableColumnId> | undefined> {\n if (!pFrame || !sequenceColumnIds) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n\n const sequenceColumnsAxes = new Map(\n sequenceColumnIds.values().flatMap((id) => {\n const column = columns.find(({ columnId }) => columnId === id);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: \\`${id}\\`).`);\n }\n return column.spec.axesSpec.values()\n .map((spec) => [canonicalizeJson(getAxisId(spec)), spec]);\n }),\n );\n\n const optionMap = new Map<CanonicalizedJson<PTableColumnId>, string>();\n for (const [axisIdJson, axisSpec] of sequenceColumnsAxes.entries()) {\n const axisId = parseJson(axisIdJson);\n const labelColumn = columns.find(({ spec }) =>\n isLabelColumn(spec) && matchAxisId(axisId, getAxisId(spec.axesSpec[0])),\n );\n optionMap.set(\n labelColumn\n ? canonicalizeJson({ type: 'column', id: labelColumn.columnId })\n : canonicalizeJson({ type: 'axis', id: axisId }),\n readAnnotation(labelColumn?.spec, Annotation.Label)\n ?? readAnnotation(axisSpec, Annotation.Label)\n ?? 'Unlabeled axis',\n );\n }\n\n const { hits: compatibleColumns } = await pFrameDriver.findColumns(pFrame, {\n columnFilter: {},\n compatibleWith: sequenceColumnsAxes.keys()\n .map((axisIdJson) => parseJson(axisIdJson))\n .toArray(),\n strictlyCompatible: false,\n });\n\n for (const { columnId, spec } of compatibleColumns) {\n const columnIdJson = canonicalizeJson<PTableColumnId>({\n type: 'column',\n id: columnId,\n });\n if (optionMap.has(columnIdJson)) continue;\n optionMap.set(\n columnIdJson,\n readAnnotation(spec, Annotation.Label) ?? 'Unlabeled column',\n );\n }\n\n const options = optionMap.entries()\n .map(([value, label]) => ({ label, value: parseJson(value) }))\n .toArray();\n\n const defaults = options.values()\n .filter(({ value }) => {\n if (value.type === 'axis') return true;\n const column = columns.find(({ columnId }) => columnId === value.id);\n return column && isLabelColumn(column.spec);\n })\n .map(({ value }) => value)\n .toArray();\n\n return { options, defaults };\n}\n\nasync function getMarkupColumnsOptions({ pFrame, sequenceColumnIds }: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<ListOptionNormalized<PObjectId[]>[] | undefined> {\n if (!pFrame || !sequenceColumnIds) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n\n const sequenceColumns = sequenceColumnIds.map((columnId) => {\n const column = columns.find((column) => column.columnId === columnId);\n if (!column) {\n throw new Error(\n `Couldn't find sequence column (ID: \\`${sequenceColumnIds[0]}\\`).`,\n );\n }\n return column;\n });\n\n const columnPairs = sequenceColumns\n .flatMap((sequenceColumn) =>\n columns\n .filter((column) =>\n readAnnotationJson(column.spec, Annotation.Sequence.IsAnnotation)\n && isJsonEqual(sequenceColumn.spec.axesSpec, column.spec.axesSpec)\n && Object.entries(sequenceColumn.spec.domain ?? {})\n .every(([key, value]) => column.spec.domain?.[key] === value),\n )\n .map((markupColumn) => ({ markupColumn, sequenceColumn })),\n );\n\n const groupedByDomainDiff = Map.groupBy(\n columnPairs,\n ({ markupColumn, sequenceColumn }) => {\n const domainDiff = Object.fromEntries(\n Object.entries(markupColumn.spec.domain ?? {})\n .filter(([key]) => sequenceColumn.spec.domain?.[key] == undefined),\n );\n return canonicalizeJson(domainDiff);\n },\n );\n\n return groupedByDomainDiff.entries()\n .map(([domainDiffJson, columnPairs]) => ({\n label: Object.values(parseJson(domainDiffJson)).join(', '),\n value: columnPairs.map(({ markupColumn }) => markupColumn.columnId),\n }))\n .toArray();\n}\n\nasync function getMultipleAlignmentData(\n {\n pFrame,\n sequenceColumnIds,\n labelColumnIds,\n selection,\n colorScheme,\n alignmentParams,\n shouldBuildPhylogeneticTree,\n }: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n labelColumnIds: PTableColumnId[] | undefined;\n selection: PlSelectionModel | undefined;\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n alignmentParams: PlMultiSequenceAlignmentSettings['alignmentParams'];\n shouldBuildPhylogeneticTree: boolean;\n },\n abortSignal: AbortSignal,\n): Promise<MultipleAlignmentData | undefined> {\n if (!pFrame || !sequenceColumnIds?.length || !labelColumnIds) return;\n\n const table = await getTableData({\n pFrame,\n sequenceColumnIds,\n labelColumnIds,\n selection,\n colorScheme,\n });\n\n const rowCount = table.at(0)?.data.data.length ?? 0;\n\n if (rowCount < 2) return;\n\n const exceedsLimit = rowCount > SEQUENCE_LIMIT;\n const rawSequences = extractSequences(sequenceColumnIds, table);\n const labels = extractLabels(labelColumnIds, table);\n const markups = colorScheme.type === 'markup'\n ? extractMarkups(colorScheme.columnIds, table)\n : undefined;\n\n const highlightLegend: HighlightLegend = {};\n\n const alignedSequences = await Promise.all(\n rawSequences.map(async ({ name, rows }) => ({\n name,\n rows: await alignSequences(\n rows,\n JSON.parse(JSON.stringify(alignmentParams)),\n abortSignal,\n ),\n })),\n );\n\n let phylogeneticTree: PhylogeneticTreeWorker.TreeNodeData[] | undefined;\n if (shouldBuildPhylogeneticTree) {\n phylogeneticTree = await buildPhylogeneticTree(\n alignedSequences,\n abortSignal,\n );\n const rowOrder = phylogeneticTree.values()\n .filter(({ id }) => id >= 0)\n .map(({ id }) => id)\n .toArray();\n for (const sequencesColumn of alignedSequences) {\n sequencesColumn.rows = rowOrder.map((i) => sequencesColumn.rows[i]);\n }\n for (const labelsColumn of labels) {\n labelsColumn.rows = rowOrder.map((i) => labelsColumn.rows[i]);\n }\n for (const markupsColumn of markups ?? []) {\n markupsColumn.rows = rowOrder.map((i) => markupsColumn.rows[i]);\n }\n }\n\n const sequences = await Promise.all(\n alignedSequences.map(async ({ name, rows }, index) => {\n const residueCounts = getResidueCounts(rows);\n const image = generateHighlightImage({\n colorScheme,\n sequences: rows,\n residueCounts,\n markup: markups?.at(index),\n });\n if (image) {\n Object.assign(highlightLegend, image.legend);\n }\n return {\n name,\n rows,\n residueCounts,\n ...image && {\n highlightImageUrl: await blobToBase64(image.blob),\n },\n } satisfies MultipleAlignmentData['sequences'][number];\n }),\n );\n\n return {\n sequences,\n labels,\n ...Object.keys(highlightLegend).length && {\n highlightLegend,\n },\n ...phylogeneticTree && {\n phylogeneticTree,\n },\n exceedsLimit,\n };\n}\n\nasync function getTableData(\n { pFrame, sequenceColumnIds, labelColumnIds, selection, colorScheme }: {\n pFrame: PFrameHandle;\n sequenceColumnIds: PObjectId[];\n labelColumnIds: PTableColumnId[];\n selection: PlSelectionModel | undefined;\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n },\n): Promise<CalculateTableDataResponse> {\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const linkerColumns = columns.filter((column) => isLinkerColumn(column.spec));\n\n const filterColumn = createRowSelectionColumn({ selection });\n\n // inner join of sequence columns\n let primaryEntry: JoinEntry<PObjectId> = {\n type: 'inner',\n entries: sequenceColumnIds.map((column) => ({\n type: 'column',\n column,\n })),\n };\n\n // if we have linkers, left join them\n if (linkerColumns.length > 0) {\n primaryEntry = {\n type: 'outer',\n primary: primaryEntry,\n secondary: linkerColumns.map(({ columnId }) => ({\n type: 'column',\n column: columnId,\n })),\n };\n }\n\n // inner join with filters\n if (filterColumn) {\n primaryEntry = {\n type: 'inner',\n entries: [\n primaryEntry,\n {\n type: 'inlineColumn',\n column: filterColumn,\n },\n ],\n };\n }\n\n // left join with labels\n const secondaryEntry: JoinEntry<PObjectId>[] = labelColumnIds\n .flatMap((column) => {\n if (column.type !== 'column') return [];\n return { type: 'column', column: column.id };\n });\n\n // and markup\n if (colorScheme.type === 'markup') {\n for (const column of colorScheme.columnIds) {\n secondaryEntry.push({ type: 'column', column });\n }\n }\n\n const sorting: PTableSorting[] = Array.from(\n new Set(\n sequenceColumnIds.values().flatMap((id) => {\n const column = columns.find(({ columnId }) => columnId === id);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: ${id})`);\n }\n return column.spec.axesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)));\n }),\n ),\n )\n .sort()\n .map((id) => ({\n column: { type: 'axis', id: parseJson(id) },\n ascending: true,\n naAndAbsentAreLeastValues: true,\n }));\n\n const request: CalculateTableDataRequest<PObjectId> = {\n src: {\n type: 'outer',\n primary: primaryEntry,\n secondary: secondaryEntry,\n },\n filters: [],\n sorting,\n };\n\n return pFrameDriver.calculateTableData(\n pFrame,\n JSON.parse(JSON.stringify(request)),\n {\n offset: 0,\n // +1 is a hack to check whether the selection is over the limit\n length: SEQUENCE_LIMIT + 1,\n },\n );\n}\n\nconst extractSequences = (\n columnIds: PObjectId[],\n table: CalculateTableDataResponse,\n): { name: string; rows: string[] }[] =>\n columnIds.map((columnId) => {\n const column = table.find(({ spec }) => spec.id === columnId);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: \\`${columnId}\\`).`);\n }\n const name = readAnnotation(column.spec.spec, Annotation.Label)\n ?? 'Unlabeled column';\n const rows = column.data.data\n .keys()\n .take(SEQUENCE_LIMIT)\n .map((row) =>\n pTableValue(column.data, row, { absent: '', na: '' })?.toString()\n ?? '',\n )\n .toArray();\n return { name, rows };\n });\n\nconst extractLabels = (\n columnIds: PTableColumnId[],\n table: CalculateTableDataResponse,\n): { rows: string[] }[] =>\n columnIds.map((columnId) => {\n const column = table.find(({ spec }) => {\n if (columnId.type === 'axis' && spec.type === 'axis') {\n return isJsonEqual(columnId.id, spec.id);\n }\n if (columnId.type === 'column' && spec.type === 'column') {\n return columnId.id === spec.id;\n }\n });\n if (!column) {\n throw new Error(`Couldn't find label column (ID: \\`${columnId}\\`).`);\n }\n const rows = column.data.data\n .keys()\n .take(SEQUENCE_LIMIT)\n .map((row) =>\n pTableValue(column.data, row, { absent: '', na: '' })?.toString()\n ?? '',\n )\n .toArray();\n return { rows };\n });\n\nconst extractMarkups = (\n columnIds: PObjectId[],\n table: CalculateTableDataResponse,\n): { labels: Record<string, string>; rows: Markup[] }[] =>\n columnIds.map((columnId) => {\n const column = table.find(({ spec }) => spec.id === columnId);\n if (!column) {\n throw new Error(`Couldn't find markup column (ID: \\`${columnId}\\`).`);\n }\n const labels = readAnnotationJson(\n column.spec.spec,\n Annotation.Sequence.Annotation.Mapping,\n ) ?? {};\n const rows = column.data.data\n .keys()\n .take(SEQUENCE_LIMIT)\n .map((row) =>\n parseMarkup(\n pTableValue(column.data, row, { absent: '', na: '' })?.toString()\n ?? '',\n ),\n )\n .toArray();\n return { labels, rows };\n });\n\nconst alignSequences = (() => {\n const cache = new Map<string, string[]>();\n return async (\n sequences: string[],\n alignmentParams: PlMultiSequenceAlignmentSettings['alignmentParams'],\n abortSignal: AbortSignal,\n ): Promise<string[]> => {\n const hash = await objectHash([sequences, alignmentParams]);\n let result = cache.get(hash);\n if (result) return result;\n result = await runInWorker<\n MultiSequenceAlignmentWorker.RequestMessage,\n MultiSequenceAlignmentWorker.ResponseMessage\n >(\n new Worker(\n new URL('./multi-sequence-alignment.worker.ts', import.meta.url),\n { type: 'module' },\n ),\n { sequences, params: alignmentParams },\n abortSignal,\n );\n cache.set(hash, result);\n return result;\n };\n})();\n\nfunction generateHighlightImage(\n { colorScheme, sequences, residueCounts, markup }: {\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n sequences: string[];\n residueCounts: ResidueCounts;\n markup: { labels: Record<string, string>; rows: Markup[] } | undefined;\n },\n): { blob: Blob; legend: HighlightLegend } | undefined {\n if (colorScheme.type === 'chemical-properties') {\n return highlightByChemicalProperties({ sequences, residueCounts });\n }\n if (colorScheme.type === 'markup') {\n if (!markup) {\n throw new Error('Missing markup data.');\n }\n return highlightByMarkup({\n markupRows: sequences.map((sequence, row) => {\n const markupRow = markup.rows.at(row);\n if (!markupRow) throw new Error(`Missing markup for row ${row}.`);\n return markupAlignedSequence(sequence, markupRow);\n }),\n columnCount: sequences.at(0)?.length ?? 0,\n labels: markup.labels,\n });\n }\n}\n\nconst blobToBase64 = (blob: Blob): Promise<string> =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.addEventListener('load', () => resolve(reader.result as string));\n reader.addEventListener('error', () => reject(reader.error));\n reader.readAsDataURL(blob);\n });\n\nconst buildPhylogeneticTree = (() => {\n const cache = new Map<string, PhylogeneticTreeWorker.TreeNodeData[]>();\n return async (data: { rows: string[] }[], abortSignal: AbortSignal) => {\n const concatenatedSequences = data.at(0)?.rows\n .keys()\n .map((row) => data.map((column) => column.rows.at(row) ?? '').join(''))\n .toArray() ?? [];\n const hash = await objectHash(concatenatedSequences);\n let result = cache.get(hash);\n if (result) return result;\n result = await runInWorker<\n PhylogeneticTreeWorker.RequestMessage,\n PhylogeneticTreeWorker.ResponseMessage\n >(\n new Worker(\n new URL('./phylogenetic-tree.worker.ts', import.meta.url),\n { type: 'module' },\n ),\n concatenatedSequences,\n abortSignal,\n );\n cache.set(hash, result);\n return result;\n };\n})();\n\nconst runInWorker = <RequestMessage, ResponseMessage>(\n worker: Worker,\n message: RequestMessage,\n abortSignal: AbortSignal,\n) =>\n new Promise<ResponseMessage>((resolve, reject) => {\n worker.addEventListener('message', ({ data }) => {\n resolve(data);\n worker.terminate();\n });\n worker.addEventListener('error', ({ error, message }) => {\n reject(error ?? message);\n worker.terminate();\n });\n abortSignal.addEventListener('abort', () => {\n reject(abortSignal.reason);\n worker.terminate();\n });\n worker.postMessage(message);\n });\n\nfunction refreshOnDeepChange<T, P>(\n cb: (params: P, abortSignal: AbortSignal) => Promise<T>,\n) {\n const data = ref<T>();\n const isLoading = ref(true);\n const error = ref<Error>();\n let requestId: symbol;\n return (paramsGetter: () => P) => {\n watch(paramsGetter, async (params, prevParams) => {\n if (isJsonEqual(params, prevParams)) return;\n const abortController = new AbortController();\n const currentRequestId = requestId = Symbol();\n onWatcherCleanup(() => {\n abortController.abort();\n });\n try {\n error.value = undefined;\n isLoading.value = true;\n const result = await cb(params, abortController.signal);\n if (currentRequestId === requestId) {\n data.value = result;\n }\n } catch (err) {\n console.error(err);\n if (currentRequestId === requestId) {\n error.value = ensureError(err);\n }\n } finally {\n if (currentRequestId === requestId) {\n isLoading.value = false;\n }\n }\n }, { immediate: true });\n return { data, isLoading, error };\n };\n}\n\ntype MultipleAlignmentData = {\n sequences: {\n name: string;\n rows: string[];\n residueCounts: ResidueCounts;\n highlightImageUrl?: string;\n }[];\n labels: {\n rows: string[];\n }[];\n highlightLegend?: HighlightLegend;\n phylogeneticTree?: PhylogeneticTreeWorker.TreeNodeData[];\n exceedsLimit: boolean;\n};\n\ntype OptionsWithDefaults<T> = {\n options: ListOptionNormalized<T>[];\n defaults: T[];\n};\n"],"names":["getPFrameDriver","getRawPlatformaInstance","SEQUENCE_LIMIT","useSequenceColumnsOptions","refreshOnDeepChange","getSequenceColumnsOptions","useLabelColumnsOptions","getLabelColumnsOptions","useMarkupColumnsOptions","getMarkupColumnsOptions","useMultipleAlignmentData","getMultipleAlignmentData","pFrame","sequenceColumnPredicate","options","column","spec","columnId","readAnnotation","Annotation","defaults","value","sequenceColumnIds","pFrameDriver","columns","sequenceColumnsAxes","id","canonicalizeJson","getAxisId","optionMap","axisIdJson","axisSpec","axisId","parseJson","labelColumn","isLabelColumn","matchAxisId","compatibleColumns","columnIdJson","label","columnPairs","sequenceColumn","readAnnotationJson","isJsonEqual","key","_a","markupColumn","domainDiff","domainDiffJson","labelColumnIds","selection","colorScheme","alignmentParams","shouldBuildPhylogeneticTree","abortSignal","table","getTableData","rowCount","exceedsLimit","rawSequences","extractSequences","labels","extractLabels","markups","extractMarkups","highlightLegend","alignedSequences","name","rows","alignSequences","phylogeneticTree","buildPhylogeneticTree","rowOrder","sequencesColumn","i","labelsColumn","markupsColumn","index","residueCounts","getResidueCounts","image","generateHighlightImage","blobToBase64","linkerColumns","isLinkerColumn","filterColumn","createRowSelectionColumn","primaryEntry","secondaryEntry","sorting","request","columnIds","row","pTableValue","parseMarkup","cache","sequences","hash","objectHash","result","runInWorker","markup","highlightByChemicalProperties","highlightByMarkup","sequence","markupRow","markupAlignedSequence","blob","resolve","reject","reader","data","concatenatedSequences","worker","message","error","cb","ref","isLoading","requestId","paramsGetter","watch","params","prevParams","abortController","currentRequestId","onWatcherCleanup","err","ensureError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data.js","sources":["../src/data.ts"],"sourcesContent":["import type {\n CalculateTableDataRequest,\n CalculateTableDataResponse,\n CanonicalizedJson,\n JoinEntry,\n PColumnPredicate,\n PFrameHandle,\n PlMultiSequenceAlignmentColorSchemeOption,\n PlMultiSequenceAlignmentSettings,\n PlSelectionModel,\n PObjectId,\n PTableColumnId,\n PTableSorting,\n} from '@platforma-sdk/model';\nimport type { ListOptionNormalized } from '@platforma-sdk/ui-vue';\nimport type { Markup } from './markup';\nimport type * as MultiSequenceAlignmentWorker from './multi-sequence-alignment.worker';\nimport type * as PhylogeneticTreeWorker from './phylogenetic-tree.worker';\nimport type { HighlightLegend, ResidueCounts } from './types';\n\nimport { isJsonEqual } from '@milaboratories/helpers';\nimport {\n Annotation,\n canonicalizeJson,\n createRowSelectionColumn,\n ensureError,\n getAxisId,\n getRawPlatformaInstance,\n isLabelColumn,\n isLinkerColumn,\n matchAxisId,\n parseJson,\n pTableValue,\n readAnnotation,\n readAnnotationJson,\n} from '@platforma-sdk/model';\nimport { objectHash } from '@platforma-sdk/ui-vue';\nimport { onWatcherCleanup, ref, watch } from 'vue';\nimport { highlightByChemicalProperties } from './chemical-properties';\nimport {\n highlightByMarkup,\n markupAlignedSequence,\n parseMarkup,\n} from './markup';\nimport { getResidueCounts } from './residue-counts';\n\nconst getPFrameDriver = () => getRawPlatformaInstance().pFrameDriver;\n\nexport const SEQUENCE_LIMIT = 1000;\n\nexport const useSequenceColumnsOptions = refreshOnDeepChange(\n getSequenceColumnsOptions,\n);\n\nexport const useLabelColumnsOptions = refreshOnDeepChange(\n getLabelColumnsOptions,\n);\n\nexport const useMarkupColumnsOptions = refreshOnDeepChange(\n getMarkupColumnsOptions,\n);\n\nexport const useMultipleAlignmentData = refreshOnDeepChange(\n getMultipleAlignmentData,\n);\n\nasync function getSequenceColumnsOptions({ pFrame, sequenceColumnPredicate }: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnPredicate: PColumnPredicate;\n}): Promise<OptionsWithDefaults<PObjectId> | undefined> {\n if (!pFrame) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n\n const result: OptionsWithDefaults<PObjectId> = { options: [], defaults: [] };\n\n for (const column of columns) {\n const match = sequenceColumnPredicate(column);\n if (!match) continue;\n const { columnId, spec } = column;\n if (match === true || match.default) {\n result.defaults.push(columnId);\n }\n result.options.push({\n label: readAnnotation(spec, Annotation.Label) ?? 'Unlabeled column',\n value: columnId,\n });\n }\n\n return result;\n}\n\nasync function getLabelColumnsOptions({ pFrame, sequenceColumnIds }: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<OptionsWithDefaults<PTableColumnId> | undefined> {\n if (!pFrame || !sequenceColumnIds) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n\n const sequenceColumnsAxes = new Map(\n sequenceColumnIds.values().flatMap((id) => {\n const column = columns.find(({ columnId }) => columnId === id);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: \\`${id}\\`).`);\n }\n return column.spec.axesSpec.values()\n .map((spec) => [canonicalizeJson(getAxisId(spec)), spec]);\n }),\n );\n\n const optionMap = new Map<CanonicalizedJson<PTableColumnId>, string>();\n for (const [axisIdJson, axisSpec] of sequenceColumnsAxes.entries()) {\n const axisId = parseJson(axisIdJson);\n const labelColumn = columns.find(({ spec }) =>\n isLabelColumn(spec) && matchAxisId(axisId, getAxisId(spec.axesSpec[0])),\n );\n optionMap.set(\n labelColumn\n ? canonicalizeJson({ type: 'column', id: labelColumn.columnId })\n : canonicalizeJson({ type: 'axis', id: axisId }),\n readAnnotation(labelColumn?.spec, Annotation.Label)\n ?? readAnnotation(axisSpec, Annotation.Label)\n ?? 'Unlabeled axis',\n );\n }\n\n const { hits: compatibleColumns } = await pFrameDriver.findColumns(pFrame, {\n columnFilter: {},\n compatibleWith: sequenceColumnsAxes.keys()\n .map((axisIdJson) => parseJson(axisIdJson))\n .toArray(),\n strictlyCompatible: false,\n });\n\n for (const { columnId, spec } of compatibleColumns) {\n const columnIdJson = canonicalizeJson<PTableColumnId>({\n type: 'column',\n id: columnId,\n });\n if (optionMap.has(columnIdJson)) continue;\n optionMap.set(\n columnIdJson,\n readAnnotation(spec, Annotation.Label) ?? 'Unlabeled column',\n );\n }\n\n const options = optionMap.entries()\n .map(([value, label]) => ({ label, value: parseJson(value) }))\n .toArray();\n\n const defaults = options.values()\n .filter(({ value }) => {\n if (value.type === 'axis') return true;\n const column = columns.find(({ columnId }) => columnId === value.id);\n return column && isLabelColumn(column.spec);\n })\n .map(({ value }) => value)\n .toArray();\n\n return { options, defaults };\n}\n\nasync function getMarkupColumnsOptions({ pFrame, sequenceColumnIds }: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<ListOptionNormalized<PObjectId[]>[] | undefined> {\n if (!pFrame || !sequenceColumnIds) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n\n const sequenceColumns = sequenceColumnIds.map((columnId) => {\n const column = columns.find((column) => column.columnId === columnId);\n if (!column) {\n throw new Error(\n `Couldn't find sequence column (ID: \\`${sequenceColumnIds[0]}\\`).`,\n );\n }\n return column;\n });\n\n const columnPairs = sequenceColumns\n .flatMap((sequenceColumn) =>\n columns\n .filter((column) =>\n readAnnotationJson(column.spec, Annotation.Sequence.IsAnnotation)\n && isJsonEqual(sequenceColumn.spec.axesSpec, column.spec.axesSpec)\n && Object.entries(sequenceColumn.spec.domain ?? {})\n .every(([key, value]) => column.spec.domain?.[key] === value),\n )\n .map((markupColumn) => ({ markupColumn, sequenceColumn })),\n );\n\n const groupedByDomainDiff = Map.groupBy(\n columnPairs,\n ({ markupColumn, sequenceColumn }) => {\n const domainDiff = Object.fromEntries(\n Object.entries(markupColumn.spec.domain ?? {})\n .filter(([key]) => sequenceColumn.spec.domain?.[key] == undefined),\n );\n return canonicalizeJson(domainDiff);\n },\n );\n\n return groupedByDomainDiff.entries()\n .map(([domainDiffJson, columnPairs]) => ({\n label: Object.values(parseJson(domainDiffJson)).join(', '),\n value: columnPairs.map(({ markupColumn }) => markupColumn.columnId),\n }))\n .toArray();\n}\n\nasync function getMultipleAlignmentData(\n {\n pFrame,\n sequenceColumnIds,\n labelColumnIds,\n selection,\n colorScheme,\n alignmentParams,\n shouldBuildPhylogeneticTree,\n }: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n labelColumnIds: PTableColumnId[] | undefined;\n selection: PlSelectionModel | undefined;\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n alignmentParams: PlMultiSequenceAlignmentSettings['alignmentParams'];\n shouldBuildPhylogeneticTree: boolean;\n },\n abortSignal: AbortSignal,\n): Promise<MultipleAlignmentData | undefined> {\n if (!pFrame || !sequenceColumnIds?.length || !labelColumnIds) return;\n\n const table = await getTableData({\n pFrame,\n sequenceColumnIds,\n labelColumnIds,\n selection,\n colorScheme,\n });\n\n const rowCount = table.at(0)?.data.data.length ?? 0;\n\n if (rowCount < 2) return;\n\n const exceedsLimit = rowCount > SEQUENCE_LIMIT;\n const rawSequences = extractSequences(sequenceColumnIds, table);\n const labels = extractLabels(labelColumnIds, table);\n const markups = colorScheme.type === 'markup'\n ? extractMarkups(colorScheme.columnIds, table)\n : undefined;\n\n const highlightLegend: HighlightLegend = {};\n\n const alignedSequences = await Promise.all(\n rawSequences.map(async ({ name, rows }) => ({\n name,\n rows: await alignSequences(\n rows,\n JSON.parse(JSON.stringify(alignmentParams)),\n abortSignal,\n ),\n })),\n );\n\n let phylogeneticTree: PhylogeneticTreeWorker.TreeNodeData[] | undefined;\n if (shouldBuildPhylogeneticTree) {\n phylogeneticTree = await buildPhylogeneticTree(\n alignedSequences,\n abortSignal,\n );\n const rowOrder = phylogeneticTree.values()\n .filter(({ id }) => id >= 0)\n .map(({ id }) => id)\n .toArray();\n for (const sequencesColumn of alignedSequences) {\n sequencesColumn.rows = rowOrder.map((i) => sequencesColumn.rows[i]);\n }\n for (const labelsColumn of labels) {\n labelsColumn.rows = rowOrder.map((i) => labelsColumn.rows[i]);\n }\n for (const markupsColumn of markups ?? []) {\n markupsColumn.rows = rowOrder.map((i) => markupsColumn.rows[i]);\n }\n }\n\n const sequences = await Promise.all(\n alignedSequences.map(async ({ name, rows }, index) => {\n const residueCounts = getResidueCounts(rows);\n const image = generateHighlightImage({\n colorScheme,\n sequences: rows,\n residueCounts,\n markup: markups?.at(index),\n });\n if (image) {\n Object.assign(highlightLegend, image.legend);\n }\n return {\n name,\n rows,\n residueCounts,\n ...image && {\n highlightImageUrl: await blobToBase64(image.blob),\n },\n } satisfies MultipleAlignmentData['sequences'][number];\n }),\n );\n\n return {\n sequences,\n labels,\n ...Object.keys(highlightLegend).length && {\n highlightLegend,\n },\n ...phylogeneticTree && {\n phylogeneticTree,\n },\n exceedsLimit,\n };\n}\n\nasync function getTableData(\n { pFrame, sequenceColumnIds, labelColumnIds, selection, colorScheme }: {\n pFrame: PFrameHandle;\n sequenceColumnIds: PObjectId[];\n labelColumnIds: PTableColumnId[];\n selection: PlSelectionModel | undefined;\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n },\n): Promise<CalculateTableDataResponse> {\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const linkerColumns = columns.filter((column) => isLinkerColumn(column.spec));\n\n const filterColumn = createRowSelectionColumn({ selection });\n\n // inner join of sequence columns\n let primaryEntry: JoinEntry<PObjectId> = {\n type: 'inner',\n entries: sequenceColumnIds.map((column) => ({\n type: 'column',\n column,\n })),\n };\n\n // if we have linkers, left join them\n if (linkerColumns.length > 0) {\n primaryEntry = {\n type: 'outer',\n primary: primaryEntry,\n secondary: linkerColumns.map(({ columnId }) => ({\n type: 'column',\n column: columnId,\n })),\n };\n }\n\n // inner join with filters\n if (filterColumn) {\n primaryEntry = {\n type: 'inner',\n entries: [\n primaryEntry,\n {\n type: 'inlineColumn',\n column: filterColumn,\n },\n ],\n };\n }\n\n // left join with labels\n const secondaryEntry: JoinEntry<PObjectId>[] = labelColumnIds\n .flatMap((column) => {\n if (column.type !== 'column') return [];\n return { type: 'column', column: column.id };\n });\n\n // and markup\n if (colorScheme.type === 'markup') {\n for (const column of colorScheme.columnIds) {\n secondaryEntry.push({ type: 'column', column });\n }\n }\n\n const sorting: PTableSorting[] = Array.from(\n new Set(\n sequenceColumnIds.values().flatMap((id) => {\n const column = columns.find(({ columnId }) => columnId === id);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: ${id})`);\n }\n return column.spec.axesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)));\n }),\n ),\n )\n .sort()\n .map((id) => ({\n column: { type: 'axis', id: parseJson(id) },\n ascending: true,\n naAndAbsentAreLeastValues: true,\n }));\n\n const request: CalculateTableDataRequest<PObjectId> = {\n src: {\n type: 'outer',\n primary: primaryEntry,\n secondary: secondaryEntry,\n },\n filters: [],\n sorting,\n };\n\n return pFrameDriver.calculateTableData(\n pFrame,\n JSON.parse(JSON.stringify(request)),\n {\n offset: 0,\n // +1 is a hack to check whether the selection is over the limit\n length: SEQUENCE_LIMIT + 1,\n },\n );\n}\n\nconst extractSequences = (\n columnIds: PObjectId[],\n table: CalculateTableDataResponse,\n): { name: string; rows: string[] }[] =>\n columnIds.map((columnId) => {\n const column = table.find(({ spec }) => spec.id === columnId);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: \\`${columnId}\\`).`);\n }\n const name = readAnnotation(column.spec.spec, Annotation.Label)\n ?? 'Unlabeled column';\n const rows = column.data.data\n .keys()\n .take(SEQUENCE_LIMIT)\n .map((row) =>\n pTableValue(column.data, row, { absent: '', na: '' })?.toString()\n ?? '',\n )\n .toArray();\n return { name, rows };\n });\n\nconst extractLabels = (\n columnIds: PTableColumnId[],\n table: CalculateTableDataResponse,\n): { rows: string[] }[] =>\n columnIds.map((columnId) => {\n const column = table.find(({ spec }) => {\n if (columnId.type === 'axis' && spec.type === 'axis') {\n return isJsonEqual(columnId.id, spec.id);\n }\n if (columnId.type === 'column' && spec.type === 'column') {\n return columnId.id === spec.id;\n }\n });\n if (!column) {\n throw new Error(`Couldn't find label column (ID: \\`${columnId}\\`).`);\n }\n const rows = column.data.data\n .keys()\n .take(SEQUENCE_LIMIT)\n .map((row) =>\n pTableValue(column.data, row, { absent: '', na: '' })?.toString()\n ?? '',\n )\n .toArray();\n return { rows };\n });\n\nconst extractMarkups = (\n columnIds: PObjectId[],\n table: CalculateTableDataResponse,\n): { labels: Record<string, string>; rows: Markup[] }[] =>\n columnIds.map((columnId) => {\n const column = table.find(({ spec }) => spec.id === columnId);\n if (!column) {\n throw new Error(`Couldn't find markup column (ID: \\`${columnId}\\`).`);\n }\n const labels = readAnnotationJson(\n column.spec.spec,\n Annotation.Sequence.Annotation.Mapping,\n ) ?? {};\n const rows = column.data.data\n .keys()\n .take(SEQUENCE_LIMIT)\n .map((row) =>\n parseMarkup(\n pTableValue(column.data, row, { absent: '', na: '' })?.toString()\n ?? '',\n ),\n )\n .toArray();\n return { labels, rows };\n });\n\nconst alignSequences = (() => {\n const cache = new Map<string, string[]>();\n return async (\n sequences: string[],\n alignmentParams: PlMultiSequenceAlignmentSettings['alignmentParams'],\n abortSignal: AbortSignal,\n ): Promise<string[]> => {\n const hash = await objectHash([sequences, alignmentParams]);\n let result = cache.get(hash);\n if (result) return result;\n result = await runInWorker<\n MultiSequenceAlignmentWorker.RequestMessage,\n MultiSequenceAlignmentWorker.ResponseMessage\n >(\n new Worker(\n new URL('./multi-sequence-alignment.worker.ts', import.meta.url),\n { type: 'module' },\n ),\n { sequences, params: alignmentParams },\n abortSignal,\n );\n cache.set(hash, result);\n return result;\n };\n})();\n\nfunction generateHighlightImage(\n { colorScheme, sequences, residueCounts, markup }: {\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n sequences: string[];\n residueCounts: ResidueCounts;\n markup: { labels: Record<string, string>; rows: Markup[] } | undefined;\n },\n): { blob: Blob; legend: HighlightLegend } | undefined {\n if (colorScheme.type === 'chemical-properties') {\n return highlightByChemicalProperties({ sequences, residueCounts });\n }\n if (colorScheme.type === 'markup') {\n if (!markup) {\n throw new Error('Missing markup data.');\n }\n return highlightByMarkup({\n markupRows: sequences.map((sequence, row) => {\n const markupRow = markup.rows.at(row);\n if (!markupRow) throw new Error(`Missing markup for row ${row}.`);\n return markupAlignedSequence(sequence, markupRow);\n }),\n columnCount: sequences.at(0)?.length ?? 0,\n labels: markup.labels,\n });\n }\n}\n\nconst blobToBase64 = (blob: Blob): Promise<string> =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.addEventListener('load', () => resolve(reader.result as string));\n reader.addEventListener('error', () => reject(reader.error));\n reader.readAsDataURL(blob);\n });\n\nconst buildPhylogeneticTree = (() => {\n const cache = new Map<string, PhylogeneticTreeWorker.TreeNodeData[]>();\n return async (data: { rows: string[] }[], abortSignal: AbortSignal) => {\n const concatenatedSequences = data.at(0)?.rows\n .keys()\n .map((row) => data.map((column) => column.rows.at(row) ?? '').join(''))\n .toArray() ?? [];\n const hash = await objectHash(concatenatedSequences);\n let result = cache.get(hash);\n if (result) return result;\n result = await runInWorker<\n PhylogeneticTreeWorker.RequestMessage,\n PhylogeneticTreeWorker.ResponseMessage\n >(\n new Worker(\n new URL('./phylogenetic-tree.worker.ts', import.meta.url),\n { type: 'module' },\n ),\n concatenatedSequences,\n abortSignal,\n );\n cache.set(hash, result);\n return result;\n };\n})();\n\nconst runInWorker = <RequestMessage, ResponseMessage>(\n worker: Worker,\n message: RequestMessage,\n abortSignal: AbortSignal,\n) =>\n new Promise<ResponseMessage>((resolve, reject) => {\n worker.addEventListener('message', ({ data }) => {\n resolve(data);\n worker.terminate();\n });\n worker.addEventListener('error', ({ error, message }) => {\n reject(error ?? message);\n worker.terminate();\n });\n abortSignal.addEventListener('abort', () => {\n reject(abortSignal.reason);\n worker.terminate();\n });\n worker.postMessage(message);\n });\n\nfunction refreshOnDeepChange<T, P>(\n cb: (params: P, abortSignal: AbortSignal) => Promise<T>,\n) {\n const data = ref<T>();\n const isLoading = ref(true);\n const error = ref<Error>();\n let requestId: symbol;\n return (paramsGetter: () => P) => {\n watch(paramsGetter, async (params, prevParams) => {\n if (isJsonEqual(params, prevParams)) return;\n const abortController = new AbortController();\n const currentRequestId = requestId = Symbol();\n onWatcherCleanup(() => {\n abortController.abort();\n });\n try {\n error.value = undefined;\n isLoading.value = true;\n const result = await cb(params, abortController.signal);\n if (currentRequestId === requestId) {\n data.value = result;\n }\n } catch (err) {\n console.error(err);\n if (currentRequestId === requestId) {\n error.value = ensureError(err);\n }\n } finally {\n if (currentRequestId === requestId) {\n isLoading.value = false;\n }\n }\n }, { immediate: true });\n return { data, isLoading, error };\n };\n}\n\ntype MultipleAlignmentData = {\n sequences: {\n name: string;\n rows: string[];\n residueCounts: ResidueCounts;\n highlightImageUrl?: string;\n }[];\n labels: {\n rows: string[];\n }[];\n highlightLegend?: HighlightLegend;\n phylogeneticTree?: PhylogeneticTreeWorker.TreeNodeData[];\n exceedsLimit: boolean;\n};\n\ntype OptionsWithDefaults<T> = {\n options: ListOptionNormalized<T>[];\n defaults: T[];\n};\n"],"names":["getPFrameDriver","getRawPlatformaInstance","SEQUENCE_LIMIT","useSequenceColumnsOptions","refreshOnDeepChange","getSequenceColumnsOptions","useLabelColumnsOptions","getLabelColumnsOptions","useMarkupColumnsOptions","getMarkupColumnsOptions","useMultipleAlignmentData","getMultipleAlignmentData","pFrame","sequenceColumnPredicate","columns","result","column","match","columnId","spec","readAnnotation","Annotation","sequenceColumnIds","pFrameDriver","sequenceColumnsAxes","id","canonicalizeJson","getAxisId","optionMap","axisIdJson","axisSpec","axisId","parseJson","labelColumn","isLabelColumn","matchAxisId","compatibleColumns","columnIdJson","options","value","label","defaults","columnPairs","sequenceColumn","readAnnotationJson","isJsonEqual","key","_a","markupColumn","domainDiff","domainDiffJson","labelColumnIds","selection","colorScheme","alignmentParams","shouldBuildPhylogeneticTree","abortSignal","table","getTableData","rowCount","exceedsLimit","rawSequences","extractSequences","labels","extractLabels","markups","extractMarkups","highlightLegend","alignedSequences","name","rows","alignSequences","phylogeneticTree","buildPhylogeneticTree","rowOrder","sequencesColumn","i","labelsColumn","markupsColumn","index","residueCounts","getResidueCounts","image","generateHighlightImage","blobToBase64","linkerColumns","isLinkerColumn","filterColumn","createRowSelectionColumn","primaryEntry","secondaryEntry","sorting","request","columnIds","row","pTableValue","parseMarkup","cache","sequences","hash","objectHash","runInWorker","markup","highlightByChemicalProperties","highlightByMarkup","sequence","markupRow","markupAlignedSequence","blob","resolve","reject","reader","data","concatenatedSequences","worker","message","error","cb","ref","isLoading","requestId","paramsGetter","watch","params","prevParams","abortController","currentRequestId","onWatcherCleanup","err","ensureError"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._container_1vnon_2{display:flex;flex-direction:column;gap:4px}._container_1vnon_2 svg{display:block}._container_5klj5_2{display:flex;flex-wrap:wrap;gap:12px;max-inline-size:fit-content}._item_5klj5_9{display:flex;gap:4px}._colorSample_5klj5_14{display:inline-block;block-size:18px;inline-size:18px;border-radius:3px}._container_1uo2b_2 svg{display:block}._root_34869_2{display:flex;flex-direction:column;gap:12px;min-block-size:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;container-type:inline-size}._root_34869_2[data-pre-print]{container-type:unset}._root_34869_2[data-pre-print] ._sidebar_34869_14{max-inline-size:unset}._referenceCell_34869_20{position:fixed;visibility:hidden;font-family:Spline Sans Mono;font-weight:600;line-height:var(--v16792884)}._table_34869_28{display:grid;grid-template-columns:[sidebar-start] auto [sidebar-end] repeat(var(--v5f937812),[column-start] auto [column-end]);grid-template-rows:[header-start] auto [header-end] repeat(var(--v832f3168),[row-start] auto [row-end]);justify-content:start;position:relative}@media print{._table_34869_28{overflow:visible}}._sidebar_34869_14{grid-column:sidebar;grid-row:1 row-start / -1 row-end;display:grid;grid-template-rows:subgrid;position:sticky;inset-inline-start:0;background-color:#fff;inline-size:min-content;max-inline-size:30cqi;overflow:scroll;overscroll-behavior-inline:none;scrollbar-width:none}._phylogeneticTree_34869_60{grid-row:1 row-start / -1 row-end}._labels_34869_64{grid-row:1 row-start / -1 row-end;display:grid;grid-template-columns:repeat(var(--v71429b60),auto);grid-template-rows:subgrid;grid-auto-flow:column;column-gap:12px;padding-inline-end:12px;font-family:Spline Sans Mono;line-height:var(--v16792884);white-space:nowrap}._sequenceColumn_34869_77{grid-row:header-start / -1 row-end;display:grid;grid-template-rows:subgrid}._sequenceColumn_34869_77+._sequenceColumn_34869_77{margin-inline-start:24px}._sequenceHeader_34869_86{grid-row:header;display:flex;flex-direction:column;justify-content:end;min-inline-size:0;position:sticky;inset-block-start:0;background-color:#fff}._sequenceName_34869_97{margin-block-end:4px;font-weight:700;line-height:20px;inline-size:fit-content;position:sticky;inset-inline-start:var(--v49944722)}._sequenceRowsContainer_34869_106{grid-row:1 row-start / -1 row-end;display:grid;grid-template-rows:subgrid}._sequenceRow_34869_106{font-family:Spline Sans Mono;font-weight:600;line-height:var(--v16792884);letter-spacing:var(--v622f88b4);text-indent:calc(var(--v622f88b4) / 2);inline-size:calc-size(min-content,round(down,size,var(--c9eaa2b8)));white-space:nowrap}._corner_34869_125{grid-column:sidebar;grid-row:header;position:sticky;inset-inline-start:0;inset-block-start:0;background-color:#fff}._container_ypn45_2{display:flex;flex-direction:column;gap:24px}._line_ypn45_8{display:flex;justify-content:space-between}._section_ypn45_13{display:flex;flex-wrap:wrap;gap:24px}._buttons_ypn45_19,._pendingChanges_ypn45_23{display:flex}._pendingChanges_ypn45_23 button{min-width:160px}._resetButton_ypn45_30{margin-block-start:auto}._resetButton_ypn45_30 span{text-transform:none}._splash_dk8xp_2{flex:1;display:flex;flex-direction:column;gap:12px;overflow:hidden}")),document.head.appendChild(e)}}catch(n){console.error("vite-plugin-css-injected-by-js",n)}})();
|
|
1
2
|
import { default as t } from "./PlMultiSequenceAlignment.vue.js";
|
|
2
3
|
export {
|
|
3
4
|
t as PlMultiSequenceAlignment
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@milaboratories/multi-sequence-alignment",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.46.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"styles": "dist/index.js",
|
|
@@ -14,13 +14,13 @@
|
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"@milaboratories/biowasm-tools": "^2.0.0",
|
|
16
16
|
"vue": "^3.5.24",
|
|
17
|
-
"@milaboratories/miplots4": "1.0.
|
|
17
|
+
"@milaboratories/miplots4": "1.0.167"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"@milaboratories/ts-configs": "^1.2.0",
|
|
21
21
|
"@milaboratories/build-configs": "^1.0.5",
|
|
22
22
|
"@milaboratories/helpers": "^1.13.0",
|
|
23
|
-
"@milaboratories/ts-builder": "^1.2.
|
|
23
|
+
"@milaboratories/ts-builder": "^1.2.4",
|
|
24
24
|
"@milaboratories/eslint-config": "^1.0.5",
|
|
25
25
|
"@types/node": "^22.19.1",
|
|
26
26
|
"@vitejs/plugin-vue": "^6.0.2",
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
"vitest": "^4.0.14"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
|
-
"@platforma-sdk/model": "^1.
|
|
34
|
-
"@platforma-sdk/ui-vue": "^1.
|
|
33
|
+
"@platforma-sdk/model": "^1.53.0",
|
|
34
|
+
"@platforma-sdk/ui-vue": "^1.53.0"
|
|
35
35
|
},
|
|
36
36
|
"scripts": {
|
|
37
37
|
"test": "vitest run --passWithNoTests",
|
package/src/data.ts
CHANGED
|
@@ -1,10 +1,26 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type {
|
|
2
|
+
CalculateTableDataRequest,
|
|
3
|
+
CalculateTableDataResponse,
|
|
4
|
+
CanonicalizedJson,
|
|
5
|
+
JoinEntry,
|
|
6
|
+
PColumnPredicate,
|
|
7
|
+
PFrameHandle,
|
|
8
|
+
PlMultiSequenceAlignmentColorSchemeOption,
|
|
9
|
+
PlMultiSequenceAlignmentSettings,
|
|
10
|
+
PlSelectionModel,
|
|
11
|
+
PObjectId,
|
|
12
|
+
PTableColumnId,
|
|
13
|
+
PTableSorting,
|
|
14
|
+
} from '@platforma-sdk/model';
|
|
2
15
|
import type { ListOptionNormalized } from '@platforma-sdk/ui-vue';
|
|
16
|
+
import type { Markup } from './markup';
|
|
17
|
+
import type * as MultiSequenceAlignmentWorker from './multi-sequence-alignment.worker';
|
|
18
|
+
import type * as PhylogeneticTreeWorker from './phylogenetic-tree.worker';
|
|
19
|
+
import type { HighlightLegend, ResidueCounts } from './types';
|
|
20
|
+
|
|
21
|
+
import { isJsonEqual } from '@milaboratories/helpers';
|
|
3
22
|
import {
|
|
4
23
|
Annotation,
|
|
5
|
-
type CalculateTableDataRequest,
|
|
6
|
-
type CalculateTableDataResponse,
|
|
7
|
-
type CanonicalizedJson,
|
|
8
24
|
canonicalizeJson,
|
|
9
25
|
createRowSelectionColumn,
|
|
10
26
|
ensureError,
|
|
@@ -12,34 +28,21 @@ import {
|
|
|
12
28
|
getRawPlatformaInstance,
|
|
13
29
|
isLabelColumn,
|
|
14
30
|
isLinkerColumn,
|
|
15
|
-
type JoinEntry,
|
|
16
31
|
matchAxisId,
|
|
17
32
|
parseJson,
|
|
18
|
-
type PColumnIdAndSpec,
|
|
19
|
-
type PFrameHandle,
|
|
20
|
-
type PlMultiSequenceAlignmentColorSchemeOption,
|
|
21
|
-
type PlMultiSequenceAlignmentSettings,
|
|
22
|
-
type PlSelectionModel,
|
|
23
|
-
type PObjectId,
|
|
24
|
-
type PTableColumnId,
|
|
25
|
-
type PTableSorting,
|
|
26
33
|
pTableValue,
|
|
27
34
|
readAnnotation,
|
|
28
35
|
readAnnotationJson,
|
|
29
36
|
} from '@platforma-sdk/model';
|
|
30
|
-
import { onWatcherCleanup, ref, watch } from 'vue';
|
|
31
37
|
import { objectHash } from '@platforma-sdk/ui-vue';
|
|
38
|
+
import { onWatcherCleanup, ref, watch } from 'vue';
|
|
32
39
|
import { highlightByChemicalProperties } from './chemical-properties';
|
|
33
|
-
import type { Markup } from './markup';
|
|
34
40
|
import {
|
|
35
41
|
highlightByMarkup,
|
|
36
42
|
markupAlignedSequence,
|
|
37
43
|
parseMarkup,
|
|
38
44
|
} from './markup';
|
|
39
|
-
import type * as MultiSequenceAlignmentWorker from './multi-sequence-alignment.worker';
|
|
40
|
-
import type * as PhylogeneticTreeWorker from './phylogenetic-tree.worker';
|
|
41
45
|
import { getResidueCounts } from './residue-counts';
|
|
42
|
-
import type { HighlightLegend, ResidueCounts } from './types';
|
|
43
46
|
|
|
44
47
|
const getPFrameDriver = () => getRawPlatformaInstance().pFrameDriver;
|
|
45
48
|
|
|
@@ -63,24 +66,29 @@ export const useMultipleAlignmentData = refreshOnDeepChange(
|
|
|
63
66
|
|
|
64
67
|
async function getSequenceColumnsOptions({ pFrame, sequenceColumnPredicate }: {
|
|
65
68
|
pFrame: PFrameHandle | undefined;
|
|
66
|
-
sequenceColumnPredicate:
|
|
69
|
+
sequenceColumnPredicate: PColumnPredicate;
|
|
67
70
|
}): Promise<OptionsWithDefaults<PObjectId> | undefined> {
|
|
68
71
|
if (!pFrame) return;
|
|
69
72
|
|
|
70
73
|
const pFrameDriver = getPFrameDriver();
|
|
71
74
|
const columns = await pFrameDriver.listColumns(pFrame);
|
|
72
75
|
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
+
const result: OptionsWithDefaults<PObjectId> = { options: [], defaults: [] };
|
|
77
|
+
|
|
78
|
+
for (const column of columns) {
|
|
79
|
+
const match = sequenceColumnPredicate(column);
|
|
80
|
+
if (!match) continue;
|
|
81
|
+
const { columnId, spec } = column;
|
|
82
|
+
if (match === true || match.default) {
|
|
83
|
+
result.defaults.push(columnId);
|
|
84
|
+
}
|
|
85
|
+
result.options.push({
|
|
76
86
|
label: readAnnotation(spec, Annotation.Label) ?? 'Unlabeled column',
|
|
77
87
|
value: columnId,
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
const defaults = options.map(({ value }) => value);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
82
90
|
|
|
83
|
-
return
|
|
91
|
+
return result;
|
|
84
92
|
}
|
|
85
93
|
|
|
86
94
|
async function getLabelColumnsOptions({ pFrame, sequenceColumnIds }: {
|