@milaboratories/multi-sequence-alignment 1.45.11 → 1.46.1

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.
@@ -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.45.11 build /home/runner/work/visualizations/visualizations/packages/multi-sequence-alignment
3
+ > @milaboratories/multi-sequence-alignment@1.46.1 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.1_@microsoft+api-extractor@7.53.2_@types+node@22.19.1__@types+_vg7sqmsz7xm3b2gtogowj7toii/node_modules/@milaboratories/ts-builder/dist/configs/vite.browser-lib.config.js --mode production
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
  vite v6.4.1 building for production...
9
9
  transforming...
10
10
  ✓ 45 modules transformed.
@@ -26,9 +26,13 @@ computing gzip size...
26
26
  dist/assets/multi-sequence-alignment.worker-Cm0gZp19.js 222.50 kB
27
27
  dist/assets/phylogenetic-tree.worker-4CrExYEo.js 465.75 kB
28
28
  dist/cell-size.js  0.11 kB │ gzip: 0.12 kB │ map: 0.24 kB
29
- dist/index.js  0.14 kB │ gzip: 0.13 kB │ map: 0.09 kB
29
+ dist/SeqLogo.vue3.js  0.14 kB │ gzip: 0.14 kB │ map: 0.10 kB
30
+ dist/Consensus.vue3.js  0.14 kB │ gzip: 0.14 kB │ map: 0.10 kB
31
+ dist/PlMultiSequenceAlignment.vue3.js  0.15 kB │ gzip: 0.15 kB │ map: 0.12 kB
32
+ dist/PhylogeneticTree.vue3.js  0.15 kB │ gzip: 0.14 kB │ map: 0.11 kB
30
33
  dist/_virtual/_plugin-vue_export-helper.js  0.19 kB │ gzip: 0.17 kB │ map: 0.12 kB
31
34
  dist/settings.js  0.23 kB │ gzip: 0.20 kB │ map: 0.58 kB
35
+ dist/Legend.vue3.js  0.25 kB │ gzip: 0.18 kB │ map: 0.10 kB
32
36
  dist/Legend.vue.js  0.27 kB │ gzip: 0.21 kB │ map: 0.10 kB
33
37
  dist/residue-counts.js  0.27 kB │ gzip: 0.20 kB │ map: 4.40 kB
34
38
  dist/Toolbar.vue.js  0.27 kB │ gzip: 0.21 kB │ map: 0.10 kB
@@ -37,27 +41,23 @@ computing gzip size...
37
41
  dist/PhylogeneticTree.vue.js  0.30 kB │ gzip: 0.22 kB │ map: 0.11 kB
38
42
  dist/PlMultiSequenceAlignment.vue.js  0.32 kB │ gzip: 0.22 kB │ map: 0.12 kB
39
43
  dist/MultiSequenceAlignmentView.vue.js  0.33 kB │ gzip: 0.22 kB │ map: 0.12 kB
40
- dist/SeqLogo.vue3.js  0.41 kB │ gzip: 0.29 kB │ map: 0.10 kB
41
- dist/PhylogeneticTree.vue3.js  0.42 kB │ gzip: 0.30 kB │ map: 0.11 kB
42
- dist/PlMultiSequenceAlignment.vue3.js  0.46 kB │ gzip: 0.33 kB │ map: 0.12 kB
44
+ dist/Toolbar.vue3.js  0.44 kB │ gzip: 0.25 kB │ map: 0.10 kB
43
45
  dist/useMiPlots.js  0.47 kB │ gzip: 0.30 kB │ map: 1.09 kB
44
- dist/Consensus.vue3.js  0.47 kB │ gzip: 0.32 kB │ map: 0.10 kB
45
46
  dist/migrations.js  0.62 kB │ gzip: 0.37 kB │ map: 2.15 kB
46
- dist/Legend.vue3.js  0.70 kB │ gzip: 0.42 kB │ map: 0.10 kB
47
47
  dist/Legend.vue2.js  0.85 kB │ gzip: 0.49 kB │ map: 1.53 kB
48
48
  dist/node_modules/.pnpm/@milaboratories_helpers@1.13.0/node_modules/@milaboratories/helpers/dist/objects.js  0.89 kB │ gzip: 0.44 kB │ map: 9.12 kB
