effect-start 0.23.1 → 0.25.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 (355) hide show
  1. package/dist/ChildProcess.js +32 -20
  2. package/dist/Commander.js +377 -293
  3. package/dist/ContentNegotiation.js +424 -318
  4. package/dist/Cookies.js +340 -271
  5. package/dist/Development.js +85 -49
  6. package/dist/Effectify.js +22 -14
  7. package/dist/Entity.js +260 -195
  8. package/dist/Fetch.js +192 -0
  9. package/dist/FilePathPattern.js +88 -77
  10. package/dist/FileRouter.js +192 -136
  11. package/dist/FileRouterCodegen.js +262 -191
  12. package/dist/FileSystem.js +126 -64
  13. package/dist/Http.js +96 -77
  14. package/dist/PathPattern.js +311 -273
  15. package/dist/PlatformError.js +36 -21
  16. package/dist/PlatformRuntime.js +65 -40
  17. package/dist/Route.js +122 -79
  18. package/dist/RouteBody.js +83 -58
  19. package/dist/RouteError.js +46 -25
  20. package/dist/RouteHook.js +58 -34
  21. package/dist/RouteHttp.js +346 -237
  22. package/dist/RouteHttpTracer.js +86 -58
  23. package/dist/RouteMount.js +81 -58
  24. package/dist/RouteSchema.js +253 -170
  25. package/dist/RouteSse.js +87 -72
  26. package/dist/RouteTree.js +99 -73
  27. package/dist/RouteTrie.js +160 -133
  28. package/dist/SchemaExtra.js +87 -62
  29. package/dist/Socket.js +32 -21
  30. package/dist/SqlIntrospect.js +317 -268
  31. package/dist/Start.js +55 -25
  32. package/dist/StartApp.js +3 -21
  33. package/dist/StreamExtra.js +109 -74
  34. package/dist/System.js +37 -21
  35. package/dist/TuplePathPattern.js +64 -58
  36. package/dist/Unique.js +159 -120
  37. package/dist/Values.js +48 -32
  38. package/dist/bun/BunBundle.js +158 -109
  39. package/dist/bun/BunChildProcessSpawner.js +121 -82
  40. package/dist/bun/BunImportTrackerPlugin.js +85 -63
  41. package/dist/bun/BunRoute.js +135 -99
  42. package/dist/bun/BunRuntime.js +39 -29
  43. package/dist/bun/BunServer.js +268 -140
  44. package/dist/bun/BunVirtualFilesPlugin.js +47 -33
  45. package/dist/bun/_BunEnhancedResolve.js +107 -82
  46. package/dist/bun/index.js +5 -5
  47. package/dist/bundler/Bundle.js +82 -38
  48. package/dist/bundler/BundleFiles.js +140 -82
  49. package/dist/bundler/BundleRoute.js +49 -38
  50. package/dist/client/Overlay.js +29 -28
  51. package/dist/client/ScrollState.js +94 -82
  52. package/dist/client/index.js +79 -61
  53. package/dist/console/Console.js +40 -24
  54. package/dist/console/ConsoleErrors.js +189 -178
  55. package/dist/console/ConsoleLogger.js +52 -43
  56. package/dist/console/ConsoleMetrics.js +69 -58
  57. package/dist/console/ConsoleProcess.js +57 -47
  58. package/dist/console/ConsoleStore.js +56 -45
  59. package/dist/console/ConsoleTracer.js +101 -88
  60. package/dist/console/Simulation.js +714 -563
  61. package/dist/console/index.js +3 -3
  62. package/dist/console/routes/tree.js +29 -28
  63. package/dist/datastar/actions/fetch.js +514 -381
  64. package/dist/datastar/actions/peek.js +12 -12
  65. package/dist/datastar/actions/setAll.js +18 -11
  66. package/dist/datastar/actions/toggleAll.js +18 -11
  67. package/dist/datastar/attributes/attr.js +48 -47
  68. package/dist/datastar/attributes/bind.js +186 -167
  69. package/dist/datastar/attributes/class.js +51 -44
  70. package/dist/datastar/attributes/computed.js +23 -24
  71. package/dist/datastar/attributes/effect.js +9 -8
  72. package/dist/datastar/attributes/indicator.js +32 -29
  73. package/dist/datastar/attributes/init.js +26 -25
  74. package/dist/datastar/attributes/jsonSignals.js +32 -29
  75. package/dist/datastar/attributes/on.js +76 -73
  76. package/dist/datastar/attributes/onIntersect.js +51 -51
  77. package/dist/datastar/attributes/onInterval.js +30 -29
  78. package/dist/datastar/attributes/onSignalPatch.js +49 -40
  79. package/dist/datastar/attributes/ref.js +10 -9
  80. package/dist/datastar/attributes/show.js +31 -30
  81. package/dist/datastar/attributes/signals.js +17 -16
  82. package/dist/datastar/attributes/style.js +56 -49
  83. package/dist/datastar/attributes/text.js +28 -25
  84. package/dist/datastar/engine.js +1079 -933
  85. package/dist/datastar/index.js +25 -24
  86. package/dist/datastar/utils.js +203 -155
  87. package/dist/datastar/watchers/patchElements.js +459 -372
  88. package/dist/datastar/watchers/patchSignals.js +13 -13
  89. package/dist/experimental/EncryptedCookies.js +305 -189
  90. package/dist/experimental/index.js +1 -1
  91. package/dist/hyper/Hyper.js +22 -17
  92. package/dist/hyper/HyperHtml.js +138 -123
  93. package/dist/hyper/HyperNode.js +11 -9
  94. package/dist/hyper/HyperRoute.js +41 -28
  95. package/dist/hyper/html.js +27 -27
  96. package/dist/hyper/index.js +5 -5
  97. package/dist/hyper/jsx-runtime.js +11 -5
  98. package/dist/index.js +8 -8
  99. package/dist/node/NodeFileSystem.js +606 -341
  100. package/dist/node/NodeUtils.js +21 -18
  101. package/dist/sql/Sql.js +8 -0
  102. package/dist/sql/bun/index.js +134 -67
  103. package/dist/sql/index.js +1 -0
  104. package/dist/sql/libsql/index.js +156 -0
  105. package/dist/sql/mssql/docker.js +103 -60
  106. package/dist/sql/mssql/index.js +182 -101
  107. package/dist/testing/TestLogger.js +39 -29
  108. package/dist/testing/index.js +2 -2
  109. package/dist/testing/utils.js +45 -23
  110. package/dist/x/cloudflare/CloudflareTunnel.js +61 -28
  111. package/dist/x/cloudflare/index.js +1 -1
  112. package/dist/x/tailscale/TailscaleTunnel.js +86 -60
  113. package/dist/x/tailscale/index.js +1 -1
  114. package/dist/x/tailwind/TailwindPlugin.js +280 -205
  115. package/dist/x/tailwind/compile.js +185 -129
  116. package/dist/x/tailwind/plugin.js +13 -11
  117. package/package.json +1 -1
  118. package/src/Development.ts +3 -1
  119. package/src/Entity.ts +17 -0
  120. package/src/Fetch.ts +271 -0
  121. package/src/SqlIntrospect.ts +64 -70
  122. package/src/Start.ts +21 -24
  123. package/src/StartApp.ts +1 -1
  124. package/src/bun/BunServer.ts +42 -10
  125. package/src/hyper/HyperHtml.ts +0 -1
  126. package/src/sql/bun/index.ts +1 -1
  127. package/src/sql/index.ts +1 -0
  128. package/src/sql/libsql/index.ts +173 -0
  129. package/src/sql/libsql/libsql.d.ts +39 -0
  130. package/src/sql/mssql/index.ts +1 -1
  131. package/dist/BlobStore.d.ts +0 -80
  132. package/dist/BlobStore.js +0 -19
  133. package/dist/ChildProcess.d.ts +0 -60
  134. package/dist/Commander.d.ts +0 -100
  135. package/dist/ContentNegotiation.d.ts +0 -12
  136. package/dist/Cookies.d.ts +0 -47
  137. package/dist/Development.d.ts +0 -39
  138. package/dist/Effectify.d.ts +0 -209
  139. package/dist/Entity.d.ts +0 -47
  140. package/dist/FilePathPattern.d.ts +0 -29
  141. package/dist/FileRouter.d.ts +0 -56
  142. package/dist/FileRouterCodegen.d.ts +0 -18
  143. package/dist/FileRouterPattern.d.ts +0 -9
  144. package/dist/FileRouterPattern.js +0 -35
  145. package/dist/FileSystem.d.ts +0 -158
  146. package/dist/Http.d.ts +0 -37
  147. package/dist/HttpAppExtra.d.ts +0 -7
  148. package/dist/HttpAppExtra.js +0 -320
  149. package/dist/HttpUtils.d.ts +0 -3
  150. package/dist/HttpUtils.js +0 -11
  151. package/dist/PathPattern.d.ts +0 -134
  152. package/dist/PlatformError.d.ts +0 -38
  153. package/dist/PlatformRuntime.d.ts +0 -27
  154. package/dist/Route.d.ts +0 -97
  155. package/dist/RouteBody.d.ts +0 -47
  156. package/dist/RouteError.d.ts +0 -98
  157. package/dist/RouteHook.d.ts +0 -12
  158. package/dist/RouteHttp.d.ts +0 -21
  159. package/dist/RouteHttpTracer.d.ts +0 -10
  160. package/dist/RouteMount.d.ts +0 -86
  161. package/dist/RouteSchema.d.ts +0 -86
  162. package/dist/RouteSse.d.ts +0 -21
  163. package/dist/RouteTree.d.ts +0 -57
  164. package/dist/RouteTrie.d.ts +0 -20
  165. package/dist/RouterPattern.d.ts +0 -118
  166. package/dist/RouterPattern.js +0 -269
  167. package/dist/SchemaExtra.d.ts +0 -7
  168. package/dist/Socket.d.ts +0 -27
  169. package/dist/Sql.d.ts +0 -34
  170. package/dist/Sql.js +0 -5
  171. package/dist/SqlIntrospect.d.ts +0 -91
  172. package/dist/Start.d.ts +0 -44
  173. package/dist/StartApp.d.ts +0 -19
  174. package/dist/StreamExtra.d.ts +0 -28
  175. package/dist/System.d.ts +0 -7
  176. package/dist/TuplePathPattern.d.ts +0 -9
  177. package/dist/Unique.d.ts +0 -50
  178. package/dist/Values.d.ts +0 -27
  179. package/dist/bun/BunBlobStoreDisk.d.ts +0 -6
  180. package/dist/bun/BunBlobStoreDisk.js +0 -116
  181. package/dist/bun/BunBlobStoreS3.d.ts +0 -11
  182. package/dist/bun/BunBlobStoreS3.js +0 -89
  183. package/dist/bun/BunBlobWatcherDisk.d.ts +0 -6
  184. package/dist/bun/BunBlobWatcherDisk.js +0 -60
  185. package/dist/bun/BunBlobWatcherQueue.d.ts +0 -6
  186. package/dist/bun/BunBlobWatcherQueue.js +0 -17
  187. package/dist/bun/BunBundle.d.ts +0 -11
  188. package/dist/bun/BunChildProcessSpawner.d.ts +0 -3
  189. package/dist/bun/BunHttpServer.d.ts +0 -44
  190. package/dist/bun/BunHttpServer.js +0 -186
  191. package/dist/bun/BunHttpServer_web.d.ts +0 -60
  192. package/dist/bun/BunHttpServer_web.js +0 -252
  193. package/dist/bun/BunImportTrackerPlugin.d.ts +0 -13
  194. package/dist/bun/BunPlatformHttpServer.d.ts +0 -10
  195. package/dist/bun/BunPlatformHttpServer.js +0 -53
  196. package/dist/bun/BunRoute.d.ts +0 -48
  197. package/dist/bun/BunRuntime.d.ts +0 -2
  198. package/dist/bun/BunServer.d.ts +0 -40
  199. package/dist/bun/BunServerRequest.d.ts +0 -60
  200. package/dist/bun/BunServerRequest.js +0 -252
  201. package/dist/bun/BunSql.d.ts +0 -4
  202. package/dist/bun/BunSql.js +0 -81
  203. package/dist/bun/BunVirtualFilesPlugin.d.ts +0 -4
  204. package/dist/bun/_BunEnhancedResolve.d.ts +0 -45
  205. package/dist/bun/index.d.ts +0 -5
  206. package/dist/bundler/Bundle.d.ts +0 -61
  207. package/dist/bundler/BundleFiles.d.ts +0 -13
  208. package/dist/bundler/BundleHttp.d.ts +0 -45
  209. package/dist/bundler/BundleHttp.js +0 -176
  210. package/dist/bundler/BundleRoute.d.ts +0 -27
  211. package/dist/client/Overlay.d.ts +0 -2
  212. package/dist/client/ScrollState.d.ts +0 -6
  213. package/dist/client/index.d.ts +0 -6
  214. package/dist/console/Console.d.ts +0 -6
  215. package/dist/console/ConsoleErrors.d.ts +0 -3
  216. package/dist/console/ConsoleLogger.d.ts +0 -3
  217. package/dist/console/ConsoleMetrics.d.ts +0 -3
  218. package/dist/console/ConsoleProcess.d.ts +0 -3
  219. package/dist/console/ConsoleStore.d.ts +0 -144
  220. package/dist/console/ConsoleTracer.d.ts +0 -3
  221. package/dist/console/Simulation.d.ts +0 -2
  222. package/dist/console/index.d.ts +0 -3
  223. package/dist/console/routes/errors/route.d.ts +0 -10
  224. package/dist/console/routes/errors/route.js +0 -47
  225. package/dist/console/routes/fiberDetail.d.ts +0 -16
  226. package/dist/console/routes/fiberDetail.js +0 -38
  227. package/dist/console/routes/fibers/route.d.ts +0 -10
  228. package/dist/console/routes/fibers/route.js +0 -19
  229. package/dist/console/routes/git/route.d.ts +0 -11
  230. package/dist/console/routes/git/route.js +0 -33
  231. package/dist/console/routes/layout.d.ts +0 -9
  232. package/dist/console/routes/layout.js +0 -3
  233. package/dist/console/routes/logs/route.d.ts +0 -10
  234. package/dist/console/routes/logs/route.js +0 -32
  235. package/dist/console/routes/metrics/route.d.ts +0 -10
  236. package/dist/console/routes/metrics/route.js +0 -17
  237. package/dist/console/routes/route.d.ts +0 -6
  238. package/dist/console/routes/route.js +0 -5
  239. package/dist/console/routes/routes/route.d.ts +0 -6
  240. package/dist/console/routes/routes/route.js +0 -20
  241. package/dist/console/routes/services/route.d.ts +0 -6
  242. package/dist/console/routes/services/route.js +0 -12
  243. package/dist/console/routes/system/route.d.ts +0 -10
  244. package/dist/console/routes/system/route.js +0 -18
  245. package/dist/console/routes/traceDetail.d.ts +0 -16
  246. package/dist/console/routes/traceDetail.js +0 -14
  247. package/dist/console/routes/traces/route.d.ts +0 -10
  248. package/dist/console/routes/traces/route.js +0 -39
  249. package/dist/console/routes/tree.d.ts +0 -153
  250. package/dist/console/ui/Errors.d.ts +0 -4
  251. package/dist/console/ui/Errors.js +0 -15
  252. package/dist/console/ui/Fibers.d.ts +0 -24
  253. package/dist/console/ui/Fibers.js +0 -121
  254. package/dist/console/ui/Git.d.ts +0 -20
  255. package/dist/console/ui/Git.js +0 -95
  256. package/dist/console/ui/Logs.d.ts +0 -4
  257. package/dist/console/ui/Logs.js +0 -25
  258. package/dist/console/ui/Metrics.d.ts +0 -4
  259. package/dist/console/ui/Metrics.js +0 -26
  260. package/dist/console/ui/Routes.d.ts +0 -8
  261. package/dist/console/ui/Routes.js +0 -70
  262. package/dist/console/ui/Services.d.ts +0 -10
  263. package/dist/console/ui/Services.js +0 -246
  264. package/dist/console/ui/Shell.d.ts +0 -10
  265. package/dist/console/ui/Shell.js +0 -7
  266. package/dist/console/ui/System.d.ts +0 -4
  267. package/dist/console/ui/System.js +0 -35
  268. package/dist/console/ui/Traces.d.ts +0 -12
  269. package/dist/console/ui/Traces.js +0 -179
  270. package/dist/datastar/actions/fetch.d.ts +0 -30
  271. package/dist/datastar/actions/peek.d.ts +0 -1
  272. package/dist/datastar/actions/setAll.d.ts +0 -1
  273. package/dist/datastar/actions/toggleAll.d.ts +0 -1
  274. package/dist/datastar/attributes/attr.d.ts +0 -1
  275. package/dist/datastar/attributes/bind.d.ts +0 -1
  276. package/dist/datastar/attributes/class.d.ts +0 -1
  277. package/dist/datastar/attributes/computed.d.ts +0 -1
  278. package/dist/datastar/attributes/effect.d.ts +0 -1
  279. package/dist/datastar/attributes/indicator.d.ts +0 -1
  280. package/dist/datastar/attributes/init.d.ts +0 -1
  281. package/dist/datastar/attributes/jsonSignals.d.ts +0 -1
  282. package/dist/datastar/attributes/on.d.ts +0 -1
  283. package/dist/datastar/attributes/onIntersect.d.ts +0 -1
  284. package/dist/datastar/attributes/onInterval.d.ts +0 -1
  285. package/dist/datastar/attributes/onSignalPatch.d.ts +0 -1
  286. package/dist/datastar/attributes/ref.d.ts +0 -1
  287. package/dist/datastar/attributes/show.d.ts +0 -1
  288. package/dist/datastar/attributes/signals.d.ts +0 -1
  289. package/dist/datastar/attributes/style.d.ts +0 -1
  290. package/dist/datastar/attributes/text.d.ts +0 -1
  291. package/dist/datastar/engine.d.ts +0 -162
  292. package/dist/datastar/happydom.d.ts +0 -1
  293. package/dist/datastar/happydom.js +0 -8
  294. package/dist/datastar/index.d.ts +0 -24
  295. package/dist/datastar/load.d.ts +0 -24
  296. package/dist/datastar/load.js +0 -24
  297. package/dist/datastar/utils.d.ts +0 -51
  298. package/dist/datastar/watchers/patchElements.d.ts +0 -1
  299. package/dist/datastar/watchers/patchSignals.d.ts +0 -1
  300. package/dist/experimental/EncryptedCookies.d.ts +0 -48
  301. package/dist/experimental/SseHttpResponse.d.ts +0 -7
  302. package/dist/experimental/SseHttpResponse.js +0 -28
  303. package/dist/experimental/index.d.ts +0 -1
  304. package/dist/hyper/Hyper.d.ts +0 -25
  305. package/dist/hyper/HyperHtml.d.ts +0 -23
  306. package/dist/hyper/HyperHtml.test.d.ts +0 -1
  307. package/dist/hyper/HyperHtml.test.js +0 -197
  308. package/dist/hyper/HyperNode.d.ts +0 -14
  309. package/dist/hyper/HyperRoute.d.ts +0 -8
  310. package/dist/hyper/HyperRoute.test.d.ts +0 -1
  311. package/dist/hyper/HyperRoute.test.js +0 -83
  312. package/dist/hyper/html.d.ts +0 -11
  313. package/dist/hyper/index.d.ts +0 -6
  314. package/dist/hyper/jsx-runtime.d.ts +0 -7
  315. package/dist/index.d.ts +0 -8
  316. package/dist/inference_check.d.ts +0 -1
  317. package/dist/inference_check.js +0 -15
  318. package/dist/lint/plugin.d.ts +0 -86
  319. package/dist/lint/plugin.js +0 -341
  320. package/dist/middlewares/BasicAuthMiddleware.d.ts +0 -8
  321. package/dist/middlewares/BasicAuthMiddleware.js +0 -22
  322. package/dist/middlewares/index.d.ts +0 -1
  323. package/dist/middlewares/index.js +0 -1
  324. package/dist/node/Effectify.d.ts +0 -209
  325. package/dist/node/Effectify.js +0 -19
  326. package/dist/node/FileSystem.d.ts +0 -7
  327. package/dist/node/FileSystem.js +0 -420
  328. package/dist/node/NodeFileSystem.d.ts +0 -7
  329. package/dist/node/NodeUtils.d.ts +0 -2
  330. package/dist/node/PlatformError.d.ts +0 -46
  331. package/dist/node/PlatformError.js +0 -43
  332. package/dist/node/Utils.d.ts +0 -1
  333. package/dist/node/Utils.js +0 -19
  334. package/dist/repro_fail.d.ts +0 -1
  335. package/dist/repro_fail.js +0 -14
  336. package/dist/sql/bun/index.d.ts +0 -3
  337. package/dist/sql/mssql/docker.d.ts +0 -2
  338. package/dist/sql/mssql/index.d.ts +0 -21
  339. package/dist/testing/TestHttpClient.d.ts +0 -13
  340. package/dist/testing/TestHttpClient.js +0 -68
  341. package/dist/testing/TestLogger.d.ts +0 -13
  342. package/dist/testing/index.d.ts +0 -2
  343. package/dist/testing/utils.d.ts +0 -9
  344. package/dist/x/cloudflare/CloudflareTunnel.d.ts +0 -10
  345. package/dist/x/cloudflare/index.d.ts +0 -1
  346. package/dist/x/datastar/Datastar.d.ts +0 -6
  347. package/dist/x/datastar/Datastar.js +0 -47
  348. package/dist/x/datastar/index.d.ts +0 -1
  349. package/dist/x/datastar/index.js +0 -1
  350. package/dist/x/tailscale/TailscaleTunnel.d.ts +0 -15
  351. package/dist/x/tailscale/index.d.ts +0 -1
  352. package/dist/x/tailwind/TailwindPlugin.d.ts +0 -23
  353. package/dist/x/tailwind/compile.d.ts +0 -19
  354. package/dist/x/tailwind/plugin.d.ts +0 -2
  355. /package/src/{Sql.ts → sql/Sql.ts} +0 -0
