effect-start 0.28.0 → 0.29.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 (645) hide show
  1. package/dist/Cookies.d.ts +9 -41
  2. package/dist/Cookies.d.ts.map +1 -1
  3. package/dist/Cookies.js +2 -2
  4. package/dist/Cookies.js.map +1 -1
  5. package/dist/Entity.d.ts +5 -6
  6. package/dist/Entity.d.ts.map +1 -1
  7. package/dist/Entity.js +10 -7
  8. package/dist/Entity.js.map +1 -1
  9. package/dist/Fetch.d.ts +23 -4
  10. package/dist/Fetch.d.ts.map +1 -1
  11. package/dist/Fetch.js +90 -1
  12. package/dist/Fetch.js.map +1 -1
  13. package/dist/FileRouter.d.ts +4 -7
  14. package/dist/FileRouter.d.ts.map +1 -1
  15. package/dist/FileRouter.js +39 -30
  16. package/dist/FileRouter.js.map +1 -1
  17. package/dist/FileRouterCodegen.d.ts +2 -2
  18. package/dist/FileRouterCodegen.d.ts.map +1 -1
  19. package/dist/FileRouterCodegen.js +9 -21
  20. package/dist/FileRouterCodegen.js.map +1 -1
  21. package/dist/FileSystem.d.ts +39 -39
  22. package/dist/FileSystem.d.ts.map +1 -1
  23. package/dist/FileSystem.js +5 -3
  24. package/dist/FileSystem.js.map +1 -1
  25. package/dist/GlobalLayer.d.ts +2 -2
  26. package/dist/GlobalLayer.d.ts.map +1 -1
  27. package/dist/GlobalLayer.js +1 -1
  28. package/dist/GlobalLayer.js.map +1 -1
  29. package/dist/PlatformRuntime.d.ts.map +1 -1
  30. package/dist/PlatformRuntime.js.map +1 -1
  31. package/dist/Route.d.ts +2 -2
  32. package/dist/Route.d.ts.map +1 -1
  33. package/dist/Route.js +1 -1
  34. package/dist/Route.js.map +1 -1
  35. package/dist/RouteBody.d.ts +1 -1
  36. package/dist/RouteBody.d.ts.map +1 -1
  37. package/dist/RouteBody.js.map +1 -1
  38. package/dist/RouteError.js.map +1 -1
  39. package/dist/RouteHook.d.ts.map +1 -1
  40. package/dist/RouteHook.js.map +1 -1
  41. package/dist/RouteHttp.d.ts +1 -1
  42. package/dist/RouteHttp.d.ts.map +1 -1
  43. package/dist/RouteHttp.js +38 -31
  44. package/dist/RouteHttp.js.map +1 -1
  45. package/dist/RouteHttpTracer.d.ts.map +1 -1
  46. package/dist/RouteHttpTracer.js.map +1 -1
  47. package/dist/RouteMount.d.ts +2 -2
  48. package/dist/RouteMount.d.ts.map +1 -1
  49. package/dist/RouteMount.js +1 -1
  50. package/dist/RouteMount.js.map +1 -1
  51. package/dist/RouteSchema.d.ts +2 -2
  52. package/dist/RouteSchema.d.ts.map +1 -1
  53. package/dist/RouteSchema.js +2 -2
  54. package/dist/RouteSchema.js.map +1 -1
  55. package/dist/RouteSse.d.ts +9 -10
  56. package/dist/RouteSse.d.ts.map +1 -1
  57. package/dist/RouteSse.js +8 -12
  58. package/dist/RouteSse.js.map +1 -1
  59. package/dist/RouteTree.d.ts +2 -2
  60. package/dist/RouteTree.d.ts.map +1 -1
  61. package/dist/RouteTree.js +2 -2
  62. package/dist/RouteTree.js.map +1 -1
  63. package/dist/RouteTrie.js +1 -1
  64. package/dist/RouteTrie.js.map +1 -1
  65. package/dist/Socket.d.ts +13 -18
  66. package/dist/Socket.d.ts.map +1 -1
  67. package/dist/Socket.js +12 -13
  68. package/dist/Socket.js.map +1 -1
  69. package/dist/Start.d.ts +15 -23
  70. package/dist/Start.d.ts.map +1 -1
  71. package/dist/Start.js +17 -6
  72. package/dist/Start.js.map +1 -1
  73. package/dist/System.d.ts +20 -5
  74. package/dist/System.d.ts.map +1 -1
  75. package/dist/System.js +12 -42
  76. package/dist/System.js.map +1 -1
  77. package/dist/Unique.d.ts.map +1 -1
  78. package/dist/Unique.js.map +1 -1
  79. package/dist/{ChildProcess.d.ts → _ChildProcess.d.ts} +14 -15
  80. package/dist/_ChildProcess.d.ts.map +1 -0
  81. package/dist/{ChildProcess.js → _ChildProcess.js} +2 -2
  82. package/dist/_ChildProcess.js.map +1 -0
  83. package/dist/{ContentNegotiation.d.ts → _ContentNegotiation.d.ts} +1 -1
  84. package/dist/_ContentNegotiation.d.ts.map +1 -0
  85. package/dist/{ContentNegotiation.js → _ContentNegotiation.js} +1 -1
  86. package/dist/_ContentNegotiation.js.map +1 -0
  87. package/dist/_Development.d.ts +27 -0
  88. package/dist/_Development.d.ts.map +1 -0
  89. package/dist/{Development.js → _Development.js} +6 -9
  90. package/dist/_Development.js.map +1 -0
  91. package/dist/{Docker.d.ts → _Docker.d.ts} +2 -2
  92. package/dist/_Docker.d.ts.map +1 -0
  93. package/dist/{Docker.js → _Docker.js} +1 -1
  94. package/dist/_Docker.js.map +1 -0
  95. package/dist/{Effectify.d.ts → _Effectify.d.ts} +1 -1
  96. package/dist/_Effectify.d.ts.map +1 -0
  97. package/dist/{Effectify.js → _Effectify.js} +1 -1
  98. package/dist/_Effectify.js.map +1 -0
  99. package/dist/{Http.d.ts → _Http.d.ts} +1 -8
  100. package/dist/_Http.d.ts.map +1 -0
  101. package/dist/{Http.js → _Http.js} +1 -17
  102. package/dist/_Http.js.map +1 -0
  103. package/dist/{PathPattern.d.ts → _PathPattern.d.ts} +12 -1
  104. package/dist/_PathPattern.d.ts.map +1 -0
  105. package/dist/{PathPattern.js → _PathPattern.js} +86 -1
  106. package/dist/_PathPattern.js.map +1 -0
  107. package/dist/_SchemaExtra.d.ts +4 -0
  108. package/dist/_SchemaExtra.d.ts.map +1 -0
  109. package/dist/{SchemaExtra.js → _SchemaExtra.js} +4 -4
  110. package/dist/_SchemaExtra.js.map +1 -0
  111. package/dist/{StartApp.d.ts → _StartApp.d.ts} +1 -1
  112. package/dist/_StartApp.d.ts.map +1 -0
  113. package/dist/{StartApp.js → _StartApp.js} +1 -1
  114. package/dist/_StartApp.js.map +1 -0
  115. package/dist/{StreamExtra.d.ts → _StreamExtra.d.ts} +5 -5
  116. package/dist/_StreamExtra.d.ts.map +1 -0
  117. package/dist/{StreamExtra.js → _StreamExtra.js} +1 -1
  118. package/dist/_StreamExtra.js.map +1 -0
  119. package/dist/{Values.d.ts → _Values.d.ts} +3 -3
  120. package/dist/_Values.d.ts.map +1 -0
  121. package/dist/{Values.js → _Values.js} +1 -1
  122. package/dist/_Values.js.map +1 -0
  123. package/dist/bun/BunBundle.d.ts +2 -2
  124. package/dist/bun/BunBundle.d.ts.map +1 -1
  125. package/dist/bun/BunBundle.js.map +1 -1
  126. package/dist/bun/BunChildProcessSpawner.d.ts +1 -1
  127. package/dist/bun/BunChildProcessSpawner.d.ts.map +1 -1
  128. package/dist/bun/BunChildProcessSpawner.js +9 -9
  129. package/dist/bun/BunChildProcessSpawner.js.map +1 -1
  130. package/dist/bun/BunImportTrackerPlugin.d.ts +2 -2
  131. package/dist/bun/BunImportTrackerPlugin.d.ts.map +1 -1
  132. package/dist/bun/BunImportTrackerPlugin.js.map +1 -1
  133. package/dist/bun/BunRoute.d.ts +1 -1
  134. package/dist/bun/BunRoute.d.ts.map +1 -1
  135. package/dist/bun/BunRoute.js +6 -7
  136. package/dist/bun/BunRoute.js.map +1 -1
  137. package/dist/bun/BunRuntime.js.map +1 -1
  138. package/dist/bun/BunServer.d.ts +5 -5
  139. package/dist/bun/BunServer.d.ts.map +1 -1
  140. package/dist/bun/BunServer.js +3 -3
  141. package/dist/bun/BunServer.js.map +1 -1
  142. package/dist/bun/BunVirtualFilesPlugin.js.map +1 -1
  143. package/dist/bun/_BunEnhancedResolve.d.ts.map +1 -1
  144. package/dist/bun/_BunEnhancedResolve.js.map +1 -1
  145. package/dist/bun/_empty.html +0 -0
  146. package/dist/bundler/Bundle.d.ts +2 -2
  147. package/dist/bundler/Bundle.d.ts.map +1 -1
  148. package/dist/bundler/Bundle.js.map +1 -1
  149. package/dist/bundler/BundleFiles.d.ts +1 -1
  150. package/dist/bundler/BundleFiles.d.ts.map +1 -1
  151. package/dist/bundler/BundleFiles.js.map +1 -1
  152. package/dist/bundler/BundleRoute.d.ts +6 -5
  153. package/dist/bundler/BundleRoute.d.ts.map +1 -1
  154. package/dist/bundler/BundleRoute.js +2 -2
  155. package/dist/bundler/BundleRoute.js.map +1 -1
  156. package/dist/cli/Argument.d.ts +26 -0
  157. package/dist/cli/Argument.d.ts.map +1 -0
  158. package/dist/cli/Argument.js +31 -0
  159. package/dist/cli/Argument.js.map +1 -0
  160. package/dist/cli/CliError.d.ts +15 -0
  161. package/dist/cli/CliError.d.ts.map +1 -0
  162. package/dist/cli/CliError.js +54 -0
  163. package/dist/cli/CliError.js.map +1 -0
  164. package/dist/cli/Command.d.ts +61 -0
  165. package/dist/cli/Command.d.ts.map +1 -0
  166. package/dist/cli/Command.js +453 -0
  167. package/dist/cli/Command.js.map +1 -0
  168. package/dist/cli/Flag.d.ts +32 -0
  169. package/dist/cli/Flag.d.ts.map +1 -0
  170. package/dist/cli/Flag.js +35 -0
  171. package/dist/cli/Flag.js.map +1 -0
  172. package/dist/cli/HelpDoc.d.ts +28 -0
  173. package/dist/cli/HelpDoc.d.ts.map +1 -0
  174. package/dist/cli/HelpDoc.js +40 -0
  175. package/dist/cli/HelpDoc.js.map +1 -0
  176. package/dist/cli/Param.d.ts +71 -0
  177. package/dist/cli/Param.d.ts.map +1 -0
  178. package/dist/cli/Param.js +236 -0
  179. package/dist/cli/Param.js.map +1 -0
  180. package/dist/cli/Primitive.d.ts +22 -0
  181. package/dist/cli/Primitive.d.ts.map +1 -0
  182. package/dist/cli/Primitive.js +73 -0
  183. package/dist/cli/Primitive.js.map +1 -0
  184. package/dist/cli/index.d.ts +8 -0
  185. package/dist/cli/index.d.ts.map +1 -0
  186. package/dist/cli/index.js +8 -0
  187. package/dist/cli/index.js.map +1 -0
  188. package/dist/client/Overlay.js.map +1 -1
  189. package/dist/client/ScrollState.js.map +1 -1
  190. package/dist/client/index.js.map +1 -1
  191. package/dist/datastar/actions/fetch.js.map +1 -1
  192. package/dist/datastar/actions/peek.js.map +1 -1
  193. package/dist/datastar/actions/setAll.js.map +1 -1
  194. package/dist/datastar/actions/toggleAll.js.map +1 -1
  195. package/dist/datastar/attributes/attr.js.map +1 -1
  196. package/dist/datastar/attributes/bind.js.map +1 -1
  197. package/dist/datastar/attributes/class.js.map +1 -1
  198. package/dist/datastar/attributes/computed.js.map +1 -1
  199. package/dist/datastar/attributes/indicator.js.map +1 -1
  200. package/dist/datastar/attributes/init.js.map +1 -1
  201. package/dist/datastar/attributes/jsonSignals.js.map +1 -1
  202. package/dist/datastar/attributes/on.js.map +1 -1
  203. package/dist/datastar/attributes/onIntersect.js.map +1 -1
  204. package/dist/datastar/attributes/onInterval.js.map +1 -1
  205. package/dist/datastar/attributes/onSignalPatch.js.map +1 -1
  206. package/dist/datastar/attributes/ref.js.map +1 -1
  207. package/dist/datastar/attributes/show.js.map +1 -1
  208. package/dist/datastar/attributes/signals.js.map +1 -1
  209. package/dist/datastar/attributes/style.js.map +1 -1
  210. package/dist/datastar/attributes/text.js.map +1 -1
  211. package/dist/datastar/engine.d.ts +5 -5
  212. package/dist/datastar/engine.d.ts.map +1 -1
  213. package/dist/datastar/engine.js.map +1 -1
  214. package/dist/datastar/utils.d.ts +1 -1
  215. package/dist/datastar/utils.d.ts.map +1 -1
  216. package/dist/datastar/utils.js.map +1 -1
  217. package/dist/datastar/watchers/patchElements.js +3 -1
  218. package/dist/datastar/watchers/patchElements.js.map +1 -1
  219. package/dist/datastar/watchers/patchSignals.js.map +1 -1
  220. package/dist/experimental/EncryptedCookies.d.ts +4 -4
  221. package/dist/experimental/EncryptedCookies.d.ts.map +1 -1
  222. package/dist/experimental/EncryptedCookies.js.map +1 -1
  223. package/dist/hyper/Hyper.js.map +1 -1
  224. package/dist/hyper/HyperHtml.js.map +1 -1
  225. package/dist/hyper/HyperHtml.test.js.map +1 -1
  226. package/dist/hyper/HyperNode.d.ts +1 -2
  227. package/dist/hyper/HyperNode.d.ts.map +1 -1
  228. package/dist/hyper/HyperNode.js +1 -1
  229. package/dist/hyper/HyperNode.js.map +1 -1
  230. package/dist/hyper/HyperRoute.js.map +1 -1
  231. package/dist/hyper/HyperRoute.test.js +11 -13
  232. package/dist/hyper/HyperRoute.test.js.map +1 -1
  233. package/dist/hyper/html.d.ts +5 -4
  234. package/dist/hyper/html.d.ts.map +1 -1
  235. package/dist/hyper/html.js.map +1 -1
  236. package/dist/hyper/jsx-runtime.js.map +1 -1
  237. package/dist/index.d.ts +1 -1
  238. package/dist/index.d.ts.map +1 -1
  239. package/dist/index.js +1 -1
  240. package/dist/index.js.map +1 -1
  241. package/dist/lint/plugin.d.ts +18 -15
  242. package/dist/lint/plugin.d.ts.map +1 -1
  243. package/dist/lint/plugin.js +76 -80
  244. package/dist/lint/plugin.js.map +1 -1
  245. package/dist/node/NodeFileSystem.d.ts +3 -3
  246. package/dist/node/NodeFileSystem.d.ts.map +1 -1
  247. package/dist/node/NodeFileSystem.js +8 -7
  248. package/dist/node/NodeFileSystem.js.map +1 -1
  249. package/dist/node/NodeUtils.d.ts.map +1 -1
  250. package/dist/node/NodeUtils.js.map +1 -1
  251. package/dist/sql/SqlCache.d.ts +1 -0
  252. package/dist/sql/SqlCache.d.ts.map +1 -1
  253. package/dist/sql/SqlCache.js +5 -1
  254. package/dist/sql/SqlCache.js.map +1 -1
  255. package/dist/sql/SqlClient.js +1 -1
  256. package/dist/sql/SqlClient.js.map +1 -1
  257. package/dist/{SqlIntrospect.d.ts → sql/SqlIntrospect.d.ts} +3 -3
  258. package/dist/sql/SqlIntrospect.d.ts.map +1 -0
  259. package/dist/{SqlIntrospect.js → sql/SqlIntrospect.js} +1 -1
  260. package/dist/sql/SqlIntrospect.js.map +1 -0
  261. package/dist/sql/bun/index.d.ts +3 -3
  262. package/dist/sql/bun/index.d.ts.map +1 -1
  263. package/dist/sql/bun/index.js +1 -1
  264. package/dist/sql/bun/index.js.map +1 -1
  265. package/dist/sql/index.d.ts +1 -0
  266. package/dist/sql/index.d.ts.map +1 -1
  267. package/dist/sql/index.js +1 -0
  268. package/dist/sql/index.js.map +1 -1
  269. package/dist/sql/libsql/index.d.ts +1 -1
  270. package/dist/sql/libsql/index.d.ts.map +1 -1
  271. package/dist/sql/libsql/index.js +2 -2
  272. package/dist/sql/libsql/index.js.map +1 -1
  273. package/dist/sql/mssql/index.d.ts +3 -3
  274. package/dist/sql/mssql/index.d.ts.map +1 -1
  275. package/dist/sql/mssql/index.js +1 -1
  276. package/dist/sql/mssql/index.js.map +1 -1
  277. package/dist/sql/postgres/index.d.ts +1 -1
  278. package/dist/sql/postgres/index.d.ts.map +1 -1
  279. package/dist/sql/postgres/index.js.map +1 -1
  280. package/dist/studio/Simulation.d.ts.map +1 -0
  281. package/dist/studio/Simulation.js.map +1 -0
  282. package/dist/{tower/Tower.d.ts → studio/Studio.d.ts} +4 -4
  283. package/dist/studio/Studio.d.ts.map +1 -0
  284. package/dist/studio/Studio.js +30 -0
  285. package/dist/studio/Studio.js.map +1 -0
  286. package/dist/studio/StudioErrors.d.ts +4 -0
  287. package/dist/studio/StudioErrors.d.ts.map +1 -0
  288. package/dist/{tower/TowerErrors.js → studio/StudioErrors.js} +6 -6
  289. package/dist/studio/StudioErrors.js.map +1 -0
  290. package/dist/{tower/TowerLogger.d.ts → studio/StudioLogger.d.ts} +1 -1
  291. package/dist/studio/StudioLogger.d.ts.map +1 -0
  292. package/dist/{tower/TowerLogger.js → studio/StudioLogger.js} +7 -7
  293. package/dist/studio/StudioLogger.js.map +1 -0
  294. package/dist/studio/StudioMetrics.d.ts +4 -0
  295. package/dist/studio/StudioMetrics.d.ts.map +1 -0
  296. package/dist/{tower/TowerMetrics.js → studio/StudioMetrics.js} +3 -3
  297. package/dist/studio/StudioMetrics.js.map +1 -0
  298. package/dist/studio/StudioProcess.d.ts +4 -0
  299. package/dist/studio/StudioProcess.d.ts.map +1 -0
  300. package/dist/{tower/TowerProcess.js → studio/StudioProcess.js} +3 -3
  301. package/dist/studio/StudioProcess.js.map +1 -0
  302. package/dist/{tower/TowerStore.d.ts → studio/StudioStore.d.ts} +33 -33
  303. package/dist/studio/StudioStore.d.ts.map +1 -0
  304. package/dist/{tower/TowerStore.js → studio/StudioStore.js} +5 -5
  305. package/dist/studio/StudioStore.js.map +1 -0
  306. package/dist/studio/StudioTracer.d.ts +4 -0
  307. package/dist/studio/StudioTracer.d.ts.map +1 -0
  308. package/dist/{tower/TowerTracer.js → studio/StudioTracer.js} +21 -21
  309. package/dist/studio/StudioTracer.js.map +1 -0
  310. package/dist/studio/index.d.ts +4 -0
  311. package/dist/studio/index.d.ts.map +1 -0
  312. package/dist/studio/index.js +4 -0
  313. package/dist/studio/index.js.map +1 -0
  314. package/dist/{tower → studio}/routes/errors/route.d.ts +1 -1
  315. package/dist/{tower/routes/metrics → studio/routes/errors}/route.d.ts.map +1 -1
  316. package/dist/{tower → studio}/routes/errors/route.js +5 -9
  317. package/dist/studio/routes/errors/route.js.map +1 -0
  318. package/dist/{tower → studio}/routes/fiberDetail.d.ts +1 -1
  319. package/dist/studio/routes/fiberDetail.d.ts.map +1 -0
  320. package/dist/{tower → studio}/routes/fiberDetail.js +7 -7
  321. package/dist/studio/routes/fiberDetail.js.map +1 -0
  322. package/dist/{tower/routes/traces → studio/routes/fibers}/route.d.ts +1 -1
  323. package/dist/studio/routes/fibers/route.d.ts.map +1 -0
  324. package/dist/studio/routes/fibers/route.js +25 -0
  325. package/dist/studio/routes/fibers/route.js.map +1 -0
  326. package/dist/studio/routes/layout.d.ts.map +1 -0
  327. package/{src/tower → dist/studio}/routes/layout.html +1 -1
  328. package/dist/studio/routes/layout.js.map +1 -0
  329. package/dist/{tower → studio}/routes/logs/route.d.ts +1 -1
  330. package/dist/studio/routes/logs/route.d.ts.map +1 -0
  331. package/dist/studio/routes/logs/route.js +30 -0
  332. package/dist/studio/routes/logs/route.js.map +1 -0
  333. package/dist/{tower → studio}/routes/metrics/route.d.ts +1 -1
  334. package/dist/studio/routes/metrics/route.d.ts.map +1 -0
  335. package/dist/{tower → studio}/routes/metrics/route.js +3 -5
  336. package/dist/studio/routes/metrics/route.js.map +1 -0
  337. package/dist/{tower → studio}/routes/route.d.ts +1 -1
  338. package/dist/studio/routes/route.d.ts.map +1 -0
  339. package/dist/studio/routes/route.js +6 -0
  340. package/dist/studio/routes/route.js.map +1 -0
  341. package/dist/{tower → studio}/routes/routes/route.d.ts +1 -1
  342. package/dist/studio/routes/routes/route.d.ts.map +1 -0
  343. package/dist/{tower → studio}/routes/routes/route.js +2 -4
  344. package/dist/studio/routes/routes/route.js.map +1 -0
  345. package/dist/{tower → studio}/routes/services/route.d.ts +1 -1
  346. package/dist/studio/routes/services/route.d.ts.map +1 -0
  347. package/dist/studio/routes/services/route.js +13 -0
  348. package/dist/studio/routes/services/route.js.map +1 -0
  349. package/dist/{tower → studio}/routes/system/route.d.ts +1 -1
  350. package/dist/studio/routes/system/route.d.ts.map +1 -0
  351. package/dist/studio/routes/system/route.js +19 -0
  352. package/dist/studio/routes/system/route.js.map +1 -0
  353. package/dist/{tower → studio}/routes/traceDetail.d.ts +1 -1
  354. package/dist/studio/routes/traceDetail.d.ts.map +1 -0
  355. package/dist/{tower → studio}/routes/traceDetail.js +4 -4
  356. package/dist/studio/routes/traceDetail.js.map +1 -0
  357. package/dist/{tower/routes/fibers → studio/routes/traces}/route.d.ts +1 -1
  358. package/dist/studio/routes/traces/route.d.ts.map +1 -0
  359. package/dist/studio/routes/traces/route.js +30 -0
  360. package/dist/studio/routes/traces/route.js.map +1 -0
  361. package/dist/{tower → studio}/routes/tree.d.ts +46 -46
  362. package/dist/studio/routes/tree.d.ts.map +1 -0
  363. package/dist/studio/routes/tree.js.map +1 -0
  364. package/dist/studio/ui/Errors.d.ts +5 -0
  365. package/dist/studio/ui/Errors.d.ts.map +1 -0
  366. package/dist/studio/ui/Errors.js +17 -0
  367. package/dist/studio/ui/Errors.js.map +1 -0
  368. package/dist/{tower → studio}/ui/Fibers.d.ts +5 -5
  369. package/dist/studio/ui/Fibers.d.ts.map +1 -0
  370. package/dist/studio/ui/Fibers.js +134 -0
  371. package/dist/studio/ui/Fibers.js.map +1 -0
  372. package/dist/studio/ui/Logs.d.ts +5 -0
  373. package/dist/studio/ui/Logs.d.ts.map +1 -0
  374. package/dist/{tower → studio}/ui/Logs.js +2 -3
  375. package/dist/studio/ui/Logs.js.map +1 -0
  376. package/dist/studio/ui/Metrics.d.ts +5 -0
  377. package/dist/studio/ui/Metrics.d.ts.map +1 -0
  378. package/dist/{tower → studio}/ui/Metrics.js +4 -11
  379. package/dist/studio/ui/Metrics.js.map +1 -0
  380. package/dist/studio/ui/Routes.d.ts.map +1 -0
  381. package/dist/{tower → studio}/ui/Routes.js +4 -12
  382. package/dist/studio/ui/Routes.js.map +1 -0
  383. package/dist/studio/ui/Services.d.ts.map +1 -0
  384. package/dist/{tower → studio}/ui/Services.js +2 -9
  385. package/dist/studio/ui/Services.js.map +1 -0
  386. package/dist/studio/ui/Shell.d.ts.map +1 -0
  387. package/dist/studio/ui/Shell.js +8 -0
  388. package/dist/studio/ui/Shell.js.map +1 -0
  389. package/dist/studio/ui/System.d.ts +5 -0
  390. package/dist/studio/ui/System.d.ts.map +1 -0
  391. package/dist/studio/ui/System.js +36 -0
  392. package/dist/studio/ui/System.js.map +1 -0
  393. package/dist/studio/ui/Traces.d.ts +13 -0
  394. package/dist/studio/ui/Traces.d.ts.map +1 -0
  395. package/dist/studio/ui/Traces.js +182 -0
  396. package/dist/studio/ui/Traces.js.map +1 -0
  397. package/dist/testing/TestLogger.js.map +1 -1
  398. package/dist/testing/utils.d.ts +3 -1
  399. package/dist/testing/utils.d.ts.map +1 -1
  400. package/dist/testing/utils.js +39 -0
  401. package/dist/testing/utils.js.map +1 -1
  402. package/dist/x/cloudflare/CloudflareTunnel.d.ts +8 -7
  403. package/dist/x/cloudflare/CloudflareTunnel.d.ts.map +1 -1
  404. package/dist/x/cloudflare/CloudflareTunnel.js.map +1 -1
  405. package/dist/x/tailscale/TailscaleTunnel.d.ts +9 -9
  406. package/dist/x/tailscale/TailscaleTunnel.d.ts.map +1 -1
  407. package/dist/x/tailscale/TailscaleTunnel.js +3 -4
  408. package/dist/x/tailscale/TailscaleTunnel.js.map +1 -1
  409. package/dist/x/tailwind/TailwindPlugin.d.ts +5 -5
  410. package/dist/x/tailwind/TailwindPlugin.d.ts.map +1 -1
  411. package/dist/x/tailwind/TailwindPlugin.js.map +1 -1
  412. package/dist/x/tailwind/compile.js.map +1 -1
  413. package/dist/x/tailwind/plugin.js.map +1 -1
  414. package/package.json +42 -60
  415. package/src/Cookies.ts +4 -8
  416. package/src/Entity.ts +24 -19
  417. package/src/Fetch.ts +128 -5
  418. package/src/FileRouter.ts +46 -49
  419. package/src/FileRouterCodegen.ts +9 -23
  420. package/src/FileSystem.ts +43 -63
  421. package/src/GlobalLayer.ts +1 -1
  422. package/src/Route.ts +2 -2
  423. package/src/RouteBody.ts +1 -1
  424. package/src/RouteHttp.ts +133 -113
  425. package/src/RouteMount.ts +3 -3
  426. package/src/RouteSchema.ts +2 -2
  427. package/src/RouteSse.ts +28 -37
  428. package/src/RouteTree.ts +2 -2
  429. package/src/RouteTrie.ts +1 -1
  430. package/src/Socket.ts +17 -27
  431. package/src/Start.ts +39 -47
  432. package/src/System.ts +40 -64
  433. package/src/{ChildProcess.ts → _ChildProcess.ts} +13 -22
  434. package/src/{Development.ts → _Development.ts} +16 -21
  435. package/src/{Docker.ts → _Docker.ts} +1 -1
  436. package/src/{Http.ts → _Http.ts} +0 -28
  437. package/src/{PathPattern.ts → _PathPattern.ts} +105 -0
  438. package/src/{SchemaExtra.ts → _SchemaExtra.ts} +3 -4
  439. package/src/bun/BunChildProcessSpawner.ts +9 -9
  440. package/src/bun/BunRoute.ts +5 -8
  441. package/src/bun/BunServer.ts +3 -3
  442. package/src/bundler/BundleRoute.ts +2 -2
  443. package/src/cli/Argument.ts +45 -0
  444. package/src/cli/CliError.ts +68 -0
  445. package/src/cli/Command.ts +685 -0
  446. package/src/cli/Flag.ts +63 -0
  447. package/src/cli/HelpDoc.ts +67 -0
  448. package/src/cli/Param.ts +418 -0
  449. package/src/cli/Primitive.ts +94 -0
  450. package/src/cli/index.ts +7 -0
  451. package/src/datastar/watchers/patchElements.ts +4 -2
  452. package/src/hyper/HyperHtml.test.tsx +395 -0
  453. package/src/hyper/HyperNode.ts +1 -2
  454. package/src/hyper/HyperRoute.test.tsx +166 -0
  455. package/src/hyper/HyperRoute.ts +1 -1
  456. package/src/index.ts +1 -1
  457. package/src/lint/plugin.js +86 -97
  458. package/src/node/NodeFileSystem.ts +15 -14
  459. package/src/sql/SqlCache.ts +14 -1
  460. package/src/sql/SqlClient.ts +1 -1
  461. package/src/{SqlIntrospect.ts → sql/SqlIntrospect.ts} +1 -1
  462. package/src/sql/bun/index.ts +1 -1
  463. package/src/sql/index.ts +1 -0
  464. package/src/sql/libsql/index.ts +1 -1
  465. package/src/sql/mssql/index.ts +1 -1
  466. package/src/studio/Studio.ts +47 -0
  467. package/src/{tower/TowerErrors.ts → studio/StudioErrors.ts} +13 -13
  468. package/src/{tower/TowerLogger.ts → studio/StudioLogger.ts} +10 -10
  469. package/src/{tower/TowerMetrics.ts → studio/StudioMetrics.ts} +5 -5
  470. package/src/{tower/TowerProcess.ts → studio/StudioProcess.ts} +4 -4
  471. package/src/{tower/TowerStore.ts → studio/StudioStore.ts} +37 -37
  472. package/src/{tower/TowerTracer.ts → studio/StudioTracer.ts} +25 -25
  473. package/src/studio/index.ts +3 -0
  474. package/src/{tower → studio}/routes/errors/route.tsx +4 -4
  475. package/src/{tower → studio}/routes/fiberDetail.tsx +8 -8
  476. package/src/{tower → studio}/routes/fibers/route.tsx +10 -10
  477. package/src/studio/routes/layout.html +340 -0
  478. package/src/{tower → studio}/routes/logs/route.tsx +4 -4
  479. package/src/{tower → studio}/routes/metrics/route.tsx +5 -5
  480. package/src/studio/routes/route.tsx +8 -0
  481. package/src/{tower → studio}/routes/routes/route.tsx +2 -2
  482. package/src/{tower → studio}/routes/services/route.tsx +2 -2
  483. package/src/{tower → studio}/routes/system/route.tsx +5 -5
  484. package/src/{tower → studio}/routes/traceDetail.tsx +5 -5
  485. package/src/{tower → studio}/routes/traces/route.tsx +5 -5
  486. package/src/{tower → studio}/ui/Errors.tsx +3 -3
  487. package/src/{tower → studio}/ui/Fibers.tsx +7 -7
  488. package/src/{tower → studio}/ui/Logs.tsx +3 -3
  489. package/src/{tower → studio}/ui/Metrics.tsx +4 -4
  490. package/src/{tower → studio}/ui/Shell.tsx +1 -1
  491. package/src/{tower → studio}/ui/System.tsx +2 -2
  492. package/src/{tower → studio}/ui/Traces.tsx +16 -16
  493. package/src/testing/utils.ts +59 -0
  494. package/src/x/tailscale/TailscaleTunnel.ts +3 -4
  495. package/dist/ChildProcess.d.ts.map +0 -1
  496. package/dist/ChildProcess.js.map +0 -1
  497. package/dist/Commander.d.ts +0 -101
  498. package/dist/Commander.d.ts.map +0 -1
  499. package/dist/Commander.js +0 -327
  500. package/dist/Commander.js.map +0 -1
  501. package/dist/ContentNegotiation.d.ts.map +0 -1
  502. package/dist/ContentNegotiation.js.map +0 -1
  503. package/dist/Development.d.ts +0 -42
  504. package/dist/Development.d.ts.map +0 -1
  505. package/dist/Development.js.map +0 -1
  506. package/dist/Docker.d.ts.map +0 -1
  507. package/dist/Docker.js.map +0 -1
  508. package/dist/Effectify.d.ts.map +0 -1
  509. package/dist/Effectify.js.map +0 -1
  510. package/dist/FilePathPattern.d.ts +0 -30
  511. package/dist/FilePathPattern.d.ts.map +0 -1
  512. package/dist/FilePathPattern.js +0 -87
  513. package/dist/FilePathPattern.js.map +0 -1
  514. package/dist/Http.d.ts.map +0 -1
  515. package/dist/Http.js.map +0 -1
  516. package/dist/PathPattern.d.ts.map +0 -1
  517. package/dist/PathPattern.js.map +0 -1
  518. package/dist/PlatformError.d.ts +0 -39
  519. package/dist/PlatformError.d.ts.map +0 -1
  520. package/dist/PlatformError.js +0 -26
  521. package/dist/PlatformError.js.map +0 -1
  522. package/dist/SchemaExtra.d.ts +0 -8
  523. package/dist/SchemaExtra.d.ts.map +0 -1
  524. package/dist/SchemaExtra.js.map +0 -1
  525. package/dist/SqlIntrospect.d.ts.map +0 -1
  526. package/dist/SqlIntrospect.js.map +0 -1
  527. package/dist/StartApp.d.ts.map +0 -1
  528. package/dist/StartApp.js.map +0 -1
  529. package/dist/StreamExtra.d.ts.map +0 -1
  530. package/dist/StreamExtra.js.map +0 -1
  531. package/dist/TuplePathPattern.d.ts +0 -10
  532. package/dist/TuplePathPattern.d.ts.map +0 -1
  533. package/dist/TuplePathPattern.js +0 -69
  534. package/dist/TuplePathPattern.js.map +0 -1
  535. package/dist/Values.d.ts.map +0 -1
  536. package/dist/Values.js.map +0 -1
  537. package/dist/tower/Simulation.d.ts.map +0 -1
  538. package/dist/tower/Simulation.js.map +0 -1
  539. package/dist/tower/Tower.d.ts.map +0 -1
  540. package/dist/tower/Tower.js +0 -30
  541. package/dist/tower/Tower.js.map +0 -1
  542. package/dist/tower/TowerErrors.d.ts +0 -4
  543. package/dist/tower/TowerErrors.d.ts.map +0 -1
  544. package/dist/tower/TowerErrors.js.map +0 -1
  545. package/dist/tower/TowerLogger.d.ts.map +0 -1
  546. package/dist/tower/TowerLogger.js.map +0 -1
  547. package/dist/tower/TowerMetrics.d.ts +0 -4
  548. package/dist/tower/TowerMetrics.d.ts.map +0 -1
  549. package/dist/tower/TowerMetrics.js.map +0 -1
  550. package/dist/tower/TowerProcess.d.ts +0 -4
  551. package/dist/tower/TowerProcess.d.ts.map +0 -1
  552. package/dist/tower/TowerProcess.js.map +0 -1
  553. package/dist/tower/TowerStore.d.ts.map +0 -1
  554. package/dist/tower/TowerStore.js.map +0 -1
  555. package/dist/tower/TowerTracer.d.ts +0 -4
  556. package/dist/tower/TowerTracer.d.ts.map +0 -1
  557. package/dist/tower/TowerTracer.js.map +0 -1
  558. package/dist/tower/index.d.ts +0 -4
  559. package/dist/tower/index.d.ts.map +0 -1
  560. package/dist/tower/index.js +0 -4
  561. package/dist/tower/index.js.map +0 -1
  562. package/dist/tower/routes/errors/route.d.ts.map +0 -1
  563. package/dist/tower/routes/errors/route.js.map +0 -1
  564. package/dist/tower/routes/fiberDetail.d.ts.map +0 -1
  565. package/dist/tower/routes/fiberDetail.js.map +0 -1
  566. package/dist/tower/routes/fibers/route.d.ts.map +0 -1
  567. package/dist/tower/routes/fibers/route.js +0 -27
  568. package/dist/tower/routes/fibers/route.js.map +0 -1
  569. package/dist/tower/routes/layout.d.ts.map +0 -1
  570. package/dist/tower/routes/layout.js.map +0 -1
  571. package/dist/tower/routes/logs/route.d.ts.map +0 -1
  572. package/dist/tower/routes/logs/route.js +0 -36
  573. package/dist/tower/routes/logs/route.js.map +0 -1
  574. package/dist/tower/routes/metrics/route.js.map +0 -1
  575. package/dist/tower/routes/route.d.ts.map +0 -1
  576. package/dist/tower/routes/route.js +0 -6
  577. package/dist/tower/routes/route.js.map +0 -1
  578. package/dist/tower/routes/routes/route.d.ts.map +0 -1
  579. package/dist/tower/routes/routes/route.js.map +0 -1
  580. package/dist/tower/routes/services/route.d.ts.map +0 -1
  581. package/dist/tower/routes/services/route.js +0 -15
  582. package/dist/tower/routes/services/route.js.map +0 -1
  583. package/dist/tower/routes/system/route.d.ts.map +0 -1
  584. package/dist/tower/routes/system/route.js +0 -21
  585. package/dist/tower/routes/system/route.js.map +0 -1
  586. package/dist/tower/routes/traceDetail.d.ts.map +0 -1
  587. package/dist/tower/routes/traceDetail.js.map +0 -1
  588. package/dist/tower/routes/traces/route.d.ts.map +0 -1
  589. package/dist/tower/routes/traces/route.js +0 -36
  590. package/dist/tower/routes/traces/route.js.map +0 -1
  591. package/dist/tower/routes/tree.d.ts.map +0 -1
  592. package/dist/tower/routes/tree.js.map +0 -1
  593. package/dist/tower/ui/Errors.d.ts +0 -5
  594. package/dist/tower/ui/Errors.d.ts.map +0 -1
  595. package/dist/tower/ui/Errors.js +0 -30
  596. package/dist/tower/ui/Errors.js.map +0 -1
  597. package/dist/tower/ui/Fibers.d.ts.map +0 -1
  598. package/dist/tower/ui/Fibers.js +0 -157
  599. package/dist/tower/ui/Fibers.js.map +0 -1
  600. package/dist/tower/ui/Logs.d.ts +0 -5
  601. package/dist/tower/ui/Logs.d.ts.map +0 -1
  602. package/dist/tower/ui/Logs.js.map +0 -1
  603. package/dist/tower/ui/Metrics.d.ts +0 -5
  604. package/dist/tower/ui/Metrics.d.ts.map +0 -1
  605. package/dist/tower/ui/Metrics.js.map +0 -1
  606. package/dist/tower/ui/Routes.d.ts.map +0 -1
  607. package/dist/tower/ui/Routes.js.map +0 -1
  608. package/dist/tower/ui/Services.d.ts.map +0 -1
  609. package/dist/tower/ui/Services.js.map +0 -1
  610. package/dist/tower/ui/Shell.d.ts.map +0 -1
  611. package/dist/tower/ui/Shell.js +0 -12
  612. package/dist/tower/ui/Shell.js.map +0 -1
  613. package/dist/tower/ui/System.d.ts +0 -5
  614. package/dist/tower/ui/System.d.ts.map +0 -1
  615. package/dist/tower/ui/System.js +0 -65
  616. package/dist/tower/ui/System.js.map +0 -1
  617. package/dist/tower/ui/Traces.d.ts +0 -13
  618. package/dist/tower/ui/Traces.d.ts.map +0 -1
  619. package/dist/tower/ui/Traces.js +0 -219
  620. package/dist/tower/ui/Traces.js.map +0 -1
  621. package/src/Commander.ts +0 -585
  622. package/src/FilePathPattern.ts +0 -115
  623. package/src/PlatformError.ts +0 -73
  624. package/src/TuplePathPattern.ts +0 -75
  625. package/src/tower/Tower.ts +0 -47
  626. package/src/tower/index.ts +0 -3
  627. package/src/tower/routes/route.tsx +0 -8
  628. /package/dist/{tower → studio}/Simulation.d.ts +0 -0
  629. /package/dist/{tower → studio}/Simulation.js +0 -0
  630. /package/dist/{tower → studio}/routes/layout.d.ts +0 -0
  631. /package/dist/{tower → studio}/routes/layout.js +0 -0
  632. /package/dist/{tower → studio}/routes/tree.js +0 -0
  633. /package/dist/{tower → studio}/ui/Routes.d.ts +0 -0
  634. /package/dist/{tower → studio}/ui/Services.d.ts +0 -0
  635. /package/dist/{tower → studio}/ui/Shell.d.ts +0 -0
  636. /package/src/{ContentNegotiation.ts → _ContentNegotiation.ts} +0 -0
  637. /package/src/{Effectify.ts → _Effectify.ts} +0 -0
  638. /package/src/{StartApp.ts → _StartApp.ts} +0 -0
  639. /package/src/{StreamExtra.ts → _StreamExtra.ts} +0 -0
  640. /package/src/{Values.ts → _Values.ts} +0 -0
  641. /package/src/{tower → studio}/Simulation.ts +0 -0
  642. /package/src/{tower → studio}/routes/layout.tsx +0 -0
  643. /package/src/{tower → studio}/routes/tree.ts +0 -0
  644. /package/src/{tower → studio}/ui/Routes.tsx +0 -0
  645. /package/src/{tower → studio}/ui/Services.tsx +0 -0
