@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,91 @@
1
+ import { Color, type Geometry } from "cascade/contracts";
2
+ /**
3
+ * Geometry to an SVG document. The node that makes the library provably useful,
4
+ * because it produces a file to print or plot rather than an assertion.
5
+ *
6
+ * ## The Y flip lives here and nowhere else
7
+ *
8
+ * Geometry is +Y up: Marcus ruled on that, so a `Circle` at `+1` sits above the
9
+ * origin and every operation upstream reads the same way. SVG, Canvas and the
10
+ * existing rasterizer are all +Y down. The whole point of deciding the handedness
11
+ * once is that there is then exactly one flip, and this is it: a
12
+ * `transform="scale(1,-1)"` on the root group, with the viewBox's `y` set to
13
+ * `-maxY` so the flipped content lands inside it.
14
+ *
15
+ * Do not "fix" this by negating anywhere upstream. A flip applied per operation
16
+ * is the version that produces a drawing which is right until something rotates.
17
+ *
18
+ * ## Style is an attribute, with the prop as the fallback
19
+ *
20
+ * `Cd`, `width` and `opacity` are read per primitive when present and taken
21
+ * from the caller's default when absent. That rule is not invented here:
22
+ * `cloud-plots/src/cloud_plots/svgio.py` already runs it as
23
+ * `color = r.get("color", mark_color)`, having arrived at Houdini's convention
24
+ * independently. So the defaults go on the root group and a per-primitive value
25
+ * is emitted only where it exists, which also keeps the file small.
26
+ *
27
+ * ## Colour is a `vec4`, and this file is where it becomes text
28
+ *
29
+ * `Cd` is a four-component colour and nothing else. A string `Cd` used to be
30
+ * accepted here so that `cloud-plots`' `"#3a7f5c"` could be stored verbatim;
31
+ * Marcus overruled that 2026-09-04, so a hex string is now converted at the
32
+ * boundary by `Color.fromHex` and the attribute holds the vector. An emitted
33
+ * paint goes through `Color.toHex`, and `Cd`'s alpha becomes a separate
34
+ * `stroke-opacity` rather than an eight-digit hex, because plotter and
35
+ * vector-editor software does not read CSS Color 4.
36
+ *
37
+ * A `Cd` that is a string, or numeric with any size but 4, is refused rather
38
+ * than ignored. Silently dropping a colour attribute is the exact bug the plan
39
+ * records twice in `cloud-plots`, and an export that quietly turns black is
40
+ * worse than one that says why.
41
+ *
42
+ * ## One group element per primitive group
43
+ *
44
+ * Not a refinement either: `cloud-plots` carries a whole `layer-group` node and
45
+ * a layers path through its Python writer so that plotter software can assign a
46
+ * pen per layer, and duplicates the geometry per layer to express it. A
47
+ * primitive belongs to exactly one emitted group, the first it is a member of in
48
+ * insertion order, because a pen is not a set.
49
+ */
50
+ export interface SvgExportOptions {
51
+ /** Document width; 0 or absent derives it from the geometry bounds. */
52
+ readonly width?: number;
53
+ readonly height?: number;
54
+ /** Added around the derived bounds, in geometry units. */
55
+ readonly margin?: number;
56
+ /** Fallback stroke colour for a primitive with no `Cd`. */
57
+ readonly stroke?: Color;
58
+ /** Fallback stroke width for a primitive with no `width`. */
59
+ readonly strokeWidth?: number;
60
+ /** Fallback opacity for a primitive with no `opacity`. */
61
+ readonly opacity?: number;
62
+ /**
63
+ * Fill colour for every primitive, applied only when `fillMode` is "solid".
64
+ *
65
+ * Fill is two settings rather than one because a zero-alpha fill and SVG's
66
+ * `fill="none"` are not the same thing: `none` says the region is not filled,
67
+ * while a transparent fill says it is filled with nothing, and a plotter
68
+ * driver reading the second still generates a fill toolpath. Inferring the
69
+ * intent from alpha also throws the colour away, so a fill cannot be switched
70
+ * back on without picking it again. Declaring the mode keeps the two
71
+ * independent. Stroke has no matching mode because nothing exports geometry
72
+ * with no stroke, and inventing one for symmetry would add a way to produce an
73
+ * empty file.
74
+ */
75
+ readonly fill?: Color;
76
+ readonly fillMode?: "none" | "solid";
77
+ /** Radius for a loose point with no `pscale`. */
78
+ readonly pointRadius?: number;
79
+ /** Decimal places on emitted coordinates. */
80
+ readonly precision?: number;
81
+ }
82
+ export declare function geometryToSvg(geometry: Geometry, options?: SvgExportOptions): string;
83
+ /**
84
+ * UTF-8 bytes for a document, hand-rolled because the runtime's `lib` is
85
+ * `ES2022` and nothing else: `TextEncoder` exists in every host that will ever
86
+ * run this but is typed in the DOM and Node libraries, which this package
87
+ * deliberately does not include. Adding either to see one constructor would
88
+ * widen the environment-neutral surface for the sake of a nine-line loop.
89
+ */
90
+ export declare function utf8Bytes(value: string): Uint8Array;
91
+ //# sourceMappingURL=svg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../src/geometry/svg.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EAIL,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAkB5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IACxB,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC,iDAAiD;IACjD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,6CAA6C;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAKD,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,gBAAqB,GAC7B,MAAM,CA2IR;AA8GD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAsBnD"}
@@ -0,0 +1,216 @@
1
+ import { Color, isStringAttribute, } from "cascade/contracts";
2
+ import { geometryError, numericAttribute, positionAttribute, readComponent, } from "./attributes.js";
3
+ import { groupNames } from "./groups.js";
4
+ import { bezierSegments, geometryBounds, isBezier, isClosed, loosePointMask, primitivePoints, } from "./primitives.js";
5
+ const UNGROUPED = "ungrouped";
6
+ const BLACK = [0, 0, 0, 1];
7
+ export function geometryToSvg(geometry, options = {}) {
8
+ validateOptions(options);
9
+ const margin = options.margin ?? 0;
10
+ const bounds = geometryBounds(geometry);
11
+ const minX = bounds === undefined ? 0 : bounds.min[0] - margin;
12
+ const minY = bounds === undefined ? 0 : bounds.min[1] - margin;
13
+ const maxX = bounds === undefined ? 1 : bounds.max[0] + margin;
14
+ const maxY = bounds === undefined ? 1 : bounds.max[1] + margin;
15
+ const spanX = Math.max(maxX - minX, Number.EPSILON);
16
+ const spanY = Math.max(maxY - minY, Number.EPSILON);
17
+ const width = options.width && options.width > 0 ? options.width : spanX;
18
+ const height = options.height && options.height > 0 ? options.height : spanY;
19
+ const precision = options.precision ?? 3;
20
+ const number = (value) => format(value, precision);
21
+ const stroke = options.stroke ?? BLACK;
22
+ const strokeWidth = options.strokeWidth ?? 1;
23
+ const fill = options.fill ?? BLACK;
24
+ const filled = (options.fillMode ?? "none") === "solid";
25
+ const colour = geometry.primitive.Cd;
26
+ const strokeWidths = numericAttribute(geometry.primitive.width, "primitive.width", [1]);
27
+ const opacities = numericAttribute(geometry.primitive.opacity, "primitive.opacity", [1]);
28
+ const pointScale = numericAttribute(geometry.point.pscale, "point.pscale", [1]);
29
+ const pointColour = geometry.point.Cd;
30
+ validateRange(strokeWidths, "primitive.width", (value) => value >= 0, "non-negative");
31
+ validateRange(opacities, "primitive.opacity", (value) => value >= 0 && value <= 1, "between 0 and 1");
32
+ validateRange(pointScale, "point.pscale", (value) => value >= 0, "non-negative");
33
+ const names = groupNames(geometry, "primitive");
34
+ const assigned = new Int32Array(geometry.primitiveCount).fill(-1);
35
+ for (let index = 0; index < names.length; index += 1) {
36
+ const mask = geometry.primitiveGroups[names[index]];
37
+ for (let primitive = 0; primitive < geometry.primitiveCount; primitive += 1)
38
+ if (mask[primitive] === 1 && assigned[primitive] === -1)
39
+ assigned[primitive] = index;
40
+ }
41
+ const path = (primitive) => {
42
+ const attributes = [`d="${pathData(geometry, primitive, number)}"`];
43
+ const paint = paintOf(colour, primitive, "primitive");
44
+ if (paint !== undefined) {
45
+ attributes.push(`stroke="${Color.toHex(paint)}"`);
46
+ if (Color.alpha(paint) < 1)
47
+ attributes.push(`stroke-opacity="${number(Color.alpha(paint))}"`);
48
+ }
49
+ if (strokeWidths !== undefined)
50
+ attributes.push(`stroke-width="${number(readComponent(strokeWidths, primitive))}"`);
51
+ if (opacities !== undefined)
52
+ attributes.push(`opacity="${number(readComponent(opacities, primitive))}"`);
53
+ return `<path ${attributes.join(" ")} />`;
54
+ };
55
+ const body = [];
56
+ if (names.length === 0) {
57
+ for (let primitive = 0; primitive < geometry.primitiveCount; primitive += 1)
58
+ body.push(indent(path(primitive), 2));
59
+ }
60
+ else {
61
+ for (let index = 0; index < names.length; index += 1) {
62
+ const members = [];
63
+ for (let primitive = 0; primitive < geometry.primitiveCount; primitive += 1)
64
+ if (assigned[primitive] === index)
65
+ members.push(indent(path(primitive), 3));
66
+ body.push(indent(`<g id="${escapeXml(names[index])}">`, 2), ...members, indent("</g>", 2));
67
+ }
68
+ const rest = [];
69
+ for (let primitive = 0; primitive < geometry.primitiveCount; primitive += 1)
70
+ if (assigned[primitive] === -1)
71
+ rest.push(indent(path(primitive), 3));
72
+ if (rest.length > 0)
73
+ body.push(indent(`<g id="${UNGROUPED}">`, 2), ...rest, indent("</g>", 2));
74
+ }
75
+ // Loose points are the dots: a point no primitive references. `cascade-logo`
76
+ // is half made of them and `cloud-plots` stipples thousands, so they are a
77
+ // first-class part of the drawing rather than debris. They take their radius
78
+ // from `pscale`, which is Houdini's name for exactly that quantity and what
79
+ // the Python stipple stage already means by its third position component.
80
+ const loose = loosePointMask(geometry);
81
+ const position = positionAttribute(geometry);
82
+ for (let point = 0; point < geometry.pointCount; point += 1) {
83
+ if (loose[point] !== 1)
84
+ continue;
85
+ const radius = pointScale === undefined
86
+ ? (options.pointRadius ?? 0.5)
87
+ : readComponent(pointScale, point);
88
+ const paint = paintOf(pointColour, point, "point") ?? stroke;
89
+ const transparent = Color.alpha(paint) < 1;
90
+ body.push(indent(`<circle cx="${number(readComponent(position, point, 0))}" cy="${number(readComponent(position, point, 1))}" r="${number(radius)}" fill="${Color.toHex(paint)}"${transparent ? ` fill-opacity="${number(Color.alpha(paint))}"` : ""} stroke="none" />`, 2));
91
+ }
92
+ const root = [
93
+ `<svg xmlns="http://www.w3.org/2000/svg" width="${number(width)}" height="${number(height)}" viewBox="${number(minX)} ${number(-maxY)} ${number(spanX)} ${number(spanY)}">`,
94
+ indent("<!-- Geometry is +Y up; SVG is +Y down. This is the one flip. -->", 1),
95
+ indent(`<g transform="scale(1,-1)" fill="${filled ? Color.toHex(fill) : "none"}"${filled && Color.alpha(fill) < 1
96
+ ? ` fill-opacity="${number(Color.alpha(fill))}"`
97
+ : ""} stroke="${Color.toHex(stroke)}"${Color.alpha(stroke) < 1
98
+ ? ` stroke-opacity="${number(Color.alpha(stroke))}"`
99
+ : ""} stroke-width="${number(strokeWidth)}"${options.opacity !== undefined && options.opacity !== 1
100
+ ? ` opacity="${number(options.opacity)}"`
101
+ : ""}>`, 1),
102
+ ...body,
103
+ indent("</g>", 1),
104
+ "</svg>",
105
+ ];
106
+ return `${root.join("\n")}\n`;
107
+ }
108
+ function pathData(geometry, primitive, number) {
109
+ const position = positionAttribute(geometry);
110
+ const at = (point) => `${number(readComponent(position, point, 0))} ${number(readComponent(position, point, 1))}`;
111
+ const closed = isClosed(geometry, primitive);
112
+ if (isBezier(geometry, primitive)) {
113
+ const segments = bezierSegments(geometry, primitive);
114
+ if (segments.length === 0)
115
+ return "";
116
+ const commands = [`M ${at(segments[0][0])}`];
117
+ for (const [, first, second, end] of segments)
118
+ commands.push(`C ${at(first)} ${at(second)} ${at(end)}`);
119
+ if (closed)
120
+ commands.push("Z");
121
+ return commands.join(" ");
122
+ }
123
+ const points = primitivePoints(geometry, primitive);
124
+ if (points.length === 0)
125
+ return "";
126
+ const commands = [`M ${at(points[0])}`];
127
+ for (let index = 1; index < points.length; index += 1)
128
+ commands.push(`L ${at(points[index])}`);
129
+ if (closed)
130
+ commands.push("Z");
131
+ return commands.join(" ");
132
+ }
133
+ /**
134
+ * The colour of one element from a `Cd` attribute. `Cd` is a `vec4` and this
135
+ * refuses anything else, loudly: a string attribute is the representation the
136
+ * ruling removed, and a numeric attribute of any other size is a colour whose
137
+ * components do not mean what the reader assumes.
138
+ */
139
+ function paintOf(attribute, index, level) {
140
+ if (attribute === undefined)
141
+ return undefined;
142
+ if (isStringAttribute(attribute))
143
+ geometryError("colour-storage", `${level}.Cd is a string attribute; colour is a vec4. Convert with Color.fromHex at the boundary.`);
144
+ if (attribute.size !== 4)
145
+ geometryError("colour-size", `${level}.Cd has size ${attribute.size}; colour is a vec4`);
146
+ return Color.fromComponents(attribute.data, index * 4, 4);
147
+ }
148
+ function format(value, precision) {
149
+ if (!Number.isFinite(value))
150
+ geometryError("svg-number", `cannot format non-finite value ${String(value)}`);
151
+ const rounded = Number.parseFloat(value.toFixed(precision));
152
+ return Object.is(rounded, -0) ? "0" : String(rounded);
153
+ }
154
+ function validateOptions(options) {
155
+ for (const [name, value] of [
156
+ ["width", options.width],
157
+ ["height", options.height],
158
+ ["margin", options.margin],
159
+ ["strokeWidth", options.strokeWidth],
160
+ ["opacity", options.opacity],
161
+ ["pointRadius", options.pointRadius],
162
+ ]) {
163
+ if (value !== undefined && !Number.isFinite(value))
164
+ geometryError("svg-option", `${name} must be finite`);
165
+ }
166
+ if ((options.width ?? 0) < 0 || (options.height ?? 0) < 0)
167
+ geometryError("svg-option", "width and height must not be negative");
168
+ if ((options.strokeWidth ?? 0) < 0 || (options.pointRadius ?? 0) < 0)
169
+ geometryError("svg-option", "strokeWidth and pointRadius must not be negative");
170
+ if (options.opacity !== undefined && (options.opacity < 0 || options.opacity > 1))
171
+ geometryError("svg-option", "opacity must be between 0 and 1");
172
+ const precision = options.precision ?? 3;
173
+ if (!Number.isSafeInteger(precision) || precision < 0 || precision > 15)
174
+ geometryError("svg-precision", "precision must be an integer from 0 to 15");
175
+ }
176
+ function validateRange(attribute, path, accepts, expectation) {
177
+ if (attribute === undefined)
178
+ return;
179
+ for (const value of attribute.data)
180
+ if (!accepts(value))
181
+ geometryError("attribute-value", `${path} values must be ${expectation}`);
182
+ }
183
+ function indent(line, depth) {
184
+ return `${" ".repeat(depth)}${line}`;
185
+ }
186
+ function escapeXml(value) {
187
+ return value
188
+ .replace(/&/g, "&amp;")
189
+ .replace(/</g, "&lt;")
190
+ .replace(/>/g, "&gt;")
191
+ .replace(/"/g, "&quot;");
192
+ }
193
+ /**
194
+ * UTF-8 bytes for a document, hand-rolled because the runtime's `lib` is
195
+ * `ES2022` and nothing else: `TextEncoder` exists in every host that will ever
196
+ * run this but is typed in the DOM and Node libraries, which this package
197
+ * deliberately does not include. Adding either to see one constructor would
198
+ * widen the environment-neutral surface for the sake of a nine-line loop.
199
+ */
200
+ export function utf8Bytes(value) {
201
+ const bytes = [];
202
+ for (const character of value) {
203
+ let code = character.codePointAt(0);
204
+ if (code < 0x80)
205
+ bytes.push(code);
206
+ else if (code < 0x800)
207
+ bytes.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));
208
+ else if (code < 0x10000)
209
+ bytes.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));
210
+ else
211
+ bytes.push(0xf0 | (code >> 18), 0x80 | ((code >> 12) & 0x3f), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));
212
+ code = 0;
213
+ }
214
+ return Uint8Array.from(bytes);
215
+ }
216
+ //# sourceMappingURL=svg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg.js","sourceRoot":"","sources":["../../src/geometry/svg.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type Geometry, type Mat3, type Mat4 } from "cascade/contracts";
2
+ /**
3
+ * Transform `P`. Matrices are column-major, as the `mat3` and `mat4` types are
4
+ * already documented to be, so a `mat3`'s third column carries the 2D
5
+ * translation.
6
+ *
7
+ * Geometry is authored +Y up. The flip into SVG's and Canvas's +Y-down frame
8
+ * belongs in the export and render operations, once, and never here: a flip
9
+ * applied per operation is the version that produces a drawing which is right
10
+ * until something rotates.
11
+ *
12
+ * A `mat3` moves x and y and leaves a third position component alone, which is
13
+ * what 2D work wants on a 3-component `P`. A `mat4` moves all three, treating a
14
+ * 2-component `P` as z = 0 and discarding the resulting z, because widening `P`
15
+ * is a declaration and not a side effect of a transform.
16
+ */
17
+ export declare function transformGeometry(geometry: Geometry, matrix: Mat3 | Mat4): Geometry;
18
+ //# sourceMappingURL=transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/geometry/transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,IAAI,EACT,KAAK,IAAI,EACV,MAAM,oBAAoB,CAAC;AAU5B;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,IAAI,GAAG,IAAI,GAClB,QAAQ,CAmCV"}
@@ -0,0 +1,56 @@
1
+ import { POSITION_ATTRIBUTE, } from "cascade/contracts";
2
+ import { attributeSet, copyAttributeArray, geometryError, positionAttribute, withAttributeSet, } from "./attributes.js";
3
+ /**
4
+ * Transform `P`. Matrices are column-major, as the `mat3` and `mat4` types are
5
+ * already documented to be, so a `mat3`'s third column carries the 2D
6
+ * translation.
7
+ *
8
+ * Geometry is authored +Y up. The flip into SVG's and Canvas's +Y-down frame
9
+ * belongs in the export and render operations, once, and never here: a flip
10
+ * applied per operation is the version that produces a drawing which is right
11
+ * until something rotates.
12
+ *
13
+ * A `mat3` moves x and y and leaves a third position component alone, which is
14
+ * what 2D work wants on a 3-component `P`. A `mat4` moves all three, treating a
15
+ * 2-component `P` as z = 0 and discarding the resulting z, because widening `P`
16
+ * is a declaration and not a side effect of a transform.
17
+ */
18
+ export function transformGeometry(geometry, matrix) {
19
+ if (matrix.length !== 9 && matrix.length !== 16)
20
+ geometryError("matrix", "transform needs a mat3 or a mat4");
21
+ if (!matrix.every(Number.isFinite))
22
+ geometryError("matrix", "transform matrix values must be finite");
23
+ if (geometry.pointCount === 0)
24
+ return geometry;
25
+ const position = positionAttribute(geometry);
26
+ const size = position.size;
27
+ const data = copyAttributeArray(position);
28
+ if (matrix.length === 9) {
29
+ const m = matrix;
30
+ for (let point = 0; point < geometry.pointCount; point += 1) {
31
+ const base = point * size;
32
+ const x = data[base];
33
+ const y = data[base + 1];
34
+ data[base] = m[0] * x + m[3] * y + m[6];
35
+ data[base + 1] = m[1] * x + m[4] * y + m[7];
36
+ }
37
+ }
38
+ else {
39
+ const m = matrix;
40
+ for (let point = 0; point < geometry.pointCount; point += 1) {
41
+ const base = point * size;
42
+ const x = data[base];
43
+ const y = data[base + 1];
44
+ const z = size === 3 ? data[base + 2] : 0;
45
+ data[base] = m[0] * x + m[4] * y + m[8] * z + m[12];
46
+ data[base + 1] = m[1] * x + m[5] * y + m[9] * z + m[13];
47
+ if (size === 3)
48
+ data[base + 2] = m[2] * x + m[6] * y + m[10] * z + m[14];
49
+ }
50
+ }
51
+ return withAttributeSet(geometry, "point", {
52
+ ...attributeSet(geometry, "point"),
53
+ [POSITION_ATTRIBUTE]: { storage: position.storage, size, data },
54
+ });
55
+ }
56
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/geometry/transform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { CascadeRuntimeError } from "./error.js";
2
+ export * from "./geometry/index.js";
3
+ export { createRuntime } from "./runtime.js";
4
+ export type * from "./types.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,mBAAmB,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { CascadeRuntimeError } from "./error.js";
2
+ export * from "./geometry/index.js";
3
+ export { createRuntime } from "./runtime.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { RuntimeHost } from "./types.js";
2
+ import type { NodeRuntimeHostOptions } from "./types.js";
3
+ export declare function createNodeRuntimeHost(options: NodeRuntimeHostOptions): RuntimeHost;
4
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,sBAAsB,GAC9B,WAAW,CAgBb"}
@@ -0,0 +1,12 @@
1
+ export function createNodeRuntimeHost(options) {
2
+ const { modules, legacyShell, now = () => Date.now(), report = () => { }, ...capabilities } = options;
3
+ return {
4
+ environment: "server",
5
+ modules,
6
+ legacyShell,
7
+ capabilities,
8
+ now,
9
+ report,
10
+ };
11
+ }
12
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,qBAAqB,CACnC,OAA+B;IAE/B,MAAM,EACJ,OAAO,EACP,WAAW,EACX,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,EACtB,MAAM,GAAG,GAAG,EAAE,GAAE,CAAC,EACjB,GAAG,YAAY,EAChB,GAAG,OAAO,CAAC;IACZ,OAAO;QACL,WAAW,EAAE,QAAQ;QACrB,OAAO;QACP,WAAW;QACX,YAAY;QACZ,GAAG;QACH,MAAM;KACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CascadeRuntime, CreateRuntimeOptions } from "./types.js";
2
+ export declare function createRuntime(options: CreateRuntimeOptions): CascadeRuntime;
3
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAKV,cAAc,EAEd,oBAAoB,EAYrB,MAAM,YAAY,CAAC;AAuEpB,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,cAAc,CAE3E"}