effect-start 0.23.0 → 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 (356) 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 +24 -22
  123. package/src/StartApp.ts +11 -0
  124. package/src/bun/BunServer.ts +89 -16
  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/src/x/tailscale/TailscaleTunnel.ts +7 -5
  132. package/dist/BlobStore.d.ts +0 -80
  133. package/dist/BlobStore.js +0 -19
  134. package/dist/ChildProcess.d.ts +0 -60
  135. package/dist/Commander.d.ts +0 -100
  136. package/dist/ContentNegotiation.d.ts +0 -12
  137. package/dist/Cookies.d.ts +0 -47
  138. package/dist/Development.d.ts +0 -39
  139. package/dist/Effectify.d.ts +0 -209
  140. package/dist/Entity.d.ts +0 -47
  141. package/dist/FilePathPattern.d.ts +0 -29
  142. package/dist/FileRouter.d.ts +0 -56
  143. package/dist/FileRouterCodegen.d.ts +0 -18
  144. package/dist/FileRouterPattern.d.ts +0 -9
  145. package/dist/FileRouterPattern.js +0 -35
  146. package/dist/FileSystem.d.ts +0 -158
  147. package/dist/Http.d.ts +0 -37
  148. package/dist/HttpAppExtra.d.ts +0 -7
  149. package/dist/HttpAppExtra.js +0 -320
  150. package/dist/HttpUtils.d.ts +0 -3
  151. package/dist/HttpUtils.js +0 -11
  152. package/dist/PathPattern.d.ts +0 -134
  153. package/dist/PlatformError.d.ts +0 -38
  154. package/dist/PlatformRuntime.d.ts +0 -27
  155. package/dist/Route.d.ts +0 -97
  156. package/dist/RouteBody.d.ts +0 -47
  157. package/dist/RouteError.d.ts +0 -98
  158. package/dist/RouteHook.d.ts +0 -12
  159. package/dist/RouteHttp.d.ts +0 -21
  160. package/dist/RouteHttpTracer.d.ts +0 -10
  161. package/dist/RouteMount.d.ts +0 -86
  162. package/dist/RouteSchema.d.ts +0 -86
  163. package/dist/RouteSse.d.ts +0 -21
  164. package/dist/RouteTree.d.ts +0 -57
  165. package/dist/RouteTrie.d.ts +0 -20
  166. package/dist/RouterPattern.d.ts +0 -118
  167. package/dist/RouterPattern.js +0 -269
  168. package/dist/SchemaExtra.d.ts +0 -7
  169. package/dist/Socket.d.ts +0 -27
  170. package/dist/Sql.d.ts +0 -34
  171. package/dist/Sql.js +0 -5
  172. package/dist/SqlIntrospect.d.ts +0 -91
  173. package/dist/Start.d.ts +0 -44
  174. package/dist/StartApp.d.ts +0 -19
  175. package/dist/StreamExtra.d.ts +0 -28
  176. package/dist/System.d.ts +0 -7
  177. package/dist/TuplePathPattern.d.ts +0 -9
  178. package/dist/Unique.d.ts +0 -50
  179. package/dist/Values.d.ts +0 -27
  180. package/dist/bun/BunBlobStoreDisk.d.ts +0 -6
  181. package/dist/bun/BunBlobStoreDisk.js +0 -116
  182. package/dist/bun/BunBlobStoreS3.d.ts +0 -11
  183. package/dist/bun/BunBlobStoreS3.js +0 -89
  184. package/dist/bun/BunBlobWatcherDisk.d.ts +0 -6
  185. package/dist/bun/BunBlobWatcherDisk.js +0 -60
  186. package/dist/bun/BunBlobWatcherQueue.d.ts +0 -6
  187. package/dist/bun/BunBlobWatcherQueue.js +0 -17
  188. package/dist/bun/BunBundle.d.ts +0 -11
  189. package/dist/bun/BunChildProcessSpawner.d.ts +0 -3
  190. package/dist/bun/BunHttpServer.d.ts +0 -44
  191. package/dist/bun/BunHttpServer.js +0 -186
  192. package/dist/bun/BunHttpServer_web.d.ts +0 -60
  193. package/dist/bun/BunHttpServer_web.js +0 -252
  194. package/dist/bun/BunImportTrackerPlugin.d.ts +0 -13
  195. package/dist/bun/BunPlatformHttpServer.d.ts +0 -10
  196. package/dist/bun/BunPlatformHttpServer.js +0 -53
  197. package/dist/bun/BunRoute.d.ts +0 -48
  198. package/dist/bun/BunRuntime.d.ts +0 -2
  199. package/dist/bun/BunServer.d.ts +0 -40
  200. package/dist/bun/BunServerRequest.d.ts +0 -60
  201. package/dist/bun/BunServerRequest.js +0 -252
  202. package/dist/bun/BunSql.d.ts +0 -4
  203. package/dist/bun/BunSql.js +0 -81
  204. package/dist/bun/BunVirtualFilesPlugin.d.ts +0 -4
  205. package/dist/bun/_BunEnhancedResolve.d.ts +0 -45
  206. package/dist/bun/index.d.ts +0 -5
  207. package/dist/bundler/Bundle.d.ts +0 -61
  208. package/dist/bundler/BundleFiles.d.ts +0 -13
  209. package/dist/bundler/BundleHttp.d.ts +0 -45
  210. package/dist/bundler/BundleHttp.js +0 -176
  211. package/dist/bundler/BundleRoute.d.ts +0 -27
  212. package/dist/client/Overlay.d.ts +0 -2
  213. package/dist/client/ScrollState.d.ts +0 -6
  214. package/dist/client/index.d.ts +0 -6
  215. package/dist/console/Console.d.ts +0 -6
  216. package/dist/console/ConsoleErrors.d.ts +0 -3
  217. package/dist/console/ConsoleLogger.d.ts +0 -3
  218. package/dist/console/ConsoleMetrics.d.ts +0 -3
  219. package/dist/console/ConsoleProcess.d.ts +0 -3
  220. package/dist/console/ConsoleStore.d.ts +0 -144
  221. package/dist/console/ConsoleTracer.d.ts +0 -3
  222. package/dist/console/Simulation.d.ts +0 -2
  223. package/dist/console/index.d.ts +0 -3
  224. package/dist/console/routes/errors/route.d.ts +0 -10
  225. package/dist/console/routes/errors/route.js +0 -47
  226. package/dist/console/routes/fiberDetail.d.ts +0 -16
  227. package/dist/console/routes/fiberDetail.js +0 -38
  228. package/dist/console/routes/fibers/route.d.ts +0 -10
  229. package/dist/console/routes/fibers/route.js +0 -19
  230. package/dist/console/routes/git/route.d.ts +0 -11
  231. package/dist/console/routes/git/route.js +0 -33
  232. package/dist/console/routes/layout.d.ts +0 -9
  233. package/dist/console/routes/layout.js +0 -3
  234. package/dist/console/routes/logs/route.d.ts +0 -10
  235. package/dist/console/routes/logs/route.js +0 -32
  236. package/dist/console/routes/metrics/route.d.ts +0 -10
  237. package/dist/console/routes/metrics/route.js +0 -17
  238. package/dist/console/routes/route.d.ts +0 -6
  239. package/dist/console/routes/route.js +0 -5
  240. package/dist/console/routes/routes/route.d.ts +0 -6
  241. package/dist/console/routes/routes/route.js +0 -20
  242. package/dist/console/routes/services/route.d.ts +0 -6
  243. package/dist/console/routes/services/route.js +0 -12
  244. package/dist/console/routes/system/route.d.ts +0 -10
  245. package/dist/console/routes/system/route.js +0 -18
  246. package/dist/console/routes/traceDetail.d.ts +0 -16
  247. package/dist/console/routes/traceDetail.js +0 -14
  248. package/dist/console/routes/traces/route.d.ts +0 -10
  249. package/dist/console/routes/traces/route.js +0 -39
  250. package/dist/console/routes/tree.d.ts +0 -153
  251. package/dist/console/ui/Errors.d.ts +0 -4
  252. package/dist/console/ui/Errors.js +0 -15
  253. package/dist/console/ui/Fibers.d.ts +0 -24
  254. package/dist/console/ui/Fibers.js +0 -121
  255. package/dist/console/ui/Git.d.ts +0 -20
  256. package/dist/console/ui/Git.js +0 -95
  257. package/dist/console/ui/Logs.d.ts +0 -4
  258. package/dist/console/ui/Logs.js +0 -25
  259. package/dist/console/ui/Metrics.d.ts +0 -4
  260. package/dist/console/ui/Metrics.js +0 -26
  261. package/dist/console/ui/Routes.d.ts +0 -8
  262. package/dist/console/ui/Routes.js +0 -70
  263. package/dist/console/ui/Services.d.ts +0 -10
  264. package/dist/console/ui/Services.js +0 -246
  265. package/dist/console/ui/Shell.d.ts +0 -10
  266. package/dist/console/ui/Shell.js +0 -7
  267. package/dist/console/ui/System.d.ts +0 -4
  268. package/dist/console/ui/System.js +0 -35
  269. package/dist/console/ui/Traces.d.ts +0 -12
  270. package/dist/console/ui/Traces.js +0 -179
  271. package/dist/datastar/actions/fetch.d.ts +0 -30
  272. package/dist/datastar/actions/peek.d.ts +0 -1
  273. package/dist/datastar/actions/setAll.d.ts +0 -1
  274. package/dist/datastar/actions/toggleAll.d.ts +0 -1
  275. package/dist/datastar/attributes/attr.d.ts +0 -1
  276. package/dist/datastar/attributes/bind.d.ts +0 -1
  277. package/dist/datastar/attributes/class.d.ts +0 -1
  278. package/dist/datastar/attributes/computed.d.ts +0 -1
  279. package/dist/datastar/attributes/effect.d.ts +0 -1
  280. package/dist/datastar/attributes/indicator.d.ts +0 -1
  281. package/dist/datastar/attributes/init.d.ts +0 -1
  282. package/dist/datastar/attributes/jsonSignals.d.ts +0 -1
  283. package/dist/datastar/attributes/on.d.ts +0 -1
  284. package/dist/datastar/attributes/onIntersect.d.ts +0 -1
  285. package/dist/datastar/attributes/onInterval.d.ts +0 -1
  286. package/dist/datastar/attributes/onSignalPatch.d.ts +0 -1
  287. package/dist/datastar/attributes/ref.d.ts +0 -1
  288. package/dist/datastar/attributes/show.d.ts +0 -1
  289. package/dist/datastar/attributes/signals.d.ts +0 -1
  290. package/dist/datastar/attributes/style.d.ts +0 -1
  291. package/dist/datastar/attributes/text.d.ts +0 -1
  292. package/dist/datastar/engine.d.ts +0 -162
  293. package/dist/datastar/happydom.d.ts +0 -1
  294. package/dist/datastar/happydom.js +0 -8
  295. package/dist/datastar/index.d.ts +0 -24
  296. package/dist/datastar/load.d.ts +0 -24
  297. package/dist/datastar/load.js +0 -24
  298. package/dist/datastar/utils.d.ts +0 -51
  299. package/dist/datastar/watchers/patchElements.d.ts +0 -1
  300. package/dist/datastar/watchers/patchSignals.d.ts +0 -1
  301. package/dist/experimental/EncryptedCookies.d.ts +0 -48
  302. package/dist/experimental/SseHttpResponse.d.ts +0 -7
  303. package/dist/experimental/SseHttpResponse.js +0 -28
  304. package/dist/experimental/index.d.ts +0 -1
  305. package/dist/hyper/Hyper.d.ts +0 -25
  306. package/dist/hyper/HyperHtml.d.ts +0 -23
  307. package/dist/hyper/HyperHtml.test.d.ts +0 -1
  308. package/dist/hyper/HyperHtml.test.js +0 -197
  309. package/dist/hyper/HyperNode.d.ts +0 -14
  310. package/dist/hyper/HyperRoute.d.ts +0 -8
  311. package/dist/hyper/HyperRoute.test.d.ts +0 -1
  312. package/dist/hyper/HyperRoute.test.js +0 -83
  313. package/dist/hyper/html.d.ts +0 -11
  314. package/dist/hyper/index.d.ts +0 -6
  315. package/dist/hyper/jsx-runtime.d.ts +0 -7
  316. package/dist/index.d.ts +0 -8
  317. package/dist/inference_check.d.ts +0 -1
  318. package/dist/inference_check.js +0 -15
  319. package/dist/lint/plugin.d.ts +0 -86
  320. package/dist/lint/plugin.js +0 -341
  321. package/dist/middlewares/BasicAuthMiddleware.d.ts +0 -8
  322. package/dist/middlewares/BasicAuthMiddleware.js +0 -22
  323. package/dist/middlewares/index.d.ts +0 -1
  324. package/dist/middlewares/index.js +0 -1
  325. package/dist/node/Effectify.d.ts +0 -209
  326. package/dist/node/Effectify.js +0 -19
  327. package/dist/node/FileSystem.d.ts +0 -7
  328. package/dist/node/FileSystem.js +0 -420
  329. package/dist/node/NodeFileSystem.d.ts +0 -7
  330. package/dist/node/NodeUtils.d.ts +0 -2
  331. package/dist/node/PlatformError.d.ts +0 -46
  332. package/dist/node/PlatformError.js +0 -43
  333. package/dist/node/Utils.d.ts +0 -1
  334. package/dist/node/Utils.js +0 -19
  335. package/dist/repro_fail.d.ts +0 -1
  336. package/dist/repro_fail.js +0 -14
  337. package/dist/sql/bun/index.d.ts +0 -3
  338. package/dist/sql/mssql/docker.d.ts +0 -2
  339. package/dist/sql/mssql/index.d.ts +0 -21
  340. package/dist/testing/TestHttpClient.d.ts +0 -13
  341. package/dist/testing/TestHttpClient.js +0 -68
  342. package/dist/testing/TestLogger.d.ts +0 -13
  343. package/dist/testing/index.d.ts +0 -2
  344. package/dist/testing/utils.d.ts +0 -9
  345. package/dist/x/cloudflare/CloudflareTunnel.d.ts +0 -10
  346. package/dist/x/cloudflare/index.d.ts +0 -1
  347. package/dist/x/datastar/Datastar.d.ts +0 -6
  348. package/dist/x/datastar/Datastar.js +0 -47
  349. package/dist/x/datastar/index.d.ts +0 -1
  350. package/dist/x/datastar/index.js +0 -1
  351. package/dist/x/tailscale/TailscaleTunnel.d.ts +0 -15
  352. package/dist/x/tailscale/index.d.ts +0 -1
  353. package/dist/x/tailwind/TailwindPlugin.d.ts +0 -23
  354. package/dist/x/tailwind/compile.d.ts +0 -19
  355. package/dist/x/tailwind/plugin.d.ts +0 -2
  356. /package/src/{Sql.ts → sql/Sql.ts} +0 -0