@@ -0,0 +1,395 @@
1
+ /** @jsxImportSource effect-start */
2
+ import * as test from "bun:test"
3
+ import * as HyperHtml from "./HyperHtml.ts"
4
+ import * as HyperNode from "./HyperNode.ts"
5
+
6
+ test.it("boolean true attributes render without value (React-like)", () => {
7
+ const node = HyperNode.make("div", {
8
+ hidden: true,
9
+ disabled: true,
10
+ "data-active": true,
11
+ })
12
+
13
+ const html = HyperHtml.renderToString(node)
14
+
15
+ test.expect(html).toBe("<div hidden disabled data-active></div>")
16
+ })
17
+
18
+ test.it("boolean false attributes are omitted", () => {
19
+ const node = HyperNode.make("div", {
20
+ hidden: false,
21
+ disabled: false,
22
+ "data-active": false,
23
+ })
24
+
25
+ const html = HyperHtml.renderToString(node)
26
+
27
+ test.expect(html).toBe("<div></div>")
28
+ })
29
+
30
+ test.it("string attributes render with values", () => {
31
+ const node = HyperNode.make("div", {
32
+ id: "test",
33
+ class: "my-class",
34
+ "data-value": "hello",
35
+ })
36
+
37
+ const html = HyperHtml.renderToString(node)
38
+
39
+ test.expect(html).toBe('<div id="test" class="my-class" data-value="hello"></div>')
40
+ })
41
+
42
+ test.it("number attributes render with values", () => {
43
+ const node = HyperNode.make("input", {
44
+ type: "number",
45
+ min: 0,
46
+ max: 100,
47
+ value: 50,
48
+ })
49
+
50
+ const html = HyperHtml.renderToString(node)
51
+
52
+ test.expect(html).toBe('<input type="number" min="0" max="100" value="50">')
53
+ })
54
+
55
+ test.it("null and undefined attributes are omitted", () => {
56
+ const node = HyperNode.make("div", {
57
+ id: null,
58
+ class: undefined,
59
+ "data-test": "value",
60
+ })
61
+
62
+ const html = HyperHtml.renderToString(node)
63
+
64
+ test.expect(html).toBe('<div data-test="value"></div>')
65
+ })
66
+
67
+ test.it("mixed boolean and string attributes", () => {
68
+ const node = HyperNode.make("input", {
69
+ type: "checkbox",
70
+ checked: true,
71
+ disabled: false,
72
+ name: "test",
73
+ value: "on",
74
+ })
75
+
76
+ const html = HyperHtml.renderToString(node)
77
+
78
+ test.expect(html).toBe('<input type="checkbox" checked name="test" value="on">')
79
+ })
80
+
81
+ test.it("data-* attributes with object values use single-quoted JSON", () => {
82
+ const node = HyperNode.make("div", {
83
+ "data-signals": {
84
+ draft: "",
85
+ pendingDraft: "",
86
+ username: "User123",
87
+ },
88
+ })
89
+
90
+ const html = HyperHtml.renderToString(node)
91
+
92
+ test
93
+ .expect(html)
94
+ .toBe(`<div data-signals='{"draft":"","pendingDraft":"","username":"User123"}'></div>`)
95
+ })
96
+
97
+ test.it("data-* attributes with array values use single-quoted JSON", () => {
98
+ const node = HyperNode.make("div", {
99
+ "data-items": [1, 2, 3],
100
+ })
101
+
102
+ const html = HyperHtml.renderToString(node)
103
+
104
+ test.expect(html).toBe("<div data-items='[1,2,3]'></div>")
105
+ })
106
+
107
+ test.it("data-* attributes with nested object values use single-quoted JSON", () => {
108
+ const node = HyperNode.make("div", {
109
+ "data-config": {
110
+ user: { name: "John", active: true },
111
+ settings: { theme: "dark" },
112
+ },
113
+ })
114
+
115
+ const html = HyperHtml.renderToString(node)
116
+
117
+ test
118
+ .expect(html)
119
+ .toBe(
120
+ `<div data-config='{"user":{"name":"John","active":true},"settings":{"theme":"dark"}}'></div>`,
121
+ )
122
+ })
123
+
124
+ test.it("data-* object values with single quotes in values are escaped", () => {
125
+ const node = HyperNode.make("div", {
126
+ "data-signals": {
127
+ message: "it's a test",
128
+ name: "O'Brien",
129
+ },
130
+ })
131
+
132
+ const html = HyperHtml.renderToString(node)
133
+
134
+ test
135
+ .expect(html)
136
+ .toBe(`<div data-signals='{"message":"it&#39;s a test","name":"O&#39;Brien"}'></div>`)
137
+ })
138
+
139
+ test.it("data-* string values are not JSON stringified", () => {
140
+ const node = HyperNode.make("div", {
141
+ "data-value": "hello world",
142
+ })
143
+
144
+ const html = HyperHtml.renderToString(node)
145
+
146
+ test.expect(html).toBe('<div data-value="hello world"></div>')
147
+ })
148
+
149
+ test.it("non-data attributes with object values are not JSON stringified", () => {
150
+ const node = HyperNode.make("div", {
151
+ style: "color: red",
152
+ })
153
+
154
+ const html = HyperHtml.renderToString(node)
155
+
156
+ test.expect(html).toBe('<div style="color: red"></div>')
157
+ })
158
+
159
+ test.it("script with function child renders as IIFE", () => {
160
+ const handler = (window: Window) => {
161
+ console.log("Hello from", window.document.title)
162
+ }
163
+
164
+ const node = HyperNode.make("script", {
165
+ children: handler,
166
+ })
167
+
168
+ const html = HyperHtml.renderToString(node)
169
+
170
+ test.expect(html).toBe(`<script>(${handler.toString()})(window)</script>`)
171
+ })
172
+
173
+ test.describe("raw text escaping", () => {
174
+ test.it("script children escapes closing tag", () => {
175
+ const html = HyperHtml.renderToString(<script>{'console.log("</script>")'}</script>)
176
+
177
+ test.expect(html).toBe('<script>console.log("<\\/script>")</script>')
178
+ test.expect(html).not.toContain("</script><")
179
+ })
180
+
181
+ test.it("style children escapes closing tag", () => {
182
+ const html = HyperHtml.renderToString(<style>{'div::after { content: "</style>" }'}</style>)
183
+
184
+ test.expect(html).toBe('<style>div::after { content: "<\\/style>" }</style>')
185
+ test.expect(html).not.toContain("</style><")
186
+ })
187
+
188
+ test.it("script dangerouslySetInnerHTML escapes closing tag", () => {
189
+ const node = HyperNode.make("script", {
190
+ dangerouslySetInnerHTML: { __html: 'console.log("</script>")' },
191
+ })
192
+
193
+ const html = HyperHtml.renderToString(node)
194
+
195
+ test.expect(html).toBe('<script>console.log("<\\/script>")</script>')
196
+ })
197
+
198
+ test.it("case-insensitive closing tags are escaped", () => {
199
+ const html = HyperHtml.renderToString(<script>{'x = "</Script></SCRIPT></sCrIpT>"'}</script>)
200
+
201
+ test.expect(html).toBe('<script>x = "<\\/Script><\\/SCRIPT><\\/sCrIpT>"</script>')
202
+ })
203
+
204
+ test.it("closing tag with whitespace is escaped", () => {
205
+ const html = HyperHtml.renderToString(<script>{'x = "</script >"'}</script>)
206
+
207
+ test.expect(html).toBe('<script>x = "<\\/script >"</script>')
208
+ })
209
+
210
+ test.it("XSS via script injection in script children", () => {
211
+ const userInput = '</script><script>alert("xss")</script>'
212
+ const html = HyperHtml.renderToString(<script>{`var data = "${userInput}"`}</script>)
213
+
214
+ test.expect(html).not.toMatch(/<\/script.*<script/i)
215
+ })
216
+
217
+ test.it("XSS via script injection in style children", () => {
218
+ const userInput = '</style><script>alert("xss")</script>'
219
+ const html = HyperHtml.renderToString(<style>{`div::after { content: "${userInput}" }`}</style>)
220
+
221
+ test.expect(html).not.toMatch(/<\/style.*<script/i)
222
+ })
223
+
224
+ test.it("XSS via script injection in dangerouslySetInnerHTML", () => {
225
+ const userInput = '</script><script>alert("xss")</script>'
226
+ const node = HyperNode.make("script", {
227
+ dangerouslySetInnerHTML: { __html: `var data = "${userInput}"` },
228
+ })
229
+
230
+ const html = HyperHtml.renderToString(node)
231
+
232
+ test.expect(html).not.toMatch(/<\/script.*<script/i)
233
+ })
234
+
235
+ test.it("XSS via dangerouslySetInnerHTML", () => {
236
+ const userInput = '</script><script>alert("xss")</script>'
237
+ const node = HyperNode.make("script", {
238
+ dangerouslySetInnerHTML: { __html: `var data = "${userInput}"` },
239
+ })
240
+
241
+ const html = HyperHtml.renderToString(node)
242
+
243
+ test.expect(html).not.toMatch(/<\/script.*<script/i)
244
+ })
245
+
246
+ test.it("function child with closing tag in string literal", () => {
247
+ const html = HyperHtml.renderToString(
248
+ <script>
249
+ {(window: Window) => {
250
+ const x = "</script><script>alert(1)</script>"
251
+ window.document.title = x
252
+ }}
253
+ </script>,
254
+ )
255
+
256
+ test.expect(html).not.toMatch(/<\/script.*<script/i)
257
+ })
258
+
259
+ test.it("multiple closing tags in one string", () => {
260
+ const html = HyperHtml.renderToString(<script>{'a = "</script>"; b = "</script>"'}</script>)
261
+
262
+ test.expect(html).toBe('<script>a = "<\\/script>"; b = "<\\/script>"</script>')
263
+ })
264
+
265
+ test.it("partial closing tag sequences are escaped", () => {
266
+ const html = HyperHtml.renderToString(<script>{'x = "</" + "script>"'}</script>)
267
+
268
+ test.expect(html).toBe('<script>x = "<\\/" + "script>"</script>')
269
+ })
270
+
271
+ test.it("style dangerouslySetInnerHTML escapes closing tag", () => {
272
+ const node = HyperNode.make("style", {
273
+ dangerouslySetInnerHTML: { __html: 'div::after { content: "</style>" }' },
274
+ })
275
+
276
+ const html = HyperHtml.renderToString(node)
277
+
278
+ test.expect(html).not.toMatch(/<\/style.*</)
279
+ })
280
+
281
+ test.it("escaped output is still valid JS", () => {
282
+ const html = HyperHtml.renderToString(<script>{'var x = "</script>"'}</script>)
283
+
284
+ const content = html.replace("<script>", "").replace("</script>", "")
285
+ const fn = new Function(content)
286
+ fn()
287
+ })
288
+ })
289
+
290
+ test.it("script with arrow function child renders as IIFE", () => {
291
+ const node = HyperNode.make("script", {
292
+ children: (window: Window) => {
293
+ window.alert("test")
294
+ },
295
+ })
296
+
297
+ const html = HyperHtml.renderToString(node)
298
+
299
+ test.expect(html).toContain("<script>(")
300
+ test.expect(html).toContain(")(window)</script>")
301
+ test.expect(html).toContain("window.alert")
302
+ })
303
+
304
+ test.it("script with string child renders without escaping", () => {
305
+ const node = HyperNode.make("script", {
306
+ children: "console.log('hello')",
307
+ })
308
+
309
+ const html = HyperHtml.renderToString(node)
310
+
311
+ test.expect(html).toBe("<script>console.log('hello')</script>")
312
+ })
313
+
314
+ test.it("script with string child preserves ampersands and quotes", () => {
315
+ const node = HyperNode.make("script", {
316
+ children: 'if (a && b) { console.log("yes") }',
317
+ })
318
+
319
+ const html = HyperHtml.renderToString(node)
320
+
321
+ test.expect(html).toBe('<script>if (a && b) { console.log("yes") }</script>')
322
+ })
323
+
324
+ test.it("style tag content is not escaped", () => {
325
+ const node = HyperNode.make("style", {
326
+ children: ".foo > .bar { content: '&'; }",
327
+ })
328
+
329
+ const html = HyperHtml.renderToString(node)
330
+
331
+ test.expect(html).toBe("<style>.foo > .bar { content: '&'; }</style>")
332
+ })
333
+
334
+ test.it("script with attributes and no children", () => {
335
+ const node = HyperNode.make("script", {
336
+ type: "module",
337
+ src: "https://example.com/app.js",
338
+ })
339
+
340
+ const html = HyperHtml.renderToString(node)
341
+
342
+ test.expect(html).toBe('<script type="module" src="https://example.com/app.js"></script>')
343
+ })
344
+
345
+ test.it("normal tag string content is escaped", () => {
346
+ const node = HyperNode.make("div", {
347
+ children: "a && b",
348
+ })
349
+
350
+ const html = HyperHtml.renderToString(node)
351
+
352
+ test.expect(html).toBe("<div>a &amp;&amp; b</div>")
353
+ })
354
+
355
+ test.it("data-* function values are serialized with toString", () => {
356
+ const node = HyperNode.make("div", {
357
+ "data-on-click": () => console.log("clicked"),
358
+ })
359
+
360
+ const html = HyperHtml.renderToString(node)
361
+
362
+ test.expect(html).toContain("data-on-click=")
363
+ test.expect(html).toContain("console.log")
364
+ })
365
+
366
+ test.it("data-* object values don't render as [object Object]", () => {
367
+ const html = HyperHtml.renderToString(
368
+ <div data-signals={{ isOpen: false, count: 42 }}>content</div>,
369
+ )
370
+
371
+ test.expect(html).toBe(`<div data-signals='{"isOpen":false,"count":42}'>content</div>`)
372
+ test.expect(html).not.toContain("[object Object]")
373
+ })
374
+
375
+ test.it("dangerouslySetInnerHTML injects html without escaping", () => {
376
+ const html = HyperHtml.renderToString(
377
+ <div dangerouslySetInnerHTML={{ __html: '<span class="bold">hello & world</span>' }} />,
378
+ )
379
+
380
+ test.expect(html).toBe('<div><span class="bold">hello & world</span></div>')
381
+ })
382
+
383
+ test.it("JSX component with data-* object values", () => {
384
+ function TestComponent() {
385
+ return (
386
+ <div data-signals={{ isOpen: false }}>
387
+ <span>nested</span>
388
+ </div>
389
+ )
390
+ }
391
+
392
+ const html = HyperHtml.renderToString(<TestComponent />)
393
+
394
+ test.expect(html).toBe(`<div data-signals='{"isOpen":false}'><span>nested</span></div>`)
395
+ })
@@ -1,5 +1,4 @@
1
- export const TypeId = Symbol.for("effect-start/HyperNode")
2
- export type TypeId = typeof TypeId
1
+ export const TypeId = "~effect-start/HyperNode" as const
3
2
 
