@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,331 @@
1
+ /**
2
+ * Temporal parse foundation: public types/schema, calendar parts→epoch conversion,
3
+ * timezone validation, and shared Temporal implementation.
4
+ *
5
+ * Engines: temporal-parse-format.ts (exact format), temporal-parse.ts (named parsers + dispatcher).
6
+ * Facade: temporal.ts.
7
+ *
8
+ * **No static import of `@js-temporal/polyfill` here.** Lean render graphs import this
9
+ * module for ISO/UTC calendar math and config errors without paying the polyfill.
10
+ * Full temporal installs register the polyfill via {@link registerTemporalPolyfill}
11
+ * (`temporal-polyfill.ts` → `ensureTemporalPolyfill`).
12
+ */
13
+
14
+ /**
15
+ * Runtime Temporal namespace shape (native or `@js-temporal/polyfill`).
16
+ * Type-only import path — no runtime edge to the polyfill package.
17
+ */
18
+ export type TemporalNamespace = (typeof import("@js-temporal/polyfill"))["Temporal"];
19
+
20
+ let registeredPolyfill: TemporalNamespace | null = null;
21
+
22
+ /** Wire `@js-temporal/polyfill` (or a test double). Called from temporal-polyfill.ts. */
23
+ export function registerTemporalPolyfill(impl: TemporalNamespace): void {
24
+ registeredPolyfill = impl;
25
+ }
26
+
27
+ export const TEMPORAL_PARSER_NAMES = [
28
+ "iso",
29
+ "year",
30
+ "ym",
31
+ "my",
32
+ "yq",
33
+ "md",
34
+ "ymd",
35
+ "ydm",
36
+ "mdy",
37
+ "myd",
38
+ "dmy",
39
+ "dym",
40
+ "ymd_hm",
41
+ "ymd_hms",
42
+ "ydm_hm",
43
+ "ydm_hms",
44
+ "mdy_hm",
45
+ "mdy_hms",
46
+ "myd_hm",
47
+ "myd_hms",
48
+ "dmy_hm",
49
+ "dmy_hms",
50
+ "dym_hm",
51
+ "dym_hms",
52
+ ] as const;
53
+
54
+ export type TemporalParserName = (typeof TEMPORAL_PARSER_NAMES)[number];
55
+
56
+ /** Portable temporal parser: named engine, exact format, or epoch unit. */
57
+ export type TemporalParserSpec =
58
+ | TemporalParserName
59
+ | { readonly format: string }
60
+ | { readonly epoch: "seconds" | "milliseconds" };
61
+ /**
62
+ * Temporal precision for position/time scales.
63
+ * - `date` — calendar day (UTC)
64
+ * - `datetime` — full instant
65
+ * - `time` — time-of-day only (`scale_x_time` / `scale_y_time`; portable
66
+ * numbers are **seconds since midnight**, mapped to epoch ms on 1970-01-01Z)
67
+ */
68
+ export type TemporalKind = "date" | "datetime" | "time";
69
+
70
+ /**
71
+ * What a position scale asks a temporal axis to mean.
72
+ *
73
+ * Wider than {@link TemporalKind} by `"monthDay"`, and deliberately a separate
74
+ * type: `TemporalKind` is also the *result* of parsing a value, and no value
75
+ * ever parses to `"monthDay"` — it is a projection a scale applies afterwards.
76
+ * Keeping them apart lets the compiler hold that line.
77
+ */
78
+ export type TemporalScaleKind = TemporalKind | "monthDay";
79
+
80
+ /**
81
+ * Year that month-day values resolve into (`md` parser, `monthDay` scales).
82
+ *
83
+ * A leap year, so 29 February is representable — `validateParts` rejects it
84
+ * anywhere else. Callers should treat this as opaque: it exists so month-days
85
+ * from different years share one instant, and it is never shown to a reader.
86
+ */
87
+ export const MONTH_DAY_REFERENCE_YEAR = 2000;
88
+ export type TemporalPrecision =
89
+ | "year"
90
+ | "quarter"
91
+ | "month"
92
+ | "date"
93
+ | "minute"
94
+ | "second"
95
+ | "millisecond";
96
+ export type TemporalDisambiguation = "compatible" | "earlier" | "later" | "reject";
97
+
98
+ export interface TemporalParseOptions {
99
+ timezone?: string;
100
+ disambiguation?: TemporalDisambiguation;
101
+ }
102
+
103
+ export type TemporalParseResult =
104
+ | {
105
+ ok: true;
106
+ epochMs: number;
107
+ kind: TemporalKind;
108
+ precision: TemporalPrecision;
109
+ }
110
+ | { ok: false; reason: string };
111
+
112
+ export class TemporalParseError extends Error {
113
+ readonly parser: TemporalParserSpec;
114
+ readonly value: unknown;
115
+
116
+ constructor(parser: TemporalParserSpec, value: unknown, reason: string) {
117
+ super(
118
+ `Could not parse ${JSON.stringify(value)} with temporal parser ${JSON.stringify(parser)}: ${reason}`,
119
+ );
120
+ this.name = "TemporalParseError";
121
+ this.parser = parser;
122
+ this.value = value;
123
+ }
124
+ }
125
+
126
+ /** @internal Shared calendar fields for named and exact-format engines. */
127
+ export interface DateParts {
128
+ year: number;
129
+ month: number;
130
+ day: number;
131
+ hour: number;
132
+ minute: number;
133
+ second: number;
134
+ millisecond: number;
135
+ }
136
+
137
+ export const DEFAULT_PARTS: Omit<DateParts, "year"> = {
138
+ month: 1,
139
+ day: 1,
140
+ hour: 0,
141
+ minute: 0,
142
+ second: 0,
143
+ millisecond: 0,
144
+ };
145
+
146
+ /** @internal Shared fail result for parse engines and column inference. */
147
+ export function temporalParseFailure(reason: string): TemporalParseResult {
148
+ return { ok: false, reason };
149
+ }
150
+
151
+ function isLeapYear(year: number): boolean {
152
+ return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
153
+ }
154
+
155
+ function daysInMonth(year: number, month: number): number {
156
+ if (month === 2) return isLeapYear(year) ? 29 : 28;
157
+ return month === 4 || month === 6 || month === 9 || month === 11 ? 30 : 31;
158
+ }
159
+
160
+ function validateParts(parts: DateParts): string | null {
161
+ if (!integerInRange(parts.year, 0, 9999)) {
162
+ return "year must be an integer from 0000 through 9999";
163
+ }
164
+ if (!integerInRange(parts.month, 1, 12)) {
165
+ return "month must be from 1 through 12";
166
+ }
167
+ const maxDay = daysInMonth(parts.year, parts.month);
168
+ if (!integerInRange(parts.day, 1, maxDay)) {
169
+ return `day must be from 1 through ${maxDay} for this month`;
170
+ }
171
+ if (!integerInRange(parts.hour, 0, 23)) {
172
+ return "hour must be from 0 through 23";
173
+ }
174
+ if (!integerInRange(parts.minute, 0, 59)) {
175
+ return "minute must be from 0 through 59";
176
+ }
177
+ if (!integerInRange(parts.second, 0, 59)) {
178
+ return "second must be from 0 through 59";
179
+ }
180
+ if (!integerInRange(parts.millisecond, 0, 999)) {
181
+ return "millisecond must be from 0 through 999";
182
+ }
183
+ return null;
184
+ }
185
+
186
+ function integerInRange(value: number, min: number, max: number): boolean {
187
+ return Number.isInteger(value) && value >= min && value <= max;
188
+ }
189
+
190
+ function utcEpoch(parts: DateParts): number {
191
+ const date = new Date(0);
192
+ date.setUTCFullYear(parts.year, parts.month - 1, parts.day);
193
+ date.setUTCHours(parts.hour, parts.minute, parts.second, parts.millisecond);
194
+ return date.getTime();
195
+ }
196
+
197
+ function parseOffset(offset: string): number | null {
198
+ if (offset === "Z") return 0;
199
+ const match = /^([+-])(\d{2}):?(\d{2})$/.exec(offset);
200
+ if (match === null) return null;
201
+ const hours = Number(match[2]);
202
+ const minutes = Number(match[3]);
203
+ if (hours > 23 || minutes > 59) return null;
204
+ const total = (hours * 60 + minutes) * 60_000;
205
+ return match[1] === "+" ? total : -total;
206
+ }
207
+
208
+ /**
209
+ * Native-first Temporal implementation for spec-owned calendar semantics.
210
+ * Returns `globalThis.Temporal` when present, else the polyfill registered via
211
+ * {@link registerTemporalPolyfill}. Throws when neither is available — lean
212
+ * render never reaches this for pure numeric/UTC-ISO identity charts.
213
+ */
214
+ export function temporalImplementation(): TemporalNamespace {
215
+ const nativeTemporal = (globalThis as typeof globalThis & { Temporal?: TemporalNamespace })
216
+ .Temporal;
217
+ if (nativeTemporal !== undefined) return nativeTemporal;
218
+ if (registeredPolyfill !== null) return registeredPolyfill;
219
+ throw new Error(
220
+ "Temporal is not available. Import @ggts-sh/core (full) or @ggts-sh/core/temporal, or call ensureTemporalPolyfill() from @ggts-sh/spec.",
221
+ );
222
+ }
223
+
224
+ /** True when native Temporal or a registered polyfill can run calendar ops. */
225
+ function hasTemporalImplementation(): boolean {
226
+ if ((globalThis as typeof globalThis & { Temporal?: TemporalNamespace }).Temporal !== undefined) {
227
+ return true;
228
+ }
229
+ return registeredPolyfill !== null;
230
+ }
231
+
232
+ /** Allocation-free UTC aliases — same three names as partsToEpoch. */
233
+ const UTC_TIMEZONE_ALIASES = new Set(["UTC", "Etc/UTC", "Z"]);
234
+
235
+ /**
236
+ * null = valid zone; TemporalParseResult = memoized failure for invalid zones.
237
+ * Avoids per-row array allocation on the alias check and per-row failure objects
238
+ * when the same invalid zone is checked across a column parse.
239
+ */
240
+ const TIMEZONE_VALIDITY_CACHE = new Map<string, TemporalParseResult | null>();
241
+
242
+ export function timezoneValidationFailure(
243
+ timezone: string | undefined,
244
+ ): TemporalParseResult | null {
245
+ if (timezone === undefined || UTC_TIMEZONE_ALIASES.has(timezone)) return null;
246
+ // Do not cache "no Temporal" as zone invalidity — ensureTemporalPolyfill may
247
+ // register later in the same process (tests / late install).
248
+ if (!hasTemporalImplementation()) {
249
+ return temporalParseFailure(
250
+ `timezone ${JSON.stringify(timezone)} requires Temporal (import @ggts-sh/core or @ggts-sh/core/temporal)`,
251
+ );
252
+ }
253
+ const cached = TIMEZONE_VALIDITY_CACHE.get(timezone);
254
+ if (cached !== undefined) return cached;
255
+
256
+ let valid = true;
257
+ try {
258
+ const Temporal = temporalImplementation();
259
+ Temporal.ZonedDateTime.from({
260
+ timeZone: timezone,
261
+ year: 2000,
262
+ month: 1,
263
+ day: 1,
264
+ hour: 12,
265
+ });
266
+ } catch {
267
+ valid = false;
268
+ }
269
+ if (TIMEZONE_VALIDITY_CACHE.size >= 64) {
270
+ const oldest = TIMEZONE_VALIDITY_CACHE.keys().next().value;
271
+ if (oldest !== undefined) TIMEZONE_VALIDITY_CACHE.delete(oldest);
272
+ }
273
+ const result = valid
274
+ ? null
275
+ : temporalParseFailure(`invalid or unsupported timezone ${JSON.stringify(timezone)}`);
276
+ TIMEZONE_VALIDITY_CACHE.set(timezone, result);
277
+ return result;
278
+ }
279
+
280
+ export function partsToEpoch(
281
+ parts: DateParts,
282
+ options: TemporalParseOptions,
283
+ offset: string | undefined,
284
+ kind: TemporalKind,
285
+ ): TemporalParseResult {
286
+ const invalid = validateParts(parts);
287
+ if (invalid !== null) return temporalParseFailure(invalid);
288
+
289
+ if (offset !== undefined) {
290
+ const offsetMs = parseOffset(offset);
291
+ if (offsetMs === null) return temporalParseFailure("invalid UTC offset");
292
+ const epochMs = utcEpoch(parts) - offsetMs;
293
+ return Number.isFinite(epochMs)
294
+ ? { ok: true, epochMs, kind: "datetime", precision: "second" }
295
+ : temporalParseFailure("instant is outside the supported range");
296
+ }
297
+
298
+ // Calendar dates are timezone-free values. Keep them on UTC calendar
299
+ // boundaries so ticks preserve their represented date.
300
+ const timezone = kind === "date" || kind === "time" ? "UTC" : (options.timezone ?? "UTC");
301
+ if (UTC_TIMEZONE_ALIASES.has(timezone)) {
302
+ const epochMs = utcEpoch(parts);
303
+ return Number.isFinite(epochMs)
304
+ ? { ok: true, epochMs, kind: "date", precision: "date" }
305
+ : temporalParseFailure("instant is outside the supported range");
306
+ }
307
+
308
+ try {
309
+ const Temporal = temporalImplementation();
310
+ const plain = Temporal.PlainDateTime.from(parts);
311
+ const zoned = plain.toZonedDateTime(timezone, {
312
+ disambiguation: options.disambiguation ?? "reject",
313
+ });
314
+ const epochMs = zoned.epochMilliseconds;
315
+ return Number.isFinite(epochMs)
316
+ ? { ok: true, epochMs, kind: "datetime", precision: "millisecond" }
317
+ : temporalParseFailure("instant is outside the supported range");
318
+ } catch (error) {
319
+ return temporalParseFailure(
320
+ error instanceof Error ? error.message : "invalid timezone or local time",
321
+ );
322
+ }
323
+ }
324
+
325
+ export function withMetadata(
326
+ result: TemporalParseResult,
327
+ kind: TemporalKind,
328
+ precision: TemporalPrecision,
329
+ ): TemporalParseResult {
330
+ return result.ok ? { ...result, kind, precision } : result;
331
+ }
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Exact-format temporal engine: closed strftime-style compile cache + parse.
3
+ * Used by parseTemporal and temporalParserConfigurationError via temporal-parse.ts.
4
+ * Foundation: temporal-parse-core.ts.
5
+ */
6
+ import {
7
+ partsToEpoch,
8
+ temporalParseFailure,
9
+ withMetadata,
10
+ type DateParts,
11
+ type TemporalKind,
12
+ type TemporalParseOptions,
13
+ type TemporalParseResult,
14
+ type TemporalPrecision,
15
+ } from "./temporal-parse-core.js";
16
+
17
+ const FORMAT_TOKEN_PATTERNS: Readonly<Record<string, string>> = {
18
+ Y: "(\\d{4})",
19
+ m: "(\\d{1,2})",
20
+ d: "(\\d{1,2})",
21
+ H: "(\\d{2})",
22
+ M: "(\\d{2})",
23
+ S: "(\\d{2})",
24
+ L: "(\\d{1,3})",
25
+ z: "(Z|[+-]\\d{2}:?\\d{2})",
26
+ q: "([1-4])",
27
+ };
28
+
29
+ function escapeRegex(value: string): string {
30
+ return value.replaceAll(/[.*+?^${}()|[\]\\]/g, "\\$&");
31
+ }
32
+
33
+ /**
34
+ * Compile-time exact-format artifacts only (pattern + capture tokens, or a
35
+ * format-level failure). Shared across scalar parseTemporal, column parsing,
36
+ * helpers, and temporalParserConfigurationError so a column of n values with
37
+ * the same format pays one compile, not n.
38
+ *
39
+ * Only pre-match failures are cached (length, trailing %, unsupported /
40
+ * duplicate tokens). Post-match semantic rules (%Y required, %m+%q, clock
41
+ * completeness) stay value-driven.
42
+ */
43
+ type CompiledExactFormat =
44
+ | { ok: true; tokens: readonly string[]; regex: RegExp }
45
+ | { ok: false; reason: string };
46
+
47
+ /** Cap retained formats so adversarial/churned author strings cannot grow unbounded. */
48
+ const EXACT_FORMAT_CACHE_MAX = 256;
49
+ const EXACT_FORMAT_CACHE = new Map<string, CompiledExactFormat>();
50
+
51
+ function compileExactFormat(format: string): CompiledExactFormat {
52
+ // Length failures must not touch the cache: keys would retain arbitrary
53
+ // user strings (including multi-MB rejects) for process lifetime (#451).
54
+ if (format.length === 0 || format.length > 128) {
55
+ return {
56
+ ok: false,
57
+ reason: "format length must be from 1 through 128 characters",
58
+ };
59
+ }
60
+
61
+ const cached = EXACT_FORMAT_CACHE.get(format);
62
+ if (cached !== undefined) {
63
+ // Refresh LRU order (Map iterates in insertion order).
64
+ EXACT_FORMAT_CACHE.delete(format);
65
+ EXACT_FORMAT_CACHE.set(format, cached);
66
+ return cached;
67
+ }
68
+
69
+ const tokens: string[] = [];
70
+ let pattern = "^";
71
+ let reason: string | null = null;
72
+ for (let index = 0; index < format.length; index++) {
73
+ const char = format[index]!;
74
+ if (char !== "%") {
75
+ pattern += escapeRegex(char);
76
+ continue;
77
+ }
78
+ const token = format[++index];
79
+ if (token === undefined) {
80
+ reason = "format cannot end with %";
81
+ break;
82
+ }
83
+ if (token === "%") {
84
+ pattern += "%";
85
+ continue;
86
+ }
87
+ const tokenPattern = FORMAT_TOKEN_PATTERNS[token];
88
+ if (tokenPattern === undefined) {
89
+ reason = `unsupported format token %${token}`;
90
+ break;
91
+ }
92
+ if (tokens.includes(token)) {
93
+ reason = `duplicate semantic format token %${token}`;
94
+ break;
95
+ }
96
+ tokens.push(token);
97
+ if (tokens.length > 32) {
98
+ reason = "format may contain at most 32 semantic tokens";
99
+ break;
100
+ }
101
+ pattern += tokenPattern;
102
+ }
103
+ const compiled: CompiledExactFormat =
104
+ reason === null
105
+ ? { ok: true, tokens, regex: new RegExp(`${pattern}$`) }
106
+ : { ok: false, reason };
107
+
108
+ if (EXACT_FORMAT_CACHE.size >= EXACT_FORMAT_CACHE_MAX) {
109
+ const oldest = EXACT_FORMAT_CACHE.keys().next().value;
110
+ if (oldest !== undefined) EXACT_FORMAT_CACHE.delete(oldest);
111
+ }
112
+ EXACT_FORMAT_CACHE.set(format, compiled);
113
+ return compiled;
114
+ }
115
+
116
+ export function parseExactFormat(
117
+ value: string,
118
+ format: string,
119
+ options: TemporalParseOptions,
120
+ ): TemporalParseResult {
121
+ const compiled = compileExactFormat(format);
122
+ if (!compiled.ok) return temporalParseFailure(compiled.reason);
123
+ const match = compiled.regex.exec(value);
124
+ if (match === null) return temporalParseFailure("value does not match the exact format");
125
+ const values = exactFormatValues(compiled.tokens, match);
126
+ const validationError = validateExactFormatValues(values);
127
+ if (validationError !== null) return temporalParseFailure(validationError);
128
+ const hasClockTime = [values["H"], values["M"], values["S"], values["L"]].some(
129
+ (part) => part !== undefined,
130
+ );
131
+ const parts: DateParts = {
132
+ year: Number(values["Y"]),
133
+ month: values["q"] === undefined ? Number(values["m"] ?? 1) : (Number(values["q"]) - 1) * 3 + 1,
134
+ day: Number(values["d"] ?? 1),
135
+ hour: Number(values["H"] ?? 0),
136
+ minute: Number(values["M"] ?? 0),
137
+ second: Number(values["S"] ?? 0),
138
+ millisecond: Number((values["L"] ?? "0").padEnd(3, "0")),
139
+ };
140
+ const precision = exactFormatPrecision(values, hasClockTime);
141
+ const kind: TemporalKind = hasClockTime || values["z"] !== undefined ? "datetime" : "date";
142
+ return withMetadata(partsToEpoch(parts, options, values["z"], kind), kind, precision);
143
+ }
144
+
145
+ function exactFormatValues(
146
+ tokens: readonly string[],
147
+ match: RegExpExecArray,
148
+ ): Record<string, string> {
149
+ const values: Record<string, string> = {};
150
+ for (let index = 0; index < tokens.length; index++) {
151
+ values[tokens[index]!] = match[index + 1]!;
152
+ }
153
+ return values;
154
+ }
155
+
156
+ function validateExactFormatValues(values: Record<string, string>): string | null {
157
+ if (values["Y"] === undefined) return "exact formats require %Y";
158
+ if (values["m"] !== undefined && values["q"] !== undefined) {
159
+ return "exact formats cannot contain both %m and %q";
160
+ }
161
+ const hasClockTime = [values["H"], values["M"], values["S"], values["L"]].some(
162
+ (part) => part !== undefined,
163
+ );
164
+ if (hasClockTime && (values["H"] === undefined || values["M"] === undefined)) {
165
+ return "time formats require both %H and %M";
166
+ }
167
+ return null;
168
+ }
169
+
170
+ function exactFormatPrecision(
171
+ values: Record<string, string>,
172
+ hasClockTime: boolean,
173
+ ): TemporalPrecision {
174
+ let precision: TemporalPrecision = "year";
175
+ if (values["m"] !== undefined) precision = "month";
176
+ if (values["q"] !== undefined) precision = "quarter";
177
+ if (values["d"] !== undefined) precision = "date";
178
+ if (hasClockTime) precision = "minute";
179
+ if (values["S"] !== undefined) precision = "second";
180
+ if (values["L"] !== undefined) precision = "millisecond";
181
+ return precision;
182
+ }
183
+
184
+ const FORMAT_SAMPLE_VALUES: Readonly<Record<string, string>> = {
185
+ Y: "2000",
186
+ m: "01",
187
+ d: "01",
188
+ H: "12",
189
+ M: "00",
190
+ S: "00",
191
+ L: "000",
192
+ z: "Z",
193
+ q: "1",
194
+ "%": "%",
195
+ };
196
+
197
+ function exactFormatSample(format: string): string {
198
+ let sample = "";
199
+ for (let index = 0; index < format.length; index++) {
200
+ const char = format[index]!;
201
+ if (char !== "%") {
202
+ sample += char;
203
+ continue;
204
+ }
205
+ const token = format[++index];
206
+ if (token === undefined) return sample;
207
+ sample += FORMAT_SAMPLE_VALUES[token] ?? "0";
208
+ }
209
+ return sample;
210
+ }
211
+
212
+ /**
213
+ * Validate an exact format string independent of data values (sample parse).
214
+ * Keeps sample generation private to this module.
215
+ */
216
+ export function exactFormatConfigurationError(
217
+ format: string,
218
+ options: TemporalParseOptions = {},
219
+ ): string | null {
220
+ const result = parseExactFormat(exactFormatSample(format), format, options);
221
+ return result.ok ? null : result.reason;
222
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * TypeBox schemas for temporal parser specs (schema graph / validate only).
3
+ * Runtime parsers live in temporal-parse-core.ts without a typebox import.
4
+ */
5
+ import Type, { type TLiteral } from "typebox";
6
+
7
+ import { TEMPORAL_PARSER_NAMES, type TemporalParserName } from "./temporal-parse-core.js";
8
+
9
+ const TEMPORAL_PARSER_NAME_SCHEMAS = TEMPORAL_PARSER_NAMES.map((name) =>
10
+ Type.Literal(name),
11
+ ) as unknown as [TLiteral<TemporalParserName>, ...TLiteral<TemporalParserName>[]];
12
+
13
+ export const TemporalParserSpecSchema = Type.Union(
14
+ [
15
+ Type.Union(TEMPORAL_PARSER_NAME_SCHEMAS),
16
+ Type.Object(
17
+ {
18
+ format: Type.String({
19
+ minLength: 1,
20
+ maxLength: 128,
21
+ description:
22
+ "Closed strftime-style input grammar (maximum 128 characters and 32 tokens). Supported tokens: %Y, %m, %d, %H, %M, %S, %L, %z, %q, and %%.",
23
+ }),
24
+ },
25
+ { additionalProperties: false },
26
+ ),
27
+ Type.Object(
28
+ {
29
+ epoch: Type.Union([Type.Literal("seconds"), Type.Literal("milliseconds")]),
30
+ },
31
+ { additionalProperties: false },
32
+ ),
33
+ ],
34
+ {
35
+ description:
36
+ "A deterministic temporal parser name, exact closed format, or epoch unit. JavaScript callbacks and regular expressions are not portable parsers.",
37
+ },
38
+ );