sigmx 0.1.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.
- package/LICENSE +21 -0
- package/README.md +173 -0
- package/dist/auto.d.ts +1 -0
- package/dist/auto.js +7 -0
- package/dist/auto.js.map +7 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +26 -0
- package/dist/cli.js.map +7 -0
- package/dist/core/csp.d.ts +7 -0
- package/dist/core/csp.js +20 -0
- package/dist/core/csp.js.map +7 -0
- package/dist/core/engine.d.ts +10 -0
- package/dist/core/engine.js +200 -0
- package/dist/core/engine.js.map +7 -0
- package/dist/core/expr.d.ts +12 -0
- package/dist/core/expr.js +94 -0
- package/dist/core/expr.js.map +7 -0
- package/dist/core/index.d.ts +16 -0
- package/dist/core/index.js +46 -0
- package/dist/core/index.js.map +7 -0
- package/dist/core/signals.d.ts +42 -0
- package/dist/core/signals.js +195 -0
- package/dist/core/signals.js.map +7 -0
- package/dist/core/store.d.ts +32 -0
- package/dist/core/store.js +185 -0
- package/dist/core/store.js.map +7 -0
- package/dist/core/types.d.ts +101 -0
- package/dist/core/types.js +1 -0
- package/dist/core/types.js.map +7 -0
- package/dist/kernel/compile.d.ts +16 -0
- package/dist/kernel/compile.js +96 -0
- package/dist/kernel/compile.js.map +7 -0
- package/dist/kernel/contracts.d.ts +121 -0
- package/dist/kernel/contracts.js +1 -0
- package/dist/kernel/contracts.js.map +7 -0
- package/dist/kernel/index.d.ts +20 -0
- package/dist/kernel/index.js +54 -0
- package/dist/kernel/index.js.map +7 -0
- package/dist/kernel/precompile.d.ts +25 -0
- package/dist/kernel/precompile.js +111 -0
- package/dist/kernel/precompile.js.map +7 -0
- package/dist/kernel/precompiled.d.ts +11 -0
- package/dist/kernel/precompiled.js +13 -0
- package/dist/kernel/precompiled.js.map +7 -0
- package/dist/kernel/reactive.d.ts +42 -0
- package/dist/kernel/reactive.js +201 -0
- package/dist/kernel/reactive.js.map +7 -0
- package/dist/kernel/runtime.d.ts +11 -0
- package/dist/kernel/runtime.js +210 -0
- package/dist/kernel/runtime.js.map +7 -0
- package/dist/kernel/scan.d.ts +42 -0
- package/dist/kernel/scan.js +68 -0
- package/dist/kernel/scan.js.map +7 -0
- package/dist/kernel/state.d.ts +32 -0
- package/dist/kernel/state.js +186 -0
- package/dist/kernel/state.js.map +7 -0
- package/dist/kernel/strict-csp.d.ts +7 -0
- package/dist/kernel/strict-csp.js +20 -0
- package/dist/kernel/strict-csp.js.map +7 -0
- package/dist/lib/casing.d.ts +7 -0
- package/dist/lib/casing.js +16 -0
- package/dist/lib/casing.js.map +7 -0
- package/dist/lib/objects.d.ts +9 -0
- package/dist/lib/objects.js +26 -0
- package/dist/lib/objects.js.map +7 -0
- package/dist/lib/schedule.d.ts +14 -0
- package/dist/lib/schedule.js +51 -0
- package/dist/lib/schedule.js.map +7 -0
- package/dist/lib/sse.d.ts +10 -0
- package/dist/lib/sse.js +55 -0
- package/dist/lib/sse.js.map +7 -0
- package/dist/plugins/actions/clipboard.d.ts +2 -0
- package/dist/plugins/actions/clipboard.js +11 -0
- package/dist/plugins/actions/clipboard.js.map +7 -0
- package/dist/plugins/actions/fit.d.ts +2 -0
- package/dist/plugins/actions/fit.js +14 -0
- package/dist/plugins/actions/fit.js.map +7 -0
- package/dist/plugins/actions/intl.d.ts +2 -0
- package/dist/plugins/actions/intl.js +21 -0
- package/dist/plugins/actions/intl.js.map +7 -0
- package/dist/plugins/actions/peek.d.ts +2 -0
- package/dist/plugins/actions/peek.js +6 -0
- package/dist/plugins/actions/peek.js.map +7 -0
- package/dist/plugins/actions/setAll.d.ts +2 -0
- package/dist/plugins/actions/setAll.js +11 -0
- package/dist/plugins/actions/setAll.js.map +7 -0
- package/dist/plugins/actions/toggleAll.d.ts +2 -0
- package/dist/plugins/actions/toggleAll.js +11 -0
- package/dist/plugins/actions/toggleAll.js.map +7 -0
- package/dist/plugins/attributes/attr.d.ts +2 -0
- package/dist/plugins/attributes/attr.js +20 -0
- package/dist/plugins/attributes/attr.js.map +7 -0
- package/dist/plugins/attributes/bind.d.ts +6 -0
- package/dist/plugins/attributes/bind.js +81 -0
- package/dist/plugins/attributes/bind.js.map +7 -0
- package/dist/plugins/attributes/class.d.ts +2 -0
- package/dist/plugins/attributes/class.js +22 -0
- package/dist/plugins/attributes/class.js.map +7 -0
- package/dist/plugins/attributes/computed.d.ts +2 -0
- package/dist/plugins/attributes/computed.js +20 -0
- package/dist/plugins/attributes/computed.js.map +7 -0
- package/dist/plugins/attributes/customValidity.d.ts +2 -0
- package/dist/plugins/attributes/customValidity.js +14 -0
- package/dist/plugins/attributes/customValidity.js.map +7 -0
- package/dist/plugins/attributes/effect.d.ts +2 -0
- package/dist/plugins/attributes/effect.js +12 -0
- package/dist/plugins/attributes/effect.js.map +7 -0
- package/dist/plugins/attributes/indicator.d.ts +2 -0
- package/dist/plugins/attributes/indicator.js +20 -0
- package/dist/plugins/attributes/indicator.js.map +7 -0
- package/dist/plugins/attributes/init.d.ts +2 -0
- package/dist/plugins/attributes/init.js +14 -0
- package/dist/plugins/attributes/init.js.map +7 -0
- package/dist/plugins/attributes/jsonSignals.d.ts +2 -0
- package/dist/plugins/attributes/jsonSignals.js +15 -0
- package/dist/plugins/attributes/jsonSignals.js.map +7 -0
- package/dist/plugins/attributes/matchMedia.d.ts +2 -0
- package/dist/plugins/attributes/matchMedia.js +19 -0
- package/dist/plugins/attributes/matchMedia.js.map +7 -0
- package/dist/plugins/attributes/on.d.ts +5 -0
- package/dist/plugins/attributes/on.js +28 -0
- package/dist/plugins/attributes/on.js.map +7 -0
- package/dist/plugins/attributes/onIntersect.d.ts +2 -0
- package/dist/plugins/attributes/onIntersect.js +28 -0
- package/dist/plugins/attributes/onIntersect.js.map +7 -0
- package/dist/plugins/attributes/onInterval.d.ts +2 -0
- package/dist/plugins/attributes/onInterval.js +18 -0
- package/dist/plugins/attributes/onInterval.js.map +7 -0
- package/dist/plugins/attributes/onRaf.d.ts +1 -0
- package/dist/plugins/attributes/onRaf.js +19 -0
- package/dist/plugins/attributes/onRaf.js.map +7 -0
- package/dist/plugins/attributes/onResize.d.ts +1 -0
- package/dist/plugins/attributes/onResize.js +17 -0
- package/dist/plugins/attributes/onResize.js.map +7 -0
- package/dist/plugins/attributes/onSignalPatch.d.ts +5 -0
- package/dist/plugins/attributes/onSignalPatch.js +35 -0
- package/dist/plugins/attributes/onSignalPatch.js.map +7 -0
- package/dist/plugins/attributes/persist.d.ts +6 -0
- package/dist/plugins/attributes/persist.js +16 -0
- package/dist/plugins/attributes/persist.js.map +7 -0
- package/dist/plugins/attributes/queryString.d.ts +5 -0
- package/dist/plugins/attributes/queryString.js +54 -0
- package/dist/plugins/attributes/queryString.js.map +7 -0
- package/dist/plugins/attributes/ref.d.ts +2 -0
- package/dist/plugins/attributes/ref.js +13 -0
- package/dist/plugins/attributes/ref.js.map +7 -0
- package/dist/plugins/attributes/replaceUrl.d.ts +1 -0
- package/dist/plugins/attributes/replaceUrl.js +11 -0
- package/dist/plugins/attributes/replaceUrl.js.map +7 -0
- package/dist/plugins/attributes/scrollIntoView.d.ts +2 -0
- package/dist/plugins/attributes/scrollIntoView.js +19 -0
- package/dist/plugins/attributes/scrollIntoView.js.map +7 -0
- package/dist/plugins/attributes/show.d.ts +2 -0
- package/dist/plugins/attributes/show.js +19 -0
- package/dist/plugins/attributes/show.js.map +7 -0
- package/dist/plugins/attributes/signals.d.ts +2 -0
- package/dist/plugins/attributes/signals.js +13 -0
- package/dist/plugins/attributes/signals.js.map +7 -0
- package/dist/plugins/attributes/style.d.ts +2 -0
- package/dist/plugins/attributes/style.js +25 -0
- package/dist/plugins/attributes/style.js.map +7 -0
- package/dist/plugins/attributes/text.d.ts +1 -0
- package/dist/plugins/attributes/text.js +13 -0
- package/dist/plugins/attributes/text.js.map +7 -0
- package/dist/plugins/attributes/viewTransition.d.ts +1 -0
- package/dist/plugins/attributes/viewTransition.js +11 -0
- package/dist/plugins/attributes/viewTransition.js.map +7 -0
- package/dist/plugins/directives/attribute-sync.d.ts +2 -0
- package/dist/plugins/directives/attribute-sync.js +20 -0
- package/dist/plugins/directives/attribute-sync.js.map +7 -0
- package/dist/plugins/directives/boost.d.ts +6 -0
- package/dist/plugins/directives/boost.js +35 -0
- package/dist/plugins/directives/boost.js.map +7 -0
- package/dist/plugins/directives/busy-flag.d.ts +2 -0
- package/dist/plugins/directives/busy-flag.js +21 -0
- package/dist/plugins/directives/busy-flag.js.map +7 -0
- package/dist/plugins/directives/class-toggle.d.ts +2 -0
- package/dist/plugins/directives/class-toggle.js +22 -0
- package/dist/plugins/directives/class-toggle.js.map +7 -0
- package/dist/plugins/directives/cloak.d.ts +5 -0
- package/dist/plugins/directives/cloak.js +11 -0
- package/dist/plugins/directives/cloak.js.map +7 -0
- package/dist/plugins/directives/collapse.d.ts +5 -0
- package/dist/plugins/directives/collapse.js +42 -0
- package/dist/plugins/directives/collapse.js.map +7 -0
- package/dist/plugins/directives/declare.d.ts +2 -0
- package/dist/plugins/directives/declare.js +13 -0
- package/dist/plugins/directives/declare.js.map +7 -0
- package/dist/plugins/directives/derive.d.ts +2 -0
- package/dist/plugins/directives/derive.js +20 -0
- package/dist/plugins/directives/derive.js.map +7 -0
- package/dist/plugins/directives/element-ref.d.ts +2 -0
- package/dist/plugins/directives/element-ref.js +13 -0
- package/dist/plugins/directives/element-ref.js.map +7 -0
- package/dist/plugins/directives/event-listener.d.ts +5 -0
- package/dist/plugins/directives/event-listener.js +28 -0
- package/dist/plugins/directives/event-listener.js.map +7 -0
- package/dist/plugins/directives/frame-loop.d.ts +1 -0
- package/dist/plugins/directives/frame-loop.js +19 -0
- package/dist/plugins/directives/frame-loop.js.map +7 -0
- package/dist/plugins/directives/html.d.ts +2 -0
- package/dist/plugins/directives/html.js +13 -0
- package/dist/plugins/directives/html.js.map +7 -0
- package/dist/plugins/directives/inline-style.d.ts +2 -0
- package/dist/plugins/directives/inline-style.js +25 -0
- package/dist/plugins/directives/inline-style.js.map +7 -0
- package/dist/plugins/directives/mask.d.ts +7 -0
- package/dist/plugins/directives/mask.js +47 -0
- package/dist/plugins/directives/mask.js.map +7 -0
- package/dist/plugins/directives/media-query.d.ts +2 -0
- package/dist/plugins/directives/media-query.js +19 -0
- package/dist/plugins/directives/media-query.js.map +7 -0
- package/dist/plugins/directives/on-mount.d.ts +2 -0
- package/dist/plugins/directives/on-mount.js +14 -0
- package/dist/plugins/directives/on-mount.js.map +7 -0
- package/dist/plugins/directives/patch-listener.d.ts +5 -0
- package/dist/plugins/directives/patch-listener.js +35 -0
- package/dist/plugins/directives/patch-listener.js.map +7 -0
- package/dist/plugins/directives/remove-me.d.ts +2 -0
- package/dist/plugins/directives/remove-me.js +13 -0
- package/dist/plugins/directives/remove-me.js.map +7 -0
- package/dist/plugins/directives/scroll-to.d.ts +2 -0
- package/dist/plugins/directives/scroll-to.js +19 -0
- package/dist/plugins/directives/scroll-to.js.map +7 -0
- package/dist/plugins/directives/size-watch.d.ts +1 -0
- package/dist/plugins/directives/size-watch.js +17 -0
- package/dist/plugins/directives/size-watch.js.map +7 -0
- package/dist/plugins/directives/state-dump.d.ts +2 -0
- package/dist/plugins/directives/state-dump.js +15 -0
- package/dist/plugins/directives/state-dump.js.map +7 -0
- package/dist/plugins/directives/storage-sync.d.ts +6 -0
- package/dist/plugins/directives/storage-sync.js +16 -0
- package/dist/plugins/directives/storage-sync.js.map +7 -0
- package/dist/plugins/directives/teleport.d.ts +5 -0
- package/dist/plugins/directives/teleport.js +19 -0
- package/dist/plugins/directives/teleport.js.map +7 -0
- package/dist/plugins/directives/text-content.d.ts +1 -0
- package/dist/plugins/directives/text-content.js +13 -0
- package/dist/plugins/directives/text-content.js.map +7 -0
- package/dist/plugins/directives/timer.d.ts +2 -0
- package/dist/plugins/directives/timer.js +18 -0
- package/dist/plugins/directives/timer.js.map +7 -0
- package/dist/plugins/directives/transition-name.d.ts +1 -0
- package/dist/plugins/directives/transition-name.js +11 -0
- package/dist/plugins/directives/transition-name.js.map +7 -0
- package/dist/plugins/directives/transition.d.ts +5 -0
- package/dist/plugins/directives/transition.js +40 -0
- package/dist/plugins/directives/transition.js.map +7 -0
- package/dist/plugins/directives/trap.d.ts +5 -0
- package/dist/plugins/directives/trap.js +48 -0
- package/dist/plugins/directives/trap.js.map +7 -0
- package/dist/plugins/directives/tween.d.ts +6 -0
- package/dist/plugins/directives/tween.js +58 -0
- package/dist/plugins/directives/tween.js.map +7 -0
- package/dist/plugins/directives/two-way-bind.d.ts +6 -0
- package/dist/plugins/directives/two-way-bind.js +82 -0
- package/dist/plugins/directives/two-way-bind.js.map +7 -0
- package/dist/plugins/directives/url-params.d.ts +13 -0
- package/dist/plugins/directives/url-params.js +76 -0
- package/dist/plugins/directives/url-params.js.map +7 -0
- package/dist/plugins/directives/url-replace.d.ts +1 -0
- package/dist/plugins/directives/url-replace.js +11 -0
- package/dist/plugins/directives/url-replace.js.map +7 -0
- package/dist/plugins/directives/validity.d.ts +2 -0
- package/dist/plugins/directives/validity.js +14 -0
- package/dist/plugins/directives/validity.js.map +7 -0
- package/dist/plugins/directives/viewport.d.ts +2 -0
- package/dist/plugins/directives/viewport.js +28 -0
- package/dist/plugins/directives/viewport.js.map +7 -0
- package/dist/plugins/directives/visibility.d.ts +2 -0
- package/dist/plugins/directives/visibility.js +19 -0
- package/dist/plugins/directives/visibility.js.map +7 -0
- package/dist/plugins/directives/watch.d.ts +2 -0
- package/dist/plugins/directives/watch.js +12 -0
- package/dist/plugins/directives/watch.js.map +7 -0
- package/dist/plugins/functions/bulk-set.d.ts +2 -0
- package/dist/plugins/functions/bulk-set.js +11 -0
- package/dist/plugins/functions/bulk-set.js.map +7 -0
- package/dist/plugins/functions/bulk-toggle.d.ts +2 -0
- package/dist/plugins/functions/bulk-toggle.js +11 -0
- package/dist/plugins/functions/bulk-toggle.js.map +7 -0
- package/dist/plugins/functions/confirm.d.ts +2 -0
- package/dist/plugins/functions/confirm.js +6 -0
- package/dist/plugins/functions/confirm.js.map +7 -0
- package/dist/plugins/functions/copy-text.d.ts +2 -0
- package/dist/plugins/functions/copy-text.js +11 -0
- package/dist/plugins/functions/copy-text.js.map +7 -0
- package/dist/plugins/functions/dispatch.d.ts +2 -0
- package/dist/plugins/functions/dispatch.js +9 -0
- package/dist/plugins/functions/dispatch.js.map +7 -0
- package/dist/plugins/functions/locale-format.d.ts +2 -0
- package/dist/plugins/functions/locale-format.js +21 -0
- package/dist/plugins/functions/locale-format.js.map +7 -0
- package/dist/plugins/functions/range-map.d.ts +2 -0
- package/dist/plugins/functions/range-map.js +14 -0
- package/dist/plugins/functions/range-map.js.map +7 -0
- package/dist/plugins/functions/request.d.ts +30 -0
- package/dist/plugins/functions/request.js +152 -0
- package/dist/plugins/functions/request.js.map +7 -0
- package/dist/plugins/functions/untracked-read.d.ts +2 -0
- package/dist/plugins/functions/untracked-read.js +6 -0
- package/dist/plugins/functions/untracked-read.js.map +7 -0
- package/dist/plugins/functions/websocket.d.ts +11 -0
- package/dist/plugins/functions/websocket.js +35 -0
- package/dist/plugins/functions/websocket.js.map +7 -0
- package/dist/plugins/index.d.ts +52 -0
- package/dist/plugins/index.js +108 -0
- package/dist/plugins/index.js.map +7 -0
- package/dist/plugins/server-events/apply-elements.d.ts +2 -0
- package/dist/plugins/server-events/apply-elements.js +62 -0
- package/dist/plugins/server-events/apply-elements.js.map +7 -0
- package/dist/plugins/server-events/apply-state.d.ts +2 -0
- package/dist/plugins/server-events/apply-state.js +18 -0
- package/dist/plugins/server-events/apply-state.js.map +7 -0
- package/dist/plugins/server-events/morph.d.ts +12 -0
- package/dist/plugins/server-events/morph.js +124 -0
- package/dist/plugins/server-events/morph.js.map +7 -0
- package/dist/presets/all.d.ts +3 -0
- package/dist/presets/all.js +112 -0
- package/dist/presets/all.js.map +7 -0
- package/dist/presets/essentials.d.ts +3 -0
- package/dist/presets/essentials.js +18 -0
- package/dist/presets/essentials.js.map +7 -0
- package/dist/presets/minimal.d.ts +3 -0
- package/dist/presets/minimal.js +9 -0
- package/dist/presets/minimal.js.map +7 -0
- package/dist/sigmx.auto.js +5 -0
- package/dist/sigmx.standalone.js +1 -0
- package/dist/standalone.d.ts +1 -0
- package/dist/standalone.js +8 -0
- package/dist/standalone.js.map +7 -0
- package/dist/utils/object.d.ts +9 -0
- package/dist/utils/object.js +26 -0
- package/dist/utils/object.js.map +7 -0
- package/dist/utils/text.d.ts +7 -0
- package/dist/utils/text.js +15 -0
- package/dist/utils/text.js.map +7 -0
- package/dist/utils/timing.d.ts +14 -0
- package/dist/utils/timing.js +58 -0
- package/dist/utils/timing.js.map +7 -0
- package/dist/vite.d.ts +42 -0
- package/dist/vite.js +79 -0
- package/dist/vite.js.map +7 -0
- package/package.json +111 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/plugins/functions/request.ts"],
|
|
4
|
+
"sourcesContent": ["import { action, untracked, type ActionCtx, type Filter } from '../../kernel/index.js'\nimport { camel } from '../../lib/casing.js'\nimport { parseFields, readEvents } from '../../lib/sse.js'\n\nexport type RequestOptions = {\n headers?: Record<string, string>\n /** 'json' (default) sends filtered signals; 'form' serialises the closest (or `selector`) form. */\n contentType?: 'json' | 'form'\n selector?: string\n /** Which signals to send. Default: everything except paths starting with `_`. */\n filter?: Filter\n /** Explicit body instead of signals. */\n payload?: unknown\n /** 'replace' (default) aborts an earlier request with the same method and URL; 'none' lets them overlap. */\n abort?: 'replace' | 'none' | AbortController\n /** Keep the connection open while the tab is hidden. Default: true except for GET streams. */\n openWhenHidden?: boolean\n /** Reconnect after a stream closes normally (long-lived event streams). */\n reconnect?: boolean\n retry?: { attempts?: number; interval?: number; factor?: number; max?: number; onStatusError?: boolean }\n}\n\nconst inflight = new Map<string, AbortController>()\nlet seq = 0\nconst sleep = (ms: number, signal: AbortSignal) =>\n new Promise<void>((resolve) => {\n const t = setTimeout(resolve, ms)\n signal.addEventListener('abort', () => (clearTimeout(t), resolve()), { once: true })\n })\nconst untilVisible = () =>\n new Promise<void>((resolve) => document.addEventListener('visibilitychange', () => !document.hidden && resolve(), { once: true }))\n\nconst headerArgs = (res: Response, names: string[], data: Record<string, string>) => {\n for (const n of names) {\n const v = res.headers.get(`sigmx-${n}`)\n if (v) data[camel(n)] = v\n }\n return data\n}\n\nconst runScript = (text: string) => {\n const s = document.createElement('script')\n s.text = text\n document.head.append(s)\n s.remove()\n}\n\nconst send = async (method: string, ctx: ActionCtx, url: string, o: RequestOptions = {}): Promise<void> => {\n const { el, evt, store, runtime, error } = ctx\n if (!url) throw error(`@${method.toLowerCase()} needs a URL`)\n const key = `${method} ${url}`\n const ac = o.abort instanceof AbortController ? o.abort : new AbortController()\n if (o.abort !== 'none') {\n inflight.get(key)?.abort()\n inflight.set(key, ac)\n }\n ctx.cleanup(() => ac.abort())\n const rid = ++seq\n const emit = (type: string, extra: Record<string, unknown> = {}) => runtime.emit('fetch', { el, type, method, url, rid, ...extra })\n const retry = { attempts: 5, interval: 1000, factor: 2, max: 30_000, onStatusError: false, ...o.retry }\n const pauseWhenHidden = !(o.openWhenHidden ?? method !== 'GET')\n const bodyAllowed = method !== 'GET' && method !== 'DELETE'\n\n const build = (): { url: string; init: RequestInit } | undefined => {\n const u = new URL(url, location.href)\n const headers: Record<string, string> = {\n Accept: 'text/event-stream, text/html, application/json',\n 'Sigmx-Request': 'true',\n ...o.headers,\n }\n let body: BodyInit | undefined\n if ((o.contentType ?? 'json') === 'json') {\n const payload = o.payload ?? untracked(() => store.snapshot(o.filter ?? { exclude: /(^|\\.)_/ }))\n const json = JSON.stringify(payload)\n if (bodyAllowed) {\n body = json\n headers['Content-Type'] ??= 'application/json'\n } else u.searchParams.set('sigmx', json)\n } else {\n const form = (o.selector ? document.querySelector(o.selector) : el.closest('form')) as HTMLFormElement | null\n if (!form) throw error('no form found', { selector: o.selector })\n if (!form.noValidate && !form.checkValidity()) {\n form.reportValidity()\n return\n }\n const submitter = evt instanceof SubmitEvent ? evt.submitter : el instanceof HTMLButtonElement ? el : null\n const fd = new FormData(form, submitter)\n const multipart = form.enctype === 'multipart/form-data'\n if (bodyAllowed) {\n body = multipart ? fd : new URLSearchParams(fd as unknown as Record<string, string>)\n if (!multipart) headers['Content-Type'] = 'application/x-www-form-urlencoded'\n } else {\n for (const [k, v] of new URLSearchParams(fd as unknown as Record<string, string>)) u.searchParams.append(k, v)\n }\n }\n return { url: u.toString(), init: { method, headers, body } }\n }\n\n const route = (event: string, data: string) => {\n const fields = parseFields(data)\n runtime.emit('server-event', { el, event, data: fields })\n runtime.handle(event, fields)\n }\n\n let attempt = 0\n let wait = retry.interval\n let lastId: string | undefined\n const backoff = async () => {\n if (attempt++ >= retry.attempts) throw new Error('retries exhausted')\n emit('retrying', { attempt })\n await sleep(wait, ac.signal)\n wait = Math.min(wait * retry.factor, retry.max)\n }\n\n emit('started')\n try {\n while (!ac.signal.aborted) {\n const req = build()\n if (!req) return\n if (lastId) (req.init.headers as Record<string, string>)['Last-Event-ID'] = lastId\n const hide = new AbortController()\n const onHide = () => document.hidden && hide.abort()\n if (pauseWhenHidden) document.addEventListener('visibilitychange', onHide)\n try {\n const res = await fetch(req.url, { ...req.init, signal: AbortSignal.any([ac.signal, hide.signal]) })\n const ct = res.headers.get('content-type') ?? ''\n if (res.status >= 400) {\n emit('error', { status: res.status })\n if (!retry.onStatusError) return\n await backoff()\n continue\n }\n if (res.status === 204 || res.status === 304 || !res.body) return\n if (ct.includes('text/event-stream')) {\n attempt = 0\n wait = retry.interval\n await readEvents(res.body, (e) => {\n if (e.id !== undefined) lastId = e.id\n if (e.retry) wait = retry.interval = e.retry\n route(e.event, e.data)\n })\n if (!o.reconnect) return\n await backoff()\n continue\n }\n const text = await res.text()\n if (ct.includes('text/html')) runtime.handle('patch-elements', headerArgs(res, ['selector', 'mode', 'use-view-transition'], { elements: text }))\n else if (ct.includes('application/json')) runtime.handle('patch-signals', headerArgs(res, ['only-if-missing'], { signals: text }))\n else if (ct.includes('javascript')) runScript(text)\n return\n } catch {\n if (ac.signal.aborted) return\n if (hide.signal.aborted) await untilVisible()\n else await backoff()\n } finally {\n document.removeEventListener('visibilitychange', onHide)\n }\n }\n } catch (e: any) {\n emit('error', { message: e?.message })\n throw error(`${method} ${url}: ${e?.message ?? e}`)\n } finally {\n emit('finished')\n if (inflight.get(key) === ac) inflight.delete(key)\n }\n}\n\nconst make = (name: string, method: string) => action({ name, call: (ctx, url: string, o?: RequestOptions) => send(method, ctx, url, o) })\n\n/** `@get(url, options)`: signals travel in the `sigmx` query parameter. */\nexport const httpGet = make('get', 'GET')\nexport const httpPost = make('post', 'POST')\nexport const httpPut = make('put', 'PUT')\nexport const httpPatch = make('patch', 'PATCH')\nexport const httpDelete = make('delete', 'DELETE')\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/plugins/functions/untracked-read.ts"],
|
|
4
|
+
"sourcesContent": ["import { action, untracked } from '../../kernel/index.js'\n\n/** `@peek(() => $x)` reads signals without subscribing the surrounding effect. */\nexport const peek = action({ name: 'peek', call: (_, fn: () => unknown) => untracked(fn) })\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,QAAQ,iBAAiB;AAG3B,MAAM,OAAO,OAAO,EAAE,MAAM,QAAQ,MAAM,CAAC,GAAG,OAAsB,UAAU,EAAE,EAAE,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type Socket = {
|
|
2
|
+
send(data: unknown): void;
|
|
3
|
+
close(): void;
|
|
4
|
+
readonly socket: WebSocket;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* `@ws('/live')` opens a WebSocket and routes incoming messages like a server event stream: text
|
|
8
|
+
* blocks of `event: name` and `data: key value` lines, separated by blank lines. Returns
|
|
9
|
+
* `{ send, close, socket }`; `send` JSON-encodes objects. The socket closes when the element unmounts.
|
|
10
|
+
*/
|
|
11
|
+
export declare const websocket: import("../../kernel/contracts.js").ActionPlugin;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { action } from "../../kernel/index.js";
|
|
2
|
+
const websocket = action({
|
|
3
|
+
name: "ws",
|
|
4
|
+
call({ el, runtime, cleanup }, url, o = {}) {
|
|
5
|
+
const socket = new WebSocket(new URL(url, location.href.replace(/^http/, "ws")), o.protocols);
|
|
6
|
+
socket.onmessage = (m) => {
|
|
7
|
+
for (const block of String(m.data).split(/\n\n+/)) {
|
|
8
|
+
let event = "message";
|
|
9
|
+
const data = {};
|
|
10
|
+
for (const line of block.split("\n")) {
|
|
11
|
+
const i = line.indexOf(":");
|
|
12
|
+
if (i < 0) continue;
|
|
13
|
+
const field = line.slice(0, i);
|
|
14
|
+
const v = line.slice(i + 1).trimStart();
|
|
15
|
+
if (field === "event") event = v;
|
|
16
|
+
else if (field === "data") {
|
|
17
|
+
const j = v.indexOf(" ");
|
|
18
|
+
const k = j < 0 ? v : v.slice(0, j);
|
|
19
|
+
const val = j < 0 ? "" : v.slice(j + 1);
|
|
20
|
+
data[k] = k in data ? `${data[k]}
|
|
21
|
+
${val}` : val;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
runtime.emit("server-event", { el, event, data });
|
|
25
|
+
runtime.handle(event, data);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
cleanup(() => socket.close());
|
|
29
|
+
return { send: (d) => socket.send(typeof d === "string" ? d : JSON.stringify(d)), close: () => socket.close(), socket };
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
export {
|
|
33
|
+
websocket
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=websocket.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/plugins/functions/websocket.ts"],
|
|
4
|
+
"sourcesContent": ["import { action } from '../../kernel/index.js'\n\nexport type Socket = { send(data: unknown): void; close(): void; readonly socket: WebSocket }\n\n/**\n * `@ws('/live')` opens a WebSocket and routes incoming messages like a server event stream: text\n * blocks of `event: name` and `data: key value` lines, separated by blank lines. Returns\n * `{ send, close, socket }`; `send` JSON-encodes objects. The socket closes when the element unmounts.\n */\nexport const websocket = action({\n name: 'ws',\n call({ el, runtime, cleanup }, url: string, o: { protocols?: string | string[] } = {}): Socket {\n const socket = new WebSocket(new URL(url, location.href.replace(/^http/, 'ws')), o.protocols)\n socket.onmessage = (m) => {\n for (const block of String(m.data).split(/\\n\\n+/)) {\n let event = 'message'\n const data: Record<string, string> = {}\n for (const line of block.split('\\n')) {\n const i = line.indexOf(':')\n if (i < 0) continue\n const field = line.slice(0, i)\n const v = line.slice(i + 1).trimStart()\n if (field === 'event') event = v\n else if (field === 'data') {\n const j = v.indexOf(' ')\n const k = j < 0 ? v : v.slice(0, j)\n const val = j < 0 ? '' : v.slice(j + 1)\n data[k] = k in data ? `${data[k]}\\n${val}` : val\n }\n }\n runtime.emit('server-event', { el, event, data })\n runtime.handle(event, data)\n }\n }\n cleanup(() => socket.close())\n return { send: (d) => socket.send(typeof d === 'string' ? d : JSON.stringify(d)), close: () => socket.close(), socket }\n },\n})\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,cAAc;AAShB,MAAM,YAAY,OAAO;AAAA,EAC9B,MAAM;AAAA,EACN,KAAK,EAAE,IAAI,SAAS,QAAQ,GAAG,KAAa,IAAuC,CAAC,GAAW;AAC7F,UAAM,SAAS,IAAI,UAAU,IAAI,IAAI,KAAK,SAAS,KAAK,QAAQ,SAAS,IAAI,CAAC,GAAG,EAAE,SAAS;AAC5F,WAAO,YAAY,CAAC,MAAM;AACxB,iBAAW,SAAS,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,GAAG;AACjD,YAAI,QAAQ;AACZ,cAAM,OAA+B,CAAC;AACtC,mBAAW,QAAQ,MAAM,MAAM,IAAI,GAAG;AACpC,gBAAM,IAAI,KAAK,QAAQ,GAAG;AAC1B,cAAI,IAAI,EAAG;AACX,gBAAM,QAAQ,KAAK,MAAM,GAAG,CAAC;AAC7B,gBAAM,IAAI,KAAK,MAAM,IAAI,CAAC,EAAE,UAAU;AACtC,cAAI,UAAU,QAAS,SAAQ;AAAA,mBACtB,UAAU,QAAQ;AACzB,kBAAM,IAAI,EAAE,QAAQ,GAAG;AACvB,kBAAM,IAAI,IAAI,IAAI,IAAI,EAAE,MAAM,GAAG,CAAC;AAClC,kBAAM,MAAM,IAAI,IAAI,KAAK,EAAE,MAAM,IAAI,CAAC;AACtC,iBAAK,CAAC,IAAI,KAAK,OAAO,GAAG,KAAK,CAAC,CAAC;AAAA,EAAK,GAAG,KAAK;AAAA,UAC/C;AAAA,QACF;AACA,gBAAQ,KAAK,gBAAgB,EAAE,IAAI,OAAO,KAAK,CAAC;AAChD,gBAAQ,OAAO,OAAO,IAAI;AAAA,MAC5B;AAAA,IACF;AACA,YAAQ,MAAM,OAAO,MAAM,CAAC;AAC5B,WAAO,EAAE,MAAM,CAAC,MAAM,OAAO,KAAK,OAAO,MAAM,WAAW,IAAI,KAAK,UAAU,CAAC,CAAC,GAAG,OAAO,MAAM,OAAO,MAAM,GAAG,OAAO;AAAA,EACxH;AACF,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export { attr } from './directives/attribute-sync.js';
|
|
2
|
+
export { bind } from './directives/two-way-bind.js';
|
|
3
|
+
export { className } from './directives/class-toggle.js';
|
|
4
|
+
export { computed } from './directives/derive.js';
|
|
5
|
+
export { customValidity } from './directives/validity.js';
|
|
6
|
+
export { effect } from './directives/watch.js';
|
|
7
|
+
export { indicator } from './directives/busy-flag.js';
|
|
8
|
+
export { init } from './directives/on-mount.js';
|
|
9
|
+
export { jsonSignals } from './directives/state-dump.js';
|
|
10
|
+
export { matchMedia } from './directives/media-query.js';
|
|
11
|
+
export { on } from './directives/event-listener.js';
|
|
12
|
+
export { onIntersect } from './directives/viewport.js';
|
|
13
|
+
export { onInterval } from './directives/timer.js';
|
|
14
|
+
export { onRaf } from './directives/frame-loop.js';
|
|
15
|
+
export { onResize } from './directives/size-watch.js';
|
|
16
|
+
export { onSignalPatch } from './directives/patch-listener.js';
|
|
17
|
+
export { persist } from './directives/storage-sync.js';
|
|
18
|
+
export { queryString } from './directives/url-params.js';
|
|
19
|
+
export { ref } from './directives/element-ref.js';
|
|
20
|
+
export { replaceUrl } from './directives/url-replace.js';
|
|
21
|
+
export { scrollIntoView } from './directives/scroll-to.js';
|
|
22
|
+
export { show } from './directives/visibility.js';
|
|
23
|
+
export { signals } from './directives/declare.js';
|
|
24
|
+
export { style } from './directives/inline-style.js';
|
|
25
|
+
export { text } from './directives/text-content.js';
|
|
26
|
+
export { viewTransition } from './directives/transition-name.js';
|
|
27
|
+
export { clipboard } from './functions/copy-text.js';
|
|
28
|
+
export { fit } from './functions/range-map.js';
|
|
29
|
+
export { intl } from './functions/locale-format.js';
|
|
30
|
+
export { peek } from './functions/untracked-read.js';
|
|
31
|
+
export { setAll } from './functions/bulk-set.js';
|
|
32
|
+
export { toggleAll } from './functions/bulk-toggle.js';
|
|
33
|
+
export { animate } from './directives/tween.js';
|
|
34
|
+
export { httpDelete, httpGet, httpPatch, httpPost, httpPut } from './functions/request.js';
|
|
35
|
+
export type { RequestOptions } from './functions/request.js';
|
|
36
|
+
export { applyElements } from './server-events/apply-elements.js';
|
|
37
|
+
export { applyState } from './server-events/apply-state.js';
|
|
38
|
+
export { activateScripts, morph, morphInner } from './server-events/morph.js';
|
|
39
|
+
export type { MorphOptions } from './server-events/morph.js';
|
|
40
|
+
export { boost } from './directives/boost.js';
|
|
41
|
+
export { cloak } from './directives/cloak.js';
|
|
42
|
+
export { collapse } from './directives/collapse.js';
|
|
43
|
+
export { html } from './directives/html.js';
|
|
44
|
+
export { applyMask, mask } from './directives/mask.js';
|
|
45
|
+
export { removeMe } from './directives/remove-me.js';
|
|
46
|
+
export { teleport } from './directives/teleport.js';
|
|
47
|
+
export { transition } from './directives/transition.js';
|
|
48
|
+
export { trap } from './directives/trap.js';
|
|
49
|
+
export { confirm } from './functions/confirm.js';
|
|
50
|
+
export { dispatch } from './functions/dispatch.js';
|
|
51
|
+
export { websocket } from './functions/websocket.js';
|
|
52
|
+
export type { Socket } from './functions/websocket.js';
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { attr } from "./directives/attribute-sync.js";
|
|
2
|
+
import { bind } from "./directives/two-way-bind.js";
|
|
3
|
+
import { className } from "./directives/class-toggle.js";
|
|
4
|
+
import { computed } from "./directives/derive.js";
|
|
5
|
+
import { customValidity } from "./directives/validity.js";
|
|
6
|
+
import { effect } from "./directives/watch.js";
|
|
7
|
+
import { indicator } from "./directives/busy-flag.js";
|
|
8
|
+
import { init } from "./directives/on-mount.js";
|
|
9
|
+
import { jsonSignals } from "./directives/state-dump.js";
|
|
10
|
+
import { matchMedia } from "./directives/media-query.js";
|
|
11
|
+
import { on } from "./directives/event-listener.js";
|
|
12
|
+
import { onIntersect } from "./directives/viewport.js";
|
|
13
|
+
import { onInterval } from "./directives/timer.js";
|
|
14
|
+
import { onRaf } from "./directives/frame-loop.js";
|
|
15
|
+
import { onResize } from "./directives/size-watch.js";
|
|
16
|
+
import { onSignalPatch } from "./directives/patch-listener.js";
|
|
17
|
+
import { persist } from "./directives/storage-sync.js";
|
|
18
|
+
import { queryString } from "./directives/url-params.js";
|
|
19
|
+
import { ref } from "./directives/element-ref.js";
|
|
20
|
+
import { replaceUrl } from "./directives/url-replace.js";
|
|
21
|
+
import { scrollIntoView } from "./directives/scroll-to.js";
|
|
22
|
+
import { show } from "./directives/visibility.js";
|
|
23
|
+
import { signals } from "./directives/declare.js";
|
|
24
|
+
import { style } from "./directives/inline-style.js";
|
|
25
|
+
import { text } from "./directives/text-content.js";
|
|
26
|
+
import { viewTransition } from "./directives/transition-name.js";
|
|
27
|
+
import { clipboard } from "./functions/copy-text.js";
|
|
28
|
+
import { fit } from "./functions/range-map.js";
|
|
29
|
+
import { intl } from "./functions/locale-format.js";
|
|
30
|
+
import { peek } from "./functions/untracked-read.js";
|
|
31
|
+
import { setAll } from "./functions/bulk-set.js";
|
|
32
|
+
import { toggleAll } from "./functions/bulk-toggle.js";
|
|
33
|
+
import { animate } from "./directives/tween.js";
|
|
34
|
+
import { httpDelete, httpGet, httpPatch, httpPost, httpPut } from "./functions/request.js";
|
|
35
|
+
import { applyElements } from "./server-events/apply-elements.js";
|
|
36
|
+
import { applyState } from "./server-events/apply-state.js";
|
|
37
|
+
import { activateScripts, morph, morphInner } from "./server-events/morph.js";
|
|
38
|
+
import { boost } from "./directives/boost.js";
|
|
39
|
+
import { cloak } from "./directives/cloak.js";
|
|
40
|
+
import { collapse } from "./directives/collapse.js";
|
|
41
|
+
import { html } from "./directives/html.js";
|
|
42
|
+
import { applyMask, mask } from "./directives/mask.js";
|
|
43
|
+
import { removeMe } from "./directives/remove-me.js";
|
|
44
|
+
import { teleport } from "./directives/teleport.js";
|
|
45
|
+
import { transition } from "./directives/transition.js";
|
|
46
|
+
import { trap } from "./directives/trap.js";
|
|
47
|
+
import { confirm } from "./functions/confirm.js";
|
|
48
|
+
import { dispatch } from "./functions/dispatch.js";
|
|
49
|
+
import { websocket } from "./functions/websocket.js";
|
|
50
|
+
export {
|
|
51
|
+
activateScripts,
|
|
52
|
+
animate,
|
|
53
|
+
applyElements,
|
|
54
|
+
applyMask,
|
|
55
|
+
applyState,
|
|
56
|
+
attr,
|
|
57
|
+
bind,
|
|
58
|
+
boost,
|
|
59
|
+
className,
|
|
60
|
+
clipboard,
|
|
61
|
+
cloak,
|
|
62
|
+
collapse,
|
|
63
|
+
computed,
|
|
64
|
+
confirm,
|
|
65
|
+
customValidity,
|
|
66
|
+
dispatch,
|
|
67
|
+
effect,
|
|
68
|
+
fit,
|
|
69
|
+
html,
|
|
70
|
+
httpDelete,
|
|
71
|
+
httpGet,
|
|
72
|
+
httpPatch,
|
|
73
|
+
httpPost,
|
|
74
|
+
httpPut,
|
|
75
|
+
indicator,
|
|
76
|
+
init,
|
|
77
|
+
intl,
|
|
78
|
+
jsonSignals,
|
|
79
|
+
mask,
|
|
80
|
+
matchMedia,
|
|
81
|
+
morph,
|
|
82
|
+
morphInner,
|
|
83
|
+
on,
|
|
84
|
+
onIntersect,
|
|
85
|
+
onInterval,
|
|
86
|
+
onRaf,
|
|
87
|
+
onResize,
|
|
88
|
+
onSignalPatch,
|
|
89
|
+
peek,
|
|
90
|
+
persist,
|
|
91
|
+
queryString,
|
|
92
|
+
ref,
|
|
93
|
+
removeMe,
|
|
94
|
+
replaceUrl,
|
|
95
|
+
scrollIntoView,
|
|
96
|
+
setAll,
|
|
97
|
+
show,
|
|
98
|
+
signals,
|
|
99
|
+
style,
|
|
100
|
+
teleport,
|
|
101
|
+
text,
|
|
102
|
+
toggleAll,
|
|
103
|
+
transition,
|
|
104
|
+
trap,
|
|
105
|
+
viewTransition,
|
|
106
|
+
websocket
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/plugins/index.ts"],
|
|
4
|
+
"sourcesContent": ["// Pure re-exports: nothing registers on import, so bundlers keep only what you use.\nexport { attr } from './directives/attribute-sync.js'\nexport { bind } from './directives/two-way-bind.js'\nexport { className } from './directives/class-toggle.js'\nexport { computed } from './directives/derive.js'\nexport { customValidity } from './directives/validity.js'\nexport { effect } from './directives/watch.js'\nexport { indicator } from './directives/busy-flag.js'\nexport { init } from './directives/on-mount.js'\nexport { jsonSignals } from './directives/state-dump.js'\nexport { matchMedia } from './directives/media-query.js'\nexport { on } from './directives/event-listener.js'\nexport { onIntersect } from './directives/viewport.js'\nexport { onInterval } from './directives/timer.js'\nexport { onRaf } from './directives/frame-loop.js'\nexport { onResize } from './directives/size-watch.js'\nexport { onSignalPatch } from './directives/patch-listener.js'\nexport { persist } from './directives/storage-sync.js'\nexport { queryString } from './directives/url-params.js'\nexport { ref } from './directives/element-ref.js'\nexport { replaceUrl } from './directives/url-replace.js'\nexport { scrollIntoView } from './directives/scroll-to.js'\nexport { show } from './directives/visibility.js'\nexport { signals } from './directives/declare.js'\nexport { style } from './directives/inline-style.js'\nexport { text } from './directives/text-content.js'\nexport { viewTransition } from './directives/transition-name.js'\nexport { clipboard } from './functions/copy-text.js'\nexport { fit } from './functions/range-map.js'\nexport { intl } from './functions/locale-format.js'\nexport { peek } from './functions/untracked-read.js'\nexport { setAll } from './functions/bulk-set.js'\nexport { toggleAll } from './functions/bulk-toggle.js'\nexport { animate } from './directives/tween.js'\nexport { httpDelete, httpGet, httpPatch, httpPost, httpPut } from './functions/request.js'\nexport type { RequestOptions } from './functions/request.js'\nexport { applyElements } from './server-events/apply-elements.js'\nexport { applyState } from './server-events/apply-state.js'\nexport { activateScripts, morph, morphInner } from './server-events/morph.js'\nexport type { MorphOptions } from './server-events/morph.js'\n// ecosystem plugins (Alpine, htmx equivalents)\nexport { boost } from './directives/boost.js'\nexport { cloak } from './directives/cloak.js'\nexport { collapse } from './directives/collapse.js'\nexport { html } from './directives/html.js'\nexport { applyMask, mask } from './directives/mask.js'\nexport { removeMe } from './directives/remove-me.js'\nexport { teleport } from './directives/teleport.js'\nexport { transition } from './directives/transition.js'\nexport { trap } from './directives/trap.js'\nexport { confirm } from './functions/confirm.js'\nexport { dispatch } from './functions/dispatch.js'\nexport { websocket } from './functions/websocket.js'\nexport type { Socket } from './functions/websocket.js'\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,YAAY;AACrB,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAC1B,SAAS,YAAY;AACrB,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,UAAU;AACnB,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,aAAa;AACtB,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAC9B,SAAS,eAAe;AACxB,SAAS,mBAAmB;AAC5B,SAAS,WAAW;AACpB,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAC/B,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,aAAa;AACtB,SAAS,YAAY;AACrB,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB;AAC1B,SAAS,WAAW;AACpB,SAAS,YAAY;AACrB,SAAS,YAAY;AACrB,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AACxB,SAAS,YAAY,SAAS,WAAW,UAAU,eAAe;AAElE,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB;AAC3B,SAAS,iBAAiB,OAAO,kBAAkB;AAGnD,SAAS,aAAa;AACtB,SAAS,aAAa;AACtB,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,WAAW,YAAY;AAChC,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { handler } from "../../kernel/index.js";
|
|
2
|
+
import { activateScripts, morph, morphInner } from "./morph.js";
|
|
3
|
+
const MODES = ["outer", "inner", "replace", "prepend", "append", "before", "after", "remove"];
|
|
4
|
+
const parse = (html) => {
|
|
5
|
+
if (/<\/(html|head|body)>/i.test(html)) return new DOMParser().parseFromString(html, "text/html");
|
|
6
|
+
const t = document.createElement("template");
|
|
7
|
+
t.innerHTML = html;
|
|
8
|
+
return t.content;
|
|
9
|
+
};
|
|
10
|
+
const apply = (runtime, html, selector, mode) => {
|
|
11
|
+
const o = { ignoreAttr: runtime.attr("ignore-morph"), preserveAttr: runtime.attr("preserve-attr") };
|
|
12
|
+
const parsed = parse(html);
|
|
13
|
+
if (parsed instanceof Document) {
|
|
14
|
+
if (parsed.head.childNodes.length) morphInner(document.head, parsed.head, o);
|
|
15
|
+
morph(document.body, parsed.body, o);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const frag = parsed;
|
|
19
|
+
if (mode === "remove") {
|
|
20
|
+
for (const t of document.querySelectorAll(selector)) t.remove();
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (!selector) {
|
|
24
|
+
if (mode !== "outer" && mode !== "replace") throw new Error(`patch-elements mode "${mode}" needs a selector`);
|
|
25
|
+
for (const child of [...frag.children]) {
|
|
26
|
+
const target = child.id && document.getElementById(child.id);
|
|
27
|
+
if (!target) {
|
|
28
|
+
console.warn("patch-elements: no element with id", child.id);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (mode === "outer") morph(target, child, o);
|
|
32
|
+
else target.replaceWith(child), activateScripts(child);
|
|
33
|
+
}
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const targets = [...document.querySelectorAll(selector)];
|
|
37
|
+
if (!targets.length) console.warn("patch-elements: no elements match", selector);
|
|
38
|
+
targets.forEach((t, i) => {
|
|
39
|
+
const content = i === targets.length - 1 ? frag : frag.cloneNode(true);
|
|
40
|
+
const nodes = [...content.childNodes];
|
|
41
|
+
if (mode === "outer" && nodes.length === 1 && isElement(nodes[0])) morph(t, nodes[0], o);
|
|
42
|
+
else if (mode === "inner") morphInner(t, content, o);
|
|
43
|
+
else {
|
|
44
|
+
if (mode === "outer" || mode === "replace") t.replaceWith(content);
|
|
45
|
+
else t[mode](content);
|
|
46
|
+
for (const n of nodes) activateScripts(n);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
const isElement = (n) => n.nodeType === 1;
|
|
51
|
+
const applyElements = handler({
|
|
52
|
+
name: "patch-elements",
|
|
53
|
+
handle(runtime, { elements = "", selector = "", mode = "outer", useViewTransition }) {
|
|
54
|
+
if (!MODES.includes(mode)) throw new Error(`patch-elements: unknown mode "${mode}"`);
|
|
55
|
+
const run = () => apply(runtime, elements, selector, mode);
|
|
56
|
+
useViewTransition === "true" && "startViewTransition" in document ? document.startViewTransition(run) : run();
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
export {
|
|
60
|
+
applyElements
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=apply-elements.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/plugins/server-events/apply-elements.ts"],
|
|
4
|
+
"sourcesContent": ["import { handler, type Runtime } from '../../kernel/index.js'\nimport { activateScripts, morph, morphInner } from './morph.js'\n\nconst MODES = ['outer', 'inner', 'replace', 'prepend', 'append', 'before', 'after', 'remove'] as const\ntype Mode = (typeof MODES)[number]\n\nconst parse = (html: string): DocumentFragment | Document => {\n if (/<\\/(html|head|body)>/i.test(html)) return new DOMParser().parseFromString(html, 'text/html')\n const t = document.createElement('template')\n t.innerHTML = html\n return t.content\n}\n\nconst apply = (runtime: Runtime, html: string, selector: string, mode: Mode): void => {\n const o = { ignoreAttr: runtime.attr('ignore-morph'), preserveAttr: runtime.attr('preserve-attr') }\n const parsed = parse(html)\n if (parsed instanceof Document) {\n if (parsed.head.childNodes.length) morphInner(document.head, parsed.head, o)\n morph(document.body, parsed.body, o)\n return\n }\n const frag = parsed\n if (mode === 'remove') {\n for (const t of document.querySelectorAll(selector)) t.remove()\n return\n }\n if (!selector) {\n if (mode !== 'outer' && mode !== 'replace') throw new Error(`patch-elements mode \"${mode}\" needs a selector`)\n for (const child of [...frag.children]) {\n const target = child.id && document.getElementById(child.id)\n if (!target) {\n console.warn('patch-elements: no element with id', child.id)\n continue\n }\n if (mode === 'outer') morph(target, child, o)\n else (target.replaceWith(child), activateScripts(child))\n }\n return\n }\n const targets = [...document.querySelectorAll(selector)]\n if (!targets.length) console.warn('patch-elements: no elements match', selector)\n targets.forEach((t, i) => {\n const content = i === targets.length - 1 ? frag : (frag.cloneNode(true) as DocumentFragment)\n const nodes = [...content.childNodes]\n if (mode === 'outer' && nodes.length === 1 && isElement(nodes[0])) morph(t, nodes[0], o)\n else if (mode === 'inner') morphInner(t, content, o)\n else {\n if (mode === 'outer' || mode === 'replace') t.replaceWith(content)\n else t[mode](content)\n for (const n of nodes) activateScripts(n)\n }\n })\n}\n\nconst isElement = (n: Node): n is Element => n.nodeType === 1\n\n/** Server event `patch-elements`: `elements <html>`, `selector`, `mode`, `useViewTransition true`. */\nexport const applyElements = handler({\n name: 'patch-elements',\n handle(runtime, { elements = '', selector = '', mode = 'outer', useViewTransition }) {\n if (!MODES.includes(mode as Mode)) throw new Error(`patch-elements: unknown mode \"${mode}\"`)\n const run = () => apply(runtime, elements, selector, mode as Mode)\n useViewTransition === 'true' && 'startViewTransition' in document ? document.startViewTransition(run) : run()\n },\n})\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,eAA6B;AACtC,SAAS,iBAAiB,OAAO,kBAAkB;AAEnD,MAAM,QAAQ,CAAC,SAAS,SAAS,WAAW,WAAW,UAAU,UAAU,SAAS,QAAQ;AAG5F,MAAM,QAAQ,CAAC,SAA8C;AAC3D,MAAI,wBAAwB,KAAK,IAAI,EAAG,QAAO,IAAI,UAAU,EAAE,gBAAgB,MAAM,WAAW;AAChG,QAAM,IAAI,SAAS,cAAc,UAAU;AAC3C,IAAE,YAAY;AACd,SAAO,EAAE;AACX;AAEA,MAAM,QAAQ,CAAC,SAAkB,MAAc,UAAkB,SAAqB;AACpF,QAAM,IAAI,EAAE,YAAY,QAAQ,KAAK,cAAc,GAAG,cAAc,QAAQ,KAAK,eAAe,EAAE;AAClG,QAAM,SAAS,MAAM,IAAI;AACzB,MAAI,kBAAkB,UAAU;AAC9B,QAAI,OAAO,KAAK,WAAW,OAAQ,YAAW,SAAS,MAAM,OAAO,MAAM,CAAC;AAC3E,UAAM,SAAS,MAAM,OAAO,MAAM,CAAC;AACnC;AAAA,EACF;AACA,QAAM,OAAO;AACb,MAAI,SAAS,UAAU;AACrB,eAAW,KAAK,SAAS,iBAAiB,QAAQ,EAAG,GAAE,OAAO;AAC9D;AAAA,EACF;AACA,MAAI,CAAC,UAAU;AACb,QAAI,SAAS,WAAW,SAAS,UAAW,OAAM,IAAI,MAAM,wBAAwB,IAAI,oBAAoB;AAC5G,eAAW,SAAS,CAAC,GAAG,KAAK,QAAQ,GAAG;AACtC,YAAM,SAAS,MAAM,MAAM,SAAS,eAAe,MAAM,EAAE;AAC3D,UAAI,CAAC,QAAQ;AACX,gBAAQ,KAAK,sCAAsC,MAAM,EAAE;AAC3D;AAAA,MACF;AACA,UAAI,SAAS,QAAS,OAAM,QAAQ,OAAO,CAAC;AAAA,UACvC,CAAC,OAAO,YAAY,KAAK,GAAG,gBAAgB,KAAK;AAAA,IACxD;AACA;AAAA,EACF;AACA,QAAM,UAAU,CAAC,GAAG,SAAS,iBAAiB,QAAQ,CAAC;AACvD,MAAI,CAAC,QAAQ,OAAQ,SAAQ,KAAK,qCAAqC,QAAQ;AAC/E,UAAQ,QAAQ,CAAC,GAAG,MAAM;AACxB,UAAM,UAAU,MAAM,QAAQ,SAAS,IAAI,OAAQ,KAAK,UAAU,IAAI;AACtE,UAAM,QAAQ,CAAC,GAAG,QAAQ,UAAU;AACpC,QAAI,SAAS,WAAW,MAAM,WAAW,KAAK,UAAU,MAAM,CAAC,CAAC,EAAG,OAAM,GAAG,MAAM,CAAC,GAAG,CAAC;AAAA,aAC9E,SAAS,QAAS,YAAW,GAAG,SAAS,CAAC;AAAA,SAC9C;AACH,UAAI,SAAS,WAAW,SAAS,UAAW,GAAE,YAAY,OAAO;AAAA,UAC5D,GAAE,IAAI,EAAE,OAAO;AACpB,iBAAW,KAAK,MAAO,iBAAgB,CAAC;AAAA,IAC1C;AAAA,EACF,CAAC;AACH;AAEA,MAAM,YAAY,CAAC,MAA0B,EAAE,aAAa;AAGrD,MAAM,gBAAgB,QAAQ;AAAA,EACnC,MAAM;AAAA,EACN,OAAO,SAAS,EAAE,WAAW,IAAI,WAAW,IAAI,OAAO,SAAS,kBAAkB,GAAG;AACnF,QAAI,CAAC,MAAM,SAAS,IAAY,EAAG,OAAM,IAAI,MAAM,iCAAiC,IAAI,GAAG;AAC3F,UAAM,MAAM,MAAM,MAAM,SAAS,UAAU,UAAU,IAAY;AACjE,0BAAsB,UAAU,yBAAyB,WAAW,SAAS,oBAAoB,GAAG,IAAI,IAAI;AAAA,EAC9G;AACF,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { handler } from "../../kernel/index.js";
|
|
2
|
+
const applyState = handler({
|
|
3
|
+
name: "patch-signals",
|
|
4
|
+
handle(runtime, { signals, onlyIfMissing }) {
|
|
5
|
+
if (!signals) return;
|
|
6
|
+
let patch;
|
|
7
|
+
try {
|
|
8
|
+
patch = JSON.parse(signals);
|
|
9
|
+
} catch {
|
|
10
|
+
patch = runtime.compiler([], `return (${signals})`)();
|
|
11
|
+
}
|
|
12
|
+
runtime.store.merge(patch, { ifMissing: onlyIfMissing === "true" });
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
export {
|
|
16
|
+
applyState
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=apply-state.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/plugins/server-events/apply-state.ts"],
|
|
4
|
+
"sourcesContent": ["import { handler } from '../../kernel/index.js'\n\n/** Server event `patch-signals`: `signals {json}` merged into the store; `onlyIfMissing true` keeps existing values. */\nexport const applyState = handler({\n name: 'patch-signals',\n handle(runtime, { signals, onlyIfMissing }) {\n if (!signals) return\n let patch: Record<string, unknown>\n try {\n patch = JSON.parse(signals)\n } catch {\n patch = runtime.compiler([], `return (${signals})`)()\n }\n runtime.store.merge(patch, { ifMissing: onlyIfMissing === 'true' })\n },\n})\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,eAAe;AAGjB,MAAM,aAAa,QAAQ;AAAA,EAChC,MAAM;AAAA,EACN,OAAO,SAAS,EAAE,SAAS,cAAc,GAAG;AAC1C,QAAI,CAAC,QAAS;AACd,QAAI;AACJ,QAAI;AACF,cAAQ,KAAK,MAAM,OAAO;AAAA,IAC5B,QAAQ;AACN,cAAQ,QAAQ,SAAS,CAAC,GAAG,WAAW,OAAO,GAAG,EAAE;AAAA,IACtD;AACA,YAAQ,MAAM,MAAM,OAAO,EAAE,WAAW,kBAAkB,OAAO,CAAC;AAAA,EACpE;AACF,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type MorphOptions = {
|
|
2
|
+
/** Attribute that marks a subtree to leave alone when present on both sides. */
|
|
3
|
+
ignoreAttr?: string;
|
|
4
|
+
/** Attribute listing space-separated attribute names to keep from the old element. */
|
|
5
|
+
preserveAttr?: string;
|
|
6
|
+
};
|
|
7
|
+
/** Scripts inserted through the DOM do not execute; replace them with fresh copies that do. */
|
|
8
|
+
export declare const activateScripts: (root: Node) => void;
|
|
9
|
+
/** Morph `target` into `next` (outer). */
|
|
10
|
+
export declare const morph: (target: Element, next: Element, o?: MorphOptions) => void;
|
|
11
|
+
/** Morph the children of `target` into the children of `next` (inner). */
|
|
12
|
+
export declare const morphInner: (target: Element, next: ParentNode, o?: MorphOptions) => void;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
const ran = /* @__PURE__ */ new WeakSet();
|
|
2
|
+
const isEl = (n) => !!n && n.nodeType === 1;
|
|
3
|
+
const activateScripts = (root) => {
|
|
4
|
+
if (!isEl(root)) return;
|
|
5
|
+
for (const old of root.matches("script") ? [root] : [...root.querySelectorAll("script")]) {
|
|
6
|
+
if (ran.has(old)) continue;
|
|
7
|
+
const s = document.createElement("script");
|
|
8
|
+
for (const { name, value } of old.attributes) s.setAttribute(name, value);
|
|
9
|
+
s.text = old.text;
|
|
10
|
+
ran.add(s);
|
|
11
|
+
old.replaceWith(s);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
const idsIn = (n) => [...isEl(n) && n.id ? [n] : [], ...n.querySelectorAll("[id]")];
|
|
15
|
+
const containsKept = (n, ctx) => isEl(n) && idsIn(n).some((e) => ctx.keep.has(e.id));
|
|
16
|
+
const discard = (n, ctx) => {
|
|
17
|
+
containsKept(n, ctx) ? ctx.pantry.append(n) : n.remove();
|
|
18
|
+
};
|
|
19
|
+
const place = (parent, node, before) => {
|
|
20
|
+
const p = parent;
|
|
21
|
+
try {
|
|
22
|
+
p.moveBefore ? p.moveBefore(node, before) : parent.insertBefore(node, before);
|
|
23
|
+
} catch {
|
|
24
|
+
parent.insertBefore(node, before);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const findKept = (id, from, ctx) => {
|
|
28
|
+
for (let n = from; n; n = n.nextSibling) if (isEl(n) && n.id === id) return n;
|
|
29
|
+
return ctx.pantry.querySelector(`#${CSS.escape(id)}`) ?? document.getElementById(id);
|
|
30
|
+
};
|
|
31
|
+
const compatible = (old, next, ctx) => old.nodeType === next.nodeType && old.nodeName === next.nodeName && (!isEl(old) || !old.id || old.id === next.id) && !(isEl(old) && ctx.keep.has(old.id) && old.id !== next.id);
|
|
32
|
+
const syncAttributes = (a, b, ctx) => {
|
|
33
|
+
const keep = new Set((b.getAttribute(ctx.preserve) ?? a.getAttribute(ctx.preserve) ?? "").split(/\s+/).filter(Boolean));
|
|
34
|
+
let changed = false;
|
|
35
|
+
const attrDiffers = (name) => !keep.has(name) && a.getAttribute(name) !== b.getAttribute(name);
|
|
36
|
+
if (a instanceof HTMLInputElement && b instanceof HTMLInputElement && a.type !== "file") {
|
|
37
|
+
if (attrDiffers("value")) a.value = b.getAttribute("value") ?? "", changed = true;
|
|
38
|
+
if (attrDiffers("checked")) a.checked = b.hasAttribute("checked"), changed = true;
|
|
39
|
+
} else if (a instanceof HTMLTextAreaElement && b instanceof HTMLTextAreaElement) {
|
|
40
|
+
if (!keep.has("value") && a.defaultValue !== b.defaultValue) a.value = b.defaultValue, changed = true;
|
|
41
|
+
} else if (a instanceof HTMLOptionElement && b instanceof HTMLOptionElement) {
|
|
42
|
+
if (attrDiffers("selected")) a.selected = b.hasAttribute("selected"), changed = true;
|
|
43
|
+
}
|
|
44
|
+
for (const { name, value } of b.attributes) if (!keep.has(name) && a.getAttribute(name) !== value) a.setAttribute(name, value);
|
|
45
|
+
for (const { name } of [...a.attributes]) if (!keep.has(name) && !b.hasAttribute(name)) a.removeAttribute(name);
|
|
46
|
+
if (changed) (a instanceof HTMLOptionElement ? a.closest("select") : a)?.dispatchEvent(new Event("sigmx-prop-change", { bubbles: true }));
|
|
47
|
+
};
|
|
48
|
+
const morphNode = (a, b, ctx) => {
|
|
49
|
+
if (a.nodeType !== b.nodeType || a.nodeName !== b.nodeName) {
|
|
50
|
+
const fresh = document.importNode(b, true);
|
|
51
|
+
a.replaceWith(fresh);
|
|
52
|
+
activateScripts(fresh);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (!isEl(a) || !isEl(b)) {
|
|
56
|
+
if (a.nodeValue !== b.nodeValue) a.nodeValue = b.nodeValue;
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (a.hasAttribute(ctx.ignore) && b.hasAttribute(ctx.ignore)) return;
|
|
60
|
+
syncAttributes(a, b, ctx);
|
|
61
|
+
if (a instanceof HTMLTemplateElement && b instanceof HTMLTemplateElement) {
|
|
62
|
+
a.innerHTML = b.innerHTML;
|
|
63
|
+
} else if (!a.isEqualNode(b)) {
|
|
64
|
+
morphChildren(a, b, ctx);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const morphChildren = (parent, next, ctx) => {
|
|
68
|
+
let cur = parent.firstChild;
|
|
69
|
+
const dropUntil = (stop) => {
|
|
70
|
+
while (cur && cur !== stop) {
|
|
71
|
+
const n = cur;
|
|
72
|
+
cur = cur.nextSibling;
|
|
73
|
+
discard(n, ctx);
|
|
74
|
+
}
|
|
75
|
+
return cur === stop;
|
|
76
|
+
};
|
|
77
|
+
for (const nb of [...next.childNodes]) {
|
|
78
|
+
if (isEl(nb) && nb.id && ctx.keep.has(nb.id)) {
|
|
79
|
+
const match = findKept(nb.id, cur, ctx);
|
|
80
|
+
if (match) {
|
|
81
|
+
if (dropUntil(match) && cur) cur = match.nextSibling;
|
|
82
|
+
else place(parent, match, cur);
|
|
83
|
+
morphNode(match, nb, ctx);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
let m = cur;
|
|
88
|
+
while (m && !compatible(m, nb, ctx)) m = m.nextSibling;
|
|
89
|
+
if (m) {
|
|
90
|
+
dropUntil(m);
|
|
91
|
+
cur = m.nextSibling;
|
|
92
|
+
morphNode(m, nb, ctx);
|
|
93
|
+
} else if (isEl(nb) && containsKept(nb, ctx)) {
|
|
94
|
+
const shell = document.createElementNS(nb.namespaceURI ?? "http://www.w3.org/1999/xhtml", nb.tagName);
|
|
95
|
+
parent.insertBefore(shell, cur);
|
|
96
|
+
morphNode(shell, nb, ctx);
|
|
97
|
+
} else {
|
|
98
|
+
const fresh = document.importNode(nb, true);
|
|
99
|
+
parent.insertBefore(fresh, cur);
|
|
100
|
+
activateScripts(fresh);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
dropUntil(null);
|
|
104
|
+
};
|
|
105
|
+
const context = (target, next, o) => {
|
|
106
|
+
const keep = /* @__PURE__ */ new Set();
|
|
107
|
+
const wanted = new Map(idsIn(next).map((e) => [e.id, e.tagName]));
|
|
108
|
+
for (const e of idsIn(target)) if (wanted.get(e.id) === e.tagName) keep.add(e.id);
|
|
109
|
+
return { keep, pantry: document.createDocumentFragment(), ignore: o.ignoreAttr ?? "data-ignore-morph", preserve: o.preserveAttr ?? "data-preserve-attr" };
|
|
110
|
+
};
|
|
111
|
+
const morph = (target, next, o = {}) => {
|
|
112
|
+
const ctx = context(target, next, o);
|
|
113
|
+
morphNode(target, next, ctx);
|
|
114
|
+
};
|
|
115
|
+
const morphInner = (target, next, o = {}) => {
|
|
116
|
+
const ctx = context(target, next, o);
|
|
117
|
+
morphChildren(target, next, ctx);
|
|
118
|
+
};
|
|
119
|
+
export {
|
|
120
|
+
activateScripts,
|
|
121
|
+
morph,
|
|
122
|
+
morphInner
|
|
123
|
+
};
|
|
124
|
+
//# sourceMappingURL=morph.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/plugins/server-events/morph.ts"],
|
|
4
|
+
"sourcesContent": ["// Id-aware DOM morphing: update `target` in place to match `next`, keeping elements whose ids\n// appear in both trees (and their state: focus, input values, scroll) instead of recreating them.\n\nexport type MorphOptions = {\n /** Attribute that marks a subtree to leave alone when present on both sides. */\n ignoreAttr?: string\n /** Attribute listing space-separated attribute names to keep from the old element. */\n preserveAttr?: string\n}\n\ntype Ctx = { keep: Set<string>; pantry: DocumentFragment; ignore: string; preserve: string }\n\nconst ran = new WeakSet<Node>()\nconst isEl = (n: Node | null): n is Element => !!n && n.nodeType === 1\n\n/** Scripts inserted through the DOM do not execute; replace them with fresh copies that do. */\nexport const activateScripts = (root: Node): void => {\n if (!isEl(root)) return\n for (const old of (root.matches('script') ? [root] : [...root.querySelectorAll('script')]) as HTMLScriptElement[]) {\n if (ran.has(old)) continue\n const s = document.createElement('script')\n for (const { name, value } of old.attributes) s.setAttribute(name, value)\n s.text = old.text\n ran.add(s)\n old.replaceWith(s)\n }\n}\n\n/** Every element with an id in and under `n`. */\nconst idsIn = (n: Node): Element[] => [...(isEl(n) && n.id ? [n] : []), ...(n as ParentNode).querySelectorAll('[id]')]\nconst containsKept = (n: Node, ctx: Ctx): boolean => isEl(n) && idsIn(n).some((e) => ctx.keep.has(e.id))\n\n/** Remove a node, or park it if it (or a descendant) is wanted elsewhere in the new tree. */\nconst discard = (n: Node, ctx: Ctx): void => {\n containsKept(n, ctx) ? ctx.pantry.append(n) : (n as ChildNode).remove()\n}\n\nconst place = (parent: Node, node: Node, before: Node | null): void => {\n const p = parent as Node & { moveBefore?: (n: Node, b: Node | null) => void }\n try {\n p.moveBefore ? p.moveBefore(node, before) : parent.insertBefore(node, before)\n } catch {\n parent.insertBefore(node, before)\n }\n}\n\nconst findKept = (id: string, from: Node | null, ctx: Ctx): Element | null => {\n for (let n = from; n; n = n.nextSibling) if (isEl(n) && n.id === id) return n\n return ctx.pantry.querySelector(`#${CSS.escape(id)}`) ?? document.getElementById(id)\n}\n\nconst compatible = (old: Node, next: Node, ctx: Ctx): boolean =>\n old.nodeType === next.nodeType &&\n old.nodeName === next.nodeName &&\n (!isEl(old) || !old.id || old.id === (next as Element).id) &&\n !(isEl(old) && ctx.keep.has(old.id) && old.id !== (next as Element).id)\n\nconst syncAttributes = (a: Element, b: Element, ctx: Ctx): void => {\n const keep = new Set((b.getAttribute(ctx.preserve) ?? a.getAttribute(ctx.preserve) ?? '').split(/\\s+/).filter(Boolean))\n // Live form state (what the user typed or ticked) is only overwritten when the server's\n // default actually changed, i.e. the *attribute* differs between old and new markup.\n let changed = false\n const attrDiffers = (name: string) => !keep.has(name) && a.getAttribute(name) !== b.getAttribute(name)\n if (a instanceof HTMLInputElement && b instanceof HTMLInputElement && a.type !== 'file') {\n if (attrDiffers('value')) (a.value = b.getAttribute('value') ?? ''), (changed = true)\n if (attrDiffers('checked')) (a.checked = b.hasAttribute('checked')), (changed = true)\n } else if (a instanceof HTMLTextAreaElement && b instanceof HTMLTextAreaElement) {\n if (!keep.has('value') && a.defaultValue !== b.defaultValue) (a.value = b.defaultValue), (changed = true)\n } else if (a instanceof HTMLOptionElement && b instanceof HTMLOptionElement) {\n if (attrDiffers('selected')) (a.selected = b.hasAttribute('selected')), (changed = true)\n }\n for (const { name, value } of b.attributes) if (!keep.has(name) && a.getAttribute(name) !== value) a.setAttribute(name, value)\n for (const { name } of [...a.attributes]) if (!keep.has(name) && !b.hasAttribute(name)) a.removeAttribute(name)\n\n if (changed) (a instanceof HTMLOptionElement ? a.closest('select') : a)?.dispatchEvent(new Event('sigmx-prop-change', { bubbles: true }))\n}\n\nconst morphNode = (a: Node, b: Node, ctx: Ctx): void => {\n if (a.nodeType !== b.nodeType || a.nodeName !== b.nodeName) {\n const fresh = document.importNode(b, true)\n ;(a as ChildNode).replaceWith(fresh)\n activateScripts(fresh)\n return\n }\n if (!isEl(a) || !isEl(b)) {\n if (a.nodeValue !== b.nodeValue) a.nodeValue = b.nodeValue\n return\n }\n if (a.hasAttribute(ctx.ignore) && b.hasAttribute(ctx.ignore)) return\n syncAttributes(a, b, ctx)\n if (a instanceof HTMLTemplateElement && b instanceof HTMLTemplateElement) {\n a.innerHTML = b.innerHTML\n } else if (!a.isEqualNode(b)) {\n morphChildren(a, b, ctx)\n }\n}\n\nconst morphChildren = (parent: Node, next: Node, ctx: Ctx): void => {\n let cur: Node | null = parent.firstChild\n /** Discard old siblings from `cur` up to (not including) `stop`; returns whether `stop` was reached. */\n const dropUntil = (stop: Node | null): boolean => {\n while (cur && cur !== stop) {\n const n = cur\n cur = cur.nextSibling\n discard(n, ctx)\n }\n return cur === stop\n }\n for (const nb of [...next.childNodes]) {\n if (isEl(nb) && nb.id && ctx.keep.has(nb.id)) {\n const match = findKept(nb.id, cur, ctx)\n if (match) {\n if (dropUntil(match) && cur) cur = match.nextSibling\n else place(parent, match, cur)\n morphNode(match, nb, ctx)\n continue\n }\n }\n let m: Node | null = cur\n while (m && !compatible(m, nb, ctx)) m = m.nextSibling\n if (m) {\n dropUntil(m)\n cur = m.nextSibling\n morphNode(m, nb, ctx)\n } else if (isEl(nb) && containsKept(nb, ctx)) {\n // Build a shell so the wanted descendants can be pulled in rather than recreated.\n const shell = document.createElementNS(nb.namespaceURI ?? 'http://www.w3.org/1999/xhtml', nb.tagName)\n parent.insertBefore(shell, cur)\n morphNode(shell, nb, ctx)\n } else {\n const fresh = document.importNode(nb, true)\n parent.insertBefore(fresh, cur)\n activateScripts(fresh)\n }\n }\n dropUntil(null)\n}\n\nconst context = (target: Node, next: Node, o: MorphOptions): Ctx => {\n const keep = new Set<string>()\n const wanted = new Map(idsIn(next).map((e) => [e.id, e.tagName]))\n for (const e of idsIn(target)) if (wanted.get(e.id) === e.tagName) keep.add(e.id)\n return { keep, pantry: document.createDocumentFragment(), ignore: o.ignoreAttr ?? 'data-ignore-morph', preserve: o.preserveAttr ?? 'data-preserve-attr' }\n}\n\n/** Morph `target` into `next` (outer). */\nexport const morph = (target: Element, next: Element, o: MorphOptions = {}): void => {\n const ctx = context(target, next, o)\n morphNode(target, next, ctx)\n}\n\n/** Morph the children of `target` into the children of `next` (inner). */\nexport const morphInner = (target: Element, next: ParentNode, o: MorphOptions = {}): void => {\n const ctx = context(target, next, o)\n morphChildren(target, next, ctx)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|