4
3
  const NoChildren: ReadonlyArray<never> = Object.freeze([])
5
4
 
@@ -0,0 +1,166 @@
1
+ /** @jsxImportSource effect-start */
2
+ import * as test from "bun:test"
3
+ import type * as Engine from "../datastar/engine.ts"
4
+ import * as Effect from "effect/Effect"
5
+ import * as Entity from "../Entity.ts"
6
+ import * as Fetch from "../Fetch.ts"
7
+ import * as Route from "../Route.ts"
8
+ import * as RouteHttp from "../RouteHttp.ts"
9
+ import * as HyperRoute from "./HyperRoute.ts"
10
+
11
+ test.describe("HyperRoute.html", () => {
12
+ test.it("renders JSX to HTML string", async () => {
13
+ const handler = RouteHttp.toWebHandler(Route.get(HyperRoute.html(<div>Hello World</div>)))
14
+
15
+ const response = await Fetch.fromHandler(handler, { path: "/" })
16
+
17
+ test.expect(response.status).toBe(200)
18
+ test.expect(response.headers.get("Content-Type")).toBe("text/html; charset=utf-8")
19
+ test.expect(await response.text()).toBe("<div>Hello World</div>")
20
+ })
21
+
22
+ test.it("renders nested JSX elements", async () => {
23
+ const handler = RouteHttp.toWebHandler(
24
+ Route.get(
25
+ HyperRoute.html(
26
+ <div class="container">
27
+ <h1>Title</h1>
28
+ <p>Paragraph</p>
29
+ </div>,
30
+ ),
31
+ ),
32
+ )
33
+
34
+ const response = await Fetch.fromHandler(handler, { path: "/" })
35
+
36
+ test
37
+ .expect(await response.text())
38
+ .toBe('<div class="container"><h1>Title</h1><p>Paragraph</p></div>')
39
+ })
40
+
41
+ test.it("renders JSX from Effect", async () => {
42
+ const handler = RouteHttp.toWebHandler(
43
+ Route.get(HyperRoute.html(Effect.succeed(<span>From Effect</span>))),
44
+ )
45
+
46
+ const response = await Fetch.fromHandler(handler, { path: "/" })
47
+
48
+ test.expect(await response.text()).toBe("<span>From Effect</span>")
49
+ })
50
+
51
+ test.it("renders JSX from generator function", async () => {
52
+ const handler = RouteHttp.toWebHandler(
53
+ Route.get(
54
+ HyperRoute.html(
55
+ Effect.gen(function* () {
56
+ const name = yield* Effect.succeed("World")
57
+ return <div>Hello {name}</div>
58
+ }),
59
+ ),
60
+ ),
61
+ )
62
+
63
+ const response = await Fetch.fromHandler(handler, { path: "/" })
64
+
65
+ test.expect(await response.text()).toBe("<div>Hello World</div>")
66
+ })
67
+
68
+ test.it("renders JSX from handler function", async () => {
69
+ const handler = RouteHttp.toWebHandler(
70
+ Route.get(HyperRoute.html((context) => Effect.succeed(<div>Request received</div>))),
71
+ )
72
+
73
+ const response = await Fetch.fromHandler(handler, { path: "/" })
74
+
75
+ test.expect(await response.text()).toBe("<div>Request received</div>")
76
+ })
77
+
78
+ test.it("renders JSX with dynamic content", async () => {
79
+ const items = ["Apple", "Banana", "Cherry"]
80
+
81
+ const handler = RouteHttp.toWebHandler(
82
+ Route.get(
83
+ HyperRoute.html(
84
+ <ul>
85
+ {items.map((item) => (
86
+ <li>{item}</li>
87
+ ))}
88
+ </ul>,
89
+ ),
90
+ ),
91
+ )
92
+
93
+ const response = await Fetch.fromHandler(handler, { path: "/" })
94
+
95
+ test.expect(await response.text()).toBe("<ul><li>Apple</li><li>Banana</li><li>Cherry</li></ul>")
96
+ })
97
+
98
+ test.it("handles Entity with JSX body", async () => {
99
+ const handler = RouteHttp.toWebHandler(
100
+ Route.get(HyperRoute.html(Entity.make(<div>With Entity</div>, { status: 201 }))),
101
+ )
102
+
103
+ const response = await Fetch.fromHandler(handler, { path: "/" })
104
+
105
+ test.expect(response.status).toBe(201)
106
+ test.expect(await response.text()).toBe("<div>With Entity</div>")
107
+ })
108
+
109
+ test.it("renders data-* attributes with object values as JSON", async () => {
110
+ const handler = RouteHttp.toWebHandler(
111
+ Route.get(
112
+ HyperRoute.html(
113
+ <div
114
+ data-signals={{
115
+ draft: "",
116
+ pendingDraft: "",
117
+ username: "User123",
118
+ }}
119
+ >
120
+ Content
121
+ </div>,
122
+ ),
123
+ ),
124
+ )
125
+
126
+ const response = await Fetch.fromHandler(handler, { path: "/" })
127
+
128
+ test
129
+ .expect(await response.text())
130
+ .toBe(`<div data-signals='{"draft":"","pendingDraft":"","username":"User123"}'>Content</div>`)
131
+ })
132
+
133
+ test.it("data-on-click function argument is typed as DataEvent", () => {
134
+ const node = (
135
+ <button
136
+ data-on:click={(e) => {
137
+ test.expectTypeOf(e).toMatchTypeOf<Engine.DataEvent>()
138
+ test.expectTypeOf(e.window).toMatchTypeOf<Window & typeof globalThis>()
139
+ }}
140
+ />
141
+ )
142
+
143
+ test.expect(node).toBeDefined()
144
+ })
145
+
146
+ test.it("renders script with function child as IIFE", async () => {
147
+ const handler = RouteHttp.toWebHandler(
148
+ Route.get(
149
+ HyperRoute.html(
150
+ <script>
151
+ {(window) => {
152
+ console.log("Hello from", window.document.title)
153
+ }}
154
+ </script>,
155
+ ),
156
+ ),
157
+ )
158
+
159
+ const response = await Fetch.fromHandler(handler, { path: "/" })
160
+ const text = await response.text()
161
+
162
+ test.expect(text).toContain("<script>(")
163
+ test.expect(text).toContain(")(window)</script>")
164
+ test.expect(text).toContain("window.document.title")
165
+ })
166
+ })
@@ -2,7 +2,7 @@ import * as Effect from "effect/Effect"
2
2
  import * as Entity from "../Entity.ts"
3
3
  import * as Route from "../Route.ts"
4
4
  import type * as RouteBody from "../RouteBody.ts"
5
- import type * as Values from "../Values.ts"
5
+ import type * as Values from "../_Values.ts"
6
6
  import * as HyperHtml from "./HyperHtml.ts"
7
7
  import type { JSX } from "./jsx.d.ts"
8
8
 
package/src/index.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export * as Bundle from "./bundler/Bundle.ts"
2
- export * as Development from "./Development.ts"
2
+ export * as Development from "./_Development.ts"
3
3
  export * as Entity from "./Entity.ts"
4
4
  export * as FileRouter from "./FileRouter.ts"
5
5
  export * as Route from "./Route.ts"