@jbrowse/bandage-core 9.8.1 → 9.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/bubbles/popBubble.js +2 -2
  2. package/dist/bubbles/superbubbles.js +3 -3
  3. package/dist/chunks/{chunk-G3SZWUPA.js → chunk-2NROXCK3.js} +1 -1
  4. package/dist/chunks/{chunk-MAUEPAMG.js → chunk-6PYZYBBF.js} +1 -1
  5. package/dist/chunks/{chunk-VHW7FDHU.js → chunk-A6PSWTLX.js} +1 -1
  6. package/dist/chunks/{chunk-JRADQSGK.js → chunk-BEMPOHHG.js} +13 -13
  7. package/dist/chunks/{chunk-7GBL7SJY.js → chunk-EDASNMLY.js} +1 -1
  8. package/dist/chunks/{chunk-3FVITQAJ.js → chunk-EE37PVQY.js} +2 -2
  9. package/dist/chunks/{chunk-BOHK5BD3.js → chunk-F4BKWWLS.js} +1 -1
  10. package/dist/chunks/{chunk-AM3P3WWO.js → chunk-F5BYHLIN.js} +1 -1
  11. package/dist/chunks/{chunk-ZGRYFUXE.js → chunk-FPTI3WAV.js} +13 -6
  12. package/dist/chunks/chunk-G45YY72K.js +220 -0
  13. package/dist/chunks/{chunk-6N7H22SS.js → chunk-HOZI3FBG.js} +2 -2
  14. package/dist/chunks/{chunk-ST2IBUAN.js → chunk-IGJCTPFB.js} +30 -5
  15. package/dist/chunks/{chunk-Z7UWHVOM.js → chunk-IJRNMO4D.js} +2 -2
  16. package/dist/chunks/{chunk-OCMBULGN.js → chunk-J7YKQ5YW.js} +1 -1
  17. package/dist/chunks/{chunk-ZBWMTXTM.js → chunk-KJEMKHVB.js} +1 -1
  18. package/dist/chunks/{chunk-QMJXHYVQ.js → chunk-MECWJY2R.js} +2 -2
  19. package/dist/chunks/{chunk-EPREHMKU.js → chunk-P6O4RSOQ.js} +2 -2
  20. package/dist/chunks/{chunk-373Y3KUJ.js → chunk-RK3MF4FD.js} +1 -1
  21. package/dist/chunks/{chunk-C55SC5AJ.js → chunk-ROQGMTFB.js} +1 -1
  22. package/dist/chunks/{chunk-3C5UXR2U.js → chunk-TOVOJNT7.js} +1 -1
  23. package/dist/chunks/{chunk-YMMZUMYE.js → chunk-UVZ56CZX.js} +1 -1
  24. package/dist/chunks/{chunk-5QOMIEHX.js → chunk-WVBYR6Y7.js} +2 -2
  25. package/dist/chunks/{chunk-BV64PQ2C.js → chunk-YAN2ZPNV.js} +1 -1
  26. package/dist/chunks/{chunk-BLRJ6IGK.js → chunk-YGN4KL7W.js} +1 -1
  27. package/dist/chunks/{chunk-QG5IVMRS.js → chunk-YS7VA5SI.js} +1 -1
  28. package/dist/chunks/{chunk-XKM5OHQQ.js → chunk-ZBLKAWSD.js} +1 -1
  29. package/dist/cli/figure.js +19 -18
  30. package/dist/cli/fold.js +4 -3
  31. package/dist/figure.js +17 -16
  32. package/dist/figureSettings.js +5 -4
  33. package/dist/gfa/gfaConverter.js +2 -2
  34. package/dist/gfa/gfaTables.js +6 -0
  35. package/dist/index.js +40 -36
  36. package/dist/layout/forceCache.js +5 -4
  37. package/dist/layout/trimToWindow.js +1 -1
  38. package/dist/layout/tubeMapLayout.js +3 -3
  39. package/dist/layout/walkRowDraw.js +5 -5
  40. package/dist/layout/walkRowLayout.js +3 -3
  41. package/dist/layout/walkRows.js +2 -2
  42. package/dist/layout/walkStrip.js +6 -6
  43. package/dist/layoutModes.js +6 -6
  44. package/dist/pathAnchoring.js +1 -1
  45. package/dist/pathColors.js +2 -2
  46. package/dist/pipeline.js +4 -3
  47. package/dist/referenceRampCss.js +4 -4
  48. package/dist/referenceStrip.js +4 -4
  49. package/dist/renderer/GeometryBuilder.js +3 -3
  50. package/dist/tubeMap/bundle.js +4 -4
  51. package/dist/tubeMap/coarsen.js +3 -3
  52. package/dist/tubeMap/draw.js +2 -2
  53. package/dist/tubeMap/nodeColors.js +4 -4
  54. package/dist/types/gfa/gfaTables.d.ts +10 -0
  55. package/dist/types/index.d.ts +1 -0
  56. package/dist/types/version.d.ts +1 -1
  57. package/dist/version.js +1 -1
  58. package/dist/viewport.js +5 -4
  59. package/dist/walkEncoding.js +4 -4
  60. package/dist/walkHighlight.js +5 -5
  61. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  bubbleSubgraph