49
- dist/Toolbar.vue3.js  1.05 kB │ gzip: 0.53 kB │ map: 0.10 kB
49
+ dist/MultiSequenceAlignmentView.vue3.js  0.90 kB │ gzip: 0.40 kB │ map: 0.13 kB
50
50
  dist/markup.js  2.02 kB │ gzip: 1.03 kB │ map: 6.53 kB
51
51
  dist/PhylogeneticTree.vue2.js  2.31 kB │ gzip: 1.06 kB │ map: 4.45 kB
52
52
  dist/SeqLogo.vue2.js  3.28 kB │ gzip: 1.34 kB │ map: 6.56 kB
53
- dist/MultiSequenceAlignmentView.vue3.js  3.52 kB │ gzip: 1.28 kB │ map: 0.13 kB
53
+ dist/index.js  3.58 kB │ gzip: 1.30 kB │ map: 0.09 kB
54
54
  dist/Consensus.vue2.js  3.64 kB │ gzip: 1.44 kB │ map: 7.18 kB
55
55
  dist/MultiSequenceAlignmentView.vue2.js  4.70 kB │ gzip: 1.66 kB │ map: 11.73 kB
56
56
  dist/chemical-properties.js  4.76 kB │ gzip: 1.67 kB │ map: 11.74 kB
57
57
  dist/PlMultiSequenceAlignment.vue2.js  7.76 kB │ gzip: 2.69 kB │ map: 14.84 kB
58
58
  dist/Toolbar.vue2.js  8.32 kB │ gzip: 1.98 kB │ map: 12.54 kB
59
- dist/data.js  11.32 kB │ gzip: 3.65 kB │ map: 33.73 kB
60
- [vite:dts] Declaration files built in 5223ms.
59
+ dist/data.js  11.40 kB │ gzip: 3.69 kB │ map: 33.92 kB
60
+ [vite:dts] Declaration files built in 4974ms.
61
61
 
62
- ✓ built in 7.46s
62
+ ✓ built in 6.70s
63
63
  Build completed successfully
@@ -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.45.11 lint /home/runner/work/visualizations/visualizations/packages/multi-sequence-alignment
3
+ > @milaboratories/multi-sequence-alignment@1.46.1 lint /home/runner/work/visualizations/visualizations/packages/multi-sequence-alignment
4
4
  > eslint .
5
5
 
@@ -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.45.11 test /home/runner/work/visualizations/visualizations/packages/multi-sequence-alignment
3
+ > @milaboratories/multi-sequence-alignment@1.46.1 test /home/runner/work/visualizations/visualizations/packages/multi-sequence-alignment
4
4
  > vitest run --passWithNoTests
5
5
 
6
6
 
@@ -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.45.11 type-check /home/runner/work/visualizations/visualizations/packages/multi-sequence-alignment
3
+ > @milaboratories/multi-sequence-alignment@1.46.1 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.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [a7985c2]
8
+ - @milaboratories/miplots4@1.0.168
9
+
10
+ ## 1.46.0
11
+
12
+ ### Minor Changes
13
+
14
+ - 20852d6: extend sequenceColumnPredicate to support selecting default options
15
+
3
16
  ## 1.45.11
4
17
 
5
18
  ### Patch Changes
@@ -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
  };
@@ -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
  };
