effect-start 0.25.0 → 0.26.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 (117) hide show
  1. package/package.json +18 -86
  2. package/dist/ChildProcess.js +0 -42
  3. package/dist/Commander.js +0 -410
  4. package/dist/ContentNegotiation.js +0 -465
  5. package/dist/Cookies.js +0 -371
  6. package/dist/Development.js +0 -94
  7. package/dist/Effectify.js +0 -27
  8. package/dist/Entity.js +0 -289
  9. package/dist/Fetch.js +0 -192
  10. package/dist/FilePathPattern.js +0 -97
  11. package/dist/FileRouter.js +0 -204
  12. package/dist/FileRouterCodegen.js +0 -298
  13. package/dist/FileSystem.js +0 -132
  14. package/dist/Http.js +0 -107
  15. package/dist/PathPattern.js +0 -451
  16. package/dist/PlatformError.js +0 -40
  17. package/dist/PlatformRuntime.js +0 -71
  18. package/dist/Route.js +0 -143
  19. package/dist/RouteBody.js +0 -92
  20. package/dist/RouteError.js +0 -76
  21. package/dist/RouteHook.js +0 -64
  22. package/dist/RouteHttp.js +0 -367
  23. package/dist/RouteHttpTracer.js +0 -90
  24. package/dist/RouteMount.js +0 -86
  25. package/dist/RouteSchema.js +0 -271
  26. package/dist/RouteSse.js +0 -94
  27. package/dist/RouteTree.js +0 -119
  28. package/dist/RouteTrie.js +0 -179
  29. package/dist/SchemaExtra.js +0 -99
  30. package/dist/Socket.js +0 -40
  31. package/dist/SqlIntrospect.js +0 -515
  32. package/dist/Start.js +0 -79
  33. package/dist/StartApp.js +0 -3
  34. package/dist/StreamExtra.js +0 -135
  35. package/dist/System.js +0 -38
  36. package/dist/TuplePathPattern.js +0 -74
  37. package/dist/Unique.js +0 -226
  38. package/dist/Values.js +0 -52
  39. package/dist/bun/BunBundle.js +0 -186
  40. package/dist/bun/BunChildProcessSpawner.js +0 -142
  41. package/dist/bun/BunImportTrackerPlugin.js +0 -91
  42. package/dist/bun/BunRoute.js +0 -157
  43. package/dist/bun/BunRuntime.js +0 -41
  44. package/dist/bun/BunServer.js +0 -285
  45. package/dist/bun/BunVirtualFilesPlugin.js +0 -54
  46. package/dist/bun/_BunEnhancedResolve.js +0 -127
  47. package/dist/bun/index.js +0 -5
  48. package/dist/bundler/Bundle.js +0 -92
  49. package/dist/bundler/BundleFiles.js +0 -154
  50. package/dist/bundler/BundleRoute.js +0 -62
  51. package/dist/client/Overlay.js +0 -33
  52. package/dist/client/ScrollState.js +0 -106
  53. package/dist/client/index.js +0 -97
  54. package/dist/console/Console.js +0 -42
  55. package/dist/console/ConsoleErrors.js +0 -211
  56. package/dist/console/ConsoleLogger.js +0 -56
  57. package/dist/console/ConsoleMetrics.js +0 -72
  58. package/dist/console/ConsoleProcess.js +0 -59
  59. package/dist/console/ConsoleStore.js +0 -72
  60. package/dist/console/ConsoleTracer.js +0 -107
  61. package/dist/console/Simulation.js +0 -784
  62. package/dist/console/index.js +0 -3
  63. package/dist/console/routes/tree.js +0 -30
  64. package/dist/datastar/actions/fetch.js +0 -536
  65. package/dist/datastar/actions/peek.js +0 -13
  66. package/dist/datastar/actions/setAll.js +0 -19
  67. package/dist/datastar/actions/toggleAll.js +0 -19
  68. package/dist/datastar/attributes/attr.js +0 -49
  69. package/dist/datastar/attributes/bind.js +0 -194
  70. package/dist/datastar/attributes/class.js +0 -54
  71. package/dist/datastar/attributes/computed.js +0 -25
  72. package/dist/datastar/attributes/effect.js +0 -10
  73. package/dist/datastar/attributes/indicator.js +0 -33
  74. package/dist/datastar/attributes/init.js +0 -27
  75. package/dist/datastar/attributes/jsonSignals.js +0 -33
  76. package/dist/datastar/attributes/on.js +0 -81
  77. package/dist/datastar/attributes/onIntersect.js +0 -53
  78. package/dist/datastar/attributes/onInterval.js +0 -31
  79. package/dist/datastar/attributes/onSignalPatch.js +0 -51
  80. package/dist/datastar/attributes/ref.js +0 -11
  81. package/dist/datastar/attributes/show.js +0 -32
  82. package/dist/datastar/attributes/signals.js +0 -18
  83. package/dist/datastar/attributes/style.js +0 -57
  84. package/dist/datastar/attributes/text.js +0 -29
  85. package/dist/datastar/engine.js +0 -1145
  86. package/dist/datastar/index.js +0 -25
  87. package/dist/datastar/utils.js +0 -250
  88. package/dist/datastar/watchers/patchElements.js +0 -486
  89. package/dist/datastar/watchers/patchSignals.js +0 -14
  90. package/dist/experimental/EncryptedCookies.js +0 -328
  91. package/dist/experimental/index.js +0 -1
  92. package/dist/hyper/Hyper.js +0 -28
  93. package/dist/hyper/HyperHtml.js +0 -165
  94. package/dist/hyper/HyperNode.js +0 -13
  95. package/dist/hyper/HyperRoute.js +0 -45
  96. package/dist/hyper/html.js +0 -30
  97. package/dist/hyper/index.js +0 -5
  98. package/dist/hyper/jsx-runtime.js +0 -14
  99. package/dist/index.js +0 -8
  100. package/dist/node/NodeFileSystem.js +0 -675
  101. package/dist/node/NodeUtils.js +0 -23
  102. package/dist/sql/Sql.js +0 -8
  103. package/dist/sql/bun/index.js +0 -142
  104. package/dist/sql/index.js +0 -1
  105. package/dist/sql/libsql/index.js +0 -156
  106. package/dist/sql/mssql/docker.js +0 -110
  107. package/dist/sql/mssql/index.js +0 -194
  108. package/dist/testing/TestLogger.js +0 -42
  109. package/dist/testing/index.js +0 -2
  110. package/dist/testing/utils.js +0 -61
  111. package/dist/x/cloudflare/CloudflareTunnel.js +0 -63
  112. package/dist/x/cloudflare/index.js +0 -1
  113. package/dist/x/tailscale/TailscaleTunnel.js +0 -94
  114. package/dist/x/tailscale/index.js +0 -1
  115. package/dist/x/tailwind/TailwindPlugin.js +0 -294
  116. package/dist/x/tailwind/compile.js +0 -210
  117. package/dist/x/tailwind/plugin.js +0 -17