3
- } from "../chunks/chunk-VHW7FDHU.js";
4
- import "../chunks/chunk-ST2IBUAN.js";
3
+ } from "../chunks/chunk-A6PSWTLX.js";
4
+ import "../chunks/chunk-IGJCTPFB.js";
5
5
  import "../chunks/chunk-BPLIXMH7.js";
6
6
  import "../chunks/chunk-FYQWPEEY.js";
7
7
  export {
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  graphBubbles,
3
3
  superbubblesFromGraph
4
- } from "../chunks/chunk-C55SC5AJ.js";
5
- import "../chunks/chunk-VHW7FDHU.js";
4
+ } from "../chunks/chunk-ROQGMTFB.js";
5
+ import "../chunks/chunk-A6PSWTLX.js";
6
6
  import "../chunks/chunk-EHUBJDDB.js";
7
7
  import "../chunks/chunk-XKWD2RY3.js";
8
8
  import "../chunks/chunk-CLOP7UVD.js";
9
9
  import "../chunks/chunk-FX4RDMDN.js";
10
10
  import "../chunks/chunk-HNQPEMYE.js";
11
- import "../chunks/chunk-ST2IBUAN.js";
11
+ import "../chunks/chunk-IGJCTPFB.js";
12
12
  import "../chunks/chunk-BPLIXMH7.js";
13
13
  import "../chunks/chunk-2CVHXFK7.js";
14
14
  import "../chunks/chunk-CPMHA4W5.js";
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-CWFNEKST.js";
7
7
  import {
8
8
  pathOrigin
9
- } from "./chunk-ST2IBUAN.js";
9
+ } from "./chunk-IGJCTPFB.js";
10
10
 
11
11
  // src/tubeMap/draw.ts
12
12
  import { curvePaths, nodeOutlinePath } from "@jbrowse/tubemap-core";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  pathOrigin
3
- } from "./chunk-ST2IBUAN.js";
3
+ } from "./chunk-IGJCTPFB.js";
4
4
  import {
5
5
  panSNContig,
6
6
  panSNSample
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  trimOrigins
3
- } from "./chunk-ST2IBUAN.js";
3
+ } from "./chunk-IGJCTPFB.js";
4
4
 
5
5
  // src/bubbles/popBubble.ts
6
6
  function bubbleSubgraph(graph, segmentIds) {
@@ -1,22 +1,22 @@
1
+ import {
2
+ svgCanvas
3
+ } from "./chunk-47DYCZOK.js";
1
4
  import {
2
5
  stripGeneGaps,
3
6
  walkStripFrame,
4
7
  walkStripLabelsTree
5
- } from "./chunk-QMJXHYVQ.js";
8
+ } from "./chunk-MECWJY2R.js";
6
9
  import {
7
10
  Canvas2DRenderer
8
11
  } from "./chunk-WBCOREDZ.js";