@@ -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("._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: (column: PColumnIdAndSpec) => boolean;
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>;
@@ -1 +1 @@
1
- {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAeL,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,yCAAyC,EAC9C,KAAK,gCAAgC,EACrC,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,cAAc,EAKpB,MAAM,sBAAsB,CAAC;AAW9B,OAAO,KAAK,KAAK,sBAAsB,MAAM,4BAA4B,CAAC;AAE1E,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAI9D,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,eAAO,MAAM,yBAAyB;YAiB5B,YAAY,GAAG,SAAS;6BACP,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO;;;;;CAhB/D,CAAC;AAEF,eAAO,MAAM,sBAAsB;YAmCzB,YAAY,GAAG,SAAS;uBACb,SAAS,EAAE,GAAG,SAAS;;;;;CAlC3C,CAAC;AAEF,eAAO,MAAM,uBAAuB;YAuG1B,YAAY,GAAG,SAAS;uBACb,SAAS,EAAE,GAAG,SAAS;;;;;CAtG3C,CAAC;AAEF,eAAO,MAAM,wBAAwB;YA8JzB,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;;;;;CAlKvC,CAAC;AAqkBF,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"}
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 o = (await x().listColumns(n)).values().filter((i) => r(i)).map(({ spec: i, columnId: c }) => ({
20
- label: C(i, h.Label) ?? "Unlabeled column",
21
- value: c
22
- })).toArray(), t = o.map(({ value: i }) => i);
23
- return { options: o, defaults: t };
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 a = x(), e = await a.listColumns(n), o = new Map(
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 o.entries()) {
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: i } = await a.findColumns(n, {
50
+ const { hits: c } = await o.findColumns(n, {
45
51
  columnFilter: {},
46
- compatibleWith: o.keys().map((s) => A(s)).toArray(),
52
+ compatibleWith: a.keys().map((s) => A(s)).toArray(),
47
53
  strictlyCompatible: !1
48
54
  });
49
- for (const { columnId: s, spec: u } of i) {
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 c = t.entries().map(([s, u]) => ({ label: u, value: A(s) })).toArray(), l = c.values().filter(({ value: s }) => {
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: c, defaults: l };
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((c) => {
69
- const l = e.find((s) => s.columnId === c);
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
- (c) => e.filter(
77
- (l) => J(l.spec, h.Sequence.IsAnnotation) && O(c.spec.axesSpec, l.spec.axesSpec) && Object.entries(c.spec.domain ?? {}).every(([s, u]) => {
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: c }))
87
+ ).map((l) => ({ markupColumn: l, sequenceColumn: i }))
82
88
  );
83
89
  return Map.groupBy(
84
90
  t,
85
- ({ markupColumn: c, sequenceColumn: l }) => {
91
+ ({ markupColumn: i, sequenceColumn: l }) => {
86
92
  const s = Object.fromEntries(
87
- Object.entries(c.spec.domain ?? {}).filter(([u]) => {
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(([c, l]) => ({
95
- label: Object.values(A(c)).join(", "),
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: a,
108
+ labelColumnIds: o,
103
109
  selection: e,
104
- colorScheme: o,
110
+ colorScheme: a,
105
111
  alignmentParams: t,
106
- shouldBuildPhylogeneticTree: i
107
- }, c) {
112
+ shouldBuildPhylogeneticTree: c
113
+ }, i) {
108
114
  var q;
109
- if (!n || !(r != null && r.length) || !a) return;
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: a,
119
+ labelColumnIds: o,
114
120
  selection: e,
115
- colorScheme: o
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(a, l), p = o.type === "markup" ? re(o.columnIds, l) : void 0, b = {}, y = await Promise.all(
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 ae(
127
+ rows: await oe(
122
128
  f,
123
129
  JSON.parse(JSON.stringify(t)),
124
- c
130
+ i
125
131
  )
126
132
  }))
127
133
  );
128
134
  let L;
129
- if (i) {
135
+ if (c) {
130
136
  L = await ie(
131
137
  y,
132
- c
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 = oe({
146
- colorScheme: o,
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: a, selection: e, colorScheme: o }) {
172
- const t = x(), i = await t.listColumns(n), c = i.filter((p) => N(p.spec)), l = W({ selection: e });
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
- c.length > 0 && (s = {
186
+ i.length > 0 && (s = {
181
187
  type: "outer",
182
188
  primary: s,
183
- secondary: c.map(({ columnId: p }) => ({
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 = a.flatMap((p) => p.type !== "column" ? [] : { type: "column", column: p.id });
198
- if (o.type === "markup")
199
- for (const p of o.columnIds)
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 = i.find(({ columnId: y }) => y === p);
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((a) => {
234
- const e = r.find(({ spec: i }) => i.id === a);
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: \`${a}\`).`);
237
- const o = C(e.spec.spec, h.Label) ?? "Unlabeled column", t = e.data.data.keys().take(D).map(
238
- (i) => {
239
- var c;
240
- return ((c = R(e.data, i, { absent: "", na: "" })) == null ? void 0 : c.toString()) ?? "";
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: o, rows: t };
244
- }), ne = (n, r) => n.map((a) => {
249
+ return { name: a, rows: t };
250
+ }), ne = (n, r) => n.map((o) => {
245
251
  const e = r.find(({ spec: t }) => {
246
- if (a.type === "axis" && t.type === "axis")
247
- return O(a.id, t.id);
248
- if (a.type === "column" && t.type === "column")
249
- return a.id === t.id;
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: \`${a}\`).`);
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 i;
256
- return ((i = R(e.data, t, { absent: "", na: "" })) == null ? void 0 : i.toString()) ?? "";
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((a) => {
260
- const e = r.find(({ spec: i }) => i.id === a);
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: \`${a}\`).`);
263
- const o = J(
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
- (i) => {
268
- var c;
273
+ (c) => {
274
+ var i;
269
275
  return z(
270
- ((c = R(e.data, i, { absent: "", na: "" })) == null ? void 0 : c.toString()) ?? ""
276
+ ((i = R(e.data, c, { absent: "", na: "" })) == null ? void 0 : i.toString()) ?? ""
271
277
  );
272
278
  }
273
279
  ).toArray();
274
- return { labels: o, rows: t };
275
- }), ae = /* @__PURE__ */ (() => {
280
+ return { labels: a, rows: t };
281
+ }), oe = /* @__PURE__ */ (() => {
276
282
  const n = /* @__PURE__ */ new Map();
277
- return async (r, a, e) => {
278
- const o = await I([r, a]);
279
- let t = n.get(o);
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: a },
295
+ { sequences: r, params: o },
290
296
  e
291
- ), n.set(o, t), t);
297
+ ), n.set(a, t), t);
292
298
  };
293
299
  })();
294
- function oe({ colorScheme: n, sequences: r, residueCounts: a, markup: e }) {
295
- var o;
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: a });
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, i) => {
303
- const c = e.rows.at(i);
304
- if (!c) throw new Error(`Missing markup for row ${i}.`);
305
- return Y(t, c);
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: ((o = r.at(0)) == null ? void 0 : o.length) ?? 0,
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, a) => {
318
+ const se = (n) => new Promise((r, o) => {
313
319
  const e = new FileReader();
314
- e.addEventListener("load", () => r(e.result)), e.addEventListener("error", () => a(e.error)), e.readAsDataURL(n);
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, a) => {
318
- var i;
319
- const e = ((i = r.at(0)) == null ? void 0 : i.rows.keys().map((c) => r.map((l) => l.rows.at(c) ?? "").join("")).toArray()) ?? [], o = await I(e);
320
- let t = n.get(o);
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
- a
332
- ), n.set(o, t), t);
337
+ o
338
+ ), n.set(a, t), t);
333
339
  };
334
- })(), P = (n, r, a) => new Promise((e, o) => {
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: i }) => {
338
- o(t ?? i), n.terminate();
339
- }), a.addEventListener("abort", () => {
340
- o(a.reason), n.terminate();
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(), a = M(!0), e = M();
345
- let o;
346
- return (t) => (F(t, async (i, c) => {
347
- if (O(i, c)) return;
348
- const l = new AbortController(), s = o = Symbol();
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, a.value = !0;
354
- const u = await n(i, l.signal);
355
- s === o && (r.value = u);
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 === o && (e.value = T(u));
363
+ console.error(u), s === a && (e.value = T(u));
358
364
  } finally {
359
- s === o && (a.value = !1);
365
+ s === a && (o.value = !1);
360
366
  }
361
- }, { immediate: !0 }), { data: r, isLoading: a, error: e });
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.45.11",
3
+ "version": "1.46.1",
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.167"
17
+ "@milaboratories/miplots4": "1.0.168"
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.1",
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.51.5",
34
- "@platforma-sdk/ui-vue": "^1.51.5"
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 { isJsonEqual } from '@milaboratories/helpers';
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: (column: PColumnIdAndSpec) => boolean;
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 options = columns.values()
74
- .filter((column) => sequenceColumnPredicate(column))
75
- .map(({ spec, columnId }) => ({
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
- .toArray();
80
-
81
- const defaults = options.map(({ value }) => value);
88
+ });
89
+ }
82
90
 
83
- return { options, defaults };
91
+ return result;
84
92
  }
85
93
 
86
94
  async function getLabelColumnsOptions({ pFrame, sequenceColumnIds }: {