@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.
Files changed (679) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +75 -0
  3. package/dist/artifact.d.ts +11 -0
  4. package/dist/artifact.d.ts.map +1 -0
  5. package/dist/artifact.js +71 -0
  6. package/dist/artifact.js.map +1 -0
  7. package/dist/builder-core.d.ts +100 -0
  8. package/dist/builder-core.d.ts.map +1 -0
  9. package/dist/builder-core.js +176 -0
  10. package/dist/builder-core.js.map +1 -0
  11. package/dist/builder-data.d.ts +36 -0
  12. package/dist/builder-data.d.ts.map +1 -0
  13. package/dist/builder-data.js +123 -0
  14. package/dist/builder-data.js.map +1 -0
  15. package/dist/builder-geoms.d.ts +128 -0
  16. package/dist/builder-geoms.d.ts.map +1 -0
  17. package/dist/builder-geoms.js +221 -0
  18. package/dist/builder-geoms.js.map +1 -0
  19. package/dist/builder-options.d.ts +323 -0
  20. package/dist/builder-options.d.ts.map +1 -0
  21. package/dist/builder-options.js +2 -0
  22. package/dist/builder-options.js.map +1 -0
  23. package/dist/builder-scales.d.ts +160 -0
  24. package/dist/builder-scales.d.ts.map +1 -0
  25. package/dist/builder-scales.js +322 -0
  26. package/dist/builder-scales.js.map +1 -0
  27. package/dist/builder.d.ts +242 -0
  28. package/dist/builder.d.ts.map +1 -0
  29. package/dist/builder.js +42 -0
  30. package/dist/builder.js.map +1 -0
  31. package/dist/capabilities-data.d.ts +72 -0
  32. package/dist/capabilities-data.d.ts.map +1 -0
  33. package/dist/capabilities-data.js +337 -0
  34. package/dist/capabilities-data.js.map +1 -0
  35. package/dist/capabilities-helpers.d.ts +31 -0
  36. package/dist/capabilities-helpers.d.ts.map +1 -0
  37. package/dist/capabilities-helpers.js +41 -0
  38. package/dist/capabilities-helpers.js.map +1 -0
  39. package/dist/capabilities.d.ts +22 -0
  40. package/dist/capabilities.d.ts.map +1 -0
  41. package/dist/capabilities.js +154 -0
  42. package/dist/capabilities.js.map +1 -0
  43. package/dist/coord-helpers.d.ts +102 -0
  44. package/dist/coord-helpers.d.ts.map +1 -0
  45. package/dist/coord-helpers.js +90 -0
  46. package/dist/coord-helpers.js.map +1 -0
  47. package/dist/coord-reference-build.d.ts +50 -0
  48. package/dist/coord-reference-build.d.ts.map +1 -0
  49. package/dist/coord-reference-build.js +211 -0
  50. package/dist/coord-reference-build.js.map +1 -0
  51. package/dist/coord-reference.d.ts +52 -0
  52. package/dist/coord-reference.d.ts.map +1 -0
  53. package/dist/coord-reference.js +27 -0
  54. package/dist/coord-reference.js.map +1 -0
  55. package/dist/error-catalog.d.ts +258 -0
  56. package/dist/error-catalog.d.ts.map +1 -0
  57. package/dist/error-catalog.js +235 -0
  58. package/dist/error-catalog.js.map +1 -0
  59. package/dist/error-prose-shared.d.ts +100 -0
  60. package/dist/error-prose-shared.d.ts.map +1 -0
  61. package/dist/error-prose-shared.js +95 -0
  62. package/dist/error-prose-shared.js.map +1 -0
  63. package/dist/errors.d.ts +39 -0
  64. package/dist/errors.d.ts.map +1 -0
  65. package/dist/errors.js +52 -0
  66. package/dist/errors.js.map +1 -0
  67. package/dist/generated/coord-reference-data.d.ts +189 -0
  68. package/dist/generated/coord-reference-data.d.ts.map +1 -0
  69. package/dist/generated/coord-reference-data.js +212 -0
  70. package/dist/generated/coord-reference-data.js.map +1 -0
  71. package/dist/generated/geom-param-keys.d.ts +58 -0
  72. package/dist/generated/geom-param-keys.d.ts.map +1 -0
  73. package/dist/generated/geom-param-keys.js +223 -0
  74. package/dist/generated/geom-param-keys.js.map +1 -0
  75. package/dist/generated/geom-reference-data.d.ts +2377 -0
  76. package/dist/generated/geom-reference-data.d.ts.map +1 -0
  77. package/dist/generated/geom-reference-data.js +2790 -0
  78. package/dist/generated/geom-reference-data.js.map +1 -0
  79. package/dist/generated/guide-reference-data.d.ts +219 -0
  80. package/dist/generated/guide-reference-data.d.ts.map +1 -0
  81. package/dist/generated/guide-reference-data.js +253 -0
  82. package/dist/generated/guide-reference-data.js.map +1 -0
  83. package/dist/generated/plot-spec-validator.d.ts +2 -0
  84. package/dist/generated/plot-spec-validator.d.ts.map +1 -0
  85. package/dist/generated/plot-spec-validator.js +6274 -0
  86. package/dist/generated/plot-spec-validator.js.map +1 -0
  87. package/dist/generated/position-reference-data.d.ts +82 -0
  88. package/dist/generated/position-reference-data.d.ts.map +1 -0
  89. package/dist/generated/position-reference-data.js +181 -0
  90. package/dist/generated/position-reference-data.js.map +1 -0
  91. package/dist/generated/scale-reference-data.d.ts +8366 -0
  92. package/dist/generated/scale-reference-data.d.ts.map +1 -0
  93. package/dist/generated/scale-reference-data.js +9821 -0
  94. package/dist/generated/scale-reference-data.js.map +1 -0
  95. package/dist/generated/stat-reference-data.d.ts +241 -0
  96. package/dist/generated/stat-reference-data.d.ts.map +1 -0
  97. package/dist/generated/stat-reference-data.js +311 -0
  98. package/dist/generated/stat-reference-data.js.map +1 -0
  99. package/dist/geom-params-build.d.ts +3 -0
  100. package/dist/geom-params-build.d.ts.map +1 -0
  101. package/dist/geom-params-build.js +80 -0
  102. package/dist/geom-params-build.js.map +1 -0
  103. package/dist/geom-params.d.ts +13 -0
  104. package/dist/geom-params.d.ts.map +1 -0
  105. package/dist/geom-params.js +7 -0
  106. package/dist/geom-params.js.map +1 -0
  107. package/dist/geom-reference-build.d.ts +29 -0
  108. package/dist/geom-reference-build.d.ts.map +1 -0
  109. package/dist/geom-reference-build.js +221 -0
  110. package/dist/geom-reference-build.js.map +1 -0
  111. package/dist/geom-reference.d.ts +52 -0
  112. package/dist/geom-reference.d.ts.map +1 -0
  113. package/dist/geom-reference.js +72 -0
  114. package/dist/geom-reference.js.map +1 -0
  115. package/dist/guide-helpers.d.ts +20 -0
  116. package/dist/guide-helpers.d.ts.map +1 -0
  117. package/dist/guide-helpers.js +25 -0
  118. package/dist/guide-helpers.js.map +1 -0
  119. package/dist/guide-reference-build.d.ts +42 -0
  120. package/dist/guide-reference-build.d.ts.map +1 -0
  121. package/dist/guide-reference-build.js +180 -0
  122. package/dist/guide-reference-build.js.map +1 -0
  123. package/dist/guide-reference.d.ts +48 -0
  124. package/dist/guide-reference.d.ts.map +1 -0
  125. package/dist/guide-reference.js +32 -0
  126. package/dist/guide-reference.js.map +1 -0
  127. package/dist/hue-grey-palettes.d.ts +15 -0
  128. package/dist/hue-grey-palettes.d.ts.map +1 -0
  129. package/dist/hue-grey-palettes.js +77 -0
  130. package/dist/hue-grey-palettes.js.map +1 -0
  131. package/dist/index.d.ts +364 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +225 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/lint-catalog.d.ts +47 -0
  136. package/dist/lint-catalog.d.ts.map +1 -0
  137. package/dist/lint-catalog.js +39 -0
  138. package/dist/lint-catalog.js.map +1 -0
  139. package/dist/lint-layer-rules.d.ts +18 -0
  140. package/dist/lint-layer-rules.d.ts.map +1 -0
  141. package/dist/lint-layer-rules.js +145 -0
  142. package/dist/lint-layer-rules.js.map +1 -0
  143. package/dist/lint-scale-rules.d.ts +8 -0
  144. package/dist/lint-scale-rules.d.ts.map +1 -0
  145. package/dist/lint-scale-rules.js +254 -0
  146. package/dist/lint-scale-rules.js.map +1 -0
  147. package/dist/lint.d.ts +62 -0
  148. package/dist/lint.d.ts.map +1 -0
  149. package/dist/lint.js +57 -0
  150. package/dist/lint.js.map +1 -0
  151. package/dist/normalize-coord.d.ts +8 -0
  152. package/dist/normalize-coord.d.ts.map +1 -0
  153. package/dist/normalize-coord.js +123 -0
  154. package/dist/normalize-coord.js.map +1 -0
  155. package/dist/normalize-input-layers-marks.d.ts +208 -0
  156. package/dist/normalize-input-layers-marks.d.ts.map +1 -0
  157. package/dist/normalize-input-layers-marks.js +2 -0
  158. package/dist/normalize-input-layers-marks.js.map +1 -0
  159. package/dist/normalize-input-layers-special.d.ts +131 -0
  160. package/dist/normalize-input-layers-special.d.ts.map +1 -0
  161. package/dist/normalize-input-layers-special.js +2 -0
  162. package/dist/normalize-input-layers-special.js.map +1 -0
  163. package/dist/normalize-input.d.ts +81 -0
  164. package/dist/normalize-input.d.ts.map +1 -0
  165. package/dist/normalize-input.js +2 -0
  166. package/dist/normalize-input.js.map +1 -0
  167. package/dist/normalize-paint.d.ts +8 -0
  168. package/dist/normalize-paint.d.ts.map +1 -0
  169. package/dist/normalize-paint.js +83 -0
  170. package/dist/normalize-paint.js.map +1 -0
  171. package/dist/normalize-scales.d.ts +7 -0
  172. package/dist/normalize-scales.d.ts.map +1 -0
  173. package/dist/normalize-scales.js +90 -0
  174. package/dist/normalize-scales.js.map +1 -0
  175. package/dist/normalize.d.ts +46 -0
  176. package/dist/normalize.d.ts.map +1 -0
  177. package/dist/normalize.js +279 -0
  178. package/dist/normalize.js.map +1 -0
  179. package/dist/paint-helpers.d.ts +45 -0
  180. package/dist/paint-helpers.d.ts.map +1 -0
  181. package/dist/paint-helpers.js +48 -0
  182. package/dist/paint-helpers.js.map +1 -0
  183. package/dist/pipeline-error-catalog.d.ts +319 -0
  184. package/dist/pipeline-error-catalog.d.ts.map +1 -0
  185. package/dist/pipeline-error-catalog.js +260 -0
  186. package/dist/pipeline-error-catalog.js.map +1 -0
  187. package/dist/portability-check.d.ts +35 -0
  188. package/dist/portability-check.d.ts.map +1 -0
  189. package/dist/portability-check.js +121 -0
  190. package/dist/portability-check.js.map +1 -0
  191. package/dist/portability-lossy.d.ts +19 -0
  192. package/dist/portability-lossy.d.ts.map +1 -0
  193. package/dist/portability-lossy.js +65 -0
  194. package/dist/portability-lossy.js.map +1 -0
  195. package/dist/portability.d.ts +23 -0
  196. package/dist/portability.d.ts.map +1 -0
  197. package/dist/portability.js +23 -0
  198. package/dist/portability.js.map +1 -0
  199. package/dist/portable-builder.d.ts +215 -0
  200. package/dist/portable-builder.d.ts.map +1 -0
  201. package/dist/portable-builder.js +27 -0
  202. package/dist/portable-builder.js.map +1 -0
  203. package/dist/portable-entry.d.ts +16 -0
  204. package/dist/portable-entry.d.ts.map +1 -0
  205. package/dist/portable-entry.js +14 -0
  206. package/dist/portable-entry.js.map +1 -0
  207. package/dist/position-reference-build.d.ts +29 -0
  208. package/dist/position-reference-build.d.ts.map +1 -0
  209. package/dist/position-reference-build.js +115 -0
  210. package/dist/position-reference-build.js.map +1 -0
  211. package/dist/position-reference.d.ts +34 -0
  212. package/dist/position-reference.d.ts.map +1 -0
  213. package/dist/position-reference.js +19 -0
  214. package/dist/position-reference.js.map +1 -0
  215. package/dist/runtime.d.ts +139 -0
  216. package/dist/runtime.d.ts.map +1 -0
  217. package/dist/runtime.js +2 -0
  218. package/dist/runtime.js.map +1 -0
  219. package/dist/scale-color-helpers.d.ts +121 -0
  220. package/dist/scale-color-helpers.d.ts.map +1 -0
  221. package/dist/scale-color-helpers.js +188 -0
  222. package/dist/scale-color-helpers.js.map +1 -0
  223. package/dist/scale-color-hue-grey.d.ts +52 -0
  224. package/dist/scale-color-hue-grey.d.ts.map +1 -0
  225. package/dist/scale-color-hue-grey.js +60 -0
  226. package/dist/scale-color-hue-grey.js.map +1 -0
  227. package/dist/scale-color-stops.d.ts +85 -0
  228. package/dist/scale-color-stops.d.ts.map +1 -0
  229. package/dist/scale-color-stops.js +87 -0
  230. package/dist/scale-color-stops.js.map +1 -0
  231. package/dist/scale-color-viridis.d.ts +52 -0
  232. package/dist/scale-color-viridis.d.ts.map +1 -0
  233. package/dist/scale-color-viridis.js +68 -0
  234. package/dist/scale-color-viridis.js.map +1 -0
  235. package/dist/scale-helpers.d.ts +20 -0
  236. package/dist/scale-helpers.d.ts.map +1 -0
  237. package/dist/scale-helpers.js +20 -0
  238. package/dist/scale-helpers.js.map +1 -0
  239. package/dist/scale-multi-helpers.d.ts +61 -0
  240. package/dist/scale-multi-helpers.d.ts.map +1 -0
  241. package/dist/scale-multi-helpers.js +147 -0
  242. package/dist/scale-multi-helpers.js.map +1 -0
  243. package/dist/scale-position-helpers.d.ts +81 -0
  244. package/dist/scale-position-helpers.d.ts.map +1 -0
  245. package/dist/scale-position-helpers.js +133 -0
  246. package/dist/scale-position-helpers.js.map +1 -0
  247. package/dist/scale-reference-build.d.ts +50 -0
  248. package/dist/scale-reference-build.d.ts.map +1 -0
  249. package/dist/scale-reference-build.js +147 -0
  250. package/dist/scale-reference-build.js.map +1 -0
  251. package/dist/scale-reference-classify-color.d.ts +11 -0
  252. package/dist/scale-reference-classify-color.d.ts.map +1 -0
  253. package/dist/scale-reference-classify-color.js +292 -0
  254. package/dist/scale-reference-classify-color.js.map +1 -0
  255. package/dist/scale-reference-classify-position.d.ts +10 -0
  256. package/dist/scale-reference-classify-position.d.ts.map +1 -0
  257. package/dist/scale-reference-classify-position.js +137 -0
  258. package/dist/scale-reference-classify-position.js.map +1 -0
  259. package/dist/scale-reference-classify-style.d.ts +10 -0
  260. package/dist/scale-reference-classify-style.d.ts.map +1 -0
  261. package/dist/scale-reference-classify-style.js +194 -0
  262. package/dist/scale-reference-classify-style.js.map +1 -0
  263. package/dist/scale-reference-classify-support.d.ts +37 -0
  264. package/dist/scale-reference-classify-support.d.ts.map +1 -0
  265. package/dist/scale-reference-classify-support.js +206 -0
  266. package/dist/scale-reference-classify-support.js.map +1 -0
  267. package/dist/scale-reference.d.ts +80 -0
  268. package/dist/scale-reference.d.ts.map +1 -0
  269. package/dist/scale-reference.js +85 -0
  270. package/dist/scale-reference.js.map +1 -0
  271. package/dist/scale-style-helpers.d.ts +158 -0
  272. package/dist/scale-style-helpers.d.ts.map +1 -0
  273. package/dist/scale-style-helpers.js +197 -0
  274. package/dist/scale-style-helpers.js.map +1 -0
  275. package/dist/schema-catalog.d.ts +62 -0
  276. package/dist/schema-catalog.d.ts.map +1 -0
  277. package/dist/schema-catalog.js +208 -0
  278. package/dist/schema-catalog.js.map +1 -0
  279. package/dist/schema-declarations.d.ts +1585 -0
  280. package/dist/schema-declarations.d.ts.map +1 -0
  281. package/dist/schema-declarations.js +51 -0
  282. package/dist/schema-declarations.js.map +1 -0
  283. package/dist/schema-decls-data.d.ts +58 -0
  284. package/dist/schema-decls-data.d.ts.map +1 -0
  285. package/dist/schema-decls-data.js +151 -0
  286. package/dist/schema-decls-data.js.map +1 -0
  287. package/dist/schema-decls-guides-theme.d.ts +166 -0
  288. package/dist/schema-decls-guides-theme.d.ts.map +1 -0
  289. package/dist/schema-decls-guides-theme.js +251 -0
  290. package/dist/schema-decls-guides-theme.js.map +1 -0
  291. package/dist/schema-decls-layers-col-boxplot.d.ts +118 -0
  292. package/dist/schema-decls-layers-col-boxplot.d.ts.map +1 -0
  293. package/dist/schema-decls-layers-col-boxplot.js +239 -0
  294. package/dist/schema-decls-layers-col-boxplot.js.map +1 -0
  295. package/dist/schema-decls-layers-count-pointrange.d.ts +89 -0
  296. package/dist/schema-decls-layers-count-pointrange.d.ts.map +1 -0
  297. package/dist/schema-decls-layers-count-pointrange.js +190 -0
  298. package/dist/schema-decls-layers-count-pointrange.js.map +1 -0
  299. package/dist/schema-decls-layers-crossbar-jitter.d.ts +129 -0
  300. package/dist/schema-decls-layers-crossbar-jitter.d.ts.map +1 -0
  301. package/dist/schema-decls-layers-crossbar-jitter.js +255 -0
  302. package/dist/schema-decls-layers-crossbar-jitter.js.map +1 -0
  303. package/dist/schema-decls-layers-point-path.d.ts +49 -0
  304. package/dist/schema-decls-layers-point-path.d.ts.map +1 -0
  305. package/dist/schema-decls-layers-point-path.js +156 -0
  306. package/dist/schema-decls-layers-point-path.js.map +1 -0
  307. package/dist/schema-decls-layers-sf-blank.d.ts +89 -0
  308. package/dist/schema-decls-layers-sf-blank.d.ts.map +1 -0
  309. package/dist/schema-decls-layers-sf-blank.js +254 -0
  310. package/dist/schema-decls-layers-sf-blank.js.map +1 -0
  311. package/dist/schema-decls-layers-text-map.d.ts +80 -0
  312. package/dist/schema-decls-layers-text-map.d.ts.map +1 -0
  313. package/dist/schema-decls-layers-text-map.js +151 -0
  314. package/dist/schema-decls-layers-text-map.js.map +1 -0
  315. package/dist/schema-decls-paint.d.ts +39 -0
  316. package/dist/schema-decls-paint.d.ts.map +1 -0
  317. package/dist/schema-decls-paint.js +95 -0
  318. package/dist/schema-decls-paint.js.map +1 -0
  319. package/dist/schema-decls-params-area-abline.d.ts +85 -0
  320. package/dist/schema-decls-params-area-abline.d.ts.map +1 -0
  321. package/dist/schema-decls-params-area-abline.js +259 -0
  322. package/dist/schema-decls-params-area-abline.js.map +1 -0
  323. package/dist/schema-decls-params-col-contour.d.ts +61 -0
  324. package/dist/schema-decls-params-col-contour.d.ts.map +1 -0
  325. package/dist/schema-decls-params-col-contour.js +202 -0
  326. package/dist/schema-decls-params-col-contour.js.map +1 -0
  327. package/dist/schema-decls-params-curve-label.d.ts +64 -0
  328. package/dist/schema-decls-params-curve-label.d.ts.map +1 -0
  329. package/dist/schema-decls-params-curve-label.js +204 -0
  330. package/dist/schema-decls-params-curve-label.js.map +1 -0
  331. package/dist/schema-decls-params-errorbar-position.d.ts +83 -0
  332. package/dist/schema-decls-params-errorbar-position.d.ts.map +1 -0
  333. package/dist/schema-decls-params-errorbar-position.js +264 -0
  334. package/dist/schema-decls-params-errorbar-position.js.map +1 -0
  335. package/dist/schema-decls-params-point-path.d.ts +61 -0
  336. package/dist/schema-decls-params-point-path.d.ts.map +1 -0
  337. package/dist/schema-decls-params-point-path.js +240 -0
  338. package/dist/schema-decls-params-point-path.js.map +1 -0
  339. package/dist/schema-decls-params-violin-summary.d.ts +78 -0
  340. package/dist/schema-decls-params-violin-summary.d.ts.map +1 -0
  341. package/dist/schema-decls-params-violin-summary.js +272 -0
  342. package/dist/schema-decls-params-violin-summary.js.map +1 -0
  343. package/dist/schema-decls-plot.d.ts +80 -0
  344. package/dist/schema-decls-plot.d.ts.map +1 -0
  345. package/dist/schema-decls-plot.js +222 -0
  346. package/dist/schema-decls-plot.js.map +1 -0
  347. package/dist/schema-decls-scales-guides.d.ts +291 -0
  348. package/dist/schema-decls-scales-guides.d.ts.map +1 -0
  349. package/dist/schema-decls-scales-guides.js +189 -0
  350. package/dist/schema-decls-scales-guides.js.map +1 -0
  351. package/dist/schema-decls-scales.d.ts +124 -0
  352. package/dist/schema-decls-scales.d.ts.map +1 -0
  353. package/dist/schema-decls-scales.js +279 -0
  354. package/dist/schema-decls-scales.js.map +1 -0
  355. package/dist/schema-imports.d.ts +1679 -0
  356. package/dist/schema-imports.d.ts.map +1 -0
  357. package/dist/schema-imports.js +104 -0
  358. package/dist/schema-imports.js.map +1 -0
  359. package/dist/schema-name-schemas.d.ts +18 -0
  360. package/dist/schema-name-schemas.d.ts.map +1 -0
  361. package/dist/schema-name-schemas.js +13 -0
  362. package/dist/schema-name-schemas.js.map +1 -0
  363. package/dist/schema-names.d.ts +53 -0
  364. package/dist/schema-names.d.ts.map +1 -0
  365. package/dist/schema-names.js +229 -0
  366. package/dist/schema-names.js.map +1 -0
  367. package/dist/schema-types.d.ts +336 -0
  368. package/dist/schema-types.d.ts.map +1 -0
  369. package/dist/schema-types.js +10 -0
  370. package/dist/schema-types.js.map +1 -0
  371. package/dist/schema.d.ts +38 -0
  372. package/dist/schema.d.ts.map +1 -0
  373. package/dist/schema.js +34 -0
  374. package/dist/schema.js.map +1 -0
  375. package/dist/stat-reference-build.d.ts +24 -0
  376. package/dist/stat-reference-build.d.ts.map +1 -0
  377. package/dist/stat-reference-build.js +86 -0
  378. package/dist/stat-reference-build.js.map +1 -0
  379. package/dist/stat-reference.d.ts +33 -0
  380. package/dist/stat-reference.d.ts.map +1 -0
  381. package/dist/stat-reference.js +19 -0
  382. package/dist/stat-reference.js.map +1 -0
  383. package/dist/structural-gate.d.ts +15 -0
  384. package/dist/structural-gate.d.ts.map +1 -0
  385. package/dist/structural-gate.js +34 -0
  386. package/dist/structural-gate.js.map +1 -0
  387. package/dist/temporal-column.d.ts +33 -0
  388. package/dist/temporal-column.d.ts.map +1 -0
  389. package/dist/temporal-column.js +247 -0
  390. package/dist/temporal-column.js.map +1 -0
  391. package/dist/temporal-guides.d.ts +11 -0
  392. package/dist/temporal-guides.d.ts.map +1 -0
  393. package/dist/temporal-guides.js +11 -0
  394. package/dist/temporal-guides.js.map +1 -0
  395. package/dist/temporal-interval-schema.d.ts +9 -0
  396. package/dist/temporal-interval-schema.d.ts.map +1 -0
  397. package/dist/temporal-interval-schema.js +25 -0
  398. package/dist/temporal-interval-schema.js.map +1 -0
  399. package/dist/temporal-interval.d.ts +29 -0
  400. package/dist/temporal-interval.d.ts.map +1 -0
  401. package/dist/temporal-interval.js +122 -0
  402. package/dist/temporal-interval.js.map +1 -0
  403. package/dist/temporal-parse-core.d.ts +96 -0
  404. package/dist/temporal-parse-core.d.ts.map +1 -0
  405. package/dist/temporal-parse-core.js +235 -0
  406. package/dist/temporal-parse-core.js.map +1 -0
  407. package/dist/temporal-parse-format.d.ts +13 -0
  408. package/dist/temporal-parse-format.d.ts.map +1 -0
  409. package/dist/temporal-parse-format.js +180 -0
  410. package/dist/temporal-parse-format.js.map +1 -0
  411. package/dist/temporal-parse-schema.d.ts +11 -0
  412. package/dist/temporal-parse-schema.d.ts.map +1 -0
  413. package/dist/temporal-parse-schema.js +23 -0
  414. package/dist/temporal-parse-schema.js.map +1 -0
  415. package/dist/temporal-parse.d.ts +18 -0
  416. package/dist/temporal-parse.d.ts.map +1 -0
  417. package/dist/temporal-parse.js +183 -0
  418. package/dist/temporal-parse.js.map +1 -0
  419. package/dist/temporal-polyfill.d.ts +3 -0
  420. package/dist/temporal-polyfill.d.ts.map +1 -0
  421. package/dist/temporal-polyfill.js +25 -0
  422. package/dist/temporal-polyfill.js.map +1 -0
  423. package/dist/temporal-ticks.d.ts +20 -0
  424. package/dist/temporal-ticks.d.ts.map +1 -0
  425. package/dist/temporal-ticks.js +246 -0
  426. package/dist/temporal-ticks.js.map +1 -0
  427. package/dist/temporal.d.ts +109 -0
  428. package/dist/temporal.d.ts.map +1 -0
  429. package/dist/temporal.js +73 -0
  430. package/dist/temporal.js.map +1 -0
  431. package/dist/validate-data-checks-color-temporal.d.ts +58 -0
  432. package/dist/validate-data-checks-color-temporal.d.ts.map +1 -0
  433. package/dist/validate-data-checks-color-temporal.js +168 -0
  434. package/dist/validate-data-checks-color-temporal.js.map +1 -0
  435. package/dist/validate-data-checks-color.d.ts +28 -0
  436. package/dist/validate-data-checks-color.d.ts.map +1 -0
  437. package/dist/validate-data-checks-color.js +296 -0
  438. package/dist/validate-data-checks-color.js.map +1 -0
  439. package/dist/validate-data-checks-layer.d.ts +37 -0
  440. package/dist/validate-data-checks-layer.d.ts.map +1 -0
  441. package/dist/validate-data-checks-layer.js +343 -0
  442. package/dist/validate-data-checks-layer.js.map +1 -0
  443. package/dist/validate-data-checks-position.d.ts +45 -0
  444. package/dist/validate-data-checks-position.d.ts.map +1 -0
  445. package/dist/validate-data-checks-position.js +204 -0
  446. package/dist/validate-data-checks-position.js.map +1 -0
  447. package/dist/validate-data-checks-style-finite.d.ts +24 -0
  448. package/dist/validate-data-checks-style-finite.d.ts.map +1 -0
  449. package/dist/validate-data-checks-style-finite.js +40 -0
  450. package/dist/validate-data-checks-style-finite.js.map +1 -0
  451. package/dist/validate-data-checks-style-numeric.d.ts +26 -0
  452. package/dist/validate-data-checks-style-numeric.d.ts.map +1 -0
  453. package/dist/validate-data-checks-style-numeric.js +327 -0
  454. package/dist/validate-data-checks-style-numeric.js.map +1 -0
  455. package/dist/validate-data-checks-style.d.ts +14 -0
  456. package/dist/validate-data-checks-style.d.ts.map +1 -0
  457. package/dist/validate-data-checks-style.js +14 -0
  458. package/dist/validate-data-checks-style.js.map +1 -0
  459. package/dist/validate-data-checks-temporal.d.ts +57 -0
  460. package/dist/validate-data-checks-temporal.d.ts.map +1 -0
  461. package/dist/validate-data-checks-temporal.js +83 -0
  462. package/dist/validate-data-checks-temporal.js.map +1 -0
  463. package/dist/validate-data-checks.d.ts +31 -0
  464. package/dist/validate-data-checks.d.ts.map +1 -0
  465. package/dist/validate-data-checks.js +110 -0
  466. package/dist/validate-data-checks.js.map +1 -0
  467. package/dist/validate-data-evidence.d.ts +69 -0
  468. package/dist/validate-data-evidence.d.ts.map +1 -0
  469. package/dist/validate-data-evidence.js +329 -0
  470. package/dist/validate-data-evidence.js.map +1 -0
  471. package/dist/validate-data.d.ts +73 -0
  472. package/dist/validate-data.d.ts.map +1 -0
  473. package/dist/validate-data.js +30 -0
  474. package/dist/validate-data.js.map +1 -0
  475. package/dist/validate-map-errors.d.ts +32 -0
  476. package/dist/validate-map-errors.d.ts.map +1 -0
  477. package/dist/validate-map-errors.js +76 -0
  478. package/dist/validate-map-errors.js.map +1 -0
  479. package/dist/validate-map-forms.d.ts +43 -0
  480. package/dist/validate-map-forms.d.ts.map +1 -0
  481. package/dist/validate-map-forms.js +125 -0
  482. package/dist/validate-map-forms.js.map +1 -0
  483. package/dist/validate-map-path-keywords.d.ts +11 -0
  484. package/dist/validate-map-path-keywords.d.ts.map +1 -0
  485. package/dist/validate-map-path-keywords.js +95 -0
  486. package/dist/validate-map-path-keywords.js.map +1 -0
  487. package/dist/validate-map-path-unions.d.ts +27 -0
  488. package/dist/validate-map-path-unions.d.ts.map +1 -0
  489. package/dist/validate-map-path-unions.js +200 -0
  490. package/dist/validate-map-path-unions.js.map +1 -0
  491. package/dist/validate-schema-shape.d.ts +69 -0
  492. package/dist/validate-schema-shape.d.ts.map +1 -0
  493. package/dist/validate-schema-shape.js +156 -0
  494. package/dist/validate-schema-shape.js.map +1 -0
  495. package/dist/validate-schema-walk.d.ts +34 -0
  496. package/dist/validate-schema-walk.d.ts.map +1 -0
  497. package/dist/validate-schema-walk.js +216 -0
  498. package/dist/validate-schema-walk.js.map +1 -0
  499. package/dist/validate-structure-facet.d.ts +8 -0
  500. package/dist/validate-structure-facet.d.ts.map +1 -0
  501. package/dist/validate-structure-facet.js +67 -0
  502. package/dist/validate-structure-facet.js.map +1 -0
  503. package/dist/validate-structure-layer-computed-y.d.ts +14 -0
  504. package/dist/validate-structure-layer-computed-y.d.ts.map +1 -0
  505. package/dist/validate-structure-layer-computed-y.js +70 -0
  506. package/dist/validate-structure-layer-computed-y.js.map +1 -0
  507. package/dist/validate-structure-layer-ribbon.d.ts +8 -0
  508. package/dist/validate-structure-layer-ribbon.d.ts.map +1 -0
  509. package/dist/validate-structure-layer-ribbon.js +36 -0
  510. package/dist/validate-structure-layer-ribbon.js.map +1 -0
  511. package/dist/validate-structure-layer-rule.d.ts +14 -0
  512. package/dist/validate-structure-layer-rule.d.ts.map +1 -0
  513. package/dist/validate-structure-layer-rule.js +90 -0
  514. package/dist/validate-structure-layer-rule.js.map +1 -0
  515. package/dist/validate-structure-layer-shared.d.ts +12 -0
  516. package/dist/validate-structure-layer-shared.d.ts.map +1 -0
  517. package/dist/validate-structure-layer-shared.js +17 -0
  518. package/dist/validate-structure-layer-shared.js.map +1 -0
  519. package/dist/validate-structure-layers.d.ts +12 -0
  520. package/dist/validate-structure-layers.d.ts.map +1 -0
  521. package/dist/validate-structure-layers.js +292 -0
  522. package/dist/validate-structure-layers.js.map +1 -0
  523. package/dist/validate-structure-paint.d.ts +12 -0
  524. package/dist/validate-structure-paint.d.ts.map +1 -0
  525. package/dist/validate-structure-paint.js +87 -0
  526. package/dist/validate-structure-paint.js.map +1 -0
  527. package/dist/validate-structure-scales.d.ts +10 -0
  528. package/dist/validate-structure-scales.d.ts.map +1 -0
  529. package/dist/validate-structure-scales.js +242 -0
  530. package/dist/validate-structure-scales.js.map +1 -0
  531. package/dist/validate-structure-style-bins.d.ts +17 -0
  532. package/dist/validate-structure-style-bins.d.ts.map +1 -0
  533. package/dist/validate-structure-style-bins.js +150 -0
  534. package/dist/validate-structure-style-bins.js.map +1 -0
  535. package/dist/validate-structure.d.ts +16 -0
  536. package/dist/validate-structure.d.ts.map +1 -0
  537. package/dist/validate-structure.js +16 -0
  538. package/dist/validate-structure.js.map +1 -0
  539. package/dist/validate.d.ts +24 -0
  540. package/dist/validate.d.ts.map +1 -0
  541. package/dist/validate.js +178 -0
  542. package/dist/validate.js.map +1 -0
  543. package/package.json +59 -0
  544. package/schema/v0.json +9618 -0
  545. package/src/artifact.ts +81 -0
  546. package/src/builder-core.ts +276 -0
  547. package/src/builder-data.ts +156 -0
  548. package/src/builder-geoms.ts +290 -0
  549. package/src/builder-options.ts +428 -0
  550. package/src/builder-scales.ts +443 -0
  551. package/src/builder.ts +125 -0
  552. package/src/capabilities-data.ts +336 -0
  553. package/src/capabilities-helpers.ts +54 -0
  554. package/src/capabilities.ts +159 -0
  555. package/src/coord-helpers.ts +177 -0
  556. package/src/coord-reference-build.ts +283 -0
  557. package/src/coord-reference.ts +75 -0
  558. package/src/error-catalog.ts +253 -0
  559. package/src/error-prose-shared.ts +106 -0
  560. package/src/errors.ts +87 -0
  561. package/src/generated/coord-reference-data.ts +235 -0
  562. package/src/generated/geom-param-keys.ts +222 -0
  563. package/src/generated/geom-reference-data.ts +3024 -0
  564. package/src/generated/guide-reference-data.ts +284 -0
  565. package/src/generated/plot-spec-validator.ts +7335 -0
  566. package/src/generated/position-reference-data.ts +191 -0
  567. package/src/generated/scale-reference-data.ts +10665 -0
  568. package/src/generated/stat-reference-data.ts +339 -0
  569. package/src/geom-params-build.ts +92 -0
  570. package/src/geom-params.ts +14 -0
  571. package/src/geom-reference-build.ts +292 -0
  572. package/src/geom-reference.ts +127 -0
  573. package/src/guide-helpers.ts +44 -0
  574. package/src/guide-reference-build.ts +249 -0
  575. package/src/guide-reference.ts +76 -0
  576. package/src/hue-grey-palettes.ts +82 -0
  577. package/src/index.ts +400 -0
  578. package/src/lint-catalog.ts +57 -0
  579. package/src/lint-layer-rules.ts +175 -0
  580. package/src/lint-scale-rules.ts +285 -0
  581. package/src/lint.ts +126 -0
  582. package/src/normalize-coord.ts +126 -0
  583. package/src/normalize-input-layers-marks.ts +276 -0
  584. package/src/normalize-input-layers-special.ts +252 -0
  585. package/src/normalize-input.ts +154 -0
  586. package/src/normalize-paint.ts +98 -0
  587. package/src/normalize-scales.ts +108 -0
  588. package/src/normalize.ts +403 -0
  589. package/src/paint-helpers.ts +98 -0
  590. package/src/pipeline-error-catalog.ts +278 -0
  591. package/src/portability-check.ts +155 -0
  592. package/src/portability-lossy.ts +81 -0
  593. package/src/portability.ts +31 -0
  594. package/src/portable-builder.ts +35 -0
  595. package/src/portable-entry.ts +37 -0
  596. package/src/position-reference-build.ts +164 -0
  597. package/src/position-reference.ts +41 -0
  598. package/src/runtime.ts +198 -0
  599. package/src/scale-color-helpers.ts +263 -0
  600. package/src/scale-color-hue-grey.ts +95 -0
  601. package/src/scale-color-stops.ts +177 -0
  602. package/src/scale-color-viridis.ts +99 -0
  603. package/src/scale-helpers.ts +264 -0
  604. package/src/scale-multi-helpers.ts +220 -0
  605. package/src/scale-position-helpers.ts +231 -0
  606. package/src/scale-reference-build.ts +222 -0
  607. package/src/scale-reference-classify-color.ts +334 -0
  608. package/src/scale-reference-classify-position.ts +164 -0
  609. package/src/scale-reference-classify-style.ts +229 -0
  610. package/src/scale-reference-classify-support.ts +298 -0
  611. package/src/scale-reference.ts +165 -0
  612. package/src/scale-style-helpers.ts +316 -0
  613. package/src/schema-catalog.ts +222 -0
  614. package/src/schema-declarations.ts +51 -0
  615. package/src/schema-decls-data.ts +272 -0
  616. package/src/schema-decls-guides-theme.ts +395 -0
  617. package/src/schema-decls-layers-col-boxplot.ts +410 -0
  618. package/src/schema-decls-layers-count-pointrange.ts +321 -0
  619. package/src/schema-decls-layers-crossbar-jitter.ts +443 -0
  620. package/src/schema-decls-layers-point-path.ts +246 -0
  621. package/src/schema-decls-layers-sf-blank.ts +408 -0
  622. package/src/schema-decls-layers-text-map.ts +259 -0
  623. package/src/schema-decls-paint.ts +124 -0
  624. package/src/schema-decls-params-area-abline.ts +440 -0
  625. package/src/schema-decls-params-col-contour.ts +333 -0
  626. package/src/schema-decls-params-curve-label.ts +343 -0
  627. package/src/schema-decls-params-errorbar-position.ts +446 -0
  628. package/src/schema-decls-params-point-path.ts +394 -0
  629. package/src/schema-decls-params-violin-summary.ts +447 -0
  630. package/src/schema-decls-plot.ts +385 -0
  631. package/src/schema-decls-scales-guides.ts +233 -0
  632. package/src/schema-decls-scales.ts +432 -0
  633. package/src/schema-imports.ts +116 -0
  634. package/src/schema-name-schemas.ts +37 -0
  635. package/src/schema-names.ts +243 -0
  636. package/src/schema-types.ts +400 -0
  637. package/src/schema.ts +287 -0
  638. package/src/stat-reference-build.ts +145 -0
  639. package/src/stat-reference.ts +38 -0
  640. package/src/structural-gate.ts +42 -0
  641. package/src/temporal-column.ts +323 -0
  642. package/src/temporal-guides.ts +32 -0
  643. package/src/temporal-interval-schema.ts +40 -0
  644. package/src/temporal-interval.ts +151 -0
  645. package/src/temporal-parse-core.ts +331 -0
  646. package/src/temporal-parse-format.ts +222 -0
  647. package/src/temporal-parse-schema.ts +38 -0
  648. package/src/temporal-parse.ts +259 -0
  649. package/src/temporal-polyfill.ts +27 -0
  650. package/src/temporal-ticks.ts +312 -0
  651. package/src/temporal.ts +112 -0
  652. package/src/validate-data-checks-color-temporal.ts +261 -0
  653. package/src/validate-data-checks-color.ts +395 -0
  654. package/src/validate-data-checks-layer.ts +492 -0
  655. package/src/validate-data-checks-position.ts +275 -0
  656. package/src/validate-data-checks-style-finite.ts +55 -0
  657. package/src/validate-data-checks-style-numeric.ts +455 -0
  658. package/src/validate-data-checks-style.ts +13 -0
  659. package/src/validate-data-checks-temporal.ts +129 -0
  660. package/src/validate-data-checks.ts +157 -0
  661. package/src/validate-data-evidence.ts +419 -0
  662. package/src/validate-data.ts +114 -0
  663. package/src/validate-map-errors.ts +126 -0
  664. package/src/validate-map-forms.ts +148 -0
  665. package/src/validate-map-path-keywords.ts +129 -0
  666. package/src/validate-map-path-unions.ts +281 -0
  667. package/src/validate-schema-shape.ts +232 -0
  668. package/src/validate-schema-walk.ts +219 -0
  669. package/src/validate-structure-facet.ts +76 -0
  670. package/src/validate-structure-layer-computed-y.ts +94 -0
  671. package/src/validate-structure-layer-ribbon.ts +61 -0
  672. package/src/validate-structure-layer-rule.ts +98 -0
  673. package/src/validate-structure-layer-shared.ts +29 -0
  674. package/src/validate-structure-layers.ts +395 -0
  675. package/src/validate-structure-paint.ts +101 -0
  676. package/src/validate-structure-scales.ts +278 -0
  677. package/src/validate-structure-style-bins.ts +167 -0
  678. package/src/validate-structure.ts +16 -0
  679. package/src/validate.ts +212 -0
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Tier-2 data-aware orchestrator — resolve evidence, walk layers, then scale/type
3
+ * compatibility (style → position → color diagnostic order).
4
+ *
5
+ * Implementation:
6
+ * - validate-data-checks-layer.ts — geom/stat rules + field walk + channel collection
7
+ * - validate-data-checks-temporal.ts — shared temporalDecisionForField memoization
8
+ * - validate-data-checks-position.ts — pre-evidence temporal axis config + x/y scale types
9
+ * - validate-data-checks-color.ts — color/fill scale types + manual domain/range
10
+ * - validate-data-checks-color-temporal.ts — temporal censor recovery lattice
11
+ * - validate-data-checks-style.ts — shape/linetype + size/linewidth/alpha (finite + numeric modules)
12
+ *
13
+ * Style and color scale checks take the same per-use `evidenceForUse` path as
14
+ * position (#609 / #844): multi-table layers that share a field name keep their
15
+ * own type evidence. The last-wins union `fields` map remains a fallback only.
16
+ *
17
+ * Evidence is one `resolveLayerFieldEvidence` pass (plot + per-layer tables).
18
+ * validate() may pre-resolve and pass the result so lint shares the same pass.
19
+ */
20
+ import type { SpecError } from "./errors.js";
21
+ import type { Aes, ChannelName } from "./schema.js";
22
+ import type { ValidateLimits, ValidateOptions } from "./validate-data.js";
23
+ import {
24
+ resolveLayerFieldEvidence,
25
+ type FieldEvidenceMap,
26
+ type ResolveLayerFieldEvidenceResult,
27
+ } from "./validate-data-evidence.js";
28
+ import { checkColorScaleDataCompatibility } from "./validate-data-checks-color.js";
29
+ import { collectLayerDataChecks, STAT_COLUMNS } from "./validate-data-checks-layer.js";
30
+ import {
31
+ checkPositionScaleDataCompatibility,
32
+ scaleRequestsTime,
33
+ validateTemporalAxisConfiguration,
34
+ } from "./validate-data-checks-position.js";
35
+ import {
36
+ checkFiniteStyleScaleDataCompatibility,
37
+ checkNumericStyleScaleDataCompatibility,
38
+ } from "./validate-data-checks-style.js";
39
+ import type { TemporalDecisionCache } from "./validate-data-checks-temporal.js";
40
+
41
+ export { STAT_COLUMNS };
42
+
43
+ function isRecord(v: unknown): v is Record<string, unknown> {
44
+ return typeof v === "object" && v !== null && !Array.isArray(v);
45
+ }
46
+
47
+ export function dataChecks(
48
+ spec: Record<string, unknown>,
49
+ options: ValidateOptions,
50
+ limits: ValidateLimits,
51
+ /**
52
+ * Pre-resolved layer evidence from validate() so the pivot/type pass runs
53
+ * once and can be shared with lintSpec.
54
+ */
55
+ preResolvedLayer?: ResolveLayerFieldEvidenceResult,
56
+ ): SpecError[] {
57
+ const errors: SpecError[] = [];
58
+ // One cache per dataChecks call — shared by position, color, and style checkers.
59
+ // Nested by FieldEvidenceEntry so same-named fields on different datasets stay independent (#1339).
60
+ const temporalDecisionCache: TemporalDecisionCache = new Map();
61
+ const scales = isRecord(spec["scales"]) ? spec["scales"] : undefined;
62
+
63
+ // Pre-evidence: temporal axis configuration (errors even without data/profile).
64
+ const temporalConfig = validateTemporalAxisConfiguration(scales);
65
+ errors.push(...temporalConfig.errors);
66
+ const { invalidTemporalAxes } = temporalConfig;
67
+
68
+ // One pass over plot + layer tables (#589 multi-table evidence).
69
+ const layerResolved = preResolvedLayer ?? resolveLayerFieldEvidence(spec, options, limits);
70
+ if (layerResolved.status === "errors") return [...errors, ...layerResolved.errors];
71
+ if (layerResolved.status === "none") return errors;
72
+
73
+ const plotFields: FieldEvidenceMap | null = layerResolved.plot;
74
+ const layerMaps = layerResolved.layers;
75
+
76
+ const plotAes = isRecord(spec["aes"]) ? (spec["aes"] as Aes) : undefined;
77
+ const layers = Array.isArray(spec["layers"]) ? (spec["layers"] as unknown[]) : [];
78
+ const scaleRequestsTimeForChannel = (channel: ChannelName): boolean => {
79
+ const axis =
80
+ channel === "x" || channel === "xmin" || channel === "xmax" || channel === "xend"
81
+ ? "x"
82
+ : channel === "y" || channel === "ymin" || channel === "ymax" || channel === "yend"
83
+ ? "y"
84
+ : null;
85
+ return axis !== null && scaleRequestsTime(scales, axis);
86
+ };
87
+
88
+ const walk = collectLayerDataChecks({
89
+ layers,
90
+ plotAes,
91
+ plotFields,
92
+ layerMaps,
93
+ scaleRequestsTime: scaleRequestsTimeForChannel,
94
+ });
95
+ errors.push(...walk.errors);
96
+
97
+ // --- scale/type compatibility (order preserved for diagnostics) ------------
98
+ // Union layer evidence as a fallback for non-layer-scoped lookups. Position,
99
+ // style, and color scale checks prefer per-layer evidence via evidenceForUse
100
+ // so same field names on different tables stay independent (#609 / #844).
101
+ const fields: FieldEvidenceMap = new Map(plotFields ?? undefined);
102
+ for (const layerMap of layerMaps) {
103
+ if (layerMap === null) continue;
104
+ for (const [name, entry] of layerMap) fields.set(name, entry);
105
+ }
106
+ const evidenceForUse = (use: { field: string; path: string }) => {
107
+ const match = /^\/layers\/(\d+)\//.exec(use.path);
108
+ if (match !== null) {
109
+ const layerMap = layerMaps[Number(match[1])];
110
+ if (layerMap !== null && layerMap !== undefined) {
111
+ const hit = layerMap.get(use.field);
112
+ if (hit !== undefined) return hit;
113
+ }
114
+ // Layer with no override inherits plot evidence.
115
+ if (plotFields !== null) {
116
+ const hit = plotFields.get(use.field);
117
+ if (hit !== undefined) return hit;
118
+ }
119
+ }
120
+ return fields.get(use.field);
121
+ };
122
+ // Diagnostic order: finite style → numeric style → position → color.
123
+ errors.push(
124
+ ...checkFiniteStyleScaleDataCompatibility({
125
+ scales,
126
+ fields,
127
+ evidenceForUse,
128
+ finiteStyleFields: walk.finiteStyleFields,
129
+ }),
130
+ ...checkNumericStyleScaleDataCompatibility({
131
+ scales,
132
+ fields,
133
+ evidenceForUse,
134
+ numericStyleFields: walk.numericStyleFields,
135
+ numericStyleScaledConstants: walk.numericStyleScaledConstants,
136
+ temporalDecisionCache,
137
+ }),
138
+ ...checkPositionScaleDataCompatibility({
139
+ scales,
140
+ fields,
141
+ evidenceForUse,
142
+ axisFields: walk.axisFields,
143
+ invalidTemporalAxes,
144
+ temporalDecisionCache,
145
+ }),
146
+ ...checkColorScaleDataCompatibility({
147
+ scales,
148
+ fields,
149
+ evidenceForUse,
150
+ colorFields: walk.colorFields,
151
+ colorScaledConstants: walk.colorScaledConstants,
152
+ temporalDecisionCache,
153
+ }),
154
+ );
155
+
156
+ return errors;
157
+ }
@@ -0,0 +1,419 @@
1
+ /**
2
+ * Field-evidence construction for tier-2 validation and lint.
3
+ *
4
+ * `resolveLayerFieldEvidence` builds plot + per-layer maps in one pass
5
+ * (pivot + type inference, under input limits). validate() runs that once and
6
+ * shares the result with dataChecks and lintSpec so large inline data is not
7
+ * scanned twice. Standalone lintSpec / resolveFieldEvidence still use the
8
+ * plot-only path.
9
+ */
10
+ import type { SpecError } from "./errors.js";
11
+ import type { Aes, CellValue, ChannelName } from "./schema.js";
12
+ import { inferTemporalColumn, type TemporalDecision } from "./temporal-column.js";
13
+ import type { ProfileFieldType, ValidateLimits, ValidateOptions } from "./validate-data.js";
14
+
15
+ // ---------------------------------------------------------------------------
16
+ // Field evidence types
17
+ // ---------------------------------------------------------------------------
18
+
19
+ /**
20
+ * One field's type evidence for tier-2 checks and lint. Built once per
21
+ * validate() when both dataChecks and lintSpec run, so large inline data is
22
+ * not pivoted/type-scanned twice.
23
+ */
24
+ export interface FieldEvidenceEntry {
25
+ type: ProfileFieldType | null;
26
+ /** True when the column exists but has only null values (inline data only). */
27
+ allNull: boolean;
28
+ /** Raw column values (inline data only; null for profile-backed fields). */
29
+ values: readonly CellValue[] | null;
30
+ /** Shared value-driven temporal decision (inline data only). */
31
+ temporal: TemporalDecision | null;
32
+ }
33
+
34
+ export type FieldEvidenceMap = Map<string, FieldEvidenceEntry>;
35
+
36
+ /** Result of resolving profile/inline data into a field evidence map. */
37
+ export type ResolveFieldEvidenceResult =
38
+ | { status: "ok"; fields: FieldEvidenceMap }
39
+ | { status: "none" }
40
+ | { status: "errors"; errors: SpecError[] };
41
+
42
+ /** Plot + per-layer field evidence from one pass over inline tables / profile. */
43
+ export type ResolveLayerFieldEvidenceResult =
44
+ /**
45
+ * `layers[i]` may be the same object as `plot` or as another layer's entry
46
+ * when those layers read one dataset. Treat every map as read-only; copy
47
+ * before writing.
48
+ */
49
+ | { status: "ok"; plot: FieldEvidenceMap | null; layers: Array<FieldEvidenceMap | null> }
50
+ | { status: "none" }
51
+ | { status: "errors"; errors: SpecError[] };
52
+
53
+ // ---------------------------------------------------------------------------
54
+ // Channel helper (shared by structure checks, data checks, and lint)
55
+ // ---------------------------------------------------------------------------
56
+
57
+ /** The channel a layer effectively sees (layer wins; null unsets). */
58
+ export function effectiveChannel(
59
+ plotAes: Aes | undefined,
60
+ layerAes: Aes | undefined,
61
+ channel: ChannelName,
62
+ ): Exclude<Aes[ChannelName], null | undefined> | undefined {
63
+ const own = layerAes?.[channel];
64
+ if (own === null) return undefined;
65
+ const chosen = own ?? plotAes?.[channel];
66
+ return chosen ?? undefined;
67
+ }
68
+
69
+ // ---------------------------------------------------------------------------
70
+ // Type inference + profile / inline resolution
71
+ // ---------------------------------------------------------------------------
72
+
73
+ function isRecord(v: unknown): v is Record<string, unknown> {
74
+ return typeof v === "object" && v !== null && !Array.isArray(v);
75
+ }
76
+
77
+ const PROFILE_TYPES: ReadonlySet<string> = new Set([
78
+ "quantitative",
79
+ "temporal",
80
+ "ordinal",
81
+ "nominal",
82
+ ]);
83
+
84
+ function inferProfileType(column: readonly CellValue[]): {
85
+ type: ProfileFieldType | null;
86
+ temporal: TemporalDecision;
87
+ } {
88
+ const temporal = inferTemporalColumn(column);
89
+ if (temporal.status === "temporal") return { type: "temporal", temporal };
90
+ let sawNumber = false;
91
+ let sawValue = false;
92
+ for (const value of column) {
93
+ if (value === null) continue;
94
+ sawValue = true;
95
+ if (typeof value === "boolean" || typeof value === "string") {
96
+ return { type: "nominal", temporal };
97
+ }
98
+ if (typeof value === "number") sawNumber = true;
99
+ }
100
+ return { type: sawNumber ? "quantitative" : sawValue ? "nominal" : null, temporal };
101
+ }
102
+
103
+ function badProfile(message: string): SpecError[] {
104
+ return [
105
+ {
106
+ code: "invalid-data-profile",
107
+ path: "",
108
+ message: `Invalid DataProfile: ${message}`,
109
+ fix: {
110
+ description:
111
+ 'Provide { fields: [{ name, type: "quantitative"|"temporal"|"ordinal"|"nominal" }], rowCount? }.',
112
+ example: { fields: [{ name: "displ", type: "quantitative" }], rowCount: 234 },
113
+ },
114
+ },
115
+ ];
116
+ }
117
+
118
+ function profileErrors(profile: unknown): SpecError[] {
119
+ if (!isRecord(profile)) return badProfile("expected an object.");
120
+ if (!Array.isArray(profile["fields"])) return badProfile('"fields" must be an array.');
121
+ for (const field of profile["fields"] as unknown[]) {
122
+ if (!isRecord(field) || typeof field["name"] !== "string") {
123
+ return badProfile('every field needs a string "name".');
124
+ }
125
+ if (typeof field["type"] !== "string" || !PROFILE_TYPES.has(field["type"])) {
126
+ return badProfile(
127
+ `field "${field["name"]}" has type ${JSON.stringify(field["type"])}; allowed: quantitative, temporal, ordinal, nominal.`,
128
+ );
129
+ }
130
+ }
131
+ if (profile["rowCount"] !== undefined && typeof profile["rowCount"] !== "number") {
132
+ return badProfile('"rowCount" must be a number when present.');
133
+ }
134
+ return [];
135
+ }
136
+
137
+ /**
138
+ * Resolve inline columns from a data ref against optional named datasets.
139
+ * Named refs that are not present in datasets return null (runtime-only data).
140
+ */
141
+ function columnsFromDataRef(
142
+ data: unknown,
143
+ datasets: unknown,
144
+ ): Record<string, readonly CellValue[]> | null {
145
+ let ref = data;
146
+ if (isRecord(ref) && typeof ref["name"] === "string") {
147
+ ref = isRecord(datasets) ? datasets[ref["name"]] : undefined;
148
+ }
149
+ if (!isRecord(ref)) return null;
150
+ if (Array.isArray(ref["values"])) {
151
+ const rows = ref["values"] as Record<string, CellValue>[];
152
+ const columns: Record<string, CellValue[]> = {};
153
+ for (const row of rows) {
154
+ if (!isRecord(row)) continue;
155
+ for (const key of Object.keys(row)) columns[key] ??= [];
156
+ }
157
+ for (const key of Object.keys(columns)) {
158
+ const column = columns[key]!;
159
+ for (const row of rows) column.push(isRecord(row) ? (row[key] ?? null) : null);
160
+ }
161
+ return columns;
162
+ }
163
+ if (isRecord(ref["columns"])) {
164
+ return ref["columns"] as Record<string, readonly CellValue[]>;
165
+ }
166
+ return null;
167
+ }
168
+
169
+ /** Resolve the spec's plot-level inline columns ({values}, {columns}, or named). */
170
+ function inlineColumns(spec: Record<string, unknown>): Record<string, readonly CellValue[]> | null {
171
+ return columnsFromDataRef(spec["data"], spec["datasets"]);
172
+ }
173
+
174
+ function evidenceFromColumns(columns: Record<string, readonly CellValue[]>): FieldEvidenceMap {
175
+ const fields: FieldEvidenceMap = new Map();
176
+ for (const name of Object.keys(columns)) {
177
+ const column = columns[name]!;
178
+ const inferred = inferProfileType(column);
179
+ fields.set(name, {
180
+ type: inferred.type,
181
+ allNull: column.length > 0 && inferred.type === null,
182
+ values: column,
183
+ temporal: inferred.temporal,
184
+ });
185
+ }
186
+ return fields;
187
+ }
188
+
189
+ /**
190
+ * Per-layer field evidence (#589). Each layer inherits plot-level evidence
191
+ * unless it supplies its own inline/named-inline data.
192
+ * Layers with only unresolved named (runtime) data get `null` (skip type checks).
193
+ */
194
+ export function resolveLayerFieldEvidence(
195
+ spec: Record<string, unknown>,
196
+ options: ValidateOptions,
197
+ limits: ValidateLimits,
198
+ ): ResolveLayerFieldEvidenceResult {
199
+ if (options.profile !== undefined) {
200
+ return evidenceFromProfile(options.profile, spec);
201
+ }
202
+
203
+ const datasets = spec["datasets"];
204
+ const plotColumns = inlineColumns(spec);
205
+ let totalRows = 0;
206
+ let totalBytes = 0;
207
+ const countedTables = new Set<string>();
208
+ const countTable = (key: string, columns: Record<string, readonly CellValue[]>) => {
209
+ if (countedTables.has(key)) return;
210
+ countedTables.add(key);
211
+ const names = Object.keys(columns);
212
+ const rowCount = names.length === 0 ? 0 : (columns[names[0]!]?.length ?? 0);
213
+ totalRows += rowCount;
214
+ totalBytes += estimateBytes(columns, rowCount);
215
+ };
216
+ if (plotColumns !== null) {
217
+ // Prefer name: key so plot-level { name } matching a layer named ref is not
218
+ // double-counted toward maxRows (same embedded/named dataset once).
219
+ const plotData = spec["data"];
220
+ const plotKey =
221
+ isRecord(plotData) && typeof plotData["name"] === "string"
222
+ ? `name:${plotData["name"]}`
223
+ : "__plot__";
224
+ countTable(plotKey, plotColumns);
225
+ }
226
+
227
+ const layers = Array.isArray(spec["layers"]) ? (spec["layers"] as unknown[]) : [];
228
+ // Several layers commonly name one dataset. Pivoting {values} rows into
229
+ // columns is O(rows x columns), so resolve each name once rather than once
230
+ // per reference. Inline data keeps its own table: equal content is not the
231
+ // same table.
232
+ const columnsByName = new Map<string, Record<string, readonly CellValue[]>>();
233
+ const plotData = spec["data"];
234
+ const plotName =
235
+ isRecord(plotData) && typeof plotData["name"] === "string" ? plotData["name"] : null;
236
+ // The plot's own table seeds it, so a layer naming the plot's dataset reuses
237
+ // that pivot instead of building a second one.
238
+ if (plotColumns !== null && plotName !== null) columnsByName.set(plotName, plotColumns);
239
+ const { layerColumns, layerNames } = resolveLayerColumns(
240
+ layers,
241
+ datasets,
242
+ columnsByName,
243
+ countTable,
244
+ );
245
+
246
+ if (plotColumns === null && layerColumns.every((c) => c === null || c === "runtime")) {
247
+ return { status: "none" };
248
+ }
249
+
250
+ if (totalRows > limits.maxRows) {
251
+ return {
252
+ status: "errors",
253
+ errors: [
254
+ {
255
+ code: "validation-limit",
256
+ path: "/data",
257
+ message: `Inline data has ${totalRows} rows across plot/layers, more than the documented maxRows limit (${limits.maxRows}); data-aware checks skipped. Validate with a DataProfile instead.`,
258
+ },
259
+ ],
260
+ };
261
+ }
262
+ if (totalBytes > limits.maxBytes) {
263
+ return {
264
+ status: "errors",
265
+ errors: [
266
+ {
267
+ code: "validation-limit",
268
+ path: "/data",
269
+ message: `Inline data exceeds the documented maxBytes limit (${limits.maxBytes} bytes, estimated across plot/layers); data-aware checks skipped. Validate with a DataProfile instead.`,
270
+ },
271
+ ],
272
+ };
273
+ }
274
+
275
+ const plot = plotColumns === null ? null : evidenceFromColumns(plotColumns);
276
+ // Type inference walks every value of every column, so it too runs once per
277
+ // named dataset. The plot's own table seeds it, matching the row accounting
278
+ // above, which already treats a name the plot and a layer share as one table.
279
+ const evidenceByName = new Map<string, FieldEvidenceMap>();
280
+ if (plot !== null && plotName !== null) evidenceByName.set(plotName, plot);
281
+ const layerMaps: Array<FieldEvidenceMap | null> = layerColumns.map((cols, index) => {
282
+ if (cols === "runtime") return null;
283
+ if (cols === null) return plot;
284
+ const name = layerNames[index] ?? null;
285
+ if (name === null) return evidenceFromColumns(cols);
286
+ const cached = evidenceByName.get(name);
287
+ if (cached !== undefined) return cached;
288
+ const built = evidenceFromColumns(cols);
289
+ evidenceByName.set(name, built);
290
+ return built;
291
+ });
292
+ return { status: "ok", plot, layers: layerMaps };
293
+ }
294
+
295
+ function evidenceFromProfile(
296
+ profile: NonNullable<ValidateOptions["profile"]>,
297
+ spec: Record<string, unknown>,
298
+ ): ResolveLayerFieldEvidenceResult {
299
+ const bad = profileErrors(profile);
300
+ if (bad.length > 0) return { status: "errors", errors: bad };
301
+ const fields: FieldEvidenceMap = new Map();
302
+ for (const field of profile.fields) {
303
+ fields.set(field.name, { type: field.type, allNull: false, values: null, temporal: null });
304
+ }
305
+ const layers = Array.isArray(spec["layers"]) ? (spec["layers"] as unknown[]) : [];
306
+ return { status: "ok", plot: fields, layers: layers.map(() => fields) };
307
+ }
308
+
309
+ function resolveLayerColumns(
310
+ layers: unknown[],
311
+ datasets: unknown,
312
+ columnsByName: Map<string, Record<string, readonly CellValue[]>>,
313
+ countTable: (key: string, columns: Record<string, readonly CellValue[]>) => void,
314
+ ): {
315
+ layerColumns: Array<Record<string, readonly CellValue[]> | null | "runtime">;
316
+ layerNames: Array<string | null>;
317
+ } {
318
+ const layerColumns: Array<Record<string, readonly CellValue[]> | null | "runtime"> = [];
319
+ const layerNames: Array<string | null> = [];
320
+ for (const layer of layers) {
321
+ if (!isRecord(layer) || layer["data"] === undefined) {
322
+ layerColumns.push(null);
323
+ layerNames.push(null);
324
+ continue;
325
+ }
326
+ const data = layer["data"];
327
+ const name = isRecord(data) && typeof data["name"] === "string" ? data["name"] : null;
328
+ let columns = name === null ? undefined : columnsByName.get(name);
329
+ if (columns === undefined) {
330
+ const resolved = columnsFromDataRef(data, datasets);
331
+ if (resolved === null) {
332
+ layerColumns.push("runtime");
333
+ layerNames.push(null);
334
+ continue;
335
+ }
336
+ columns = resolved;
337
+ if (name !== null) columnsByName.set(name, columns);
338
+ }
339
+ const key = name === null ? `inline:${layerColumns.length}` : `name:${name}`;
340
+ countTable(key, columns);
341
+ layerColumns.push(columns);
342
+ layerNames.push(name);
343
+ }
344
+ return { layerColumns, layerNames };
345
+ }
346
+
347
+ function estimateBytes(columns: Record<string, readonly CellValue[]>, rowCount: number): number {
348
+ // Estimate from a bounded sample so the limit check itself stays cheap.
349
+ const sample = Math.min(rowCount, 100);
350
+ if (sample === 0) return 0;
351
+ let sampleBytes = 0;
352
+ for (const column of Object.values(columns)) {
353
+ sampleBytes += JSON.stringify(column.slice(0, sample))?.length ?? 0;
354
+ }
355
+ return Math.round((sampleBytes / sample) * rowCount);
356
+ }
357
+
358
+ /**
359
+ * Resolve profile or inline data into a field evidence map (one pivot + type
360
+ * inference pass). Shared by dataChecks and lintSpec via validate().
361
+ */
362
+ export function resolveFieldEvidence(
363
+ spec: Record<string, unknown>,
364
+ options: ValidateOptions,
365
+ limits: ValidateLimits,
366
+ ): ResolveFieldEvidenceResult {
367
+ if (options.profile !== undefined) {
368
+ const bad = profileErrors(options.profile);
369
+ if (bad.length > 0) return { status: "errors", errors: bad };
370
+ const fields: FieldEvidenceMap = new Map();
371
+ for (const f of options.profile.fields) {
372
+ fields.set(f.name, { type: f.type, allNull: false, values: null, temporal: null });
373
+ }
374
+ return { status: "ok", fields };
375
+ }
376
+
377
+ const columns = inlineColumns(spec);
378
+ if (columns === null) return { status: "none" };
379
+
380
+ const names = Object.keys(columns);
381
+ const rowCount = names.length === 0 ? 0 : (columns[names[0]!]?.length ?? 0);
382
+ if (rowCount > limits.maxRows) {
383
+ return {
384
+ status: "errors",
385
+ errors: [
386
+ {
387
+ code: "validation-limit",
388
+ path: "/data",
389
+ message: `Inline data has ${rowCount} rows, more than the documented maxRows limit (${limits.maxRows}); data-aware checks skipped. Validate with a DataProfile instead.`,
390
+ },
391
+ ],
392
+ };
393
+ }
394
+ if (estimateBytes(columns, rowCount) > limits.maxBytes) {
395
+ return {
396
+ status: "errors",
397
+ errors: [
398
+ {
399
+ code: "validation-limit",
400
+ path: "/data",
401
+ message: `Inline data exceeds the documented maxBytes limit (${limits.maxBytes} bytes, estimated); data-aware checks skipped. Validate with a DataProfile instead.`,
402
+ },
403
+ ],
404
+ };
405
+ }
406
+
407
+ const fields: FieldEvidenceMap = new Map();
408
+ for (const name of names) {
409
+ const column = columns[name]!;
410
+ const inferred = inferProfileType(column);
411
+ fields.set(name, {
412
+ type: inferred.type,
413
+ allNull: column.length > 0 && inferred.type === null,
414
+ values: column,
415
+ temporal: inferred.temporal,
416
+ });
417
+ }
418
+ return { status: "ok", fields };
419
+ }
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Tier-2 validation public contract and re-exports.
3
+ *
4
+ * Plan: "Tier-2 accepts inline data OR a defined DataProfile". Runs when
5
+ * validate() receives an options argument.
6
+ *
7
+ * Implementation is split:
8
+ * - validate-data-evidence.ts — FieldEvidenceMap construction + effectiveChannel
9
+ * - validate-data-checks.ts — dataChecks orchestrator (evidence → walk → checkers)
10
+ * - validate-data-checks-layer.ts — geom/stat rules + field walk + channel collection
11
+ * - validate-data-checks-temporal.ts — shared temporalDecisionForField memoization
12
+ * - validate-data-checks-position.ts — pre-evidence temporal config + x/y scale types
13
+ * - validate-data-checks-color.ts — color/fill scale types + manual domain/range
14
+ * - validate-data-checks-color-temporal.ts — temporal censor recovery lattice
15
+ * - validate-data-checks-style.ts — shape/linetype + size/linewidth/alpha (finite + numeric modules)
16
+ *
17
+ * Style and color scale checks use per-layer evidenceForUse like position
18
+ * (#609 / #844) so multi-table same-name fields keep independent type views.
19
+ *
20
+ * Checks:
21
+ * - field existence: every { field } channel must name an available field
22
+ * (with a did-you-mean suggestion against the available names);
23
+ * - all-null columns (inline data only) are tier-2 errors;
24
+ * - { stat } channels must name a column the layer's stat generates
25
+ * (identity generates none; count generates "count");
26
+ * - scale/type compatibility: scales.*.type "time" needs temporal fields,
27
+ * "log"/"linear" refuse nominal/ordinal fields, color/fill "sequential"
28
+ * needs quantitative fields.
29
+ *
30
+ * Input limits (DEFAULT_VALIDATE_LIMITS — documented, overridable): agent-
31
+ * facing validation must not be resource-abusable. Over-limit inputs get a
32
+ * `validation-limit` diagnostic and the data-aware checks are skipped;
33
+ * diagnostics themselves are capped by maxDiagnostics (enforced in validate()).
34
+ */
35
+ import type { JSONValue } from "./portability.js";
36
+
37
+ // ---------------------------------------------------------------------------
38
+ // Public contract
39
+ // ---------------------------------------------------------------------------
40
+
41
+ /** Field type vocabulary shared with agents (Vega-Lite-compatible names). */
42
+ export type ProfileFieldType = "quantitative" | "temporal" | "ordinal" | "nominal";
43
+
44
+ export interface DataProfileField {
45
+ name: string;
46
+ type: ProfileFieldType;
47
+ /** Optional example values (used in error messages, never validated). */
48
+ examples?: JSONValue[];
49
+ }
50
+
51
+ /** A description of out-of-band data, for validating specs without the data. */
52
+ export interface DataProfile {
53
+ fields: DataProfileField[];
54
+ rowCount?: number;
55
+ }
56
+
57
+ /** Documented input limits for validate(). */
58
+ export interface ValidateLimits {
59
+ /** Max inline-data rows examined (default 100_000). */
60
+ maxRows: number;
61
+ /** Max estimated inline-data bytes examined (default 20 MB). */
62
+ maxBytes: number;
63
+ /** Max JSON nesting depth of the spec (default 32). */
64
+ maxDepth: number;
65
+ /** Max diagnostics returned per run (default 100). */
66
+ maxDiagnostics: number;
67
+ }
68
+
69
+ export const DEFAULT_VALIDATE_LIMITS: ValidateLimits = {
70
+ maxRows: 100_000,
71
+ maxBytes: 20 * 1024 * 1024,
72
+ maxDepth: 32,
73
+ maxDiagnostics: 100,
74
+ };
75
+
76
+ export interface ValidateOptions {
77
+ /** Describe out-of-band data instead of inlining it. Wins over inline data. */
78
+ profile?: DataProfile;
79
+ /** Override the documented input limits. */
80
+ limits?: Partial<ValidateLimits>;
81
+ /** Also run lintSpec() and attach its advisories to the result (lint.ts). */
82
+ lint?: boolean;
83
+ }
84
+
85
+ // ---------------------------------------------------------------------------
86
+ // Helpers owned by the public contract surface
87
+ // ---------------------------------------------------------------------------
88
+
89
+ /** Depth of a JSON-ish value, short-circuiting at `cap + 1`. */
90
+ export function jsonDepth(value: unknown, cap: number): number {
91
+ if (typeof value !== "object" || value === null) return 0;
92
+ let max = 0;
93
+ const entries = Array.isArray(value) ? value : Object.values(value);
94
+ for (const child of entries) {
95
+ const d = jsonDepth(child, cap - 1);
96
+ if (d >= cap) return d + 1; // short-circuit: already too deep
97
+ if (d > max) max = d;
98
+ }
99
+ return max + 1;
100
+ }
101
+
102
+ // ---------------------------------------------------------------------------
103
+ // Focused modules (re-exported so internal imports stay on this barrel)
104
+ // ---------------------------------------------------------------------------
105
+
106
+ export {
107
+ effectiveChannel,
108
+ resolveFieldEvidence,
109
+ resolveLayerFieldEvidence,
110
+ type FieldEvidenceEntry,
111
+ type FieldEvidenceMap,
112
+ } from "./validate-data-evidence.js";
113
+
114
+ export { dataChecks, STAT_COLUMNS } from "./validate-data-checks.js";