9
12
  import {
10
13
  layoutGeometryInputs
11
14
  } from "./chunk-LOCJN3BZ.js";
12
- import {
13
- svgCanvas
14
- } from "./chunk-47DYCZOK.js";
15
15
  import {
16
16
  walkRowsKey,
17
17
  walkRowsKeyTree,
18
18
  walkRowsTree
19
- } from "./chunk-EPREHMKU.js";
19
+ } from "./chunk-P6O4RSOQ.js";
20
20
  import {
21
21
  genePins
22
22
  } from "./chunk-BUBZ32IC.js";
@@ -27,14 +27,14 @@ import {
27
27
  } from "./chunk-3S3YVOJ7.js";
28
28
  import {
29
29
  axisScaleOf
30
- } from "./chunk-XKM5OHQQ.js";
30
+ } from "./chunk-ZBLKAWSD.js";
31
31
  import {
32
32
  facetLifts,
33
33
  walkLift
34
- } from "./chunk-3FVITQAJ.js";
34
+ } from "./chunk-EE37PVQY.js";
35
35
  import {
36
36
  encodingStops
37
- } from "./chunk-AM3P3WWO.js";
37
+ } from "./chunk-F5BYHLIN.js";
38
38
  import {
39
39
  rangeText,
40
40
  walkKey
@@ -42,18 +42,18 @@ import {
42
42
  import {
43
43
  buildGeometry,
44
44
  computeReferenceRamp
45
- } from "./chunk-BOHK5BD3.js";
45
+ } from "./chunk-F4BKWWLS.js";
46
46
  import {
47
47
  version
48
- } from "./chunk-YMMZUMYE.js";
48
+ } from "./chunk-UVZ56CZX.js";
49
49
  import {
50
50
  walkRowLabels,
51
51
  walkRowsExtent
52
- } from "./chunk-3C5UXR2U.js";
52
+ } from "./chunk-TOVOJNT7.js";
53
53
  import {
54
54
  pathLegend,
55
55
  walkLabelsOf
56
- } from "./chunk-7GBL7SJY.js";
56
+ } from "./chunk-EDASNMLY.js";
57
57
  import {
58
58
  nodeInk
59
59
  } from "./chunk-PBENCR5L.js";
@@ -91,7 +91,7 @@ import {
91
91
  FIT_PADDING,
92
92
  drawingBounds,
93
93
  fitTransform
94
- } from "./chunk-ZGRYFUXE.js";
94
+ } from "./chunk-FPTI3WAV.js";
95
95
  import {
96
96
  deletionDrawing,
97
97
  deletionEdges
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-3ZZSX5HN.js";
4
4
  import {
5
5
  pathOrigin
6
- } from "./chunk-ST2IBUAN.js";
6
+ } from "./chunk-IGJCTPFB.js";
7
7
  import {
8
8
  isGenericSample
9
9
  } from "./chunk-BPLIXMH7.js";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  encodedColor,
3
3
  resolveEncoding
4
- } from "./chunk-AM3P3WWO.js";
4
+ } from "./chunk-F5BYHLIN.js";
5
5
  import {
6
6
  pathOrigin
7
- } from "./chunk-ST2IBUAN.js";
7
+ } from "./chunk-IGJCTPFB.js";
8
8
  import {
9
9
  panSNContig
10
10
  } from "./chunk-BPLIXMH7.js";
