@field/cascade 0.2.22

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 (319) hide show
  1. package/AGENTS.md +168 -0
  2. package/ARCHITECTURE.md +137 -0
  3. package/DESIGN.md +161 -0
  4. package/LICENSE +21 -0
  5. package/README.md +229 -0
  6. package/dist/assets/CodeEditor-DR7u0q7p.css +1 -0
  7. package/dist/assets/CodeEditor-DoaNEUaM.js +641 -0
  8. package/dist/assets/CodePanel-B0_2XJ-t.js +2 -0
  9. package/dist/assets/CodePanel-IT1secyI.css +1 -0
  10. package/dist/assets/CustomNodeDialog-026lzecD.js +1 -0
  11. package/dist/assets/CustomNodeDialog-JGYnWY6m.css +1 -0
  12. package/dist/assets/ExportDialog-DOq0flMV.css +1 -0
  13. package/dist/assets/ExportDialog-DWN4nhXI.js +358 -0
  14. package/dist/assets/ProjectSettings-BzT164Yx.js +2 -0
  15. package/dist/assets/ProjectSettings-DdO9xoQz.css +1 -0
  16. package/dist/assets/SettingsDialog-CeK7ytpY.css +1 -0
  17. package/dist/assets/SettingsDialog-DmHb1V0r.js +1 -0
  18. package/dist/assets/VersionHistoryDialog-CWNmHQ-P.css +1 -0
  19. package/dist/assets/VersionHistoryDialog-hH6VsXLX.js +3 -0
  20. package/dist/assets/abap-08VXUWAP.js +1 -0
  21. package/dist/assets/apex-BWPQTe0t.js +1 -0
  22. package/dist/assets/azcli-Bc_sGQ0U.js +1 -0
  23. package/dist/assets/bat-i0X4ZdIN.js +1 -0
  24. package/dist/assets/bicep-B5-_aFwp.js +2 -0
  25. package/dist/assets/cameligo-DMUM7wLl.js +1 -0
  26. package/dist/assets/cascade.jpg +0 -0
  27. package/dist/assets/clojure-Cm7r79vr.js +1 -0
  28. package/dist/assets/codicon-Brq4_Ui5.ttf +0 -0
  29. package/dist/assets/coffee-Ba7i2nA0.js +1 -0
  30. package/dist/assets/core-Bji4aZUU.js +965 -0
  31. package/dist/assets/cpp-C7h46wYY.js +1 -0
  32. package/dist/assets/csharp-BKxtCVv1.js +1 -0
  33. package/dist/assets/csp-bTuwJoIa.js +1 -0
  34. package/dist/assets/css-DIMkf-bt.js +3 -0
  35. package/dist/assets/css.worker-B3ciXF_0.js +93 -0
  36. package/dist/assets/cssMode-B6Z_Q1Kh.js +1 -0
  37. package/dist/assets/cypher-CVaqCwHa.js +1 -0
  38. package/dist/assets/dart-onAF5SnQ.js +1 -0
  39. package/dist/assets/dockerfile-DZFCIeNp.js +1 -0
  40. package/dist/assets/ecl-D05T4iGw.js +1 -0
  41. package/dist/assets/editor-1FQrmyyI.css +1 -0
  42. package/dist/assets/editor.api-jMoW_43X.js +847 -0
  43. package/dist/assets/editor.worker-q-txB4vs.js +30 -0
  44. package/dist/assets/elixir-6RTg0lbw.js +1 -0
  45. package/dist/assets/flow9-C5_-GSwl.js +1 -0
  46. package/dist/assets/freemarker2-DvvPV6m5.js +3 -0
  47. package/dist/assets/fsharp-C8Ef5oNN.js +1 -0
  48. package/dist/assets/geo-CXmCtzMM.js +2 -0
  49. package/dist/assets/go-C-y9NEjX.js +1 -0
  50. package/dist/assets/graphql-fmXr3nnJ.js +1 -0
  51. package/dist/assets/handlebars-B8rfuSIa.js +1 -0
  52. package/dist/assets/hcl-CpzslTdj.js +1 -0
  53. package/dist/assets/html-DyHm6JCp.js +1 -0
  54. package/dist/assets/html.worker-C93Ht9o9.js +506 -0
  55. package/dist/assets/htmlMode-E9XLWE5u.js +1 -0
  56. package/dist/assets/image-BUcQC7PG.js +2076 -0
  57. package/dist/assets/index-BXYXSdgh.js +224 -0
  58. package/dist/assets/index-CrNke7SW.css +1 -0
  59. package/dist/assets/index-client-DN_FvjN8.js +1 -0
  60. package/dist/assets/ini-sBoK_t0W.js +1 -0
  61. package/dist/assets/java-BEtHBSE6.js +1 -0
  62. package/dist/assets/javascript-C_bM5PCN.js +1 -0
  63. package/dist/assets/json.worker-B2V3pomh.js +62 -0
  64. package/dist/assets/jsonMode-BdyVS7G4.js +7 -0
  65. package/dist/assets/julia-Bri6UV-V.js +1 -0
  66. package/dist/assets/kotlin-BOotOW0E.js +1 -0
  67. package/dist/assets/legacy-DIu3XRwl.js +2 -0
  68. package/dist/assets/less-B9JPFI3C.js +2 -0
  69. package/dist/assets/lexon-CfSJPG6W.js +1 -0
  70. package/dist/assets/liquid-CDkn3spA.js +1 -0
  71. package/dist/assets/lspLanguageFeatures-AB5DMAsr.js +4 -0
  72. package/dist/assets/lua-CsQS60Ue.js +1 -0
  73. package/dist/assets/m3-D-oSqn_W.js +1 -0
  74. package/dist/assets/markdown-Cimd5fb3.js +1 -0
  75. package/dist/assets/mdx-BvH_NjDN.js +1 -0
  76. package/dist/assets/mips-CIPQ_RoX.js +1 -0
  77. package/dist/assets/msdax-DauUninz.js +1 -0
  78. package/dist/assets/mysql-SOo6toE5.js +1 -0
  79. package/dist/assets/nodeTypeUtils-CweA3NHd.js +1 -0
  80. package/dist/assets/objective-c-FvmIjYaQ.js +1 -0
  81. package/dist/assets/pascal-DrH0SRf2.js +1 -0
  82. package/dist/assets/pascaligo-D-ptJ9y-.js +1 -0
  83. package/dist/assets/perl-oz_6vUea.js +1 -0
  84. package/dist/assets/pgsql-DTj74zXo.js +1 -0
  85. package/dist/assets/php-nr791fC2.js +1 -0
  86. package/dist/assets/pla-CopQ2nXW.js +1 -0
  87. package/dist/assets/postiats-43DmfD33.js +1 -0
  88. package/dist/assets/powerquery-D3hlyOfw.js +1 -0
  89. package/dist/assets/powershell-DmHpPYUd.js +1 -0
  90. package/dist/assets/projectSettingsApi-C1WvIwfP.js +1 -0
  91. package/dist/assets/protobuf-C531GsRP.js +2 -0
  92. package/dist/assets/pug-Z5eAx3Zn.js +1 -0
  93. package/dist/assets/python-B7uii4fi.js +1 -0
  94. package/dist/assets/qsharp-DkqhCAOL.js +1 -0
  95. package/dist/assets/quill-DjZ69wL_.js +121 -0
  96. package/dist/assets/r-BwWrilGY.js +1 -0
  97. package/dist/assets/razor-Z48fWdJc.js +1 -0
  98. package/dist/assets/redis-ClamHrr6.js +1 -0
  99. package/dist/assets/redshift-DT7zqm-g.js +1 -0
  100. package/dist/assets/restructuredtext-BYgofb2h.js +1 -0
  101. package/dist/assets/ruby-DezsRK8O.js +1 -0
  102. package/dist/assets/rust-DdL9SqIa.js +1 -0
  103. package/dist/assets/sb-CcwsVR0C.js +1 -0
  104. package/dist/assets/scala-DHpiXF5c.js +1 -0
  105. package/dist/assets/scheme-BeGwcela.js +1 -0
  106. package/dist/assets/scss-gp-XZpBa.js +3 -0
  107. package/dist/assets/shell-CC2rA5mh.js +1 -0
  108. package/dist/assets/solidity-BEEn4gHE.js +1 -0
  109. package/dist/assets/sophia-CRfGWb83.js +1 -0
  110. package/dist/assets/sparql-D_Lu-MrJ.js +1 -0
  111. package/dist/assets/sql-NEE52Syq.js +1 -0
  112. package/dist/assets/st-DbInun42.js +1 -0
  113. package/dist/assets/swift-Bxkupp3x.js +1 -0
  114. package/dist/assets/systemverilog-Bz4Y3fRF.js +1 -0
  115. package/dist/assets/tcl-DISqw1ZD.js +1 -0
  116. package/dist/assets/ts.worker-D7T1-Ig5.js +67738 -0
  117. package/dist/assets/tsMode-BDgacVG4.js +11 -0
  118. package/dist/assets/twig-De2hgUGE.js +1 -0
  119. package/dist/assets/typescript-Derb6Oqa.js +1 -0
  120. package/dist/assets/typespec-B8J7ngcE.js +1 -0
  121. package/dist/assets/vb-DV3o63ZY.js +1 -0
  122. package/dist/assets/wgsl-DpFanUEy.js +298 -0
  123. package/dist/assets/workers-BtoMX_pm.js +1 -0
  124. package/dist/assets/xml-B1CaFSrG.js +1 -0
  125. package/dist/assets/yaml-HmIeA0KH.js +1 -0
  126. package/dist/cli/index.js +11377 -0
  127. package/dist/cli/index.js.map +7 -0
  128. package/dist/cli/runtime/io.ts +445 -0
  129. package/dist/cli/runtime/net.ts +19 -0
  130. package/dist/cli/runtime/shell.ts +46 -0
  131. package/dist/cli/runtime/stage.ts +132 -0
  132. package/dist/contracts/capabilities.d.ts +109 -0
  133. package/dist/contracts/capabilities.d.ts.map +1 -0
  134. package/dist/contracts/capabilities.js +11 -0
  135. package/dist/contracts/capabilities.js.map +1 -0
  136. package/dist/contracts/color.d.ts +67 -0
  137. package/dist/contracts/color.d.ts.map +1 -0
  138. package/dist/contracts/color.js +83 -0
  139. package/dist/contracts/color.js.map +1 -0
  140. package/dist/contracts/definition.d.ts +118 -0
  141. package/dist/contracts/definition.d.ts.map +1 -0
  142. package/dist/contracts/definition.js +2 -0
  143. package/dist/contracts/definition.js.map +1 -0
  144. package/dist/contracts/document.d.ts +50 -0
  145. package/dist/contracts/document.d.ts.map +1 -0
  146. package/dist/contracts/document.js +2 -0
  147. package/dist/contracts/document.js.map +1 -0
  148. package/dist/contracts/geometry.d.ts +301 -0
  149. package/dist/contracts/geometry.d.ts.map +1 -0
  150. package/dist/contracts/geometry.js +604 -0
  151. package/dist/contracts/geometry.js.map +1 -0
  152. package/dist/contracts/index.d.ts +8 -0
  153. package/dist/contracts/index.d.ts.map +1 -0
  154. package/dist/contracts/index.js +8 -0
  155. package/dist/contracts/index.js.map +1 -0
  156. package/dist/contracts/schema.d.ts +6 -0
  157. package/dist/contracts/schema.d.ts.map +1 -0
  158. package/dist/contracts/schema.js +85 -0
  159. package/dist/contracts/schema.js.map +1 -0
  160. package/dist/contracts/validate.d.ts +13 -0
  161. package/dist/contracts/validate.d.ts.map +1 -0
  162. package/dist/contracts/validate.js +202 -0
  163. package/dist/contracts/validate.js.map +1 -0
  164. package/dist/contracts/values.d.ts +100 -0
  165. package/dist/contracts/values.d.ts.map +1 -0
  166. package/dist/contracts/values.js +59 -0
  167. package/dist/contracts/values.js.map +1 -0
  168. package/dist/graphs/default-orig.cascade +128 -0
  169. package/dist/graphs/default.cascade +21 -0
  170. package/dist/index.html +19 -0
  171. package/dist/runtime/browser.d.ts +3 -0
  172. package/dist/runtime/browser.d.ts.map +1 -0
  173. package/dist/runtime/browser.js +12 -0
  174. package/dist/runtime/browser.js.map +1 -0
  175. package/dist/runtime/builtins/core/index.d.ts +9 -0
  176. package/dist/runtime/builtins/core/index.d.ts.map +1 -0
  177. package/dist/runtime/builtins/core/index.js +21 -0
  178. package/dist/runtime/builtins/core/index.js.map +1 -0
  179. package/dist/runtime/builtins/core/random.d.ts +66 -0
  180. package/dist/runtime/builtins/core/random.d.ts.map +1 -0
  181. package/dist/runtime/builtins/core/random.js +46 -0
  182. package/dist/runtime/builtins/core/random.js.map +1 -0
  183. package/dist/runtime/builtins/core/remap.d.ts +105 -0
  184. package/dist/runtime/builtins/core/remap.d.ts.map +1 -0
  185. package/dist/runtime/builtins/core/remap.js +43 -0
  186. package/dist/runtime/builtins/core/remap.js.map +1 -0
  187. package/dist/runtime/builtins/core/routing.d.ts +117 -0
  188. package/dist/runtime/builtins/core/routing.d.ts.map +1 -0
  189. package/dist/runtime/builtins/core/routing.js +114 -0
  190. package/dist/runtime/builtins/core/routing.js.map +1 -0
  191. package/dist/runtime/builtins/core/structural.d.ts +86 -0
  192. package/dist/runtime/builtins/core/structural.d.ts.map +1 -0
  193. package/dist/runtime/builtins/core/structural.js +63 -0
  194. package/dist/runtime/builtins/core/structural.js.map +1 -0
  195. package/dist/runtime/builtins/geo/copyToPoints.d.ts +58 -0
  196. package/dist/runtime/builtins/geo/copyToPoints.d.ts.map +1 -0
  197. package/dist/runtime/builtins/geo/copyToPoints.js +35 -0
  198. package/dist/runtime/builtins/geo/copyToPoints.js.map +1 -0
  199. package/dist/runtime/builtins/geo/definitions.d.ts +526 -0
  200. package/dist/runtime/builtins/geo/definitions.d.ts.map +1 -0
  201. package/dist/runtime/builtins/geo/definitions.js +182 -0
  202. package/dist/runtime/builtins/geo/definitions.js.map +1 -0
  203. package/dist/runtime/builtins/geo/generators.d.ts +94 -0
  204. package/dist/runtime/builtins/geo/generators.d.ts.map +1 -0
  205. package/dist/runtime/builtins/geo/generators.js +41 -0
  206. package/dist/runtime/builtins/geo/generators.js.map +1 -0
  207. package/dist/runtime/builtins/geo/index.d.ts +23 -0
  208. package/dist/runtime/builtins/geo/index.d.ts.map +1 -0
  209. package/dist/runtime/builtins/geo/index.js +35 -0
  210. package/dist/runtime/builtins/geo/index.js.map +1 -0
  211. package/dist/runtime/builtins/geo/merge.d.ts +40 -0
  212. package/dist/runtime/builtins/geo/merge.d.ts.map +1 -0
  213. package/dist/runtime/builtins/geo/merge.js +24 -0
  214. package/dist/runtime/builtins/geo/merge.js.map +1 -0
  215. package/dist/runtime/builtins/geo/namespace.d.ts +15 -0
  216. package/dist/runtime/builtins/geo/namespace.d.ts.map +1 -0
  217. package/dist/runtime/builtins/geo/namespace.js +17 -0
  218. package/dist/runtime/builtins/geo/namespace.js.map +1 -0
  219. package/dist/runtime/builtins/geo/svgExport.d.ts +130 -0
  220. package/dist/runtime/builtins/geo/svgExport.d.ts.map +1 -0
  221. package/dist/runtime/builtins/geo/svgExport.js +50 -0
  222. package/dist/runtime/builtins/geo/svgExport.js.map +1 -0
  223. package/dist/runtime/builtins/geo/transform.d.ts +60 -0
  224. package/dist/runtime/builtins/geo/transform.d.ts.map +1 -0
  225. package/dist/runtime/builtins/geo/transform.js +32 -0
  226. package/dist/runtime/builtins/geo/transform.js.map +1 -0
  227. package/dist/runtime/builtins/index.d.ts +9 -0
  228. package/dist/runtime/builtins/index.d.ts.map +1 -0
  229. package/dist/runtime/builtins/index.js +16 -0
  230. package/dist/runtime/builtins/index.js.map +1 -0
  231. package/dist/runtime/definition/architecture.d.ts +8 -0
  232. package/dist/runtime/definition/architecture.d.ts.map +1 -0
  233. package/dist/runtime/definition/architecture.js +112 -0
  234. package/dist/runtime/definition/architecture.js.map +1 -0
  235. package/dist/runtime/definition/extract.d.ts +12 -0
  236. package/dist/runtime/definition/extract.d.ts.map +1 -0
  237. package/dist/runtime/definition/extract.js +151 -0
  238. package/dist/runtime/definition/extract.js.map +1 -0
  239. package/dist/runtime/error.d.ts +8 -0
  240. package/dist/runtime/error.d.ts.map +1 -0
  241. package/dist/runtime/error.js +11 -0
  242. package/dist/runtime/error.js.map +1 -0
  243. package/dist/runtime/geometry/attributes.d.ts +65 -0
  244. package/dist/runtime/geometry/attributes.d.ts.map +1 -0
  245. package/dist/runtime/geometry/attributes.js +201 -0
  246. package/dist/runtime/geometry/attributes.js.map +1 -0
  247. package/dist/runtime/geometry/builder.d.ts +57 -0
  248. package/dist/runtime/geometry/builder.d.ts.map +1 -0
  249. package/dist/runtime/geometry/builder.js +153 -0
  250. package/dist/runtime/geometry/builder.js.map +1 -0
  251. package/dist/runtime/geometry/copy.d.ts +36 -0
  252. package/dist/runtime/geometry/copy.d.ts.map +1 -0
  253. package/dist/runtime/geometry/copy.js +68 -0
  254. package/dist/runtime/geometry/copy.js.map +1 -0
  255. package/dist/runtime/geometry/generate.d.ts +43 -0
  256. package/dist/runtime/geometry/generate.d.ts.map +1 -0
  257. package/dist/runtime/geometry/generate.js +76 -0
  258. package/dist/runtime/geometry/generate.js.map +1 -0
  259. package/dist/runtime/geometry/groups.d.ts +18 -0
  260. package/dist/runtime/geometry/groups.d.ts.map +1 -0
  261. package/dist/runtime/geometry/groups.js +69 -0
  262. package/dist/runtime/geometry/groups.js.map +1 -0
  263. package/dist/runtime/geometry/index.d.ts +23 -0
  264. package/dist/runtime/geometry/index.d.ts.map +1 -0
  265. package/dist/runtime/geometry/index.js +23 -0
  266. package/dist/runtime/geometry/index.js.map +1 -0
  267. package/dist/runtime/geometry/matrix.d.ts +26 -0
  268. package/dist/runtime/geometry/matrix.d.ts.map +1 -0
  269. package/dist/runtime/geometry/matrix.js +27 -0
  270. package/dist/runtime/geometry/matrix.js.map +1 -0
  271. package/dist/runtime/geometry/merge.d.ts +33 -0
  272. package/dist/runtime/geometry/merge.d.ts.map +1 -0
  273. package/dist/runtime/geometry/merge.js +185 -0
  274. package/dist/runtime/geometry/merge.js.map +1 -0
  275. package/dist/runtime/geometry/primitives.d.ts +41 -0
  276. package/dist/runtime/geometry/primitives.d.ts.map +1 -0
  277. package/dist/runtime/geometry/primitives.js +131 -0
  278. package/dist/runtime/geometry/primitives.js.map +1 -0
  279. package/dist/runtime/geometry/promote.d.ts +44 -0
  280. package/dist/runtime/geometry/promote.d.ts.map +1 -0
  281. package/dist/runtime/geometry/promote.js +203 -0
  282. package/dist/runtime/geometry/promote.js.map +1 -0
  283. package/dist/runtime/geometry/resample.d.ts +29 -0
  284. package/dist/runtime/geometry/resample.d.ts.map +1 -0
  285. package/dist/runtime/geometry/resample.js +165 -0
  286. package/dist/runtime/geometry/resample.js.map +1 -0
  287. package/dist/runtime/geometry/svg.d.ts +91 -0
  288. package/dist/runtime/geometry/svg.d.ts.map +1 -0
  289. package/dist/runtime/geometry/svg.js +216 -0
  290. package/dist/runtime/geometry/svg.js.map +1 -0
  291. package/dist/runtime/geometry/transform.d.ts +18 -0
  292. package/dist/runtime/geometry/transform.d.ts.map +1 -0
  293. package/dist/runtime/geometry/transform.js +56 -0
  294. package/dist/runtime/geometry/transform.js.map +1 -0
  295. package/dist/runtime/index.d.ts +5 -0
  296. package/dist/runtime/index.d.ts.map +1 -0
  297. package/dist/runtime/index.js +4 -0
  298. package/dist/runtime/index.js.map +1 -0
  299. package/dist/runtime/node.d.ts +4 -0
  300. package/dist/runtime/node.d.ts.map +1 -0
  301. package/dist/runtime/node.js +12 -0
  302. package/dist/runtime/node.js.map +1 -0
  303. package/dist/runtime/runtime.d.ts +3 -0
  304. package/dist/runtime/runtime.d.ts.map +1 -0
  305. package/dist/runtime/runtime.js +1198 -0
  306. package/dist/runtime/runtime.js.map +1 -0
  307. package/dist/runtime/types.d.ts +241 -0
  308. package/dist/runtime/types.d.ts.map +1 -0
  309. package/dist/runtime/types.js +2 -0
  310. package/dist/runtime/types.js.map +1 -0
  311. package/dist/shell.d.ts +8 -0
  312. package/dist/shell.js +54 -0
  313. package/dist/shell.js.map +7 -0
  314. package/dist/stage.d.ts +7 -0
  315. package/dist/stage.js +84 -0
  316. package/dist/stage.js.map +7 -0
  317. package/dist/studio/panel.d.ts +48 -0
  318. package/doc/PROJECT_AUTHORING.md +360 -0
  319. package/package.json +126 -0
