graphein 0.18.0 → 0.20.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/README.md +24 -0
- package/dist/a11y/apply.d.ts +10 -0
- package/dist/a11y/apply.d.ts.map +1 -0
- package/dist/a11y/apply.js +24 -0
- package/dist/a11y/apply.js.map +7 -0
- package/dist/a11y/describe.d.ts +26 -0
- package/dist/a11y/describe.d.ts.map +1 -0
- package/dist/a11y/describe.js +37 -0
- package/dist/a11y/describe.js.map +7 -0
- package/dist/a11y/index.d.ts +4 -0
- package/dist/a11y/index.d.ts.map +1 -0
- package/dist/a11y/index.js +4 -0
- package/dist/a11y/index.js.map +7 -0
- package/dist/a11y/table.d.ts +18 -0
- package/dist/a11y/table.d.ts.map +1 -0
- package/dist/a11y/table.js +72 -0
- package/dist/a11y/table.js.map +7 -0
- package/dist/analyze/autoInsights.d.ts +22 -0
- package/dist/analyze/autoInsights.d.ts.map +1 -0
- package/dist/analyze/autoInsights.js +63 -0
- package/dist/analyze/autoInsights.js.map +7 -0
- package/dist/analyze/index.d.ts +10 -0
- package/dist/analyze/index.d.ts.map +1 -0
- package/dist/analyze/index.js +6 -0
- package/dist/analyze/index.js.map +7 -0
- package/dist/analyze/insights.d.ts +142 -0
- package/dist/analyze/insights.d.ts.map +1 -0
- package/dist/analyze/insights.js +293 -0
- package/dist/analyze/insights.js.map +7 -0
- package/dist/analyze/recommend.d.ts +40 -0
- package/dist/analyze/recommend.d.ts.map +1 -0
- package/dist/analyze/recommend.js +717 -0
- package/dist/analyze/recommend.js.map +7 -0
- package/dist/analyze/regression.d.ts +26 -0
- package/dist/analyze/regression.d.ts.map +1 -0
- package/dist/analyze/regression.js +21 -0
- package/dist/analyze/regression.js.map +7 -0
- package/dist/analyze/summarize.d.ts +18 -0
- package/dist/analyze/summarize.d.ts.map +1 -0
- package/dist/analyze/summarize.js +122 -0
- package/dist/analyze/summarize.js.map +7 -0
- package/dist/animation/animate.d.ts +14 -0
- package/dist/animation/animate.d.ts.map +1 -0
- package/dist/animation/animate.js +68 -0
- package/dist/animation/animate.js.map +7 -0
- package/dist/animation/easing.d.ts +16 -0
- package/dist/animation/easing.d.ts.map +1 -0
- package/dist/animation/easing.js +116 -0
- package/dist/animation/easing.js.map +7 -0
- package/dist/animation/entrance.d.ts +31 -0
- package/dist/animation/entrance.d.ts.map +1 -0
- package/dist/animation/entrance.js +18 -0
- package/dist/animation/entrance.js.map +7 -0
- package/dist/animation/env.d.ts +2 -0
- package/dist/animation/env.d.ts.map +1 -0
- package/dist/animation/env.js +7 -0
- package/dist/animation/env.js.map +7 -0
- package/dist/animation/index.d.ts +7 -0
- package/dist/animation/index.d.ts.map +1 -0
- package/dist/animation/index.js +7 -0
- package/dist/animation/index.js.map +7 -0
- package/dist/animation/interpolate.d.ts +7 -0
- package/dist/animation/interpolate.d.ts.map +1 -0
- package/dist/animation/interpolate.js +62 -0
- package/dist/animation/interpolate.js.map +7 -0
- package/dist/animation/transition.d.ts +27 -0
- package/dist/animation/transition.d.ts.map +1 -0
- package/dist/animation/transition.js +18 -0
- package/dist/animation/transition.js.map +7 -0
- package/dist/axes/draw.d.ts +16 -0
- package/dist/axes/draw.d.ts.map +1 -0
- package/dist/axes/draw.js +152 -0
- package/dist/axes/draw.js.map +7 -0
- package/dist/axes/index.d.ts +2 -0
- package/dist/axes/index.d.ts.map +1 -0
- package/dist/axes/index.js +2 -0
- package/dist/axes/index.js.map +7 -0
- package/dist/axes/legend.d.ts +5 -0
- package/dist/axes/legend.d.ts.map +1 -0
- package/dist/axes/legend.js +165 -0
- package/dist/axes/legend.js.map +7 -0
- package/dist/axes/overlay.d.ts +5 -0
- package/dist/axes/overlay.d.ts.map +1 -0
- package/dist/axes/overlay.js +130 -0
- package/dist/axes/overlay.js.map +7 -0
- package/dist/axes/text.d.ts +27 -0
- package/dist/axes/text.d.ts.map +1 -0
- package/dist/axes/text.js +60 -0
- package/dist/axes/text.js.map +7 -0
- package/dist/axes/tickLabels.d.ts +40 -0
- package/dist/axes/tickLabels.d.ts.map +1 -0
- package/dist/axes/tickLabels.js +131 -0
- package/dist/axes/tickLabels.js.map +7 -0
- package/dist/axes/title.d.ts +7 -0
- package/dist/axes/title.d.ts.map +1 -0
- package/dist/axes/title.js +151 -0
- package/dist/axes/title.js.map +7 -0
- package/dist/charts/annotations.d.ts +22 -0
- package/dist/charts/annotations.d.ts.map +1 -0
- package/dist/charts/annotations.js +233 -0
- package/dist/charts/annotations.js.map +7 -0
- package/dist/charts/area.d.ts +14 -0
- package/dist/charts/area.d.ts.map +1 -0
- package/dist/charts/area.js +273 -0
- package/dist/charts/area.js.map +7 -0
- package/dist/charts/bar.d.ts +4 -0
- package/dist/charts/bar.d.ts.map +1 -0
- package/dist/charts/bar.js +206 -0
- package/dist/charts/bar.js.map +7 -0
- package/dist/charts/boundary.d.ts +7 -0
- package/dist/charts/boundary.d.ts.map +1 -0
- package/dist/charts/boundary.js +37 -0
- package/dist/charts/boundary.js.map +7 -0
- package/dist/charts/box.d.ts +41 -0
- package/dist/charts/box.d.ts.map +1 -0
- package/dist/charts/box.js +303 -0
- package/dist/charts/box.js.map +7 -0
- package/dist/charts/bullet.d.ts +9 -0
- package/dist/charts/bullet.d.ts.map +1 -0
- package/dist/charts/bullet.js +239 -0
- package/dist/charts/bullet.js.map +7 -0
- package/dist/charts/calendarHeatmap.d.ts +36 -0
- package/dist/charts/calendarHeatmap.d.ts.map +1 -0
- package/dist/charts/calendarHeatmap.js +379 -0
- package/dist/charts/calendarHeatmap.js.map +7 -0
- package/dist/charts/choropleth.d.ts +8 -0
- package/dist/charts/choropleth.d.ts.map +1 -0
- package/dist/charts/choropleth.js +399 -0
- package/dist/charts/choropleth.js.map +7 -0
- package/dist/charts/chrome.d.ts +90 -0
- package/dist/charts/chrome.d.ts.map +1 -0
- package/dist/charts/chrome.js +253 -0
- package/dist/charts/chrome.js.map +7 -0
- package/dist/charts/colorRamp.d.ts +15 -0
- package/dist/charts/colorRamp.d.ts.map +1 -0
- package/dist/charts/colorRamp.js +84 -0
- package/dist/charts/colorRamp.js.map +7 -0
- package/dist/charts/combo.d.ts +16 -0
- package/dist/charts/combo.d.ts.map +1 -0
- package/dist/charts/combo.js +212 -0
- package/dist/charts/combo.js.map +7 -0
- package/dist/charts/condFormat.d.ts +18 -0
- package/dist/charts/condFormat.d.ts.map +1 -0
- package/dist/charts/condFormat.js +88 -0
- package/dist/charts/condFormat.js.map +7 -0
- package/dist/charts/domIds.d.ts +2 -0
- package/dist/charts/domIds.d.ts.map +1 -0
- package/dist/charts/domIds.js +13 -0
- package/dist/charts/domIds.js.map +7 -0
- package/dist/charts/dumbbell.d.ts +8 -0
- package/dist/charts/dumbbell.d.ts.map +1 -0
- package/dist/charts/dumbbell.js +320 -0
- package/dist/charts/dumbbell.js.map +7 -0
- package/dist/charts/emphasis.d.ts +30 -0
- package/dist/charts/emphasis.d.ts.map +1 -0
- package/dist/charts/emphasis.js +27 -0
- package/dist/charts/emphasis.js.map +7 -0
- package/dist/charts/emptyOverlay.d.ts +5 -0
- package/dist/charts/emptyOverlay.d.ts.map +1 -0
- package/dist/charts/emptyOverlay.js +16 -0
- package/dist/charts/emptyOverlay.js.map +7 -0
- package/dist/charts/fill.d.ts +19 -0
- package/dist/charts/fill.d.ts.map +1 -0
- package/dist/charts/fill.js +32 -0
- package/dist/charts/fill.js.map +7 -0
- package/dist/charts/funnel.d.ts +20 -0
- package/dist/charts/funnel.d.ts.map +1 -0
- package/dist/charts/funnel.js +300 -0
- package/dist/charts/funnel.js.map +7 -0
- package/dist/charts/gauge.d.ts +8 -0
- package/dist/charts/gauge.d.ts.map +1 -0
- package/dist/charts/gauge.js +304 -0
- package/dist/charts/gauge.js.map +7 -0
- package/dist/charts/heatmap.d.ts +9 -0
- package/dist/charts/heatmap.d.ts.map +1 -0
- package/dist/charts/heatmap.js +389 -0
- package/dist/charts/heatmap.js.map +7 -0
- package/dist/charts/histogram.d.ts +15 -0
- package/dist/charts/histogram.d.ts.map +1 -0
- package/dist/charts/histogram.js +91 -0
- package/dist/charts/histogram.js.map +7 -0
- package/dist/charts/index.d.ts +101 -0
- package/dist/charts/index.d.ts.map +1 -0
- package/dist/charts/index.js +94 -0
- package/dist/charts/index.js.map +7 -0
- package/dist/charts/kpi.d.ts +24 -0
- package/dist/charts/kpi.d.ts.map +1 -0
- package/dist/charts/kpi.js +782 -0
- package/dist/charts/kpi.js.map +7 -0
- package/dist/charts/labelLayout.d.ts +3 -0
- package/dist/charts/labelLayout.d.ts.map +1 -0
- package/dist/charts/labelLayout.js +25 -0
- package/dist/charts/labelLayout.js.map +7 -0
- package/dist/charts/line.d.ts +8 -0
- package/dist/charts/line.d.ts.map +1 -0
- package/dist/charts/line.js +280 -0
- package/dist/charts/line.js.map +7 -0
- package/dist/charts/matrix.d.ts +7 -0
- package/dist/charts/matrix.d.ts.map +1 -0
- package/dist/charts/matrix.js +379 -0
- package/dist/charts/matrix.js.map +7 -0
- package/dist/charts/noData.d.ts +6 -0
- package/dist/charts/noData.d.ts.map +1 -0
- package/dist/charts/noData.js +17 -0
- package/dist/charts/noData.js.map +7 -0
- package/dist/charts/pie.d.ts +8 -0
- package/dist/charts/pie.d.ts.map +1 -0
- package/dist/charts/pie.js +433 -0
- package/dist/charts/pie.js.map +7 -0
- package/dist/charts/pieLabels.d.ts +84 -0
- package/dist/charts/pieLabels.d.ts.map +1 -0
- package/dist/charts/pieLabels.js +207 -0
- package/dist/charts/pieLabels.js.map +7 -0
- package/dist/charts/pointMarkers.d.ts +22 -0
- package/dist/charts/pointMarkers.d.ts.map +1 -0
- package/dist/charts/pointMarkers.js +38 -0
- package/dist/charts/pointMarkers.js.map +7 -0
- package/dist/charts/sankey.d.ts +44 -0
- package/dist/charts/sankey.d.ts.map +1 -0
- package/dist/charts/sankey.js +656 -0
- package/dist/charts/sankey.js.map +7 -0
- package/dist/charts/scatter.d.ts +11 -0
- package/dist/charts/scatter.d.ts.map +1 -0
- package/dist/charts/scatter.js +147 -0
- package/dist/charts/scatter.js.map +7 -0
- package/dist/charts/slicers/common.d.ts +61 -0
- package/dist/charts/slicers/common.d.ts.map +1 -0
- package/dist/charts/slicers/common.js +142 -0
- package/dist/charts/slicers/common.js.map +7 -0
- package/dist/charts/slicers/dateRange.d.ts +15 -0
- package/dist/charts/slicers/dateRange.d.ts.map +1 -0
- package/dist/charts/slicers/dateRange.js +243 -0
- package/dist/charts/slicers/dateRange.js.map +7 -0
- package/dist/charts/slicers/dropdown.d.ts +14 -0
- package/dist/charts/slicers/dropdown.d.ts.map +1 -0
- package/dist/charts/slicers/dropdown.js +320 -0
- package/dist/charts/slicers/dropdown.js.map +7 -0
- package/dist/charts/slicers/index.d.ts +12 -0
- package/dist/charts/slicers/index.d.ts.map +1 -0
- package/dist/charts/slicers/index.js +27 -0
- package/dist/charts/slicers/index.js.map +7 -0
- package/dist/charts/slicers/list.d.ts +14 -0
- package/dist/charts/slicers/list.d.ts.map +1 -0
- package/dist/charts/slicers/list.js +340 -0
- package/dist/charts/slicers/list.js.map +7 -0
- package/dist/charts/slicers/range.d.ts +14 -0
- package/dist/charts/slicers/range.d.ts.map +1 -0
- package/dist/charts/slicers/range.js +137 -0
- package/dist/charts/slicers/range.js.map +7 -0
- package/dist/charts/slicers/search.d.ts +14 -0
- package/dist/charts/slicers/search.d.ts.map +1 -0
- package/dist/charts/slicers/search.js +105 -0
- package/dist/charts/slicers/search.js.map +7 -0
- package/dist/charts/slope.d.ts +14 -0
- package/dist/charts/slope.d.ts.map +1 -0
- package/dist/charts/slope.js +264 -0
- package/dist/charts/slope.js.map +7 -0
- package/dist/charts/table.d.ts +6 -0
- package/dist/charts/table.d.ts.map +1 -0
- package/dist/charts/table.js +324 -0
- package/dist/charts/table.js.map +7 -0
- package/dist/charts/tableView/canvas.d.ts +3 -0
- package/dist/charts/tableView/canvas.d.ts.map +1 -0
- package/dist/charts/tableView/canvas.js +314 -0
- package/dist/charts/tableView/canvas.js.map +7 -0
- package/dist/charts/tableView/conditional.d.ts +51 -0
- package/dist/charts/tableView/conditional.d.ts.map +1 -0
- package/dist/charts/tableView/conditional.js +285 -0
- package/dist/charts/tableView/conditional.js.map +7 -0
- package/dist/charts/tableView/dom.d.ts +3 -0
- package/dist/charts/tableView/dom.d.ts.map +1 -0
- package/dist/charts/tableView/dom.js +299 -0
- package/dist/charts/tableView/dom.js.map +7 -0
- package/dist/charts/tableView/sketch.d.ts +38 -0
- package/dist/charts/tableView/sketch.d.ts.map +1 -0
- package/dist/charts/tableView/sketch.js +74 -0
- package/dist/charts/tableView/sketch.js.map +7 -0
- package/dist/charts/tableView/types.d.ts +103 -0
- package/dist/charts/tableView/types.d.ts.map +1 -0
- package/dist/charts/tableView/types.js +118 -0
- package/dist/charts/tableView/types.js.map +7 -0
- package/dist/charts/tableView.d.ts +7 -0
- package/dist/charts/tableView.d.ts.map +1 -0
- package/dist/charts/tableView.js +16 -0
- package/dist/charts/tableView.js.map +7 -0
- package/dist/charts/treemap.d.ts +17 -0
- package/dist/charts/treemap.d.ts.map +1 -0
- package/dist/charts/treemap.js +404 -0
- package/dist/charts/treemap.js.map +7 -0
- package/dist/charts/trendline.d.ts +25 -0
- package/dist/charts/trendline.d.ts.map +1 -0
- package/dist/charts/trendline.js +125 -0
- package/dist/charts/trendline.js.map +7 -0
- package/dist/charts/waterfall.d.ts +17 -0
- package/dist/charts/waterfall.d.ts.map +1 -0
- package/dist/charts/waterfall.js +206 -0
- package/dist/charts/waterfall.js.map +7 -0
- package/dist/color/contrast.d.ts +16 -0
- package/dist/color/contrast.d.ts.map +1 -0
- package/dist/color/contrast.js +37 -0
- package/dist/color/contrast.js.map +7 -0
- package/dist/color/convert.d.ts +26 -0
- package/dist/color/convert.d.ts.map +1 -0
- package/dist/color/convert.js +59 -0
- package/dist/color/convert.js.map +7 -0
- package/dist/color/format.d.ts +11 -0
- package/dist/color/format.d.ts.map +1 -0
- package/dist/color/format.js +28 -0
- package/dist/color/format.js.map +7 -0
- package/dist/color/index.d.ts +8 -0
- package/dist/color/index.d.ts.map +1 -0
- package/dist/color/index.js +8 -0
- package/dist/color/index.js.map +7 -0
- package/dist/color/interpolate.d.ts +10 -0
- package/dist/color/interpolate.d.ts.map +1 -0
- package/dist/color/interpolate.js +32 -0
- package/dist/color/interpolate.js.map +7 -0
- package/dist/color/palettes.d.ts +21 -0
- package/dist/color/palettes.d.ts.map +1 -0
- package/dist/color/palettes.js +112 -0
- package/dist/color/palettes.js.map +7 -0
- package/dist/color/parse.d.ts +8 -0
- package/dist/color/parse.d.ts.map +1 -0
- package/dist/color/parse.js +115 -0
- package/dist/color/parse.js.map +7 -0
- package/dist/color/scales.d.ts +23 -0
- package/dist/color/scales.d.ts.map +1 -0
- package/dist/color/scales.js +60 -0
- package/dist/color/scales.js.map +7 -0
- package/dist/decimate/index.d.ts +2 -0
- package/dist/decimate/index.d.ts.map +1 -0
- package/dist/decimate/index.js +6 -0
- package/dist/decimate/index.js.map +7 -0
- package/dist/decimate/lttb.d.ts +29 -0
- package/dist/decimate/lttb.d.ts.map +1 -0
- package/dist/decimate/lttb.js +118 -0
- package/dist/decimate/lttb.js.map +7 -0
- package/dist/format/date.d.ts +14 -0
- package/dist/format/date.d.ts.map +1 -0
- package/dist/format/date.js +81 -0
- package/dist/format/date.js.map +7 -0
- package/dist/format/index.d.ts +26 -0
- package/dist/format/index.d.ts.map +1 -0
- package/dist/format/index.js +53 -0
- package/dist/format/index.js.map +7 -0
- package/dist/format/number.d.ts +29 -0
- package/dist/format/number.d.ts.map +1 -0
- package/dist/format/number.js +122 -0
- package/dist/format/number.js.map +7 -0
- package/dist/index.d.ts +60 -4424
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +239 -21456
- package/dist/index.js.map +7 -1
- package/dist/interaction/cartesian.d.ts +16 -0
- package/dist/interaction/cartesian.d.ts.map +1 -0
- package/dist/interaction/cartesian.js +300 -0
- package/dist/interaction/cartesian.js.map +7 -0
- package/dist/interaction/controller.d.ts +48 -0
- package/dist/interaction/controller.d.ts.map +1 -0
- package/dist/interaction/controller.js +126 -0
- package/dist/interaction/controller.js.map +7 -0
- package/dist/interaction/index.d.ts +16 -0
- package/dist/interaction/index.d.ts.map +1 -0
- package/dist/interaction/index.js +40 -0
- package/dist/interaction/index.js.map +7 -0
- package/dist/interaction/predicate.d.ts +29 -0
- package/dist/interaction/predicate.d.ts.map +1 -0
- package/dist/interaction/predicate.js +132 -0
- package/dist/interaction/predicate.js.map +7 -0
- package/dist/interaction/select.d.ts +37 -0
- package/dist/interaction/select.d.ts.map +1 -0
- package/dist/interaction/select.js +78 -0
- package/dist/interaction/select.js.map +7 -0
- package/dist/interaction/store.d.ts +32 -0
- package/dist/interaction/store.d.ts.map +1 -0
- package/dist/interaction/store.js +99 -0
- package/dist/interaction/store.js.map +7 -0
- package/dist/interaction/tooltip.d.ts +27 -0
- package/dist/interaction/tooltip.d.ts.map +1 -0
- package/dist/interaction/tooltip.js +132 -0
- package/dist/interaction/tooltip.js.map +7 -0
- package/dist/interaction/types.d.ts +85 -0
- package/dist/interaction/types.d.ts.map +1 -0
- package/dist/interaction/types.js +1 -0
- package/dist/interaction/types.js.map +7 -0
- package/dist/internal.d.ts +28 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +21 -0
- package/dist/internal.js.map +7 -0
- package/dist/layout/frame.d.ts +133 -0
- package/dist/layout/frame.d.ts.map +1 -0
- package/dist/layout/frame.js +322 -0
- package/dist/layout/frame.js.map +7 -0
- package/dist/layout/index.d.ts +2 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +2 -0
- package/dist/layout/index.js.map +7 -0
- package/dist/pivot/index.d.ts +2 -0
- package/dist/pivot/index.d.ts.map +1 -0
- package/dist/pivot/index.js +2 -0
- package/dist/pivot/index.js.map +7 -0
- package/dist/pivot/pivot.d.ts +61 -0
- package/dist/pivot/pivot.d.ts.map +1 -0
- package/dist/pivot/pivot.js +447 -0
- package/dist/pivot/pivot.js.map +7 -0
- package/dist/render/canvasLayer.d.ts +24 -0
- package/dist/render/canvasLayer.d.ts.map +1 -0
- package/dist/render/canvasLayer.js +84 -0
- package/dist/render/canvasLayer.js.map +7 -0
- package/dist/render/controls.d.ts +114 -0
- package/dist/render/controls.d.ts.map +1 -0
- package/dist/render/controls.js +467 -0
- package/dist/render/controls.js.map +7 -0
- package/dist/render/dom.d.ts +9 -0
- package/dist/render/dom.d.ts.map +1 -0
- package/dist/render/dom.js +32 -0
- package/dist/render/dom.js.map +7 -0
- package/dist/render/env.d.ts +5 -0
- package/dist/render/env.d.ts.map +1 -0
- package/dist/render/env.js +10 -0
- package/dist/render/env.js.map +7 -0
- package/dist/render/evidence.d.ts +126 -0
- package/dist/render/evidence.d.ts.map +1 -0
- package/dist/render/evidence.js +221 -0
- package/dist/render/evidence.js.map +7 -0
- package/dist/render/fonts.d.ts +23 -0
- package/dist/render/fonts.d.ts.map +1 -0
- package/dist/render/fonts.js +36 -0
- package/dist/render/fonts.js.map +7 -0
- package/dist/render/index.d.ts +9 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +9 -0
- package/dist/render/index.js.map +7 -0
- package/dist/render/labelLedger.d.ts +114 -0
- package/dist/render/labelLedger.d.ts.map +1 -0
- package/dist/render/labelLedger.js +237 -0
- package/dist/render/labelLedger.js.map +7 -0
- package/dist/render/metrics.d.ts +43 -0
- package/dist/render/metrics.d.ts.map +1 -0
- package/dist/render/metrics.js +46 -0
- package/dist/render/metrics.js.map +7 -0
- package/dist/render/overlayText.d.ts +69 -0
- package/dist/render/overlayText.d.ts.map +1 -0
- package/dist/render/overlayText.js +99 -0
- package/dist/render/overlayText.js.map +7 -0
- package/dist/render/sizing.d.ts +31 -0
- package/dist/render/sizing.d.ts.map +1 -0
- package/dist/render/sizing.js +36 -0
- package/dist/render/sizing.js.map +7 -0
- package/dist/render/surface.d.ts +49 -0
- package/dist/render/surface.d.ts.map +1 -0
- package/dist/render/surface.js +107 -0
- package/dist/render/surface.js.map +7 -0
- package/dist/render/text.d.ts +27 -0
- package/dist/render/text.d.ts.map +1 -0
- package/dist/render/text.js +88 -0
- package/dist/render/text.js.map +7 -0
- package/dist/rough/draw.d.ts +93 -0
- package/dist/rough/draw.d.ts.map +1 -0
- package/dist/rough/draw.js +259 -0
- package/dist/rough/draw.js.map +7 -0
- package/dist/rough/geom.d.ts +26 -0
- package/dist/rough/geom.d.ts.map +1 -0
- package/dist/rough/geom.js +82 -0
- package/dist/rough/geom.js.map +7 -0
- package/dist/rough/index.d.ts +10 -0
- package/dist/rough/index.d.ts.map +1 -0
- package/dist/rough/index.js +17 -0
- package/dist/rough/index.js.map +7 -0
- package/dist/rough/rng.d.ts +20 -0
- package/dist/rough/rng.d.ts.map +1 -0
- package/dist/rough/rng.js +22 -0
- package/dist/rough/rng.js.map +7 -0
- package/dist/rough/types.d.ts +41 -0
- package/dist/rough/types.d.ts.map +1 -0
- package/dist/rough/types.js +13 -0
- package/dist/rough/types.js.map +7 -0
- package/dist/runtime/cartesian.d.ts +138 -0
- package/dist/runtime/cartesian.d.ts.map +1 -0
- package/dist/runtime/cartesian.js +528 -0
- package/dist/runtime/cartesian.js.map +7 -0
- package/dist/runtime/categories.d.ts +11 -0
- package/dist/runtime/categories.d.ts.map +1 -0
- package/dist/runtime/categories.js +45 -0
- package/dist/runtime/categories.js.map +7 -0
- package/dist/runtime/chartAnimation.d.ts +45 -0
- package/dist/runtime/chartAnimation.d.ts.map +1 -0
- package/dist/runtime/chartAnimation.js +119 -0
- package/dist/runtime/chartAnimation.js.map +7 -0
- package/dist/runtime/chartRuntime.d.ts +88 -0
- package/dist/runtime/chartRuntime.d.ts.map +1 -0
- package/dist/runtime/chartRuntime.js +597 -0
- package/dist/runtime/chartRuntime.js.map +7 -0
- package/dist/runtime/combo.d.ts +56 -0
- package/dist/runtime/combo.d.ts.map +1 -0
- package/dist/runtime/combo.js +450 -0
- package/dist/runtime/combo.js.map +7 -0
- package/dist/runtime/dashboard.d.ts +58 -0
- package/dist/runtime/dashboard.d.ts.map +1 -0
- package/dist/runtime/dashboard.js +21 -0
- package/dist/runtime/dashboard.js.map +7 -0
- package/dist/runtime/dashboardChrome.d.ts +20 -0
- package/dist/runtime/dashboardChrome.d.ts.map +1 -0
- package/dist/runtime/dashboardChrome.js +49 -0
- package/dist/runtime/dashboardChrome.js.map +7 -0
- package/dist/runtime/dashboardDom.d.ts +7 -0
- package/dist/runtime/dashboardDom.d.ts.map +1 -0
- package/dist/runtime/dashboardDom.js +595 -0
- package/dist/runtime/dashboardDom.js.map +7 -0
- package/dist/runtime/dashboardHeadless.d.ts +14 -0
- package/dist/runtime/dashboardHeadless.d.ts.map +1 -0
- package/dist/runtime/dashboardHeadless.js +8 -0
- package/dist/runtime/dashboardHeadless.js.map +7 -0
- package/dist/runtime/dashboardLayout.d.ts +18 -0
- package/dist/runtime/dashboardLayout.d.ts.map +1 -0
- package/dist/runtime/dashboardLayout.js +18 -0
- package/dist/runtime/dashboardLayout.js.map +7 -0
- package/dist/runtime/dashboardPlacement.d.ts +54 -0
- package/dist/runtime/dashboardPlacement.d.ts.map +1 -0
- package/dist/runtime/dashboardPlacement.js +206 -0
- package/dist/runtime/dashboardPlacement.js.map +7 -0
- package/dist/runtime/dashboardSelection.d.ts +23 -0
- package/dist/runtime/dashboardSelection.d.ts.map +1 -0
- package/dist/runtime/dashboardSelection.js +77 -0
- package/dist/runtime/dashboardSelection.js.map +7 -0
- package/dist/runtime/debug.d.ts +48 -0
- package/dist/runtime/debug.d.ts.map +1 -0
- package/dist/runtime/debug.js +384 -0
- package/dist/runtime/debug.js.map +7 -0
- package/dist/runtime/diagnostics.d.ts +56 -0
- package/dist/runtime/diagnostics.d.ts.map +1 -0
- package/dist/runtime/diagnostics.js +59 -0
- package/dist/runtime/diagnostics.js.map +7 -0
- package/dist/runtime/draft.d.ts +95 -0
- package/dist/runtime/draft.d.ts.map +1 -0
- package/dist/runtime/draft.js +112 -0
- package/dist/runtime/draft.js.map +7 -0
- package/dist/runtime/dumbbell.d.ts +46 -0
- package/dist/runtime/dumbbell.d.ts.map +1 -0
- package/dist/runtime/dumbbell.js +116 -0
- package/dist/runtime/dumbbell.js.map +7 -0
- package/dist/runtime/facet.d.ts +74 -0
- package/dist/runtime/facet.d.ts.map +1 -0
- package/dist/runtime/facet.js +354 -0
- package/dist/runtime/facet.js.map +7 -0
- package/dist/runtime/headless.d.ts +54 -0
- package/dist/runtime/headless.d.ts.map +1 -0
- package/dist/runtime/headless.js +159 -0
- package/dist/runtime/headless.js.map +7 -0
- package/dist/runtime/headlessDashboardRenderer.d.ts +14 -0
- package/dist/runtime/headlessDashboardRenderer.d.ts.map +1 -0
- package/dist/runtime/headlessDashboardRenderer.js +484 -0
- package/dist/runtime/headlessDashboardRenderer.js.map +7 -0
- package/dist/runtime/histogram.d.ts +49 -0
- package/dist/runtime/histogram.d.ts.map +1 -0
- package/dist/runtime/histogram.js +162 -0
- package/dist/runtime/histogram.js.map +7 -0
- package/dist/runtime/index.d.ts +14 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +14 -0
- package/dist/runtime/index.js.map +7 -0
- package/dist/runtime/inspect.d.ts +57 -0
- package/dist/runtime/inspect.d.ts.map +1 -0
- package/dist/runtime/inspect.js +83 -0
- package/dist/runtime/inspect.js.map +7 -0
- package/dist/runtime/quality.d.ts +54 -0
- package/dist/runtime/quality.d.ts.map +1 -0
- package/dist/runtime/quality.js +359 -0
- package/dist/runtime/quality.js.map +7 -0
- package/dist/runtime/qualityTarget.d.ts +9 -0
- package/dist/runtime/qualityTarget.d.ts.map +1 -0
- package/dist/runtime/qualityTarget.js +120 -0
- package/dist/runtime/qualityTarget.js.map +7 -0
- package/dist/runtime/render.d.ts +91 -0
- package/dist/runtime/render.d.ts.map +1 -0
- package/dist/runtime/render.js +14 -0
- package/dist/runtime/render.js.map +7 -0
- package/dist/runtime/report/build.d.ts +7 -0
- package/dist/runtime/report/build.d.ts.map +1 -0
- package/dist/runtime/report/build.js +180 -0
- package/dist/runtime/report/build.js.map +7 -0
- package/dist/runtime/report/cartesian.d.ts +37 -0
- package/dist/runtime/report/cartesian.d.ts.map +1 -0
- package/dist/runtime/report/cartesian.js +283 -0
- package/dist/runtime/report/cartesian.js.map +7 -0
- package/dist/runtime/report/constants.d.ts +18 -0
- package/dist/runtime/report/constants.d.ts.map +1 -0
- package/dist/runtime/report/constants.js +22 -0
- package/dist/runtime/report/constants.js.map +7 -0
- package/dist/runtime/report/dashboard.d.ts +17 -0
- package/dist/runtime/report/dashboard.d.ts.map +1 -0
- package/dist/runtime/report/dashboard.js +81 -0
- package/dist/runtime/report/dashboard.js.map +7 -0
- package/dist/runtime/report/evidence.d.ts +4 -0
- package/dist/runtime/report/evidence.d.ts.map +1 -0
- package/dist/runtime/report/evidence.js +47 -0
- package/dist/runtime/report/evidence.js.map +7 -0
- package/dist/runtime/report/text.d.ts +15 -0
- package/dist/runtime/report/text.d.ts.map +1 -0
- package/dist/runtime/report/text.js +208 -0
- package/dist/runtime/report/text.js.map +7 -0
- package/dist/runtime/report/types.d.ts +92 -0
- package/dist/runtime/report/types.d.ts.map +1 -0
- package/dist/runtime/report/types.js +1 -0
- package/dist/runtime/report/types.js.map +7 -0
- package/dist/runtime/report/utils.d.ts +6 -0
- package/dist/runtime/report/utils.d.ts.map +1 -0
- package/dist/runtime/report/utils.js +27 -0
- package/dist/runtime/report/utils.js.map +7 -0
- package/dist/runtime/report.d.ts +27 -0
- package/dist/runtime/report.d.ts.map +1 -0
- package/dist/runtime/report.js +17 -0
- package/dist/runtime/report.js.map +7 -0
- package/dist/runtime/resolve.d.ts +27 -0
- package/dist/runtime/resolve.d.ts.map +1 -0
- package/dist/runtime/resolve.js +109 -0
- package/dist/runtime/resolve.js.map +7 -0
- package/dist/runtime/runtimeShared.d.ts +37 -0
- package/dist/runtime/runtimeShared.d.ts.map +1 -0
- package/dist/runtime/runtimeShared.js +110 -0
- package/dist/runtime/runtimeShared.js.map +7 -0
- package/dist/runtime/slope.d.ts +46 -0
- package/dist/runtime/slope.d.ts.map +1 -0
- package/dist/runtime/slope.js +210 -0
- package/dist/runtime/slope.js.map +7 -0
- package/dist/runtime/waterfall.d.ts +76 -0
- package/dist/runtime/waterfall.d.ts.map +1 -0
- package/dist/runtime/waterfall.js +239 -0
- package/dist/runtime/waterfall.js.map +7 -0
- package/dist/runtime/wire.d.ts +30 -0
- package/dist/runtime/wire.d.ts.map +1 -0
- package/dist/runtime/wire.js +194 -0
- package/dist/runtime/wire.js.map +7 -0
- package/dist/scales/band.d.ts +17 -0
- package/dist/scales/band.d.ts.map +1 -0
- package/dist/scales/band.js +80 -0
- package/dist/scales/band.js.map +7 -0
- package/dist/scales/continuous.d.ts +12 -0
- package/dist/scales/continuous.d.ts.map +1 -0
- package/dist/scales/continuous.js +45 -0
- package/dist/scales/continuous.js.map +7 -0
- package/dist/scales/format.d.ts +3 -0
- package/dist/scales/format.d.ts.map +1 -0
- package/dist/scales/format.js +24 -0
- package/dist/scales/format.js.map +7 -0
- package/dist/scales/index.d.ts +10 -0
- package/dist/scales/index.d.ts.map +1 -0
- package/dist/scales/index.js +12 -0
- package/dist/scales/index.js.map +7 -0
- package/dist/scales/linear.d.ts +8 -0
- package/dist/scales/linear.d.ts.map +1 -0
- package/dist/scales/linear.js +22 -0
- package/dist/scales/linear.js.map +7 -0
- package/dist/scales/log.d.ts +9 -0
- package/dist/scales/log.d.ts.map +1 -0
- package/dist/scales/log.js +153 -0
- package/dist/scales/log.js.map +7 -0
- package/dist/scales/time.d.ts +8 -0
- package/dist/scales/time.d.ts.map +1 -0
- package/dist/scales/time.js +24 -0
- package/dist/scales/time.js.map +7 -0
- package/dist/scales/types.d.ts +24 -0
- package/dist/scales/types.d.ts.map +1 -0
- package/dist/scales/types.js +1 -0
- package/dist/scales/types.js.map +7 -0
- package/dist/shape/arc.d.ts +18 -0
- package/dist/shape/arc.d.ts.map +1 -0
- package/dist/shape/arc.js +51 -0
- package/dist/shape/arc.js.map +7 -0
- package/dist/shape/area.d.ts +12 -0
- package/dist/shape/area.d.ts.map +1 -0
- package/dist/shape/area.js +49 -0
- package/dist/shape/area.js.map +7 -0
- package/dist/shape/curves.d.ts +11 -0
- package/dist/shape/curves.d.ts.map +1 -0
- package/dist/shape/curves.js +123 -0
- package/dist/shape/curves.js.map +7 -0
- package/dist/shape/index.d.ts +7 -0
- package/dist/shape/index.d.ts.map +1 -0
- package/dist/shape/index.js +27 -0
- package/dist/shape/index.js.map +7 -0
- package/dist/shape/line.d.ts +8 -0
- package/dist/shape/line.d.ts.map +1 -0
- package/dist/shape/line.js +26 -0
- package/dist/shape/line.js.map +7 -0
- package/dist/shape/roundedRect.d.ts +3 -0
- package/dist/shape/roundedRect.d.ts.map +1 -0
- package/dist/shape/roundedRect.js +52 -0
- package/dist/shape/roundedRect.js.map +7 -0
- package/dist/shape/sink.d.ts +9 -0
- package/dist/shape/sink.d.ts.map +1 -0
- package/dist/shape/sink.js +1 -0
- package/dist/shape/sink.js.map +7 -0
- package/dist/spec/chartDefinitions.d.ts +57 -0
- package/dist/spec/chartDefinitions.d.ts.map +1 -0
- package/dist/spec/chartDefinitions.js +55 -0
- package/dist/spec/chartDefinitions.js.map +7 -0
- package/dist/spec/dashboard.d.ts +161 -0
- package/dist/spec/dashboard.d.ts.map +1 -0
- package/dist/spec/dashboard.js +1 -0
- package/dist/spec/dashboard.js.map +7 -0
- package/dist/spec/index.d.ts +12 -0
- package/dist/spec/index.d.ts.map +1 -0
- package/dist/spec/index.js +12 -0
- package/dist/spec/index.js.map +7 -0
- package/dist/spec/infer.d.ts +11 -0
- package/dist/spec/infer.d.ts.map +1 -0
- package/dist/spec/infer.js +20 -0
- package/dist/spec/infer.js.map +7 -0
- package/dist/spec/jsonpatch.d.ts +28 -0
- package/dist/spec/jsonpatch.d.ts.map +1 -0
- package/dist/spec/jsonpatch.js +100 -0
- package/dist/spec/jsonpatch.js.map +7 -0
- package/dist/spec/lint.d.ts +24 -0
- package/dist/spec/lint.d.ts.map +1 -0
- package/dist/spec/lint.js +175 -0
- package/dist/spec/lint.js.map +7 -0
- package/dist/spec/repair.d.ts +48 -0
- package/dist/spec/repair.d.ts.map +1 -0
- package/dist/spec/repair.js +131 -0
- package/dist/spec/repair.js.map +7 -0
- package/dist/spec/selection.d.ts +104 -0
- package/dist/spec/selection.d.ts.map +1 -0
- package/dist/spec/selection.js +1 -0
- package/dist/spec/selection.js.map +7 -0
- package/dist/spec/sketch.d.ts +22 -0
- package/dist/spec/sketch.d.ts.map +1 -0
- package/dist/spec/sketch.js +26 -0
- package/dist/spec/sketch.js.map +7 -0
- package/dist/spec/suggest.d.ts +19 -0
- package/dist/spec/suggest.d.ts.map +1 -0
- package/dist/spec/suggest.js +52 -0
- package/dist/spec/suggest.js.map +7 -0
- package/dist/spec/templates.d.ts +63 -0
- package/dist/spec/templates.d.ts.map +1 -0
- package/dist/spec/templates.js +621 -0
- package/dist/spec/templates.js.map +7 -0
- package/dist/spec/transform/aggregate.d.ts +10 -0
- package/dist/spec/transform/aggregate.d.ts.map +1 -0
- package/dist/spec/transform/aggregate.js +40 -0
- package/dist/spec/transform/aggregate.js.map +7 -0
- package/dist/spec/transform/apply.d.ts +12 -0
- package/dist/spec/transform/apply.d.ts.map +1 -0
- package/dist/spec/transform/apply.js +28 -0
- package/dist/spec/transform/apply.js.map +7 -0
- package/dist/spec/transform/bin.d.ts +28 -0
- package/dist/spec/transform/bin.d.ts.map +1 -0
- package/dist/spec/transform/bin.js +71 -0
- package/dist/spec/transform/bin.js.map +7 -0
- package/dist/spec/transform/calculate.d.ts +9 -0
- package/dist/spec/transform/calculate.d.ts.map +1 -0
- package/dist/spec/transform/calculate.js +10 -0
- package/dist/spec/transform/calculate.js.map +7 -0
- package/dist/spec/transform/expr/error.d.ts +7 -0
- package/dist/spec/transform/expr/error.d.ts.map +1 -0
- package/dist/spec/transform/expr/error.js +16 -0
- package/dist/spec/transform/expr/error.js.map +7 -0
- package/dist/spec/transform/expr/evaluate.d.ts +14 -0
- package/dist/spec/transform/expr/evaluate.d.ts.map +1 -0
- package/dist/spec/transform/expr/evaluate.js +163 -0
- package/dist/spec/transform/expr/evaluate.js.map +7 -0
- package/dist/spec/transform/expr/index.d.ts +22 -0
- package/dist/spec/transform/expr/index.d.ts.map +1 -0
- package/dist/spec/transform/expr/index.js +109 -0
- package/dist/spec/transform/expr/index.js.map +7 -0
- package/dist/spec/transform/expr/parse.d.ts +70 -0
- package/dist/spec/transform/expr/parse.d.ts.map +1 -0
- package/dist/spec/transform/expr/parse.js +199 -0
- package/dist/spec/transform/expr/parse.js.map +7 -0
- package/dist/spec/transform/expr/tokenize.d.ts +18 -0
- package/dist/spec/transform/expr/tokenize.d.ts.map +1 -0
- package/dist/spec/transform/expr/tokenize.js +88 -0
- package/dist/spec/transform/expr/tokenize.js.map +7 -0
- package/dist/spec/transform/filter.d.ts +12 -0
- package/dist/spec/transform/filter.d.ts.map +1 -0
- package/dist/spec/transform/filter.js +115 -0
- package/dist/spec/transform/filter.js.map +7 -0
- package/dist/spec/transform/fold.d.ts +10 -0
- package/dist/spec/transform/fold.d.ts.map +1 -0
- package/dist/spec/transform/fold.js +14 -0
- package/dist/spec/transform/fold.js.map +7 -0
- package/dist/spec/transform/index.d.ts +17 -0
- package/dist/spec/transform/index.d.ts.map +1 -0
- package/dist/spec/transform/index.js +27 -0
- package/dist/spec/transform/index.js.map +7 -0
- package/dist/spec/transform/timeUnit.d.ts +11 -0
- package/dist/spec/transform/timeUnit.d.ts.map +1 -0
- package/dist/spec/transform/timeUnit.js +43 -0
- package/dist/spec/transform/timeUnit.js.map +7 -0
- package/dist/spec/transform/types.d.ts +141 -0
- package/dist/spec/transform/types.d.ts.map +1 -0
- package/dist/spec/transform/types.js +16 -0
- package/dist/spec/transform/types.js.map +7 -0
- package/dist/spec/types.d.ts +1067 -0
- package/dist/spec/types.d.ts.map +1 -0
- package/dist/spec/types.js +41 -0
- package/dist/spec/types.js.map +7 -0
- package/dist/spec/validate/charts.d.ts +11 -0
- package/dist/spec/validate/charts.d.ts.map +1 -0
- package/dist/spec/validate/charts.js +416 -0
- package/dist/spec/validate/charts.js.map +7 -0
- package/dist/spec/validate/chrome.d.ts +4 -0
- package/dist/spec/validate/chrome.d.ts.map +1 -0
- package/dist/spec/validate/chrome.js +45 -0
- package/dist/spec/validate/chrome.js.map +7 -0
- package/dist/spec/validate/common.d.ts +101 -0
- package/dist/spec/validate/common.d.ts.map +1 -0
- package/dist/spec/validate/common.js +47 -0
- package/dist/spec/validate/common.js.map +7 -0
- package/dist/spec/validate/conditional.d.ts +8 -0
- package/dist/spec/validate/conditional.d.ts.map +1 -0
- package/dist/spec/validate/conditional.js +89 -0
- package/dist/spec/validate/conditional.js.map +7 -0
- package/dist/spec/validate/dashboard.d.ts +9 -0
- package/dist/spec/validate/dashboard.d.ts.map +1 -0
- package/dist/spec/validate/dashboard.js +183 -0
- package/dist/spec/validate/dashboard.js.map +7 -0
- package/dist/spec/validate/fieldDef.d.ts +14 -0
- package/dist/spec/validate/fieldDef.d.ts.map +1 -0
- package/dist/spec/validate/fieldDef.js +137 -0
- package/dist/spec/validate/fieldDef.js.map +7 -0
- package/dist/spec/validate/interaction.d.ts +10 -0
- package/dist/spec/validate/interaction.d.ts.map +1 -0
- package/dist/spec/validate/interaction.js +92 -0
- package/dist/spec/validate/interaction.js.map +7 -0
- package/dist/spec/validate/overlays.d.ts +28 -0
- package/dist/spec/validate/overlays.d.ts.map +1 -0
- package/dist/spec/validate/overlays.js +110 -0
- package/dist/spec/validate/overlays.js.map +7 -0
- package/dist/spec/validate/spec.d.ts +25 -0
- package/dist/spec/validate/spec.d.ts.map +1 -0
- package/dist/spec/validate/spec.js +141 -0
- package/dist/spec/validate/spec.js.map +7 -0
- package/dist/spec/validate/transform.d.ts +12 -0
- package/dist/spec/validate/transform.d.ts.map +1 -0
- package/dist/spec/validate/transform.js +168 -0
- package/dist/spec/validate/transform.js.map +7 -0
- package/dist/spec/validate.d.ts +3 -0
- package/dist/spec/validate.d.ts.map +1 -0
- package/dist/spec/validate.data.d.ts +5 -0
- package/dist/spec/validate.data.d.ts.map +1 -0
- package/dist/spec/validate.data.js +91 -0
- package/dist/spec/validate.data.js.map +7 -0
- package/dist/spec/validate.js +7 -0
- package/dist/spec/validate.js.map +7 -0
- package/dist/theme/fonts/patrickHand.d.ts +13 -0
- package/dist/theme/fonts/patrickHand.d.ts.map +1 -0
- package/dist/theme/fonts/patrickHand.js +7 -0
- package/dist/theme/fonts/patrickHand.js.map +7 -0
- package/dist/theme/index.d.ts +3 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +3 -0
- package/dist/theme/index.js.map +7 -0
- package/dist/theme/sketch.d.ts +26 -0
- package/dist/theme/sketch.d.ts.map +1 -0
- package/dist/theme/sketch.js +49 -0
- package/dist/theme/sketch.js.map +7 -0
- package/dist/theme/tokens.d.ts +112 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/tokens.js +176 -0
- package/dist/theme/tokens.js.map +7 -0
- package/dist/ticks/index.d.ts +3 -0
- package/dist/ticks/index.d.ts.map +1 -0
- package/dist/ticks/index.js +16 -0
- package/dist/ticks/index.js.map +7 -0
- package/dist/ticks/numeric.d.ts +5 -0
- package/dist/ticks/numeric.d.ts.map +1 -0
- package/dist/ticks/numeric.js +98 -0
- package/dist/ticks/numeric.js.map +7 -0
- package/dist/ticks/time.d.ts +3 -0
- package/dist/ticks/time.d.ts.map +1 -0
- package/dist/ticks/time.js +182 -0
- package/dist/ticks/time.js.map +7 -0
- package/dist/types.d.ts +54 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +7 -0
- package/dist/util/calendar.d.ts +27 -0
- package/dist/util/calendar.d.ts.map +1 -0
- package/dist/util/calendar.js +147 -0
- package/dist/util/calendar.js.map +7 -0
- package/dist/util/data.d.ts +60 -0
- package/dist/util/data.d.ts.map +1 -0
- package/dist/util/data.js +145 -0
- package/dist/util/data.js.map +7 -0
- package/dist/util/field.d.ts +4 -0
- package/dist/util/field.d.ts.map +1 -0
- package/dist/util/field.js +15 -0
- package/dist/util/field.js.map +7 -0
- package/dist/util/index.d.ts +5 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +5 -0
- package/dist/util/index.js.map +7 -0
- package/dist/util/infer.d.ts +8 -0
- package/dist/util/infer.d.ts.map +1 -0
- package/dist/util/infer.js +62 -0
- package/dist/util/infer.js.map +7 -0
- package/dist/util/math.d.ts +41 -0
- package/dist/util/math.d.ts.map +1 -0
- package/dist/util/math.js +123 -0
- package/dist/util/math.js.map +7 -0
- package/dist/util/profile.d.ts +133 -0
- package/dist/util/profile.d.ts.map +1 -0
- package/dist/util/profile.js +314 -0
- package/dist/util/profile.js.map +7 -0
- package/package.json +10 -5
- package/dist/chunk-V6TY7KAL.js +0 -7
- package/dist/chunk-V6TY7KAL.js.map +0 -1
- package/dist/patrickHand-ITDQJJE2.js +0 -9
- package/dist/patrickHand-ITDQJJE2.js.map +0 -1
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { accessor, inferType, toNumber, uniqueValues } from "../util/data.js";
|
|
2
|
+
import { applyTransforms } from "./transform/index.js";
|
|
3
|
+
const MAX_PIE_SLICES = 7;
|
|
4
|
+
const MAX_SERIES = 12;
|
|
5
|
+
const MAX_DISCRETE_AXIS = 50;
|
|
6
|
+
const POSITIONAL_AXES = ["x", "y"];
|
|
7
|
+
const TYPE_CHANNELS = ["x", "y", "color", "series"];
|
|
8
|
+
const SERIES_CHANNELS = ["series", "color"];
|
|
9
|
+
function isObject(v) {
|
|
10
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
11
|
+
}
|
|
12
|
+
function fieldDef(encoding, channel) {
|
|
13
|
+
const def = encoding?.[channel];
|
|
14
|
+
if (isObject(def) && typeof def.field === "string" && def.field !== "") return def;
|
|
15
|
+
return void 0;
|
|
16
|
+
}
|
|
17
|
+
function effectiveData(spec) {
|
|
18
|
+
const data = Array.isArray(spec.data) ? spec.data : [];
|
|
19
|
+
if (!("transform" in spec) || !Array.isArray(spec.transform) || spec.transform.length === 0) return data;
|
|
20
|
+
try {
|
|
21
|
+
return applyTransforms(spec.transform, data);
|
|
22
|
+
} catch {
|
|
23
|
+
return data;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function makeAdder(findings) {
|
|
27
|
+
return (rule, path, message, severity = "warning") => findings.push({ rule, path, message, severity });
|
|
28
|
+
}
|
|
29
|
+
function lintTemporalCategorical(findings, encoding, data) {
|
|
30
|
+
if (!encoding) return;
|
|
31
|
+
for (const channel of TYPE_CHANNELS) {
|
|
32
|
+
const def = fieldDef(encoding, channel);
|
|
33
|
+
if (!def) continue;
|
|
34
|
+
const declared = def.type;
|
|
35
|
+
if ((declared === "nominal" || declared === "ordinal") && inferType(data, def.field) === "temporal") {
|
|
36
|
+
findings.push({
|
|
37
|
+
rule: "temporal-typed-as-categorical",
|
|
38
|
+
path: `encoding.${channel}.type`,
|
|
39
|
+
message: `Field "${def.field}" looks temporal but is typed "${declared}". Set type:"temporal" so it scales as time.`,
|
|
40
|
+
severity: "warning",
|
|
41
|
+
fix: [{ op: "replace", path: `/encoding/${channel}/type`, value: "temporal" }]
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function lintPieSlices(spec, encoding, data, add) {
|
|
47
|
+
if (spec.type !== "pie") return;
|
|
48
|
+
const def = fieldDef(encoding, "color") ?? fieldDef(encoding, "theta");
|
|
49
|
+
const slices = def ? uniqueValues(data, def.field).length : data.length;
|
|
50
|
+
if (slices > MAX_PIE_SLICES) {
|
|
51
|
+
add(
|
|
52
|
+
"pie-too-many-slices",
|
|
53
|
+
"encoding.color",
|
|
54
|
+
`Pie has ${slices} slices (> ${MAX_PIE_SLICES}); proportions get hard to compare. Use a bar chart, or group small slices into "Other".`
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function lintSeriesCardinality(encoding, data, add) {
|
|
59
|
+
for (const channel of SERIES_CHANNELS) {
|
|
60
|
+
const def = fieldDef(encoding, channel);
|
|
61
|
+
if (!def) continue;
|
|
62
|
+
if (inferType(data, def.field) === "quantitative" && channel === "color") continue;
|
|
63
|
+
const count = uniqueValues(data, def.field).length;
|
|
64
|
+
if (count > MAX_SERIES) {
|
|
65
|
+
add(
|
|
66
|
+
"too-many-series",
|
|
67
|
+
`encoding.${channel}`,
|
|
68
|
+
`"${def.field}" has ${count} distinct values (> ${MAX_SERIES}); the legend/colors become hard to tell apart. Filter, group, or facet instead.`
|
|
69
|
+
);
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function lintBarBaseline(spec, encoding, add) {
|
|
75
|
+
if (spec.type !== "bar") return;
|
|
76
|
+
const y = fieldDef(encoding, "y");
|
|
77
|
+
const scale = y?.scale;
|
|
78
|
+
if (scale?.zero === false) {
|
|
79
|
+
add(
|
|
80
|
+
"bar-nonzero-baseline",
|
|
81
|
+
"encoding.y.scale.zero",
|
|
82
|
+
"Bar lengths encode magnitude, so a non-zero baseline exaggerates differences. Remove scale.zero:false (bars should start at 0)."
|
|
83
|
+
);
|
|
84
|
+
} else if (Array.isArray(scale?.domain) && typeof scale.domain[0] === "number" && scale.domain[0] > 0) {
|
|
85
|
+
add(
|
|
86
|
+
"bar-nonzero-baseline",
|
|
87
|
+
"encoding.y.scale.domain",
|
|
88
|
+
`Bar y-domain starts at ${scale.domain[0]} (> 0); a truncated baseline exaggerates differences. Start the domain at 0.`
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function lintLogScales(encoding, data, add) {
|
|
93
|
+
if (!encoding) return;
|
|
94
|
+
for (const channel of POSITIONAL_AXES) {
|
|
95
|
+
const def = fieldDef(encoding, channel);
|
|
96
|
+
if (def?.scale?.type !== "log") continue;
|
|
97
|
+
const read = accessor(def.field);
|
|
98
|
+
const hasNonPositive = data.some((d) => {
|
|
99
|
+
const n = toNumber(read(d));
|
|
100
|
+
return Number.isFinite(n) && n <= 0;
|
|
101
|
+
});
|
|
102
|
+
if (hasNonPositive) {
|
|
103
|
+
add(
|
|
104
|
+
"log-nonpositive-data",
|
|
105
|
+
`encoding.${channel}.scale`,
|
|
106
|
+
`"${def.field}" has values \u2264 0, which a log scale cannot plot. Use a linear scale or filter non-positive values.`
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function lintHighCardinalityAxis(spec, encoding, data, add) {
|
|
112
|
+
if (spec.type !== "bar" && spec.type !== "line" && spec.type !== "area") return;
|
|
113
|
+
for (const channel of POSITIONAL_AXES) {
|
|
114
|
+
const def = fieldDef(encoding, channel);
|
|
115
|
+
if (!def) continue;
|
|
116
|
+
const t = def.type ?? inferType(data, def.field);
|
|
117
|
+
const discrete = t === "nominal" || t === "ordinal" || def.scale?.type === "band" || def.scale?.type === "point";
|
|
118
|
+
if (!discrete) continue;
|
|
119
|
+
const count = uniqueValues(data, def.field).length;
|
|
120
|
+
if (count > MAX_DISCRETE_AXIS) {
|
|
121
|
+
add(
|
|
122
|
+
"high-cardinality-axis",
|
|
123
|
+
`encoding.${channel}`,
|
|
124
|
+
`"${def.field}" has ${count} categories on the ${channel}-axis (> ${MAX_DISCRETE_AXIS}); labels will be unreadable. Aggregate, filter to a top-N, or use a different chart.`
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function lintHistogram(spec, encoding, data, add) {
|
|
130
|
+
if (spec.type !== "histogram") return;
|
|
131
|
+
const def = fieldDef(encoding, "x");
|
|
132
|
+
if (!def) return;
|
|
133
|
+
const t = def.type ?? inferType(data, def.field);
|
|
134
|
+
if (t !== "quantitative") {
|
|
135
|
+
add(
|
|
136
|
+
"histogram-nonnumeric-field",
|
|
137
|
+
"encoding.x",
|
|
138
|
+
`Histogram field "${def.field}" is ${t}, not quantitative \u2014 binning needs numbers. Use a numeric field, or a bar chart for categories.`
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function lintComboAxis(spec, add) {
|
|
143
|
+
if (spec.type !== "combo" || !Array.isArray(spec.layers)) return;
|
|
144
|
+
const layers = spec.layers;
|
|
145
|
+
const hasRight = layers.some((l) => isObject(l) && l.axis === "right");
|
|
146
|
+
const hasLeft = layers.some((l) => isObject(l) && l.axis !== "right");
|
|
147
|
+
if (hasRight && hasLeft) {
|
|
148
|
+
add(
|
|
149
|
+
"combo-dual-axis",
|
|
150
|
+
"layers",
|
|
151
|
+
"Dual-axis combo: a secondary y-axis can suggest correlations that are not real. Use it only for genuinely different units/scales, and label both axes clearly.",
|
|
152
|
+
"info"
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
function lintSpec(spec) {
|
|
157
|
+
const findings = [];
|
|
158
|
+
const add = makeAdder(findings);
|
|
159
|
+
const encoding = isObject(spec) ? spec.encoding : void 0;
|
|
160
|
+
const data = effectiveData(spec);
|
|
161
|
+
if (data.length === 0) return findings;
|
|
162
|
+
lintTemporalCategorical(findings, encoding, data);
|
|
163
|
+
lintPieSlices(spec, encoding, data, add);
|
|
164
|
+
lintSeriesCardinality(encoding, data, add);
|
|
165
|
+
lintBarBaseline(spec, encoding, add);
|
|
166
|
+
lintLogScales(encoding, data, add);
|
|
167
|
+
lintHighCardinalityAxis(spec, encoding, data, add);
|
|
168
|
+
lintHistogram(spec, encoding, data, add);
|
|
169
|
+
lintComboAxis(spec, add);
|
|
170
|
+
return findings;
|
|
171
|
+
}
|
|
172
|
+
export {
|
|
173
|
+
lintSpec
|
|
174
|
+
};
|
|
175
|
+
//# sourceMappingURL=lint.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/spec/lint.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Dataviz linter \u2014 best-practice rules that encode the visualization expertise an\n * agent may lack. Each rule is pure and returns findings with a stable `rule` id\n * and a `severity` ('warning' | 'info'), so an agent can recognize, suppress, or\n * learn from a specific issue. Findings are surfaced through `validateSpec`'s\n * `warnings`, and directly via {@link lintSpec}.\n *\n * Rules lint the *effective* data (after `transform`), so cardinality reflects\n * what actually renders (e.g. pie slices after an `aggregate`). The linter never\n * throws and never blocks rendering \u2014 it is advisory only.\n */\n\nimport type { Datum, FieldType } from '../types';\nimport type { ChartSpec, ComboSpec, Encoding, FieldDef, ScaleType } from './types';\nimport { accessor, inferType, toNumber, uniqueValues } from '../util/data';\nimport { applyTransforms } from './transform';\nimport type { ValidationError } from './validate';\n\n/** A lint finding always carries a `rule` id and a non-error `severity`. */\nexport interface LintFinding extends ValidationError {\n rule: string;\n severity: 'warning' | 'info';\n}\n\n/** Thresholds, named so they are easy to tune and reference in messages. */\nconst MAX_PIE_SLICES = 7;\nconst MAX_SERIES = 12;\nconst MAX_DISCRETE_AXIS = 50;\n\n/** Channels that map to a positional/categorical axis on cartesian charts. */\nconst POSITIONAL_AXES: (keyof Encoding)[] = ['x', 'y'];\nconst TYPE_CHANNELS: (keyof Encoding)[] = ['x', 'y', 'color', 'series'];\nconst SERIES_CHANNELS: (keyof Encoding)[] = ['series', 'color'];\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\n/** Read a channel as a {@link FieldDef} when it has a string `field`. */\nfunction fieldDef(encoding: Encoding | undefined, channel: keyof Encoding): FieldDef | undefined {\n const def = encoding?.[channel];\n if (isObject(def) && typeof def.field === 'string' && def.field !== '') return def as FieldDef;\n return undefined;\n}\n\n/** Apply transforms defensively so a malformed pipeline never breaks linting. */\nfunction effectiveData(spec: ChartSpec): Datum[] {\n const data = Array.isArray(spec.data) ? (spec.data as Datum[]) : [];\n if (!('transform' in spec) || !Array.isArray(spec.transform) || spec.transform.length === 0) return data;\n try {\n return applyTransforms(spec.transform, data);\n } catch {\n return data;\n }\n}\n\nfunction makeAdder(findings: LintFinding[]) {\n return (rule: string, path: string, message: string, severity: 'warning' | 'info' = 'warning') =>\n findings.push({ rule, path, message, severity });\n}\n\nfunction lintTemporalCategorical(findings: LintFinding[], encoding: Encoding | undefined, data: Datum[]): void {\n if (!encoding) return;\n for (const channel of TYPE_CHANNELS) {\n const def = fieldDef(encoding, channel);\n if (!def) continue;\n const declared = def.type as FieldType | undefined;\n if ((declared === 'nominal' || declared === 'ordinal') && inferType(data, def.field) === 'temporal') {\n findings.push({\n rule: 'temporal-typed-as-categorical',\n path: `encoding.${channel}.type`,\n message: `Field \"${def.field}\" looks temporal but is typed \"${declared}\". Set type:\"temporal\" so it scales as time.`,\n severity: 'warning',\n fix: [{ op: 'replace', path: `/encoding/${channel}/type`, value: 'temporal' }],\n });\n }\n }\n }\n\n function lintPieSlices(\n spec: ChartSpec,\n encoding: Encoding | undefined,\n data: Datum[],\n add: ReturnType<typeof makeAdder>,\n ): void {\n if (spec.type !== 'pie') return;\n const def = fieldDef(encoding, 'color') ?? fieldDef(encoding, 'theta');\n const slices = def ? uniqueValues(data, def.field).length : data.length;\n if (slices > MAX_PIE_SLICES) {\n add(\n 'pie-too-many-slices',\n 'encoding.color',\n `Pie has ${slices} slices (> ${MAX_PIE_SLICES}); proportions get hard to compare. Use a bar chart, or group small slices into \"Other\".`,\n );\n }\n }\n\n function lintSeriesCardinality(encoding: Encoding | undefined, data: Datum[], add: ReturnType<typeof makeAdder>): void {\n for (const channel of SERIES_CHANNELS) {\n const def = fieldDef(encoding, channel);\n if (!def) continue;\n if (inferType(data, def.field) === 'quantitative' && channel === 'color') continue; // continuous color is fine\n const count = uniqueValues(data, def.field).length;\n if (count > MAX_SERIES) {\n add(\n 'too-many-series',\n `encoding.${channel}`,\n `\"${def.field}\" has ${count} distinct values (> ${MAX_SERIES}); the legend/colors become hard to tell apart. Filter, group, or facet instead.`,\n );\n break; // one finding is enough\n }\n }\n }\n\n function lintBarBaseline(spec: ChartSpec, encoding: Encoding | undefined, add: ReturnType<typeof makeAdder>): void {\n if (spec.type !== 'bar') return;\n const y = fieldDef(encoding, 'y');\n const scale = y?.scale;\n if (scale?.zero === false) {\n add(\n 'bar-nonzero-baseline',\n 'encoding.y.scale.zero',\n 'Bar lengths encode magnitude, so a non-zero baseline exaggerates differences. Remove scale.zero:false (bars should start at 0).',\n );\n } else if (Array.isArray(scale?.domain) && typeof scale.domain[0] === 'number' && scale.domain[0] > 0) {\n add(\n 'bar-nonzero-baseline',\n 'encoding.y.scale.domain',\n `Bar y-domain starts at ${scale.domain[0]} (> 0); a truncated baseline exaggerates differences. Start the domain at 0.`,\n );\n }\n }\n\n function lintLogScales(encoding: Encoding | undefined, data: Datum[], add: ReturnType<typeof makeAdder>): void {\n if (!encoding) return;\n for (const channel of POSITIONAL_AXES) {\n const def = fieldDef(encoding, channel);\n if ((def?.scale?.type as ScaleType | undefined) !== 'log') continue;\n const read = accessor(def!.field);\n const hasNonPositive = data.some((d) => {\n const n = toNumber(read(d));\n return Number.isFinite(n) && n <= 0;\n });\n if (hasNonPositive) {\n add(\n 'log-nonpositive-data',\n `encoding.${channel}.scale`,\n `\"${def!.field}\" has values \u2264 0, which a log scale cannot plot. Use a linear scale or filter non-positive values.`,\n );\n }\n }\n }\n\n function lintHighCardinalityAxis(\n spec: ChartSpec,\n encoding: Encoding | undefined,\n data: Datum[],\n add: ReturnType<typeof makeAdder>,\n ): void {\n if (spec.type !== 'bar' && spec.type !== 'line' && spec.type !== 'area') return;\n for (const channel of POSITIONAL_AXES) {\n const def = fieldDef(encoding, channel);\n if (!def) continue;\n const t = (def.type as FieldType | undefined) ?? inferType(data, def.field);\n const discrete = t === 'nominal' || t === 'ordinal' || def.scale?.type === 'band' || def.scale?.type === 'point';\n if (!discrete) continue;\n const count = uniqueValues(data, def.field).length;\n if (count > MAX_DISCRETE_AXIS) {\n add(\n 'high-cardinality-axis',\n `encoding.${channel}`,\n `\"${def.field}\" has ${count} categories on the ${channel}-axis (> ${MAX_DISCRETE_AXIS}); labels will be unreadable. Aggregate, filter to a top-N, or use a different chart.`,\n );\n }\n }\n }\n\n function lintHistogram(spec: ChartSpec, encoding: Encoding | undefined, data: Datum[], add: ReturnType<typeof makeAdder>): void {\n if (spec.type !== 'histogram') return;\n const def = fieldDef(encoding, 'x');\n if (!def) return;\n const t = (def.type as FieldType | undefined) ?? inferType(data, def.field);\n if (t !== 'quantitative') {\n add(\n 'histogram-nonnumeric-field',\n 'encoding.x',\n `Histogram field \"${def.field}\" is ${t}, not quantitative \u2014 binning needs numbers. Use a numeric field, or a bar chart for categories.`,\n );\n }\n }\n\nfunction lintComboAxis(spec: ChartSpec, add: ReturnType<typeof makeAdder>): void {\n if (spec.type !== 'combo' || !Array.isArray((spec as ComboSpec).layers)) return;\n const layers = (spec as ComboSpec).layers;\n const hasRight = layers.some((l) => isObject(l) && l.axis === 'right');\n const hasLeft = layers.some((l) => isObject(l) && l.axis !== 'right');\n if (hasRight && hasLeft) {\n add(\n 'combo-dual-axis',\n 'layers',\n 'Dual-axis combo: a secondary y-axis can suggest correlations that are not real. Use it only for genuinely different units/scales, and label both axes clearly.',\n 'info',\n );\n }\n}\n\n/**\n * Lint a (structurally valid) chart spec for best-practice issues. Returns an\n * empty array for slicers/dashboards or when no rule fires. Pure and total.\n */\nexport function lintSpec(spec: ChartSpec): LintFinding[] {\n const findings: LintFinding[] = [];\n const add = makeAdder(findings);\n\n const encoding = (isObject(spec) ? (spec as { encoding?: unknown }).encoding : undefined) as\n | Encoding\n | undefined;\n const data = effectiveData(spec);\n if (data.length === 0) return findings; // nothing to measure against\n\n // --- Rule: temporal field typed as a category ---------------------------\n // A field that looks like dates but is declared nominal/ordinal will render on\n // a categorical axis (no time spacing), a very common agent mistake.\n lintTemporalCategorical(findings, encoding, data);\n\n // --- Rule: pie / donut with too many slices -----------------------------\n lintPieSlices(spec, encoding, data, add);\n\n // --- Rule: too many series / legend colors ------------------------------\n lintSeriesCardinality(encoding, data, add);\n\n // --- Rule: bar baseline not at zero -------------------------------------\n lintBarBaseline(spec, encoding, add);\n\n // --- Rule: log scale with non-positive data -----------------------------\n lintLogScales(encoding, data, add);\n\n // --- Rule: high-cardinality categorical axis ----------------------------\n lintHighCardinalityAxis(spec, encoding, data, add);\n\n // --- Rule: histogram on a non-numeric field ----------------------------\n // A histogram bins a quantitative measure; a nominal/temporal field can't be\n // binned meaningfully. Warn so the agent picks a numeric field (or a bar chart).\n lintHistogram(spec, encoding, data, add);\n\n // --- Rule: dual-axis combo advisory -------------------------------------\n // A secondary y-axis can imply a correlation that isn't there; only use it for\n // genuinely different units. Advisory (info), fires only when both axes are used.\n lintComboAxis(spec, add);\n\n return findings;\n}\n"],
|
|
5
|
+
"mappings": "AAcA,SAAS,UAAU,WAAW,UAAU,oBAAoB;AAC5D,SAAS,uBAAuB;AAUhC,MAAM,iBAAiB;AACvB,MAAM,aAAa;AACnB,MAAM,oBAAoB;AAG1B,MAAM,kBAAsC,CAAC,KAAK,GAAG;AACrD,MAAM,gBAAoC,CAAC,KAAK,KAAK,SAAS,QAAQ;AACtE,MAAM,kBAAsC,CAAC,UAAU,OAAO;AAE9D,SAAS,SAAS,GAA0C;AAC1D,SAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC;AAChE;AAGA,SAAS,SAAS,UAAgC,SAA+C;AAC/F,QAAM,MAAM,WAAW,OAAO;AAC9B,MAAI,SAAS,GAAG,KAAK,OAAO,IAAI,UAAU,YAAY,IAAI,UAAU,GAAI,QAAO;AAC/E,SAAO;AACT;AAGA,SAAS,cAAc,MAA0B;AAC/C,QAAM,OAAO,MAAM,QAAQ,KAAK,IAAI,IAAK,KAAK,OAAmB,CAAC;AAClE,MAAI,EAAE,eAAe,SAAS,CAAC,MAAM,QAAQ,KAAK,SAAS,KAAK,KAAK,UAAU,WAAW,EAAG,QAAO;AACpG,MAAI;AACF,WAAO,gBAAgB,KAAK,WAAW,IAAI;AAAA,EAC7C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,UAAyB;AAC1C,SAAO,CAAC,MAAc,MAAc,SAAiB,WAA+B,cAClF,SAAS,KAAK,EAAE,MAAM,MAAM,SAAS,SAAS,CAAC;AACnD;AAEA,SAAS,wBAAwB,UAAyB,UAAgC,MAAqB;AAC3G,MAAI,CAAC,SAAU;AACf,aAAW,WAAW,eAAe;AACnC,UAAM,MAAM,SAAS,UAAU,OAAO;AACtC,QAAI,CAAC,IAAK;AACV,UAAM,WAAW,IAAI;AACrB,SAAK,aAAa,aAAa,aAAa,cAAc,UAAU,MAAM,IAAI,KAAK,MAAM,YAAY;AACnG,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,MAAM,YAAY,OAAO;AAAA,QACzB,SAAS,UAAU,IAAI,KAAK,kCAAkC,QAAQ;AAAA,QACtE,UAAU;AAAA,QACV,KAAK,CAAC,EAAE,IAAI,WAAW,MAAM,aAAa,OAAO,SAAS,OAAO,WAAW,CAAC;AAAA,MAC/E,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,cACP,MACA,UACA,MACA,KACM;AACN,MAAI,KAAK,SAAS,MAAO;AACzB,QAAM,MAAM,SAAS,UAAU,OAAO,KAAK,SAAS,UAAU,OAAO;AACrE,QAAM,SAAS,MAAM,aAAa,MAAM,IAAI,KAAK,EAAE,SAAS,KAAK;AACjE,MAAI,SAAS,gBAAgB;AAC3B;AAAA,MACE;AAAA,MACA;AAAA,MACA,WAAW,MAAM,cAAc,cAAc;AAAA,IAC/C;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,UAAgC,MAAe,KAAyC;AACrH,aAAW,WAAW,iBAAiB;AACrC,UAAM,MAAM,SAAS,UAAU,OAAO;AACtC,QAAI,CAAC,IAAK;AACV,QAAI,UAAU,MAAM,IAAI,KAAK,MAAM,kBAAkB,YAAY,QAAS;AAC1E,UAAM,QAAQ,aAAa,MAAM,IAAI,KAAK,EAAE;AAC5C,QAAI,QAAQ,YAAY;AACtB;AAAA,QACE;AAAA,QACA,YAAY,OAAO;AAAA,QACnB,IAAI,IAAI,KAAK,SAAS,KAAK,uBAAuB,UAAU;AAAA,MAC9D;AACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,MAAiB,UAAgC,KAAyC;AACjH,MAAI,KAAK,SAAS,MAAO;AACzB,QAAM,IAAI,SAAS,UAAU,GAAG;AAChC,QAAM,QAAQ,GAAG;AACjB,MAAI,OAAO,SAAS,OAAO;AACzB;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,WAAW,MAAM,QAAQ,OAAO,MAAM,KAAK,OAAO,MAAM,OAAO,CAAC,MAAM,YAAY,MAAM,OAAO,CAAC,IAAI,GAAG;AACrG;AAAA,MACE;AAAA,MACA;AAAA,MACA,0BAA0B,MAAM,OAAO,CAAC,CAAC;AAAA,IAC3C;AAAA,EACF;AACF;AAEA,SAAS,cAAc,UAAgC,MAAe,KAAyC;AAC7G,MAAI,CAAC,SAAU;AACf,aAAW,WAAW,iBAAiB;AACrC,UAAM,MAAM,SAAS,UAAU,OAAO;AACtC,QAAK,KAAK,OAAO,SAAmC,MAAO;AAC3D,UAAM,OAAO,SAAS,IAAK,KAAK;AAChC,UAAM,iBAAiB,KAAK,KAAK,CAAC,MAAM;AACtC,YAAM,IAAI,SAAS,KAAK,CAAC,CAAC;AAC1B,aAAO,OAAO,SAAS,CAAC,KAAK,KAAK;AAAA,IACpC,CAAC;AACD,QAAI,gBAAgB;AAClB;AAAA,QACE;AAAA,QACA,YAAY,OAAO;AAAA,QACnB,IAAI,IAAK,KAAK;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,wBACP,MACA,UACA,MACA,KACM;AACN,MAAI,KAAK,SAAS,SAAS,KAAK,SAAS,UAAU,KAAK,SAAS,OAAQ;AACzE,aAAW,WAAW,iBAAiB;AACrC,UAAM,MAAM,SAAS,UAAU,OAAO;AACtC,QAAI,CAAC,IAAK;AACV,UAAM,IAAK,IAAI,QAAkC,UAAU,MAAM,IAAI,KAAK;AAC1E,UAAM,WAAW,MAAM,aAAa,MAAM,aAAa,IAAI,OAAO,SAAS,UAAU,IAAI,OAAO,SAAS;AACzG,QAAI,CAAC,SAAU;AACf,UAAM,QAAQ,aAAa,MAAM,IAAI,KAAK,EAAE;AAC5C,QAAI,QAAQ,mBAAmB;AAC7B;AAAA,QACE;AAAA,QACA,YAAY,OAAO;AAAA,QACnB,IAAI,IAAI,KAAK,SAAS,KAAK,sBAAsB,OAAO,YAAY,iBAAiB;AAAA,MACvF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,cAAc,MAAiB,UAAgC,MAAe,KAAyC;AAC9H,MAAI,KAAK,SAAS,YAAa;AAC/B,QAAM,MAAM,SAAS,UAAU,GAAG;AAClC,MAAI,CAAC,IAAK;AACV,QAAM,IAAK,IAAI,QAAkC,UAAU,MAAM,IAAI,KAAK;AAC1E,MAAI,MAAM,gBAAgB;AACxB;AAAA,MACE;AAAA,MACA;AAAA,MACA,oBAAoB,IAAI,KAAK,QAAQ,CAAC;AAAA,IACxC;AAAA,EACF;AACF;AAEF,SAAS,cAAc,MAAiB,KAAyC;AAC7E,MAAI,KAAK,SAAS,WAAW,CAAC,MAAM,QAAS,KAAmB,MAAM,EAAG;AACzE,QAAM,SAAU,KAAmB;AACnC,QAAM,WAAW,OAAO,KAAK,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,SAAS,OAAO;AACrE,QAAM,UAAU,OAAO,KAAK,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,SAAS,OAAO;AACpE,MAAI,YAAY,SAAS;AACvB;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACJ;AACF;AAMO,SAAS,SAAS,MAAgC;AACvD,QAAM,WAA0B,CAAC;AACjC,QAAM,MAAM,UAAU,QAAQ;AAE9B,QAAM,WAAY,SAAS,IAAI,IAAK,KAAgC,WAAW;AAG/E,QAAM,OAAO,cAAc,IAAI;AAC/B,MAAI,KAAK,WAAW,EAAG,QAAO;AAK9B,0BAAwB,UAAU,UAAU,IAAI;AAGhD,gBAAc,MAAM,UAAU,MAAM,GAAG;AAGvC,wBAAsB,UAAU,MAAM,GAAG;AAGzC,kBAAgB,MAAM,UAAU,GAAG;AAGnC,gBAAc,UAAU,MAAM,GAAG;AAGjC,0BAAwB,MAAM,UAAU,MAAM,GAAG;AAKjD,gBAAc,MAAM,UAAU,MAAM,GAAG;AAKvC,gBAAc,MAAM,GAAG;AAEvB,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-repairing validation. {@link repairSpec} applies the safe, unambiguous
|
|
3
|
+
* JSON Patch fixes that {@link validateSpec} attaches to its findings, then
|
|
4
|
+
* re-validates — turning common agent mistakes (a misspelled chart type or enum,
|
|
5
|
+
* a temporal field typed as a category) into a one-step correction instead of a
|
|
6
|
+
* full regenerate. Only fixes the validator deems unambiguous are applied; when
|
|
7
|
+
* the right correction is unclear, the error is left for the agent to resolve.
|
|
8
|
+
*/
|
|
9
|
+
import type { ValidationError } from './validate.js';
|
|
10
|
+
import { type JsonPatchOp } from './jsonpatch.js';
|
|
11
|
+
/** How aggressively {@link repairSpec} may infer missing or misspelled parts. */
|
|
12
|
+
export interface RepairOptions {
|
|
13
|
+
/**
|
|
14
|
+
* Repair level. `'safe'` preserves the historical behavior and only applies
|
|
15
|
+
* validator-provided fixes; `'data'` may additionally infer unambiguous fixes
|
|
16
|
+
* from the spec's own data array.
|
|
17
|
+
*/
|
|
18
|
+
level?: 'safe' | 'data';
|
|
19
|
+
}
|
|
20
|
+
/** A patch operation plus the human-readable reason it was considered safe. */
|
|
21
|
+
export interface AppliedRepair {
|
|
22
|
+
/** The JSON Patch operation that was applied. */
|
|
23
|
+
op: JsonPatchOp;
|
|
24
|
+
/** Short explanation of why this repair was applied. */
|
|
25
|
+
rationale: string;
|
|
26
|
+
}
|
|
27
|
+
/** Result returned by {@link repairSpec}. */
|
|
28
|
+
export interface RepairResult {
|
|
29
|
+
/** The (possibly) corrected spec — a new object; the input is never mutated. */
|
|
30
|
+
spec: unknown;
|
|
31
|
+
/** Patch operations that were applied, in order. Empty when nothing changed. */
|
|
32
|
+
applied: JsonPatchOp[];
|
|
33
|
+
/** Applied patch operations paired with their repair rationales. */
|
|
34
|
+
appliedDetails: AppliedRepair[];
|
|
35
|
+
/**
|
|
36
|
+
* Structural errors that remain after repair. `remaining.length === 0` means
|
|
37
|
+
* the repaired spec is valid. Advisory lint warnings are not counted here.
|
|
38
|
+
*/
|
|
39
|
+
remaining: ValidationError[];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Apply every safe auto-fix `validateSpec` proposes, iterating until the spec is
|
|
43
|
+
* valid or no further progress can be made (a fix may unlock another — e.g.
|
|
44
|
+
* correcting the chart `type` changes which channels are required). Pure: the
|
|
45
|
+
* input spec is deep-cloned before any patch is applied.
|
|
46
|
+
*/
|
|
47
|
+
export declare function repairSpec(spec: unknown, options?: RepairOptions): RepairResult;
|
|
48
|
+
//# sourceMappingURL=repair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair.d.ts","sourceRoot":"","sources":["../../src/spec/repair.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,EAAyB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAGtE,iFAAiF;AACjF,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB;AAED,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,EAAE,EAAE,WAAW,CAAC;IAChB,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,6CAA6C;AAC7C,MAAM,WAAW,YAAY;IAC3B,gFAAgF;IAChF,IAAI,EAAE,OAAO,CAAC;IACd,gFAAgF;IAChF,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,oEAAoE;IACpE,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC;;;OAGG;IACH,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B;AA4GD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY,CAgCnF"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { validateSpec } from "./validate.js";
|
|
2
|
+
import { recommendChart } from "../analyze/recommend.js";
|
|
3
|
+
import { applyPatch, toPointer } from "./jsonpatch.js";
|
|
4
|
+
import { closest } from "./suggest.js";
|
|
5
|
+
const MAX_PASSES = 8;
|
|
6
|
+
function isObject(v) {
|
|
7
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
8
|
+
}
|
|
9
|
+
function pathValue(doc, path) {
|
|
10
|
+
if (path === "") return doc;
|
|
11
|
+
let current = doc;
|
|
12
|
+
for (const part of path.replace(/\[(\d+)\]/g, ".$1").split(".")) {
|
|
13
|
+
if (part === "") continue;
|
|
14
|
+
if (Array.isArray(current)) {
|
|
15
|
+
current = current[Number(part)];
|
|
16
|
+
} else if (isObject(current)) {
|
|
17
|
+
current = current[part];
|
|
18
|
+
} else {
|
|
19
|
+
return void 0;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return current;
|
|
23
|
+
}
|
|
24
|
+
function dataRows(spec) {
|
|
25
|
+
if (!isObject(spec) || !Array.isArray(spec.data) || spec.data.length === 0) return void 0;
|
|
26
|
+
if (spec.data.some((row) => !isObject(row) || row instanceof Date)) return void 0;
|
|
27
|
+
return spec.data;
|
|
28
|
+
}
|
|
29
|
+
function rationaleForValidationFix(op) {
|
|
30
|
+
return `validator-provided safe fix at "${op.path}"`;
|
|
31
|
+
}
|
|
32
|
+
function uniqueRecommendedSpec(spec) {
|
|
33
|
+
const rows = dataRows(spec);
|
|
34
|
+
if (!rows) return void 0;
|
|
35
|
+
const recommendations = recommendChart(rows, { maxResults: 20 });
|
|
36
|
+
if (recommendations.length === 0) return void 0;
|
|
37
|
+
const [top, runnerUp] = recommendations;
|
|
38
|
+
if (top.status === "needs-decision") return void 0;
|
|
39
|
+
if (runnerUp && top.score - runnerUp.score < 0.1) return void 0;
|
|
40
|
+
return top.spec;
|
|
41
|
+
}
|
|
42
|
+
function uniqueRecommendationForType(spec, type) {
|
|
43
|
+
const rows = dataRows(spec);
|
|
44
|
+
if (!rows) return void 0;
|
|
45
|
+
const matches = recommendChart(rows, { maxResults: 20 }).filter((rec) => {
|
|
46
|
+
return isObject(rec.spec) && rec.spec.type === type && rec.status !== "needs-decision";
|
|
47
|
+
});
|
|
48
|
+
return matches.length === 1 ? matches[0].spec : void 0;
|
|
49
|
+
}
|
|
50
|
+
function collectDataFixes(spec, findings) {
|
|
51
|
+
if (!isObject(spec)) return [];
|
|
52
|
+
const repairs = [];
|
|
53
|
+
for (const finding of findings) {
|
|
54
|
+
if (finding.suggestion?.kind !== "field") continue;
|
|
55
|
+
const value = pathValue(spec, finding.path);
|
|
56
|
+
if (typeof value !== "string") continue;
|
|
57
|
+
const best = closest(value, finding.suggestion.candidates);
|
|
58
|
+
if (!best || best === value) continue;
|
|
59
|
+
repairs.push({
|
|
60
|
+
op: { op: "replace", path: toPointer(finding.path), value: best },
|
|
61
|
+
rationale: `field "${value}" \u2192 "${best}" (nearest column)`
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (pathValue(spec, "type") === void 0) {
|
|
65
|
+
const recommended = uniqueRecommendedSpec(spec);
|
|
66
|
+
if (isObject(recommended) && typeof recommended.type === "string") {
|
|
67
|
+
repairs.push({
|
|
68
|
+
op: { op: "add", path: "/type", value: recommended.type },
|
|
69
|
+
rationale: `type "${recommended.type}" inferred from data shape`
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const type = pathValue(spec, "type");
|
|
74
|
+
const encoding = pathValue(spec, "encoding");
|
|
75
|
+
if (typeof type === "string") {
|
|
76
|
+
const recommended = uniqueRecommendationForType(spec, type);
|
|
77
|
+
const recommendedEncoding = isObject(recommended) ? recommended.encoding : void 0;
|
|
78
|
+
if (isObject(recommendedEncoding)) {
|
|
79
|
+
if (!isObject(encoding) && findings.some((finding) => finding.path === "encoding")) {
|
|
80
|
+
repairs.push({
|
|
81
|
+
op: { op: "add", path: "/encoding", value: recommendedEncoding },
|
|
82
|
+
rationale: `encoding inferred from data shape for "${type}"`
|
|
83
|
+
});
|
|
84
|
+
} else if (isObject(encoding)) {
|
|
85
|
+
for (const finding of findings) {
|
|
86
|
+
const match = /^encoding\.([^.]+)$/.exec(finding.path);
|
|
87
|
+
if (!match) continue;
|
|
88
|
+
const channel = match[1];
|
|
89
|
+
if (encoding[channel] !== void 0 || recommendedEncoding[channel] === void 0) continue;
|
|
90
|
+
repairs.push({
|
|
91
|
+
op: { op: "add", path: toPointer(finding.path), value: recommendedEncoding[channel] },
|
|
92
|
+
rationale: `channel "${channel}" inferred from data shape for "${type}"`
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return repairs;
|
|
99
|
+
}
|
|
100
|
+
function repairSpec(spec, options = {}) {
|
|
101
|
+
let current = spec;
|
|
102
|
+
const applied = [];
|
|
103
|
+
const appliedDetails = [];
|
|
104
|
+
let prevSignature = "";
|
|
105
|
+
const level = options.level ?? "safe";
|
|
106
|
+
for (let pass = 0; pass < MAX_PASSES; pass++) {
|
|
107
|
+
const { errors, warnings } = validateSpec(current);
|
|
108
|
+
const fixes = [];
|
|
109
|
+
for (const finding of [...errors, ...warnings]) {
|
|
110
|
+
if (finding.fix && finding.fix.length > 0) {
|
|
111
|
+
fixes.push(...finding.fix.map((op) => ({ op, rationale: rationaleForValidationFix(op) })));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (level === "data" && fixes.length === 0) {
|
|
115
|
+
fixes.push(...collectDataFixes(current, [...errors, ...warnings]));
|
|
116
|
+
}
|
|
117
|
+
if (fixes.length === 0) break;
|
|
118
|
+
const ops = fixes.map((fix) => fix.op);
|
|
119
|
+
const signature = JSON.stringify(ops);
|
|
120
|
+
if (signature === prevSignature) break;
|
|
121
|
+
prevSignature = signature;
|
|
122
|
+
current = applyPatch(current, ops);
|
|
123
|
+
applied.push(...ops);
|
|
124
|
+
appliedDetails.push(...fixes);
|
|
125
|
+
}
|
|
126
|
+
return { spec: current, applied, appliedDetails, remaining: validateSpec(current).errors };
|
|
127
|
+
}
|
|
128
|
+
export {
|
|
129
|
+
repairSpec
|
|
130
|
+
};
|
|
131
|
+
//# sourceMappingURL=repair.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/spec/repair.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Self-repairing validation. {@link repairSpec} applies the safe, unambiguous\n * JSON Patch fixes that {@link validateSpec} attaches to its findings, then\n * re-validates \u2014 turning common agent mistakes (a misspelled chart type or enum,\n * a temporal field typed as a category) into a one-step correction instead of a\n * full regenerate. Only fixes the validator deems unambiguous are applied; when\n * the right correction is unclear, the error is left for the agent to resolve.\n */\n\nimport type { ValidationError } from './validate';\nimport { validateSpec } from './validate';\nimport { recommendChart } from '../analyze/recommend';\nimport { applyPatch, toPointer, type JsonPatchOp } from './jsonpatch';\nimport { closest } from './suggest';\n\n/** How aggressively {@link repairSpec} may infer missing or misspelled parts. */\nexport interface RepairOptions {\n /**\n * Repair level. `'safe'` preserves the historical behavior and only applies\n * validator-provided fixes; `'data'` may additionally infer unambiguous fixes\n * from the spec's own data array.\n */\n level?: 'safe' | 'data';\n}\n\n/** A patch operation plus the human-readable reason it was considered safe. */\nexport interface AppliedRepair {\n /** The JSON Patch operation that was applied. */\n op: JsonPatchOp;\n /** Short explanation of why this repair was applied. */\n rationale: string;\n}\n\n/** Result returned by {@link repairSpec}. */\nexport interface RepairResult {\n /** The (possibly) corrected spec \u2014 a new object; the input is never mutated. */\n spec: unknown;\n /** Patch operations that were applied, in order. Empty when nothing changed. */\n applied: JsonPatchOp[];\n /** Applied patch operations paired with their repair rationales. */\n appliedDetails: AppliedRepair[];\n /**\n * Structural errors that remain after repair. `remaining.length === 0` means\n * the repaired spec is valid. Advisory lint warnings are not counted here.\n */\n remaining: ValidationError[];\n}\n\nconst MAX_PASSES = 8;\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nfunction pathValue(doc: unknown, path: string): unknown {\n if (path === '') return doc;\n let current = doc;\n for (const part of path.replace(/\\[(\\d+)\\]/g, '.$1').split('.')) {\n if (part === '') continue;\n if (Array.isArray(current)) {\n current = current[Number(part)];\n } else if (isObject(current)) {\n current = current[part];\n } else {\n return undefined;\n }\n }\n return current;\n}\n\nfunction dataRows(spec: unknown): Record<string, unknown>[] | undefined {\n if (!isObject(spec) || !Array.isArray(spec.data) || spec.data.length === 0) return undefined;\n if (spec.data.some((row) => !isObject(row) || row instanceof Date)) return undefined;\n return spec.data as Record<string, unknown>[];\n}\n\nfunction rationaleForValidationFix(op: JsonPatchOp): string {\n return `validator-provided safe fix at \"${op.path}\"`;\n}\n\nfunction uniqueRecommendedSpec(spec: unknown): unknown | undefined {\n const rows = dataRows(spec);\n if (!rows) return undefined;\n const recommendations = recommendChart(rows, { maxResults: 20 });\n if (recommendations.length === 0) return undefined;\n const [top, runnerUp] = recommendations;\n if (top.status === 'needs-decision') return undefined;\n if (runnerUp && top.score - runnerUp.score < 0.1) return undefined;\n return top.spec;\n}\n\nfunction uniqueRecommendationForType(spec: unknown, type: string): unknown | undefined {\n const rows = dataRows(spec);\n if (!rows) return undefined;\n const matches = recommendChart(rows, { maxResults: 20 }).filter((rec) => {\n return isObject(rec.spec) && rec.spec.type === type && rec.status !== 'needs-decision';\n });\n return matches.length === 1 ? matches[0].spec : undefined;\n}\n\nfunction collectDataFixes(spec: unknown, findings: ValidationError[]): AppliedRepair[] {\n if (!isObject(spec)) return [];\n const repairs: AppliedRepair[] = [];\n for (const finding of findings) {\n if (finding.suggestion?.kind !== 'field') continue;\n const value = pathValue(spec, finding.path);\n if (typeof value !== 'string') continue;\n const best = closest(value, finding.suggestion.candidates);\n if (!best || best === value) continue;\n repairs.push({\n op: { op: 'replace', path: toPointer(finding.path), value: best },\n rationale: `field \"${value}\" \u2192 \"${best}\" (nearest column)`,\n });\n }\n\n if (pathValue(spec, 'type') === undefined) {\n const recommended = uniqueRecommendedSpec(spec);\n if (isObject(recommended) && typeof recommended.type === 'string') {\n repairs.push({\n op: { op: 'add', path: '/type', value: recommended.type },\n rationale: `type \"${recommended.type}\" inferred from data shape`,\n });\n }\n }\n\n const type = pathValue(spec, 'type');\n const encoding = pathValue(spec, 'encoding');\n if (typeof type === 'string') {\n const recommended = uniqueRecommendationForType(spec, type);\n const recommendedEncoding = isObject(recommended) ? recommended.encoding : undefined;\n if (isObject(recommendedEncoding)) {\n if (!isObject(encoding) && findings.some((finding) => finding.path === 'encoding')) {\n repairs.push({\n op: { op: 'add', path: '/encoding', value: recommendedEncoding },\n rationale: `encoding inferred from data shape for \"${type}\"`,\n });\n } else if (isObject(encoding)) {\n for (const finding of findings) {\n const match = /^encoding\\.([^.]+)$/.exec(finding.path);\n if (!match) continue;\n const channel = match[1];\n if (encoding[channel] !== undefined || recommendedEncoding[channel] === undefined) continue;\n repairs.push({\n op: { op: 'add', path: toPointer(finding.path), value: recommendedEncoding[channel] },\n rationale: `channel \"${channel}\" inferred from data shape for \"${type}\"`,\n });\n }\n }\n }\n }\n\n return repairs;\n}\n\n/**\n * Apply every safe auto-fix `validateSpec` proposes, iterating until the spec is\n * valid or no further progress can be made (a fix may unlock another \u2014 e.g.\n * correcting the chart `type` changes which channels are required). Pure: the\n * input spec is deep-cloned before any patch is applied.\n */\nexport function repairSpec(spec: unknown, options: RepairOptions = {}): RepairResult {\n let current: unknown = spec;\n const applied: JsonPatchOp[] = [];\n const appliedDetails: AppliedRepair[] = [];\n let prevSignature = '';\n const level = options.level ?? 'safe';\n\n for (let pass = 0; pass < MAX_PASSES; pass++) {\n const { errors, warnings } = validateSpec(current);\n const fixes: AppliedRepair[] = [];\n for (const finding of [...errors, ...warnings]) {\n if (finding.fix && finding.fix.length > 0) {\n fixes.push(...finding.fix.map((op) => ({ op, rationale: rationaleForValidationFix(op) })));\n }\n }\n if (level === 'data' && fixes.length === 0) {\n fixes.push(...collectDataFixes(current, [...errors, ...warnings]));\n }\n if (fixes.length === 0) break;\n\n // Guard against a non-converging fix set repeating forever.\n const ops = fixes.map((fix) => fix.op);\n const signature = JSON.stringify(ops);\n if (signature === prevSignature) break;\n prevSignature = signature;\n\n current = applyPatch(current, ops);\n applied.push(...ops);\n appliedDetails.push(...fixes);\n }\n\n return { spec: current, applied, appliedDetails, remaining: validateSpec(current).errors };\n}\n"],
|
|
5
|
+
"mappings": "AAUA,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAC/B,SAAS,YAAY,iBAAmC;AACxD,SAAS,eAAe;AAmCxB,MAAM,aAAa;AAEnB,SAAS,SAAS,GAA0C;AAC1D,SAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC;AAChE;AAEA,SAAS,UAAU,KAAc,MAAuB;AACtD,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI,UAAU;AACd,aAAW,QAAQ,KAAK,QAAQ,cAAc,KAAK,EAAE,MAAM,GAAG,GAAG;AAC/D,QAAI,SAAS,GAAI;AACjB,QAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,gBAAU,QAAQ,OAAO,IAAI,CAAC;AAAA,IAChC,WAAW,SAAS,OAAO,GAAG;AAC5B,gBAAU,QAAQ,IAAI;AAAA,IACxB,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,SAAS,MAAsD;AACtE,MAAI,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,WAAW,EAAG,QAAO;AACnF,MAAI,KAAK,KAAK,KAAK,CAAC,QAAQ,CAAC,SAAS,GAAG,KAAK,eAAe,IAAI,EAAG,QAAO;AAC3E,SAAO,KAAK;AACd;AAEA,SAAS,0BAA0B,IAAyB;AAC1D,SAAO,mCAAmC,GAAG,IAAI;AACnD;AAEA,SAAS,sBAAsB,MAAoC;AACjE,QAAM,OAAO,SAAS,IAAI;AAC1B,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,kBAAkB,eAAe,MAAM,EAAE,YAAY,GAAG,CAAC;AAC/D,MAAI,gBAAgB,WAAW,EAAG,QAAO;AACzC,QAAM,CAAC,KAAK,QAAQ,IAAI;AACxB,MAAI,IAAI,WAAW,iBAAkB,QAAO;AAC5C,MAAI,YAAY,IAAI,QAAQ,SAAS,QAAQ,IAAK,QAAO;AACzD,SAAO,IAAI;AACb;AAEA,SAAS,4BAA4B,MAAe,MAAmC;AACrF,QAAM,OAAO,SAAS,IAAI;AAC1B,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,UAAU,eAAe,MAAM,EAAE,YAAY,GAAG,CAAC,EAAE,OAAO,CAAC,QAAQ;AACvE,WAAO,SAAS,IAAI,IAAI,KAAK,IAAI,KAAK,SAAS,QAAQ,IAAI,WAAW;AAAA,EACxE,CAAC;AACD,SAAO,QAAQ,WAAW,IAAI,QAAQ,CAAC,EAAE,OAAO;AAClD;AAEA,SAAS,iBAAiB,MAAe,UAA8C;AACrF,MAAI,CAAC,SAAS,IAAI,EAAG,QAAO,CAAC;AAC7B,QAAM,UAA2B,CAAC;AAClC,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,YAAY,SAAS,QAAS;AAC1C,UAAM,QAAQ,UAAU,MAAM,QAAQ,IAAI;AAC1C,QAAI,OAAO,UAAU,SAAU;AAC/B,UAAM,OAAO,QAAQ,OAAO,QAAQ,WAAW,UAAU;AACzD,QAAI,CAAC,QAAQ,SAAS,MAAO;AAC7B,YAAQ,KAAK;AAAA,MACX,IAAI,EAAE,IAAI,WAAW,MAAM,UAAU,QAAQ,IAAI,GAAG,OAAO,KAAK;AAAA,MAChE,WAAW,UAAU,KAAK,aAAQ,IAAI;AAAA,IACxC,CAAC;AAAA,EACH;AAEA,MAAI,UAAU,MAAM,MAAM,MAAM,QAAW;AACzC,UAAM,cAAc,sBAAsB,IAAI;AAC9C,QAAI,SAAS,WAAW,KAAK,OAAO,YAAY,SAAS,UAAU;AACjE,cAAQ,KAAK;AAAA,QACX,IAAI,EAAE,IAAI,OAAO,MAAM,SAAS,OAAO,YAAY,KAAK;AAAA,QACxD,WAAW,SAAS,YAAY,IAAI;AAAA,MACtC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,OAAO,UAAU,MAAM,MAAM;AACnC,QAAM,WAAW,UAAU,MAAM,UAAU;AAC3C,MAAI,OAAO,SAAS,UAAU;AAC5B,UAAM,cAAc,4BAA4B,MAAM,IAAI;AAC1D,UAAM,sBAAsB,SAAS,WAAW,IAAI,YAAY,WAAW;AAC3E,QAAI,SAAS,mBAAmB,GAAG;AACjC,UAAI,CAAC,SAAS,QAAQ,KAAK,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,UAAU,GAAG;AAClF,gBAAQ,KAAK;AAAA,UACX,IAAI,EAAE,IAAI,OAAO,MAAM,aAAa,OAAO,oBAAoB;AAAA,UAC/D,WAAW,0CAA0C,IAAI;AAAA,QAC3D,CAAC;AAAA,MACH,WAAW,SAAS,QAAQ,GAAG;AAC7B,mBAAW,WAAW,UAAU;AAC9B,gBAAM,QAAQ,sBAAsB,KAAK,QAAQ,IAAI;AACrD,cAAI,CAAC,MAAO;AACZ,gBAAM,UAAU,MAAM,CAAC;AACvB,cAAI,SAAS,OAAO,MAAM,UAAa,oBAAoB,OAAO,MAAM,OAAW;AACnF,kBAAQ,KAAK;AAAA,YACX,IAAI,EAAE,IAAI,OAAO,MAAM,UAAU,QAAQ,IAAI,GAAG,OAAO,oBAAoB,OAAO,EAAE;AAAA,YACpF,WAAW,YAAY,OAAO,mCAAmC,IAAI;AAAA,UACvE,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAQO,SAAS,WAAW,MAAe,UAAyB,CAAC,GAAiB;AACnF,MAAI,UAAmB;AACvB,QAAM,UAAyB,CAAC;AAChC,QAAM,iBAAkC,CAAC;AACzC,MAAI,gBAAgB;AACpB,QAAM,QAAQ,QAAQ,SAAS;AAE/B,WAAS,OAAO,GAAG,OAAO,YAAY,QAAQ;AAC5C,UAAM,EAAE,QAAQ,SAAS,IAAI,aAAa,OAAO;AACjD,UAAM,QAAyB,CAAC;AAChC,eAAW,WAAW,CAAC,GAAG,QAAQ,GAAG,QAAQ,GAAG;AAC9C,UAAI,QAAQ,OAAO,QAAQ,IAAI,SAAS,GAAG;AACzC,cAAM,KAAK,GAAG,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,WAAW,0BAA0B,EAAE,EAAE,EAAE,CAAC;AAAA,MAC3F;AAAA,IACF;AACA,QAAI,UAAU,UAAU,MAAM,WAAW,GAAG;AAC1C,YAAM,KAAK,GAAG,iBAAiB,SAAS,CAAC,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC;AAAA,IACnE;AACA,QAAI,MAAM,WAAW,EAAG;AAGxB,UAAM,MAAM,MAAM,IAAI,CAAC,QAAQ,IAAI,EAAE;AACrC,UAAM,YAAY,KAAK,UAAU,GAAG;AACpC,QAAI,cAAc,cAAe;AACjC,oBAAgB;AAEhB,cAAU,WAAW,SAAS,GAAG;AACjC,YAAQ,KAAK,GAAG,GAAG;AACnB,mBAAe,KAAK,GAAG,KAAK;AAAA,EAC9B;AAEA,SAAO,EAAE,MAAM,SAAS,SAAS,gBAAgB,WAAW,aAAa,OAAO,EAAE,OAAO;AAC3F;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Selection model — the declarative vocabulary for interactivity.
|
|
3
|
+
*
|
|
4
|
+
* A *selection* is the unit of interactivity: a named, JSON-serializable value
|
|
5
|
+
* that a visual publishes (by clicking marks, brushing, or changing a slicer)
|
|
6
|
+
* and that other visuals consume as either a **highlight** (emphasize matches,
|
|
7
|
+
* dim the rest) or a **filter** (subset the rows). Selections are plain data —
|
|
8
|
+
* no functions — so specs still round-trip through `JSON.stringify`.
|
|
9
|
+
*
|
|
10
|
+
* Inspired by Vega-Lite params/selections, but pared down to what coding agents
|
|
11
|
+
* need to wire dashboards: a `point`/`interval` definition, and four concrete
|
|
12
|
+
* resolved value shapes (point, set, range, text).
|
|
13
|
+
*/
|
|
14
|
+
/** How a selection is captured from user interaction. */
|
|
15
|
+
export interface SelectionDef {
|
|
16
|
+
/**
|
|
17
|
+
* - `point`: discrete picks (click marks, choose categories). Toggling builds
|
|
18
|
+
* a set of selected tuples.
|
|
19
|
+
* - `interval`: a continuous range (brush on an axis, a min/max slider, a date
|
|
20
|
+
* range).
|
|
21
|
+
*/
|
|
22
|
+
type: 'point' | 'interval';
|
|
23
|
+
/** Pointer event that updates the selection. Default `'click'`. */
|
|
24
|
+
on?: 'click' | 'hover';
|
|
25
|
+
/**
|
|
26
|
+
* Data fields that identify the selection. Defaults to the chart's key channel
|
|
27
|
+
* (e.g. the `x`/`series` field for cartesian charts, the `field` of a slicer).
|
|
28
|
+
*/
|
|
29
|
+
fields?: string[];
|
|
30
|
+
/**
|
|
31
|
+
* Click an already-selected mark to deselect, and accumulate multiple picks.
|
|
32
|
+
* Default `true` for `on:'click'`.
|
|
33
|
+
*/
|
|
34
|
+
toggle?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* What an *empty* selection means for consumers: `'all'` (the default) treats
|
|
37
|
+
* "nothing selected" as "match everything" (no dimming / no filtering);
|
|
38
|
+
* `'none'` treats it as "match nothing".
|
|
39
|
+
*/
|
|
40
|
+
empty?: 'all' | 'none';
|
|
41
|
+
}
|
|
42
|
+
/** A named selection a visual defines. */
|
|
43
|
+
export interface SelectionParam {
|
|
44
|
+
/** Unique name within a chart or dashboard. */
|
|
45
|
+
name: string;
|
|
46
|
+
select: SelectionDef;
|
|
47
|
+
/** Optional initial value. */
|
|
48
|
+
value?: SelectionValue;
|
|
49
|
+
}
|
|
50
|
+
/** Discrete picks: rows whose `fields` equal one of the selected `tuples`. */
|
|
51
|
+
export interface PointSelection {
|
|
52
|
+
kind: 'point';
|
|
53
|
+
fields: string[];
|
|
54
|
+
/** Each tuple is one selected combination, aligned to `fields`. */
|
|
55
|
+
tuples: unknown[][];
|
|
56
|
+
}
|
|
57
|
+
/** Membership: rows whose `field` value is one of `values` (dropdown / list). */
|
|
58
|
+
export interface SetSelection {
|
|
59
|
+
kind: 'set';
|
|
60
|
+
field: string;
|
|
61
|
+
values: unknown[];
|
|
62
|
+
}
|
|
63
|
+
/** A continuous span over `field` (numeric or temporal). Bounds are inclusive. */
|
|
64
|
+
export interface RangeSelection {
|
|
65
|
+
kind: 'range';
|
|
66
|
+
field: string;
|
|
67
|
+
min?: number | string;
|
|
68
|
+
max?: number | string;
|
|
69
|
+
}
|
|
70
|
+
/** A case-insensitive substring match over `field` (search box). */
|
|
71
|
+
export interface TextSelection {
|
|
72
|
+
kind: 'text';
|
|
73
|
+
field: string;
|
|
74
|
+
query: string;
|
|
75
|
+
}
|
|
76
|
+
/** The resolved value of a selection — what lives in the store. */
|
|
77
|
+
export type SelectionValue = PointSelection | SetSelection | RangeSelection | TextSelection;
|
|
78
|
+
/** Reference a named selection for highlighting. */
|
|
79
|
+
export interface HighlightConfig {
|
|
80
|
+
/** The param whose current value drives the emphasis. */
|
|
81
|
+
param: string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* A literal, param-free predicate usable directly in `filter`. Each form maps to
|
|
85
|
+
* a {@link SelectionValue}, so the same matcher handles params and literals.
|
|
86
|
+
*/
|
|
87
|
+
export type LiteralPredicate = {
|
|
88
|
+
field: string;
|
|
89
|
+
equals: unknown;
|
|
90
|
+
} | {
|
|
91
|
+
field: string;
|
|
92
|
+
oneOf: unknown[];
|
|
93
|
+
} | {
|
|
94
|
+
field: string;
|
|
95
|
+
range: [number | string, number | string];
|
|
96
|
+
} | {
|
|
97
|
+
field: string;
|
|
98
|
+
contains: string;
|
|
99
|
+
};
|
|
100
|
+
/** One clause of a `filter`: a named param or a literal predicate. */
|
|
101
|
+
export type FilterClause = {
|
|
102
|
+
param: string;
|
|
103
|
+
} | LiteralPredicate;
|
|
104
|
+
//# sourceMappingURL=selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/spec/selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,yDAAyD;AACzD,MAAM,WAAW,YAAY;IAC3B;;;;;OAKG;IACH,IAAI,EAAE,OAAO,GAAG,UAAU,CAAC;IAC3B,mEAAmE;IACnE,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACvB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACxB;AAED,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB;AAED,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,mEAAmE;IACnE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;CACrB;AAED,iFAAiF;AACjF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB;AAED,kFAAkF;AAClF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,mEAAmE;AACnE,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,YAAY,GAAG,cAAc,GAAG,aAAa,CAAC;AAE5F,oDAAoD;AACpD,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GACxB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAClC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,EAAE,CAAA;CAAE,GACnC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;CAAE,GAC5D;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,sEAAsE;AACtE,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=selection.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a spec's `sketch` option into concrete, fully-defaulted knobs for the
|
|
3
|
+
* rough engine. Returns `null` when sketching is off, which lets every chart
|
|
4
|
+
* keep its pixel-identical clean path with a single early check.
|
|
5
|
+
*
|
|
6
|
+
* The seed is derived deterministically from the spec's identity when the author
|
|
7
|
+
* doesn't pass one, so the same chart always wobbles the same way (required for
|
|
8
|
+
* the screenshot harness).
|
|
9
|
+
*/
|
|
10
|
+
import { type RoughStyle } from '../rough/index.js';
|
|
11
|
+
import type { ChartSpec } from './types.js';
|
|
12
|
+
/** Fully-resolved sketch settings handed to charts / the rough pen. */
|
|
13
|
+
export interface ResolvedSketch extends RoughStyle {
|
|
14
|
+
/** Whether text should use the hand-drawn font. */
|
|
15
|
+
font: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Map `spec.sketch` to a `ResolvedSketch`, or `null` when disabled.
|
|
19
|
+
* `sketch: true` uses all defaults; an object overrides individual knobs.
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveSketch(spec: ChartSpec): ResolvedSketch | null;
|
|
22
|
+
//# sourceMappingURL=sketch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sketch.d.ts","sourceRoot":"","sources":["../../src/spec/sketch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAmC,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,KAAK,EAAY,SAAS,EAAgB,MAAM,SAAS,CAAC;AAEjE,uEAAuE;AACvE,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,mDAAmD;IACnD,IAAI,EAAE,OAAO,CAAC;CACf;AAUD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,cAAc,GAAG,IAAI,CAepE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { DEFAULT_ROUGH_STYLE, hashString } from "../rough/index.js";
|
|
2
|
+
function deriveSeed(spec) {
|
|
3
|
+
const title = typeof spec.title === "string" ? spec.title : spec.title?.text ?? spec.title?.subtitle ?? "";
|
|
4
|
+
const dataLen = Array.isArray(spec.data) ? spec.data.length : 0;
|
|
5
|
+
const firstRow = Array.isArray(spec.data) && spec.data[0] ? Object.keys(spec.data[0]).join(",") : "";
|
|
6
|
+
return hashString(`${spec.type}|${title}|${dataLen}|${firstRow}`) || 1;
|
|
7
|
+
}
|
|
8
|
+
function resolveSketch(spec) {
|
|
9
|
+
const sketch = spec.sketch;
|
|
10
|
+
if (!sketch) return null;
|
|
11
|
+
const cfg = sketch === true ? {} : sketch;
|
|
12
|
+
return {
|
|
13
|
+
roughness: cfg.roughness ?? DEFAULT_ROUGH_STYLE.roughness,
|
|
14
|
+
bowing: cfg.bowing ?? DEFAULT_ROUGH_STYLE.bowing,
|
|
15
|
+
fillStyle: cfg.fillStyle ?? DEFAULT_ROUGH_STYLE.fillStyle,
|
|
16
|
+
hachureGap: cfg.hachureGap ?? DEFAULT_ROUGH_STYLE.hachureGap,
|
|
17
|
+
hachureAngle: cfg.hachureAngle ?? DEFAULT_ROUGH_STYLE.hachureAngle,
|
|
18
|
+
strokeWidth: cfg.strokeWidth ?? DEFAULT_ROUGH_STYLE.strokeWidth,
|
|
19
|
+
seed: (cfg.seed ?? deriveSeed(spec)) >>> 0,
|
|
20
|
+
font: cfg.font ?? true
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
resolveSketch
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=sketch.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/spec/sketch.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Resolve a spec's `sketch` option into concrete, fully-defaulted knobs for the\n * rough engine. Returns `null` when sketching is off, which lets every chart\n * keep its pixel-identical clean path with a single early check.\n *\n * The seed is derived deterministically from the spec's identity when the author\n * doesn't pass one, so the same chart always wobbles the same way (required for\n * the screenshot harness).\n */\n\nimport { DEFAULT_ROUGH_STYLE, hashString, type RoughStyle } from '../rough';\nimport type { BaseSpec, ChartSpec, SketchConfig } from './types';\n\n/** Fully-resolved sketch settings handed to charts / the rough pen. */\nexport interface ResolvedSketch extends RoughStyle {\n /** Whether text should use the hand-drawn font. */\n font: boolean;\n}\n\nfunction deriveSeed(spec: ChartSpec): number {\n const title =\n typeof spec.title === 'string' ? spec.title : (spec.title?.text ?? spec.title?.subtitle ?? '');\n const dataLen = Array.isArray(spec.data) ? spec.data.length : 0;\n const firstRow = Array.isArray(spec.data) && spec.data[0] ? Object.keys(spec.data[0]).join(',') : '';\n return hashString(`${spec.type}|${title}|${dataLen}|${firstRow}`) || 1;\n}\n\n/**\n * Map `spec.sketch` to a `ResolvedSketch`, or `null` when disabled.\n * `sketch: true` uses all defaults; an object overrides individual knobs.\n */\nexport function resolveSketch(spec: ChartSpec): ResolvedSketch | null {\n const sketch = (spec as BaseSpec).sketch;\n if (!sketch) return null;\n const cfg: SketchConfig = sketch === true ? {} : sketch;\n\n return {\n roughness: cfg.roughness ?? DEFAULT_ROUGH_STYLE.roughness,\n bowing: cfg.bowing ?? DEFAULT_ROUGH_STYLE.bowing,\n fillStyle: cfg.fillStyle ?? DEFAULT_ROUGH_STYLE.fillStyle,\n hachureGap: cfg.hachureGap ?? DEFAULT_ROUGH_STYLE.hachureGap,\n hachureAngle: cfg.hachureAngle ?? DEFAULT_ROUGH_STYLE.hachureAngle,\n strokeWidth: cfg.strokeWidth ?? DEFAULT_ROUGH_STYLE.strokeWidth,\n seed: (cfg.seed ?? deriveSeed(spec)) >>> 0,\n font: cfg.font ?? true,\n };\n}\n"],
|
|
5
|
+
"mappings": "AAUA,SAAS,qBAAqB,kBAAmC;AASjE,SAAS,WAAW,MAAyB;AAC3C,QAAM,QACJ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAS,KAAK,OAAO,QAAQ,KAAK,OAAO,YAAY;AAC7F,QAAM,UAAU,MAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;AAC9D,QAAM,WAAW,MAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;AAClG,SAAO,WAAW,GAAG,KAAK,IAAI,IAAI,KAAK,IAAI,OAAO,IAAI,QAAQ,EAAE,KAAK;AACvE;AAMO,SAAS,cAAc,MAAwC;AACpE,QAAM,SAAU,KAAkB;AAClC,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,MAAoB,WAAW,OAAO,CAAC,IAAI;AAEjD,SAAO;AAAA,IACL,WAAW,IAAI,aAAa,oBAAoB;AAAA,IAChD,QAAQ,IAAI,UAAU,oBAAoB;AAAA,IAC1C,WAAW,IAAI,aAAa,oBAAoB;AAAA,IAChD,YAAY,IAAI,cAAc,oBAAoB;AAAA,IAClD,cAAc,IAAI,gBAAgB,oBAAoB;AAAA,IACtD,aAAa,IAAI,eAAe,oBAAoB;AAAA,IACpD,OAAO,IAAI,QAAQ,WAAW,IAAI,OAAO;AAAA,IACzC,MAAM,IAAI,QAAQ;AAAA,EACpB;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiny dependency-free closest-match helper powering "did you mean" suggestions
|
|
3
|
+
* and safe auto-repairs. Used by `validateSpec` (to annotate unknown
|
|
4
|
+
* types/enums/fields) and `repairSpec` (to pick an unambiguous correction).
|
|
5
|
+
*/
|
|
6
|
+
/** Classic Levenshtein edit distance (insert/delete/substitute = 1). */
|
|
7
|
+
export declare function levenshtein(a: string, b: string): number;
|
|
8
|
+
/**
|
|
9
|
+
* Up to `limit` plausible corrections for `input`, nearest first, filtered to a
|
|
10
|
+
* length-relative edit-distance tolerance. Generous — good for "did you mean".
|
|
11
|
+
*/
|
|
12
|
+
export declare function suggestions(input: string, candidates: readonly string[], limit?: number, maxDistance?: number): string[];
|
|
13
|
+
/**
|
|
14
|
+
* The single best correction for `input`, but only when it is **unambiguous and
|
|
15
|
+
* close** — a strict distance bound and a clear margin over the runner-up — so it
|
|
16
|
+
* is safe to apply automatically. Returns `undefined` when no safe pick exists.
|
|
17
|
+
*/
|
|
18
|
+
export declare function closest(input: string, candidates: readonly string[]): string | undefined;
|
|
19
|
+
//# sourceMappingURL=suggest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../src/spec/suggest.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAsBxD;AAwBD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,KAAK,SAAI,EACT,WAAW,SAAmB,GAC7B,MAAM,EAAE,CAMV;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAYxF"}
|