@@ -8,7 +8,7 @@ import {
8
8
  PATH_SATURATION,
9
9
  nameHue,
10
10
  pathHueAt
11
- } from "./chunk-7GBL7SJY.js";
11
+ } from "./chunk-EDASNMLY.js";
12
12
  import {
13
13
  meanDepth,
14
14
  nodeWidthPx
@@ -2,7 +2,7 @@ import {
2
2
  REFERENCE_RAMP_ALT_COLOR,
3
3
  REFERENCE_RAMP_MAX_HUE,
4
4
  hslToRgb
5
- } from "./chunk-BOHK5BD3.js";
5
+ } from "./chunk-F4BKWWLS.js";
6
6
  import {
7
7
  packAbgr
8
8
  } from "./chunk-G2FD7S3C.js";
@@ -6,7 +6,10 @@ import {
6
6
  } from "./chunk-IGVV37VI.js";
7
7
  import {
8
8
  convertGFAToGraph
9
- } from "./chunk-OCMBULGN.js";
9
+ } from "./chunk-J7YKQ5YW.js";
10
+ import {
11
+ gfaTables
12
+ } from "./chunk-G45YY72K.js";
10
13
  import {
11
14
  graphFromTables
12
15
  } from "./chunk-OA7RIMZ2.js";
@@ -20,7 +23,7 @@ import {
20
23
  } from "./chunk-JVLURPFW.js";
