@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
package/dist/temporal.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Temporal authoring helpers and compatibility facade.
|
|
3
|
+
*
|
|
4
|
+
* Implementation is split:
|
|
5
|
+
* - temporal-parse-core.ts — types/schema, calendar parts→epoch, timezone
|
|
6
|
+
* - temporal-parse-format.ts — exact-format compile cache + parse
|
|
7
|
+
* - temporal-parse.ts — named engines, parseTemporal dispatcher, public re-exports
|
|
8
|
+
* - temporal-column.ts — inferTemporalColumn / parseTemporalColumn
|
|
9
|
+
* - this file — ymd/dmy/… helpers, epoch helpers, and re-exports so existing
|
|
10
|
+
* `./temporal.js` imports stay stable.
|
|
11
|
+
*
|
|
12
|
+
* Public parse helpers here register the Temporal polyfill so a bundler that
|
|
13
|
+
* tree-shakes `@ggts-sh/spec` for `parseTemporal` / column helpers still gets
|
|
14
|
+
* non-UTC zones. Lean render never imports this facade (only portable + core
|
|
15
|
+
* render, which stay free of the polyfill).
|
|
16
|
+
*/
|
|
17
|
+
import { ensureTemporalPolyfill } from "./temporal-polyfill.js";
|
|
18
|
+
import { parseTemporal, TemporalParseError } from "./temporal-parse.js";
|
|
19
|
+
// Side-effect for every public temporal facade import (parseTemporal, ymd, …).
|
|
20
|
+
ensureTemporalPolyfill();
|
|
21
|
+
export { TEMPORAL_PARSER_NAMES, TemporalParserSpecSchema, TemporalParseError, canonicalTemporalParserKey, parseTemporal, temporalImplementation, temporalParserConfigurationError, MONTH_DAY_REFERENCE_YEAR, } from "./temporal-parse.js";
|
|
22
|
+
export { inferTemporalColumn, parseTemporalColumn, } from "./temporal-column.js";
|
|
23
|
+
function convertOne(value, parser) {
|
|
24
|
+
const result = parseTemporal(value, parser);
|
|
25
|
+
if (!result.ok)
|
|
26
|
+
throw new TemporalParseError(parser, value, result.reason);
|
|
27
|
+
return new Date(result.epochMs);
|
|
28
|
+
}
|
|
29
|
+
function helper(parser) {
|
|
30
|
+
function convert(value) {
|
|
31
|
+
return Array.isArray(value)
|
|
32
|
+
? value.map((entry) => convertOne(entry, parser))
|
|
33
|
+
: convertOne(value, parser);
|
|
34
|
+
}
|
|
35
|
+
return convert;
|
|
36
|
+
}
|
|
37
|
+
export const ymd = helper("ymd");
|
|
38
|
+
export const ydm = helper("ydm");
|
|
39
|
+
export const mdy = helper("mdy");
|
|
40
|
+
export const myd = helper("myd");
|
|
41
|
+
export const dmy = helper("dmy");
|
|
42
|
+
export const dym = helper("dym");
|
|
43
|
+
export const ym = helper("ym");
|
|
44
|
+
export const my = helper("my");
|
|
45
|
+
export const yq = helper("yq");
|
|
46
|
+
export const ymd_hm = helper("ymd_hm");
|
|
47
|
+
export const ymd_hms = helper("ymd_hms");
|
|
48
|
+
export const ydm_hm = helper("ydm_hm");
|
|
49
|
+
export const ydm_hms = helper("ydm_hms");
|
|
50
|
+
export const mdy_hm = helper("mdy_hm");
|
|
51
|
+
export const mdy_hms = helper("mdy_hms");
|
|
52
|
+
export const myd_hm = helper("myd_hm");
|
|
53
|
+
export const myd_hms = helper("myd_hms");
|
|
54
|
+
export const dmy_hm = helper("dmy_hm");
|
|
55
|
+
export const dmy_hms = helper("dmy_hms");
|
|
56
|
+
export const dym_hm = helper("dym_hm");
|
|
57
|
+
export const dym_hms = helper("dym_hms");
|
|
58
|
+
export function parseTemporalFormat(value, format) {
|
|
59
|
+
return Array.isArray(value)
|
|
60
|
+
? value.map((entry) => convertOne(entry, { format }))
|
|
61
|
+
: convertOne(value, { format });
|
|
62
|
+
}
|
|
63
|
+
export function fromEpochSeconds(value) {
|
|
64
|
+
return Array.isArray(value)
|
|
65
|
+
? value.map((entry) => convertOne(entry, { epoch: "seconds" }))
|
|
66
|
+
: convertOne(value, { epoch: "seconds" });
|
|
67
|
+
}
|
|
68
|
+
export function fromEpochMilliseconds(value) {
|
|
69
|
+
return Array.isArray(value)
|
|
70
|
+
? value.map((entry) => convertOne(entry, { epoch: "milliseconds" }))
|
|
71
|
+
: convertOne(value, { epoch: "milliseconds" });
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=temporal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal.js","sourceRoot":"","sources":["../src/temporal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Temporal color/fill censor recovery for tier-2 data checks.
|
|
3
|
+
* Orchestrated by validate-data-checks-color.ts.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors runtime collectColorChannelValues + sequential/binned train recovery
|
|
6
|
+
* when parseFailure is "censor".
|
|
7
|
+
*/
|
|
8
|
+
import type { ColorScaleSpec } from "./schema.js";
|
|
9
|
+
import type { FieldEvidenceEntry } from "./validate-data-evidence.js";
|
|
10
|
+
import { type ChannelFieldUse, type TemporalDecisionCache } from "./validate-data-checks-temporal.js";
|
|
11
|
+
/**
|
|
12
|
+
* Recovery sources for `parseFailure: "censor"` on temporal color/fill scales.
|
|
13
|
+
* Mirrors runtime `collectColorChannelValues` + sequential/binned train:
|
|
14
|
+
* - domain endpoints must parse (else color-domain-invalid / color-binned-domain);
|
|
15
|
+
* a present-but-unusable domain blocks all recovery (runtime throws first)
|
|
16
|
+
* - binned breaks of length ≥ 2 must parse and be strictly increasing
|
|
17
|
+
* - sibling fields / scaled constants train only when they parse under the
|
|
18
|
+
* configured parser (and match temporalKind when authored)
|
|
19
|
+
*/
|
|
20
|
+
export declare function colorTemporalCensorRecovery(input: {
|
|
21
|
+
config: ColorScaleSpec | undefined;
|
|
22
|
+
colorFields: readonly ChannelFieldUse[];
|
|
23
|
+
colorScaledConstants: readonly unknown[];
|
|
24
|
+
temporalDecisionCache: TemporalDecisionCache;
|
|
25
|
+
evidenceOf: (use: ChannelFieldUse) => FieldEvidenceEntry | undefined;
|
|
26
|
+
typeOf: (use: ChannelFieldUse) => string | null;
|
|
27
|
+
}): {
|
|
28
|
+
hasExplicitDomain: boolean;
|
|
29
|
+
hasBinnedBreaks: boolean;
|
|
30
|
+
/** Authored domain exists but is not a usable two-endpoint train bound. */
|
|
31
|
+
domainBlocksRecovery: boolean;
|
|
32
|
+
trainingFields: ReadonlySet<string>;
|
|
33
|
+
constantTrains: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* A channel value (scaled constant or sibling field) parses under the
|
|
36
|
+
* configured/auto parser but conflicts with temporalKind — runtime still
|
|
37
|
+
* includes it in collectColorChannelValues and throws color-temporal-kind.
|
|
38
|
+
*/
|
|
39
|
+
kindConflicts: boolean;
|
|
40
|
+
conflictingKind: string | null;
|
|
41
|
+
};
|
|
42
|
+
export declare function censoredTemporalColorRecovers(input: {
|
|
43
|
+
config: ColorScaleSpec | undefined;
|
|
44
|
+
decision: {
|
|
45
|
+
status: string;
|
|
46
|
+
validatedCount?: number;
|
|
47
|
+
} | null | undefined;
|
|
48
|
+
field: string;
|
|
49
|
+
recovery: {
|
|
50
|
+
hasExplicitDomain: boolean;
|
|
51
|
+
hasBinnedBreaks: boolean;
|
|
52
|
+
domainBlocksRecovery: boolean;
|
|
53
|
+
trainingFields: ReadonlySet<string>;
|
|
54
|
+
constantTrains: boolean;
|
|
55
|
+
kindConflicts: boolean;
|
|
56
|
+
};
|
|
57
|
+
}): boolean;
|
|
58
|
+
//# sourceMappingURL=validate-data-checks-color-temporal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-data-checks-color-temporal.d.ts","sourceRoot":"","sources":["../src/validate-data-checks-color-temporal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC3B,MAAM,oCAAoC,CAAC;AAiB5C;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,SAAS,eAAe,EAAE,CAAC;IACxC,oBAAoB,EAAE,SAAS,OAAO,EAAE,CAAC;IACzC,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,UAAU,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACrE,MAAM,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,GAAG,IAAI,CAAC;CACjD,GAAG;IACF,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,2EAA2E;IAC3E,oBAAoB,EAAE,OAAO,CAAC;IAC9B,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,cAAc,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAmCA;AAyID,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC;IACnC,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE;QACR,iBAAiB,EAAE,OAAO,CAAC;QAC3B,eAAe,EAAE,OAAO,CAAC;QACzB,oBAAoB,EAAE,OAAO,CAAC;QAC9B,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QACpC,cAAc,EAAE,OAAO,CAAC;QACxB,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC;CACH,GAAG,OAAO,CAcV"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { parseTemporalColumn } from "./temporal-column.js";
|
|
2
|
+
import { temporalDecisionForField, temporalParserUsable, } from "./validate-data-checks-temporal.js";
|
|
3
|
+
/**
|
|
4
|
+
* Recovery sources for `parseFailure: "censor"` on temporal color/fill scales.
|
|
5
|
+
* Mirrors runtime `collectColorChannelValues` + sequential/binned train:
|
|
6
|
+
* - domain endpoints must parse (else color-domain-invalid / color-binned-domain);
|
|
7
|
+
* a present-but-unusable domain blocks all recovery (runtime throws first)
|
|
8
|
+
* - binned breaks of length ≥ 2 must parse and be strictly increasing
|
|
9
|
+
* - sibling fields / scaled constants train only when they parse under the
|
|
10
|
+
* configured parser (and match temporalKind when authored)
|
|
11
|
+
*/
|
|
12
|
+
export function colorTemporalCensorRecovery(input) {
|
|
13
|
+
const { config, colorFields, colorScaledConstants, temporalDecisionCache, typeOf, evidenceOf } = input;
|
|
14
|
+
const setup = temporalRecoverySetup(config);
|
|
15
|
+
const { hasExplicitDomain, domainBlocksRecovery } = temporalDomainRecovery(config, setup.parseBound);
|
|
16
|
+
// Do not drop null breaks: runtime maps every authored break and throws
|
|
17
|
+
// color-binned-breaks when any maps to undefined.
|
|
18
|
+
const hasBinnedBreaks = temporalBinnedBreaksTrain(config, setup.parseBound);
|
|
19
|
+
const fieldResult = temporalTrainingFields({
|
|
20
|
+
config,
|
|
21
|
+
colorFields,
|
|
22
|
+
temporalDecisionCache,
|
|
23
|
+
typeOf,
|
|
24
|
+
evidenceOf,
|
|
25
|
+
parser: setup.parser,
|
|
26
|
+
temporalOptions: setup.temporalOptions,
|
|
27
|
+
enabled: setup.temporalInputsUsable && setup.requestsTemporal,
|
|
28
|
+
});
|
|
29
|
+
const kindOk = (kind) => config?.temporalKind === undefined || kind === undefined || kind === config.temporalKind;
|
|
30
|
+
const constantResult = temporalTrainingConstants(colorScaledConstants, setup.parseBound, kindOk);
|
|
31
|
+
return {
|
|
32
|
+
hasExplicitDomain,
|
|
33
|
+
hasBinnedBreaks,
|
|
34
|
+
domainBlocksRecovery,
|
|
35
|
+
trainingFields: fieldResult.trainingFields,
|
|
36
|
+
constantTrains: constantResult.constantTrains,
|
|
37
|
+
kindConflicts: fieldResult.kindConflicts || constantResult.kindConflicts,
|
|
38
|
+
conflictingKind: constantResult.conflictingKind ?? fieldResult.conflictingKind,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function temporalRecoverySetup(config) {
|
|
42
|
+
const temporalInputsUsable = temporalParserUsable(config?.parse) &&
|
|
43
|
+
(config?.timezone === undefined || typeof config.timezone === "string") &&
|
|
44
|
+
(config?.disambiguation === undefined || typeof config.disambiguation === "string");
|
|
45
|
+
const temporalOptions = {
|
|
46
|
+
...(typeof config?.timezone === "string" && { timezone: config.timezone }),
|
|
47
|
+
...(typeof config?.disambiguation === "string" && { disambiguation: config.disambiguation }),
|
|
48
|
+
};
|
|
49
|
+
const parser = config?.parse ?? "auto";
|
|
50
|
+
const requestsTemporal = [
|
|
51
|
+
config?.temporalKind,
|
|
52
|
+
config?.parse,
|
|
53
|
+
config?.timezone,
|
|
54
|
+
config?.disambiguation,
|
|
55
|
+
].some((value) => value !== undefined);
|
|
56
|
+
return {
|
|
57
|
+
temporalInputsUsable,
|
|
58
|
+
requestsTemporal,
|
|
59
|
+
parser,
|
|
60
|
+
temporalOptions,
|
|
61
|
+
parseBound: temporalBoundParser(temporalInputsUsable, parser, temporalOptions),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function temporalDomainRecovery(config, parseBound) {
|
|
65
|
+
const domainValues = Array.isArray(config?.domain)
|
|
66
|
+
? config.domain.filter((value) => value !== null)
|
|
67
|
+
: [];
|
|
68
|
+
const hasExplicitDomain = domainValues.length === 2 && domainValues.every((value) => parseBound(value) !== null);
|
|
69
|
+
return {
|
|
70
|
+
hasExplicitDomain,
|
|
71
|
+
domainBlocksRecovery: Array.isArray(config?.domain) && !hasExplicitDomain,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function temporalBoundParser(usable, parser, options) {
|
|
75
|
+
return (value) => {
|
|
76
|
+
if (!usable || value === null || value === undefined)
|
|
77
|
+
return null;
|
|
78
|
+
if (!(value instanceof Date) && typeof value !== "string" && typeof value !== "number")
|
|
79
|
+
return null;
|
|
80
|
+
const column = parseTemporalColumn([value], parser, options);
|
|
81
|
+
if (column.valid[0] !== 1)
|
|
82
|
+
return null;
|
|
83
|
+
const epochMs = column.semantic[0];
|
|
84
|
+
if (epochMs === undefined || !Number.isFinite(epochMs))
|
|
85
|
+
return null;
|
|
86
|
+
return { epochMs, kind: column.decision.kind ?? undefined };
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function temporalBinnedBreaksTrain(config, parseBound) {
|
|
90
|
+
const breaks = config?.type === "binned" && Array.isArray(config.breaks) ? config.breaks : [];
|
|
91
|
+
if (breaks.length < 2)
|
|
92
|
+
return false;
|
|
93
|
+
const epochs = [];
|
|
94
|
+
for (const value of breaks) {
|
|
95
|
+
if (value === null)
|
|
96
|
+
return false;
|
|
97
|
+
const parsed = parseBound(value);
|
|
98
|
+
if (parsed === null)
|
|
99
|
+
return false;
|
|
100
|
+
epochs.push(parsed.epochMs);
|
|
101
|
+
}
|
|
102
|
+
return epochs.every((epoch, index) => index === 0 || epoch > (epochs[index - 1] ?? epoch));
|
|
103
|
+
}
|
|
104
|
+
function temporalTrainingFields(input) {
|
|
105
|
+
const trainingFields = new Set();
|
|
106
|
+
let conflictingKind = null;
|
|
107
|
+
if (!input.enabled)
|
|
108
|
+
return { trainingFields, kindConflicts: false, conflictingKind };
|
|
109
|
+
for (const use of input.colorFields) {
|
|
110
|
+
if (!fieldCanTrainTemporal(input.typeOf(use)))
|
|
111
|
+
continue;
|
|
112
|
+
const decision = temporalDecisionForField(input.temporalDecisionCache, use.field, input.evidenceOf(use), input.parser, input.temporalOptions);
|
|
113
|
+
if (decision === null || decision === undefined)
|
|
114
|
+
continue;
|
|
115
|
+
if (decision.status !== "temporal" && (decision.validatedCount ?? 0) === 0)
|
|
116
|
+
continue;
|
|
117
|
+
if (typeof input.config?.temporalKind === "string" &&
|
|
118
|
+
decision.kind !== null &&
|
|
119
|
+
decision.kind !== undefined &&
|
|
120
|
+
decision.kind !== input.config.temporalKind) {
|
|
121
|
+
conflictingKind = decision.kind;
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
trainingFields.add(use.field);
|
|
125
|
+
}
|
|
126
|
+
return { trainingFields, kindConflicts: conflictingKind !== null, conflictingKind };
|
|
127
|
+
}
|
|
128
|
+
function fieldCanTrainTemporal(type) {
|
|
129
|
+
return type === "temporal" || type === "quantitative" || type === "nominal" || type === "ordinal";
|
|
130
|
+
}
|
|
131
|
+
function temporalTrainingConstants(values, parseBound, kindOk) {
|
|
132
|
+
let constantTrains = false;
|
|
133
|
+
let conflictingKind = null;
|
|
134
|
+
for (const value of values) {
|
|
135
|
+
const parsed = parseBound(value);
|
|
136
|
+
if (parsed === null)
|
|
137
|
+
continue;
|
|
138
|
+
if (kindOk(parsed.kind))
|
|
139
|
+
constantTrains = true;
|
|
140
|
+
else
|
|
141
|
+
conflictingKind = parsed.kind ?? null;
|
|
142
|
+
}
|
|
143
|
+
return { constantTrains, kindConflicts: conflictingKind !== null, conflictingKind };
|
|
144
|
+
}
|
|
145
|
+
export function censoredTemporalColorRecovers(input) {
|
|
146
|
+
if (input.config?.parse === undefined || input.config.parseFailure !== "censor")
|
|
147
|
+
return false;
|
|
148
|
+
if (input.decision?.status !== "invalid")
|
|
149
|
+
return false;
|
|
150
|
+
// A present-but-unusable domain always throws at runtime before recovery sources apply.
|
|
151
|
+
if (input.recovery.domainBlocksRecovery)
|
|
152
|
+
return false;
|
|
153
|
+
// Kind-mismatched channel values still train and throw color-temporal-kind.
|
|
154
|
+
if (input.recovery.kindConflicts)
|
|
155
|
+
return false;
|
|
156
|
+
if ((input.decision.validatedCount ?? 0) > 0)
|
|
157
|
+
return true;
|
|
158
|
+
if (input.recovery.hasExplicitDomain || input.recovery.hasBinnedBreaks)
|
|
159
|
+
return true;
|
|
160
|
+
if (input.recovery.constantTrains)
|
|
161
|
+
return true;
|
|
162
|
+
for (const field of input.recovery.trainingFields) {
|
|
163
|
+
if (field !== input.field)
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=validate-data-checks-color-temporal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-data-checks-color-temporal.js","sourceRoot":"","sources":["../src/validate-data-checks-color-temporal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Color/fill data-aware scale checks (manual domain/range, sequential, temporal).
|
|
3
|
+
* Prefers per-use evidenceForUse over the last-wins union so multi-table same-name
|
|
4
|
+
* fields keep independent types (#609 / #844).
|
|
5
|
+
* Shared temporal memoization: validate-data-checks-temporal.ts.
|
|
6
|
+
* Temporal censor recovery: validate-data-checks-color-temporal.ts.
|
|
7
|
+
* Position: validate-data-checks-position.ts. Style: validate-data-checks-style.ts (finite + numeric).
|
|
8
|
+
* Orchestrator: validate-data-checks.ts.
|
|
9
|
+
*/
|
|
10
|
+
import type { SpecError } from "./errors.js";
|
|
11
|
+
import type { FieldEvidenceEntry, FieldEvidenceMap } from "./validate-data-evidence.js";
|
|
12
|
+
import { type ChannelFieldUse, type TemporalDecisionCache } from "./validate-data-checks-temporal.js";
|
|
13
|
+
/** Post-layer color/fill scale type compatibility against collected field uses. */
|
|
14
|
+
export declare function checkColorScaleDataCompatibility(input: {
|
|
15
|
+
scales: Record<string, unknown> | undefined;
|
|
16
|
+
fields: FieldEvidenceMap;
|
|
17
|
+
/**
|
|
18
|
+
* Optional per-use evidence lookup. When provided, prefer it over the
|
|
19
|
+
* last-wins `fields` union so multi-table layers with the same field name
|
|
20
|
+
* keep their own type evidence (#609 / #844).
|
|
21
|
+
*/
|
|
22
|
+
evidenceForUse?: (use: ChannelFieldUse) => FieldEvidenceEntry | undefined;
|
|
23
|
+
colorFields: Record<"color" | "fill", ChannelFieldUse[]>;
|
|
24
|
+
/** Scaled constants (`{ value, scale: true }`) included in runtime domain training. */
|
|
25
|
+
colorScaledConstants?: Record<"color" | "fill", readonly unknown[]>;
|
|
26
|
+
temporalDecisionCache: TemporalDecisionCache;
|
|
27
|
+
}): SpecError[];
|
|
28
|
+
//# sourceMappingURL=validate-data-checks-color.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-data-checks-color.d.ts","sourceRoot":"","sources":["../src/validate-data-checks-color.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACxF,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC3B,MAAM,oCAAoC,CAAC;AAkR5C,mFAAmF;AACnF,wBAAgB,gCAAgC,CAAC,KAAK,EAAE;IACtD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC5C,MAAM,EAAE,gBAAgB,CAAC;IACzB;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,kBAAkB,GAAG,SAAS,CAAC;IAC1E,WAAW,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;IACzD,uFAAuF;IACvF,oBAAoB,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC,CAAC;IACpE,qBAAqB,EAAE,qBAAqB,CAAC;CAC9C,GAAG,SAAS,EAAE,CAkEd"}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { configuredColorScaleType } from "./scale-helpers.js";
|
|
2
|
+
import { SEQUENTIAL_SCHEME_NAMES } from "./schema-names.js";
|
|
3
|
+
import { temporalDecisionForField, temporalParserUsable, } from "./validate-data-checks-temporal.js";
|
|
4
|
+
import { censoredTemporalColorRecovers, colorTemporalCensorRecovery, } from "./validate-data-checks-color-temporal.js";
|
|
5
|
+
const COLOR_CHANNELS = ["color", "fill"];
|
|
6
|
+
const SEQUENTIAL_SCHEMES = new Set(SEQUENTIAL_SCHEME_NAMES);
|
|
7
|
+
/** Type-preserving key for discrete domain identity (mirrors core encodeKey). */
|
|
8
|
+
function discreteDomainKey(value) {
|
|
9
|
+
switch (typeof value) {
|
|
10
|
+
case "string":
|
|
11
|
+
return value.startsWith("@") ? "@" + value : value;
|
|
12
|
+
case "number":
|
|
13
|
+
if (Number.isNaN(value))
|
|
14
|
+
return "@n:NaN";
|
|
15
|
+
if (Object.is(value, -0))
|
|
16
|
+
return "@n:-0";
|
|
17
|
+
return "@n:" + String(value);
|
|
18
|
+
case "boolean":
|
|
19
|
+
return "@b:" + String(value);
|
|
20
|
+
case "bigint":
|
|
21
|
+
return "@i:" + value.toString();
|
|
22
|
+
case "undefined":
|
|
23
|
+
return "@undefined";
|
|
24
|
+
default:
|
|
25
|
+
if (value === null)
|
|
26
|
+
return "@null";
|
|
27
|
+
if (value instanceof Date) {
|
|
28
|
+
const t = value.getTime();
|
|
29
|
+
return "@d:" + (Number.isNaN(t) ? "NaN" : String(t));
|
|
30
|
+
}
|
|
31
|
+
return JSON.stringify(value);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function expectedManualDomainLength(domain, fieldValueLists, scaledConstants = []) {
|
|
35
|
+
if (Array.isArray(domain)) {
|
|
36
|
+
return { kind: "exact", size: domain.filter((value) => value !== null).length };
|
|
37
|
+
}
|
|
38
|
+
// DataProfile fields have values: null. Unknown field values disable an
|
|
39
|
+
// exact inference, but known scaled constants still yield a lower bound
|
|
40
|
+
// (runtime domain is at least those constants, plus any field categories).
|
|
41
|
+
const seen = new Set();
|
|
42
|
+
let sawValues = false;
|
|
43
|
+
let unknownFieldValues = false;
|
|
44
|
+
for (const values of fieldValueLists) {
|
|
45
|
+
if (values === null || values === undefined) {
|
|
46
|
+
unknownFieldValues = true;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
sawValues = true;
|
|
50
|
+
for (const value of values) {
|
|
51
|
+
if (value === null)
|
|
52
|
+
continue;
|
|
53
|
+
seen.add(discreteDomainKey(value));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
for (const value of scaledConstants) {
|
|
57
|
+
if (value === null)
|
|
58
|
+
continue;
|
|
59
|
+
sawValues = true;
|
|
60
|
+
seen.add(discreteDomainKey(value));
|
|
61
|
+
}
|
|
62
|
+
if (!sawValues)
|
|
63
|
+
return null;
|
|
64
|
+
return { kind: unknownFieldValues ? "min" : "exact", size: seen.size };
|
|
65
|
+
}
|
|
66
|
+
function manualColorRangeErrors(input) {
|
|
67
|
+
const { channel, config, effectiveType, uses, constants, evidenceOf } = input;
|
|
68
|
+
if (effectiveType !== "manual" && config?.type !== "manual")
|
|
69
|
+
return [];
|
|
70
|
+
if (!Array.isArray(config?.range))
|
|
71
|
+
return [];
|
|
72
|
+
const expected = expectedManualDomainLength(config.domain, uses.map((use) => evidenceOf(use)?.values), constants);
|
|
73
|
+
if (expected === null)
|
|
74
|
+
return [];
|
|
75
|
+
const mismatch = expected.kind === "exact"
|
|
76
|
+
? config.range.length !== expected.size
|
|
77
|
+
: config.range.length < expected.size;
|
|
78
|
+
if (!mismatch)
|
|
79
|
+
return [];
|
|
80
|
+
return [
|
|
81
|
+
{
|
|
82
|
+
code: "color-manual-domain-range",
|
|
83
|
+
path: `/scales/${channel}`,
|
|
84
|
+
message: expected.kind === "exact"
|
|
85
|
+
? `The manual ${channel} scale needs one range color per domain value (${String(expected.size)} values, ${String(config.range.length)} colors).`
|
|
86
|
+
: `The manual ${channel} scale has at least ${String(expected.size)} known domain values (scaled constants and/or observed categories) but only ${String(config.range.length)} range colors.`,
|
|
87
|
+
fix: {
|
|
88
|
+
description: `Provide at least ${String(expected.size)} range colors, or set scales.${channel}.domain explicitly to match the range length.`,
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
}
|
|
93
|
+
function colorFieldErrors(input) {
|
|
94
|
+
const type = input.typeOf(input.use);
|
|
95
|
+
const transformError = temporalColorTransformError(input, type);
|
|
96
|
+
if (transformError !== null)
|
|
97
|
+
return [transformError];
|
|
98
|
+
if (type === "quantitative" && input.requestsTemporal) {
|
|
99
|
+
return quantitativeTemporalColorErrors(input);
|
|
100
|
+
}
|
|
101
|
+
if (type !== "nominal" && type !== "ordinal")
|
|
102
|
+
return [];
|
|
103
|
+
if (input.requestsTemporal && !temporalParserUsable(input.config?.parse))
|
|
104
|
+
return [];
|
|
105
|
+
return input.requestsTemporal
|
|
106
|
+
? discreteTemporalColorErrors(input, type)
|
|
107
|
+
: [discreteSequentialColorError(input, type)];
|
|
108
|
+
}
|
|
109
|
+
function temporalColorTransformError(input, type) {
|
|
110
|
+
const transform = input.config?.transform;
|
|
111
|
+
if (type !== "temporal" || transform === undefined || transform === "identity")
|
|
112
|
+
return null;
|
|
113
|
+
return {
|
|
114
|
+
code: "scale-type-mismatch",
|
|
115
|
+
path: input.use.path,
|
|
116
|
+
message: `scales.${input.channel}.transform is "${transform}" but field "${input.use.field}" is temporal; temporal color scales permit only the identity transform.`,
|
|
117
|
+
fix: {
|
|
118
|
+
description: `Remove scales.${input.channel}.transform to keep temporal inference, or map a non-temporal quantitative field.`,
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function colorTemporalDecision(input) {
|
|
123
|
+
return temporalDecisionForField(input.temporalDecisionCache, input.use.field, input.evidenceOf(input.use), input.config?.parse ?? "auto", {
|
|
124
|
+
...(input.config?.timezone !== undefined && { timezone: input.config.timezone }),
|
|
125
|
+
...(input.config?.disambiguation !== undefined && {
|
|
126
|
+
disambiguation: input.config.disambiguation,
|
|
127
|
+
}),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
function quantitativeTemporalColorErrors(input) {
|
|
131
|
+
if (!temporalParserUsable(input.config?.parse))
|
|
132
|
+
return [];
|
|
133
|
+
const decision = colorTemporalDecision(input);
|
|
134
|
+
const recovers = censoredTemporalColorRecovers({
|
|
135
|
+
config: input.config,
|
|
136
|
+
decision,
|
|
137
|
+
field: input.use.field,
|
|
138
|
+
recovery: input.recovery,
|
|
139
|
+
});
|
|
140
|
+
if (decision?.status !== "temporal" && !recovers) {
|
|
141
|
+
return [
|
|
142
|
+
{
|
|
143
|
+
code: "scale-type-mismatch",
|
|
144
|
+
path: input.use.path,
|
|
145
|
+
message: `scales.${input.channel} requests temporal colors but field "${input.use.field}" is quantitative (numbers are not treated as temporal without a successful epoch parse).`,
|
|
146
|
+
fix: {
|
|
147
|
+
description: `Map a temporal field, use a working parse: { epoch: "ms" | "s" }, or remove temporal color options.`,
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
];
|
|
151
|
+
}
|
|
152
|
+
const kindError = temporalColorKindError(input, decision?.kind);
|
|
153
|
+
return kindError === null ? [] : [kindError];
|
|
154
|
+
}
|
|
155
|
+
function temporalColorKindError(input, actualKind) {
|
|
156
|
+
const expectedKind = input.config?.temporalKind;
|
|
157
|
+
if (expectedKind === undefined ||
|
|
158
|
+
actualKind === null ||
|
|
159
|
+
actualKind === undefined ||
|
|
160
|
+
actualKind === expectedKind)
|
|
161
|
+
return null;
|
|
162
|
+
return {
|
|
163
|
+
code: "scale-type-mismatch",
|
|
164
|
+
path: input.use.path,
|
|
165
|
+
message: `scales.${input.channel} requests temporal kind "${expectedKind}" but field "${input.use.field}" parses as "${actualKind}".`,
|
|
166
|
+
fix: {
|
|
167
|
+
description: `Use the ${actualKind} color helper or correct the source precision.`,
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
function discreteSequentialColorError(input, type) {
|
|
172
|
+
const { channel, config, effectiveType, inferredFromSequentialScheme, use } = input;
|
|
173
|
+
return {
|
|
174
|
+
code: "scale-type-mismatch",
|
|
175
|
+
path: use.path,
|
|
176
|
+
message: inferredFromSequentialScheme
|
|
177
|
+
? `scales.${channel}.scheme is "${config?.scheme}" and selects a sequential scale, but field "${use.field}" is ${type}; sequential color ramps need quantitative values.`
|
|
178
|
+
: `scales.${channel}.type is "${effectiveType}" but field "${use.field}" is ${type}; quantitative color scales need quantitative or temporal values.`,
|
|
179
|
+
fix: inferredFromSequentialScheme
|
|
180
|
+
? {
|
|
181
|
+
description: `Set scales.${channel}.scheme to a categorical scheme, remove it to infer an ordinal scale from "${use.field}", or map a quantitative field.`,
|
|
182
|
+
example: { scheme: "observable10" },
|
|
183
|
+
}
|
|
184
|
+
: { description: `Set scales.${channel}.type to "ordinal".` },
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
function discreteTemporalColorErrors(input, type) {
|
|
188
|
+
const decision = colorTemporalDecision(input);
|
|
189
|
+
const recovers = censoredTemporalColorRecovers({
|
|
190
|
+
config: input.config,
|
|
191
|
+
decision,
|
|
192
|
+
field: input.use.field,
|
|
193
|
+
recovery: input.recovery,
|
|
194
|
+
});
|
|
195
|
+
if (decision?.status === "temporal" || recovers) {
|
|
196
|
+
const kindError = temporalColorKindError(input, decision?.kind);
|
|
197
|
+
return kindError === null ? [] : [kindError];
|
|
198
|
+
}
|
|
199
|
+
const detail = colorTemporalDecisionDetail(decision);
|
|
200
|
+
return [
|
|
201
|
+
{
|
|
202
|
+
code: "scale-type-mismatch",
|
|
203
|
+
path: input.use.path,
|
|
204
|
+
message: `scales.${input.channel} requests temporal colors but field "${input.use.field}" is ${type}.${detail}`,
|
|
205
|
+
fix: {
|
|
206
|
+
description: input.config?.parse === undefined
|
|
207
|
+
? `Set scales.${input.channel}.parse to the exact temporal order, or use type: "ordinal".`
|
|
208
|
+
: `Correct the rejected values, choose the matching parser, or set parseFailure: "censor" explicitly.`,
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
];
|
|
212
|
+
}
|
|
213
|
+
function colorTemporalDecisionDetail(decision) {
|
|
214
|
+
if (decision?.status === "ambiguous") {
|
|
215
|
+
return ` Automatic temporal inference was ambiguous between: ${decision.candidates.join(", ")}.`;
|
|
216
|
+
}
|
|
217
|
+
if (decision?.status === "invalid") {
|
|
218
|
+
return ` Temporal parsing rejected ${String(decision.failedCount)} value(s).`;
|
|
219
|
+
}
|
|
220
|
+
return "";
|
|
221
|
+
}
|
|
222
|
+
/** Post-layer color/fill scale type compatibility against collected field uses. */
|
|
223
|
+
export function checkColorScaleDataCompatibility(input) {
|
|
224
|
+
const { scales, fields, colorFields, temporalDecisionCache } = input;
|
|
225
|
+
const colorScaledConstants = input.colorScaledConstants ?? { color: [], fill: [] };
|
|
226
|
+
const errors = [];
|
|
227
|
+
const evidenceOf = (use) => input.evidenceForUse?.(use) ?? fields.get(use.field);
|
|
228
|
+
const typeOf = (use) => evidenceOf(use)?.type ?? null;
|
|
229
|
+
for (const channel of COLOR_CHANNELS) {
|
|
230
|
+
const config = scales?.[channel];
|
|
231
|
+
const effectiveType = configuredColorScaleType(config);
|
|
232
|
+
errors.push(...manualColorRangeErrors({
|
|
233
|
+
channel,
|
|
234
|
+
config,
|
|
235
|
+
effectiveType,
|
|
236
|
+
uses: colorFields[channel],
|
|
237
|
+
constants: colorScaledConstants[channel],
|
|
238
|
+
evidenceOf,
|
|
239
|
+
}));
|
|
240
|
+
const inferredFromSequentialScheme = config?.type === undefined &&
|
|
241
|
+
config?.range === undefined &&
|
|
242
|
+
config?.scheme !== undefined &&
|
|
243
|
+
SEQUENTIAL_SCHEMES.has(config.scheme);
|
|
244
|
+
if (effectiveType !== "sequential" && effectiveType !== "binned")
|
|
245
|
+
continue;
|
|
246
|
+
const requestsTemporal = [
|
|
247
|
+
config?.temporalKind,
|
|
248
|
+
config?.parse,
|
|
249
|
+
config?.timezone,
|
|
250
|
+
config?.disambiguation,
|
|
251
|
+
].some((value) => value !== undefined);
|
|
252
|
+
const recovery = colorTemporalCensorRecovery({
|
|
253
|
+
config,
|
|
254
|
+
colorFields: colorFields[channel],
|
|
255
|
+
colorScaledConstants: colorScaledConstants[channel],
|
|
256
|
+
temporalDecisionCache,
|
|
257
|
+
evidenceOf,
|
|
258
|
+
typeOf,
|
|
259
|
+
});
|
|
260
|
+
// Runtime collects all channel values into one temporal column; a kind
|
|
261
|
+
// conflict (sibling field or scaled constant) throws color-temporal-kind.
|
|
262
|
+
const conflictError = colorChannelKindConflictError(channel, config, recovery);
|
|
263
|
+
if (conflictError !== null)
|
|
264
|
+
errors.push(conflictError);
|
|
265
|
+
for (const use of colorFields[channel]) {
|
|
266
|
+
errors.push(...colorFieldErrors({
|
|
267
|
+
channel,
|
|
268
|
+
config,
|
|
269
|
+
effectiveType,
|
|
270
|
+
inferredFromSequentialScheme,
|
|
271
|
+
requestsTemporal,
|
|
272
|
+
recovery,
|
|
273
|
+
use,
|
|
274
|
+
evidenceOf,
|
|
275
|
+
typeOf,
|
|
276
|
+
temporalDecisionCache,
|
|
277
|
+
}));
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return errors;
|
|
281
|
+
}
|
|
282
|
+
function colorChannelKindConflictError(channel, config, recovery) {
|
|
283
|
+
if (!recovery.kindConflicts ||
|
|
284
|
+
typeof config?.temporalKind !== "string" ||
|
|
285
|
+
recovery.conflictingKind === null)
|
|
286
|
+
return null;
|
|
287
|
+
return {
|
|
288
|
+
code: "scale-type-mismatch",
|
|
289
|
+
path: `/scales/${channel}`,
|
|
290
|
+
message: `scales.${channel} requests temporal kind "${config.temporalKind}" but a channel value parses as "${recovery.conflictingKind}".`,
|
|
291
|
+
fix: {
|
|
292
|
+
description: `Use ${config.temporalKind} values for every color mapping and scaled constant, or set temporalKind to "${recovery.conflictingKind}".`,
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=validate-data-checks-color.js.map
|