@knowvah/dot-engine 2.0.0 → 2.0.2

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 (50) hide show
  1. package/dist/async/collect.d.ts.map +1 -1
  2. package/dist/async/render-async.d.ts.map +1 -1
  3. package/dist/gvc/device-labels.d.ts +30 -0
  4. package/dist/gvc/device-labels.d.ts.map +1 -0
  5. package/dist/gvc/device-transform.d.ts +22 -0
  6. package/dist/gvc/device-transform.d.ts.map +1 -0
  7. package/dist/gvc/device.d.ts +2 -42
  8. package/dist/gvc/device.d.ts.map +1 -1
  9. package/dist/index.js +174 -137
  10. package/dist/index.js.map +4 -4
  11. package/dist/layout/dot/graph-label.d.ts +10 -0
  12. package/dist/layout/dot/graph-label.d.ts.map +1 -1
  13. package/dist/layout/fdp/normalize.d.ts +2 -1
  14. package/dist/layout/fdp/normalize.d.ts.map +1 -1
  15. package/dist/layout/fdp/xlayout.d.ts +1 -1
  16. package/dist/layout/fdp/xlayout.d.ts.map +1 -1
  17. package/dist/layout/neato/dijkstra.d.ts +0 -32
  18. package/dist/layout/neato/dijkstra.d.ts.map +1 -1
  19. package/dist/layout/neato/fdp-adjust.d.ts +14 -3
  20. package/dist/layout/neato/fdp-adjust.d.ts.map +1 -1
  21. package/dist/layout/neato/index.d.ts +5 -5
  22. package/dist/layout/neato/index.d.ts.map +1 -1
  23. package/dist/layout/neato/sc-adjust.d.ts +2 -9
  24. package/dist/layout/neato/sc-adjust.d.ts.map +1 -1
  25. package/dist/layout/neato/simple-scale.d.ts +15 -0
  26. package/dist/layout/neato/simple-scale.d.ts.map +1 -0
  27. package/dist/layout/sfdp/index.d.ts.map +1 -1
  28. package/dist/render/public.d.ts +5 -0
  29. package/dist/render/public.d.ts.map +1 -1
  30. package/dist/render.js +171 -134
  31. package/dist/render.js.map +4 -4
  32. package/package.json +1 -1
  33. package/src/async/collect.ts +2 -14
  34. package/src/async/render-async.ts +1 -9
  35. package/src/gvc/device-labels.ts +98 -0
  36. package/src/gvc/device-transform.ts +58 -0
  37. package/src/gvc/device.ts +8 -132
  38. package/src/layout/dot/graph-label.ts +6 -1
  39. package/src/layout/fdp/normalize.ts +12 -8
  40. package/src/layout/fdp/xlayout.ts +8 -6
  41. package/src/layout/neato/dijkstra.ts +0 -141
  42. package/src/layout/neato/fdp-adjust.ts +33 -8
  43. package/src/layout/neato/index.ts +13 -12
  44. package/src/layout/neato/sc-adjust.ts +2 -16
  45. package/src/layout/neato/simple-scale.ts +54 -0
  46. package/src/layout/sfdp/index.ts +2 -1
  47. package/src/render/public.ts +6 -5
  48. package/dist/layout/neato/overlap.d.ts +0 -85
  49. package/dist/layout/neato/overlap.d.ts.map +0 -1
  50. package/src/layout/neato/overlap.ts +0 -158
package/dist/render.js CHANGED
@@ -19277,10 +19277,7 @@ function walkNodesAndEdges(g, renderer, job, info) {
19277
19277
  }
19278
19278
  }
19279
19279
 