21
24
  import {
22
25
  anchorGraph
23
- } from "./chunk-ST2IBUAN.js";
26
+ } from "./chunk-IGJCTPFB.js";
24
27
  import {
25
28
  mergeRuns,
26
29
  splitRuns
@@ -42,11 +45,15 @@ import {
42
45
  } from "./chunk-FYQWPEEY.js";
43
46
 
44
47
  // src/pipeline.ts
48
+ function graphOf(source, name) {
49
+ if (typeof source !== "string") {
50
+ return graphFromTables(source, name);
51
+ }
52
+ const tables = gfaTables(source);
53
+ return tables ? graphFromTables(tables, name) : convertGFAToGraph(parseGFA(source), name);
54
+ }
45
55
  function loadGraph(source, name, opts = {}) {
46
- const graph = anchorGraph(
47
- typeof source === "string" ? convertGFAToGraph(parseGFA(source), name) : graphFromTables(source, name),
48
- opts.referencePath
49
- );
56
+ const graph = anchorGraph(graphOf(source, name), opts.referencePath);
50
57
  if (graph.nodes.length === 0) {
51
58
  throw new Error(`No graph segments in ${name}`);
52
59
  }
@@ -0,0 +1,220 @@
1
+ // src/gfa/gfaTables.ts
2
+ var GT = 62;
3
+ var LT = 60;
4
+ var TAB = 9;
5
+ var ZERO = 48;
6
+ var NINE = 57;
7
+ var TABLE_TAG = /^(?:LN:i|SN:Z|SO:i|SR:i):/;
8
+ var UNTABLED_RECORD = /^[PEOUFG]\t/;
9
+ var trimCR = (line) => line.endsWith("\r") ? line.slice(0, -1) : line;
10
+ var Steps = class {
11
+ constructor() {
12
+ this.nodes = new Int32Array(1 << 16);
13
+ this.reversed = new Uint8Array(1 << 16);
14
+ this.length = 0;
15
+ }
16
+ push(node, reversed) {
17
+ if (this.length === this.nodes.length) {
18
+ const nodes = new Int32Array(this.length * 2);
19
+ nodes.set(this.nodes);
20
+ this.nodes = nodes;
21
+ const rev = new Uint8Array(this.length * 2);
22
+ rev.set(this.reversed);
23
+ this.reversed = rev;
24
+ }
25
+ this.nodes[this.length] = node;
26
+ this.reversed[this.length++] = reversed;
27
+ }
28
+ };
29
+ var SegmentIndex = class {
30
+ constructor() {
31
+ this.names = [];
32
+ this.byName = /* @__PURE__ */ new Map();
33
+ // ids that are plain decimal, so a walk step finds its segment without
34
+ // slicing a string out of the body
35
+ this.byNumber = /* @__PURE__ */ new Map();
36
+ }
37
+ has(name) {
38
+ return this.byName.has(name);
39
+ }
40
+ add(name) {
41
+ const i = this.names.length;
42
+ this.byName.set(name, i);
43
+ this.names.push(name);
44
+ const n = +name;
45
+ if (Number.isSafeInteger(n) && String(n) === name) {
46
+ this.byNumber.set(n, i);
47
+ }
48
+ return i;
49
+ }
50
+ of(name) {
51
+ return this.byName.get(name) ?? this.add(name);
52
+ }
53
+ ofNumber(n) {
54
+ return this.byNumber.get(n);
55
+ }
56
+ };
57
+ function readSegment(line) {
58
+ const [, name, sequence = "*", ...tags] = line.split(" ");
59
+ if (!name || /^\d+$/.test(sequence)) {
60
+ return void 0;
61
+ }
62
+ let length = sequence === "*" ? 0 : sequence.length;
63
+ let refName;
64
+ let start;
65
+ let rank;
66
+ for (const tag of tags) {
67
+ if (!TABLE_TAG.test(tag)) {
68
+ return void 0;
69
+ }
70
+ const value = tag.slice(5);
71
+ const key = tag.slice(0, 2);
72
+ if (key === "LN") {
73
+ length = +value;
74
+ } else if (key === "SN") {
75
+ refName = value;
76
+ } else if (key === "SO") {
77
+ start = +value;
78
+ } else {
79
+ rank = +value;
80
+ }
81
+ }
82
+ const stable = refName !== void 0 && start !== void 0 && rank !== void 0 ? { refName, start, rank } : void 0;
83
+ return { name, length, stable };
84
+ }
85
+ function readWalkBody(line, from, segments, steps) {
86
+ let reversed = 0;
87
+ let start = -1;
88
+ let value = 0;
89
+ let decimal = true;
90
+ const finish = (end) => {
91
+ if (start >= 0 && end > start) {
92
+ const node = decimal && end - start < 16 && (end - start === 1 || line.charCodeAt(start) !== ZERO) ? segments.ofNumber(value) : void 0;
93
+ steps.push(node ?? segments.of(line.slice(start, end)), reversed);
94
+ }
95
+ };
96
+ let i = from;
97
+ for (; i < line.length; i++) {
98
+ const ch = line.charCodeAt(i);
99
+ if (ch === GT || ch === LT) {
100
+ finish(i);
101
+ reversed = ch === LT ? 1 : 0;
102
+ start = i + 1;
103
+ value = 0;
104
+ decimal = true;
105
+ } else if (ch === TAB) {
106
+ break;
107
+ } else if (decimal && ch >= ZERO && ch <= NINE) {
108
+ value = value * 10 + ch - ZERO;
109
+ } else {
110
+ decimal = false;
111
+ }
112
+ }
113
+ finish(i);
114
+ }
115
+ function walkFields(line) {
116
+ const fields = [];
117
+ let at = 0;
118
+ while (fields.length < 6) {
119
+ const tab = line.indexOf(" ", at);
120
+ if (tab === -1) {
121
+ return void 0;
122
+ }
123
+ fields.push(line.slice(at, tab));
124
+ at = tab + 1;
125
+ }
126
+ const [, sample, haplotype, contig, start, end] = fields;
127
+ return sample && haplotype && contig && start && end && at < line.length ? { sample, haplotype, contig, start, end, body: at } : void 0;
128
+ }
129
+ function gfaTables(text) {
130
+ const lines = text.split("\n");
131
+ const segments = new SegmentIndex();
132
+ const lengths = [];
133
+ const refs = [];
134
+ const starts = [];
135
+ const ranks = [];
136
+ const refNames = [];
137
+ const refIndex = /* @__PURE__ */ new Map();
138
+ for (const raw of lines) {
139
+ if (UNTABLED_RECORD.test(raw)) {
140
+ return void 0;
141
+ }
142
+ if (raw.startsWith("S ")) {
143
+ const s = readSegment(trimCR(raw));
144
+ if (!s || segments.has(s.name)) {
145
+ return void 0;
146
+ }
147
+ segments.add(s.name);
148
+ lengths.push(s.length);
149
+ let ref = -1;
150
+ if (s.stable) {
151
+ ref = refIndex.get(s.stable.refName) ?? refNames.length;
152
+ if (ref === refNames.length) {
153
+ refNames.push(s.stable.refName);
154
+ refIndex.set(s.stable.refName, ref);
155
+ }
156
+ }
157
+ refs.push(ref);
158
+ starts.push(s.stable?.start ?? 0);
159
+ ranks.push(s.stable?.rank ?? 0);
160
+ }
161
+ }
162
+ const from = [];
163
+ const to = [];
164
+ const strands = [];
165
+ const names = [];
166
+ const walkStarts = [];
167
+ const walkEnds = [];
168
+ const offsets = [0];
169
+ const steps = new Steps();
170
+ for (const raw of lines) {
171
+ if (raw.startsWith("L ")) {
172
+ const [, source, strand1, target, strand2] = trimCR(raw).split(" ");
173
+ if (source && target && strand2) {
174
+ from.push(segments.of(source));
175
+ to.push(segments.of(target));
176
+ strands.push((strand1 === "-" ? 1 : 0) | (strand2 === "-" ? 2 : 0));
177
+ }
178
+ } else if (raw.startsWith("W ")) {
179
+ const line = trimCR(raw);
180
+ const w = walkFields(line);
181
+ if (w) {
182
+ names.push(`${w.sample}#${w.haplotype}#${w.contig}`);
183
+ walkStarts.push(w.start === "*" ? 0 : +w.start);
184
+ walkEnds.push(w.end === "*" ? -1 : +w.end);
185
+ readWalkBody(line, w.body, segments, steps);
186
+ if (steps.length === offsets.at(-1)) {
187
+ return void 0;
188
+ }
189
+ offsets.push(steps.length);
190
+ }
191
+ }
192
+ }
193
+ return {
194
+ nodes: {
195
+ names: segments.names,
196
+ lengths: Int32Array.from(lengths),
197
+ refs: Int32Array.from(refs),
198
+ starts: Float64Array.from(starts),
199
+ ranks: Int32Array.from(ranks),
200
+ refNames
201
+ },
202
+ links: {
203
+ from: Int32Array.from(from),
204
+ to: Int32Array.from(to),
205
+ strands: Uint8Array.from(strands)
206
+ },
207
+ walks: {
208
+ names,
209
+ starts: Float64Array.from(walkStarts),
210
+ ends: Float64Array.from(walkEnds),
211
+ offsets: Int32Array.from(offsets),
212
+ steps: steps.nodes.slice(0, steps.length),
213
+ reversed: steps.reversed.slice(0, steps.length)
214
+ }
215
+ };
216
+ }
217
+
218
+ export {
219
+ gfaTables
220
+ };
@@ -6,10 +6,10 @@ import {
6
6
  import {
7
7
  pathCssColor,
8
8
  pathGreyCssColor
9
- } from "./chunk-7GBL7SJY.js";
9
+ } from "./chunk-EDASNMLY.js";
10
10
  import {
11
11
  pathOrigin
12
- } from "./chunk-ST2IBUAN.js";
12
+ } from "./chunk-IGJCTPFB.js";
13
13
  import {
14
14
  ownStrand,
15
15
  strandSides
@@ -48,7 +48,7 @@ function chooseReferencePath(anchorPaths, preferred) {
48
48
  return named ?? anchorPaths[0];
49
49
  }
50
50
  var OFF_REFERENCE_RANK = 1;
51
- function anchorNode(node, visits, reference) {
51
+ function anchorNode(node, visits, reference, samplesOf) {
52
52
  let anchored = node;
53
53
  if (visits && visits.length > 0) {
54
54
  const anchor = visits.find((v) => v.path === reference) ?? visits[0];
@@ -60,22 +60,47 @@ function anchorNode(node, visits, reference) {
60
60
  rank: anchor.path === reference ? REFERENCE_RANK : OFF_REFERENCE_RANK,
61
61
  strand: anchor.strand
62
62
  },
63
- samples: [...new Set(visits.map((v) => v.sample))].sort()
63
+ samples: samplesOf(visits)
64
64
  };
65
65
  }
66
66
  return anchored;
67
67
  }
68
+ function sampleSorter(paths) {
69
+ const sorted = [...new Set(paths.map((p) => p.sample))].sort();
70
+ const rank = new Map(sorted.map((sample, i) => [sample, i]));
71
+ const seen = new Uint8Array(sorted.length);
72
+ return (visits) => {
73
+ const ranks = [];
74
+ for (const { sample } of visits) {
75
+ const r = rank.get(sample);
76
+ if (r === void 0) {
77
+ ranks.forEach((r2) => seen[r2] = 0);
78
+ return [...new Set(visits.map((v) => v.sample))].sort();
79
+ }
80
+ if (seen[r] === 0) {
81
+ seen[r] = 1;
82
+ ranks.push(r);
83
+ }
84
+ }
85
+ ranks.forEach((r) => seen[r] = 0);
86
+ return Array.from(Int32Array.from(ranks).sort(), (r) => sorted[r]);
87
+ };
88
+ }
68
89
  function anchorFromPaths(graph, preferred) {
69
90
  const { anchorPaths, pathVisits } = graph;
70
91
  const reference = anchorPaths && pathVisits ? chooseReferencePath(anchorPaths, preferred) : void 0;
71
- return reference && pathVisits ? {
92
+ if (!reference || !anchorPaths || !pathVisits) {
93
+ return graph;
94
+ }
95
+ const samplesOf = sampleSorter(anchorPaths);
96
+ return {
72
97
  ...graph,
73
98
  nodes: graph.nodes.map(
74
- (node) => anchorNode(node, pathVisits.get(node.name), reference.name)
99
+ (node) => anchorNode(node, pathVisits.get(node.name), reference.name, samplesOf)
75
100
  ),
76
101
  anchoredBy: "paths",
77
102
  referencePath: reference.name
78
- } : graph;
103
+ };
79
104
  }
80
105
  function anchorGraph(graph, preferred) {
81
106
  return graph.anchoredBy === "tags" ? graph : anchorFromPaths(graph, preferred);
@@ -6,7 +6,7 @@ import {
6
6
  hasTubeMapPaths,
7
7
  tubeMapLayout,
8
8
  tubeMapReferenceLayout
9
- } from "./chunk-6N7H22SS.js";
9
+ } from "./chunk-HOZI3FBG.js";
10
10
  import {
11
11
  anchoredLayout
12
12
  } from "./chunk-L3O7AWLI.js";
@@ -15,7 +15,7 @@ import {
15
15
  } from "./chunk-HNQPEMYE.js";
16
16
  import {
17
17
  walkRowLayout
18
- } from "./chunk-3C5UXR2U.js";
18
+ } from "./chunk-TOVOJNT7.js";
19
19
  import {
20
20
  isBackbone,
21
21
  isOffReference
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  pathOrigin,
6
6
  surveyPaths
7
- } from "./chunk-ST2IBUAN.js";
7
+ } from "./chunk-IGJCTPFB.js";
8
8
 
