@platforma-sdk/ui-vue 1.42.3 → 1.42.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/.turbo/turbo-build.log +16 -16
  2. package/.turbo/turbo-type-check.log +1 -1
  3. package/CHANGELOG.md +15 -0
  4. package/dist/aggrid.js +4 -4
  5. package/dist/components/PlAgDataTable/PlAgDataTableSheets.vue2.js +7 -7
  6. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js +13 -13
  7. package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts.map +1 -1
  8. package/dist/components/PlAgDataTable/sources/table-source-v2.js +88 -85
  9. package/dist/components/PlAgDataTable/sources/table-source-v2.js.map +1 -1
  10. package/dist/components/PlAgDataTable/sources/table-state-v2.js +6 -6
  11. package/dist/components/PlAnnotations/components/DynamicForm.vue2.js +10 -10
  12. package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js +2 -2
  13. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.d.ts.map +1 -1
  14. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue2.js +37 -29
  15. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue2.js.map +1 -1
  16. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue3.js +18 -14
  17. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue3.js.map +1 -1
  18. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.d.ts.map +1 -1
  19. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js +100 -98
  20. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js.map +1 -1
  21. package/dist/components/PlMultiSequenceAlignment/data.d.ts +1 -1
  22. package/dist/components/PlMultiSequenceAlignment/data.js +41 -41
  23. package/dist/components/PlMultiSequenceAlignment/data.js.map +1 -1
  24. package/dist/components/PlTableFilters/filters-state.js +2 -2
  25. package/dist/defineApp.js +16 -16
  26. package/dist/internal/createAppV2.js +9 -9
  27. package/dist/lib/model/common/dist/index.js +329 -317
  28. package/dist/lib/model/common/dist/index.js.map +1 -1
  29. package/dist/lib/ui/uikit/dist/components/PlAccordion/{ExpandTransition.vue2.js → ExpandTransition.vue.js} +1 -1
  30. package/dist/lib/ui/uikit/dist/components/PlAccordion/ExpandTransition.vue.js.map +1 -0
  31. package/dist/lib/ui/uikit/dist/components/PlAccordion/PlAccordionSection.vue2.js +1 -1
  32. package/dist/lib/ui/uikit/dist/components/PlFileInput/PlFileInput.vue.js +16 -16
  33. package/dist/lib/ui/uikit/dist/components/PlFileInput/PlFileInput.vue.js.map +1 -1
  34. package/dist/lib/ui/uikit/dist/lib/model/common/dist/index.js +8 -8
  35. package/dist/lib/ui/uikit/dist/lib/model/common/dist/index.js.map +1 -1
  36. package/dist/lib/ui/uikit/dist/sdk/model/dist/index.js +18 -18
  37. package/dist/lib/ui/uikit/dist/sdk/model/dist/index.js.map +1 -1
  38. package/dist/sdk/model/dist/index.js +198 -206
  39. package/dist/sdk/model/dist/index.js.map +1 -1
  40. package/package.json +5 -5
  41. package/src/components/PlAgDataTable/sources/table-source-v2.ts +9 -6
  42. package/src/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue +65 -18
  43. package/src/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue +16 -11
  44. package/src/components/PlMultiSequenceAlignment/data.ts +10 -10
  45. package/dist/lib/ui/uikit/dist/components/PlAccordion/ExpandTransition.vue2.js.map +0 -1
@@ -1,18 +1,18 @@
1
1
  import { isJsonEqual as J } from "../../lib/util/helpers/dist/index.js";
2
- import { getRawPlatformaInstance as z, isLabelColumn as N, isLinkerColumn as W, createRowSelectionColumn as X } from "../../sdk/model/dist/index.js";
2
+ import { getRawPlatformaInstance as V, isLabelColumn as _, isLinkerColumn as W, createRowSelectionColumn as X } from "../../sdk/model/dist/index.js";
3
3
  import { ref as M, watch as G } from "vue";
4
4
  import { highlightByChemicalProperties as H } from "./chemical-properties.js";
5
5
  import { parseMarkup as K, markupAlignedSequence as Q, highlightByMarkup as Y } from "./markup.js";
6
6
  import { multiSequenceAlignment as Z } from "./multi-sequence-alignment.js";
7
7
  import { getResidueCounts as nn } from "./residue-counts.js";