@@ -1,3 +0,0 @@
1
- export * as Console from "./Console.js"
2
- export * as ConsoleStore from "./ConsoleStore.js"
3
- export * as Simulation from "./Simulation.js"
@@ -1,30 +0,0 @@
1
- import * as Route from "../../Route.js"
2
- import errorsRoute from "./errors/route.tsx"
3
- import fiberDetailRoute from "./fiberDetail.tsx"
4
- import fibersRoute from "./fibers/route.tsx"
5
- import gitRoute from "./git/route.tsx"
6
- import layout from "./layout.tsx"
7
- import logsRoute from "./logs/route.tsx"
8
- import metricsRoute from "./metrics/route.tsx"
9
- import systemRoute from "./system/route.tsx"
10
- import rootRoute from "./route.tsx"
11
- import routesRoute from "./routes/route.tsx"
12
- import servicesRoute from "./services/route.tsx"
13
- import traceDetailRoute from "./traceDetail.tsx"
14
- import tracesRoute from "./traces/route.tsx"
15
-
16
- export default Route.tree({
17
- "*": layout,
18
- "/": rootRoute,
19
- "/traces": tracesRoute,
20
- "/traces/:id": traceDetailRoute,
21
- "/metrics": metricsRoute,
22
- "/logs": logsRoute,
23
- "/errors": errorsRoute,
24
- "/fibers": fibersRoute,
25
- "/fibers/:id": fiberDetailRoute,
26
- "/routes": routesRoute,
27
- "/system": systemRoute,
28
- "/services": servicesRoute,
29
- "/git": gitRoute,
30
- })
@@ -1,536 +0,0 @@
1
- import {
2
- action,
3
- DATASTAR_FETCH_EVENT,
4
- filtered,
5
- startPeeking,
6
- stopPeeking,
7
- } from "../engine.js"
8
- import { kebab } from "../utils.js"
9
-
10
- const createHttpMethod = (
11
- name,
12
- method,
13
- openWhenHiddenDefault = true,
14
- ) =>
15
- action({
16
- name,
17
- apply: async (
18
- { el, evt, error, cleanups },
19
- url,
20
- {
21
- selector,
22
- headers: userHeaders,
23
- contentType = "json",
24
- filterSignals: { include = /.*/, exclude = /(^|\.)_/ } = {},
25
- openWhenHidden = openWhenHiddenDefault,
26
- payload,
27
- requestCancellation = "auto",
28
- retry = "auto",
29
- retryInterval = 1_000,
30
- retryScaler = 2,
31
- retryMaxWaitMs = 30_000,
32
- retryMaxCount = 10,
33
- } = {},
34
- ) => {
35
- const controller =
36
- requestCancellation instanceof AbortController ? requestCancellation : new AbortController()
37
- if (requestCancellation === "auto") {
38
- cleanups.get(`@${name}`)?.()
39
- cleanups.set(`@${name}`, async () => {
40
- controller.abort()
41
- await Promise.resolve()
42
- })
43
- }
44
-
45
- let cleanupFn = null
46
-
47
- try {
48
- if (!url?.length) {
49
- throw error("FetchNoUrlProvided", { action })
50
- }
51
-
52
- const initialHeaders = {
53
- Accept: "text/event-stream, text/html, application/json",
54
- "Datastar-Request": true,
55
- }
56
- if (contentType === "json") {
57
- initialHeaders["Content-Type"] = "application/json"
58
- }
59
- const headers = Object.assign({}, initialHeaders, userHeaders)
60
-
61
- const req = {
62
- method,
63
- headers,
64
- openWhenHidden,
65
- retry,
66
- retryInterval,
67
- retryScaler,
68
- retryMaxWaitMs,
69
- retryMaxCount,
70
- signal: controller.signal,
71
- onopen: async (response) => {
72
- if (response.status >= 400) {
73
- dispatchFetch(ERROR, el, { status: response.status.toString() })
74
- }
75
- },
76
- onmessage: (evt) => {
77
- if (!evt.event.startsWith("datastar")) return
78
- const type = evt.event
79
- const argsRawLines = {}
80
-
81
- for (const line of evt.data.split("\n")) {
82
- const i = line.indexOf(" ")
83
- const k = line.slice(0, i)
84
- const v = line.slice(i + 1)
85
- ;(argsRawLines[k] ||= []).push(v)
86
- }
87
-
88
- const argsRaw = Object.fromEntries(
89
- Object.entries(argsRawLines).map(([k, v]) => [k, v.join("\n")]),
90
- )
91
-
92
- dispatchFetch(type, el, argsRaw)
93
- },
94
- onerror: (error) => {
95
- if (isWrongContent(error)) {
96
- throw error("FetchExpectedTextEventStream", { url })
97
- }
98
- if (error) {
99
- console.error(error.message)
100
- dispatchFetch(RETRYING, el, { message: error.message })
101
- }
102
- },
103
- }
104
-
105
- const urlInstance = new URL(url, document.baseURI)
106
- const queryParams = new URLSearchParams(urlInstance.search)
107
-
108
- if (contentType === "json") {
109
- startPeeking()
110
- payload = payload !== undefined ? payload : filtered({ include, exclude })
111
- stopPeeking()
112
- const body = JSON.stringify(payload)
113
- if (method === "GET") {
114
- queryParams.set("datastar", body)
115
- } else {
116
- req.body = body
117
- }
118
- } else if (contentType === "form") {
119
- const formEl = (
120
- selector ? document.querySelector(selector) : el.closest("form")
121
- )
122
- if (!formEl) {
123
- throw error("FetchFormNotFound", { action, selector })
124
- }
125
-
126
- if (!formEl.noValidate && !formEl.checkValidity()) {
127
- formEl.reportValidity()
128
- return
129
- }
130
-
131
- const formData = new FormData(formEl)
132
- let submitter = el
133
-
134
- if (el === formEl && evt instanceof SubmitEvent) {
135
- submitter = evt.submitter
136
- } else {
137
- const preventDefault = (evt) => evt.preventDefault()
138
- formEl.addEventListener("submit", preventDefault)
139
- cleanupFn = () => {
140
- formEl.removeEventListener("submit", preventDefault)
141
- }
142
- }
143
-
144
- if (submitter instanceof HTMLButtonElement) {
145
- const name = submitter.getAttribute("name")
146
- if (name) formData.append(name, submitter.value)
147
- }
148
-
149
- const multipart = formEl.getAttribute("enctype") === "multipart/form-data"
150
- if (!multipart) {
151
- headers["Content-Type"] = "application/x-www-form-urlencoded"
152
- }
153
-
154
- const formParams = new URLSearchParams(formData)
155
- if (method === "GET") {
156
- for (const [key, value] of formParams) {
157
- queryParams.append(key, value)
158
- }
159
- } else if (multipart) {
160
- req.body = formData
161
- } else {
162
- req.body = formParams
163
- }
164
- } else {
165
- throw error("FetchInvalidContentType", { action, contentType })
166
- }
167
-
168
- dispatchFetch(STARTED, el, {})
169
- urlInstance.search = queryParams.toString()
170
-
171
- try {
172
- await fetchEventSource(urlInstance.toString(), el, req)
173
- } catch (e) {
174
- if (!isWrongContent(e)) {
175
- throw error("FetchFailed", { method, url, error: e.message })
176
- }
177
- }
178
- } finally {
179
- dispatchFetch(FINISHED, el, {})
180
- cleanupFn?.()
181
- cleanups.delete(`@${name}`)
182
- }
183
- },
184
- })
185
-
186
- createHttpMethod("get", "GET", false)
187
- createHttpMethod("patch", "PATCH")
188
- createHttpMethod("post", "POST")
189
- createHttpMethod("put", "PUT")
190
- createHttpMethod("delete", "DELETE")
191
-
192
- export const STARTED = "started"
193
- export const FINISHED = "finished"
194
- export const ERROR = "error"
195
- export const RETRYING = "retrying"
196
- export const RETRIES_FAILED = "retries-failed"
197
-
198
- const dispatchFetch = (type, el, argsRaw) =>
199
- document.dispatchEvent(
200
- new CustomEvent(DATASTAR_FETCH_EVENT, {
201
- detail: { type, el, argsRaw },
202
- }),
203
- )
204
-
205
- const isWrongContent = (err) => `${err}`.includes("text/event-stream")
206
-
207
- const getBytes = async (
208
- stream,
209
- onChunk,
210
- ) => {
211
- const reader = stream.getReader()
212
- let result = await reader.read()
213
- while (!result.done) {
214
- onChunk(result.value)
215
- result = await reader.read()
216
- }
217
- }
218
-
219
- const getLines = (onLine) => {
220
- let buffer
221
- let position
222
- let fieldLength
223
- let discardTrailingNewline = false
224
-
225
- return (arr) => {
226
- if (!buffer) {
227
- buffer = arr
228
- position = 0
229
- fieldLength = -1
230
- } else {
231
- buffer = concat(buffer, arr)
232
- }
233
-
234
- const bufLength = buffer.length
235
- let lineStart = 0
236
- while (position < bufLength) {
237
- if (discardTrailingNewline) {
238
- if (buffer[position] === 10) lineStart = ++position
239
- discardTrailingNewline = false
240
- }
241
-
242
- let lineEnd = -1
243
- for (; position < bufLength && lineEnd === -1; ++position) {
244
- switch (buffer[position]) {
245
- case 58:
246
- if (fieldLength === -1) {
247
- fieldLength = position - lineStart
248
- }
249
- break
250
- // @ts-expect-error:7029
251
- case 13:
252
- discardTrailingNewline = true
253
- case 10:
254
- lineEnd = position
255
- break
256
- }
257
- }
258
-
259
- if (lineEnd === -1) break
260
-
261
- onLine(buffer.subarray(lineStart, lineEnd), fieldLength)
262
- lineStart = position
263
- fieldLength = -1
264
- }
265
-
266
- if (lineStart === bufLength) buffer = undefined
267
- else if (lineStart) {
268
- buffer = buffer.subarray(lineStart)
269
- position -= lineStart
270
- }
271
- }
272
- }
273
-
274
- const getMessages = (
275
- onId,
276
- onRetry,
277
- onMessage,
278
- ) => {
279
- let message = newMessage()
280
- const decoder = new TextDecoder()
281
-
282
- return (line, fieldLength) => {
283
- if (!line.length) {
284
- onMessage?.(message)
285
- message = newMessage()
286
- } else if (fieldLength > 0) {
287
- const field = decoder.decode(line.subarray(0, fieldLength))
288
- const valueOffset = fieldLength + (line[fieldLength + 1] === 32 ? 2 : 1)
289
- const value = decoder.decode(line.subarray(valueOffset))
290
-
291
- switch (field) {
292
- case "data":
293
- message.data = message.data ? `${message.data}\n${value}` : value
294
- break
295
- case "event":
296
- message.event = value
297
- break
298
- case "id":
299
- onId((message.id = value))
300
- break
301
- case "retry": {
302
- const retry = +value
303
- if (!Number.isNaN(retry)) {
304
- onRetry((message.retry = retry))
305
- }
306
- break
307
- }
308
- }
309
- }
310
- }
311
- }
312
-
313
- const concat = (a, b) => {
314
- const res = new Uint8Array(a.length + b.length)
315
- res.set(a)
316
- res.set(b, a.length)
317
- return res
318
- }
319
-
320
- const newMessage = () => ({
321
- data: "",
322
- event: "",
323
- id: "",
324
- retry: undefined,
325
- })
326
-
327
- const fetchEventSource = (
328
- input,
329
- el,
330
- {
331
- signal: inputSignal,
332
- headers: inputHeaders,
333
- onopen: inputOnOpen,
334
- onmessage,
335
- onclose,
336
- onerror,
337
- openWhenHidden,
338
- fetch: inputFetch,
339
- retry = "auto",
340
- retryInterval = 1_000,
341
- retryScaler = 2,
342
- retryMaxWaitMs = 30_000,
343
- retryMaxCount = 10,
344
- responseOverrides,
345
- ...rest
346
- },
347
- ) => {
348
- return new Promise((resolve, reject) => {
349
- const headers = {
350
- ...inputHeaders,
351
- }
352
-
353
- let curRequestController
354
- const onVisibilityChange = () => {
355
- curRequestController.abort()
356
- if (!document.hidden) create()
357
- }
358
-
359
- if (!openWhenHidden) {
360
- document.addEventListener("visibilitychange", onVisibilityChange)
361
- }
362
-
363
- let retryTimer
364
- const dispose = () => {
365
- document.removeEventListener("visibilitychange", onVisibilityChange)
366
- clearTimeout(retryTimer)
367
- curRequestController.abort()
368
- }
369
-
370
- inputSignal?.addEventListener("abort", () => {
371
- dispose()
372
- resolve()
373
- })
374
-
375
- const fetch = inputFetch || window.fetch
376
- const onopen = inputOnOpen || (() => {})
377
-
378
- let retries = 0
379
- let baseRetryInterval = retryInterval
380
- const create = async () => {
381
- curRequestController = new AbortController()
382
- const curRequestSignal = curRequestController.signal
383
- try {
384
- const response = await fetch(input, {
385
- ...rest,
386
- headers,
387
- signal: curRequestSignal,
388
- })
389
-
390
- await onopen(response)
391
-
392
- const dispatchNonSSE = async (
393
- dispatchType,
394
- response,
395
- name,
396
- responseOverrides,
397
- ...argNames
398
- ) => {
399
- const argsRaw = {
400
- [name]: await response.text(),
401
- }
402
- for (const n of argNames) {
403
- let v = response.headers.get(`datastar-${kebab(n)}`)
404
- if (responseOverrides) {
405
- const o = (responseOverrides)[n]
406
- if (o) v = typeof o === "string" ? o : JSON.stringify(o)
407
- }
408
- if (v) argsRaw[n] = v
409
- }
410
-
411
- dispatchFetch(dispatchType, el, argsRaw)
412
- dispose()
413
- resolve()
414
- }
415
-
416
- const status = response.status
417
- const isNoContentStatus = status === 204
418
- const isRedirectStatus = status >= 300 && status < 400
419
- const isErrorStatus = status >= 400 && status < 600
420
-
421
- if (status !== 200) {
422
- onclose?.()
423
- if (
424
- retry !== "never" &&
425
- !isNoContentStatus &&
426
- !isRedirectStatus &&
427
- (retry === "always" || (retry === "error" && isErrorStatus))
428
- ) {
429
- clearTimeout(retryTimer)
430
- retryTimer = setTimeout(create, retryInterval)
431
- return
432
- }
433
- dispose()
434
- resolve()
435
- return
436
- }
437
-
438
- retries = 0
439
- retryInterval = baseRetryInterval
440
-
441
- const ct = response.headers.get("Content-Type")
442
- if (ct?.includes("text/html")) {
443
- return await dispatchNonSSE(
444
- "datastar-patch-elements",
445
- response,
446
- "elements",
447
- responseOverrides,
448
- "selector",
449
- "mode",
450
- "namespace",
451
- "useViewTransition",
452
- "namespace",
453
- )
454
- }
455
-
456
- if (ct?.includes("application/json")) {
457
- return await dispatchNonSSE(
458
- "datastar-patch-signals",
459
- response,
460
- "signals",
461
- responseOverrides,
462
- "onlyIfMissing",
463
- )
464
- }
465
-
466
- if (ct?.includes("text/javascript")) {
467
- const script = document.createElement("script")
468
- const scriptAttributesHeader = response.headers.get("datastar-script-attributes")
469
-
470
- if (scriptAttributesHeader) {
471
- for (const [name, value] of Object.entries(JSON.parse(scriptAttributesHeader))) {
472
- script.setAttribute(name, value)
473
- }
474
- }
475
- script.textContent = await response.text()
476
- document.head.appendChild(script)
477
- dispose()
478
- return
479
- }
480
-
481
- await getBytes(
482
- response.body,
483
- getLines(
484
- getMessages(
485
- (id) => {
486
- if (id) {
487
- headers["last-event-id"] = id
488
- } else {
489
- delete headers["last-event-id"]
490
- }
491
- },
492
- (retry) => {
493
- baseRetryInterval = retryInterval = retry
494
- },
495
- onmessage,
496
- ),
497
- ),
498
- )
499
-
500
- onclose?.()
501
-
502
- if (retry === "always" && !isRedirectStatus) {
503
- clearTimeout(retryTimer)
504
- retryTimer = setTimeout(create, retryInterval)
505
- return
506
- }
507
-
508
- dispose()
509
- resolve()
510
- } catch (err) {
511
- if (!curRequestSignal.aborted) {
512
- try {
513
- const interval = onerror?.(err) || retryInterval
514
- clearTimeout(retryTimer)
515
- retryTimer = setTimeout(create, interval)
516
- retryInterval = Math.min(retryInterval * retryScaler, retryMaxWaitMs)
517
- if (++retries >= retryMaxCount) {
518
- dispatchFetch(RETRIES_FAILED, el, {})
519
- dispose()
520
- reject("Max retries reached.")
521
- } else {
522
- console.error(
523
- `Datastar failed to reach ${input.toString()} retrying in ${interval}ms.`,
524
- )
525
- }
526
- } catch (innerErr) {
527
- dispose()
528
- reject(innerErr)
529
- }
530
- }
531
- }
532
- }
533
-
534
- create()
535
- })
536
- }
@@ -1,13 +0,0 @@
1
- import { action, startPeeking, stopPeeking } from "../engine.js"
2
-
3
- action({
4
- name: "peek",
5
- apply(_, fn) {
6
- startPeeking()
7
- try {
8
- return fn()
9
- } finally {
10
- stopPeeking()
11
- }
12
- },
13
- })
@@ -1,19 +0,0 @@
1
- import {
2
- action,
3
- filtered,
4
- mergePatch,
5
- startPeeking,
6
- stopPeeking,
7
- } from "../engine.js"
8
- import { updateLeaves } from "../utils.js"
9
-
10
- action({
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,19 +0,0 @@
1
- import {
2
- action,
3
- filtered,
4
- mergePatch,
5
- startPeeking,
6
- stopPeeking,
7
- } from "../engine.js"
8
- import { updateLeaves } from "../utils.js"
9
-
10
- action({
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,49 +0,0 @@
1
- import { attribute, effect } from "../engine.js"
2
-
3
- attribute({
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
- })