9
9
  // src/gfa/gfaConverter.ts
10
10
  function surveySegments(gfaGraph) {
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  computeColorSchemeRange,
3
3
  getNodeColor
4
- } from "./chunk-BOHK5BD3.js";
4
+ } from "./chunk-F4BKWWLS.js";
5
5
  import {
6
6
  abgrToCssRgba
7
7
  } from "./chunk-G2FD7S3C.js";
@@ -2,7 +2,7 @@ import {
2
2
  alongRow,
3
3
  boxesGenes,
4
4
  rowPitch
5
- } from "./chunk-EPREHMKU.js";
5
+ } from "./chunk-P6O4RSOQ.js";
6
6
  import {
7
7
  LABEL_CHAR_PX
8
8
  } from "./chunk-AB35TJST.js";
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-NNODIW4U.js";
12
12
  import {
13
13
  pathOrigin
14
- } from "./chunk-ST2IBUAN.js";
14
+ } from "./chunk-IGJCTPFB.js";
15
15
 
16
16
  // src/layout/walkStrip.ts
17
17
  function walkStripApplies(o) {
@@ -3,10 +3,10 @@ import {
3
3
  RAMP_GRADIENT_STOPS,
4
4
  rampHueCss,
5
5
  rampStops
6
- } from "./chunk-QG5IVMRS.js";
6
+ } from "./chunk-YS7VA5SI.js";
7
7
  import {
8
8
  REFERENCE_RAMP_ALT_CSS
9
- } from "./chunk-BOHK5BD3.js";
9
+ } from "./chunk-F4BKWWLS.js";
10
10
  import {
11
11
  LABEL_CHAR_PX
12
12
  } from "./chunk-AB35TJST.js";
