@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,323 @@
1
+ /**
2
+ * Column-level temporal inference and materialization.
3
+ *
4
+ * Classifies whole columns (auto parser selection + whole-column validation)
5
+ * and builds semantic/valid arrays. Value-level engines live in temporal-parse.ts.
6
+ */
7
+
8
+ import {
9
+ DATE_ORDERS,
10
+ TEMPORAL_PARSER_NAMES,
11
+ canonicalTemporalParserKey,
12
+ parseTemporal,
13
+ temporalParseFailure,
14
+ type TemporalKind,
15
+ type TemporalParseOptions,
16
+ type TemporalParserName,
17
+ type TemporalParserSpec,
18
+ type TemporalPrecision,
19
+ } from "./temporal-parse.js";
20
+
21
+ export interface TemporalFailure {
22
+ index: number;
23
+ value: string | number | boolean | null;
24
+ reason: string;
25
+ }
26
+
27
+ export interface TemporalDecision {
28
+ status: "temporal" | "nominal" | "ambiguous" | "invalid";
29
+ parser: string | null;
30
+ parserKey: string;
31
+ kind: TemporalKind | null;
32
+ precision: TemporalPrecision | null;
33
+ evidence: readonly (string | number | boolean | null)[];
34
+ nonNullCount: number;
35
+ validatedCount: number;
36
+ failedCount: number;
37
+ candidates: readonly string[];
38
+ failures?: readonly TemporalFailure[];
39
+ }
40
+
41
+ export interface ParsedTemporalColumn {
42
+ decision: TemporalDecision;
43
+ semantic: Float64Array;
44
+ valid: Uint8Array;
45
+ }
46
+
47
+ const PRECISION_RANK: Readonly<Record<TemporalPrecision, number>> = {
48
+ year: 0,
49
+ quarter: 1,
50
+ month: 2,
51
+ date: 3,
52
+ minute: 4,
53
+ second: 5,
54
+ millisecond: 6,
55
+ };
56
+
57
+ function finestPrecision(
58
+ current: TemporalPrecision | null,
59
+ candidate: TemporalPrecision,
60
+ ): TemporalPrecision {
61
+ return current === null || PRECISION_RANK[candidate] > PRECISION_RANK[current]
62
+ ? candidate
63
+ : current;
64
+ }
65
+
66
+ function evidenceValue(value: unknown): string | number | boolean | null {
67
+ if (value instanceof Date)
68
+ return Number.isFinite(value.getTime()) ? value.toISOString() : "Invalid Date";
69
+ if (
70
+ typeof value === "string" ||
71
+ typeof value === "number" ||
72
+ typeof value === "boolean" ||
73
+ value === null
74
+ ) {
75
+ return value;
76
+ }
77
+ if (typeof value === "bigint") return value.toString();
78
+ return JSON.stringify(value) ?? "unsupported value";
79
+ }
80
+
81
+ /**
82
+ * One full-column pass: non-null count, full-column number/boolean detection
83
+ * (not sample-relative), and a representative sample of at most 64 non-null
84
+ * values (all when ≤64; otherwise first 32 + last 32). Avoids allocating an
85
+ * O(n) non-null array just to take a bounded sample.
86
+ */
87
+ function analyzeNonNull(values: readonly unknown[]): {
88
+ sample: unknown[];
89
+ nonNullCount: number;
90
+ sawNumberOrBoolean: boolean;
91
+ } {
92
+ let nonNullCount = 0;
93
+ let sawNumberOrBoolean = false;
94
+ const head: unknown[] = [];
95
+ const ring: unknown[] = Array.from({ length: 32 });
96
+ let ringWrite = 0;
97
+ let ringLen = 0;
98
+
99
+ for (const value of values) {
100
+ if (value === null || value === undefined) continue;
101
+ nonNullCount++;
102
+ if (typeof value === "number" || typeof value === "boolean") sawNumberOrBoolean = true;
103
+ if (head.length < 64) head.push(value);
104
+ ring[ringWrite] = value;
105
+ ringWrite = (ringWrite + 1) % 32;
106
+ if (ringLen < 32) ringLen++;
107
+ }
108
+
109
+ if (nonNullCount <= 64) {
110
+ return { sample: head, nonNullCount, sawNumberOrBoolean };
111
+ }
112
+
113
+ const first = head.slice(0, 32);
114
+ const last: unknown[] = [];
115
+ // When full, ringWrite points at the oldest slot.
116
+ for (let i = 0; i < 32; i++) last.push(ring[(ringWrite + i) % 32]);
117
+ return { sample: [...first, ...last], nonNullCount, sawNumberOrBoolean };
118
+ }
119
+
120
+ const AUTO_ORDERED_PARSERS = TEMPORAL_PARSER_NAMES.filter((parser): parser is TemporalParserName =>
121
+ DATE_ORDERS.has(parser.split("_")[0]!),
122
+ );
123
+
124
+ function candidateParsers(
125
+ sample: readonly unknown[],
126
+ options: TemporalParseOptions,
127
+ ): TemporalParserName[] {
128
+ const strings = sample.filter((value): value is string => typeof value === "string");
129
+ const nonDates = sample.filter((value) => !(value instanceof Date));
130
+ const mixedWithDates = strings.length > 0 && sample.some((value) => value instanceof Date);
131
+ if (strings.length === 0 && sample.every((value) => value instanceof Date)) return [];
132
+ if (strings.length !== nonDates.length) return [];
133
+ if (strings.every((value) => parseTemporal(value, "iso", options).ok)) return ["iso"];
134
+ // Native Date values are instants. Mixing them with lower-precision year,
135
+ // month, quarter, or ordered-date strings has no coherent parser identity.
136
+ if (mixedWithDates) return [];
137
+ for (const parser of ["year", "ym", "my", "yq"] as const) {
138
+ if (strings.every((value) => parseTemporal(value, parser, options).ok)) return [parser];
139
+ }
140
+ // Explicit ordered parsers may accept compact years, but automatic
141
+ // inference never assigns meaning to a two-digit year.
142
+ if (strings.some((value) => !/(?:^|[-/.])\d{4}(?:[-/.]|[T ]|$)/.test(value))) return [];
143
+ return AUTO_ORDERED_PARSERS.filter((parser) =>
144
+ strings.every((value) => {
145
+ if (value.includes("-") && /^\d{4}-\d{2}-\d{2}/.test(value)) return false;
146
+ return parseTemporal(value, parser, options).ok;
147
+ }),
148
+ );
149
+ }
150
+
151
+ function nominalDecision(
152
+ status: TemporalDecision["status"],
153
+ values: readonly unknown[],
154
+ candidates: readonly string[] = [],
155
+ analyzed?: ReturnType<typeof analyzeNonNull>,
156
+ ): TemporalDecision {
157
+ const { sample, nonNullCount } = analyzed ?? analyzeNonNull(values);
158
+ return {
159
+ status,
160
+ parser: null,
161
+ parserKey: `auto:${status}`,
162
+ kind: null,
163
+ precision: null,
164
+ evidence: sample.slice(0, 8).map((value) => evidenceValue(value)),
165
+ nonNullCount,
166
+ validatedCount: 0,
167
+ failedCount: 0,
168
+ candidates,
169
+ };
170
+ }
171
+
172
+ function inferTemporalColumnInternal(
173
+ values: readonly unknown[],
174
+ options: TemporalParseOptions = {},
175
+ onSuccess?: (index: number, epochMs: number) => void,
176
+ ): TemporalDecision {
177
+ const analyzed = analyzeNonNull(values);
178
+ if (analyzed.nonNullCount === 0) return nominalDecision("nominal", values, [], analyzed);
179
+ // Full-column fact (not sample-relative): any number/boolean forces nominal.
180
+ if (analyzed.sawNumberOrBoolean) return nominalDecision("nominal", values, [], analyzed);
181
+ const { sample, nonNullCount } = analyzed;
182
+ if (sample.some((value) => !(value instanceof Date) && typeof value !== "string")) {
183
+ return nominalDecision("nominal", values, [], analyzed);
184
+ }
185
+ const candidates = candidateParsers(sample, options);
186
+ const allDates = sample.every((value) => value instanceof Date);
187
+ if (!allDates && candidates.length === 0) return nominalDecision("nominal", values, [], analyzed);
188
+ if (candidates.length > 1) return nominalDecision("ambiguous", values, candidates, analyzed);
189
+
190
+ const parser = allDates ? null : candidates[0]!;
191
+ const scan = scanTemporalValues(values, parser, options, onSuccess);
192
+ const failedCount = nonNullCount - scan.validatedCount;
193
+ if (failedCount > 0) {
194
+ return {
195
+ ...nominalDecision("invalid", values, parser === null ? ["native-date"] : [parser], analyzed),
196
+ parser,
197
+ parserKey: `auto:${parser ?? "native-date"}:invalid`,
198
+ validatedCount: scan.validatedCount,
199
+ failedCount,
200
+ failures: scan.failures,
201
+ };
202
+ }
203
+ return {
204
+ status: "temporal",
205
+ parser: parser ?? "native-date",
206
+ parserKey: `auto:${parser ?? "native-date"}`,
207
+ kind: scan.kind ?? "datetime",
208
+ precision: scan.precision ?? "millisecond",
209
+ evidence: sample.slice(0, 8).map((value) => evidenceValue(value)),
210
+ nonNullCount,
211
+ validatedCount: scan.validatedCount,
212
+ failedCount: 0,
213
+ candidates: parser === null ? ["native-date"] : [parser],
214
+ };
215
+ }
216
+
217
+ function scanTemporalValues(
218
+ values: readonly unknown[],
219
+ parser: TemporalParserName | null,
220
+ options: TemporalParseOptions,
221
+ onSuccess?: (index: number, epochMs: number) => void,
222
+ ): {
223
+ validatedCount: number;
224
+ failures: TemporalFailure[];
225
+ kind: TemporalKind | null;
226
+ precision: TemporalPrecision | null;
227
+ } {
228
+ let validatedCount = 0;
229
+ const failures: TemporalFailure[] = [];
230
+ let kind: TemporalKind | null = null;
231
+ let precision: TemporalPrecision | null = null;
232
+ for (let index = 0; index < values.length; index++) {
233
+ const value = values[index];
234
+ if (value === null || value === undefined) continue;
235
+ const parsed =
236
+ value instanceof Date
237
+ ? parseTemporal(value, "iso", options)
238
+ : parser === null
239
+ ? temporalParseFailure("mixed non-Date value in native Date column")
240
+ : parseTemporal(value, parser, options);
241
+ if (!parsed.ok) {
242
+ if (failures.length < 5)
243
+ failures.push({ index, value: evidenceValue(value), reason: parsed.reason });
244
+ continue;
245
+ }
246
+ validatedCount++;
247
+ onSuccess?.(index, parsed.epochMs);
248
+ kind = kind === "datetime" || parsed.kind === "datetime" ? "datetime" : "date";
249
+ precision = finestPrecision(precision, parsed.precision);
250
+ }
251
+ return { validatedCount, failures, kind, precision };
252
+ }
253
+
254
+ export function inferTemporalColumn(
255
+ values: readonly unknown[],
256
+ options: TemporalParseOptions = {},
257
+ ): TemporalDecision {
258
+ return inferTemporalColumnInternal(values, options);
259
+ }
260
+
261
+ export function parseTemporalColumn(
262
+ values: readonly unknown[],
263
+ parser: TemporalParserSpec | "auto" = "auto",
264
+ options: TemporalParseOptions = {},
265
+ ): ParsedTemporalColumn {
266
+ const semantic = new Float64Array(values.length);
267
+ semantic.fill(Number.NaN);
268
+ const valid = new Uint8Array(values.length);
269
+ if (parser === "auto") {
270
+ const decision = inferTemporalColumnInternal(values, options, (index, epochMs) => {
271
+ semantic[index] = epochMs;
272
+ valid[index] = 1;
273
+ });
274
+ if (decision.status !== "temporal") {
275
+ semantic.fill(Number.NaN);
276
+ valid.fill(0);
277
+ }
278
+ return { decision, semantic, valid };
279
+ }
280
+
281
+ let validatedCount = 0;
282
+ let nonNullCount = 0;
283
+ let kind: TemporalKind | null = null;
284
+ let precision: TemporalPrecision | null = null;
285
+ const failures: TemporalFailure[] = [];
286
+ const evidence: (string | number | boolean | null)[] = [];
287
+ for (let index = 0; index < values.length; index++) {
288
+ const value = values[index];
289
+ if (value === null || value === undefined) continue;
290
+ nonNullCount++;
291
+ if (evidence.length < 8) evidence.push(evidenceValue(value));
292
+ const result = parseTemporal(value, parser, options);
293
+ if (!result.ok) {
294
+ if (failures.length < 5)
295
+ failures.push({ index, value: evidenceValue(value), reason: result.reason });
296
+ continue;
297
+ }
298
+ semantic[index] = result.epochMs;
299
+ valid[index] = 1;
300
+ validatedCount++;
301
+ kind = kind === "datetime" || result.kind === "datetime" ? "datetime" : "date";
302
+ precision = finestPrecision(precision, result.precision);
303
+ }
304
+ const failedCount = nonNullCount - validatedCount;
305
+ const parserKey = canonicalTemporalParserKey(parser);
306
+ return {
307
+ semantic,
308
+ valid,
309
+ decision: {
310
+ status: failedCount === 0 ? "temporal" : "invalid",
311
+ parser: typeof parser === "string" ? parser : parserKey,
312
+ parserKey,
313
+ kind: kind ?? null,
314
+ precision: precision ?? null,
315
+ evidence,
316
+ nonNullCount,
317
+ validatedCount,
318
+ failedCount,
319
+ candidates: [parserKey],
320
+ ...(failures.length > 0 && { failures }),
321
+ },
322
+ };
323
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Temporal guides facade — portable intervals/labels and tick generation.
3
+ *
4
+ * Implementation:
5
+ * - temporal-interval.ts — units, parse, label tokens, locale checks
6
+ * - temporal-ticks.ts — calendar-aligned interval ticks
7
+ */
8
+
9
+ export {
10
+ MAX_TEMPORAL_CANDIDATES,
11
+ MAX_TEMPORAL_MAJOR_TICKS,
12
+ MAX_TEMPORAL_MINOR_TICKS,
13
+ MIN_TEMPORAL_LABEL_GAP_PX,
14
+ parseTemporalInterval,
15
+ TEMPORAL_INTERVAL_UNITS,
16
+ TEMPORAL_LABEL_TOKENS,
17
+ TEMPORAL_WEEKDAYS,
18
+ TemporalIntervalError,
19
+ temporalLabelConfigurationError,
20
+ temporalLocaleConfigurationError,
21
+ type TemporalInterval,
22
+ type TemporalIntervalSpec,
23
+ type TemporalIntervalUnit,
24
+ type TemporalWeekStart,
25
+ } from "./temporal-interval.js";
26
+ export {
27
+ TemporalIntervalSpecSchema,
28
+ TemporalLabelSpecSchema,
29
+ TemporalWeekStartSchema,
30
+ } from "./temporal-interval-schema.js";
31
+
32
+ export { temporalIntervalTicks } from "./temporal-ticks.js";
@@ -0,0 +1,40 @@
1
+ /**
2
+ * TypeBox schemas for temporal intervals and labels (schema graph / validate only).
3
+ * Runtime parse + label checks live in temporal-interval.ts without typebox.
4
+ */
5
+ import Type, { type TLiteral } from "typebox";
6
+
7
+ import {
8
+ TEMPORAL_LABEL_TOKENS,
9
+ TEMPORAL_WEEKDAYS,
10
+ type TemporalWeekStart,
11
+ } from "./temporal-interval.js";
12
+
13
+ const WEEKDAY_SCHEMAS = TEMPORAL_WEEKDAYS.map((weekday) => Type.Literal(weekday)) as unknown as [
14
+ TLiteral<TemporalWeekStart>,
15
+ ...TLiteral<TemporalWeekStart>[],
16
+ ];
17
+
18
+ const TEMPORAL_INTERVAL_STEP_PATTERN = "(?:[1-9][0-9]{0,5}|1000000)";
19
+
20
+ export const TemporalIntervalSpecSchema = Type.String({
21
+ minLength: 1,
22
+ maxLength: 128,
23
+ pattern: `^[ ]*${TEMPORAL_INTERVAL_STEP_PATTERN}[ ]+(?:millisecond|second|minute|hour|day|week|month|quarter|year)s?[ ]*$`,
24
+ description:
25
+ 'A positive integer calendar interval such as "2 weeks", "3 months", or "10 years". Canonical units are millisecond, second, minute, hour, day, week, month, quarter, and year.',
26
+ });
27
+
28
+ export const TemporalWeekStartSchema = Type.Union(WEEKDAY_SCHEMAS, {
29
+ description: 'Week boundary used by temporal interval breaks. Default "monday".',
30
+ });
31
+
32
+ const TEMPORAL_LABEL_PATTERN = `^(?:[^%]|%(?:${TEMPORAL_LABEL_TOKENS.join("|")}))+$`;
33
+
34
+ export const TemporalLabelSpecSchema = Type.String({
35
+ minLength: 1,
36
+ maxLength: 128,
37
+ pattern: TEMPORAL_LABEL_PATTERN,
38
+ description:
39
+ "Strict temporal label format. Supported tokens: %Y %y %m %b %B %d %e %a %A %H %I %M %S %L %p %q %z %Z %%.",
40
+ });
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Portable temporal interval grammar, label token contract, and locale checks.
3
+ * Tick generation lives in temporal-ticks.ts; facade re-exports in temporal-guides.ts.
4
+ */
5
+
6
+ import type { TemporalScaleKind } from "./temporal-parse-core.js";
7
+
8
+ export const TEMPORAL_INTERVAL_UNITS = [
9
+ "millisecond",
10
+ "second",
11
+ "minute",
12
+ "hour",
13
+ "day",
14
+ "week",
15
+ "month",
16
+ "quarter",
17
+ "year",
18
+ ] as const;
19
+ export type TemporalIntervalUnit = (typeof TEMPORAL_INTERVAL_UNITS)[number];
20
+
21
+ export const TEMPORAL_WEEKDAYS = [
22
+ "monday",
23
+ "tuesday",
24
+ "wednesday",
25
+ "thursday",
26
+ "friday",
27
+ "saturday",
28
+ "sunday",
29
+ ] as const;
30
+ export type TemporalWeekStart = (typeof TEMPORAL_WEEKDAYS)[number];
31
+
32
+ const TEMPORAL_INTERVAL_STEP_PATTERN = "(?:[1-9][0-9]{0,5}|1000000)";
33
+
34
+ /** Portable interval string (schema-validated by TypeBox on the agent path). */
35
+ export type TemporalIntervalSpec = string;
36
+
37
+ export interface TemporalInterval {
38
+ unit: TemporalIntervalUnit;
39
+ step: number;
40
+ key: string;
41
+ }
42
+
43
+ export const MAX_TEMPORAL_CANDIDATES = 128;
44
+ export const MAX_TEMPORAL_MAJOR_TICKS = 64;
45
+ export const MAX_TEMPORAL_MINOR_TICKS = 256;
46
+ export const MIN_TEMPORAL_LABEL_GAP_PX = 6;
47
+
48
+ export class TemporalIntervalError extends Error {
49
+ readonly value: string;
50
+
51
+ constructor(value: string, reason: string) {
52
+ super(`Invalid temporal interval ${JSON.stringify(value)}: ${reason}.`);
53
+ this.name = "TemporalIntervalError";
54
+ this.value = value;
55
+ }
56
+ }
57
+
58
+ const INTERVAL_RE = new RegExp(
59
+ `^(${TEMPORAL_INTERVAL_STEP_PATTERN}) +(millisecond|second|minute|hour|day|week|month|quarter|year)(s?)$`,
60
+ );
61
+
62
+ export function parseTemporalInterval(value: string): TemporalInterval;
63
+ export function parseTemporalInterval(value: unknown): TemporalInterval {
64
+ if (typeof value !== "string" || value.length > 128) {
65
+ throw new TemporalIntervalError(String(value), "expected a string of at most 128 characters");
66
+ }
67
+ const match = INTERVAL_RE.exec(value.replaceAll(/^ +| +$/g, ""));
68
+ if (match === null) {
69
+ throw new TemporalIntervalError(
70
+ value,
71
+ 'expected "<positive integer> <unit>" using a canonical calendar unit',
72
+ );
73
+ }
74
+ const step = Number(match[1]);
75
+ if (!Number.isSafeInteger(step) || step < 1 || step > 1_000_000) {
76
+ throw new TemporalIntervalError(value, "step must be an integer from 1 through 1,000,000");
77
+ }
78
+ const unit = match[2] as TemporalIntervalUnit;
79
+ return { unit, step, key: `${step} ${unit}${step === 1 ? "" : "s"}` };
80
+ }
81
+
82
+ export const TEMPORAL_LABEL_TOKENS = [
83
+ "Y",
84
+ "y",
85
+ "m",
86
+ "b",
87
+ "B",
88
+ "d",
89
+ "e",
90
+ "a",
91
+ "A",
92
+ "H",
93
+ "I",
94
+ "M",
95
+ "S",
96
+ "L",
97
+ "p",
98
+ "q",
99
+ "z",
100
+ "Z",
101
+ "%",
102
+ ] as const;
103
+ const LABEL_TOKEN_SET = new Set<string>(TEMPORAL_LABEL_TOKENS);
104
+ /**
105
+ * Tokens a month-day axis can fill truthfully: those the month and the day
106
+ * determine. A year is absent by construction; the clock and zone would print
107
+ * the same midnight-UTC zeros for every tick; and the weekday belongs to the
108
+ * reference year, not to the observation — 1 April fell on different weekdays
109
+ * in 812 and 2001, so printing one would invent a fact.
110
+ */
111
+ const MONTH_DAY_LABEL_TOKENS = new Set(["m", "b", "B", "d", "e", "q", "%"]);
112
+
113
+ export function temporalLabelConfigurationError(
114
+ pattern: string,
115
+ kind?: TemporalScaleKind,
116
+ ): string | null {
117
+ if (pattern.length === 0 || pattern.length > 128) {
118
+ return "dateLabels must contain 1 through 128 characters";
119
+ }
120
+ for (let index = 0; index < pattern.length; index++) {
121
+ if (pattern[index] !== "%") continue;
122
+ const token = pattern[++index];
123
+ if (token === undefined || !LABEL_TOKEN_SET.has(token)) {
124
+ return `unsupported dateLabels token %${token ?? ""}`;
125
+ }
126
+ if (kind === "monthDay" && !MONTH_DAY_LABEL_TOKENS.has(token)) {
127
+ return `dateLabels token %${token} has no meaning on a monthDay axis, which knows only a month and a day; use one of %m %b %B %d %e %q`;
128
+ }
129
+ }
130
+ return null;
131
+ }
132
+
133
+ export function temporalLocaleConfigurationError(locale: string): string | null {
134
+ if (locale.length === 0 || locale.length > 128) {
135
+ return "locale must contain 1 through 128 characters";
136
+ }
137
+ try {
138
+ const canonical = Intl.getCanonicalLocales(locale);
139
+ if (canonical.length !== 1) return `invalid or unsupported locale ${JSON.stringify(locale)}`;
140
+ const supported = Intl.DateTimeFormat.supportedLocalesOf(canonical, {
141
+ localeMatcher: "lookup",
142
+ });
143
+ if (supported.length !== 1) {
144
+ return `invalid or unsupported locale ${JSON.stringify(locale)}`;
145
+ }
146
+ new Intl.DateTimeFormat(canonical[0], { timeZone: "UTC", year: "numeric" }).format(0);
147
+ return null;
148
+ } catch {
149
+ return `invalid or unsupported locale ${JSON.stringify(locale)}`;
150
+ }
151
+ }