@@ -1,399 +1,486 @@
1
- import { watcher } from "../engine.js";
2
- import { aliasify, isHTMLOrSVG, supportsViewTransitions } from "../utils.js";
3
- const isValidType = (arr, value) => arr.includes(value);
4
- const PATCH_MODES = [
5
- "remove",
6
- "outer",
7
- "inner",
8
- "replace",
9
- "prepend",
10
- "append",
11
- "before",
12
- "after",
13
- ];
14
- const NAMESPACES = ["html", "svg", "mathml"];
1
+ import { watcher } from "../engine.js"
2
+ import { aliasify, isHTMLOrSVG, supportsViewTransitions } from "../utils.js"
3
+
4
+ const isValidType = (arr, value) =>
5
+ (arr).includes(value)
6
+
7
+ const PATCH_MODES = /** @type {const} */ [
8
+ "remove",
9
+ "outer",
10
+ "inner",
11
+ "replace",
12
+ "prepend",
13
+ "append",
14
+ "before",
15
+ "after",
16
+ ]
17
+
18
+ const NAMESPACES = /** @type {const} */ ["html", "svg", "mathml"]
19
+
15
20
  watcher({
16
- name: "datastar-patch-elements",
17
- apply(ctx, { selector = "", mode = "outer", namespace = "html", useViewTransition = "", elements = "" }) {
18
- if (!isValidType(PATCH_MODES, mode)) {
19
- throw ctx.error("PatchElementsInvalidMode", { mode });
20
- }
21
- if (!selector && mode !== "outer" && mode !== "replace") {
22
- throw ctx.error("PatchElementsExpectedSelector");
23
- }
24
- if (!isValidType(NAMESPACES, namespace)) {
25
- throw ctx.error("PatchElementsInvalidNamespace", { namespace });
26
- }
27
- const args2 = {
28
- selector,
29
- mode,
30
- namespace,
31
- useViewTransition: useViewTransition.trim() === "true",
32
- elements,
33
- };
34
- if (supportsViewTransitions && useViewTransition) {
35
- document.startViewTransition(() => onPatchElements(ctx, args2));
36
- }
37
- else {
38
- onPatchElements(ctx, args2);
39
- }
40
- },
41
- });
42
- const onPatchElements = ({ error }, { selector, mode, namespace, elements }) => {
43
- const elementsWithSvgsRemoved = elements.replace(/<svg(\s[^>]*>|>)([\s\S]*?)<\/svg>/gim, "");
44
- const hasHtml = /<\/html>/.test(elementsWithSvgsRemoved);
45
- const hasHead = /<\/head>/.test(elementsWithSvgsRemoved);
46
- const hasBody = /<\/body>/.test(elementsWithSvgsRemoved);
47
- const wrapperTag = namespace === "svg" ? "svg" : namespace === "mathml" ? "math" : "";
48
- const wrappedEls = wrapperTag ? `<${wrapperTag}>${elements}</${wrapperTag}>` : elements;
49
- const newDocument = new DOMParser().parseFromString(hasHtml || hasHead || hasBody ? elements : `<body><template>${wrappedEls}</template></body>`, "text/html");
50
- let newContent = document.createDocumentFragment();
51
- if (hasHtml) {
52
- newContent.appendChild(newDocument.documentElement);
21
+ name: "datastar-patch-elements",
22
+ apply(
23
+ ctx,
24
+ { selector = "", mode = "outer", namespace = "html", useViewTransition = "", elements = "" },
25
+ ) {
26
+ if (!isValidType(PATCH_MODES, mode)) {
27
+ throw ctx.error("PatchElementsInvalidMode", { mode })
53
28
  }
54
- else if (hasHead && hasBody) {
55
- newContent.appendChild(newDocument.head);
56
- newContent.appendChild(newDocument.body);
29
+
30
+ if (!selector && mode !== "outer" && mode !== "replace") {
31
+ throw ctx.error("PatchElementsExpectedSelector")
57
32
  }
58
- else if (hasHead) {
59
- newContent.appendChild(newDocument.head);
33
+
34
+ if (!isValidType(NAMESPACES, namespace)) {
35
+ throw ctx.error("PatchElementsInvalidNamespace", { namespace })
60
36
  }
61
- else if (hasBody) {
62
- newContent.appendChild(newDocument.body);
37
+
38
+ const args2 = {
39
+ selector,
40
+ mode,
41
+ namespace,
42
+ useViewTransition: useViewTransition.trim() === "true",
43
+ elements,
63
44
  }
64
- else if (wrapperTag) {
65
- const wrapperEl = newDocument.querySelector("template").content.querySelector(wrapperTag);
66
- for (const child of wrapperEl.childNodes) {
67
- newContent.appendChild(child);
68
- }
45
+
46
+ if (supportsViewTransitions && useViewTransition) {
47
+ document.startViewTransition(() => onPatchElements(ctx, args2))
48
+ } else {
49
+ onPatchElements(ctx, args2)
69
50
  }
70
- else {
71
- newContent = newDocument.querySelector("template").content;
51
+ },
52
+ })
53
+
54
+ const onPatchElements = (
55
+ { error },
56
+ { selector, mode, namespace, elements },
57
+ ) => {
58
+ const elementsWithSvgsRemoved = elements.replace(/<svg(\s[^>]*>|>)([\s\S]*?)<\/svg>/gim, "")
59
+ const hasHtml = /<\/html>/.test(elementsWithSvgsRemoved)
60
+ const hasHead = /<\/head>/.test(elementsWithSvgsRemoved)
61
+ const hasBody = /<\/body>/.test(elementsWithSvgsRemoved)
62
+
63
+ const wrapperTag = namespace === "svg" ? "svg" : namespace === "mathml" ? "math" : ""
64
+ const wrappedEls = wrapperTag ? `<${wrapperTag}>${elements}</${wrapperTag}>` : elements
65
+
66
+ const newDocument = new DOMParser().parseFromString(
67
+ hasHtml || hasHead || hasBody ? elements : `<body><template>${wrappedEls}</template></body>`,
68
+ "text/html",
69
+ )
70
+
71
+ let newContent = document.createDocumentFragment()
72
+ if (hasHtml) {
73
+ newContent.appendChild(newDocument.documentElement)
74
+ } else if (hasHead && hasBody) {
75
+ newContent.appendChild(newDocument.head)
76
+ newContent.appendChild(newDocument.body)
77
+ } else if (hasHead) {
78
+ newContent.appendChild(newDocument.head)
79
+ } else if (hasBody) {
80
+ newContent.appendChild(newDocument.body)
81
+ } else if (wrapperTag) {
82
+ const wrapperEl = newDocument.querySelector("template").content.querySelector(wrapperTag)
83
+ for (const child of wrapperEl.childNodes) {
84
+ newContent.appendChild(child)
72
85
  }
73
- if (!selector && (mode === "outer" || mode === "replace")) {
74
- for (const child of newContent.children) {
75
- let target;
76
- if (child instanceof HTMLHtmlElement) {
77
- target = document.documentElement;
78
- }
79
- else if (child instanceof HTMLBodyElement) {
80
- target = document.body;
81
- }
82
- else if (child instanceof HTMLHeadElement) {
83
- target = document.head;
84
- }
85
- else {
86
- target = document.getElementById(child.id);
87
- if (!target) {
88
- console.warn(error("PatchElementsNoTargetsFound"), {
89
- element: { id: child.id },
90
- });
91
- continue;
92
- }
93
- }
94
- applyToTargets(mode, child, [target]);
95
- }
86
+ } else {
87
+ newContent = newDocument.querySelector("template").content
88
+ }
89
+
90
+ if (!selector && (mode === "outer" || mode === "replace")) {
91
+ for (const child of newContent.children) {
92
+ let target
93
+ if (child instanceof HTMLHtmlElement) {
94
+ target = document.documentElement
95
+ } else if (child instanceof HTMLBodyElement) {
96
+ target = document.body
97
+ } else if (child instanceof HTMLHeadElement) {
98
+ target = document.head
99
+ } else {
100
+ target = document.getElementById(child.id)
101
+ if (!target) {
102
+ console.warn(error("PatchElementsNoTargetsFound"), {
103
+ element: { id: child.id },
104
+ })
105
+ continue
106
+ }
107
+ }
108
+
109
+ applyToTargets(mode, child, [target])
96
110
  }
97
- else {
98
- const targets = document.querySelectorAll(selector);
99
- if (!targets.length) {
100
- console.warn(error("PatchElementsNoTargetsFound"), { selector });
101
- return;
102
- }
103
- applyToTargets(mode, newContent, targets);
111
+ } else {
112
+ const targets = document.querySelectorAll(selector)
113
+ if (!targets.length) {
114
+ console.warn(error("PatchElementsNoTargetsFound"), { selector })
115
+ return
104
116
  }
105
- };
106
- const scripts = new WeakSet();
117
+
118
+ applyToTargets(mode, newContent, targets)
119
+ }
120
+ }
121
+
122
+ const scripts = new WeakSet()
107
123
  for (const script of document.querySelectorAll("script")) {
108
- scripts.add(script);
124
+ scripts.add(script)
109
125
  }
126
+
110
127
  const execute = (target) => {
111
- const elScripts = target instanceof HTMLScriptElement ? [target] : target.querySelectorAll("script");
112
- for (const old of elScripts) {
113
- if (!scripts.has(old)) {
114
- const script = document.createElement("script");
115
- for (const { name, value } of old.attributes) {
116
- script.setAttribute(name, value);
117
- }
118
- script.text = old.text;
119
- old.replaceWith(script);
120
- scripts.add(script);
121
- }
128
+ const elScripts =
129
+ target instanceof HTMLScriptElement ? [target] : target.querySelectorAll("script")
130
+ for (const old of elScripts) {
131
+ if (!scripts.has(old)) {
132
+ const script = document.createElement("script")
133
+ for (const { name, value } of old.attributes) {
134
+ script.setAttribute(name, value)
135
+ }
136
+ script.text = old.text
137
+ old.replaceWith(script)
138
+ scripts.add(script)
122
139
  }
123
- };
124
- const applyPatchMode = (targets, element, action) => {
125
- for (const target of targets) {
126
- const cloned = element.cloneNode(true);
127
- execute(cloned);
128
- // @ts-ignore
129
- target[action](cloned);
130
- }
131
- };
132
- const applyToTargets = (mode, element, targets) => {
133
- switch (mode) {
134
- case "remove":
135
- for (const target of targets) {
136
- target.remove();
137
- }
138
- break;
139
- case "outer":
140
- case "inner":
141
- for (const target of targets) {
142
- morph(target, element.cloneNode(true), mode);
143
- execute(target);
144
- }
145
- break;
146
- case "replace":
147
- applyPatchMode(targets, element, "replaceWith");
148
- break;
149
- case "prepend":
150
- case "append":
151
- case "before":
152
- case "after":
153
- applyPatchMode(targets, element, mode);
154
- }
155
- };
156
- const ctxIdMap = new Map();
157
- const ctxPersistentIds = new Set();
158
- const oldIdTagNameMap = new Map();
159
- const duplicateIds = new Set();
160
- const ctxPantry = document.createElement("div");
161
- ctxPantry.hidden = true;
162
- const aliasedIgnoreMorph = aliasify("ignore-morph");
163
- const aliasedIgnoreMorphAttr = `[${aliasedIgnoreMorph}]`;
164
- const morph = (oldElt, newContent, mode = "outer") => {
165
- if ((isHTMLOrSVG(oldElt) &&
166
- isHTMLOrSVG(newContent) &&
167
- oldElt.hasAttribute(aliasedIgnoreMorph) &&
168
- newContent.hasAttribute(aliasedIgnoreMorph)) ||
169
- oldElt.parentElement?.closest(aliasedIgnoreMorphAttr)) {
170
- return;
140
+ }
141
+ }
142
+
143
+ const applyPatchMode = (
144
+ targets,
145
+ element,
146
+ action,
147
+ ) => {
148
+ for (const target of targets) {
149
+ const cloned = element.cloneNode(true)
150
+ execute(cloned)
151
+ // @ts-ignore
152
+ target[action](cloned)
153
+ }
154
+ }
155
+
156
+ const applyToTargets = (
157
+ mode,
158
+ element,
159
+ targets,
160
+ ) => {
161
+ switch (mode) {
162
+ case "remove":
163
+ for (const target of targets) {
164
+ target.remove()
165
+ }
166
+ break
167
+ case "outer":
168
+ case "inner":
169
+ for (const target of targets) {
170
+ morph(target, element.cloneNode(true), mode)
171
+ execute(target)
172
+ }
173
+ break
174
+ case "replace":
175
+ applyPatchMode(targets, element, "replaceWith")
176
+ break
177
+ case "prepend":
178
+ case "append":
179
+ case "before":
180
+ case "after":
181
+ applyPatchMode(targets, element, mode)
182
+ }
183
+ }
184
+
185
+ const ctxIdMap = new Map()
186
+ const ctxPersistentIds = new Set()
187
+ const oldIdTagNameMap = new Map()
188
+ const duplicateIds = new Set()
189
+ const ctxPantry = document.createElement("div")
190
+ ctxPantry.hidden = true
191
+
192
+ const aliasedIgnoreMorph = aliasify("ignore-morph")
193
+ const aliasedIgnoreMorphAttr = `[${aliasedIgnoreMorph}]`
194
+ const morph = (
195
+ oldElt,
196
+ newContent,
197
+ mode = "outer",
198
+ ) => {
199
+ if (
200
+ (isHTMLOrSVG(oldElt) &&
201
+ isHTMLOrSVG(newContent) &&
202
+ (oldElt).hasAttribute(aliasedIgnoreMorph) &&
203
+ (newContent).hasAttribute(aliasedIgnoreMorph)) ||
204
+ oldElt.parentElement?.closest(aliasedIgnoreMorphAttr)
205
+ ) {
206
+ return
207
+ }
208
+
209
+ const normalizedElt = document.createElement("div")
210
+ normalizedElt.append(newContent)
211
+ document.body.insertAdjacentElement("afterend", ctxPantry)
212
+
213
+ const oldIdElements = oldElt.querySelectorAll("[id]")
214
+ for (const { id, tagName } of oldIdElements) {
215
+ if (oldIdTagNameMap.has(id)) {
216
+ duplicateIds.add(id)
217
+ } else {
218
+ oldIdTagNameMap.set(id, tagName)
171
219
  }
172
- const normalizedElt = document.createElement("div");
173
- normalizedElt.append(newContent);
174
- document.body.insertAdjacentElement("afterend", ctxPantry);
175
- const oldIdElements = oldElt.querySelectorAll("[id]");
176
- for (const { id, tagName } of oldIdElements) {
177
- if (oldIdTagNameMap.has(id)) {
178
- duplicateIds.add(id);
179
- }
180
- else {
181
- oldIdTagNameMap.set(id, tagName);
182
- }
220
+ }
221
+ if (oldElt instanceof Element && oldElt.id) {
222
+ if (oldIdTagNameMap.has(oldElt.id)) {
223
+ duplicateIds.add(oldElt.id)
224
+ } else {
225
+ oldIdTagNameMap.set(oldElt.id, oldElt.tagName)
183
226
  }
184
- if (oldElt instanceof Element && oldElt.id) {
185
- if (oldIdTagNameMap.has(oldElt.id)) {
186
- duplicateIds.add(oldElt.id);
187
- }
188
- else {
189
- oldIdTagNameMap.set(oldElt.id, oldElt.tagName);
190
- }
227
+ }
228
+
229
+ ctxPersistentIds.clear()
230
+ const newIdElements = normalizedElt.querySelectorAll("[id]")
231
+ for (const { id, tagName } of newIdElements) {
232
+ if (ctxPersistentIds.has(id)) {
233
+ duplicateIds.add(id)
234
+ } else if (oldIdTagNameMap.get(id) === tagName) {
235
+ ctxPersistentIds.add(id)
191
236
  }
192
- ctxPersistentIds.clear();
193
- const newIdElements = normalizedElt.querySelectorAll("[id]");
194
- for (const { id, tagName } of newIdElements) {
195
- if (ctxPersistentIds.has(id)) {
196
- duplicateIds.add(id);
197
- }
198
- else if (oldIdTagNameMap.get(id) === tagName) {
199
- ctxPersistentIds.add(id);
200
- }
237
+ }
238
+
239
+ for (const id of duplicateIds) {
240
+ ctxPersistentIds.delete(id)
241
+ }
242
+
243
+ oldIdTagNameMap.clear()
244
+ duplicateIds.clear()
245
+ ctxIdMap.clear()
246
+
247
+ const parent = mode === "outer" ? oldElt.parentElement : oldElt
248
+ populateIdMapWithTree(parent, oldIdElements)
249
+ populateIdMapWithTree(normalizedElt, newIdElements)
250
+
251
+ morphChildren(parent, normalizedElt, mode === "outer" ? oldElt : null, oldElt.nextSibling)
252
+
253
+ ctxPantry.remove()
254
+ }
255
+
256
+ const morphChildren = (
257
+ oldParent,
258
+ newParent,
259
+ insertionPoint = null,
260
+ endPoint = null,
261
+ ) => {
262
+ if (oldParent instanceof HTMLTemplateElement && newParent instanceof HTMLTemplateElement) {
263
+ oldParent = oldParent.content
264
+ newParent = newParent.content
265
+ }
266
+ insertionPoint ??= oldParent.firstChild
267
+
268
+ for (const newChild of newParent.childNodes) {
269
+ if (insertionPoint && insertionPoint !== endPoint) {
270
+ const bestMatch = findBestMatch(newChild, insertionPoint, endPoint)
271
+ if (bestMatch) {
272
+ if (bestMatch !== insertionPoint) {
273
+ let cursor = insertionPoint
274
+ while (cursor && cursor !== bestMatch) {
275
+ const tempNode = cursor
276
+ cursor = cursor.nextSibling
277
+ removeNode(tempNode)
278
+ }
279
+ }
280
+ morphNode(bestMatch, newChild)
281
+ insertionPoint = bestMatch.nextSibling
282
+ continue
283
+ }
201
284
  }
202
- for (const id of duplicateIds) {
203
- ctxPersistentIds.delete(id);
285
+
286
+ if (newChild instanceof Element && ctxPersistentIds.has(newChild.id)) {
287
+ const movedChild = document.getElementById(newChild.id)
288
+
289
+ let current = movedChild
290
+ while ((current = current.parentNode)) {
291
+ const idSet = ctxIdMap.get(current)
292
+ if (idSet) {
293
+ idSet.delete(newChild.id)
294
+ if (!idSet.size) {
295
+ ctxIdMap.delete(current)
296
+ }
297
+ }
298
+ }
299
+
300
+ moveBefore(oldParent, movedChild, insertionPoint)
301
+ morphNode(movedChild, newChild)
302
+ insertionPoint = movedChild.nextSibling
303
+ continue
204
304
  }
205
- oldIdTagNameMap.clear();
206
- duplicateIds.clear();
207
- ctxIdMap.clear();
208
- const parent = mode === "outer" ? oldElt.parentElement : oldElt;
209
- populateIdMapWithTree(parent, oldIdElements);
210
- populateIdMapWithTree(normalizedElt, newIdElements);
211
- morphChildren(parent, normalizedElt, mode === "outer" ? oldElt : null, oldElt.nextSibling);
212
- ctxPantry.remove();
213
- };
214
- const morphChildren = (oldParent, newParent, insertionPoint = null, endPoint = null) => {
215
- if (oldParent instanceof HTMLTemplateElement && newParent instanceof HTMLTemplateElement) {
216
- oldParent = oldParent.content;
217
- newParent = newParent.content;
305
+
306
+ if (ctxIdMap.has(newChild)) {
307
+ const namespaceURI = (newChild).namespaceURI
308
+ const tagName = (newChild).tagName
309
+ const newEmptyChild =
310
+ namespaceURI && namespaceURI !== "http://www.w3.org/1999/xhtml"
311
+ ? document.createElementNS(namespaceURI, tagName)
312
+ : document.createElement(tagName)
313
+ oldParent.insertBefore(newEmptyChild, insertionPoint)
314
+ morphNode(newEmptyChild, newChild)
315
+ insertionPoint = newEmptyChild.nextSibling
316
+ } else {
317
+ const newClonedChild = document.importNode(newChild, true)
318
+ oldParent.insertBefore(newClonedChild, insertionPoint)
319
+ insertionPoint = newClonedChild.nextSibling
218
320
  }
219
- insertionPoint ??= oldParent.firstChild;
220
- for (const newChild of newParent.childNodes) {
221
- if (insertionPoint && insertionPoint !== endPoint) {
222
- const bestMatch = findBestMatch(newChild, insertionPoint, endPoint);
223
- if (bestMatch) {
224
- if (bestMatch !== insertionPoint) {
225
- let cursor = insertionPoint;
226
- while (cursor && cursor !== bestMatch) {
227
- const tempNode = cursor;
228
- cursor = cursor.nextSibling;
229
- removeNode(tempNode);
230
- }
231
- }
232
- morphNode(bestMatch, newChild);
233
- insertionPoint = bestMatch.nextSibling;
234
- continue;
235
- }
236
- }
237
- if (newChild instanceof Element && ctxPersistentIds.has(newChild.id)) {
238
- const movedChild = document.getElementById(newChild.id);
239
- let current = movedChild;
240
- while ((current = current.parentNode)) {
241
- const idSet = ctxIdMap.get(current);
242
- if (idSet) {
243
- idSet.delete(newChild.id);
244
- if (!idSet.size) {
245
- ctxIdMap.delete(current);
246
- }
247
- }
248
- }
249
- moveBefore(oldParent, movedChild, insertionPoint);
250
- morphNode(movedChild, newChild);
251
- insertionPoint = movedChild.nextSibling;
252
- continue;
253
- }
254
- if (ctxIdMap.has(newChild)) {
255
- const namespaceURI = newChild.namespaceURI;
256
- const tagName = newChild.tagName;
257
- const newEmptyChild = namespaceURI && namespaceURI !== "http://www.w3.org/1999/xhtml"
258
- ? document.createElementNS(namespaceURI, tagName)
259
- : document.createElement(tagName);
260
- oldParent.insertBefore(newEmptyChild, insertionPoint);
261
- morphNode(newEmptyChild, newChild);
262
- insertionPoint = newEmptyChild.nextSibling;
263
- }
264
- else {
265
- const newClonedChild = document.importNode(newChild, true);
266
- oldParent.insertBefore(newClonedChild, insertionPoint);
267
- insertionPoint = newClonedChild.nextSibling;
268
- }
321
+ }
322
+
323
+ while (insertionPoint && insertionPoint !== endPoint) {
324
+ const tempNode = insertionPoint
325
+ insertionPoint = insertionPoint.nextSibling
326
+ removeNode(tempNode)
327
+ }
328
+ }
329
+
330
+ const findBestMatch = (node, startPoint, endPoint) => {
331
+ let bestMatch = null
332
+ let nextSibling = node.nextSibling
333
+ let siblingSoftMatchCount = 0
334
+ let displaceMatchCount = 0
335
+
336
+ const nodeMatchCount = ctxIdMap.get(node)?.size || 0
337
+
338
+ let cursor = startPoint
339
+ while (cursor && cursor !== endPoint) {
340
+ if (isSoftMatch(cursor, node)) {
341
+ let isIdSetMatch = false
342
+ const oldSet = ctxIdMap.get(cursor)
343
+ const newSet = ctxIdMap.get(node)
344
+
345
+ if (newSet && oldSet) {
346
+ for (const id of oldSet) {
347
+ if (newSet.has(id)) {
348
+ isIdSetMatch = true
349
+ break
350
+ }
351
+ }
352
+ }
353
+
354
+ if (isIdSetMatch) {
355
+ return cursor
356
+ }
357
+
358
+ if (!bestMatch && !ctxIdMap.has(cursor)) {
359
+ if (!nodeMatchCount) {
360
+ return cursor
361
+ }
362
+ bestMatch = cursor
363
+ }
269
364
  }
270
- while (insertionPoint && insertionPoint !== endPoint) {
271
- const tempNode = insertionPoint;
272
- insertionPoint = insertionPoint.nextSibling;
273
- removeNode(tempNode);
365
+
366
+ displaceMatchCount += ctxIdMap.get(cursor)?.size || 0
367
+ if (displaceMatchCount > nodeMatchCount) {
368
+ break
274
369
  }
275
- };
276
- const findBestMatch = (node, startPoint, endPoint) => {
277
- let bestMatch = null;
278
- let nextSibling = node.nextSibling;
279
- let siblingSoftMatchCount = 0;
280
- let displaceMatchCount = 0;
281
- const nodeMatchCount = ctxIdMap.get(node)?.size || 0;
282
- let cursor = startPoint;
283
- while (cursor && cursor !== endPoint) {
284
- if (isSoftMatch(cursor, node)) {
285
- let isIdSetMatch = false;
286
- const oldSet = ctxIdMap.get(cursor);
287
- const newSet = ctxIdMap.get(node);
288
- if (newSet && oldSet) {
289
- for (const id of oldSet) {
290
- if (newSet.has(id)) {
291
- isIdSetMatch = true;
292
- break;
293
- }
294
- }
295
- }
296
- if (isIdSetMatch) {
297
- return cursor;
298
- }
299
- if (!bestMatch && !ctxIdMap.has(cursor)) {
300
- if (!nodeMatchCount) {
301
- return cursor;
302
- }
303
- bestMatch = cursor;
304
- }
305
- }
306
- displaceMatchCount += ctxIdMap.get(cursor)?.size || 0;
307
- if (displaceMatchCount > nodeMatchCount) {
308
- break;
309
- }
310
- if (bestMatch === null && nextSibling && isSoftMatch(cursor, nextSibling)) {
311
- siblingSoftMatchCount++;
312
- nextSibling = nextSibling.nextSibling;
313
- if (siblingSoftMatchCount >= 2) {
314
- bestMatch = undefined;
315
- }
316
- }
317
- cursor = cursor.nextSibling;
370
+
371
+ if (bestMatch === null && nextSibling && isSoftMatch(cursor, nextSibling)) {
372
+ siblingSoftMatchCount++
373
+ nextSibling = nextSibling.nextSibling
374
+
375
+ if (siblingSoftMatchCount >= 2) {
376
+ bestMatch = undefined
377
+ }
318
378
  }
319
- return bestMatch || null;
320
- };
321
- const isSoftMatch = (oldNode, newNode) => oldNode.nodeType === newNode.nodeType &&
322
- oldNode.tagName === newNode.tagName &&
323
- (!oldNode.id || oldNode.id === newNode.id);
379
+
380
+ cursor = cursor.nextSibling
381
+ }
382
+
383
+ return bestMatch || null
384
+ }
385
+
386
+ const isSoftMatch = (oldNode, newNode) =>
387
+ oldNode.nodeType === newNode.nodeType &&
388
+ (oldNode).tagName === (newNode).tagName &&
389
+ (!(oldNode).id || (oldNode).id === (newNode).id)
390
+
324
391
  const removeNode = (node) => {
325
- ctxIdMap.has(node) ? moveBefore(ctxPantry, node, null) : node.parentNode?.removeChild(node);
326
- };
327
- const moveBefore =
328
- // @ts-expect-error
329
- removeNode.call.bind(ctxPantry.moveBefore ?? ctxPantry.insertBefore);
330
- const aliasedPreserveAttr = aliasify("preserve-attr");
392
+ ctxIdMap.has(node) ? moveBefore(ctxPantry, node, null) : node.parentNode?.removeChild(node)
393
+ }
394
+
395
+ const moveBefore =
396
+ // @ts-expect-error
397
+ removeNode.call.bind(ctxPantry.moveBefore ?? ctxPantry.insertBefore)
398
+
399
+ const aliasedPreserveAttr = aliasify("preserve-attr")
400
+
331
401
  const morphNode = (oldNode, newNode) => {
332
- const type = newNode.nodeType;
333
- if (type === 1) {
334
- const oldElt = oldNode;
335
- const newElt = newNode;
336
- const shouldScopeChildren = oldElt.hasAttribute("data-scope-children");
337
- if (oldElt.hasAttribute(aliasedIgnoreMorph) && newElt.hasAttribute(aliasedIgnoreMorph)) {
338
- return oldNode;
339
- }
340
- if (oldElt instanceof HTMLInputElement &&
341
- newElt instanceof HTMLInputElement &&
342
- newElt.type !== "file") {
343
- if (newElt.getAttribute("value") !== oldElt.getAttribute("value")) {
344
- oldElt.value = newElt.getAttribute("value") ?? "";
345
- }
346
- }
347
- else if (oldElt instanceof HTMLTextAreaElement && newElt instanceof HTMLTextAreaElement) {
348
- if (newElt.value !== oldElt.value) {
349
- oldElt.value = newElt.value;
350
- }
351
- if (oldElt.firstChild && oldElt.firstChild.nodeValue !== newElt.value) {
352
- oldElt.firstChild.nodeValue = newElt.value;
353
- }
354
- }
355
- const preserveAttrs = (newNode.getAttribute(aliasedPreserveAttr) ?? "").split(" ");
356
- for (const { name, value } of newElt.attributes) {
357
- if (oldElt.getAttribute(name) !== value && !preserveAttrs.includes(name)) {
358
- oldElt.setAttribute(name, value);
359
- }
360
- }
361
- for (let i = oldElt.attributes.length - 1; i >= 0; i--) {
362
- const { name } = oldElt.attributes[i];
363
- if (!newElt.hasAttribute(name) && !preserveAttrs.includes(name)) {
364
- oldElt.removeAttribute(name);
365
- }
366
- }
367
- if (shouldScopeChildren && !oldElt.hasAttribute("data-scope-children")) {
368
- oldElt.setAttribute("data-scope-children", "");
369
- }
370
- if (!oldElt.isEqualNode(newElt)) {
371
- morphChildren(oldElt, newElt);
372
- }
373
- if (shouldScopeChildren) {
374
- oldElt.dispatchEvent(new CustomEvent("datastar:scope-children", { bubbles: false }));
375
- }
402
+ const type = newNode.nodeType
403
+
404
+ if (type === 1) {
405
+ const oldElt = oldNode
406
+ const newElt = newNode
407
+ const shouldScopeChildren = oldElt.hasAttribute("data-scope-children")
408
+ if (oldElt.hasAttribute(aliasedIgnoreMorph) && newElt.hasAttribute(aliasedIgnoreMorph)) {
409
+ return oldNode
376
410
  }
377
- if (type === 8 || type === 3) {
378
- if (oldNode.nodeValue !== newNode.nodeValue) {
379
- oldNode.nodeValue = newNode.nodeValue;
380
- }
411
+
412
+ if (
413
+ oldElt instanceof HTMLInputElement &&
414
+ newElt instanceof HTMLInputElement &&
415
+ newElt.type !== "file"
416
+ ) {
417
+ if (newElt.getAttribute("value") !== oldElt.getAttribute("value")) {
418
+ oldElt.value = newElt.getAttribute("value") ?? ""
419
+ }
420
+ } else if (oldElt instanceof HTMLTextAreaElement && newElt instanceof HTMLTextAreaElement) {
421
+ if (newElt.value !== oldElt.value) {
422
+ oldElt.value = newElt.value
423
+ }
424
+ if (oldElt.firstChild && oldElt.firstChild.nodeValue !== newElt.value) {
425
+ oldElt.firstChild.nodeValue = newElt.value
426
+ }
381
427
  }
382
- return oldNode;
383
- };
384
- const populateIdMapWithTree = (root, elements) => {
385
- for (const elt of elements) {
386
- if (ctxPersistentIds.has(elt.id)) {
387
- let current = elt;
388
- while (current && current !== root) {
389
- let idSet = ctxIdMap.get(current);
390
- if (!idSet) {
391
- idSet = new Set();
392
- ctxIdMap.set(current, idSet);
393
- }
394
- idSet.add(elt.id);
395
- current = current.parentElement;
396
- }
397
- }
428
+
429
+ const preserveAttrs = ((newNode).getAttribute(aliasedPreserveAttr) ?? "").split(
430
+ " ",
431
+ )
432
+
433
+ for (const { name, value } of newElt.attributes) {
434
+ if (oldElt.getAttribute(name) !== value && !preserveAttrs.includes(name)) {
435
+ oldElt.setAttribute(name, value)
436
+ }
437
+ }
438
+
439
+ for (let i = oldElt.attributes.length - 1; i >= 0; i--) {
440
+ const { name } = oldElt.attributes[i]
441
+ if (!newElt.hasAttribute(name) && !preserveAttrs.includes(name)) {
442
+ oldElt.removeAttribute(name)
443
+ }
444
+ }
445
+
446
+ if (shouldScopeChildren && !oldElt.hasAttribute("data-scope-children")) {
447
+ oldElt.setAttribute("data-scope-children", "")
398
448
  }
399
- };
449
+
450
+ if (!oldElt.isEqualNode(newElt)) {
451
+ morphChildren(oldElt, newElt)
452
+ }
453
+
454
+ if (shouldScopeChildren) {
455
+ oldElt.dispatchEvent(new CustomEvent("datastar:scope-children", { bubbles: false }))
456
+ }
457
+ }
458
+
459
+ if (type === 8 || type === 3) {
460
+ if (oldNode.nodeValue !== newNode.nodeValue) {
461
+ oldNode.nodeValue = newNode.nodeValue
462
+ }
463
+ }
464
+
465
+ return oldNode
466
+ }
467
+
468
+ const populateIdMapWithTree = (
469
+ root,
470
+ elements,
471
+ ) => {
472
+ for (const elt of elements) {
473
+ if (ctxPersistentIds.has(elt.id)) {
474
+ let current = elt
475
+ while (current && current !== root) {
476
+ let idSet = ctxIdMap.get(current)
477
+ if (!idSet) {
478
+ idSet = new Set()
479
+ ctxIdMap.set(current, idSet)
480
+ }
481
+ idSet.add(elt.id)
482
+ current = current.parentElement
483
+ }
484
+ }
485
+ }
486
+ }