@@ -1,13 +1,13 @@
1
- import { action, startPeeking, stopPeeking } from "../engine.js";
1
+ import { action, startPeeking, stopPeeking } from "../engine.js"
2
+
2
3
  action({
3
- name: "peek",
4
- apply(_, fn) {
5
- startPeeking();
6
- try {
7
- return fn();
8
- }
9
- finally {
10
- stopPeeking();
11
- }
12
- },
13
- });
4
+ name: "peek",
5
+ apply(_, fn) {
6
+ startPeeking()
7
+ try {
8
+ return fn()
9
+ } finally {
10
+ stopPeeking()
11
+ }
12
+ },
13
+ })
@@ -1,12 +1,19 @@
1
- import { action, filtered, mergePatch, startPeeking, stopPeeking, } from "../engine.js";
2
- import { updateLeaves } from "../utils.js";
1
+ import {
2
+ action,
3
+ filtered,
4
+ mergePatch,
5
+ startPeeking,
6
+ stopPeeking,
7
+ } from "../engine.js"
8
+ import { updateLeaves } from "../utils.js"
9
+
3
10
  action({
4
- name: "setAll",
5
- apply(_, value, filter) {
6
- startPeeking();
7
- const masked = filtered(filter);
8
- updateLeaves(masked, () => value);
9
- mergePatch(masked);
10
- stopPeeking();
11
- },
12
- });
11
+ name: "setAll",
12
+ apply(_, value, filter) {
13
+ startPeeking()
14
+ const masked = filtered(filter)
15
+ updateLeaves(masked, () => value)
16
+ mergePatch(masked)
17
+ stopPeeking()
18
+ },
19
+ })
@@ -1,12 +1,19 @@
1
- import { action, filtered, mergePatch, startPeeking, stopPeeking, } from "../engine.js";
2
- import { updateLeaves } from "../utils.js";
1
+ import {
2
+ action,
3
+ filtered,
4
+ mergePatch,
5
+ startPeeking,
6
+ stopPeeking,
7
+ } from "../engine.js"
8
+ import { updateLeaves } from "../utils.js"
9
+
3
10
  action({
4
- name: "toggleAll",
5
- apply(_, filter) {
6
- startPeeking();
7
- const masked = filtered(filter);
8
- updateLeaves(masked, (oldValue) => !oldValue);
9
- mergePatch(masked);
10
- stopPeeking();
11
- },
12
- });
11
+ name: "toggleAll",
12
+ apply(_, filter) {
13
+ startPeeking()
14
+ const masked = filtered(filter)
15
+ updateLeaves(masked, (oldValue) => !oldValue)
16
+ mergePatch(masked)
17
+ stopPeeking()
18
+ },
19
+ })
@@ -1,48 +1,49 @@
1
- import { attribute, effect } from "../engine.js";
1
+ import { attribute, effect } from "../engine.js"
2
+
2
3
  attribute({
3
- name: "attr",
4
- requirement: { value: "must" },
5
- returnsValue: true,
6
- apply({ el, key, rx }) {
7
- const syncAttr = (key, val) => {
8
- if (val === "" || val === true) {
9
- el.setAttribute(key, "");
10
- }
11
- else if (val === false || val == null) {
12
- el.removeAttribute(key);
13
- }
14
- else if (typeof val === "string") {
15
- el.setAttribute(key, val);
16
- }
17
- else {
18
- el.setAttribute(key, JSON.stringify(val));
19
- }
20
- };
21
- const update = key
22
- ? () => {
23
- observer.disconnect();
24
- const val = rx();
25
- syncAttr(key, val);
26
- observer.observe(el, {
27
- attributeFilter: [key],
28
- });
29
- }
30
- : () => {
31
- observer.disconnect();
32
- const obj = rx();
33
- const attributeFilter = Object.keys(obj);
34
- for (const key of attributeFilter) {
35
- syncAttr(key, obj[key]);
36
- }
37
- observer.observe(el, {
38
- attributeFilter,
39
- });
40
- };
41
- const observer = new MutationObserver(update);
42
- const cleanup = effect(update);
43
- return () => {
44
- observer.disconnect();
45
- cleanup();
46
- };
47
- },
48
- });
4
+ name: "attr",
5
+ requirement: { value: "must" },
6
+ returnsValue: true,
7
+ apply({ el, key, rx }) {
8
+ const syncAttr = (key, val) => {
9
+ if (val === "" || val === true) {
10
+ el.setAttribute(key, "")
11
+ } else if (val === false || val == null) {
12
+ el.removeAttribute(key)
13
+ } else if (typeof val === "string") {
14
+ el.setAttribute(key, val)
15
+ } else {
16
+ el.setAttribute(key, JSON.stringify(val))
17
+ }
18
+ }
19
+
20
+ const update = key
21
+ ? () => {
22
+ observer.disconnect()
23
+ const val = rx()
24
+ syncAttr(key, val)
25
+ observer.observe(el, {
26
+ attributeFilter: [key],
27
+ })
28
+ }
29
+ : () => {
30
+ observer.disconnect()
31
+ const obj = rx()
32
+ const attributeFilter = Object.keys(obj)
33
+ for (const key of attributeFilter) {
34
+ syncAttr(key, obj[key])
35
+ }
36
+ observer.observe(el, {
37
+ attributeFilter,
38
+ })
39
+ }
40
+
41
+ const observer = new MutationObserver(update)
42
+ const cleanup = effect(update)
43
+
44
+ return () => {
45
+ observer.disconnect()
46
+ cleanup()
47
+ }
48
+ },
49
+ })
@@ -1,175 +1,194 @@
1
- import { attribute, effect, getPath, mergePaths } from "../engine.js";
2
- import { aliasify, modifyCasing } from "../utils.js";
3
- const dataURIRegex = /^data:(?<mime>[^;]+);base64,(?<contents>.*)$/;
4
- const empty = Symbol("empty");
5
- const aliasedBind = aliasify("bind");
1
+ import { attribute, effect, getPath, mergePaths } from "../engine.js"
2
+ import { aliasify, modifyCasing } from "../utils.js"
3
+
4
+ const dataURIRegex = /^data:(?<mime>[^;]+);base64,(?<contents>.*)$/
5
+ const empty = Symbol("empty")
6
+
7
+ const aliasedBind = aliasify("bind")
8
+
6
9
  attribute({
7
- name: "bind",
8
- requirement: "exclusive",
9
- apply({ el, key, mods, value, error }) {
10
- const signalName = key != null ? modifyCasing(key, mods) : value;
11
- let get = (el, type) => (type === "number" ? +el.value : el.value);
12
- let set = (value) => {
13
- ;
14
- el.value = `${value}`;
15
- };
16
- if (el instanceof HTMLInputElement) {
17
- switch (el.type) {
18
- case "range":
19
- case "number":
20
- get = (el, type) => (type === "string" ? el.value : +el.value);
21
- break;
22
- case "checkbox":
23
- get = (el, type) => {
24
- if (el.value !== "on") {
25
- if (type === "boolean") {
26
- return el.checked;
27
- }
28
- else {
29
- return el.checked ? el.value : "";
30
- }
31
- }
32
- else {
33
- if (type === "string") {
34
- return el.checked ? el.value : "";
35
- }
36
- else {
37
- return el.checked;
38
- }
39
- }
40
- };
41
- set = (value) => {
42
- el.checked = typeof value === "string" ? value === el.value : value;
43
- };
44
- break;
45
- case "radio":
46
- if (!el.getAttribute("name")?.length) {
47
- el.setAttribute("name", signalName);
48
- }
49
- get = (el, type) => el.checked ? (type === "number" ? +el.value : el.value) : empty;
50
- set = (value) => {
51
- el.checked = value === (typeof value === "number" ? +el.value : el.value);
52
- };
53
- break;
54
- case "file": {
55
- const syncSignal = () => {
56
- const files = [...(el.files || [])];
57
- const signalFiles = [];
58
- Promise.all(files.map((f) => new Promise((resolve) => {
59
- const reader = new FileReader();
60
- reader.onload = () => {
61
- if (typeof reader.result !== "string") {
62
- throw error("InvalidFileResultType", {
63
- resultType: typeof reader.result,
64
- });
65
- }
66
- const match = reader.result.match(dataURIRegex);
67
- if (!match?.groups) {
68
- throw error("InvalidDataUri", {
69
- result: reader.result,
70
- });
71
- }
72
- signalFiles.push({
73
- name: f.name,
74
- contents: match.groups.contents,
75
- mime: match.groups.mime,
76
- });
77
- };
78
- reader.onloadend = () => resolve();
79
- reader.readAsDataURL(f);
80
- }))).then(() => {
81
- mergePaths([[signalName, signalFiles]]);
82
- });
83
- };
84
- el.addEventListener("change", syncSignal);
85
- el.addEventListener("input", syncSignal);
86
- return () => {
87
- el.removeEventListener("change", syncSignal);
88
- el.removeEventListener("input", syncSignal);
89
- };
90
- }
10
+ name: "bind",
11
+ requirement: "exclusive",
12
+ apply({ el, key, mods, value, error }) {
13
+ const signalName = key != null ? modifyCasing(key, mods) : value
14
+
15
+ let get = (el, type) => (type === "number" ? +el.value : el.value)
16
+
17
+ let set = (value) => {
18
+ ;(el).value = `${value}`
19
+ }
20
+
21
+ if (el instanceof HTMLInputElement) {
22
+ switch (el.type) {
23
+ case "range":
24
+ case "number":
25
+ get = (el, type) => (type === "string" ? el.value : +el.value)
26
+ break
27
+
28
+ case "checkbox":
29
+ get = (el, type) => {
30
+ if (el.value !== "on") {
31
+ if (type === "boolean") {
32
+ return el.checked
33
+ } else {
34
+ return el.checked ? el.value : ""
35
+ }
36
+ } else {
37
+ if (type === "string") {
38
+ return el.checked ? el.value : ""
39
+ } else {
40
+ return el.checked
41
+ }
91
42
  }
92
- }
93
- else if (el instanceof HTMLSelectElement) {
94
- if (el.multiple) {
95
- const typeMap = new Map();
96
- get = (el) => [...el.selectedOptions].map((option) => {
97
- const type = typeMap.get(option.value);
98
- return type === "string" || type == null ? option.value : +option.value;
99
- });
100
- set = (value) => {
101
- for (const option of el.options) {
102
- if (value.includes(option.value)) {
103
- typeMap.set(option.value, "string");
104
- option.selected = true;
105
- }
106
- else if (value.includes(+option.value)) {
107
- typeMap.set(option.value, "number");
108
- option.selected = true;
109
- }
110
- else {
111
- option.selected = false;
112
- }
43
+ }
44
+ set = (value) => {
45
+ el.checked = typeof value === "string" ? value === el.value : value
46
+ }
47
+ break
48
+
49
+ case "radio":
50
+ if (!el.getAttribute("name")?.length) {
51
+ el.setAttribute("name", signalName)
52
+ }
53
+
54
+ get = (el, type) =>
55
+ el.checked ? (type === "number" ? +el.value : el.value) : empty
56
+ set = (value) => {
57
+ el.checked = value === (typeof value === "number" ? +el.value : el.value)
58
+ }
59
+ break
60
+ case "file": {
61
+ const syncSignal = () => {
62
+ const files = [...(el.files || [])]
63
+ const signalFiles = []
64
+ Promise.all(
65
+ files.map(
66
+ (f) =>
67
+ new Promise((resolve) => {
68
+ const reader = new FileReader()
69
+ reader.onload = () => {
70
+ if (typeof reader.result !== "string") {
71
+ throw error("InvalidFileResultType", {
72
+ resultType: typeof reader.result,
73
+ })
74
+ }
75
+ const match = reader.result.match(dataURIRegex)
76
+ if (!match?.groups) {
77
+ throw error("InvalidDataUri", {
78
+ result: reader.result,
79
+ })
80
+ }
81
+ signalFiles.push({
82
+ name: f.name,
83
+ contents: match.groups.contents,
84
+ mime: match.groups.mime,
85
+ })
113
86
  }
114
- };
115
- }
87
+ reader.onloadend = () => resolve()
88
+ reader.readAsDataURL(f)
89
+ }),
90
+ ),
91
+ ).then(() => {
92
+ mergePaths([[signalName, signalFiles]])
93
+ })
94
+ }
95
+
96
+ el.addEventListener("change", syncSignal)
97
+ el.addEventListener("input", syncSignal)
98
+
99
+ return () => {
100
+ el.removeEventListener("change", syncSignal)
101
+ el.removeEventListener("input", syncSignal)
102
+ }
116
103
  }
117
- else if (el instanceof HTMLTextAreaElement) {
118
- // default case
104
+ }
105
+ } else if (el instanceof HTMLSelectElement) {
106
+ if (el.multiple) {
107
+ const typeMap = new Map()
108
+ get = (el) =>
109
+ [...el.selectedOptions].map((option) => {
110
+ const type = typeMap.get(option.value)
111
+ return type === "string" || type == null ? option.value : +option.value
112
+ })
113
+
114
+ set = (value) => {
115
+ for (const option of el.options) {
116
+ if (value.includes(option.value)) {
117
+ typeMap.set(option.value, "string")
118
+ option.selected = true
119
+ } else if (value.includes(+option.value)) {
120
+ typeMap.set(option.value, "number")
121
+ option.selected = true
122
+ } else {
123
+ option.selected = false
124
+ }
125
+ }
119
126
  }
120
- else {
121
- // web component
122
- get = (el) => ("value" in el ? el.value : el.getAttribute("value"));
123
- set = (value) => {
124
- if ("value" in el) {
125
- el.value = value;
126
- }
127
- else {
128
- el.setAttribute("value", value);
129
- }
130
- };
127
+ }
128
+ } else if (el instanceof HTMLTextAreaElement) {
129
+ // default case
130
+ } else {
131
+ // web component
132
+ get = (el) => ("value" in el ? el.value : el.getAttribute("value"))
133
+ set = (value) => {
134
+ if ("value" in el) {
135
+ el.value = value
136
+ } else {
137
+ el.setAttribute("value", value)
131
138
  }
132
- const initialValue = getPath(signalName);
133
- const type = typeof initialValue;
134
- let path = signalName;
135
- if (Array.isArray(initialValue) && !(el instanceof HTMLSelectElement && el.multiple)) {
136
- const signalNameKebab = key ? key : value;
137
- const inputs = document.querySelectorAll(`[${aliasedBind}\\:${CSS.escape(signalNameKebab)}],[${aliasedBind}="${CSS.escape(signalNameKebab)}"]`);
138
- const paths = [];
139
- let i = 0;
140
- for (const input of inputs) {
141
- paths.push([`${path}.${i}`, get(input, "none")]);
142
- if (el === input) {
143
- break;
144
- }
145
- i++;
146
- }
147
- mergePaths(paths, { ifMissing: true });
148
- path = `${path}.${i}`;
139
+ }
140
+ }
141
+
142
+ const initialValue = getPath(signalName)
143
+ const type = typeof initialValue
144
+
145
+ let path = signalName
146
+ if (Array.isArray(initialValue) && !(el instanceof HTMLSelectElement && el.multiple)) {
147
+ const signalNameKebab = key ? key : value
148
+ const inputs = document.querySelectorAll(
149
+ `[${aliasedBind}\\:${CSS.escape(signalNameKebab)}],[${aliasedBind}="${CSS.escape(
150
+ signalNameKebab,
151
+ )}"]`,
152
+ )
153
+
154
+ const paths = []
155
+ let i = 0
156
+ for (const input of inputs) {
157
+ paths.push([`${path}.${i}`, get(input, "none")])
158
+
159
+ if (el === input) {
160
+ break
149
161
  }
150
- else {
151
- mergePaths([[path, get(el, type)]], {
152
- ifMissing: true,
153
- });
162
+ i++
163
+ }
164
+ mergePaths(paths, { ifMissing: true })
165
+ path = `${path}.${i}`
166
+ } else {
167
+ mergePaths([[path, get(el, type)]], {
168
+ ifMissing: true,
169
+ })
170
+ }
171
+
172
+ const syncSignal = () => {
173
+ const signalValue = getPath(path)
174
+ if (signalValue != null) {
175
+ const value = get(el, typeof signalValue)
176
+ if (value !== empty) {
177
+ mergePaths([[path, value]])
154
178
  }
155
- const syncSignal = () => {
156
- const signalValue = getPath(path);
157
- if (signalValue != null) {
158
- const value = get(el, typeof signalValue);
159
- if (value !== empty) {
160
- mergePaths([[path, value]]);
161
- }
162
- }
163
- };
164
- el.addEventListener("input", syncSignal);
165
- el.addEventListener("change", syncSignal);
166
- const cleanup = effect(() => {
167
- set(getPath(path));
168
- });
169
- return () => {
170
- cleanup();
171
- el.removeEventListener("input", syncSignal);
172
- el.removeEventListener("change", syncSignal);
173
- };
174
- },
175
- });
179
+ }
180
+ }
181
+
182
+ el.addEventListener("input", syncSignal)
183
+ el.addEventListener("change", syncSignal)
184
+ const cleanup = effect(() => {
185
+ set(getPath(path))
186
+ })
187
+
188
+ return () => {
189
+ cleanup()
190
+ el.removeEventListener("input", syncSignal)
191
+ el.removeEventListener("change", syncSignal)
192
+ }
193
+ },
194
+ })
@@ -1,47 +1,54 @@
1
- import { attribute, effect } from "../engine.js";
2
- import { modifyCasing } from "../utils.js";
1
+ import { attribute, effect } from "../engine.js"
2
+ import { modifyCasing } from "../utils.js"
3
+
3
4
  attribute({
4
- name: "class",
5
- requirement: {
6
- value: "must",
7
- },
8
- returnsValue: true,
9
- apply({ key, el, mods, rx }) {
10
- key &&= modifyCasing(key, mods, "kebab");
11
- let classes;
12
- const callback = () => {
13
- observer.disconnect();
14
- classes = key ? { [key]: rx() } : rx();
15
- for (const k in classes) {
16
- const classNames = k.split(/\s+/).filter((cn) => cn.length > 0);
17
- if (classes[k]) {
18
- for (const name of classNames) {
19
- if (!el.classList.contains(name)) {
20
- el.classList.add(name);
21
- }
22
- }
23
- }
24
- else {
25
- for (const name of classNames) {
26
- if (el.classList.contains(name)) {
27
- el.classList.remove(name);
28
- }
29
- }
30
- }
5
+ name: "class",
6
+ requirement: {
7
+ value: "must",
8
+ },
9
+ returnsValue: true,
10
+ apply({ key, el, mods, rx }) {
11
+ key &&= modifyCasing(key, mods, "kebab")
12
+
13
+ let classes
14
+ const callback = () => {
15
+ observer.disconnect()
16
+
17
+ classes = key ? { [key]: rx() } : (rx())
18
+
19
+ for (const k in classes) {
20
+ const classNames = k.split(/\s+/).filter((cn) => cn.length > 0)
21
+ if (classes[k]) {
22
+ for (const name of classNames) {
23
+ if (!el.classList.contains(name)) {
24
+ el.classList.add(name)
31
25
  }
32
- observer.observe(el, { attributeFilter: ["class"] });
33
- };
34
- const observer = new MutationObserver(callback);
35
- const cleanup = effect(callback);
36
- return () => {
37
- observer.disconnect();
38
- cleanup();
39
- for (const k in classes) {
40
- const classNames = k.split(/\s+/).filter((cn) => cn.length > 0);
41
- for (const name of classNames) {
42
- el.classList.remove(name);
43
- }
26
+ }
27
+ } else {
28
+ for (const name of classNames) {
29
+ if (el.classList.contains(name)) {
30
+ el.classList.remove(name)
44
31
  }
45
- };
46
- },
47
- });
32
+ }
33
+ }
34
+ }
35
+
36
+ observer.observe(el, { attributeFilter: ["class"] })
37
+ }
38
+
39
+ const observer = new MutationObserver(callback)
40
+ const cleanup = effect(callback)
41
+
42
+ return () => {
43
+ observer.disconnect()
44
+ cleanup()
45
+
46
+ for (const k in classes) {
47
+ const classNames = k.split(/\s+/).filter((cn) => cn.length > 0)
48
+ for (const name of classNames) {
49
+ el.classList.remove(name)
50
+ }
51
+ }
52
+ }
53
+ },
54
+ })