@@ -0,0 +1,50 @@
1
+ import { emptyGeometry } from "cascade/contracts";
2
+ import { geometryToSvg, utf8Bytes } from "../../geometry/svg.js";
3
+ import { svgExportDefinition } from "./definitions.js";
4
+ import { geoModuleId } from "./namespace.js";
5
+ /**
6
+ * The output end: an SVG document, as a string and as a written asset.
7
+ *
8
+ * It declares `assets` and nothing else. Writing is not optional and there is
9
+ * no `write` prop, because an export node whose file is a choice is a node that
10
+ * silently did nothing. `assets` is available to a `portable` node, so this
11
+ * stays portable and needs no `files` capability: the host decides where an
12
+ * asset lands, which is the whole point of the capability.
13
+ *
14
+ * The props are the fallbacks for `Cd`, `width` and `opacity`. A per-primitive
15
+ * attribute wins where it exists; see `geometryToSvg`, which also owns the one
16
+ * +Y-up-to-+Y-down flip in the system.
17
+ *
18
+ * `stroke` and `fill` are both `color`, which is a four-component vector with a
19
+ * swatch control rather than a second colour representation. `fill` used to be
20
+ * an SVG paint string so that `"none"` was expressible; Marcus ruled colour to
21
+ * be a `vec4` everywhere, so the absence of a fill is now the separate
22
+ * `fillMode` prop and the writer converts to text through `Color.toHex`. The
23
+ * reason "no fill" is a mode rather than a zero alpha is in `SvgExportOptions`.
24
+ */
25
+ export async function executeSvgExport(context) {
26
+ const { props } = context;
27
+ const svg = geometryToSvg(context.inputs.geometry ?? emptyGeometry(2), {
28
+ width: props.width,
29
+ height: props.height,
30
+ margin: props.margin,
31
+ stroke: props.stroke,
32
+ strokeWidth: props.strokeWidth,
33
+ opacity: props.opacity,
34
+ fill: props.fill,
35
+ fillMode: props.fillMode === "solid" ? "solid" : "none",
36
+ pointRadius: props.pointRadius,
37
+ precision: props.precision,
38
+ });
39
+ context.outputs.svg.set(svg);
40
+ const asset = await context.capabilities.assets.write(utf8Bytes(svg), { mediaType: "image/svg+xml", suggestedName: props.filename }, { signal: context.signal });
41
+ context.outputs.asset.set(asset);
42
+ }
43
+ export const svgExportRegistration = {
44
+ kind: "definition-v1",
45
+ moduleId: geoModuleId("SvgExport"),
46
+ definition: svgExportDefinition,
47
+ loadExecute: async () => executeSvgExport,
48
+ };
49
+ export { svgExportDefinition } from "./definitions.js";
50
+ //# sourceMappingURL=svgExport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svgExport.js","sourceRoot":"","sources":["../../../src/builtins/geo/svgExport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAyD;IAEzD,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1B,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE;QACrE,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;QACvD,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC,CAAC;IACH,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CACnD,SAAS,CAAC,GAAG,CAAC,EACd,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,KAAK,CAAC,QAAQ,EAAE,EAC7D,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAC3B,CAAC;IACF,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,eAAe;IACrB,QAAQ,EAAE,WAAW,CAAC,WAAW,CAAC;IAClC,UAAU,EAAE,mBAAmB;IAC/B,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,gBAAgB;CACuB,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,60 @@
1
+ import type { NodeExecutionContext } from "cascade/contracts";
2
+ import { transformDefinition } from "./definitions.js";
3
+ /**
4
+ * Transform SOP's parameters, by its names: translate, rotate, scale, pivot,
5
+ * in Houdini's scale-rotate-translate order about the pivot. Rotation is in
6
+ * degrees and counter-clockwise, because geometry is +Y up.
7
+ *
8
+ * The plan described this node as applying a `mat3`. It builds one instead: a
9
+ * matrix-typed input is the primitive the operation wants and the wrong thing
10
+ * to put in front of an artist, and the four parameters are what a Houdini user
11
+ * reaches for.
12
+ */
13
+ export declare function executeTransform(context: NodeExecutionContext<typeof transformDefinition>): void;
14
+ export declare const transformRegistration: {
15
+ kind: "definition-v1";
16
+ moduleId: string;
17
+ definition: {
18
+ readonly apiVersion: 1;
19
+ readonly label: "Transform";
20
+ readonly description: "Translate, rotate and scale geometry about a pivot.";
21
+ readonly icon: "Move";
22
+ readonly runsOn: "portable";
23
+ readonly inputs: {
24
+ readonly geometry: {
25
+ readonly kind: "data";
26
+ readonly type: "geometry";
27
+ };
28
+ readonly translate: {
29
+ readonly kind: "data";
30
+ readonly type: "vec2";
31
+ readonly default: readonly [0, 0];
32
+ };
33
+ readonly rotate: {
34
+ readonly kind: "data";
35
+ readonly type: "float";
36
+ readonly default: 0;
37
+ readonly description: "Degrees, counter-clockwise.";
38
+ };
39
+ readonly scale: {
40
+ readonly kind: "data";
41
+ readonly type: "vec2";
42
+ readonly default: readonly [1, 1];
43
+ };
44
+ readonly pivot: {
45
+ readonly kind: "data";
46
+ readonly type: "vec2";
47
+ readonly default: readonly [0, 0];
48
+ };
49
+ };
50
+ readonly outputs: {
51
+ readonly geometry: {
52
+ readonly kind: "data";
53
+ readonly type: "geometry";
54
+ };
55
+ };
56
+ };
57
+ loadExecute: () => Promise<typeof executeTransform>;
58
+ };
59
+ export { transformDefinition } from "./definitions.js";
60
+ //# sourceMappingURL=transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../src/builtins/geo/transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAM/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,oBAAoB,CAAC,OAAO,mBAAmB,CAAC,GACxD,IAAI,CAaN;AAED,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAKgC,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { emptyGeometry } from "cascade/contracts";
2
+ import { transformMatrix } from "../../geometry/matrix.js";
3
+ import { transformGeometry } from "../../geometry/transform.js";
4
+ import { transformDefinition } from "./definitions.js";
5
+ import { geoModuleId } from "./namespace.js";
6
+ /**
7
+ * Transform SOP's parameters, by its names: translate, rotate, scale, pivot,
8
+ * in Houdini's scale-rotate-translate order about the pivot. Rotation is in
9
+ * degrees and counter-clockwise, because geometry is +Y up.
10
+ *
11
+ * The plan described this node as applying a `mat3`. It builds one instead: a
12
+ * matrix-typed input is the primitive the operation wants and the wrong thing
13
+ * to put in front of an artist, and the four parameters are what a Houdini user
14
+ * reaches for.
15
+ */
16
+ export function executeTransform(context) {
17
+ const geometry = context.inputs.geometry ?? emptyGeometry(2);
18
+ context.outputs.geometry.set(transformGeometry(geometry, transformMatrix({
19
+ translate: context.inputs.translate,
20
+ rotate: context.inputs.rotate,
21
+ scale: context.inputs.scale,
22
+ pivot: context.inputs.pivot,
23
+ })));
24
+ }
25
+ export const transformRegistration = {
26
+ kind: "definition-v1",
27
+ moduleId: geoModuleId("Transform"),
28
+ definition: transformDefinition,
29
+ loadExecute: async () => executeTransform,
30
+ };
31
+ export { transformDefinition } from "./definitions.js";
32
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../src/builtins/geo/transform.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAyD;IAEzD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAC1B,iBAAiB,CACf,QAAQ,EACR,eAAe,CAAC;QACd,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS;QACnC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;QAC7B,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK;QAC3B,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK;KAC5B,CAAC,CACH,CACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,eAAe;IACrB,QAAQ,EAAE,WAAW,CAAC,WAAW,CAAC;IAClC,UAAU,EAAE,mBAAmB;IAC/B,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,gBAAgB;CACuB,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { DefinitionNodeRegistration } from "../types.js";
2
+ /**
3
+ * Every reserved built-in, in one list, so that a caller does not have to know
4
+ * how many namespaces there are. `cascade.core.*` is structural and routing;
5
+ * `cascade.geo.*` is the geometry set.
6
+ */
7
+ export declare const builtinNodeRegistrations: readonly DefinitionNodeRegistration[];
8
+ export declare function builtinNodeRegistration(moduleId: string): DefinitionNodeRegistration | undefined;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/builtins/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAI9D;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAAS,0BAA0B,EACN,CAAC;AASrE,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,GACf,0BAA0B,GAAG,SAAS,CAExC"}
@@ -0,0 +1,16 @@
1
+ import { coreNodeRegistrations } from "./core/index.js";
2
+ import { geoNodeRegistrations } from "./geo/index.js";
3
+ /**
4
+ * Every reserved built-in, in one list, so that a caller does not have to know
5
+ * how many namespaces there are. `cascade.core.*` is structural and routing;
6
+ * `cascade.geo.*` is the geometry set.
7
+ */
8
+ export const builtinNodeRegistrations = Object.freeze([...coreNodeRegistrations, ...geoNodeRegistrations]);
9
+ const registrationsById = new Map(builtinNodeRegistrations.map((registration) => [
10
+ registration.moduleId,
11
+ registration,
12
+ ]));
13
+ export function builtinNodeRegistration(moduleId) {
14
+ return registrationsById.get(moduleId);
15
+ }
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/builtins/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GACnC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,qBAAqB,EAAE,GAAG,oBAAoB,CAAC,CAAC,CAAC;AAErE,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,wBAAwB,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC;IAC7C,YAAY,CAAC,QAAQ;IACrB,YAAY;CACb,CAAC,CACH,CAAC;AAEF,MAAM,UAAU,uBAAuB,CACrC,QAAgB;IAEhB,OAAO,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type * as TypeScript from "typescript";
2
+ import type { Diagnostic } from "cascade/contracts";
3
+ /**
4
+ * Enforces the statically inspectable node-module boundary. This is an
5
+ * architecture check for trusted project code, not a security sandbox.
6
+ */
7
+ export declare function validateNodeModuleArchitecture(source: string, fileName: string, ts: typeof TypeScript): readonly Diagnostic[];
8
+ //# sourceMappingURL=architecture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architecture.d.ts","sourceRoot":"","sources":["../../src/definition/architecture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,UAAU,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAcrD;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,OAAO,UAAU,GACpB,SAAS,UAAU,EAAE,CAkHvB"}
@@ -0,0 +1,112 @@
1
+ const AMBIENT_STATE = new Set([
2
+ "globalThis",
3
+ "window",
4
+ "document",
5
+ "localStorage",
6
+ "sessionStorage",
7
+ "indexedDB",
8
+ "process",
9
+ "Bun",
10
+ "Deno",
11
+ ]);
12
+ /**
13
+ * Enforces the statically inspectable node-module boundary. This is an
14
+ * architecture check for trusted project code, not a security sandbox.
15
+ */
16
+ export function validateNodeModuleArchitecture(source, fileName, ts) {
17
+ const file = ts.createSourceFile(fileName, source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
18
+ const diagnostics = [];
19
+ for (const statement of file.statements) {
20
+ if (ts.isVariableStatement(statement) && !isDefinition(statement)) {
21
+ add(statement, "module-state", "Node modules may not declare module-level values; use a pure function or pass state through ports, props, and declared capabilities");
22
+ }
23
+ else if (ts.isClassDeclaration(statement) ||
24
+ ts.isEnumDeclaration(statement) ||
25
+ ts.isModuleDeclaration(statement)) {
26
+ add(statement, "module-state", "Node modules may not declare classes, enums, or namespaces because they can retain module-global state");
27
+ }
28
+ else if (ts.isExpressionStatement(statement)) {
29
+ add(statement, "top-level-effect", "Node modules may not run top-level effects");
30
+ }
31
+ else if (ts.isImportDeclaration(statement) &&
32
+ !statement.importClause) {
33
+ add(statement, "side-effect-import", "Side-effect imports are not allowed in node modules");
34
+ }
35
+ else if (ts.isImportDeclaration(statement) &&
36
+ !statement.importClause?.isTypeOnly &&
37
+ ts.isStringLiteral(statement.moduleSpecifier) &&
38
+ importsSiblingNode(fileName, statement.moduleSpecifier.text)) {
39
+ add(statement.moduleSpecifier, "node-import", "A node may not import another node implementation; connect the nodes with a graph wire");
40
+ }
41
+ }
42
+ visit(file);
43
+ return diagnostics;
44
+ function visit(node) {
45
+ if (ts.isTypeNode(node) || ts.isImportDeclaration(node))
46
+ return;
47
+ if (ts.isIdentifier(node) &&
48
+ AMBIENT_STATE.has(node.text) &&
49
+ isReference(node)) {
50
+ add(node, "ambient-state", `${node.text} is ambient state; receive data through ports, props, or a declared capability`);
51
+ }
52
+ if (ts.isCallExpression(node) &&
53
+ node.expression.kind === ts.SyntaxKind.ImportKeyword) {
54
+ add(node, "dynamic-import", "Dynamic imports are not allowed in deterministic node execution");
55
+ }
56
+ ts.forEachChild(node, visit);
57
+ }
58
+ function isReference(node) {
59
+ const parent = node.parent;
60
+ return !((ts.isPropertyAccessExpression(parent) && parent.name === node) ||
61
+ (ts.isPropertyAssignment(parent) && parent.name === node) ||
62
+ (ts.isMethodDeclaration(parent) && parent.name === node) ||
63
+ (ts.isPropertyDeclaration(parent) && parent.name === node));
64
+ }
65
+ function isDefinition(statement) {
66
+ return Boolean(statement.declarationList.flags & ts.NodeFlags.Const) &&
67
+ Boolean(statement.modifiers?.some((item) => item.kind === ts.SyntaxKind.ExportKeyword)) &&
68
+ statement.declarationList.declarations.length === 1 &&
69
+ ts.isIdentifier(statement.declarationList.declarations[0].name) &&
70
+ statement.declarationList.declarations[0].name.text === "definition";
71
+ }
72
+ function add(node, code, message) {
73
+ const point = file.getLineAndCharacterOfPosition(node.getStart(file));
74
+ diagnostics.push({
75
+ phase: "architecture",
76
+ code: `architecture/${code}`,
77
+ message,
78
+ file: fileName,
79
+ line: point.line + 1,
80
+ column: point.character + 1,
81
+ });
82
+ }
83
+ }
84
+ function importsSiblingNode(fileName, specifier) {
85
+ if (!specifier.startsWith("."))
86
+ return false;
87
+ const file = normalize(fileName).split("/");
88
+ const nodesIndex = file.lastIndexOf("nodes");
89
+ if (nodesIndex < 0 || !file[nodesIndex + 1])
90
+ return false;
91
+ const sourceNode = file[nodesIndex + 1];
92
+ const resolved = normalize([...file.slice(0, -1), ...specifier.split("/")].join("/")).split("/");
93
+ const resolvedNodesIndex = resolved.lastIndexOf("nodes");
94
+ return resolvedNodesIndex >= 0 &&
95
+ Boolean(resolved[resolvedNodesIndex + 1]) &&
96
+ resolved[resolvedNodesIndex + 1] !== sourceNode;
97
+ }
98
+ function normalize(value) {
99
+ const output = [];
100
+ // split/join rather than replaceAll: the root tsconfig targets ES2020, so
101
+ // svelte-check rejects the ES2021 method even though this package targets ES2022.
102
+ for (const part of value.split("\\").join("/").split("/")) {
103
+ if (!part || part === ".")
104
+ continue;
105
+ if (part === "..")
106
+ output.pop();
107
+ else
108
+ output.push(part);
109
+ }
110
+ return output.join("/");
111
+ }
112
+ //# sourceMappingURL=architecture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architecture.js","sourceRoot":"","sources":["../../src/definition/architecture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type * as TypeScript from "typescript";
2
+ import { type Diagnostic, type NodeDefinition } from "cascade/contracts";
3
+ export type DefinitionExtractionResult = {
4
+ readonly ok: true;
5
+ readonly definition: NodeDefinition;
6
+ readonly diagnostics: readonly [];
7
+ } | {
8
+ readonly ok: false;
9
+ readonly diagnostics: readonly Diagnostic[];
10
+ };
11
+ export declare function extractNodeDefinition(source: string, fileName: string, ts: typeof TypeScript): DefinitionExtractionResult;
12
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/definition/extract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,UAAU,MAAM,YAAY,CAAC;AAC9C,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,0BAA0B,GAClC;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC;CACnC,GACD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAA;CAAE,CAAC;AAKxE,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,OAAO,UAAU,GACpB,0BAA0B,CA6N5B"}
@@ -0,0 +1,151 @@
1
+ import { validateNodeDefinition, } from "cascade/contracts";
2
+ const MAX_DEPTH = 32;
3
+ const MAX_NODES = 10_000;
4
+ export function extractNodeDefinition(source, fileName, ts) {
5
+ const file = ts.createSourceFile(fileName, source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
6
+ const syntaxDiagnostics = file.parseDiagnostics;
7
+ if (syntaxDiagnostics?.length) {
8
+ const syntax = syntaxDiagnostics[0];
9
+ const start = syntax.start ?? 0;
10
+ const point = file.getLineAndCharacterOfPosition(start);
11
+ return {
12
+ ok: false,
13
+ diagnostics: [
14
+ {
15
+ phase: "definition",
16
+ code: "definition/syntax",
17
+ message: ts.flattenDiagnosticMessageText(syntax.messageText, "\n"),
18
+ file: fileName,
19
+ line: point.line + 1,
20
+ column: point.character + 1,
21
+ },
22
+ ],
23
+ };
24
+ }
25
+ const declarations = [];
26
+ for (const statement of file.statements) {
27
+ if (!ts.isVariableStatement(statement) ||
28
+ !statement.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword))
29
+ continue;
30
+ if (!(statement.declarationList.flags & ts.NodeFlags.Const))
31
+ continue;
32
+ for (const declaration of statement.declarationList.declarations) {
33
+ if (ts.isIdentifier(declaration.name) &&
34
+ declaration.name.text === "definition")
35
+ declarations.push(declaration);
36
+ }
37
+ }
38
+ if (declarations.length !== 1)
39
+ return failure(declarations[1] ?? declarations[0] ?? file, declarations.length
40
+ ? "definition/duplicate-export"
41
+ : "definition/missing-export", declarations.length
42
+ ? "Exactly one definition export is allowed"
43
+ : "Missing exported const definition");
44
+ const declaration = declarations[0];
45
+ const initializer = declaration.initializer;
46
+ if (!initializer)
47
+ return failure(declaration, "definition/non-literal", "definition requires a literal initializer");
48
+ let visited = 0;
49
+ try {
50
+ const definition = read(initializer, "$", 0);
51
+ const diagnostics = validateNodeDefinition(definition).map((item) => ({
52
+ ...item,
53
+ file: fileName,
54
+ ...location(initializer),
55
+ }));
56
+ return diagnostics.length
57
+ ? { ok: false, diagnostics }
58
+ : { ok: true, definition: definition, diagnostics: [] };
59
+ }
60
+ catch (error) {
61
+ return {
62
+ ok: false,
63
+ diagnostics: [error.diagnostic],
64
+ };
65
+ }
66
+ function read(node, path, depth) {
67
+ if (++visited > MAX_NODES)
68
+ throw extraction(node, "definition/size-limit", "Definition exceeds 10,000 syntax nodes", path);
69
+ if (depth > MAX_DEPTH)
70
+ throw extraction(node, "definition/depth-limit", "Definition exceeds 32 levels", path);
71
+ if (ts.isParenthesizedExpression(node) || ts.isSatisfiesExpression(node))
72
+ return read(node.expression, path, depth + 1);
73
+ if (ts.isAsExpression(node)) {
74
+ if (node.type.getText(file) !== "const")
75
+ throw extraction(node.type, "definition/non-literal", "Only 'as const' assertions are allowed", path);
76
+ return read(node.expression, path, depth + 1);
77
+ }
78
+ if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node))
79
+ return node.text;
80
+ if (ts.isNumericLiteral(node))
81
+ return Number(node.text);
82
+ if (node.kind === ts.SyntaxKind.TrueKeyword)
83
+ return true;
84
+ if (node.kind === ts.SyntaxKind.FalseKeyword)
85
+ return false;
86
+ if (node.kind === ts.SyntaxKind.NullKeyword)
87
+ return null;
88
+ if (ts.isPrefixUnaryExpression(node) &&
89
+ node.operator === ts.SyntaxKind.MinusToken &&
90
+ ts.isNumericLiteral(node.operand))
91
+ return -Number(node.operand.text);
92
+ if (ts.isArrayLiteralExpression(node))
93
+ return node.elements.map((element, index) => {
94
+ if (ts.isSpreadElement(element))
95
+ throw extraction(element, "definition/spread", "Spreads are not allowed", `${path}.${index}`);
96
+ return read(element, `${path}.${index}`, depth + 1);
97
+ });
98
+ if (ts.isObjectLiteralExpression(node)) {
99
+ const object = Object.create(null);
100
+ const keys = new Set();
101
+ for (const property of node.properties) {
102
+ if (ts.isSpreadAssignment(property))
103
+ throw extraction(property, "definition/spread", "Spreads are not allowed", path);
104
+ if (!ts.isPropertyAssignment(property) ||
105
+ (property.name && ts.isComputedPropertyName(property.name)))
106
+ throw extraction(property, "definition/non-literal", "Only explicit properties are allowed", path);
107
+ const key = ts.isIdentifier(property.name) ||
108
+ ts.isStringLiteral(property.name) ||
109
+ ts.isNumericLiteral(property.name)
110
+ ? property.name.text
111
+ : undefined;
112
+ if (key === undefined)
113
+ throw extraction(property, "definition/non-literal", "Property name must be literal", path);
114
+ if (keys.has(key))
115
+ throw extraction(property.name, "definition/duplicate-key", `Duplicate key ${key}`, `${path}.${key}`);
116
+ keys.add(key);
117
+ object[key] = read(property.initializer, `${path}.${key}`, depth + 1);
118
+ }
119
+ return object;
120
+ }
121
+ throw extraction(node, "definition/non-literal", `Unsupported ${ts.SyntaxKind[node.kind]}`, path);
122
+ }
123
+ function location(node) {
124
+ const point = file.getLineAndCharacterOfPosition(node.getStart(file));
125
+ return { line: point.line + 1, column: point.character + 1 };
126
+ }
127
+ function extraction(node, code, message, path) {
128
+ return new ExtractionFailure({
129
+ phase: "definition",
130
+ code,
131
+ message,
132
+ path,
133
+ file: fileName,
134
+ ...location(node),
135
+ });
136
+ }
137
+ function failure(node, code, message) {
138
+ return {
139
+ ok: false,
140
+ diagnostics: [extraction(node, code, message).diagnostic],
141
+ };
142
+ }
143
+ }
144
+ class ExtractionFailure extends Error {
145
+ diagnostic;
146
+ constructor(diagnostic) {
147
+ super(diagnostic.message);
148
+ this.diagnostic = diagnostic;
149
+ }
150
+ }
151
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/definition/extract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Diagnostic } from "cascade/contracts";
2
+ export declare class CascadeRuntimeError extends Error {
3
+ readonly code: string;
4
+ readonly diagnostics: readonly Diagnostic[];
5
+ readonly name = "CascadeRuntimeError";
6
+ constructor(code: string, diagnostics: readonly Diagnostic[], message?: string);
7
+ }
8
+ //# sourceMappingURL=error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,qBAAa,mBAAoB,SAAQ,KAAK;IAG1C,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE;IAH7C,QAAQ,CAAC,IAAI,yBAAyB;gBAE3B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,SAAS,UAAU,EAAE,EAC3C,OAAO,SAAkC;CAI5C"}
@@ -0,0 +1,11 @@
1
+ export class CascadeRuntimeError extends Error {
2
+ code;
3
+ diagnostics;
4
+ name = "CascadeRuntimeError";
5
+ constructor(code, diagnostics, message = diagnostics[0]?.message ?? code) {
6
+ super(message);
7
+ this.code = code;
8
+ this.diagnostics = diagnostics;
9
+ }
10
+ }
11
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAGjC;IACA;IAHF,IAAI,GAAG,qBAAqB,CAAC;IACtC,YACW,IAAY,EACZ,WAAkC,EAC3C,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,IAAI;QAEzC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,SAAI,GAAJ,IAAI,CAAQ;QACZ,gBAAW,GAAX,WAAW,CAAuB;IAI7C,CAAC;CACF"}
@@ -0,0 +1,65 @@
1
+ import { type AnyAttribute, type Attribute, type AttributeLevel, type AttributeSet, type AttributeStorage, type DetailValue, type ElementLevel, type Geometry, type StringAttribute } from "cascade/contracts";
2
+ /**
3
+ * Attribute reads and writes. Every write returns a new `Geometry` and shares
4
+ * the arrays it did not touch, which is the whole reason the format is
5
+ * struct-of-arrays: with array-of-structs there is no granularity to share at.
6
+ *
7
+ * Node code should stay on this surface rather than reaching into an
8
+ * attribute's `data`, because nothing in the language stops a write into a
9
+ * shared array and everything downstream would then see it. See the immutability
10
+ * note at the top of `packages/contracts/src/geometry.ts`.
11
+ */
12
+ export declare function geometryError(code: string, message: string): never;
13
+ /** The attribute set at an element level. */
14
+ export declare function attributeSet(geometry: Geometry, level: ElementLevel): AttributeSet;
15
+ export declare function getAttribute(geometry: Geometry, level: ElementLevel, name: string): AnyAttribute | undefined;
16
+ export declare function hasAttribute(geometry: Geometry, level: ElementLevel, name: string): boolean;
17
+ /** Names at a level, in insertion order. */
18
+ export declare function attributeNames(geometry: Geometry, level: ElementLevel): readonly string[];
19
+ export declare function requireAttribute(geometry: Geometry, level: ElementLevel, name: string): AnyAttribute;
20
+ /** A numeric attribute when present, with consumer-specific arity validation. */
21
+ export declare function numericAttribute(attribute: AnyAttribute | undefined, path: string, sizes?: readonly number[]): Attribute | undefined;
22
+ /** One component of one element. */
23
+ export declare function readComponent(attribute: Attribute, index: number, component?: number): number;
24
+ /** Every component of one element, as a plain array. */
25
+ export declare function readElement(attribute: Attribute, index: number): number[];
26
+ /** One element of a string attribute. Out-of-table indices read as empty. */
27
+ export declare function readString(attribute: StringAttribute, index: number): string;
28
+ /** A whole element without knowing which kind of attribute it is. */
29
+ export declare function readAttribute(attribute: AnyAttribute, index: number): number | number[] | string;
30
+ /** Declared position width: 2 or 3. */
31
+ export declare function positionSize(geometry: Geometry): number;
32
+ export declare function positionAttribute(geometry: Geometry): Attribute;
33
+ export declare function getPosition(geometry: Geometry, index: number): number[];
34
+ /** A zeroed numeric attribute for `count` elements. */
35
+ export declare function createAttribute(count: number, size: number, storage?: AttributeStorage, fill?: readonly number[] | number): Attribute;
36
+ /** A string attribute from per-element strings, tabled and deduplicated. */
37
+ export declare function createStringAttribute(values: readonly string[]): StringAttribute;
38
+ /** Replace one level's attribute set, sharing every other array. */
39
+ export declare function withAttributeSet(geometry: Geometry, level: ElementLevel, set: AttributeSet): Geometry;
40
+ /** Add or replace one attribute. Copy-on-write at attribute granularity. */
41
+ export declare function setAttribute(geometry: Geometry, level: ElementLevel, name: string, attribute: AnyAttribute): Geometry;
42
+ export declare function removeAttribute(geometry: Geometry, level: ElementLevel, name: string): Geometry;
43
+ /** Replace the detail record, sharing every array. */
44
+ export declare function setDetail(geometry: Geometry, name: string, value: DetailValue): Geometry;
45
+ /** Drop one detail value, sharing every array. */
46
+ export declare function removeDetail(geometry: Geometry, name: string): Geometry;
47
+ export interface AttributeCreateOptions {
48
+ readonly level: AttributeLevel;
49
+ readonly name: string;
50
+ /** A constant for every element at the level, or the detail value. */
51
+ readonly value: number | readonly number[] | string;
52
+ /** Ignored for a string value; defaults to `f64`. */
53
+ readonly storage?: AttributeStorage;
54
+ }
55
+ /**
56
+ * The Attribute Create operation: one named attribute at one level, filled with
57
+ * a constant. This is the operation that makes the four-level model visible
58
+ * rather than an implementation detail, and it is the one that stops the
59
+ * `cloud-plots` class of bug, where every hand-rolled per-primitive value had
60
+ * to be remembered by name in every operation that touched the geometry.
61
+ */
62
+ export declare function attributeCreate(geometry: Geometry, options: AttributeCreateOptions): Geometry;
63
+ /** A same-storage copy of an attribute's array, for a write-in-place pass. */
64
+ export declare function copyAttributeArray(attribute: Attribute): import("cascade/contracts").AttributeArray;
65
+ //# sourceMappingURL=attributes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attributes.d.ts","sourceRoot":"","sources":["../../src/geometry/attributes.ts"],"names":[],"mappings":"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"}