@@ -2,7 +2,7 @@ import {
2
2
  LIFT_BACKDROP_CSS,
3
3
  computeColorSchemeRange,
4
4
  getNodeColor
5
- } from "./chunk-BOHK5BD3.js";
5
+ } from "./chunk-F4BKWWLS.js";
6
6
  import {
7
7
  abgrToCssRgba
8
8
  } from "./chunk-G2FD7S3C.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  bubbleSubgraph
3
- } from "./chunk-VHW7FDHU.js";
3
+ } from "./chunk-A6PSWTLX.js";
4
4
  import {
5
5
  coversGraph
6
6
  } from "./chunk-EHUBJDDB.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  walkRows
3
- } from "./chunk-MAUEPAMG.js";
3
+ } from "./chunk-6PYZYBBF.js";
4
4
  import {
5
5
  ROW_HEIGHT_PX
6
6
  } from "./chunk-CPMHA4W5.js";
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var version = "9.8.1";
2
+ var version = "9.9.0";
3
3
 
4
4
  export {
5
5
  version
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  pathSteps
3
- } from "./chunk-6N7H22SS.js";
3
+ } from "./chunk-HOZI3FBG.js";
4
4
  import {
5
5
  pathOrigin
6
- } from "./chunk-ST2IBUAN.js";
6
+ } from "./chunk-IGJCTPFB.js";
7
7
 
8
8
  // src/tubeMap/bundle.ts
9
9
  function bundleRoutes(graph, groupOf = () => "", merge = true) {
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  engineKey,
3
3
  forceLayout
4
- } from "./chunk-ZGRYFUXE.js";
4
+ } from "./chunk-FPTI3WAV.js";
5
5
 
6
6
  // src/layout/forceCache.ts
7
7
  var DEFAULT_SIZE = 4;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ENGINE_DEFAULTS
3
- } from "./chunk-ZGRYFUXE.js";
3
+ } from "./chunk-FPTI3WAV.js";
4
4
 
5
5
  // src/figureSettings.ts
6
6
  var FIGURE_DEFAULTS = {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  REFERENCE_RAMP_MAX_HUE
3
- } from "./chunk-BOHK5BD3.js";
3
+ } from "./chunk-F4BKWWLS.js";
4
4
 
5
5
  // src/referenceRampCss.ts
6
6
  function rampHueCss(hue) {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  clampZoom
3
- } from "./chunk-ZGRYFUXE.js";
3
+ } from "./chunk-FPTI3WAV.js";
4
4
 
5
5
  // src/viewport.ts
6
6
  function axisScaleOf(scale, pixelRows) {