@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,81 @@
1
+ /**
2
+ * JSON Schema artifact builder (decision 0004: TypeBox `Type.Module`
3
+ * named-defs form is the shippable schema).
4
+ *
5
+ * Publish-time transforms applied here, exactly as the decision record
6
+ * prescribes:
7
+ * 1. `$ref: "Name"` (TypeBox $id-anchored refs) -> `#/$defs/Name`
8
+ * (standard JSON Pointer form; strict provider subsets need it).
9
+ * 2. `patternProperties: { "^(.*)$": S }` (TypeBox `Type.Record` emission)
10
+ * -> `additionalProperties: S` (semantically identical for that pattern,
11
+ * and inside the portable keyword set).
12
+ * 3. Per-def `$id` markers removed (the artifact anchors defs under $defs).
13
+ *
14
+ * `scripts/emit-schema.ts` writes the result to `schema/v0.json`; a test
15
+ * asserts the committed artifact matches a fresh build (staleness guard).
16
+ */
17
+ import { PlotSpecSchema } from "./schema.js";
18
+
19
+ // TypeBox 0.x emitted `^(.*)$`; TypeBox 1.x emits `^.*$`. Both are
20
+ // "match any property name" records and rewrite to additionalProperties.
21
+ const RECORD_PATTERNS = new Set(["^(.*)$", "^.*$"]);
22
+
23
+ function transform(node: unknown, defNames: ReadonlySet<string>): unknown {
24
+ if (Array.isArray(node)) return node.map((n) => transform(n, defNames));
25
+ if (typeof node !== "object" || node === null) return node;
26
+ const out: Record<string, unknown> = {};
27
+ for (const [key, value] of Object.entries(node as Record<string, unknown>)) {
28
+ if (key === "$id" && typeof value === "string" && defNames.has(value)) continue;
29
+ if (key === "$ref" && typeof value === "string" && defNames.has(value)) {
30
+ out[key] = `#/$defs/${value}`;
31
+ continue;
32
+ }
33
+ if (
34
+ key === "patternProperties" &&
35
+ typeof value === "object" &&
36
+ value !== null &&
37
+ Object.keys(value).length === 1
38
+ ) {
39
+ const pattern = Object.keys(value)[0]!;
40
+ if (RECORD_PATTERNS.has(pattern)) {
41
+ out["additionalProperties"] = transform(
42
+ (value as Record<string, unknown>)[pattern],
43
+ defNames,
44
+ );
45
+ continue;
46
+ }
47
+ }
48
+ out[key] = transform(value, defNames);
49
+ }
50
+ return out;
51
+ }
52
+
53
+ /** Version tag of the published schema artifact (`schema/v0.json`). */
54
+ export const SCHEMA_VERSION = "v0";
55
+
56
+ /**
57
+ * Build the publishable JSON Schema document (plain data, deterministic).
58
+ * The v0 schema remains explicitly unstable; served from the repo until
59
+ * hosting infrastructure exists (no $id URL is claimed yet).
60
+ */
61
+ export function buildSchemaArtifact(): Record<string, unknown> {
62
+ // JSON round-trip drops TypeBox's symbol keys and proves JSON-plainness.
63
+ const raw = JSON.parse(JSON.stringify(PlotSpecSchema)) as {
64
+ $defs: Record<string, unknown>;
65
+ $ref: string;
66
+ };
67
+ const defNames = new Set(Object.keys(raw.$defs));
68
+ const transformed = transform(raw, defNames) as Record<string, unknown>;
69
+ return {
70
+ $schema: "https://json-schema.org/draft/2020-12/schema",
71
+ title: "ggts PortableSpec",
72
+ description:
73
+ "A ggts plot specification (schema v0 — UNSTABLE; served from the repo until schema hosting exists).",
74
+ ...transformed,
75
+ };
76
+ }
77
+
78
+ /** The artifact serialized exactly as `schema/v0.json` is committed. */
79
+ export function schemaArtifactJSON(): string {
80
+ return JSON.stringify(buildSchemaArtifact(), null, 2) + "\n";
81
+ }
@@ -0,0 +1,276 @@
1
+ /**
2
+ * Fluent builder core: state, layer/facet/coord/labs/theme/spec.
3
+ * Geom sugar mixin: builder-geoms.ts. Scale sugar mixin: builder-scales.ts.
4
+ * Public GGBuilder: builder.ts.
5
+ */
6
+ import {
7
+ coordFixed,
8
+ coordPolar,
9
+ coordRadial,
10
+ coordSf,
11
+ coordTransform,
12
+ type CoordFixedOptions,
13
+ type CoordPolarOptions,
14
+ type CoordRadialOptions,
15
+ type CoordSfOptions,
16
+ type CoordTransformOptions,
17
+ } from "./coord-helpers.js";
18
+ import type { AesInput, FacetInput, LayerInput, SpecInput } from "./normalize.js";
19
+ import { normalize } from "./normalize.js";
20
+ import {
21
+ calendarDateFields,
22
+ toAuthoringDataRef,
23
+ toDataRef,
24
+ type AuthoringDataRef,
25
+ type DataInput,
26
+ } from "./builder-data.js";
27
+ import type {
28
+ A11yMode,
29
+ GuidesSpec,
30
+ Labs,
31
+ LegendSpec,
32
+ PortableSpec,
33
+ PositionParams,
34
+ RenderBackend,
35
+ Scales,
36
+ ThemeName,
37
+ ThemeSpec,
38
+ } from "./schema.js";
39
+ import type { GGBuilder } from "./builder.js";
40
+
41
+ interface BuilderState {
42
+ readonly data?: AuthoringDataRef;
43
+ readonly aes?: AesInput;
44
+ readonly layers: readonly LayerInput[];
45
+ readonly facet?: FacetInput;
46
+ readonly coord?: SpecInput["coord"];
47
+ readonly a11y?: A11yMode;
48
+ readonly scales?: Scales;
49
+ readonly guides?: GuidesSpec;
50
+ readonly legend?: LegendSpec;
51
+ readonly labs?: Labs;
52
+ readonly theme?: ThemeName | ThemeSpec;
53
+ readonly width?: number;
54
+ readonly height?: number;
55
+ }
56
+
57
+ /** Assemble a LayerInput from a geom name and sugar options. */
58
+ export function layerFrom(
59
+ geom: LayerInput["geom"],
60
+ options: {
61
+ aes?: AesInput;
62
+ render?: RenderBackend;
63
+ position?: string;
64
+ positionParams?: PositionParams;
65
+ stat?: string;
66
+ data?: DataInput;
67
+ inspect?: false;
68
+ },
69
+ ): LayerInput {
70
+ const {
71
+ aes: layerAes,
72
+ render,
73
+ position,
74
+ positionParams,
75
+ stat,
76
+ data,
77
+ inspect,
78
+ ...params
79
+ } = options;
80
+ // Do not snapshot here: every geom sugar path is `this.layer(layerFrom(...))`,
81
+ // and `layer()` is the single defensive-copy point (#1280). Snapshotting in
82
+ // both places deep-copied every row twice on `geom*({ data })`.
83
+ const withData = data === undefined ? {} : { data: data as LayerInput["data"] };
84
+ return {
85
+ geom,
86
+ ...(stat !== undefined && { stat }),
87
+ ...(position !== undefined && { position }),
88
+ ...(positionParams !== undefined && { positionParams }),
89
+ ...(render !== undefined && { render }),
90
+ ...(inspect !== undefined && { inspect }),
91
+ ...(layerAes !== undefined && { aes: layerAes }),
92
+ ...withData,
93
+ ...(Object.keys(params).length > 0 && { params }),
94
+ } as LayerInput;
95
+ }
96
+
97
+ /**
98
+ * Immutable plot builder core (layer/facet/coord/labs/theme/spec).
99
+ * Geom sugar: WithBuilderGeoms. Scale sugar: WithBuilderScales.
100
+ * Final public class is GGBuilder (builder.ts). Not a public package export.
101
+ */
102
+ export class GGBuilderCore {
103
+ readonly #state: BuilderState;
104
+
105
+ constructor(state: BuilderState) {
106
+ this.#state = state;
107
+ }
108
+
109
+ /**
110
+ * Clone with a state patch. Uses `this.constructor` so the WithBuilderScales
111
+ * subclass (GGBuilder) is preserved across immutable transitions.
112
+ */
113
+ #with(patch: Partial<BuilderState>): GGBuilder {
114
+ return new (this.constructor as new (state: BuilderState) => GGBuilder)({
115
+ ...this.#state,
116
+ ...patch,
117
+ });
118
+ }
119
+
120
+ /** Add a layer (canonical form — the geom* methods are sugar for this). */
121
+ layer(layer: LayerInput): GGBuilder {
122
+ // Sole snapshot for layer data: geom sugar and direct `.layer({ data })`
123
+ // both land here. Later mutation of caller-owned arrays cannot leak into
124
+ // `.spec()`; portable Date→ISO conversion still happens in `toPortable`.
125
+ if (layer.data === undefined) {
126
+ return this.#with({ layers: [...this.#state.layers, layer] });
127
+ }
128
+ // layer.data may be raw DataInput (geom sugar) or an AuthoringDataRef
129
+ // already; toAuthoringDataRef accepts both.
130
+ const snapped = {
131
+ ...layer,
132
+ data: toAuthoringDataRef(layer.data),
133
+ } as LayerInput;
134
+ return this.#with({ layers: [...this.#state.layers, snapped] });
135
+ }
136
+
137
+ /**
138
+ * Facet into small multiples: wrap form ({ wrap, ncol? }) or grid form
139
+ * ({ rows, cols }). Bare strings are field shorthand. Field objects accept
140
+ * closed `levels` order and a display `labels` map. `strip.position` is
141
+ * top/bottom/left/right (default top); `strip.show: false` hides strip
142
+ * chrome. scales controls per-panel positional-scale freedom ("fixed" default).
143
+ */
144
+ facet(facet: FacetInput): GGBuilder {
145
+ return this.#with({ facet });
146
+ }
147
+
148
+ /** Set the coordinate system ("flip" is shorthand for { type: "flip" }). */
149
+ coord(coord: SpecInput["coord"] | "flip"): GGBuilder {
150
+ return this.#with({ coord: coord === "flip" ? { type: "flip" } : coord });
151
+ }
152
+
153
+ /** Sugar for .coord("flip") — THE horizontal-composition mechanism. */
154
+ coordFlip(): GGBuilder {
155
+ return this.coord("flip");
156
+ }
157
+
158
+ /** Configure a post-stat coordinate transform (distinct from scale transforms). */
159
+ coordTransform(options: CoordTransformOptions = {}): GGBuilder {
160
+ return this.coord(coordTransform(options));
161
+ }
162
+
163
+ /** Preserve a physical y-unit/x-unit ratio in the fitted data rectangle. */
164
+ coordFixed(options: CoordFixedOptions = {}): GGBuilder {
165
+ return this.coord(coordFixed(options));
166
+ }
167
+
168
+ /** Equal-unit spelling of coordFixed(). */
169
+ coordEqual(options: CoordFixedOptions = {}): GGBuilder {
170
+ return this.coord(coordFixed(options));
171
+ }
172
+
173
+ /**
174
+ * Fixed-aspect coordinates for already-projected geom_sf maps (ggplot2
175
+ * coord_sf subset; #809). No CRS reproject in v1.
176
+ */
177
+ coordSf(options: CoordSfOptions = {}): GGBuilder {
178
+ return this.coord(coordSf(options));
179
+ }
180
+
181
+ /**
182
+ * Polar/radial coordinates (ggplot2 coord_radial). Pie charts use
183
+ * theta: "y" with expand: false on a stacked bar/col.
184
+ */
185
+ coordRadial(options: CoordRadialOptions = {}): GGBuilder {
186
+ return this.coord(coordRadial(options));
187
+ }
188
+
189
+ /**
190
+ * ggplot2 coord_polar alias — emits type "radial" with polar defaults
191
+ * (clip on; direction -1 → reverse theta).
192
+ */
193
+ coordPolar(options: CoordPolarOptions = {}): GGBuilder {
194
+ return this.coord(coordPolar(options));
195
+ }
196
+
197
+ /** Set the accessibility mode ("force-svg" keeps every layer in SVG). */
198
+ a11y(mode: A11yMode): GGBuilder {
199
+ return this.#with({ a11y: mode });
200
+ }
201
+
202
+ /** Configure scales (merged per scale over previous calls). */
203
+ scales(scales: Scales): GGBuilder {
204
+ return this.#with({ scales: { ...this.#state.scales, ...scales } });
205
+ }
206
+
207
+ /** Configure appearance-only guides (merged per aesthetic over previous calls). */
208
+ guides(guides: GuidesSpec): GGBuilder {
209
+ return this.#with({ guides: { ...this.#state.guides, ...guides } });
210
+ }
211
+
212
+ /** Configure the legacy legend entry order (merged over previous calls). */
213
+ legend(legend: LegendSpec): GGBuilder {
214
+ return this.#with({ legend: { ...this.#state.legend, ...legend } });
215
+ }
216
+
217
+ /** Set the theme: a registered name or an object with role overrides. */
218
+ theme(theme: ThemeName | ThemeSpec): GGBuilder {
219
+ return this.#with({ theme });
220
+ }
221
+
222
+ /** Set human-readable labels (merged over previously set labels). */
223
+ labs(labs: Labs): GGBuilder {
224
+ return this.#with({ labs: { ...this.#state.labs, ...labs } });
225
+ }
226
+
227
+ /**
228
+ * Normalize only: channel shorthand, geom defaults, aes inheritance.
229
+ * Does not load TypeBox — the render pipeline runs structural gates; agents
230
+ * that need full schema validation should call {@link spec} (full package)
231
+ * or `validate()` explicitly.
232
+ */
233
+ toPortable(): PortableSpec {
234
+ const {
235
+ data,
236
+ aes: plotAes,
237
+ layers,
238
+ facet,
239
+ coord,
240
+ a11y,
241
+ scales,
242
+ guides,
243
+ legend,
244
+ labs,
245
+ theme,
246
+ width,
247
+ height,
248
+ } = this.#state;
249
+ const calendarFields = calendarDateFields(this.#state);
250
+ const portableLayers = layers.map((layer) => {
251
+ if (layer.data === undefined) return layer;
252
+ // layer() stores AuthoringDataRef snapshots as LayerInput.data; portable
253
+ // ISO conversion runs here with the final calendar-date field set.
254
+ return {
255
+ ...layer,
256
+ data: toDataRef(layer.data, calendarFields),
257
+ };
258
+ });
259
+ const input: SpecInput = {
260
+ ...(data !== undefined && { data: toDataRef(data, calendarFields) }),
261
+ ...(plotAes !== undefined && { aes: plotAes }),
262
+ layers: portableLayers,
263
+ ...(facet !== undefined && { facet }),
264
+ ...(coord !== undefined && { coord }),
265
+ ...(a11y !== undefined && { a11y }),
266
+ ...(scales !== undefined && { scales }),
267
+ ...(guides !== undefined && { guides }),
268
+ ...(legend !== undefined && { legend }),
269
+ ...(labs !== undefined && { labs }),
270
+ ...(theme !== undefined && { theme }),
271
+ ...(width !== undefined && { width }),
272
+ ...(height !== undefined && { height }),
273
+ };
274
+ return normalize(input);
275
+ }
276
+ }
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Builder/Svelte authoring data conversion.
3
+ *
4
+ * Accepts rows, columns, or named DataRef forms with Date cells; snapshots
5
+ * inputs immutably for `gg()`; and materializes portable CellValue data
6
+ * (ISO date/datetime strings) for `.spec()`. Geom sugar and GGBuilder live
7
+ * in builder.ts.
8
+ */
9
+
10
+ import type { AesInput } from "./normalize.js";
11
+ import type { CellValue, DataRef, Scales } from "./schema.js";
12
+
13
+ /** A builder/Svelte data cell. Dates canonicalize to ISO before validation. */
14
+ export type AuthoringCellValue = CellValue | Date;
15
+ export type AuthoringRows = readonly Readonly<Record<string, AuthoringCellValue>>[];
16
+ export type AuthoringColumns = Readonly<Record<string, readonly AuthoringCellValue[]>>;
17
+ export type AuthoringDataRef =
18
+ | { values: AuthoringRows }
19
+ | { columns: AuthoringColumns }
20
+ | { name: string };
21
+
22
+ /** Data accepted by gg(): authoring rows, columns, or a data reference. */
23
+ export type DataInput = AuthoringRows | AuthoringColumns | AuthoringDataRef;
24
+
25
+ function isDataRef(data: DataInput): data is AuthoringDataRef {
26
+ if (Array.isArray(data)) return false;
27
+ const keys = Object.keys(data);
28
+ if (keys.length !== 1) return false;
29
+ const key = keys[0]!;
30
+ if (key === "name") return typeof (data as { name: unknown }).name === "string";
31
+ if (key === "values") return Array.isArray((data as { values: unknown }).values);
32
+ if (key === "columns") {
33
+ const columns = (data as { columns: unknown }).columns;
34
+ return typeof columns === "object" && columns !== null && !Array.isArray(columns);
35
+ }
36
+ return false;
37
+ }
38
+
39
+ function snapshotCell(value: AuthoringCellValue): AuthoringCellValue {
40
+ return value instanceof Date ? new Date(value.getTime()) : value;
41
+ }
42
+
43
+ /** True when any cell is a Date (needs clone-on-snapshot / ISO materialization). */
44
+ function columnHasDate(values: readonly AuthoringCellValue[]): boolean {
45
+ for (let i = 0; i < values.length; i++) {
46
+ if (values[i] instanceof Date) return true;
47
+ }
48
+ return false;
49
+ }
50
+
51
+ function snapshotRows(rows: AuthoringRows): Record<string, AuthoringCellValue>[] {
52
+ return rows.map((row) =>
53
+ Object.fromEntries(Object.entries(row).map(([key, value]) => [key, snapshotCell(value)])),
54
+ );
55
+ }
56
+
57
+ function snapshotColumns(columns: AuthoringColumns): Record<string, AuthoringCellValue[]> {
58
+ return Object.fromEntries(
59
+ Object.entries(columns).map(([key, values]) => {
60
+ // No Date cells: shallow-copy the column (slice) instead of per-cell map.
61
+ // Isolates length/index mutation; ~4× faster on 30k-point competitive data.
62
+ if (!columnHasDate(values)) return [key, values.slice()];
63
+ return [key, values.map((value) => snapshotCell(value))];
64
+ }),
65
+ );
66
+ }
67
+
68
+ export function toAuthoringDataRef(data: DataInput): AuthoringDataRef {
69
+ if (Array.isArray(data)) return { values: snapshotRows(data as AuthoringRows) };
70
+ if (isDataRef(data)) {
71
+ if ("name" in data) return data;
72
+ if ("values" in data) return { values: snapshotRows(data.values) };
73
+ return { columns: snapshotColumns(data.columns) };
74
+ }
75
+ return { columns: snapshotColumns(data as AuthoringColumns) };
76
+ }
77
+
78
+ function portableCell(value: AuthoringCellValue, calendarDate: boolean): CellValue {
79
+ if (!(value instanceof Date)) return value;
80
+ const iso = value.toISOString();
81
+ return calendarDate ? iso.slice(0, 10) : iso;
82
+ }
83
+
84
+ function portableRows(
85
+ rows: AuthoringRows,
86
+ calendarFields: ReadonlySet<string>,
87
+ ): Record<string, CellValue>[] {
88
+ return rows.map((row) =>
89
+ Object.fromEntries(
90
+ Object.entries(row).map(([key, value]) => [
91
+ key,
92
+ portableCell(value, calendarFields.has(key)),
93
+ ]),
94
+ ),
95
+ );
96
+ }
97
+
98
+ function portableColumns(
99
+ columns: AuthoringColumns,
100
+ calendarFields: ReadonlySet<string>,
101
+ ): Record<string, CellValue[]> {
102
+ return Object.fromEntries(
103
+ Object.entries(columns).map(([key, values]) => {
104
+ // Already-snapshotted non-Date columns need no ISO rewrite — share the
105
+ // array. Second O(n) map was a top cost on line-3×10k toPortable().
106
+ if (!calendarFields.has(key) && !columnHasDate(values)) {
107
+ return [key, values as CellValue[]];
108
+ }
109
+ return [key, values.map((value) => portableCell(value, calendarFields.has(key)))];
110
+ }),
111
+ );
112
+ }
113
+
114
+ export function toDataRef(data: AuthoringDataRef, calendarFields: ReadonlySet<string>): DataRef {
115
+ if ("name" in data) return data;
116
+ if ("values" in data) return { values: portableRows(data.values, calendarFields) };
117
+ return { columns: portableColumns(data.columns, calendarFields) };
118
+ }
119
+
120
+ function mappedField(value: AesInput[keyof AesInput]): string | null {
121
+ if (typeof value === "string") return value;
122
+ return value !== undefined && value !== null && "field" in value ? value.field : null;
123
+ }
124
+
125
+ /** Minimal state slice needed to decide calendar-date ISO truncation. */
126
+ export interface BuilderCalendarSource {
127
+ readonly aes?: AesInput;
128
+ readonly layers: readonly { readonly aes?: AesInput }[];
129
+ readonly scales?: Scales;
130
+ }
131
+
132
+ /** Fields mapped on scales with temporalKind "date" (calendar ISO date cells). */
133
+ export function calendarDateFields(state: BuilderCalendarSource): ReadonlySet<string> {
134
+ const fields = new Set<string>();
135
+ const mappings = [
136
+ ["x", ["x", "xmin", "xmax", "xend"]],
137
+ ["y", ["y", "ymin", "ymax", "yend"]],
138
+ ["color", ["color"]],
139
+ ["fill", ["fill"]],
140
+ ["size", ["size"]],
141
+ ["linewidth", ["linewidth"]],
142
+ ["alpha", ["alpha"]],
143
+ ] as const;
144
+ for (const [scale, channels] of mappings) {
145
+ if (state.scales?.[scale]?.temporalKind !== "date") continue;
146
+ for (const channel of channels) {
147
+ const plotField = mappedField(state.aes?.[channel]);
148
+ if (plotField !== null) fields.add(plotField);
149
+ for (const layer of state.layers) {
150
+ const layerField = mappedField(layer.aes?.[channel]);
151
+ if (layerField !== null) fields.add(layerField);
152
+ }
153
+ }
154
+ }
155
+ return fields;
156
+ }