19280
- // src/gvc/device.ts
19281
- function renderClusterLabel(sg, renderer, job) {
19282
- renderOneLabel(sg.info.label, renderer, job, false);
19283
- }
19280
+ // src/gvc/device-transform.ts
19284
19281
  function transformPoint(p, job) {
19285
19282
  if ((job.flags & GVRENDER_DOES_TRANSFORM) !== 0) {
19286
19283
  return p;
@@ -19300,6 +19297,50 @@ function buildPoint(x, y) {
19300
19297
  const pt = { x, y };
19301
19298
  return pt;
19302
19299
  }
19300
+
19301
+ // src/gvc/device-labels.ts
19302
+ var VALIGN_TOP = "t".charCodeAt(0);
19303
+ var VALIGN_BOTTOM = "b".charCodeAt(0);
19304
+ function labelFirstSpanY(lp) {
19305
+ if (lp.valign === VALIGN_TOP) return lp.pos.y + lp.space.y / 2 - lp.fontsize;
19306
+ if (lp.valign === VALIGN_BOTTOM) {
19307
+ return lp.pos.y - lp.space.y / 2 + lp.dimen.y - lp.fontsize;
19308
+ }
19309
+ return lp.pos.y + lp.dimen.y / 2 - lp.fontsize;
19310
+ }
19311
+ function labelSpanX(lp, just) {
19312
+ if (just === "l") return lp.pos.x - lp.space.x / 2;
19313
+ if (just === "r") return lp.pos.x + lp.space.x / 2;
19314
+ return lp.pos.x;
19315
+ }
19316
+ function renderOneLabel(lp, renderer, job, requireSet = true) {
19317
+ if (!lp) return;
19318
+ if (requireSet && !lp.set) return;
19319
+ if (lp.html) {
19320
+ if (lp.u.kind === "html") {
19321
+ const html = lp.u.html;
19322
+ const pos = lp.pos;
19323
+ withLabelEmitState(job, () => emitHtmlLabel(html, pos, renderer, job));
19324
+ }
19325
+ return;
19326
+ }
19327
+ if (lp.u.kind !== "txt" || lp.u.nspans < 1) return;
19328
+ let y = labelFirstSpanY(lp);
19329
+ for (let i = 0; i < lp.u.nspans; i++) {
19330
+ const span = lp.u.span[i];
19331
+ if (!span) break;
19332
+ gvrenderTextspan(renderer, { x: labelSpanX(lp, span.just), y }, span, job);
19333
+ y -= span.size.y;
19334
+ }
19335
+ }
19336
+ function renderNodeXLabel(n, renderer, job) {
19337
+ renderOneLabel(n.info.xlabel, renderer, job);
19338
+ }
19339
+ function renderClusterLabel(sg, renderer, job) {
19340
+ renderOneLabel(sg.info.label, renderer, job, false);
19341
+ }
19342
+
19343
+ // src/gvc/device.ts
19303
19344
  function labelTextOf2(lp) {
19304
19345
  return lp?.text ?? null;
19305
19346
  }
@@ -19374,43 +19415,6 @@ function renderEdge(e, renderer, job) {
19374
19415
  job.popObj();
19375
19416
  }
19376
19417
  }
19377
- var VALIGN_TOP = "t".charCodeAt(0);
19378
- var VALIGN_BOTTOM = "b".charCodeAt(0);
19379
- function labelFirstSpanY(lp) {
19380
- if (lp.valign === VALIGN_TOP) return lp.pos.y + lp.space.y / 2 - lp.fontsize;
19381
- if (lp.valign === VALIGN_BOTTOM) {
19382
- return lp.pos.y - lp.space.y / 2 + lp.dimen.y - lp.fontsize;
19383
- }
19384
- return lp.pos.y + lp.dimen.y / 2 - lp.fontsize;
19385
- }
19386
- function labelSpanX(lp, just) {
19387
- if (just === "l") return lp.pos.x - lp.space.x / 2;
19388
- if (just === "r") return lp.pos.x + lp.space.x / 2;
19389
- return lp.pos.x;
19390
- }
19391
- function renderOneLabel(lp, renderer, job, requireSet = true) {
19392
- if (!lp) return;
19393
- if (requireSet && !lp.set) return;
19394
- if (lp.html) {
19395
- if (lp.u.kind === "html") {
19396
- const html = lp.u.html;
19397
- const pos = lp.pos;
19398
- withLabelEmitState(job, () => emitHtmlLabel(html, pos, renderer, job));
19399
- }
19400
- return;
19401
- }
19402
- if (lp.u.kind !== "txt" || lp.u.nspans < 1) return;
19403
- let y = labelFirstSpanY(lp);
19404
- for (let i = 0; i < lp.u.nspans; i++) {
19405
- const span = lp.u.span[i];
19406
- if (!span) break;
19407
- gvrenderTextspan(renderer, { x: labelSpanX(lp, span.just), y }, span, job);
19408
- y -= span.size.y;
19409
- }
19410
- }
19411
- function renderNodeXLabel(n, renderer, job) {
19412
- renderOneLabel(n.info.xlabel, renderer, job);
19413
- }
19414
19418
  function renderGraphLabel(g, renderer, job) {
19415
19419
  setHtmlAnchorObj(svgGraphId(g, job), labelTextOf2(g.info.label), job.obj ?? void 0);
19416
19420
  renderOneLabel(g.info.label, renderer, job, false);
@@ -41737,6 +41741,102 @@ function scAdjust(g, equal) {
41737
41741
  return 1;
41738
41742
  }
41739
41743
 
41744
+ // src/layout/neato/simple-scale.ts
41745
+ var ISZERO = (d) => Math.abs(d) < 1e-9;
41746
+ var LF = /^\s*([+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?)/;
41747
+ function scanPair(p) {
41748
+ const m1 = LF.exec(p);
41749
+ if (m1 === null) return [];
41750
+ const rest = p.slice(m1[0].length);
41751
+ if (!rest.startsWith(",")) return [parseFloat(m1[1])];
41752
+ const m2 = LF.exec(rest.slice(1));
41753
+ return m2 === null ? [parseFloat(m1[1])] : [parseFloat(m1[1]), parseFloat(m2[1])];
41754
+ }
41755
+ function simpleScale(g) {
41756
+ const p = aggetGraph(g, "scale");
41757
+ if (p === void 0) return 0;
41758
+ const sc = scanPair(p);
41759
+ if (sc.length === 0) return 0;
41760
+ const x = sc[0];
41761
+ if (ISZERO(x)) return 0;
41762
+ const y = sc.length === 1 ? x : sc[1];
41763
+ if (ISZERO(y)) return 0;
41764
+ if (y === 1 && x === 1) return 0;
41765
+ for (const n of g.nodes.values()) {
41766
+ n.info.pos[0] *= x;
41767
+ n.info.pos[1] *= y;
41768
+ }
41769
+ return 1;
41770
+ }
41771
+
41772
+ // src/layout/fdp/normalize.ts
41773
+ function mapbool5(s) {
41774
+ const t = s.toLowerCase();
41775
+ if (t === "false" || t === "no") return false;
41776
+ if (t === "true" || t === "yes") return true;
41777
+ const v = parseInt(s, 10);
41778
+ return !Number.isNaN(v) && v !== 0;
41779
+ }
41780
+ function angleSet(g) {
41781
+ const a = aggetGraph(g, "normalize");
41782
+ if (a === void 0 || a === "") return null;
41783
+ const ang = parseAngle2(a);
41784
+ if (ang === null) return null;
41785
+ return wrapDegrees(ang) / 180 * Math.PI;
41786
+ }
41787
+ function parseAngle2(a) {
41788
+ const m = /^\s*[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?/.exec(a);
41789
+ if (m !== null) return parseFloat(m[0]);
41790
+ return mapbool5(a) ? 0 : null;
41791
+ }
41792
+ function wrapDegrees(ang) {
41793
+ while (ang > 180) ang -= 360;
41794
+ while (ang <= -180) ang += 360;
41795
+ return ang;
41796
+ }
41797
+ function normalizeG(g) {
41798
+ const phi0 = angleSet(g);
41799
+ if (phi0 === null) return 0;
41800
+ const nodes = [...g.nodes.values()];
41801
+ const first = nodes[0];
41802
+ if (first === void 0) return 0;
41803
+ const px = first.info.pos[0];
41804
+ const py = first.info.pos[1];
41805
+ for (const v of nodes) {
41806
+ v.info.pos[0] -= px;
41807
+ v.info.pos[1] -= py;
41808
+ }
41809
+ const ret = px || py ? 1 : 0;
41810
+ let e = null;
41811
+ for (const v of nodes) {
41812
+ const out = v.outEdges(g);
41813
+ if (out.length > 0) {
41814
+ e = out[0];
41815
+ break;
41816
+ }
41817
+ }
41818
+ if (e === null) return ret;
41819
+ const phi = phi0 - Math.atan2(
41820
+ e.head.info.pos[1] - e.tail.info.pos[1],
41821
+ e.head.info.pos[0] - e.tail.info.pos[0]
41822
+ );
41823
+ if (!phi) return ret;
41824
+ rotateAll(nodes, e.tail, phi);
41825
+ return 1;
41826
+ }
41827
+ function rotateAll(nodes, orig, phi) {
41828
+ const ox = orig.info.pos[0];
41829
+ const oy = orig.info.pos[1];
41830
+ const cosv = Math.cos(phi);
41831
+ const sinv = Math.sin(phi);
41832
+ for (const v of nodes) {
41833
+ const x = v.info.pos[0] - ox;
41834
+ const y = v.info.pos[1] - oy;
41835
+ v.info.pos[0] = x * cosv - y * sinv + ox;
41836
+ v.info.pos[1] = x * sinv + y * cosv + oy;
41837
+ }
41838
+ }
41839
+
41740
41840
  // src/layout/neato/constraint-adjust.ts
41741
41841
  var AM_ORTHO = 5;
41742
41842
  var AM_ORTHO_YX = 6;
@@ -43597,7 +43697,15 @@ var ADJUST_MODES = /* @__PURE__ */ new Map([
43597
43697
  ["porthoxy", [AM_PORTHOXY, "xy pseudo-orthogonal constraints"]],
43598
43698
  ["porthoyx", [AM_PORTHOYX, "yx pseudo-orthogonal constraints"]]
43599
43699
  ]);
43700
+ function warnUnrecognizedOverlap(flag) {
43701
+ if (flag === void 0 || flag === "") return;
43702
+ const s = flag.toLowerCase();
43703
+ if (s.startsWith("prism") || NAMED_MODES.has(s)) return;
43704
+ if (mapBoolDflt(flag, false) === mapBoolDflt(flag, true)) return;
43705
+ console.warn(`Unrecognized overlap value "${flag}" - using false`);
43706
+ }
43600
43707
  function getAdjustMode(flag) {
43708
+ warnUnrecognizedOverlap(flag);
43601
43709
  const ntry = overlapPrismTries(flag);
43602
43710
  if (ntry !== null) return { mode: AM_PRISM, print: "prism", value: ntry };
43603
43711
  const named = ADJUST_MODES.get((flag ?? "").toLowerCase());
@@ -43640,13 +43748,17 @@ function adjustVoronoi(g, am) {
43640
43748
  }
43641
43749
  function removeOverlapWith(g, am) {
43642
43750
  if (g.nodes.size < 2) return 0;
43643
- if (am.mode === AM_NONE) return 0;
43644
- if (am.mode > AM_SCALE) return adjustLate(g, am);
43645
- return am.mode === AM_SCALE ? sAdjustGraph(g) : adjustVoronoi(g, am);
43751
+ const nret = normalizeG(g) + simpleScale(g);
43752
+ if (am.mode === AM_NONE) return nret;
43753
+ if (am.mode > AM_SCALE) return nret + adjustLate(g, am);
43754
+ return nret + (am.mode === AM_SCALE ? sAdjustGraph(g) : adjustVoronoi(g, am));
43646
43755
  }
43647
43756
  function adjustNodesFull(g) {
43648
- const flag = g.attrs.get("overlap") ?? g.root.attrs.get("overlap");
43649
- return removeOverlapWith(g, getAdjustMode(flag));
43757
+ if (g.nodes.size < 2) return 0;
43758
+ return removeOverlapWith(g, graphAdjustMode(g));
43759
+ }
43760
+ function graphAdjustMode(g) {
43761
+ return getAdjustMode(g.attrs.get("overlap") ?? g.root.attrs.get("overlap"));
43650
43762
  }
43651
43763
 
43652
43764
  // src/layout/twopi/init.ts
@@ -44013,8 +44125,8 @@ function parseModel(g) {
44013
44125
  if (!s) return MODEL_SHORTPATH2;
44014
44126
  return MODEL_MAP[s] ?? MODEL_SHORTPATH2;
44015
44127
  }
44016
- function maybeRemoveOverlap(g) {
44017
- adjustNodesFull(g);
44128
+ function maybeRemoveOverlap(g, am) {
44129
+ removeOverlapWith(g, am);
44018
44130
  }
44019
44131
  function neatoLayout(g) {
44020
44132
  graphInit(g, false);
@@ -44029,13 +44141,14 @@ function neatoLayout(g) {
44029
44141
  for (const e of g.edges) initEdgeLabels(e, g, measurer);
44030
44142
  }
44031
44143
  const mode = parseMode(g);
44144
+ const am = graphAdjustMode(g);
44032
44145
  const model = parseModel(g);
44033
44146
  const { graphs: comps, pinned } = neatoPack(g, mode) >= 0 ? pccomps(g, "_neato_cc") : { graphs: [g], pinned: false };
44034
44147
  if (comps.length > 1) {
44035
- layoutComponents(g, comps, mode, model, pinned);
44148
+ layoutComponents(g, comps, { mode, model, am }, pinned);
44036
44149
  } else {
44037
44150
  solveModel2(g, mode, model);
44038
- maybeRemoveOverlap(g);
44151
+ maybeRemoveOverlap(g, am);
44039
44152
  splineEdgesShifted(g);
44040
44153
  }
44041
44154
  addClusters(g);
@@ -44071,11 +44184,11 @@ function addClusters(g) {
44071
44184
  g.info.clust = clusters;
44072
44185
  g.info.n_cluster = clusters.length;
44073
44186
  }
44074
- function layoutComponents(g, comps, mode, model, pinned) {
44187
+ function layoutComponents(g, comps, solve2, pinned) {
44075
44188
  for (const gc of comps) {
44076
44189
  setEdgeTypeFromAttr(gc, EDGETYPE_LINE);
44077
- solveModel2(gc, mode, model);
44078
- maybeRemoveOverlap(gc);
44190
+ solveModel2(gc, solve2.mode, solve2.model);
44191
+ maybeRemoveOverlap(gc, solve2.am);
44079
44192
  splineEdgesShifted(gc);
44080
44193
  }
44081
44194
  const pinfo = {
@@ -44778,71 +44891,6 @@ function fdpTLayout(g, xpms) {
44778
44891
  if (reset2) resetParams();
44779
44892
  }
44780
44893
 
44781
- // src/layout/fdp/normalize.ts
44782
- function mapbool5(s) {
44783
- const t = s.toLowerCase();
44784
- if (t === "false" || t === "no") return false;
44785
- if (t === "true" || t === "yes") return true;
44786
- const v = parseInt(s, 10);
44787
- return !Number.isNaN(v) && v !== 0;
44788
- }
44789
- function angleSet(g) {
44790
- const a = aggetGraph(g, "normalize");
44791
- if (a === void 0 || a === "") return null;
44792
- const ang = parseAngle2(a);
44793
- if (ang === null) return null;
44794
- return wrapDegrees(ang) * (Math.PI / 180);
44795
- }
44796
- function parseAngle2(a) {
44797
- const m = /^-?[\d.]+(?:[eE][-+]?\d+)?/.exec(a);
44798
- if (m !== null) return parseFloat(m[0]);
44799
- return mapbool5(a) ? 0 : null;
44800
- }
44801
- function wrapDegrees(ang) {
44802
- while (ang > 180) ang -= 360;
44803
- while (ang <= -180) ang += 360;
44804
- return ang;
44805
- }
44806
- function normalizeG(g) {
44807
- const phi0 = angleSet(g);
44808
- if (phi0 === null) return;
44809
- const nodes = [...g.nodes.values()];
44810
- const first = nodes[0];
44811
- if (first === void 0) return;
44812
- const px = first.info.pos[0];
44813
- const py = first.info.pos[1];
44814
- for (const v of nodes) {
44815
- v.info.pos[0] -= px;
44816
- v.info.pos[1] -= py;
44817
- }
44818
- let e = null;
44819
- for (const v of nodes) {
44820
- const out = v.outEdges(g);
44821
- if (out.length > 0) {
44822
- e = out[0];
44823
- break;
44824
- }
44825
- }
44826
- if (e === null) return;
44827
- const phi = phi0 - Math.atan2(
44828
- e.head.info.pos[1] - e.tail.info.pos[1],
44829
- e.head.info.pos[0] - e.tail.info.pos[0]
44830
- );
44831
- if (phi) rotateAll(nodes, e.tail, phi);
44832
- }
44833
- function rotateAll(nodes, orig, phi) {
44834
- const ox = orig.info.pos[0];
44835
- const oy = orig.info.pos[1];
44836
- const cosv = Math.cos(phi);
44837
- const sinv = Math.sin(phi);
44838
- for (const v of nodes) {
44839
- const x = v.info.pos[0] - ox;
44840
- const y = v.info.pos[1] - oy;
44841
- v.info.pos[0] = x * cosv - y * sinv + ox;
44842
- v.info.pos[1] = x * sinv + y * cosv + oy;
44843
- }
44844
- }
44845
-
44846
44894
  // src/layout/fdp/xlayout.ts
44847
44895
  var DFLT_OVERLAP = "9:prism";
44848
44896
  var PS2INCH3 = (x) => x / 72;
@@ -45018,7 +45066,9 @@ function fdpXLayout(g, xpms) {
45018
45066
  }
45019
45067
  function removeOverlapAs(g, flag) {
45020
45068
  if (g.nodes.size < 2) return;
45069
+ warnUnrecognizedOverlap(flag);
45021
45070
  normalizeG(g);
45071
+ simpleScale(g);
45022
45072
  const ntry = overlapPrismTries(flag);
45023
45073
  if (ntry !== null) {
45024
45074
  fdpAdjust(g, ntry);
@@ -46167,6 +46217,7 @@ function resolveControl(g) {
46167
46217
  const pad = { x: DFLT_MARGIN / 72, y: DFLT_MARGIN / 72 };
46168
46218
  const overlap5 = aggetGraph(g, "overlap");
46169
46219
  const flag = overlap5 === void 0 ? "prism0" : overlap5;
46220
+ warnUnrecognizedOverlap(flag);
46170
46221
  const ntry = overlapPrismTries(flag);
46171
46222
  if (ntry !== null) {
46172
46223
  ctrl.overlap = ntry;
@@ -55087,16 +55138,9 @@ function collectEdge(acc, e) {
55087
55138
  addLabel(acc, e.attrs.get("headlabel"), lfi);
55088
55139
  addLabel(acc, e.attrs.get("taillabel"), lfi);
55089
55140
  }
55090
- function graphLabelFont(sg) {
55091
- const get = (k) => sg.attrs.get(k) ?? sg.graphDefaultsSnapshot?.get(k);
55092
- return {
55093
- fontname: get("fontname") ?? DEFAULT_FONTNAME,
55094
- fontsize: parseFloat(get("fontsize") ?? "") || DEFAULT_FONTSIZE2
55095
- };
55096
- }
55097
55141
  function collectGraphLabels(acc, sg, root) {
55098
55142
  if (isACluster(sg)) {
55099
- addLabel(acc, sg.attrs.get("label") ?? sg.graphDefaultsSnapshot?.get("label"), graphLabelFont(sg));
55143
+ addLabel(acc, sg.attrs.get("label") ?? sg.graphDefaultsSnapshot?.get("label"), readFontParams(sg));
55100
55144
  }
55101
55145
  for (const child of sg.subgraphs.values()) collectGraphLabels(acc, child, root);
55102
55146
  }
@@ -55156,13 +55200,6 @@ async function loadFonts(fontSet, fonts, timeoutMs) {
55156
55200
 
55157
55201
  // src/async/render-async.ts
55158
55202
  var DEFAULT_FONT_TIMEOUT_MS = 3e3;
55159
- function checkRenderArgs2(g, format, opts) {
55160
- if (typeof g !== "object" || g === null) throw invalidArgType("g", "object", g);
55161
- if (typeof format !== "string") throw invalidArgType("format", "string", format);
55162
- if (opts !== void 0 && (typeof opts !== "object" || opts === null)) {
55163
- throw invalidArgType("opts", "object or undefined", opts);
55164
- }
55165
- }
55166
55203
  function defaultFontSet() {
55167
55204
  const doc = Reflect.get(globalThis, "document");
55168
55205
  if (typeof doc !== "object" || doc === null) return void 0;
@@ -55198,7 +55235,7 @@ async function prefetchAll(g, opts) {
55198
55235
  return { fontIssues, sizes, bytes };
55199
55236
  }
55200
55237
  async function renderAsync(g, format, opts) {
55201
- checkRenderArgs2(g, format, opts);
55238
+ checkRenderArgs(g, format, opts);
55202
55239
  const engine = opts?.engine ?? "dot";
55203
55240
  try {
55204
55241
  const { fontIssues, sizes, bytes } = await prefetchAll(g, opts);