8
- import { ensureError as tn, canonicalizeJson as A, getAxisId as E, parseJson as D, matchAxisId as en, pTableValue as q } from "../../lib/model/common/dist/index.js";
9
- const S = () => z().pFrameDriver, O = 1e3, gn = k(
8
+ import { ensureError as tn, canonicalizeJson as A, getAxisId as E, parseJson as D, matchAxisId as en, pTableValue as O } from "../../lib/model/common/dist/index.js";
9
+ const S = () => V().pFrameDriver, q = 1e3, gn = C(
10
10
  an
11
- ), hn = k(
11
+ ), hn = C(
12
12
  on
13
- ), wn = k(
13
+ ), wn = C(
14
14
  rn
15
- ), bn = k(
15
+ ), bn = C(
16
16
  sn
17
17
  );
18
18
  async function an({
@@ -23,7 +23,7 @@ async function an({
23
23
  const t = (await S().listColumns(c)).values().filter((o) => e(o)).map(({ spec: o, columnId: u }) => {
24
24
  var m;
25
25
  return {
26
- label: ((m = o.annotations) == null ? void 0 : m["pl7.app/label"]) ?? "Unlabelled column",
26
+ label: ((m = o.annotations) == null ? void 0 : m["pl7.app/label"]) ?? "Unlabeled column",
27
27
  value: u
28
28
  };
29
29
  }).toArray(), l = t.map(({ value: o }) => o);
@@ -45,11 +45,11 @@ async function on({
45
45
  );
46
46
  for (const [i, d] of l.entries()) {
47
47
  const a = D(i), g = p.find(
48
- ({ spec: v }) => N(v) && en(a, E(v.axesSpec[0]))
48
+ ({ spec: v }) => _(v) && en(a, E(v.axesSpec[0]))
49
49
  );
50
50
  t.set(
51
51
  g ? A({ type: "column", id: g.columnId }) : A({ type: "axis", id: a }),
52
- ((f = g == null ? void 0 : g.spec.annotations) == null ? void 0 : f["pl7.app/label"]) ?? ((h = d.annotations) == null ? void 0 : h["pl7.app/label"]) ?? "Unlabelled axis"
52
+ ((f = g == null ? void 0 : g.spec.annotations) == null ? void 0 : f["pl7.app/label"]) ?? ((h = d.annotations) == null ? void 0 : h["pl7.app/label"]) ?? "Unlabeled axis"
53
53
  );
54
54
  }
55
55
  const { hits: o } = await y.findColumns(c, {
@@ -61,13 +61,13 @@ async function on({
61
61
  const a = A({ type: "column", id: i });
62
62
  t.has(a) || t.set(
63
63
  a,
64
- ((b = d.annotations) == null ? void 0 : b["pl7.app/label"]) ?? "Unlabelled column"
64
+ ((b = d.annotations) == null ? void 0 : b["pl7.app/label"]) ?? "Unlabeled column"
65
65
  );
66
66
  }
67
67
  const u = t.entries().map(([i, d]) => ({ label: d, value: D(i) })).toArray(), m = u.values().filter(({ value: i }) => {
68
68
  if (i.type === "axis") return !0;
69
69
  const d = p.find(({ columnId: a }) => a === i.id);
70
- return d && N(d.spec);
70
+ return d && _(d.spec);
71
71
  }).map(({ value: i }) => i).toArray();
72
72
  return { options: u, defaults: m };
73
73
  }
@@ -95,19 +95,19 @@ async function rn({
95
95
  var u;
96
96
  return {
97
97
  value: l,
98
- label: ((u = o.annotations) == null ? void 0 : u["pl7.app/label"]) ?? "Unlabelled column"
98
+ label: ((u = o.annotations) == null ? void 0 : u["pl7.app/label"]) ?? "Unlabeled column"
99
99
  };
100
100
  }).toArray();
101
101
  }
102
102
  async function sn({
103
- pframe: c,
103
+ pFrame: c,
104
104
  sequenceColumnIds: e,
105
105
  labelColumnIds: y,
106
106
  selection: p,
107
107
  colorScheme: t,
108
108
  alignmentParams: l
109
109
  }) {
110
- var F, I;
110
+ var I, P;
111
111
  if (!c || !(e != null && e.length) || !y) return;
112
112
  const o = S(), u = await o.listColumns(c), m = u.filter((n) => W(n.spec)), f = X({ selection: p });
113
113
  let h = {
@@ -163,17 +163,17 @@ async function sn({
163
163
  {
164
164
  offset: 0,
165
165
  // +1 is a hack to check whether the selection is over the limit
166
- length: O + 1
166
+ length: q + 1
167
167
  }
168
168
  );
169
169
  let g = (a == null ? void 0 : a[0].data.data.length) ?? 0, v = !1;
170
- g > O && (g = O, v = !0);
170
+ g > q && (g = q, v = !0);
171
171
  const L = e.map((n) => {
172
172
  const r = a.find(({ spec: s }) => s.id === n);
173
173
  if (!r)
174
174
  throw new Error(`Couldn't find sequence column (ID: \`${n}\`).`);
175
175
  return r;
176
- }), _ = y.map((n) => {
176
+ }), F = y.map((n) => {
177
177
  const r = a.find(({ spec: s }) => {
178
178
  if (n.type === "axis" && s.type === "axis")
179
179
  return J(n.id, s.id);
@@ -190,39 +190,39 @@ async function sn({
190
190
  { length: g },
191
191
  (r, s) => {
192
192
  var w;
193
- return ((w = q(n.data, s, { na: "", absent: "" })) == null ? void 0 : w.toString()) ?? "";
193
+ return ((w = O(n.data, s, { na: "", absent: "" })) == null ? void 0 : w.toString()) ?? "";
194
194
  }
195
195
  ),
196
196
  l
197
197
  )
198
198
  )
199
- ), R = Array.from(
199
+ ), $ = Array.from(
200
200
  { length: g },
201
201
  (n, r) => j.map((s) => s[r])
202
- ), B = L.map(
202
+ ), z = L.map(
203
203
  (n) => {
204
204
  var r;
205
- return ((r = n.spec.spec.annotations) == null ? void 0 : r["pl7.app/label"]) ?? "Unlabelled column";
205
+ return ((r = n.spec.spec.annotations) == null ? void 0 : r["pl7.app/label"]) ?? "Unlabeled column";
206
206
  }
207
- ), T = Array.from(
207
+ ), B = Array.from(
208
208
  { length: g },
209
- (n, r) => _.map(
209
+ (n, r) => F.map(
210
210
  (s) => {
211
211
  var w;
212
- return ((w = q(s.data, r, { na: "", absent: "" })) == null ? void 0 : w.toString()) ?? "";
212
+ return ((w = O(s.data, r, { na: "", absent: "" })) == null ? void 0 : w.toString()) ?? "";
213
213
  }
214
214
  )
215
- ), x = R.map((n) => n.join(" ")), $ = nn(x), C = {
215
+ ), x = $.map((n) => n.join(" ")), R = nn(x), k = {
216
216
  sequences: x,
217
- sequenceNames: B,
218
- labelRows: T,
217
+ sequenceNames: z,
218
+ labelRows: B,
219
219
  exceedsLimit: v,
220
- residueCounts: $
220
+ residueCounts: R
221
221
  };
222
222
  if (t.type === "chemical-properties")
223
- C.highlightImage = H({
223
+ k.highlightImage = H({
224
224
  sequences: x,
225
- residueCounts: $
225
+ residueCounts: R
226
226
  });
227
227
  else if (t.type === "markup") {
228
228
  const n = a.find(
@@ -234,25 +234,25 @@ async function sn({
234
234
  );
235
235
  const r = Array.from(
236
236
  { length: g },
237
- (w, P) => {
238
- var U;
239
- const V = K(
240
- ((U = q(n.data, P, { na: "", absent: "" })) == null ? void 0 : U.toString()) ?? ""
237
+ (w, U) => {
238
+ var N;
239
+ const T = K(
240
+ ((N = O(n.data, U, { na: "", absent: "" })) == null ? void 0 : N.toString()) ?? ""
241
241
  );
242
- return Q(R[P][0], V);
242
+ return Q($[U][0], T);
243
243
  }
244
244
  ), s = JSON.parse(
245
- ((F = n.spec.spec.annotations) == null ? void 0 : F["pl7.app/sequence/annotation/mapping"]) ?? "{}"
245
+ ((I = n.spec.spec.annotations) == null ? void 0 : I["pl7.app/sequence/annotation/mapping"]) ?? "{}"
246
246
  );
247
- C.highlightImage = Y({
247
+ k.highlightImage = Y({
248
248
  markupRows: r,
249
- columnCount: ((I = x.at(0)) == null ? void 0 : I.length) ?? 0,
249
+ columnCount: ((P = x.at(0)) == null ? void 0 : P.length) ?? 0,
250
250
  labels: s
251
251
  });
252
252
  }
253
- return C;
253
+ return k;
254
254
  }
255
- function k(c) {
255
+ function C(c) {
256
256
  const e = M(), y = M(!0), p = M();
257
257
  let t;
258
258
  return (l) => (G(l, async (o, u) => {
@@ -270,7 +270,7 @@ function k(c) {
270
270
  }, { immediate: !0 }), { data: e, isLoading: y, error: p });
271
271
  }
272
272
  export {
273
- O as sequenceLimit,
273
+ q as sequenceLimit,
274
274
  hn as useLabelColumnsOptions,
275
275
  wn as useMarkupColumnsOptions,
276
276
  bn as useMultipleAlignmentData,
@@ -1 +1 @@
1
- {"version":3,"file":"data.js","sources":["../../../src/components/PlMultiSequenceAlignment/data.ts"],"sourcesContent":["import { isJsonEqual } from '@milaboratories/helpers';\nimport type { ListOptionNormalized } from '@milaboratories/uikit';\nimport {\n type CalculateTableDataRequest,\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} from '@platforma-sdk/model';\nimport { ref, watch } from 'vue';\nimport { highlightByChemicalProperties } from './chemical-properties';\nimport {\n highlightByMarkup,\n markupAlignedSequence,\n parseMarkup,\n} from './markup';\nimport { multiSequenceAlignment } from './multi-sequence-alignment';\nimport { getResidueCounts } from './residue-counts';\nimport type { HighlightLegend, ResidueCounts } from './types';\n\nconst getPFrameDriver = () => getRawPlatformaInstance().pFrameDriver;\n\nexport const sequenceLimit = 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({\n pFrame,\n sequenceColumnPredicate,\n}: {\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 const options = columns.values()\n .filter((column) => sequenceColumnPredicate(column))\n .map(({ spec, columnId }) => ({\n label: spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n value: columnId,\n }))\n .toArray();\n const defaults = options.map(({ value }) => value);\n return { options, defaults };\n}\n\nasync function getLabelColumnsOptions({\n pFrame,\n sequenceColumnIds,\n}: {\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 const optionMap = new Map<CanonicalizedJson<PTableColumnId>, string>();\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 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 labelColumn?.spec.annotations?.['pl7.app/label']\n ?? axisSpec.annotations?.['pl7.app/label']\n ?? 'Unlabelled 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({ type: 'column', id: columnId });\n if (optionMap.has(columnIdJson)) continue;\n optionMap.set(\n columnIdJson,\n spec.annotations?.['pl7.app/label'] ?? 'Unlabelled 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 return { options, defaults };\n}\n\nasync function getMarkupColumnsOptions({\n pFrame,\n sequenceColumnIds,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<ListOptionNormalized<PObjectId>[] | undefined> {\n if (!pFrame || sequenceColumnIds?.length !== 1) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const sequenceColumn = columns.find((column) =>\n column.columnId === sequenceColumnIds[0],\n );\n if (!sequenceColumn) {\n throw new Error(\n `Couldn't find sequence column (ID: \\`${sequenceColumnIds[0]}\\`).`,\n );\n }\n return columns.values()\n .filter((column) =>\n column.spec.annotations?.['pl7.app/sequence/isAnnotation'] === 'true'\n && isJsonEqual(sequenceColumn.spec.axesSpec, column.spec.axesSpec)\n && Object.entries(sequenceColumn.spec.domain ?? {}).every((\n [key, value],\n ) => column.spec.domain?.[key] === value),\n ).map(({ columnId, spec }) => ({\n value: columnId,\n label: spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n }))\n .toArray();\n}\n\nasync function getMultipleAlignmentData({\n pframe,\n sequenceColumnIds,\n labelColumnIds,\n selection,\n colorScheme,\n alignmentParams,\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}): Promise<MultipleAlignmentData | undefined> {\n if (!pframe || !sequenceColumnIds?.length || !labelColumnIds) return;\n\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 secondaryEntry.push({ type: 'column', column: colorScheme.columnId });\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 const table = await 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: sequenceLimit + 1,\n },\n );\n\n let rowCount = table?.[0].data.data.length ?? 0;\n let exceedsLimit = false;\n if (rowCount > sequenceLimit) {\n rowCount = sequenceLimit;\n exceedsLimit = true;\n }\n\n const sequenceColumns = sequenceColumnIds.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 return column;\n });\n\n const labelColumns = labelColumnIds.map((labelColumn) => {\n const column = table.find(({ spec }) => {\n if (labelColumn.type === 'axis' && spec.type === 'axis') {\n return isJsonEqual(labelColumn.id, spec.id);\n }\n if (labelColumn.type === 'column' && spec.type === 'column') {\n return labelColumn.id === spec.id;\n }\n });\n if (!column) {\n throw new Error(`Couldn't find label column (ID: \\`${labelColumn}\\`).`);\n }\n return column;\n });\n\n const alignedSequences = await Promise.all(\n sequenceColumns.map((column) =>\n multiSequenceAlignment(\n Array.from(\n { length: rowCount },\n (_, row) =>\n pTableValue(column.data, row, { na: '', absent: '' })?.toString()\n ?? '',\n ),\n alignmentParams,\n ),\n ),\n );\n\n const sequences = Array.from(\n { length: rowCount },\n (_, row) => alignedSequences.map((column) => column[row]),\n );\n\n const sequenceNames = sequenceColumns.map((column) =>\n column.spec.spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n );\n\n const labels = Array.from(\n { length: rowCount },\n (_, row) =>\n labelColumns.map((column) =>\n pTableValue(column.data, row, { na: '', absent: '' })?.toString() ?? '',\n ),\n );\n\n const concatenatedSequences = sequences.map((row) => row.join(' '));\n const residueCounts = getResidueCounts(concatenatedSequences);\n\n const result: MultipleAlignmentData = {\n sequences: concatenatedSequences,\n sequenceNames,\n labelRows: labels,\n exceedsLimit,\n residueCounts,\n };\n\n if (colorScheme.type === 'chemical-properties') {\n result.highlightImage = highlightByChemicalProperties({\n sequences: concatenatedSequences,\n residueCounts,\n });\n } else if (colorScheme.type === 'markup') {\n const markupColumn = table.find(({ spec }) =>\n spec.id === colorScheme.columnId,\n );\n if (!markupColumn) {\n throw new Error(\n `Couldn't find markup column (ID: \\`${colorScheme.columnId}\\`).`,\n );\n }\n const markupRows = Array.from(\n { length: rowCount },\n (_, row) => {\n const markup = parseMarkup(\n pTableValue(markupColumn.data, row, { na: '', absent: '' })\n ?.toString()\n ?? '',\n );\n return markupAlignedSequence(sequences[row][0], markup);\n },\n );\n const labels: Record<string, string> = JSON.parse(\n markupColumn.spec.spec.annotations\n ?.['pl7.app/sequence/annotation/mapping'] ?? '{}',\n );\n result.highlightImage = highlightByMarkup({\n markupRows,\n columnCount: concatenatedSequences.at(0)?.length ?? 0,\n labels,\n });\n }\n\n return result;\n}\n\nfunction refreshOnDeepChange<T, P>(cb: (params: P) => Promise<T>) {\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 currentRequestId = requestId = Symbol();\n try {\n error.value = undefined;\n isLoading.value = true;\n const result = await cb(params);\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: string[];\n sequenceNames: string[];\n labelRows: string[][];\n residueCounts: ResidueCounts;\n highlightImage?: {\n blob: Blob;\n legend: HighlightLegend;\n };\n exceedsLimit: boolean;\n};\n\ntype OptionsWithDefaults<T> = {\n options: ListOptionNormalized<T>[];\n defaults: T[];\n};\n"],"names":["getPFrameDriver","getRawPlatformaInstance","sequenceLimit","useSequenceColumnsOptions","refreshOnDeepChange","getSequenceColumnsOptions","useLabelColumnsOptions","getLabelColumnsOptions","useMarkupColumnsOptions","getMarkupColumnsOptions","useMultipleAlignmentData","getMultipleAlignmentData","pFrame","sequenceColumnPredicate","options","column","spec","columnId","_a","defaults","value","sequenceColumnIds","pFrameDriver","columns","optionMap","sequenceColumnsAxes","id","canonicalizeJson","getAxisId","axisIdJson","axisSpec","axisId","parseJson","labelColumn","isLabelColumn","matchAxisId","_b","compatibleColumns","columnIdJson","_c","label","sequenceColumn","isJsonEqual","key","pframe","labelColumnIds","selection","colorScheme","alignmentParams","linkerColumns","isLinkerColumn","filterColumn","createRowSelectionColumn","primaryEntry","secondaryEntry","sorting","request","table","rowCount","exceedsLimit","sequenceColumns","labelColumns","alignedSequences","multiSequenceAlignment","_","row","pTableValue","sequences","sequenceNames","labels","concatenatedSequences","residueCounts","getResidueCounts","result","highlightByChemicalProperties","markupColumn","markupRows","markup","parseMarkup","markupAlignedSequence","highlightByMarkup","cb","data","ref","isLoading","error","requestId","paramsGetter","watch","params","prevParams","currentRequestId","err","ensureError"],"mappings":"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"}
1
+ {"version":3,"file":"data.js","sources":["../../../src/components/PlMultiSequenceAlignment/data.ts"],"sourcesContent":["import { isJsonEqual } from '@milaboratories/helpers';\nimport type { ListOptionNormalized } from '@milaboratories/uikit';\nimport {\n type CalculateTableDataRequest,\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} from '@platforma-sdk/model';\nimport { ref, watch } from 'vue';\nimport { highlightByChemicalProperties } from './chemical-properties';\nimport {\n highlightByMarkup,\n markupAlignedSequence,\n parseMarkup,\n} from './markup';\nimport { multiSequenceAlignment } from './multi-sequence-alignment';\nimport { getResidueCounts } from './residue-counts';\nimport type { HighlightLegend, ResidueCounts } from './types';\n\nconst getPFrameDriver = () => getRawPlatformaInstance().pFrameDriver;\n\nexport const sequenceLimit = 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({\n pFrame,\n sequenceColumnPredicate,\n}: {\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 const options = columns.values()\n .filter((column) => sequenceColumnPredicate(column))\n .map(({ spec, columnId }) => ({\n label: spec.annotations?.['pl7.app/label'] ?? 'Unlabeled column',\n value: columnId,\n }))\n .toArray();\n const defaults = options.map(({ value }) => value);\n return { options, defaults };\n}\n\nasync function getLabelColumnsOptions({\n pFrame,\n sequenceColumnIds,\n}: {\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 const optionMap = new Map<CanonicalizedJson<PTableColumnId>, string>();\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 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 labelColumn?.spec.annotations?.['pl7.app/label']\n ?? axisSpec.annotations?.['pl7.app/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({ type: 'column', id: columnId });\n if (optionMap.has(columnIdJson)) continue;\n optionMap.set(\n columnIdJson,\n spec.annotations?.['pl7.app/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 return { options, defaults };\n}\n\nasync function getMarkupColumnsOptions({\n pFrame,\n sequenceColumnIds,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<ListOptionNormalized<PObjectId>[] | undefined> {\n if (!pFrame || sequenceColumnIds?.length !== 1) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const sequenceColumn = columns.find((column) =>\n column.columnId === sequenceColumnIds[0],\n );\n if (!sequenceColumn) {\n throw new Error(\n `Couldn't find sequence column (ID: \\`${sequenceColumnIds[0]}\\`).`,\n );\n }\n return columns.values()\n .filter((column) =>\n column.spec.annotations?.['pl7.app/sequence/isAnnotation'] === 'true'\n && isJsonEqual(sequenceColumn.spec.axesSpec, column.spec.axesSpec)\n && Object.entries(sequenceColumn.spec.domain ?? {}).every((\n [key, value],\n ) => column.spec.domain?.[key] === value),\n ).map(({ columnId, spec }) => ({\n value: columnId,\n label: spec.annotations?.['pl7.app/label'] ?? 'Unlabeled column',\n }))\n .toArray();\n}\n\nasync function getMultipleAlignmentData({\n pFrame,\n sequenceColumnIds,\n labelColumnIds,\n selection,\n colorScheme,\n alignmentParams,\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}): Promise<MultipleAlignmentData | undefined> {\n if (!pFrame || !sequenceColumnIds?.length || !labelColumnIds) return;\n\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 secondaryEntry.push({ type: 'column', column: colorScheme.columnId });\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 const table = await 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: sequenceLimit + 1,\n },\n );\n\n let rowCount = table?.[0].data.data.length ?? 0;\n let exceedsLimit = false;\n if (rowCount > sequenceLimit) {\n rowCount = sequenceLimit;\n exceedsLimit = true;\n }\n\n const sequenceColumns = sequenceColumnIds.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 return column;\n });\n\n const labelColumns = labelColumnIds.map((labelColumn) => {\n const column = table.find(({ spec }) => {\n if (labelColumn.type === 'axis' && spec.type === 'axis') {\n return isJsonEqual(labelColumn.id, spec.id);\n }\n if (labelColumn.type === 'column' && spec.type === 'column') {\n return labelColumn.id === spec.id;\n }\n });\n if (!column) {\n throw new Error(`Couldn't find label column (ID: \\`${labelColumn}\\`).`);\n }\n return column;\n });\n\n const alignedSequences = await Promise.all(\n sequenceColumns.map((column) =>\n multiSequenceAlignment(\n Array.from(\n { length: rowCount },\n (_, row) =>\n pTableValue(column.data, row, { na: '', absent: '' })?.toString()\n ?? '',\n ),\n alignmentParams,\n ),\n ),\n );\n\n const sequences = Array.from(\n { length: rowCount },\n (_, row) => alignedSequences.map((column) => column[row]),\n );\n\n const sequenceNames = sequenceColumns.map((column) =>\n column.spec.spec.annotations?.['pl7.app/label'] ?? 'Unlabeled column',\n );\n\n const labels = Array.from(\n { length: rowCount },\n (_, row) =>\n labelColumns.map((column) =>\n pTableValue(column.data, row, { na: '', absent: '' })?.toString() ?? '',\n ),\n );\n\n const concatenatedSequences = sequences.map((row) => row.join(' '));\n const residueCounts = getResidueCounts(concatenatedSequences);\n\n const result: MultipleAlignmentData = {\n sequences: concatenatedSequences,\n sequenceNames,\n labelRows: labels,\n exceedsLimit,\n residueCounts,\n };\n\n if (colorScheme.type === 'chemical-properties') {\n result.highlightImage = highlightByChemicalProperties({\n sequences: concatenatedSequences,\n residueCounts,\n });\n } else if (colorScheme.type === 'markup') {\n const markupColumn = table.find(({ spec }) =>\n spec.id === colorScheme.columnId,\n );\n if (!markupColumn) {\n throw new Error(\n `Couldn't find markup column (ID: \\`${colorScheme.columnId}\\`).`,\n );\n }\n const markupRows = Array.from(\n { length: rowCount },\n (_, row) => {\n const markup = parseMarkup(\n pTableValue(markupColumn.data, row, { na: '', absent: '' })\n ?.toString()\n ?? '',\n );\n return markupAlignedSequence(sequences[row][0], markup);\n },\n );\n const labels: Record<string, string> = JSON.parse(\n markupColumn.spec.spec.annotations\n ?.['pl7.app/sequence/annotation/mapping'] ?? '{}',\n );\n result.highlightImage = highlightByMarkup({\n markupRows,\n columnCount: concatenatedSequences.at(0)?.length ?? 0,\n labels,\n });\n }\n\n return result;\n}\n\nfunction refreshOnDeepChange<T, P>(cb: (params: P) => Promise<T>) {\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 currentRequestId = requestId = Symbol();\n try {\n error.value = undefined;\n isLoading.value = true;\n const result = await cb(params);\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: string[];\n sequenceNames: string[];\n labelRows: string[][];\n residueCounts: ResidueCounts;\n highlightImage?: {\n blob: Blob;\n legend: HighlightLegend;\n };\n exceedsLimit: boolean;\n};\n\ntype OptionsWithDefaults<T> = {\n options: ListOptionNormalized<T>[];\n defaults: T[];\n};\n"],"names":["getPFrameDriver","getRawPlatformaInstance","sequenceLimit","useSequenceColumnsOptions","refreshOnDeepChange","getSequenceColumnsOptions","useLabelColumnsOptions","getLabelColumnsOptions","useMarkupColumnsOptions","getMarkupColumnsOptions","useMultipleAlignmentData","getMultipleAlignmentData","pFrame","sequenceColumnPredicate","options","column","spec","columnId","_a","defaults","value","sequenceColumnIds","pFrameDriver","columns","optionMap","sequenceColumnsAxes","id","canonicalizeJson","getAxisId","axisIdJson","axisSpec","axisId","parseJson","labelColumn","isLabelColumn","matchAxisId","_b","compatibleColumns","columnIdJson","_c","label","sequenceColumn","isJsonEqual","key","labelColumnIds","selection","colorScheme","alignmentParams","linkerColumns","isLinkerColumn","filterColumn","createRowSelectionColumn","primaryEntry","secondaryEntry","sorting","request","table","rowCount","exceedsLimit","sequenceColumns","labelColumns","alignedSequences","multiSequenceAlignment","_","row","pTableValue","sequences","sequenceNames","labels","concatenatedSequences","residueCounts","getResidueCounts","result","highlightByChemicalProperties","markupColumn","markupRows","markup","parseMarkup","markupAlignedSequence","highlightByMarkup","cb","data","ref","isLoading","error","requestId","paramsGetter","watch","params","prevParams","currentRequestId","err","ensureError"],"mappings":"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"}
@@ -3,7 +3,7 @@ import "../../sdk/model/dist/index.js";
3
3
  import { isJsonEqual as b } from "../../lib/util/helpers/dist/index.js";
4
4
  import { getFilterOptions as g, makeDiscreteOptions as k, isFilterValid as F, isAlphabetic as q, getColumnName as x } from "./filters_logic.js";
5
5
  import { getPTableColumnId as z, canonicalizeJson as f } from "../../lib/model/common/dist/index.js";
6
- function K(M, m) {
6
+ function N(M, m) {
7
7
  const w = J(/* @__PURE__ */ new Map()), o = V({
8
8
  value: []
9
9
  });
@@ -73,6 +73,6 @@ function K(M, m) {
73
73
  ), o;
74
74
  }
75
75
  export {
76
- K as useFilters
76
+ N as useFilters
77
77
  };
78
78
  //# sourceMappingURL=filters-state.js.map
package/dist/defineApp.js CHANGED
@@ -1,5 +1,5 @@
1
- import { notEmpty as V } from "./lib/util/helpers/dist/index.js";
2
- import { getPlatformaApiVersion as g } from "./sdk/model/dist/index.js";
1
+ import { notEmpty as g } from "./lib/util/helpers/dist/index.js";
2
+ import { getPlatformaApiVersion as V } from "./sdk/model/dist/index.js";
3
3
  import { inject as k, reactive as h, markRaw as A } from "vue";
4
4
  import { createAppV1 as j } from "./internal/createAppV1.js";
5
5
  import { createAppV2 as w } from "./internal/createAppV2.js";
@@ -12,15 +12,15 @@ function $() {
12
12
  function C(e, p, l = {}) {
13
13
  let u;
14
14
  y();
15
- const d = e.apiVersion ?? 1, f = g(), b = async () => {
15
+ const d = e.apiVersion ?? 1, f = V(), b = async () => {
16
16
  if (f !== d)
17
17
  throw new Error(`Block requested API version ${f} but runtime API version is ${d}.
18
18
  Please update the desktop app to use the latest API version.`);
19
- e.apiVersion === void 0 || e.apiVersion === 1 ? await e.loadBlockState().then((r) => {
19
+ e.apiVersion === void 0 || e.apiVersion === 1 ? await e.loadBlockState().then((o) => {
20
20
  a.loaded = !0;
21
- const t = j(r, e, l), i = p(t), c = Object.fromEntries(
22
- Object.entries(i.routes).map(([s, o]) => {
23
- const n = typeof o == "function" ? o() : o;
21
+ const t = j(o, e, l), i = p(t), c = Object.fromEntries(
22
+ Object.entries(i.routes).map(([s, r]) => {
23
+ const n = typeof r == "function" ? r() : r;
24
24
  return [s, A(n)];
25
25
  })
26
26
  );
@@ -30,19 +30,19 @@ function C(e, p, l = {}) {
30
30
  return c[s];
31
31
  }
32
32
  });
33
- }) : e.apiVersion === 2 && await e.loadBlockState().then((r) => {
34
- const t = O(r);
33
+ }) : e.apiVersion === 2 && await e.loadBlockState().then((o) => {
34
+ const t = O(o);
35
35
  a.loaded = !0;
36
36
  const i = w(t, e, l), c = p(i), s = Object.fromEntries(
37
- Object.entries(c.routes).map(([o, n]) => {
37
+ Object.entries(c.routes).map(([r, n]) => {
38
38
  const v = typeof n == "function" ? n() : n;
39
- return [o, A(v)];
39
+ return [r, A(v)];
40
40
  })
41
41
  );
42
42
  u = Object.assign(i, {
43
43
  ...c,
44
- getRoute(o) {
45
- return s[o];
44
+ getRoute(r) {
45
+ return s[r];
46
46
  }
47
47
  });
48
48
  });
@@ -51,12 +51,12 @@ function C(e, p, l = {}) {
51
51
  error: void 0,
52
52
  // Href to get typed query parameters for a specific route
53
53
  useApp() {
54
- return V(u, "App is not loaded");
54
+ return g(u, "App is not loaded");
55
55
  },
56
56
  // @todo type portability issue with Vue
57
57
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
58
- install(r) {
59
- r.provide(m, this), b().catch((t) => {
58
+ install(o) {
59
+ o.provide(m, this), b().catch((t) => {
60
60
  console.error("load initial state error", t), a.error = t;
61
61
  });
62
62
  }
@@ -1,14 +1,14 @@
1
1
  import { deepClone as i, uniqueId as V, delay as L } from "../lib/util/helpers/dist/index.js";
2
2
  import "../sdk/model/dist/index.js";
3
- import { ref as w, computed as g, reactive as N } from "vue";
4
- import { createModel as P } from "../createModel.js";
3
+ import { ref as w, computed as g, reactive as P } from "vue";
4
+ import { createModel as B } from "../createModel.js";
5
5
  import { parseQuery as W } from "../urls.js";
6
6
  import { MultiError as G, unwrapValueOrErrors as H } from "../utils.js";
7
7
  import "../node_modules/.pnpm/fast-json-patch@3.1.1/node_modules/fast-json-patch/index.js";
8
8
  import { UpdateSerializer as v } from "./UpdateSerializer.js";
9
9
  import { ignorableWatch as K } from "../node_modules/.pnpm/@vueuse_shared@13.3.0_vue@3.5.13_typescript@5.6.3_/node_modules/@vueuse/shared/index.js";
10
10
  import { unwrapResult as c, hasAbortError as X } from "../lib/model/common/dist/index.js";
11
- import { applyPatch as B } from "../node_modules/.pnpm/fast-json-patch@3.1.1/node_modules/fast-json-patch/module/core.js";
11
+ import { applyPatch as N } from "../node_modules/.pnpm/fast-json-patch@3.1.1/node_modules/fast-json-patch/module/core.js";
12
12
  const O = 100, Y = (n) => ({
13
13
  authorId: (n == null ? void 0 : n.authorId) ?? V(),
14
14
  localVersion: ((n == null ? void 0 : n.localVersion) ?? 0) + 1
@@ -36,7 +36,7 @@ function ie(n, u, A) {
36
36
  }), C = g(() => {
37
37
  const e = Object.entries(o.value.outputs).map(([t, a]) => [t, a && !a.ok ? new G(a.errors) : void 0]);
38
38
  return Object.fromEntries(e);
39
- }), l = N({
39
+ }), l = P({
40
40
  error: "",
41
41
  model: {
42
42
  args: i(o.value.args),
@@ -69,8 +69,8 @@ function ie(n, u, A) {
69
69
  }
70
70
  const d = ((e = s.author) == null ? void 0 : e.authorId) !== ((t = a.author) == null ? void 0 : t.authorId);
71
71
  d || s.isExternalSnapshot ? (r("got external changes, applying them to the snapshot", o.value), $(() => {
72
- o.value = B(o.value, a.value, !1, !1).newDocument, z({ args: o.value.args, ui: o.value.ui }), s.isExternalSnapshot = d;
73
- })) : o.value = B(o.value, a.value).newDocument, await new Promise((S) => setTimeout(S, O));
72
+ o.value = N(o.value, a.value, !1, !1).newDocument, z({ args: o.value.args, ui: o.value.ui }), s.isExternalSnapshot = d;
73
+ })) : o.value = N(o.value, a.value).newDocument, await new Promise((S) => setTimeout(S, O));
74
74
  } catch (a) {
75
75
  X(a) ? (r("patches loop aborted"), h.value = !0) : (b("error in patches loop", a), await new Promise((d) => setTimeout(d, 1e3)));
76
76
  }
@@ -80,7 +80,7 @@ function ie(n, u, A) {
80
80
  cloneUiState: j,
81
81
  cloneNavigationState: I,
82
82
  createArgsModel(e = {}) {
83
- return P({
83
+ return B({
84
84
  get() {
85
85
  return e.transform ? e.transform(o.value.args) : o.value.args;
86
86
  },
@@ -95,7 +95,7 @@ function ie(n, u, A) {
95
95
  * defaultUiState is temporarily here, remove it after implementing initialUiState
96
96
  */
97
97
  createUiModel(e = {}, t) {
98
- return P({
98
+ return B({
99
99
  get() {
100
100
  return e.transform ? e.transform(o.value.ui) : o.value.ui ?? t();
101
101
  },
@@ -159,7 +159,7 @@ function ie(n, u, A) {
159
159
  href: g(() => o.value.navigationState.href),
160
160
  hasErrors: g(() => Object.values(o.value.outputs).some((e) => !(e != null && e.ok)))
161
161
  };
162
- return N(Object.assign(l, F, J));
162
+ return P(Object.assign(l, F, J));
163
163
  }
164
164
  export {
165
165
  ie as createAppV2,