@ggts-sh/spec 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +75 -0
- package/dist/artifact.d.ts +11 -0
- package/dist/artifact.d.ts.map +1 -0
- package/dist/artifact.js +71 -0
- package/dist/artifact.js.map +1 -0
- package/dist/builder-core.d.ts +100 -0
- package/dist/builder-core.d.ts.map +1 -0
- package/dist/builder-core.js +176 -0
- package/dist/builder-core.js.map +1 -0
- package/dist/builder-data.d.ts +36 -0
- package/dist/builder-data.d.ts.map +1 -0
- package/dist/builder-data.js +123 -0
- package/dist/builder-data.js.map +1 -0
- package/dist/builder-geoms.d.ts +128 -0
- package/dist/builder-geoms.d.ts.map +1 -0
- package/dist/builder-geoms.js +221 -0
- package/dist/builder-geoms.js.map +1 -0
- package/dist/builder-options.d.ts +323 -0
- package/dist/builder-options.d.ts.map +1 -0
- package/dist/builder-options.js +2 -0
- package/dist/builder-options.js.map +1 -0
- package/dist/builder-scales.d.ts +160 -0
- package/dist/builder-scales.d.ts.map +1 -0
- package/dist/builder-scales.js +322 -0
- package/dist/builder-scales.js.map +1 -0
- package/dist/builder.d.ts +242 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +42 -0
- package/dist/builder.js.map +1 -0
- package/dist/capabilities-data.d.ts +72 -0
- package/dist/capabilities-data.d.ts.map +1 -0
- package/dist/capabilities-data.js +337 -0
- package/dist/capabilities-data.js.map +1 -0
- package/dist/capabilities-helpers.d.ts +31 -0
- package/dist/capabilities-helpers.d.ts.map +1 -0
- package/dist/capabilities-helpers.js +41 -0
- package/dist/capabilities-helpers.js.map +1 -0
- package/dist/capabilities.d.ts +22 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +154 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/coord-helpers.d.ts +102 -0
- package/dist/coord-helpers.d.ts.map +1 -0
- package/dist/coord-helpers.js +90 -0
- package/dist/coord-helpers.js.map +1 -0
- package/dist/coord-reference-build.d.ts +50 -0
- package/dist/coord-reference-build.d.ts.map +1 -0
- package/dist/coord-reference-build.js +211 -0
- package/dist/coord-reference-build.js.map +1 -0
- package/dist/coord-reference.d.ts +52 -0
- package/dist/coord-reference.d.ts.map +1 -0
- package/dist/coord-reference.js +27 -0
- package/dist/coord-reference.js.map +1 -0
- package/dist/error-catalog.d.ts +258 -0
- package/dist/error-catalog.d.ts.map +1 -0
- package/dist/error-catalog.js +235 -0
- package/dist/error-catalog.js.map +1 -0
- package/dist/error-prose-shared.d.ts +100 -0
- package/dist/error-prose-shared.d.ts.map +1 -0
- package/dist/error-prose-shared.js +95 -0
- package/dist/error-prose-shared.js.map +1 -0
- package/dist/errors.d.ts +39 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +52 -0
- package/dist/errors.js.map +1 -0
- package/dist/generated/coord-reference-data.d.ts +189 -0
- package/dist/generated/coord-reference-data.d.ts.map +1 -0
- package/dist/generated/coord-reference-data.js +212 -0
- package/dist/generated/coord-reference-data.js.map +1 -0
- package/dist/generated/geom-param-keys.d.ts +58 -0
- package/dist/generated/geom-param-keys.d.ts.map +1 -0
- package/dist/generated/geom-param-keys.js +223 -0
- package/dist/generated/geom-param-keys.js.map +1 -0
- package/dist/generated/geom-reference-data.d.ts +2377 -0
- package/dist/generated/geom-reference-data.d.ts.map +1 -0
- package/dist/generated/geom-reference-data.js +2790 -0
- package/dist/generated/geom-reference-data.js.map +1 -0
- package/dist/generated/guide-reference-data.d.ts +219 -0
- package/dist/generated/guide-reference-data.d.ts.map +1 -0
- package/dist/generated/guide-reference-data.js +253 -0
- package/dist/generated/guide-reference-data.js.map +1 -0
- package/dist/generated/plot-spec-validator.d.ts +2 -0
- package/dist/generated/plot-spec-validator.d.ts.map +1 -0
- package/dist/generated/plot-spec-validator.js +6274 -0
- package/dist/generated/plot-spec-validator.js.map +1 -0
- package/dist/generated/position-reference-data.d.ts +82 -0
- package/dist/generated/position-reference-data.d.ts.map +1 -0
- package/dist/generated/position-reference-data.js +181 -0
- package/dist/generated/position-reference-data.js.map +1 -0
- package/dist/generated/scale-reference-data.d.ts +8366 -0
- package/dist/generated/scale-reference-data.d.ts.map +1 -0
- package/dist/generated/scale-reference-data.js +9821 -0
- package/dist/generated/scale-reference-data.js.map +1 -0
- package/dist/generated/stat-reference-data.d.ts +241 -0
- package/dist/generated/stat-reference-data.d.ts.map +1 -0
- package/dist/generated/stat-reference-data.js +311 -0
- package/dist/generated/stat-reference-data.js.map +1 -0
- package/dist/geom-params-build.d.ts +3 -0
- package/dist/geom-params-build.d.ts.map +1 -0
- package/dist/geom-params-build.js +80 -0
- package/dist/geom-params-build.js.map +1 -0
- package/dist/geom-params.d.ts +13 -0
- package/dist/geom-params.d.ts.map +1 -0
- package/dist/geom-params.js +7 -0
- package/dist/geom-params.js.map +1 -0
- package/dist/geom-reference-build.d.ts +29 -0
- package/dist/geom-reference-build.d.ts.map +1 -0
- package/dist/geom-reference-build.js +221 -0
- package/dist/geom-reference-build.js.map +1 -0
- package/dist/geom-reference.d.ts +52 -0
- package/dist/geom-reference.d.ts.map +1 -0
- package/dist/geom-reference.js +72 -0
- package/dist/geom-reference.js.map +1 -0
- package/dist/guide-helpers.d.ts +20 -0
- package/dist/guide-helpers.d.ts.map +1 -0
- package/dist/guide-helpers.js +25 -0
- package/dist/guide-helpers.js.map +1 -0
- package/dist/guide-reference-build.d.ts +42 -0
- package/dist/guide-reference-build.d.ts.map +1 -0
- package/dist/guide-reference-build.js +180 -0
- package/dist/guide-reference-build.js.map +1 -0
- package/dist/guide-reference.d.ts +48 -0
- package/dist/guide-reference.d.ts.map +1 -0
- package/dist/guide-reference.js +32 -0
- package/dist/guide-reference.js.map +1 -0
- package/dist/hue-grey-palettes.d.ts +15 -0
- package/dist/hue-grey-palettes.d.ts.map +1 -0
- package/dist/hue-grey-palettes.js +77 -0
- package/dist/hue-grey-palettes.js.map +1 -0
- package/dist/index.d.ts +364 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +225 -0
- package/dist/index.js.map +1 -0
- package/dist/lint-catalog.d.ts +47 -0
- package/dist/lint-catalog.d.ts.map +1 -0
- package/dist/lint-catalog.js +39 -0
- package/dist/lint-catalog.js.map +1 -0
- package/dist/lint-layer-rules.d.ts +18 -0
- package/dist/lint-layer-rules.d.ts.map +1 -0
- package/dist/lint-layer-rules.js +145 -0
- package/dist/lint-layer-rules.js.map +1 -0
- package/dist/lint-scale-rules.d.ts +8 -0
- package/dist/lint-scale-rules.d.ts.map +1 -0
- package/dist/lint-scale-rules.js +254 -0
- package/dist/lint-scale-rules.js.map +1 -0
- package/dist/lint.d.ts +62 -0
- package/dist/lint.d.ts.map +1 -0
- package/dist/lint.js +57 -0
- package/dist/lint.js.map +1 -0
- package/dist/normalize-coord.d.ts +8 -0
- package/dist/normalize-coord.d.ts.map +1 -0
- package/dist/normalize-coord.js +123 -0
- package/dist/normalize-coord.js.map +1 -0
- package/dist/normalize-input-layers-marks.d.ts +208 -0
- package/dist/normalize-input-layers-marks.d.ts.map +1 -0
- package/dist/normalize-input-layers-marks.js +2 -0
- package/dist/normalize-input-layers-marks.js.map +1 -0
- package/dist/normalize-input-layers-special.d.ts +131 -0
- package/dist/normalize-input-layers-special.d.ts.map +1 -0
- package/dist/normalize-input-layers-special.js +2 -0
- package/dist/normalize-input-layers-special.js.map +1 -0
- package/dist/normalize-input.d.ts +81 -0
- package/dist/normalize-input.d.ts.map +1 -0
- package/dist/normalize-input.js +2 -0
- package/dist/normalize-input.js.map +1 -0
- package/dist/normalize-paint.d.ts +8 -0
- package/dist/normalize-paint.d.ts.map +1 -0
- package/dist/normalize-paint.js +83 -0
- package/dist/normalize-paint.js.map +1 -0
- package/dist/normalize-scales.d.ts +7 -0
- package/dist/normalize-scales.d.ts.map +1 -0
- package/dist/normalize-scales.js +90 -0
- package/dist/normalize-scales.js.map +1 -0
- package/dist/normalize.d.ts +46 -0
- package/dist/normalize.d.ts.map +1 -0
- package/dist/normalize.js +279 -0
- package/dist/normalize.js.map +1 -0
- package/dist/paint-helpers.d.ts +45 -0
- package/dist/paint-helpers.d.ts.map +1 -0
- package/dist/paint-helpers.js +48 -0
- package/dist/paint-helpers.js.map +1 -0
- package/dist/pipeline-error-catalog.d.ts +319 -0
- package/dist/pipeline-error-catalog.d.ts.map +1 -0
- package/dist/pipeline-error-catalog.js +260 -0
- package/dist/pipeline-error-catalog.js.map +1 -0
- package/dist/portability-check.d.ts +35 -0
- package/dist/portability-check.d.ts.map +1 -0
- package/dist/portability-check.js +121 -0
- package/dist/portability-check.js.map +1 -0
- package/dist/portability-lossy.d.ts +19 -0
- package/dist/portability-lossy.d.ts.map +1 -0
- package/dist/portability-lossy.js +65 -0
- package/dist/portability-lossy.js.map +1 -0
- package/dist/portability.d.ts +23 -0
- package/dist/portability.d.ts.map +1 -0
- package/dist/portability.js +23 -0
- package/dist/portability.js.map +1 -0
- package/dist/portable-builder.d.ts +215 -0
- package/dist/portable-builder.d.ts.map +1 -0
- package/dist/portable-builder.js +27 -0
- package/dist/portable-builder.js.map +1 -0
- package/dist/portable-entry.d.ts +16 -0
- package/dist/portable-entry.d.ts.map +1 -0
- package/dist/portable-entry.js +14 -0
- package/dist/portable-entry.js.map +1 -0
- package/dist/position-reference-build.d.ts +29 -0
- package/dist/position-reference-build.d.ts.map +1 -0
- package/dist/position-reference-build.js +115 -0
- package/dist/position-reference-build.js.map +1 -0
- package/dist/position-reference.d.ts +34 -0
- package/dist/position-reference.d.ts.map +1 -0
- package/dist/position-reference.js +19 -0
- package/dist/position-reference.js.map +1 -0
- package/dist/runtime.d.ts +139 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +2 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scale-color-helpers.d.ts +121 -0
- package/dist/scale-color-helpers.d.ts.map +1 -0
- package/dist/scale-color-helpers.js +188 -0
- package/dist/scale-color-helpers.js.map +1 -0
- package/dist/scale-color-hue-grey.d.ts +52 -0
- package/dist/scale-color-hue-grey.d.ts.map +1 -0
- package/dist/scale-color-hue-grey.js +60 -0
- package/dist/scale-color-hue-grey.js.map +1 -0
- package/dist/scale-color-stops.d.ts +85 -0
- package/dist/scale-color-stops.d.ts.map +1 -0
- package/dist/scale-color-stops.js +87 -0
- package/dist/scale-color-stops.js.map +1 -0
- package/dist/scale-color-viridis.d.ts +52 -0
- package/dist/scale-color-viridis.d.ts.map +1 -0
- package/dist/scale-color-viridis.js +68 -0
- package/dist/scale-color-viridis.js.map +1 -0
- package/dist/scale-helpers.d.ts +20 -0
- package/dist/scale-helpers.d.ts.map +1 -0
- package/dist/scale-helpers.js +20 -0
- package/dist/scale-helpers.js.map +1 -0
- package/dist/scale-multi-helpers.d.ts +61 -0
- package/dist/scale-multi-helpers.d.ts.map +1 -0
- package/dist/scale-multi-helpers.js +147 -0
- package/dist/scale-multi-helpers.js.map +1 -0
- package/dist/scale-position-helpers.d.ts +81 -0
- package/dist/scale-position-helpers.d.ts.map +1 -0
- package/dist/scale-position-helpers.js +133 -0
- package/dist/scale-position-helpers.js.map +1 -0
- package/dist/scale-reference-build.d.ts +50 -0
- package/dist/scale-reference-build.d.ts.map +1 -0
- package/dist/scale-reference-build.js +147 -0
- package/dist/scale-reference-build.js.map +1 -0
- package/dist/scale-reference-classify-color.d.ts +11 -0
- package/dist/scale-reference-classify-color.d.ts.map +1 -0
- package/dist/scale-reference-classify-color.js +292 -0
- package/dist/scale-reference-classify-color.js.map +1 -0
- package/dist/scale-reference-classify-position.d.ts +10 -0
- package/dist/scale-reference-classify-position.d.ts.map +1 -0
- package/dist/scale-reference-classify-position.js +137 -0
- package/dist/scale-reference-classify-position.js.map +1 -0
- package/dist/scale-reference-classify-style.d.ts +10 -0
- package/dist/scale-reference-classify-style.d.ts.map +1 -0
- package/dist/scale-reference-classify-style.js +194 -0
- package/dist/scale-reference-classify-style.js.map +1 -0
- package/dist/scale-reference-classify-support.d.ts +37 -0
- package/dist/scale-reference-classify-support.d.ts.map +1 -0
- package/dist/scale-reference-classify-support.js +206 -0
- package/dist/scale-reference-classify-support.js.map +1 -0
- package/dist/scale-reference.d.ts +80 -0
- package/dist/scale-reference.d.ts.map +1 -0
- package/dist/scale-reference.js +85 -0
- package/dist/scale-reference.js.map +1 -0
- package/dist/scale-style-helpers.d.ts +158 -0
- package/dist/scale-style-helpers.d.ts.map +1 -0
- package/dist/scale-style-helpers.js +197 -0
- package/dist/scale-style-helpers.js.map +1 -0
- package/dist/schema-catalog.d.ts +62 -0
- package/dist/schema-catalog.d.ts.map +1 -0
- package/dist/schema-catalog.js +208 -0
- package/dist/schema-catalog.js.map +1 -0
- package/dist/schema-declarations.d.ts +1585 -0
- package/dist/schema-declarations.d.ts.map +1 -0
- package/dist/schema-declarations.js +51 -0
- package/dist/schema-declarations.js.map +1 -0
- package/dist/schema-decls-data.d.ts +58 -0
- package/dist/schema-decls-data.d.ts.map +1 -0
- package/dist/schema-decls-data.js +151 -0
- package/dist/schema-decls-data.js.map +1 -0
- package/dist/schema-decls-guides-theme.d.ts +166 -0
- package/dist/schema-decls-guides-theme.d.ts.map +1 -0
- package/dist/schema-decls-guides-theme.js +251 -0
- package/dist/schema-decls-guides-theme.js.map +1 -0
- package/dist/schema-decls-layers-col-boxplot.d.ts +118 -0
- package/dist/schema-decls-layers-col-boxplot.d.ts.map +1 -0
- package/dist/schema-decls-layers-col-boxplot.js +239 -0
- package/dist/schema-decls-layers-col-boxplot.js.map +1 -0
- package/dist/schema-decls-layers-count-pointrange.d.ts +89 -0
- package/dist/schema-decls-layers-count-pointrange.d.ts.map +1 -0
- package/dist/schema-decls-layers-count-pointrange.js +190 -0
- package/dist/schema-decls-layers-count-pointrange.js.map +1 -0
- package/dist/schema-decls-layers-crossbar-jitter.d.ts +129 -0
- package/dist/schema-decls-layers-crossbar-jitter.d.ts.map +1 -0
- package/dist/schema-decls-layers-crossbar-jitter.js +255 -0
- package/dist/schema-decls-layers-crossbar-jitter.js.map +1 -0
- package/dist/schema-decls-layers-point-path.d.ts +49 -0
- package/dist/schema-decls-layers-point-path.d.ts.map +1 -0
- package/dist/schema-decls-layers-point-path.js +156 -0
- package/dist/schema-decls-layers-point-path.js.map +1 -0
- package/dist/schema-decls-layers-sf-blank.d.ts +89 -0
- package/dist/schema-decls-layers-sf-blank.d.ts.map +1 -0
- package/dist/schema-decls-layers-sf-blank.js +254 -0
- package/dist/schema-decls-layers-sf-blank.js.map +1 -0
- package/dist/schema-decls-layers-text-map.d.ts +80 -0
- package/dist/schema-decls-layers-text-map.d.ts.map +1 -0
- package/dist/schema-decls-layers-text-map.js +151 -0
- package/dist/schema-decls-layers-text-map.js.map +1 -0
- package/dist/schema-decls-paint.d.ts +39 -0
- package/dist/schema-decls-paint.d.ts.map +1 -0
- package/dist/schema-decls-paint.js +95 -0
- package/dist/schema-decls-paint.js.map +1 -0
- package/dist/schema-decls-params-area-abline.d.ts +85 -0
- package/dist/schema-decls-params-area-abline.d.ts.map +1 -0
- package/dist/schema-decls-params-area-abline.js +259 -0
- package/dist/schema-decls-params-area-abline.js.map +1 -0
- package/dist/schema-decls-params-col-contour.d.ts +61 -0
- package/dist/schema-decls-params-col-contour.d.ts.map +1 -0
- package/dist/schema-decls-params-col-contour.js +202 -0
- package/dist/schema-decls-params-col-contour.js.map +1 -0
- package/dist/schema-decls-params-curve-label.d.ts +64 -0
- package/dist/schema-decls-params-curve-label.d.ts.map +1 -0
- package/dist/schema-decls-params-curve-label.js +204 -0
- package/dist/schema-decls-params-curve-label.js.map +1 -0
- package/dist/schema-decls-params-errorbar-position.d.ts +83 -0
- package/dist/schema-decls-params-errorbar-position.d.ts.map +1 -0
- package/dist/schema-decls-params-errorbar-position.js +264 -0
- package/dist/schema-decls-params-errorbar-position.js.map +1 -0
- package/dist/schema-decls-params-point-path.d.ts +61 -0
- package/dist/schema-decls-params-point-path.d.ts.map +1 -0
- package/dist/schema-decls-params-point-path.js +240 -0
- package/dist/schema-decls-params-point-path.js.map +1 -0
- package/dist/schema-decls-params-violin-summary.d.ts +78 -0
- package/dist/schema-decls-params-violin-summary.d.ts.map +1 -0
- package/dist/schema-decls-params-violin-summary.js +272 -0
- package/dist/schema-decls-params-violin-summary.js.map +1 -0
- package/dist/schema-decls-plot.d.ts +80 -0
- package/dist/schema-decls-plot.d.ts.map +1 -0
- package/dist/schema-decls-plot.js +222 -0
- package/dist/schema-decls-plot.js.map +1 -0
- package/dist/schema-decls-scales-guides.d.ts +291 -0
- package/dist/schema-decls-scales-guides.d.ts.map +1 -0
- package/dist/schema-decls-scales-guides.js +189 -0
- package/dist/schema-decls-scales-guides.js.map +1 -0
- package/dist/schema-decls-scales.d.ts +124 -0
- package/dist/schema-decls-scales.d.ts.map +1 -0
- package/dist/schema-decls-scales.js +279 -0
- package/dist/schema-decls-scales.js.map +1 -0
- package/dist/schema-imports.d.ts +1679 -0
- package/dist/schema-imports.d.ts.map +1 -0
- package/dist/schema-imports.js +104 -0
- package/dist/schema-imports.js.map +1 -0
- package/dist/schema-name-schemas.d.ts +18 -0
- package/dist/schema-name-schemas.d.ts.map +1 -0
- package/dist/schema-name-schemas.js +13 -0
- package/dist/schema-name-schemas.js.map +1 -0
- package/dist/schema-names.d.ts +53 -0
- package/dist/schema-names.d.ts.map +1 -0
- package/dist/schema-names.js +229 -0
- package/dist/schema-names.js.map +1 -0
- package/dist/schema-types.d.ts +336 -0
- package/dist/schema-types.d.ts.map +1 -0
- package/dist/schema-types.js +10 -0
- package/dist/schema-types.js.map +1 -0
- package/dist/schema.d.ts +38 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +34 -0
- package/dist/schema.js.map +1 -0
- package/dist/stat-reference-build.d.ts +24 -0
- package/dist/stat-reference-build.d.ts.map +1 -0
- package/dist/stat-reference-build.js +86 -0
- package/dist/stat-reference-build.js.map +1 -0
- package/dist/stat-reference.d.ts +33 -0
- package/dist/stat-reference.d.ts.map +1 -0
- package/dist/stat-reference.js +19 -0
- package/dist/stat-reference.js.map +1 -0
- package/dist/structural-gate.d.ts +15 -0
- package/dist/structural-gate.d.ts.map +1 -0
- package/dist/structural-gate.js +34 -0
- package/dist/structural-gate.js.map +1 -0
- package/dist/temporal-column.d.ts +33 -0
- package/dist/temporal-column.d.ts.map +1 -0
- package/dist/temporal-column.js +247 -0
- package/dist/temporal-column.js.map +1 -0
- package/dist/temporal-guides.d.ts +11 -0
- package/dist/temporal-guides.d.ts.map +1 -0
- package/dist/temporal-guides.js +11 -0
- package/dist/temporal-guides.js.map +1 -0
- package/dist/temporal-interval-schema.d.ts +9 -0
- package/dist/temporal-interval-schema.d.ts.map +1 -0
- package/dist/temporal-interval-schema.js +25 -0
- package/dist/temporal-interval-schema.js.map +1 -0
- package/dist/temporal-interval.d.ts +29 -0
- package/dist/temporal-interval.d.ts.map +1 -0
- package/dist/temporal-interval.js +122 -0
- package/dist/temporal-interval.js.map +1 -0
- package/dist/temporal-parse-core.d.ts +96 -0
- package/dist/temporal-parse-core.d.ts.map +1 -0
- package/dist/temporal-parse-core.js +235 -0
- package/dist/temporal-parse-core.js.map +1 -0
- package/dist/temporal-parse-format.d.ts +13 -0
- package/dist/temporal-parse-format.d.ts.map +1 -0
- package/dist/temporal-parse-format.js +180 -0
- package/dist/temporal-parse-format.js.map +1 -0
- package/dist/temporal-parse-schema.d.ts +11 -0
- package/dist/temporal-parse-schema.d.ts.map +1 -0
- package/dist/temporal-parse-schema.js +23 -0
- package/dist/temporal-parse-schema.js.map +1 -0
- package/dist/temporal-parse.d.ts +18 -0
- package/dist/temporal-parse.d.ts.map +1 -0
- package/dist/temporal-parse.js +183 -0
- package/dist/temporal-parse.js.map +1 -0
- package/dist/temporal-polyfill.d.ts +3 -0
- package/dist/temporal-polyfill.d.ts.map +1 -0
- package/dist/temporal-polyfill.js +25 -0
- package/dist/temporal-polyfill.js.map +1 -0
- package/dist/temporal-ticks.d.ts +20 -0
- package/dist/temporal-ticks.d.ts.map +1 -0
- package/dist/temporal-ticks.js +246 -0
- package/dist/temporal-ticks.js.map +1 -0
- package/dist/temporal.d.ts +109 -0
- package/dist/temporal.d.ts.map +1 -0
- package/dist/temporal.js +73 -0
- package/dist/temporal.js.map +1 -0
- package/dist/validate-data-checks-color-temporal.d.ts +58 -0
- package/dist/validate-data-checks-color-temporal.d.ts.map +1 -0
- package/dist/validate-data-checks-color-temporal.js +168 -0
- package/dist/validate-data-checks-color-temporal.js.map +1 -0
- package/dist/validate-data-checks-color.d.ts +28 -0
- package/dist/validate-data-checks-color.d.ts.map +1 -0
- package/dist/validate-data-checks-color.js +296 -0
- package/dist/validate-data-checks-color.js.map +1 -0
- package/dist/validate-data-checks-layer.d.ts +37 -0
- package/dist/validate-data-checks-layer.d.ts.map +1 -0
- package/dist/validate-data-checks-layer.js +343 -0
- package/dist/validate-data-checks-layer.js.map +1 -0
- package/dist/validate-data-checks-position.d.ts +45 -0
- package/dist/validate-data-checks-position.d.ts.map +1 -0
- package/dist/validate-data-checks-position.js +204 -0
- package/dist/validate-data-checks-position.js.map +1 -0
- package/dist/validate-data-checks-style-finite.d.ts +24 -0
- package/dist/validate-data-checks-style-finite.d.ts.map +1 -0
- package/dist/validate-data-checks-style-finite.js +40 -0
- package/dist/validate-data-checks-style-finite.js.map +1 -0
- package/dist/validate-data-checks-style-numeric.d.ts +26 -0
- package/dist/validate-data-checks-style-numeric.d.ts.map +1 -0
- package/dist/validate-data-checks-style-numeric.js +327 -0
- package/dist/validate-data-checks-style-numeric.js.map +1 -0
- package/dist/validate-data-checks-style.d.ts +14 -0
- package/dist/validate-data-checks-style.d.ts.map +1 -0
- package/dist/validate-data-checks-style.js +14 -0
- package/dist/validate-data-checks-style.js.map +1 -0
- package/dist/validate-data-checks-temporal.d.ts +57 -0
- package/dist/validate-data-checks-temporal.d.ts.map +1 -0
- package/dist/validate-data-checks-temporal.js +83 -0
- package/dist/validate-data-checks-temporal.js.map +1 -0
- package/dist/validate-data-checks.d.ts +31 -0
- package/dist/validate-data-checks.d.ts.map +1 -0
- package/dist/validate-data-checks.js +110 -0
- package/dist/validate-data-checks.js.map +1 -0
- package/dist/validate-data-evidence.d.ts +69 -0
- package/dist/validate-data-evidence.d.ts.map +1 -0
- package/dist/validate-data-evidence.js +329 -0
- package/dist/validate-data-evidence.js.map +1 -0
- package/dist/validate-data.d.ts +73 -0
- package/dist/validate-data.d.ts.map +1 -0
- package/dist/validate-data.js +30 -0
- package/dist/validate-data.js.map +1 -0
- package/dist/validate-map-errors.d.ts +32 -0
- package/dist/validate-map-errors.d.ts.map +1 -0
- package/dist/validate-map-errors.js +76 -0
- package/dist/validate-map-errors.js.map +1 -0
- package/dist/validate-map-forms.d.ts +43 -0
- package/dist/validate-map-forms.d.ts.map +1 -0
- package/dist/validate-map-forms.js +125 -0
- package/dist/validate-map-forms.js.map +1 -0
- package/dist/validate-map-path-keywords.d.ts +11 -0
- package/dist/validate-map-path-keywords.d.ts.map +1 -0
- package/dist/validate-map-path-keywords.js +95 -0
- package/dist/validate-map-path-keywords.js.map +1 -0
- package/dist/validate-map-path-unions.d.ts +27 -0
- package/dist/validate-map-path-unions.d.ts.map +1 -0
- package/dist/validate-map-path-unions.js +200 -0
- package/dist/validate-map-path-unions.js.map +1 -0
- package/dist/validate-schema-shape.d.ts +69 -0
- package/dist/validate-schema-shape.d.ts.map +1 -0
- package/dist/validate-schema-shape.js +156 -0
- package/dist/validate-schema-shape.js.map +1 -0
- package/dist/validate-schema-walk.d.ts +34 -0
- package/dist/validate-schema-walk.d.ts.map +1 -0
- package/dist/validate-schema-walk.js +216 -0
- package/dist/validate-schema-walk.js.map +1 -0
- package/dist/validate-structure-facet.d.ts +8 -0
- package/dist/validate-structure-facet.d.ts.map +1 -0
- package/dist/validate-structure-facet.js +67 -0
- package/dist/validate-structure-facet.js.map +1 -0
- package/dist/validate-structure-layer-computed-y.d.ts +14 -0
- package/dist/validate-structure-layer-computed-y.d.ts.map +1 -0
- package/dist/validate-structure-layer-computed-y.js +70 -0
- package/dist/validate-structure-layer-computed-y.js.map +1 -0
- package/dist/validate-structure-layer-ribbon.d.ts +8 -0
- package/dist/validate-structure-layer-ribbon.d.ts.map +1 -0
- package/dist/validate-structure-layer-ribbon.js +36 -0
- package/dist/validate-structure-layer-ribbon.js.map +1 -0
- package/dist/validate-structure-layer-rule.d.ts +14 -0
- package/dist/validate-structure-layer-rule.d.ts.map +1 -0
- package/dist/validate-structure-layer-rule.js +90 -0
- package/dist/validate-structure-layer-rule.js.map +1 -0
- package/dist/validate-structure-layer-shared.d.ts +12 -0
- package/dist/validate-structure-layer-shared.d.ts.map +1 -0
- package/dist/validate-structure-layer-shared.js +17 -0
- package/dist/validate-structure-layer-shared.js.map +1 -0
- package/dist/validate-structure-layers.d.ts +12 -0
- package/dist/validate-structure-layers.d.ts.map +1 -0
- package/dist/validate-structure-layers.js +292 -0
- package/dist/validate-structure-layers.js.map +1 -0
- package/dist/validate-structure-paint.d.ts +12 -0
- package/dist/validate-structure-paint.d.ts.map +1 -0
- package/dist/validate-structure-paint.js +87 -0
- package/dist/validate-structure-paint.js.map +1 -0
- package/dist/validate-structure-scales.d.ts +10 -0
- package/dist/validate-structure-scales.d.ts.map +1 -0
- package/dist/validate-structure-scales.js +242 -0
- package/dist/validate-structure-scales.js.map +1 -0
- package/dist/validate-structure-style-bins.d.ts +17 -0
- package/dist/validate-structure-style-bins.d.ts.map +1 -0
- package/dist/validate-structure-style-bins.js +150 -0
- package/dist/validate-structure-style-bins.js.map +1 -0
- package/dist/validate-structure.d.ts +16 -0
- package/dist/validate-structure.d.ts.map +1 -0
- package/dist/validate-structure.js +16 -0
- package/dist/validate-structure.js.map +1 -0
- package/dist/validate.d.ts +24 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +178 -0
- package/dist/validate.js.map +1 -0
- package/package.json +59 -0
- package/schema/v0.json +9618 -0
- package/src/artifact.ts +81 -0
- package/src/builder-core.ts +276 -0
- package/src/builder-data.ts +156 -0
- package/src/builder-geoms.ts +290 -0
- package/src/builder-options.ts +428 -0
- package/src/builder-scales.ts +443 -0
- package/src/builder.ts +125 -0
- package/src/capabilities-data.ts +336 -0
- package/src/capabilities-helpers.ts +54 -0
- package/src/capabilities.ts +159 -0
- package/src/coord-helpers.ts +177 -0
- package/src/coord-reference-build.ts +283 -0
- package/src/coord-reference.ts +75 -0
- package/src/error-catalog.ts +253 -0
- package/src/error-prose-shared.ts +106 -0
- package/src/errors.ts +87 -0
- package/src/generated/coord-reference-data.ts +235 -0
- package/src/generated/geom-param-keys.ts +222 -0
- package/src/generated/geom-reference-data.ts +3024 -0
- package/src/generated/guide-reference-data.ts +284 -0
- package/src/generated/plot-spec-validator.ts +7335 -0
- package/src/generated/position-reference-data.ts +191 -0
- package/src/generated/scale-reference-data.ts +10665 -0
- package/src/generated/stat-reference-data.ts +339 -0
- package/src/geom-params-build.ts +92 -0
- package/src/geom-params.ts +14 -0
- package/src/geom-reference-build.ts +292 -0
- package/src/geom-reference.ts +127 -0
- package/src/guide-helpers.ts +44 -0
- package/src/guide-reference-build.ts +249 -0
- package/src/guide-reference.ts +76 -0
- package/src/hue-grey-palettes.ts +82 -0
- package/src/index.ts +400 -0
- package/src/lint-catalog.ts +57 -0
- package/src/lint-layer-rules.ts +175 -0
- package/src/lint-scale-rules.ts +285 -0
- package/src/lint.ts +126 -0
- package/src/normalize-coord.ts +126 -0
- package/src/normalize-input-layers-marks.ts +276 -0
- package/src/normalize-input-layers-special.ts +252 -0
- package/src/normalize-input.ts +154 -0
- package/src/normalize-paint.ts +98 -0
- package/src/normalize-scales.ts +108 -0
- package/src/normalize.ts +403 -0
- package/src/paint-helpers.ts +98 -0
- package/src/pipeline-error-catalog.ts +278 -0
- package/src/portability-check.ts +155 -0
- package/src/portability-lossy.ts +81 -0
- package/src/portability.ts +31 -0
- package/src/portable-builder.ts +35 -0
- package/src/portable-entry.ts +37 -0
- package/src/position-reference-build.ts +164 -0
- package/src/position-reference.ts +41 -0
- package/src/runtime.ts +198 -0
- package/src/scale-color-helpers.ts +263 -0
- package/src/scale-color-hue-grey.ts +95 -0
- package/src/scale-color-stops.ts +177 -0
- package/src/scale-color-viridis.ts +99 -0
- package/src/scale-helpers.ts +264 -0
- package/src/scale-multi-helpers.ts +220 -0
- package/src/scale-position-helpers.ts +231 -0
- package/src/scale-reference-build.ts +222 -0
- package/src/scale-reference-classify-color.ts +334 -0
- package/src/scale-reference-classify-position.ts +164 -0
- package/src/scale-reference-classify-style.ts +229 -0
- package/src/scale-reference-classify-support.ts +298 -0
- package/src/scale-reference.ts +165 -0
- package/src/scale-style-helpers.ts +316 -0
- package/src/schema-catalog.ts +222 -0
- package/src/schema-declarations.ts +51 -0
- package/src/schema-decls-data.ts +272 -0
- package/src/schema-decls-guides-theme.ts +395 -0
- package/src/schema-decls-layers-col-boxplot.ts +410 -0
- package/src/schema-decls-layers-count-pointrange.ts +321 -0
- package/src/schema-decls-layers-crossbar-jitter.ts +443 -0
- package/src/schema-decls-layers-point-path.ts +246 -0
- package/src/schema-decls-layers-sf-blank.ts +408 -0
- package/src/schema-decls-layers-text-map.ts +259 -0
- package/src/schema-decls-paint.ts +124 -0
- package/src/schema-decls-params-area-abline.ts +440 -0
- package/src/schema-decls-params-col-contour.ts +333 -0
- package/src/schema-decls-params-curve-label.ts +343 -0
- package/src/schema-decls-params-errorbar-position.ts +446 -0
- package/src/schema-decls-params-point-path.ts +394 -0
- package/src/schema-decls-params-violin-summary.ts +447 -0
- package/src/schema-decls-plot.ts +385 -0
- package/src/schema-decls-scales-guides.ts +233 -0
- package/src/schema-decls-scales.ts +432 -0
- package/src/schema-imports.ts +116 -0
- package/src/schema-name-schemas.ts +37 -0
- package/src/schema-names.ts +243 -0
- package/src/schema-types.ts +400 -0
- package/src/schema.ts +287 -0
- package/src/stat-reference-build.ts +145 -0
- package/src/stat-reference.ts +38 -0
- package/src/structural-gate.ts +42 -0
- package/src/temporal-column.ts +323 -0
- package/src/temporal-guides.ts +32 -0
- package/src/temporal-interval-schema.ts +40 -0
- package/src/temporal-interval.ts +151 -0
- package/src/temporal-parse-core.ts +331 -0
- package/src/temporal-parse-format.ts +222 -0
- package/src/temporal-parse-schema.ts +38 -0
- package/src/temporal-parse.ts +259 -0
- package/src/temporal-polyfill.ts +27 -0
- package/src/temporal-ticks.ts +312 -0
- package/src/temporal.ts +112 -0
- package/src/validate-data-checks-color-temporal.ts +261 -0
- package/src/validate-data-checks-color.ts +395 -0
- package/src/validate-data-checks-layer.ts +492 -0
- package/src/validate-data-checks-position.ts +275 -0
- package/src/validate-data-checks-style-finite.ts +55 -0
- package/src/validate-data-checks-style-numeric.ts +455 -0
- package/src/validate-data-checks-style.ts +13 -0
- package/src/validate-data-checks-temporal.ts +129 -0
- package/src/validate-data-checks.ts +157 -0
- package/src/validate-data-evidence.ts +419 -0
- package/src/validate-data.ts +114 -0
- package/src/validate-map-errors.ts +126 -0
- package/src/validate-map-forms.ts +148 -0
- package/src/validate-map-path-keywords.ts +129 -0
- package/src/validate-map-path-unions.ts +281 -0
- package/src/validate-schema-shape.ts +232 -0
- package/src/validate-schema-walk.ts +219 -0
- package/src/validate-structure-facet.ts +76 -0
- package/src/validate-structure-layer-computed-y.ts +94 -0
- package/src/validate-structure-layer-ribbon.ts +61 -0
- package/src/validate-structure-layer-rule.ts +98 -0
- package/src/validate-structure-layer-shared.ts +29 -0
- package/src/validate-structure-layers.ts +395 -0
- package/src/validate-structure-paint.ts +101 -0
- package/src/validate-structure-scales.ts +278 -0
- package/src/validate-structure-style-bins.ts +167 -0
- package/src/validate-structure.ts +16 -0
- package/src/validate.ts +212 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
function isRecord(v) {
|
|
2
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
3
|
+
}
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// fractional-calendar-years
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
/** Four-digit Gregorian-ish years; excludes tiny indices and huge scientific IDs. */
|
|
8
|
+
const YEAR_LIKE_MIN = 1000;
|
|
9
|
+
const YEAR_LIKE_MAX = 10_000;
|
|
10
|
+
/**
|
|
11
|
+
* Distance from k/12 allowed when classifying a fractional part as a month
|
|
12
|
+
* index. ~0.02 ≈ one week of a year — tight enough to reject day-of-year
|
|
13
|
+
* fractions (i/365) while accepting float noise on m/12 (e.g. 1854.333).
|
|
14
|
+
*/
|
|
15
|
+
const MONTH_FRAC_TOLERANCE = 0.02;
|
|
16
|
+
/** Need several points so a lone mid-year value cannot trip the rule. */
|
|
17
|
+
const MIN_YEAR_LIKE_SAMPLES = 6;
|
|
18
|
+
/** At least this many non-integer year-likes (months between Januaries). */
|
|
19
|
+
const MIN_FRACTIONAL_SAMPLES = 3;
|
|
20
|
+
/** Share of finite numbers that must be year-like (column is a calendar series). */
|
|
21
|
+
const MIN_YEAR_LIKE_DOMINANCE = 0.8;
|
|
22
|
+
/** Share of year-like values that must sit on the month grid (k/12). */
|
|
23
|
+
const MIN_MONTH_GRID_HIT_RATE = 0.7;
|
|
24
|
+
/** Share of year-like values that must be non-integer. */
|
|
25
|
+
const MIN_FRACTIONAL_RATE = 0.2;
|
|
26
|
+
/**
|
|
27
|
+
* Distinct month indices (0–11) required. Real monthly series hit many; pure
|
|
28
|
+
* quarter/half quantizations only hit {0,3,6,9} and must stay silent.
|
|
29
|
+
*/
|
|
30
|
+
const MIN_DISTINCT_MONTHS = 4;
|
|
31
|
+
/** Quarter-only grids (Jan/Apr/Jul/Oct) — not enough to call "months". */
|
|
32
|
+
const QUARTER_MONTH_INDEX = new Set([0, 3, 6, 9]);
|
|
33
|
+
/**
|
|
34
|
+
* True when values look like calendar months encoded as year + month/12 on a
|
|
35
|
+
* linear scale — the Nightingale theme-specimen pitfall that labels axes and
|
|
36
|
+
* Inspect pins as decimals (`1855.9`). Pure integer years and ordinary
|
|
37
|
+
* 1000–9999 measurements quantized to quarters/halves stay silent.
|
|
38
|
+
* Exercised through lintSpec (lint-rules.test.ts), not as a public export.
|
|
39
|
+
*/
|
|
40
|
+
function looksLikeFractionalCalendarYears(values) {
|
|
41
|
+
const yearLike = [];
|
|
42
|
+
let finiteCount = 0;
|
|
43
|
+
for (const value of values) {
|
|
44
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
45
|
+
continue;
|
|
46
|
+
finiteCount++;
|
|
47
|
+
if (value >= YEAR_LIKE_MIN && value < YEAR_LIKE_MAX)
|
|
48
|
+
yearLike.push(value);
|
|
49
|
+
}
|
|
50
|
+
if (yearLike.length < MIN_YEAR_LIKE_SAMPLES)
|
|
51
|
+
return false;
|
|
52
|
+
if (yearLike.length / finiteCount < MIN_YEAR_LIKE_DOMINANCE)
|
|
53
|
+
return false;
|
|
54
|
+
const stats = fractionalYearStats(yearLike);
|
|
55
|
+
if (stats.fractional < MIN_FRACTIONAL_SAMPLES)
|
|
56
|
+
return false;
|
|
57
|
+
if (stats.fractional / yearLike.length < MIN_FRACTIONAL_RATE)
|
|
58
|
+
return false;
|
|
59
|
+
if (stats.monthGridHits / yearLike.length < MIN_MONTH_GRID_HIT_RATE)
|
|
60
|
+
return false;
|
|
61
|
+
if (stats.monthIndices.size < MIN_DISTINCT_MONTHS)
|
|
62
|
+
return false;
|
|
63
|
+
return stats.nonQuarterFractional >= 1;
|
|
64
|
+
}
|
|
65
|
+
function fractionalYearStats(yearLike) {
|
|
66
|
+
let fractional = 0;
|
|
67
|
+
let monthGridHits = 0;
|
|
68
|
+
const monthIndices = new Set();
|
|
69
|
+
let nonQuarterFractional = 0;
|
|
70
|
+
for (const value of yearLike) {
|
|
71
|
+
const floor = Math.floor(value);
|
|
72
|
+
const frac = value - floor;
|
|
73
|
+
const isFractional = frac > 1e-9 && frac < 1 - 1e-9;
|
|
74
|
+
if (isFractional)
|
|
75
|
+
fractional++;
|
|
76
|
+
// Nearest twelfth; k=12 (frac≈1) collapses to the integer edge.
|
|
77
|
+
const kRaw = Math.round(frac * 12);
|
|
78
|
+
const k = kRaw >= 12 ? 0 : kRaw;
|
|
79
|
+
const expected = kRaw >= 12 ? 1 : k / 12;
|
|
80
|
+
const dist = Math.abs(frac - expected);
|
|
81
|
+
// Integers always hit month 0; fractions must be within tolerance of k/12.
|
|
82
|
+
if (!isFractional || dist <= MONTH_FRAC_TOLERANCE) {
|
|
83
|
+
monthGridHits++;
|
|
84
|
+
monthIndices.add(isFractional ? k : 0);
|
|
85
|
+
if (isFractional && !QUARTER_MONTH_INDEX.has(k))
|
|
86
|
+
nonQuarterFractional++;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return { fractional, monthGridHits, monthIndices, nonQuarterFractional };
|
|
90
|
+
}
|
|
91
|
+
/** First year-like fractional sample for advisory copy, or null. */
|
|
92
|
+
function sampleFractionalYear(values) {
|
|
93
|
+
for (const value of values) {
|
|
94
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
95
|
+
continue;
|
|
96
|
+
if (value < YEAR_LIKE_MIN || value >= YEAR_LIKE_MAX)
|
|
97
|
+
continue;
|
|
98
|
+
const frac = value - Math.floor(value);
|
|
99
|
+
if (frac > 1e-9 && frac < 1 - 1e-9)
|
|
100
|
+
return value;
|
|
101
|
+
}
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
/** Position scale types that already treat the channel as non-linear-year. */
|
|
105
|
+
function isNonLinearYearScale(config) {
|
|
106
|
+
if (config === undefined)
|
|
107
|
+
return false;
|
|
108
|
+
return config.type === "time" || config.type === "band";
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Resolve the effective forward-transform domain for a position scale, reading
|
|
112
|
+
* the spec BEFORE normalization. Both the authored legacy `type: "log"` and the
|
|
113
|
+
* canonical `transform: "log10" | "sqrt"` are covered; identity/time/untyped
|
|
114
|
+
* scales return null.
|
|
115
|
+
*/
|
|
116
|
+
function transformDomainOf(config) {
|
|
117
|
+
if (config === undefined)
|
|
118
|
+
return null;
|
|
119
|
+
const transform = config.transform ?? (config.type === "log" ? "log10" : undefined);
|
|
120
|
+
if (transform === "log10") {
|
|
121
|
+
return { valid: (v) => v > 0, label: "log10", rule: "positive" };
|
|
122
|
+
}
|
|
123
|
+
if (transform === "sqrt") {
|
|
124
|
+
return { valid: (v) => v >= 0, label: "sqrt", rule: "non-negative" };
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
/** Count numeric values inside/outside a transform domain (non-numbers ignored). */
|
|
129
|
+
function countTransformDomain(values, domain) {
|
|
130
|
+
let inDomain = 0;
|
|
131
|
+
let outOfDomain = 0;
|
|
132
|
+
for (const v of values) {
|
|
133
|
+
if (typeof v !== "number")
|
|
134
|
+
continue;
|
|
135
|
+
if (domain.valid(v))
|
|
136
|
+
inDomain++;
|
|
137
|
+
else
|
|
138
|
+
outOfDomain++;
|
|
139
|
+
}
|
|
140
|
+
return [inDomain, outOfDomain];
|
|
141
|
+
}
|
|
142
|
+
/** Scale-scoped advisories for one lintSpec pass. */
|
|
143
|
+
function collectTransformAdvisories(input) {
|
|
144
|
+
const { layers, scales, fieldOf } = input;
|
|
145
|
+
const advisories = [];
|
|
146
|
+
// --- transform-domain-data (scale-level, once per axis) ---------------------
|
|
147
|
+
// Detect the effective forward-transform domain BEFORE normalization: an
|
|
148
|
+
// authored `type: "log"` (canonicalizes to transform: "log10") and a
|
|
149
|
+
// canonical `transform: "log10" | "sqrt"` are all handled here. log10 rejects
|
|
150
|
+
// values <= 0; sqrt rejects values < 0. The advisory fires only on MIXED data
|
|
151
|
+
// (some in-domain, some out) — all-invalid is the pipeline's error/warning.
|
|
152
|
+
//
|
|
153
|
+
// Multi-layer charts often share the same mapped field (plot aes or repeated
|
|
154
|
+
// layer aes). Memoize [inDomain, outOfDomain] per field name for this axis so
|
|
155
|
+
// a shared column is scanned once (O(n)), not once per layer (O(L·n)).
|
|
156
|
+
for (const axis of ["x", "y"]) {
|
|
157
|
+
const raw = scales?.[axis];
|
|
158
|
+
// Schema-invalid scale entries must not throw — lint never blocks.
|
|
159
|
+
if (raw !== undefined && !isRecord(raw))
|
|
160
|
+
continue;
|
|
161
|
+
const config = raw;
|
|
162
|
+
const domain = transformDomainOf(config);
|
|
163
|
+
if (domain === null)
|
|
164
|
+
continue;
|
|
165
|
+
const fieldDomainCounts = new Map();
|
|
166
|
+
for (let i = 0; i < layers.length; i++) {
|
|
167
|
+
const layer = layers[i];
|
|
168
|
+
if (!isRecord(layer))
|
|
169
|
+
continue;
|
|
170
|
+
const layerAes = isRecord(layer["aes"]) ? layer["aes"] : undefined;
|
|
171
|
+
const use = fieldOf(layerAes, axis);
|
|
172
|
+
const values = use?.info.values;
|
|
173
|
+
if (use === null || values === null || values === undefined)
|
|
174
|
+
continue;
|
|
175
|
+
let counts = fieldDomainCounts.get(use.field);
|
|
176
|
+
if (counts === undefined) {
|
|
177
|
+
counts = countTransformDomain(values, domain);
|
|
178
|
+
fieldDomainCounts.set(use.field, counts);
|
|
179
|
+
}
|
|
180
|
+
const [inDomain, outOfDomain] = counts;
|
|
181
|
+
if (inDomain > 0 && outOfDomain > 0) {
|
|
182
|
+
advisories.push({
|
|
183
|
+
code: "transform-domain-data",
|
|
184
|
+
path: `/scales/${axis}`,
|
|
185
|
+
message: `scales.${axis} is a ${domain.label} scale, but field "${use.field}" has ${outOfDomain} value(s) outside its ${domain.rule} domain alongside ${inDomain} valid — those rows will be silently dropped before stats.`,
|
|
186
|
+
suggestion: {
|
|
187
|
+
description: `Filter the out-of-domain rows deliberately, or use an identity/linear scale if ${domain.rule} values are meaningful.`,
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
break; // one advisory per axis is enough
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return advisories;
|
|
195
|
+
}
|
|
196
|
+
function collectFractionalYearAdvisories(input) {
|
|
197
|
+
const { layers, scales, fieldOf } = input;
|
|
198
|
+
const advisories = [];
|
|
199
|
+
// --- fractional-calendar-years (x only, once) ------------------------------
|
|
200
|
+
// Monthly series re-encoded as year + month/12 and plotted on a default or
|
|
201
|
+
// explicit linear scale. Linear defaultTickFormat then prints 1855.9; Inspect
|
|
202
|
+
// pins echo the same. Time/band scales are out of scope (different contract).
|
|
203
|
+
// Only x: calendar-as-y is rare and ordinary 1000–9999 y measures would FP.
|
|
204
|
+
//
|
|
205
|
+
// Memoize the look-alike verdict per field so multi-layer charts scan once.
|
|
206
|
+
{
|
|
207
|
+
const axis = "x";
|
|
208
|
+
const raw = scales?.[axis];
|
|
209
|
+
if (raw === undefined || isRecord(raw)) {
|
|
210
|
+
const config = raw;
|
|
211
|
+
if (!isNonLinearYearScale(config)) {
|
|
212
|
+
const fieldVerdict = new Map();
|
|
213
|
+
let fired = false;
|
|
214
|
+
for (let i = 0; i < layers.length && !fired; i++) {
|
|
215
|
+
const layer = layers[i];
|
|
216
|
+
if (!isRecord(layer))
|
|
217
|
+
continue;
|
|
218
|
+
const layerAes = isRecord(layer["aes"]) ? layer["aes"] : undefined;
|
|
219
|
+
const use = fieldOf(layerAes, axis);
|
|
220
|
+
const values = use?.info.values;
|
|
221
|
+
if (use === null || values === null || values === undefined)
|
|
222
|
+
continue;
|
|
223
|
+
// Only quantitative columns; temporal/string years are a different path.
|
|
224
|
+
if (use.info.type !== null && use.info.type !== "quantitative")
|
|
225
|
+
continue;
|
|
226
|
+
let hit = fieldVerdict.get(use.field);
|
|
227
|
+
if (hit === undefined) {
|
|
228
|
+
hit = looksLikeFractionalCalendarYears(values);
|
|
229
|
+
fieldVerdict.set(use.field, hit);
|
|
230
|
+
}
|
|
231
|
+
if (!hit)
|
|
232
|
+
continue;
|
|
233
|
+
const sample = sampleFractionalYear(values);
|
|
234
|
+
const sampleText = sample === null ? "year + month/12" : String(Math.round(sample * 1000) / 1000);
|
|
235
|
+
advisories.push({
|
|
236
|
+
code: "fractional-calendar-years",
|
|
237
|
+
path: `/aes/${axis}`,
|
|
238
|
+
message: `Field "${use.field}" on ${axis} looks like calendar months encoded as fractional years (e.g. ${sampleText}) on a linear scale — tick labels and Inspect pins will show decimals like 1855.9 instead of months.`,
|
|
239
|
+
suggestion: {
|
|
240
|
+
description: 'Store ISO year-month or date strings ("1854-04" / "1854-04-01") and use a time scale so labels read as calendar months.',
|
|
241
|
+
example: { scales: { [axis]: { type: "time", labels: "%b %Y" } } },
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
fired = true;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return advisories;
|
|
250
|
+
}
|
|
251
|
+
export function collectScaleLintAdvisories(input) {
|
|
252
|
+
return [...collectTransformAdvisories(input), ...collectFractionalYearAdvisories(input)];
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=lint-scale-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint-scale-rules.js","sourceRoot":"","sources":["../src/lint-scale-rules.ts"],"names":[],"mappings":"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"}
|
package/dist/lint.d.ts
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec lint — advisories for VALID-but-questionable specs (Hadley lesson 16:
|
|
3
|
+
* "we can produce many plots that don't make sense, yet are grammatically
|
|
4
|
+
* valid"). `lintSpec()` never errors and never blocks: it returns
|
|
5
|
+
* `SpecAdvisory[]` — high value for agent-generated charts, where a
|
|
6
|
+
* grammatically valid spec can still be a meaningless plot.
|
|
7
|
+
*
|
|
8
|
+
* Distinct from the two error tiers (validate()) and from the pipeline's
|
|
9
|
+
* heuristic advisories (@ggts-sh/core `RenderModel.advisories`): lint runs
|
|
10
|
+
* BEFORE any pipeline, on the spec alone (plus inline data or a DataProfile
|
|
11
|
+
* when available — data-dependent rules skip silently without evidence).
|
|
12
|
+
*
|
|
13
|
+
* Rules considered and deliberately ABSENT (documented for auditability):
|
|
14
|
+
* - dual-axis misuse: the grammar has no dual axes — unrepresentable.
|
|
15
|
+
* - pie-chart overuse: polar/radial coords exist; a dedicated "prefer bar
|
|
16
|
+
* over pie" advisory is deferred until usage evidence exists.
|
|
17
|
+
* - text layer without a label aes: that is a validation ERROR
|
|
18
|
+
* (`missing-required-channel`), not an advisory.
|
|
19
|
+
* - transform scale over entirely out-of-domain data: the pipeline handles
|
|
20
|
+
* it via the `scale-transform-domain` error (explicit limits) / warning
|
|
21
|
+
* (data), plus the applicable censor count; the lint advisory here fires on
|
|
22
|
+
* MIXED data (some in-domain, some out), where the silent row-drop is most
|
|
23
|
+
* surprising.
|
|
24
|
+
*
|
|
25
|
+
* Implementation:
|
|
26
|
+
* - lint-catalog.ts — pure advisory catalog (re-exported here)
|
|
27
|
+
* - lint-layer-rules.ts — layer-scoped rules
|
|
28
|
+
* - lint-scale-rules.ts — scale-level transform-domain-data and
|
|
29
|
+
* fractional-calendar-years (year+month/12 linear pitfall)
|
|
30
|
+
*
|
|
31
|
+
* Wired into `validate(spec, { lint: true })` (advisories ride the result)
|
|
32
|
+
* and into the `ggts render` CLI (stderr JSON lines, kind "advisory",
|
|
33
|
+
* source "spec-lint").
|
|
34
|
+
*/
|
|
35
|
+
import type { JSONValue } from "./portability.js";
|
|
36
|
+
import type { FieldEvidenceMap, ValidateOptions } from "./validate-data.js";
|
|
37
|
+
import type { LintAdvisoryCode } from "./lint-catalog.js";
|
|
38
|
+
export { LINT_CATALOG, type LintAdvisoryCode, type LintCatalogEntry } from "./lint-catalog.js";
|
|
39
|
+
/** One lint advisory: never an error, always actionable. */
|
|
40
|
+
export interface SpecAdvisory {
|
|
41
|
+
code: LintAdvisoryCode;
|
|
42
|
+
/** JSON pointer into the spec ("" = root). */
|
|
43
|
+
path: string;
|
|
44
|
+
message: string;
|
|
45
|
+
suggestion?: {
|
|
46
|
+
description: string;
|
|
47
|
+
example?: JSONValue;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Lint a spec for valid-but-questionable constructs. `options` mirrors
|
|
52
|
+
* validate(): pass `{ profile }` to lint against out-of-band data, or let the
|
|
53
|
+
* spec's inline data provide the evidence; `options.limits` merges over
|
|
54
|
+
* DEFAULT_VALIDATE_LIMITS the same way validate() does. Rules whose evidence
|
|
55
|
+
* is missing (including over-limit inline data) skip silently — lint never
|
|
56
|
+
* fabricates a complaint.
|
|
57
|
+
*
|
|
58
|
+
* When called from validate({ lint: true }), pass `sharedEvidence` so field
|
|
59
|
+
* types/columns are not rebuilt after dataChecks already resolved them.
|
|
60
|
+
*/
|
|
61
|
+
export declare function lintSpec(spec: unknown, options?: ValidateOptions, sharedEvidence?: FieldEvidenceMap | null): SpecAdvisory[];
|
|
62
|
+
//# sourceMappingURL=lint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../src/lint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EAAsB,gBAAgB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAOhG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI1D,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE/F,4DAA4D;AAC5D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,SAAS,CAAC;KACrB,CAAC;CACH;AA6BD;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE,eAAe,EACzB,cAAc,CAAC,EAAE,gBAAgB,GAAG,IAAI,GACvC,YAAY,EAAE,CAsBhB"}
|
package/dist/lint.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { DEFAULT_VALIDATE_LIMITS, effectiveChannel, resolveFieldEvidence, } from "./validate-data.js";
|
|
2
|
+
import { collectLayerLintAdvisories } from "./lint-layer-rules.js";
|
|
3
|
+
import { collectScaleLintAdvisories } from "./lint-scale-rules.js";
|
|
4
|
+
export { LINT_CATALOG } from "./lint-catalog.js";
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Field-type evidence (inline data or DataProfile; absent = rules skip)
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
function isRecord(v) {
|
|
9
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Standalone evidence build (lintSpec without a shared map from validate).
|
|
13
|
+
* Merges options.limits into DEFAULT_VALIDATE_LIMITS the same way validate()
|
|
14
|
+
* does, so callers can raise or lower maxRows/maxBytes and data-aware rules
|
|
15
|
+
* honor the override (skip over-limit; never fabricate a complaint).
|
|
16
|
+
*/
|
|
17
|
+
function buildEvidence(spec, options) {
|
|
18
|
+
const limits = { ...DEFAULT_VALIDATE_LIMITS, ...options?.limits };
|
|
19
|
+
const resolved = resolveFieldEvidence(spec, options ?? {}, limits);
|
|
20
|
+
return resolved.status === "ok" ? resolved.fields : null;
|
|
21
|
+
}
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// lintSpec
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
/**
|
|
26
|
+
* Lint a spec for valid-but-questionable constructs. `options` mirrors
|
|
27
|
+
* validate(): pass `{ profile }` to lint against out-of-band data, or let the
|
|
28
|
+
* spec's inline data provide the evidence; `options.limits` merges over
|
|
29
|
+
* DEFAULT_VALIDATE_LIMITS the same way validate() does. Rules whose evidence
|
|
30
|
+
* is missing (including over-limit inline data) skip silently — lint never
|
|
31
|
+
* fabricates a complaint.
|
|
32
|
+
*
|
|
33
|
+
* When called from validate({ lint: true }), pass `sharedEvidence` so field
|
|
34
|
+
* types/columns are not rebuilt after dataChecks already resolved them.
|
|
35
|
+
*/
|
|
36
|
+
export function lintSpec(spec, options, sharedEvidence) {
|
|
37
|
+
if (!isRecord(spec) || !Array.isArray(spec["layers"]))
|
|
38
|
+
return [];
|
|
39
|
+
const evidence = sharedEvidence === undefined ? buildEvidence(spec, options) : sharedEvidence;
|
|
40
|
+
const plotAes = isRecord(spec["aes"]) ? spec["aes"] : undefined;
|
|
41
|
+
const layers = spec["layers"];
|
|
42
|
+
const scales = isRecord(spec["scales"]) ? spec["scales"] : undefined;
|
|
43
|
+
const fieldOf = (layerAes, channel) => {
|
|
44
|
+
const mapped = effectiveChannel(plotAes, layerAes, channel);
|
|
45
|
+
if (mapped === undefined || !("field" in mapped))
|
|
46
|
+
return null;
|
|
47
|
+
const info = evidence?.get(mapped.field);
|
|
48
|
+
if (info === undefined)
|
|
49
|
+
return null;
|
|
50
|
+
return { field: mapped.field, info };
|
|
51
|
+
};
|
|
52
|
+
return [
|
|
53
|
+
...collectLayerLintAdvisories({ layers, fieldOf }),
|
|
54
|
+
...collectScaleLintAdvisories({ layers, scales, fieldOf }),
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=lint.js.map
|
package/dist/lint.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../src/lint.ts"],"names":[],"mappings":"AAqCA,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAgD,MAAM,mBAAmB,CAAC;AAc/F,8EAA8E;AAC9E,wEAAwE;AACxE,8EAA8E;AAE9E,SAAS,QAAQ,CAAC,CAAU;IAC1B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CACpB,IAA6B,EAC7B,OAAoC;IAEpC,MAAM,MAAM,GAAG,EAAE,GAAG,uBAAuB,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC;IAClE,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IACnE,OAAO,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3D,CAAC;AAED,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,QAAQ,CACtB,IAAa,EACb,OAAyB,EACzB,cAAwC;IAExC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IACjE,MAAM,QAAQ,GAAG,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;IAC9F,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAc,CAAC;IAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAErE,MAAM,OAAO,GAAG,CACd,QAAyB,EACzB,OAAoB,EACgC,EAAE;QACtD,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5D,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9D,MAAM,IAAI,GAAG,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;IACvC,CAAC,CAAC;IAEF,OAAO;QACL,GAAG,0BAA0B,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAClD,GAAG,0BAA0B,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;KAC3D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coordinate-system canonicalization for normalize()
|
|
3
|
+
* (cartesian/flip/transform/fixed/sf/radial).
|
|
4
|
+
* Scales: normalize-scales.ts. Layer/aes orchestration: normalize.ts.
|
|
5
|
+
*/
|
|
6
|
+
import type { CoordSpec } from "./schema.js";
|
|
7
|
+
export declare function normalizeCoord(coord: CoordSpec | undefined): CoordSpec | undefined;
|
|
8
|
+
//# sourceMappingURL=normalize-coord.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-coord.d.ts","sourceRoot":"","sources":["../src/normalize-coord.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAEV,SAAS,EAGV,MAAM,aAAa,CAAC;AAgDrB,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAmBlF"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coordinate-system canonicalization for normalize()
|
|
3
|
+
* (cartesian/flip/transform/fixed/sf/radial).
|
|
4
|
+
* Scales: normalize-scales.ts. Layer/aes orchestration: normalize.ts.
|
|
5
|
+
*/
|
|
6
|
+
function normalizeCoordAxis(axis) {
|
|
7
|
+
if (axis === undefined)
|
|
8
|
+
return axis;
|
|
9
|
+
const runtimeAxis = axis;
|
|
10
|
+
if (runtimeAxis === null || typeof runtimeAxis !== "object" || Array.isArray(runtimeAxis))
|
|
11
|
+
return runtimeAxis;
|
|
12
|
+
// Preserve unknown and malformed runtime values so strict schema validation
|
|
13
|
+
// can reject them; only copy valid tuple-shaped limits defensively.
|
|
14
|
+
const record = runtimeAxis;
|
|
15
|
+
const normalized = {
|
|
16
|
+
...record,
|
|
17
|
+
...(Array.isArray(record["limits"]) && {
|
|
18
|
+
limits: [...record["limits"]],
|
|
19
|
+
}),
|
|
20
|
+
};
|
|
21
|
+
// Drop valid defaults (including explicit undefined from option spreads);
|
|
22
|
+
// preserve malformed non-booleans for schema reject.
|
|
23
|
+
if (record["reverse"] === false || record["reverse"] === undefined)
|
|
24
|
+
delete normalized.reverse;
|
|
25
|
+
if (record["expand"] === true || record["expand"] === undefined)
|
|
26
|
+
delete normalized.expand;
|
|
27
|
+
return normalized;
|
|
28
|
+
}
|
|
29
|
+
function effectiveCoordAxis(axis) {
|
|
30
|
+
if (axis === undefined)
|
|
31
|
+
return false;
|
|
32
|
+
const runtimeAxis = axis;
|
|
33
|
+
if (runtimeAxis === null || typeof runtimeAxis !== "object" || Array.isArray(runtimeAxis))
|
|
34
|
+
return true;
|
|
35
|
+
const reverse = axis.reverse;
|
|
36
|
+
const expand = axis.expand;
|
|
37
|
+
// Non-boolean reverse/expand must stay effective so schema can reject them.
|
|
38
|
+
const malformedReverse = reverse !== undefined && reverse !== true && reverse !== false;
|
|
39
|
+
const malformedExpand = expand !== undefined && expand !== true && expand !== false;
|
|
40
|
+
return (axis.transform !== "identity" ||
|
|
41
|
+
axis.limits !== undefined ||
|
|
42
|
+
axis.reverse === true ||
|
|
43
|
+
axis.expand === false ||
|
|
44
|
+
malformedReverse ||
|
|
45
|
+
malformedExpand ||
|
|
46
|
+
Object.keys(axis).some((key) => key !== "transform" && key !== "limits" && key !== "reverse" && key !== "expand"));
|
|
47
|
+
}
|
|
48
|
+
export function normalizeCoord(coord) {
|
|
49
|
+
if (coord === undefined)
|
|
50
|
+
return undefined;
|
|
51
|
+
const runtimeCoord = coord;
|
|
52
|
+
if (runtimeCoord === null || typeof runtimeCoord !== "object" || Array.isArray(runtimeCoord))
|
|
53
|
+
return runtimeCoord;
|
|
54
|
+
const record = runtimeCoord;
|
|
55
|
+
if (record["type"] === "cartesian")
|
|
56
|
+
return Object.keys(record).some((key) => key !== "type")
|
|
57
|
+
? { ...record }
|
|
58
|
+
: undefined;
|
|
59
|
+
if (record["type"] === "flip")
|
|
60
|
+
return { ...record };
|
|
61
|
+
if (record["type"] === "fixed" || record["type"] === "sf") {
|
|
62
|
+
return normalizeFixedCoord(record);
|
|
63
|
+
}
|
|
64
|
+
if (record["type"] === "radial") {
|
|
65
|
+
return normalizeRadialCoord(record);
|
|
66
|
+
}
|
|
67
|
+
if (record["type"] !== "transform")
|
|
68
|
+
return { ...record };
|
|
69
|
+
return normalizeTransformCoord(coord);
|
|
70
|
+
}
|
|
71
|
+
function normalizeFixedCoord(record) {
|
|
72
|
+
const fixed = { ...record };
|
|
73
|
+
if (fixed.ratio === 1 || fixed.ratio === undefined)
|
|
74
|
+
delete fixed.ratio;
|
|
75
|
+
return fixed;
|
|
76
|
+
}
|
|
77
|
+
function normalizeRadialCoord(record) {
|
|
78
|
+
const radial = { ...record };
|
|
79
|
+
if (radial.theta === "x" || radial.theta === undefined)
|
|
80
|
+
delete radial.theta;
|
|
81
|
+
if (radial.start === 0 || radial.start === undefined)
|
|
82
|
+
delete radial.start;
|
|
83
|
+
if (radial.innerRadius === 0 || radial.innerRadius === undefined)
|
|
84
|
+
delete radial.innerRadius;
|
|
85
|
+
if (radial.expand === true || radial.expand === undefined)
|
|
86
|
+
delete radial.expand;
|
|
87
|
+
if (radial.clip === false || radial.clip === undefined)
|
|
88
|
+
delete radial.clip;
|
|
89
|
+
if (radial.reverse === "none" || radial.reverse === undefined)
|
|
90
|
+
delete radial.reverse;
|
|
91
|
+
if (Array.isArray(radial.thetaLimits) && radial.thetaLimits.length === 2) {
|
|
92
|
+
radial.thetaLimits = [radial.thetaLimits[0], radial.thetaLimits[1]];
|
|
93
|
+
}
|
|
94
|
+
if (Array.isArray(radial.rLimits) && radial.rLimits.length === 2) {
|
|
95
|
+
radial.rLimits = [radial.rLimits[0], radial.rLimits[1]];
|
|
96
|
+
}
|
|
97
|
+
return radial;
|
|
98
|
+
}
|
|
99
|
+
function normalizeTransformCoord(transformed) {
|
|
100
|
+
const x = normalizeCoordAxis(transformed.x);
|
|
101
|
+
const y = normalizeCoordAxis(transformed.y);
|
|
102
|
+
const hasUnknownKey = Object.keys(transformed).some((key) => key !== "type" && key !== "x" && key !== "y" && key !== "clip");
|
|
103
|
+
// Default clip is true/absent; only collapse when clip is a valid default.
|
|
104
|
+
const clipIsDefault = transformed.clip === true || transformed.clip === undefined;
|
|
105
|
+
if (!effectiveCoordAxis(x) && !effectiveCoordAxis(y) && clipIsDefault && !hasUnknownKey) {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
const normalized = {
|
|
109
|
+
...transformed,
|
|
110
|
+
type: "transform",
|
|
111
|
+
...(effectiveCoordAxis(x) && { x: x }),
|
|
112
|
+
...(effectiveCoordAxis(y) && { y: y }),
|
|
113
|
+
};
|
|
114
|
+
if (!effectiveCoordAxis(x))
|
|
115
|
+
delete normalized.x;
|
|
116
|
+
if (!effectiveCoordAxis(y))
|
|
117
|
+
delete normalized.y;
|
|
118
|
+
// Keep false and non-boolean clip (malformed) for validation.
|
|
119
|
+
if (transformed.clip === true || transformed.clip === undefined)
|
|
120
|
+
delete normalized.clip;
|
|
121
|
+
return normalized;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=normalize-coord.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-coord.js","sourceRoot":"","sources":["../src/normalize-coord.ts"],"names":[],"mappings":"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"}
|