insomni-plot 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +674 -0
- package/README.md +81 -0
- package/dist/core.d.mts +340 -0
- package/dist/core.mjs +1047 -0
- package/dist/index.d.mts +3426 -0
- package/dist/index.mjs +12762 -0
- package/dist/interactions-DEFL_F4E.mjs +5395 -0
- package/dist/range-presets-CzECsu3V.d.mts +1523 -0
- package/package.json +34 -0
- package/src/annotations.d.ts +121 -0
- package/src/annotations.ts +438 -0
- package/src/axis.d.ts +184 -0
- package/src/axis.test.ts +131 -0
- package/src/axis.ts +765 -0
- package/src/colorbar.d.ts +69 -0
- package/src/colorbar.ts +294 -0
- package/src/colors.d.ts +57 -0
- package/src/colors.test.ts +28 -0
- package/src/colors.ts +486 -0
- package/src/core.ts +299 -0
- package/src/format.d.ts +54 -0
- package/src/format.ts +138 -0
- package/src/grammar/accessibility.d.ts +147 -0
- package/src/grammar/accessibility.test.ts +199 -0
- package/src/grammar/accessibility.ts +443 -0
- package/src/grammar/aes.d.ts +35 -0
- package/src/grammar/aes.test.ts +75 -0
- package/src/grammar/aes.ts +120 -0
- package/src/grammar/annotations.d.ts +86 -0
- package/src/grammar/annotations.test.ts +68 -0
- package/src/grammar/annotations.ts +336 -0
- package/src/grammar/attach-brush.d.ts +44 -0
- package/src/grammar/attach-brush.test.ts +214 -0
- package/src/grammar/attach-brush.ts +111 -0
- package/src/grammar/attach-presets.d.ts +33 -0
- package/src/grammar/attach-presets.test.ts +106 -0
- package/src/grammar/attach-presets.ts +215 -0
- package/src/grammar/chart.d.ts +952 -0
- package/src/grammar/chart.test.ts +118 -0
- package/src/grammar/chart.ts +1172 -0
- package/src/grammar/color-utils.d.ts +29 -0
- package/src/grammar/color-utils.test.ts +53 -0
- package/src/grammar/color-utils.ts +66 -0
- package/src/grammar/constants.d.ts +45 -0
- package/src/grammar/constants.ts +61 -0
- package/src/grammar/coord.d.ts +183 -0
- package/src/grammar/coord.test.ts +355 -0
- package/src/grammar/coord.ts +619 -0
- package/src/grammar/data/pivot.d.ts +57 -0
- package/src/grammar/data/pivot.ts +107 -0
- package/src/grammar/emphasis-driver.d.ts +69 -0
- package/src/grammar/emphasis-driver.test.ts +199 -0
- package/src/grammar/emphasis-driver.ts +205 -0
- package/src/grammar/equality.d.ts +3 -0
- package/src/grammar/equality.ts +40 -0
- package/src/grammar/facet.d.ts +63 -0
- package/src/grammar/facet.test.ts +60 -0
- package/src/grammar/facet.ts +175 -0
- package/src/grammar/geoms/_categorical.d.ts +94 -0
- package/src/grammar/geoms/_categorical.ts +0 -0
- package/src/grammar/geoms/_distribution.d.ts +52 -0
- package/src/grammar/geoms/_distribution.ts +125 -0
- package/src/grammar/geoms/_mark.d.ts +69 -0
- package/src/grammar/geoms/_mark.ts +136 -0
- package/src/grammar/geoms/_shape.d.ts +41 -0
- package/src/grammar/geoms/_shape.ts +74 -0
- package/src/grammar/geoms/aggregate.d.ts +95 -0
- package/src/grammar/geoms/aggregate.test.ts +554 -0
- package/src/grammar/geoms/aggregate.ts +840 -0
- package/src/grammar/geoms/area.d.ts +32 -0
- package/src/grammar/geoms/area.test.ts +165 -0
- package/src/grammar/geoms/area.ts +578 -0
- package/src/grammar/geoms/band.d.ts +27 -0
- package/src/grammar/geoms/band.test.ts +57 -0
- package/src/grammar/geoms/band.ts +126 -0
- package/src/grammar/geoms/bar.d.ts +56 -0
- package/src/grammar/geoms/bar.test.ts +367 -0
- package/src/grammar/geoms/bar.ts +1054 -0
- package/src/grammar/geoms/boxplot.d.ts +129 -0
- package/src/grammar/geoms/boxplot.test.ts +299 -0
- package/src/grammar/geoms/boxplot.ts +834 -0
- package/src/grammar/geoms/connected-scatter.d.ts +27 -0
- package/src/grammar/geoms/connected-scatter.test.ts +157 -0
- package/src/grammar/geoms/connected-scatter.ts +63 -0
- package/src/grammar/geoms/emphasis.d.ts +76 -0
- package/src/grammar/geoms/emphasis.test.ts +135 -0
- package/src/grammar/geoms/emphasis.ts +162 -0
- package/src/grammar/geoms/histogram.d.ts +75 -0
- package/src/grammar/geoms/histogram.test.ts +262 -0
- package/src/grammar/geoms/histogram.ts +740 -0
- package/src/grammar/geoms/index.d.ts +20 -0
- package/src/grammar/geoms/index.ts +77 -0
- package/src/grammar/geoms/interval.d.ts +31 -0
- package/src/grammar/geoms/interval.test.ts +154 -0
- package/src/grammar/geoms/interval.ts +342 -0
- package/src/grammar/geoms/line.d.ts +38 -0
- package/src/grammar/geoms/line.test.ts +247 -0
- package/src/grammar/geoms/line.ts +659 -0
- package/src/grammar/geoms/point.d.ts +57 -0
- package/src/grammar/geoms/point.test.ts +163 -0
- package/src/grammar/geoms/point.ts +545 -0
- package/src/grammar/geoms/polar.test.ts +216 -0
- package/src/grammar/geoms/ribbon.d.ts +21 -0
- package/src/grammar/geoms/ribbon.test.ts +170 -0
- package/src/grammar/geoms/ribbon.ts +87 -0
- package/src/grammar/geoms/ridgeline.d.ts +89 -0
- package/src/grammar/geoms/ridgeline.test.ts +247 -0
- package/src/grammar/geoms/ridgeline.ts +1164 -0
- package/src/grammar/geoms/rolling.d.ts +43 -0
- package/src/grammar/geoms/rolling.test.ts +217 -0
- package/src/grammar/geoms/rolling.ts +387 -0
- package/src/grammar/geoms/rug.d.ts +28 -0
- package/src/grammar/geoms/rug.test.ts +126 -0
- package/src/grammar/geoms/rug.ts +214 -0
- package/src/grammar/geoms/rule.d.ts +23 -0
- package/src/grammar/geoms/rule.test.ts +69 -0
- package/src/grammar/geoms/rule.ts +212 -0
- package/src/grammar/geoms/smooth.d.ts +54 -0
- package/src/grammar/geoms/smooth.test.ts +78 -0
- package/src/grammar/geoms/smooth.ts +337 -0
- package/src/grammar/geoms/text.d.ts +29 -0
- package/src/grammar/geoms/text.test.ts +64 -0
- package/src/grammar/geoms/text.ts +234 -0
- package/src/grammar/geoms/tile.d.ts +61 -0
- package/src/grammar/geoms/tile.test.ts +157 -0
- package/src/grammar/geoms/tile.ts +621 -0
- package/src/grammar/geoms/types.d.ts +319 -0
- package/src/grammar/geoms/types.ts +362 -0
- package/src/grammar/geoms/violin.d.ts +85 -0
- package/src/grammar/geoms/violin.test.ts +187 -0
- package/src/grammar/geoms/violin.ts +672 -0
- package/src/grammar/index.d.ts +22 -0
- package/src/grammar/index.ts +269 -0
- package/src/grammar/interactions/_disposable.d.ts +5 -0
- package/src/grammar/interactions/_disposable.ts +23 -0
- package/src/grammar/interactions/_z.d.ts +4 -0
- package/src/grammar/interactions/_z.ts +16 -0
- package/src/grammar/interactions/brush-selection.test.ts +262 -0
- package/src/grammar/interactions/brush.d.ts +63 -0
- package/src/grammar/interactions/brush.test.ts +483 -0
- package/src/grammar/interactions/brush.ts +452 -0
- package/src/grammar/interactions/crosshair.d.ts +19 -0
- package/src/grammar/interactions/crosshair.test.ts +127 -0
- package/src/grammar/interactions/crosshair.ts +76 -0
- package/src/grammar/interactions/hit-layer.d.ts +64 -0
- package/src/grammar/interactions/hit-layer.ts +246 -0
- package/src/grammar/interactions/legend.d.ts +19 -0
- package/src/grammar/interactions/legend.ts +101 -0
- package/src/grammar/interactions/menu.d.ts +93 -0
- package/src/grammar/interactions/menu.test.ts +373 -0
- package/src/grammar/interactions/menu.ts +342 -0
- package/src/grammar/interactions/selection.d.ts +25 -0
- package/src/grammar/interactions/selection.test.ts +289 -0
- package/src/grammar/interactions/selection.ts +142 -0
- package/src/grammar/interactions/series-readout.d.ts +91 -0
- package/src/grammar/interactions/series-readout.test.ts +668 -0
- package/src/grammar/interactions/series-readout.ts +422 -0
- package/src/grammar/interactions/series-snap.d.ts +70 -0
- package/src/grammar/interactions/series-snap.test.ts +214 -0
- package/src/grammar/interactions/series-snap.ts +218 -0
- package/src/grammar/interactions/tooltip-axis.test.ts +176 -0
- package/src/grammar/interactions/tooltip-touch.browser.test.ts +49 -0
- package/src/grammar/interactions/tooltip-touch.test.ts +161 -0
- package/src/grammar/interactions/tooltip.d.ts +140 -0
- package/src/grammar/interactions/tooltip.test.ts +406 -0
- package/src/grammar/interactions/tooltip.ts +622 -0
- package/src/grammar/interactions/transitions.d.ts +34 -0
- package/src/grammar/interactions/transitions.test.ts +172 -0
- package/src/grammar/interactions/transitions.ts +160 -0
- package/src/grammar/layout.d.ts +68 -0
- package/src/grammar/layout.ts +186 -0
- package/src/grammar/legend-merge.test.ts +332 -0
- package/src/grammar/mount.d.ts +78 -0
- package/src/grammar/mount.test.ts +479 -0
- package/src/grammar/mount.ts +2112 -0
- package/src/grammar/palettes.d.ts +54 -0
- package/src/grammar/palettes.test.ts +80 -0
- package/src/grammar/palettes.ts +167 -0
- package/src/grammar/pan-zoom.test.ts +398 -0
- package/src/grammar/phylo.d.ts +65 -0
- package/src/grammar/phylo.test.ts +59 -0
- package/src/grammar/phylo.ts +112 -0
- package/src/grammar/pipeline.auto-ticks.test.ts +40 -0
- package/src/grammar/pipeline.d.ts +158 -0
- package/src/grammar/pipeline.test.ts +463 -0
- package/src/grammar/pipeline.ts +1233 -0
- package/src/grammar/profiling.d.ts +8 -0
- package/src/grammar/profiling.ts +24 -0
- package/src/grammar/scales.d.ts +188 -0
- package/src/grammar/scales.test.ts +181 -0
- package/src/grammar/scales.ts +800 -0
- package/src/grammar/svg.d.ts +3 -0
- package/src/grammar/svg.ts +39 -0
- package/src/grammar/theme.d.ts +261 -0
- package/src/grammar/theme.test.ts +105 -0
- package/src/grammar/theme.ts +490 -0
- package/src/heatmap/cpu.ts +109 -0
- package/src/heatmap/gpu.ts +565 -0
- package/src/heatmap/types.ts +177 -0
- package/src/heatmap.browser.test.ts +308 -0
- package/src/heatmap.test.ts +320 -0
- package/src/heatmap.ts +123 -0
- package/src/index.d.ts +1 -0
- package/src/index.ts +8 -0
- package/src/interactions.d.ts +48 -0
- package/src/interactions.test.ts +226 -0
- package/src/interactions.ts +394 -0
- package/src/layout/box.d.ts +48 -0
- package/src/layout/box.test.ts +107 -0
- package/src/layout/box.ts +143 -0
- package/src/legend.d.ts +115 -0
- package/src/legend.ts +422 -0
- package/src/marks/curve.d.ts +43 -0
- package/src/marks/curve.ts +244 -0
- package/src/marks/stack.d.ts +53 -0
- package/src/marks/stack.ts +184 -0
- package/src/marks.d.ts +273 -0
- package/src/marks.test.ts +541 -0
- package/src/marks.ts +1292 -0
- package/src/navigator.test.ts +174 -0
- package/src/navigator.ts +393 -0
- package/src/range-presets.d.ts +113 -0
- package/src/range-presets.test.ts +345 -0
- package/src/range-presets.ts +349 -0
- package/src/scales.d.ts +98 -0
- package/src/scales.test.ts +103 -0
- package/src/scales.ts +695 -0
- package/src/stats/index.d.ts +200 -0
- package/src/stats/index.test.ts +349 -0
- package/src/stats/index.ts +740 -0
- package/src/stats/regression.d.ts +38 -0
- package/src/stats/regression.test.ts +56 -0
- package/src/stats/regression.ts +396 -0
- package/src/stats/rolling-window.d.ts +55 -0
- package/src/stats/rolling-window.test.ts +237 -0
- package/src/stats/rolling-window.ts +256 -0
- package/src/test-setup.ts +19 -0
- package/src/viewport/axis-state.d.ts +72 -0
- package/src/viewport/axis-state.ts +476 -0
- package/src/viewport.d.ts +170 -0
- package/src/viewport.test.ts +363 -0
- package/src/viewport.ts +510 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
import { describe, expect, it } from "vite-plus/test";
|
|
3
|
+
import { plot } from "./chart.ts";
|
|
4
|
+
import { line, point } from "./geoms/index.ts";
|
|
5
|
+
|
|
6
|
+
interface Sale {
|
|
7
|
+
quarter: string;
|
|
8
|
+
revenue: number;
|
|
9
|
+
region: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const sales: Sale[] = [
|
|
13
|
+
{ quarter: "Q1", revenue: 100, region: "AMER" },
|
|
14
|
+
{ quarter: "Q2", revenue: 120, region: "AMER" },
|
|
15
|
+
{ quarter: "Q3", revenue: 90, region: "EMEA" },
|
|
16
|
+
{ quarter: "Q4", revenue: 140, region: "EMEA" },
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
describe("plot()", () => {
|
|
20
|
+
it("constructs a chart from a spec", () => {
|
|
21
|
+
const chart = plot({ data: sales }).layer(point({ x: "revenue", y: "revenue" }));
|
|
22
|
+
expect(chart).toBeDefined();
|
|
23
|
+
expect(typeof chart.layer).toBe("function");
|
|
24
|
+
expect(typeof chart.toSVG).toBe("function");
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it("is immutable: each builder method returns a new chart", () => {
|
|
28
|
+
const a = plot({ data: sales });
|
|
29
|
+
const b = a.layer(point({ x: "revenue", y: "revenue" }));
|
|
30
|
+
expect(a).not.toBe(b);
|
|
31
|
+
expect(typeof b.layer).toBe("function");
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("renders to SVG without a GPU device", () => {
|
|
35
|
+
const svg = plot({ data: sales, width: 400, height: 300 })
|
|
36
|
+
.layer(point({ x: "revenue", y: "revenue" }))
|
|
37
|
+
.toSVG();
|
|
38
|
+
expect(svg).toBeInstanceOf(SVGSVGElement);
|
|
39
|
+
expect(svg.getAttribute("width")).toBe("400");
|
|
40
|
+
expect(svg.getAttribute("height")).toBe("300");
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("renders multiple layers", () => {
|
|
44
|
+
const chart = plot({ data: sales, width: 400, height: 300 })
|
|
45
|
+
.layer(line({ x: "revenue", y: "revenue" }))
|
|
46
|
+
.layer(point({ x: "revenue", y: "revenue" }));
|
|
47
|
+
const svg = chart.toSVG();
|
|
48
|
+
expect(svg).toBeInstanceOf(SVGSVGElement);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("title/subtitle setters return a new chart", () => {
|
|
52
|
+
const a = plot({ data: sales }).layer(point({ x: "revenue", y: "revenue" }));
|
|
53
|
+
const b = a.title({ title: "Hello", subtitle: "World" });
|
|
54
|
+
expect(a).not.toBe(b);
|
|
55
|
+
const svg = b.toSVG({ width: 400, height: 300 });
|
|
56
|
+
expect(svg).toBeInstanceOf(SVGSVGElement);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it("scale override is applied via .scale()", () => {
|
|
60
|
+
const chart = plot({ data: sales, width: 400, height: 300 })
|
|
61
|
+
.layer(point({ x: "revenue", y: "revenue" }))
|
|
62
|
+
.scale("x", { domain: [0, 200], nice: true });
|
|
63
|
+
expect(chart.toSVG()).toBeInstanceOf(SVGSVGElement);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("mount() throws a clear error when device is missing and no externals supplied", () => {
|
|
67
|
+
// GPU paths can't run under jsdom, but we can verify the input-validation
|
|
68
|
+
// contract: mount() must explain how to fix the missing device, and must
|
|
69
|
+
// NOT silently fall back. (The full mount loop needs a real browser.)
|
|
70
|
+
const canvas = document.createElement("canvas");
|
|
71
|
+
const chart = plot({ data: sales }).layer(point({ x: "revenue", y: "revenue" }));
|
|
72
|
+
expect(() => chart.mount(canvas)).toThrow(/device/i);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it("toSVG renders axis + title text labels as semantic <text>", () => {
|
|
76
|
+
const svg = plot({ data: sales, width: 400, height: 300 })
|
|
77
|
+
.title({ title: "Revenue Report", subtitle: "by region" })
|
|
78
|
+
.layer(point({ x: "revenue", y: "revenue" }))
|
|
79
|
+
.toSVG();
|
|
80
|
+
const texts = svg.getElementsByTagName("text");
|
|
81
|
+
// Axis tick labels + axis structure + title/subtitle all emit <text>.
|
|
82
|
+
expect(texts.length).toBeGreaterThan(0);
|
|
83
|
+
// The title is emitted as ONE element with the whole string (not split).
|
|
84
|
+
const strings = Array.from(texts).map((t) => t.textContent);
|
|
85
|
+
expect(strings).toContain("Revenue Report");
|
|
86
|
+
expect(strings).toContain("by region");
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("toSVG keeps each multi-character tick label in a single <text> (no splitting/merging)", () => {
|
|
90
|
+
const svg = plot({ data: sales, width: 400, height: 300 })
|
|
91
|
+
.layer(point({ x: "revenue", y: "revenue" }))
|
|
92
|
+
.scale("x", { domain: [0, 1000], nice: true })
|
|
93
|
+
.toSVG();
|
|
94
|
+
const strings = Array.from(svg.getElementsByTagName("text")).map((t) => (t.textContent ?? "").trim());
|
|
95
|
+
// At least one tick label is a multi-digit number rendered whole — assert no
|
|
96
|
+
// tick string is a lone leading digit fragment of a longer sibling (the old
|
|
97
|
+
// per-glyph bug split e.g. "1000" → "100"+"0"). Every emitted text node is a
|
|
98
|
+
// complete label, so each appears exactly once and is non-empty.
|
|
99
|
+
expect(strings.some((s) => s.length >= 2)).toBe(true);
|
|
100
|
+
expect(strings.every((s) => s.length > 0)).toBe(true);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("multi-line by color channel splits into one path per category", () => {
|
|
104
|
+
const chart = plot({ data: sales, width: 400, height: 300 }).layer(
|
|
105
|
+
line({ x: "revenue", y: "revenue", color: "region" }),
|
|
106
|
+
);
|
|
107
|
+
const svg = chart.toSVG();
|
|
108
|
+
// SVGRenderer tessellates polylines into triangulated polygons. Two regions
|
|
109
|
+
// → 2 polylines → at least 2 fill colors among emitted polygons.
|
|
110
|
+
const polygons = svg.getElementsByTagName("polygon");
|
|
111
|
+
const fills = new Set<string>();
|
|
112
|
+
for (let i = 0; i < polygons.length; i++) {
|
|
113
|
+
const f = polygons[i]!.getAttribute("fill");
|
|
114
|
+
if (f) fills.add(f);
|
|
115
|
+
}
|
|
116
|
+
expect(fills.size).toBeGreaterThanOrEqual(2);
|
|
117
|
+
});
|
|
118
|
+
});
|