sigmx 0.1.0 → 0.1.1
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/README.md +52 -41
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +2 -2
- package/dist/kernel/compile.js.map +2 -2
- package/dist/kernel/contracts.d.ts +1 -8
- package/dist/kernel/index.d.ts +10 -11
- package/dist/kernel/index.js +10 -7
- package/dist/kernel/index.js.map +3 -3
- package/dist/kernel/precompile.d.ts +0 -2
- package/dist/kernel/precompile.js +11 -4
- package/dist/kernel/precompile.js.map +2 -2
- package/dist/kernel/precompiled.js.map +2 -2
- package/dist/kernel/reactive.d.ts +6 -10
- package/dist/kernel/reactive.js +4 -8
- package/dist/kernel/reactive.js.map +2 -2
- package/dist/kernel/runtime.js +19 -7
- package/dist/kernel/runtime.js.map +2 -2
- package/dist/kernel/scan.d.ts +1 -10
- package/dist/kernel/scan.js +24 -7
- package/dist/kernel/scan.js.map +2 -2
- package/dist/kernel/state.d.ts +1 -5
- package/dist/kernel/state.js +49 -22
- package/dist/kernel/state.js.map +2 -2
- package/dist/kernel/strict-csp.js.map +1 -1
- package/dist/lib/casing.js.map +2 -2
- package/dist/lib/objects.d.ts +0 -1
- package/dist/lib/objects.js +4 -1
- package/dist/lib/objects.js.map +2 -2
- package/dist/lib/schedule.d.ts +0 -2
- package/dist/lib/schedule.js.map +2 -2
- package/dist/lib/sse.d.ts +0 -1
- package/dist/lib/sse.js +3 -2
- package/dist/lib/sse.js.map +2 -2
- package/dist/plugins/directives/attribute-sync.js.map +1 -1
- package/dist/plugins/directives/boost.js +2 -1
- package/dist/plugins/directives/boost.js.map +2 -2
- package/dist/plugins/directives/busy-flag.js.map +1 -1
- package/dist/plugins/directives/class-toggle.js.map +1 -1
- package/dist/plugins/directives/cloak.js.map +1 -1
- package/dist/plugins/directives/collapse.js.map +1 -1
- package/dist/plugins/directives/declare.js.map +1 -1
- package/dist/plugins/directives/derive.js +4 -1
- package/dist/plugins/directives/derive.js.map +2 -2
- package/dist/plugins/directives/element-ref.js.map +1 -1
- package/dist/plugins/directives/event-listener.js +4 -1
- package/dist/plugins/directives/event-listener.js.map +2 -2
- package/dist/plugins/directives/frame-loop.js.map +1 -1
- package/dist/plugins/directives/html.js.map +1 -1
- package/dist/plugins/directives/inline-style.js +1 -1
- package/dist/plugins/directives/inline-style.js.map +2 -2
- package/dist/plugins/directives/mask.js.map +1 -1
- package/dist/plugins/directives/media-query.js +2 -1
- package/dist/plugins/directives/media-query.js.map +2 -2
- package/dist/plugins/directives/on-mount.js +4 -1
- package/dist/plugins/directives/on-mount.js.map +2 -2
- package/dist/plugins/directives/patch-listener.js.map +1 -1
- package/dist/plugins/directives/remove-me.js.map +1 -1
- package/dist/plugins/directives/scroll-to.js.map +1 -1
- package/dist/plugins/directives/size-watch.js.map +1 -1
- package/dist/plugins/directives/state-dump.js.map +1 -1
- package/dist/plugins/directives/storage-sync.js.map +1 -1
- package/dist/plugins/directives/teleport.js.map +1 -1
- package/dist/plugins/directives/text-content.js.map +1 -1
- package/dist/plugins/directives/timer.js.map +1 -1
- package/dist/plugins/directives/transition-name.js.map +1 -1
- package/dist/plugins/directives/transition.js.map +1 -1
- package/dist/plugins/directives/trap.js +8 -2
- package/dist/plugins/directives/trap.js.map +2 -2
- package/dist/plugins/directives/tween.js.map +2 -2
- package/dist/plugins/directives/two-way-bind.js +37 -7
- package/dist/plugins/directives/two-way-bind.js.map +2 -2
- package/dist/plugins/directives/url-params.js +2 -1
- package/dist/plugins/directives/url-params.js.map +2 -2
- package/dist/plugins/directives/url-replace.js.map +1 -1
- package/dist/plugins/directives/validity.js.map +1 -1
- package/dist/plugins/directives/viewport.js +4 -1
- package/dist/plugins/directives/viewport.js.map +2 -2
- package/dist/plugins/directives/visibility.js.map +1 -1
- package/dist/plugins/directives/watch.d.ts +0 -1
- package/dist/plugins/directives/watch.js.map +2 -2
- package/dist/plugins/functions/bulk-set.js +5 -3
- package/dist/plugins/functions/bulk-set.js.map +2 -2
- package/dist/plugins/functions/bulk-toggle.js +5 -3
- package/dist/plugins/functions/bulk-toggle.js.map +2 -2
- package/dist/plugins/functions/confirm.js.map +1 -1
- package/dist/plugins/functions/copy-text.js.map +1 -1
- package/dist/plugins/functions/dispatch.js.map +2 -2
- package/dist/plugins/functions/locale-format.js.map +1 -1
- package/dist/plugins/functions/range-map.js.map +1 -1
- package/dist/plugins/functions/request.js +19 -5
- package/dist/plugins/functions/request.js.map +2 -2
- package/dist/plugins/functions/untracked-read.js.map +1 -1
- package/dist/plugins/functions/websocket.js +5 -1
- package/dist/plugins/functions/websocket.js.map +2 -2
- package/dist/plugins/index.d.ts +36 -36
- package/dist/plugins/index.js +33 -33
- package/dist/plugins/index.js.map +2 -2
- package/dist/plugins/server-events/apply-elements.js +4 -1
- package/dist/plugins/server-events/apply-elements.js.map +2 -2
- package/dist/plugins/server-events/apply-state.js.map +1 -1
- package/dist/plugins/server-events/morph.d.ts +0 -2
- package/dist/plugins/server-events/morph.js +31 -8
- package/dist/plugins/server-events/morph.js.map +2 -2
- package/dist/presets/all.d.ts +0 -1
- package/dist/presets/all.js +23 -23
- package/dist/presets/all.js.map +2 -2
- package/dist/presets/essentials.d.ts +0 -1
- package/dist/presets/essentials.js +27 -9
- package/dist/presets/essentials.js.map +2 -2
- package/dist/presets/minimal.d.ts +0 -1
- package/dist/presets/minimal.js +2 -2
- package/dist/presets/minimal.js.map +2 -2
- package/dist/server.d.ts +102 -0
- package/dist/server.js +190 -0
- package/dist/server.js.map +7 -0
- package/dist/sigmx.standalone.js +1 -1
- package/dist/standalone.js.map +2 -2
- package/dist/vite.d.ts +2 -2
- package/dist/vite.js +31 -8
- package/dist/vite.js.map +2 -2
- package/package.json +19 -2
- package/dist/auto.d.ts +0 -1
- package/dist/auto.js +0 -7
- package/dist/auto.js.map +0 -7
- package/dist/core/csp.d.ts +0 -7
- package/dist/core/csp.js +0 -20
- package/dist/core/csp.js.map +0 -7
- package/dist/core/engine.d.ts +0 -10
- package/dist/core/engine.js +0 -200
- package/dist/core/engine.js.map +0 -7
- package/dist/core/expr.d.ts +0 -12
- package/dist/core/expr.js +0 -94
- package/dist/core/expr.js.map +0 -7
- package/dist/core/index.d.ts +0 -16
- package/dist/core/index.js +0 -46
- package/dist/core/index.js.map +0 -7
- package/dist/core/signals.d.ts +0 -42
- package/dist/core/signals.js +0 -195
- package/dist/core/signals.js.map +0 -7
- package/dist/core/store.d.ts +0 -32
- package/dist/core/store.js +0 -185
- package/dist/core/store.js.map +0 -7
- package/dist/core/types.d.ts +0 -101
- package/dist/core/types.js +0 -1
- package/dist/core/types.js.map +0 -7
- package/dist/plugins/actions/clipboard.d.ts +0 -2
- package/dist/plugins/actions/clipboard.js +0 -11
- package/dist/plugins/actions/clipboard.js.map +0 -7
- package/dist/plugins/actions/fit.d.ts +0 -2
- package/dist/plugins/actions/fit.js +0 -14
- package/dist/plugins/actions/fit.js.map +0 -7
- package/dist/plugins/actions/intl.d.ts +0 -2
- package/dist/plugins/actions/intl.js +0 -21
- package/dist/plugins/actions/intl.js.map +0 -7
- package/dist/plugins/actions/peek.d.ts +0 -2
- package/dist/plugins/actions/peek.js +0 -6
- package/dist/plugins/actions/peek.js.map +0 -7
- package/dist/plugins/actions/setAll.d.ts +0 -2
- package/dist/plugins/actions/setAll.js +0 -11
- package/dist/plugins/actions/setAll.js.map +0 -7
- package/dist/plugins/actions/toggleAll.d.ts +0 -2
- package/dist/plugins/actions/toggleAll.js +0 -11
- package/dist/plugins/actions/toggleAll.js.map +0 -7
- package/dist/plugins/attributes/attr.d.ts +0 -2
- package/dist/plugins/attributes/attr.js +0 -20
- package/dist/plugins/attributes/attr.js.map +0 -7
- package/dist/plugins/attributes/bind.d.ts +0 -6
- package/dist/plugins/attributes/bind.js +0 -81
- package/dist/plugins/attributes/bind.js.map +0 -7
- package/dist/plugins/attributes/class.d.ts +0 -2
- package/dist/plugins/attributes/class.js +0 -22
- package/dist/plugins/attributes/class.js.map +0 -7
- package/dist/plugins/attributes/computed.d.ts +0 -2
- package/dist/plugins/attributes/computed.js +0 -20
- package/dist/plugins/attributes/computed.js.map +0 -7
- package/dist/plugins/attributes/customValidity.d.ts +0 -2
- package/dist/plugins/attributes/customValidity.js +0 -14
- package/dist/plugins/attributes/customValidity.js.map +0 -7
- package/dist/plugins/attributes/effect.d.ts +0 -2
- package/dist/plugins/attributes/effect.js +0 -12
- package/dist/plugins/attributes/effect.js.map +0 -7
- package/dist/plugins/attributes/indicator.d.ts +0 -2
- package/dist/plugins/attributes/indicator.js +0 -20
- package/dist/plugins/attributes/indicator.js.map +0 -7
- package/dist/plugins/attributes/init.d.ts +0 -2
- package/dist/plugins/attributes/init.js +0 -14
- package/dist/plugins/attributes/init.js.map +0 -7
- package/dist/plugins/attributes/jsonSignals.d.ts +0 -2
- package/dist/plugins/attributes/jsonSignals.js +0 -15
- package/dist/plugins/attributes/jsonSignals.js.map +0 -7
- package/dist/plugins/attributes/matchMedia.d.ts +0 -2
- package/dist/plugins/attributes/matchMedia.js +0 -19
- package/dist/plugins/attributes/matchMedia.js.map +0 -7
- package/dist/plugins/attributes/on.d.ts +0 -5
- package/dist/plugins/attributes/on.js +0 -28
- package/dist/plugins/attributes/on.js.map +0 -7
- package/dist/plugins/attributes/onIntersect.d.ts +0 -2
- package/dist/plugins/attributes/onIntersect.js +0 -28
- package/dist/plugins/attributes/onIntersect.js.map +0 -7
- package/dist/plugins/attributes/onInterval.d.ts +0 -2
- package/dist/plugins/attributes/onInterval.js +0 -18
- package/dist/plugins/attributes/onInterval.js.map +0 -7
- package/dist/plugins/attributes/onRaf.d.ts +0 -1
- package/dist/plugins/attributes/onRaf.js +0 -19
- package/dist/plugins/attributes/onRaf.js.map +0 -7
- package/dist/plugins/attributes/onResize.d.ts +0 -1
- package/dist/plugins/attributes/onResize.js +0 -17
- package/dist/plugins/attributes/onResize.js.map +0 -7
- package/dist/plugins/attributes/onSignalPatch.d.ts +0 -5
- package/dist/plugins/attributes/onSignalPatch.js +0 -35
- package/dist/plugins/attributes/onSignalPatch.js.map +0 -7
- package/dist/plugins/attributes/persist.d.ts +0 -6
- package/dist/plugins/attributes/persist.js +0 -16
- package/dist/plugins/attributes/persist.js.map +0 -7
- package/dist/plugins/attributes/queryString.d.ts +0 -5
- package/dist/plugins/attributes/queryString.js +0 -54
- package/dist/plugins/attributes/queryString.js.map +0 -7
- package/dist/plugins/attributes/ref.d.ts +0 -2
- package/dist/plugins/attributes/ref.js +0 -13
- package/dist/plugins/attributes/ref.js.map +0 -7
- package/dist/plugins/attributes/replaceUrl.d.ts +0 -1
- package/dist/plugins/attributes/replaceUrl.js +0 -11
- package/dist/plugins/attributes/replaceUrl.js.map +0 -7
- package/dist/plugins/attributes/scrollIntoView.d.ts +0 -2
- package/dist/plugins/attributes/scrollIntoView.js +0 -19
- package/dist/plugins/attributes/scrollIntoView.js.map +0 -7
- package/dist/plugins/attributes/show.d.ts +0 -2
- package/dist/plugins/attributes/show.js +0 -19
- package/dist/plugins/attributes/show.js.map +0 -7
- package/dist/plugins/attributes/signals.d.ts +0 -2
- package/dist/plugins/attributes/signals.js +0 -13
- package/dist/plugins/attributes/signals.js.map +0 -7
- package/dist/plugins/attributes/style.d.ts +0 -2
- package/dist/plugins/attributes/style.js +0 -25
- package/dist/plugins/attributes/style.js.map +0 -7
- package/dist/plugins/attributes/text.d.ts +0 -1
- package/dist/plugins/attributes/text.js +0 -13
- package/dist/plugins/attributes/text.js.map +0 -7
- package/dist/plugins/attributes/viewTransition.d.ts +0 -1
- package/dist/plugins/attributes/viewTransition.js +0 -11
- package/dist/plugins/attributes/viewTransition.js.map +0 -7
- package/dist/sigmx.auto.js +0 -5
- package/dist/utils/object.d.ts +0 -9
- package/dist/utils/object.js +0 -26
- package/dist/utils/object.js.map +0 -7
- package/dist/utils/text.d.ts +0 -7
- package/dist/utils/text.js +0 -15
- package/dist/utils/text.js.map +0 -7
- package/dist/utils/timing.d.ts +0 -14
- package/dist/utils/timing.js +0 -58
- package/dist/utils/timing.js.map +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/plugins/functions/dispatch.ts"],
|
|
4
|
-
"sourcesContent": ["import { action } from '../../kernel/index.js'
|
|
5
|
-
"mappings": "AAAA,SAAS,cAAc;AAGhB,MAAM,WAAW,OAAO;AAAA,EAC7B,MAAM;AAAA,EACN,MAAM,CAAC,EAAE,GAAG,GAAG,MAAc,
|
|
4
|
+
"sourcesContent": ["import { action } from '../../kernel/index.js';\n\n/** `@dispatch('name', detail)` fires a bubbling CustomEvent from the element. */\nexport const dispatch = action({\n name: 'dispatch',\n call: ({ el }, name: string, detail?: unknown) =>\n el.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true })),\n});\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,cAAc;AAGhB,MAAM,WAAW,OAAO;AAAA,EAC7B,MAAM;AAAA,EACN,MAAM,CAAC,EAAE,GAAG,GAAG,MAAc,WAC3B,GAAG,cAAc,IAAI,YAAY,MAAM,EAAE,QAAQ,SAAS,MAAM,UAAU,KAAK,CAAC,CAAC;AACrF,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/plugins/functions/locale-format.ts"],
|
|
4
|
-
"sourcesContent": ["import { action } from '../../kernel/index.js'
|
|
4
|
+
"sourcesContent": ["import { action } from '../../kernel/index.js';\n\ntype Fmt = (locale: string | string[] | undefined, value: any, options: any) => string;\nconst formats: Record<string, Fmt> = {\n number: (l, v, o) => new Intl.NumberFormat(l, o).format(v),\n datetime: (l, v, o) => new Intl.DateTimeFormat(l, o).format(v),\n pluralRules: (l, v, o) => new Intl.PluralRules(l, o).select(v),\n relativeTime: (l, v, o) => new Intl.RelativeTimeFormat(l, o).format(v[0], v[1]),\n list: (l, v, o) => new Intl.ListFormat(l, o).format(v),\n displayNames: (l, v, o) => new Intl.DisplayNames(l, o).of(v) ?? '',\n};\n\n/** `@intl('number', 1234.5, { style: 'currency', currency: 'USD' }, 'en-US')`. */\nexport const intl = action({\n name: 'intl',\n call: ({ error }, type: string, value: unknown, options?: Record<string, unknown>, locale?: string | string[]) => {\n const f = formats[type];\n if (!f) throw error(`unknown @intl type \"${type}\"`);\n return f(locale, value, options);\n },\n});\n"],
|
|
5
5
|
"mappings": "AAAA,SAAS,cAAc;AAGvB,MAAM,UAA+B;AAAA,EACnC,QAAQ,CAAC,GAAG,GAAG,MAAM,IAAI,KAAK,aAAa,GAAG,CAAC,EAAE,OAAO,CAAC;AAAA,EACzD,UAAU,CAAC,GAAG,GAAG,MAAM,IAAI,KAAK,eAAe,GAAG,CAAC,EAAE,OAAO,CAAC;AAAA,EAC7D,aAAa,CAAC,GAAG,GAAG,MAAM,IAAI,KAAK,YAAY,GAAG,CAAC,EAAE,OAAO,CAAC;AAAA,EAC7D,cAAc,CAAC,GAAG,GAAG,MAAM,IAAI,KAAK,mBAAmB,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,EAC9E,MAAM,CAAC,GAAG,GAAG,MAAM,IAAI,KAAK,WAAW,GAAG,CAAC,EAAE,OAAO,CAAC;AAAA,EACrD,cAAc,CAAC,GAAG,GAAG,MAAM,IAAI,KAAK,aAAa,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK;AAClE;AAGO,MAAM,OAAO,OAAO;AAAA,EACzB,MAAM;AAAA,EACN,MAAM,CAAC,EAAE,MAAM,GAAG,MAAc,OAAgB,SAAmC,WAA+B;AAChH,UAAM,IAAI,QAAQ,IAAI;AACtB,QAAI,CAAC,EAAG,OAAM,MAAM,uBAAuB,IAAI,GAAG;AAClD,WAAO,EAAE,QAAQ,OAAO,OAAO;AAAA,EACjC;AACF,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/plugins/functions/range-map.ts"],
|
|
4
|
-
"sourcesContent": ["import { action } from '../../kernel/index.js'
|
|
4
|
+
"sourcesContent": ["import { action } from '../../kernel/index.js';\n\n/** Map `v` from [inMin, inMax] onto [outMin, outMax]; optionally clamp and round. */\nexport const fit = action({\n name: 'fit',\n call: (_, v: number, inMin: number, inMax: number, outMin: number, outMax: number, clamp = false, round = false) => {\n let t = (v - inMin) / (inMax - inMin);\n if (clamp) t = Math.min(1, Math.max(0, t));\n const out = outMin + t * (outMax - outMin);\n return round ? Math.round(out) : out;\n },\n});\n"],
|
|
5
5
|
"mappings": "AAAA,SAAS,cAAc;AAGhB,MAAM,MAAM,OAAO;AAAA,EACxB,MAAM;AAAA,EACN,MAAM,CAAC,GAAG,GAAW,OAAe,OAAe,QAAgB,QAAgB,QAAQ,OAAO,QAAQ,UAAU;AAClH,QAAI,KAAK,IAAI,UAAU,QAAQ;AAC/B,QAAI,MAAO,KAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;AACzC,UAAM,MAAM,SAAS,KAAK,SAAS;AACnC,WAAO,QAAQ,KAAK,MAAM,GAAG,IAAI;AAAA,EACnC;AACF,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -5,9 +5,18 @@ const inflight = /* @__PURE__ */ new Map();
|
|
|
5
5
|
let seq = 0;
|
|
6
6
|
const sleep = (ms, signal) => new Promise((resolve) => {
|
|
7
7
|
const t = setTimeout(resolve, ms);
|
|
8
|
-
signal.addEventListener(
|
|
8
|
+
signal.addEventListener(
|
|
9
|
+
"abort",
|
|
10
|
+
() => {
|
|
11
|
+
clearTimeout(t);
|
|
12
|
+
resolve();
|
|
13
|
+
},
|
|
14
|
+
{ once: true }
|
|
15
|
+
);
|
|
9
16
|
});
|
|
10
|
-
const untilVisible = () => new Promise(
|
|
17
|
+
const untilVisible = () => new Promise(
|
|
18
|
+
(resolve) => document.addEventListener("visibilitychange", () => !document.hidden && resolve(), { once: true })
|
|
19
|
+
);
|
|
11
20
|
const headerArgs = (res, names, data) => {
|
|
12
21
|
for (const n of names) {
|
|
13
22
|
const v = res.headers.get(`sigmx-${n}`);
|
|
@@ -58,7 +67,7 @@ const send = async (method, ctx, url, o = {}) => {
|
|
|
58
67
|
form.reportValidity();
|
|
59
68
|
return;
|
|
60
69
|
}
|
|
61
|
-
const submitter = evt instanceof SubmitEvent ? evt.submitter : el instanceof HTMLButtonElement ? el : null;
|
|
70
|
+
const submitter = evt instanceof SubmitEvent ? evt.submitter : el instanceof HTMLButtonElement && el.form === form ? el : null;
|
|
62
71
|
const fd = new FormData(form, submitter);
|
|
63
72
|
const multipart = form.enctype === "multipart/form-data";
|
|
64
73
|
if (bodyAllowed) {
|
|
@@ -116,8 +125,13 @@ const send = async (method, ctx, url, o = {}) => {
|
|
|
116
125
|
continue;
|
|
117
126
|
}
|
|
118
127
|
const text = await res.text();
|
|
119
|
-
if (ct.includes("text/html"))
|
|
120
|
-
|
|
128
|
+
if (ct.includes("text/html"))
|
|
129
|
+
runtime.handle(
|
|
130
|
+
"patch-elements",
|
|
131
|
+
headerArgs(res, ["selector", "mode", "use-view-transition"], { elements: text })
|
|
132
|
+
);
|
|
133
|
+
else if (ct.includes("application/json"))
|
|
134
|
+
runtime.handle("patch-signals", headerArgs(res, ["only-if-missing"], { signals: text }));
|
|
121
135
|
else if (ct.includes("javascript")) runScript(text);
|
|
122
136
|
return;
|
|
123
137
|
} catch {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/plugins/functions/request.ts"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
5
|
-
"mappings": "AAAA,
|
|
4
|
+
"sourcesContent": ["import { type ActionCtx, action, type Filter, untracked } 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(\n 'abort',\n () => {\n clearTimeout(t);\n resolve();\n },\n { once: true },\n );\n });\nconst untilVisible = () =>\n new Promise<void>((resolve) =>\n document.addEventListener('visibilitychange', () => !document.hidden && resolve(), { once: true }),\n );\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> = {}) =>\n 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 =\n evt instanceof SubmitEvent ? evt.submitter : el instanceof HTMLButtonElement && el.form === form ? 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'))\n runtime.handle(\n 'patch-elements',\n headerArgs(res, ['selector', 'mode', 'use-view-transition'], { elements: text }),\n );\n else if (ct.includes('application/json'))\n 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) =>\n 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
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/plugins/functions/untracked-read.ts"],
|
|
4
|
-
"sourcesContent": ["import { action, untracked } from '../../kernel/index.js'
|
|
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
5
|
"mappings": "AAAA,SAAS,QAAQ,iBAAiB;AAG3B,MAAM,OAAO,OAAO,EAAE,MAAM,QAAQ,MAAM,CAAC,GAAG,OAAsB,UAAU,EAAE,EAAE,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -26,7 +26,11 @@ ${val}` : val;
|
|
|
26
26
|
}
|
|
27
27
|
};
|
|
28
28
|
cleanup(() => socket.close());
|
|
29
|
-
return {
|
|
29
|
+
return {
|
|
30
|
+
send: (d) => socket.send(typeof d === "string" ? d : JSON.stringify(d)),
|
|
31
|
+
close: () => socket.close(),
|
|
32
|
+
socket
|
|
33
|
+
};
|
|
30
34
|
}
|
|
31
35
|
});
|
|
32
36
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/plugins/functions/websocket.ts"],
|
|
4
|
-
"sourcesContent": ["import { action } from '../../kernel/index.js'
|
|
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,
|
|
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 {\n send: (d) => socket.send(typeof d === 'string' ? d : JSON.stringify(d)),\n close: () => socket.close(),\n socket,\n };\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;AAAA,MACL,MAAM,CAAC,MAAM,OAAO,KAAK,OAAO,MAAM,WAAW,IAAI,KAAK,UAAU,CAAC,CAAC;AAAA,MACtE,OAAO,MAAM,OAAO,MAAM;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/plugins/index.d.ts
CHANGED
|
@@ -1,52 +1,52 @@
|
|
|
1
1
|
export { attr } from './directives/attribute-sync.js';
|
|
2
|
-
export {
|
|
2
|
+
export { boost } from './directives/boost.js';
|
|
3
|
+
export { indicator } from './directives/busy-flag.js';
|
|
3
4
|
export { className } from './directives/class-toggle.js';
|
|
5
|
+
export { cloak } from './directives/cloak.js';
|
|
6
|
+
export { collapse } from './directives/collapse.js';
|
|
7
|
+
export { signals } from './directives/declare.js';
|
|
4
8
|
export { computed } from './directives/derive.js';
|
|
5
|
-
export {
|
|
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';
|
|
9
|
+
export { ref } from './directives/element-ref.js';
|
|
11
10
|
export { on } from './directives/event-listener.js';
|
|
12
|
-
export { onIntersect } from './directives/viewport.js';
|
|
13
|
-
export { onInterval } from './directives/timer.js';
|
|
14
11
|
export { onRaf } from './directives/frame-loop.js';
|
|
15
|
-
export {
|
|
12
|
+
export { html } from './directives/html.js';
|
|
13
|
+
export { style } from './directives/inline-style.js';
|
|
14
|
+
export { applyMask, mask } from './directives/mask.js';
|
|
15
|
+
export { matchMedia } from './directives/media-query.js';
|
|
16
|
+
export { init } from './directives/on-mount.js';
|
|
16
17
|
export { onSignalPatch } from './directives/patch-listener.js';
|
|
18
|
+
export { removeMe } from './directives/remove-me.js';
|
|
19
|
+
export { scrollIntoView } from './directives/scroll-to.js';
|
|
20
|
+
export { onResize } from './directives/size-watch.js';
|
|
21
|
+
export { jsonSignals } from './directives/state-dump.js';
|
|
17
22
|
export { persist } from './directives/storage-sync.js';
|
|
23
|
+
export { teleport } from './directives/teleport.js';
|
|
24
|
+
export { text } from './directives/text-content.js';
|
|
25
|
+
export { onInterval } from './directives/timer.js';
|
|
26
|
+
export { transition } from './directives/transition.js';
|
|
27
|
+
export { viewTransition } from './directives/transition-name.js';
|
|
28
|
+
export { trap } from './directives/trap.js';
|
|
29
|
+
export { animate } from './directives/tween.js';
|
|
30
|
+
export { bind } from './directives/two-way-bind.js';
|
|
18
31
|
export { queryString } from './directives/url-params.js';
|
|
19
|
-
export { ref } from './directives/element-ref.js';
|
|
20
32
|
export { replaceUrl } from './directives/url-replace.js';
|
|
21
|
-
export {
|
|
33
|
+
export { customValidity } from './directives/validity.js';
|
|
34
|
+
export { onIntersect } from './directives/viewport.js';
|
|
22
35
|
export { show } from './directives/visibility.js';
|
|
23
|
-
export {
|
|
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';
|
|
36
|
+
export { effect } from './directives/watch.js';
|
|
31
37
|
export { setAll } from './functions/bulk-set.js';
|
|
32
38
|
export { toggleAll } from './functions/bulk-toggle.js';
|
|
33
|
-
export {
|
|
34
|
-
export {
|
|
39
|
+
export { confirm } from './functions/confirm.js';
|
|
40
|
+
export { clipboard } from './functions/copy-text.js';
|
|
41
|
+
export { dispatch } from './functions/dispatch.js';
|
|
42
|
+
export { intl } from './functions/locale-format.js';
|
|
43
|
+
export { fit } from './functions/range-map.js';
|
|
35
44
|
export type { RequestOptions } from './functions/request.js';
|
|
45
|
+
export { httpDelete, httpGet, httpPatch, httpPost, httpPut } from './functions/request.js';
|
|
46
|
+
export { peek } from './functions/untracked-read.js';
|
|
47
|
+
export type { Socket } from './functions/websocket.js';
|
|
48
|
+
export { websocket } from './functions/websocket.js';
|
|
36
49
|
export { applyElements } from './server-events/apply-elements.js';
|
|
37
50
|
export { applyState } from './server-events/apply-state.js';
|
|
38
|
-
export { activateScripts, morph, morphInner } from './server-events/morph.js';
|
|
39
51
|
export type { MorphOptions } from './server-events/morph.js';
|
|
40
|
-
export {
|
|
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';
|
|
52
|
+
export { activateScripts, morph, morphInner } from './server-events/morph.js';
|
package/dist/plugins/index.js
CHANGED
|
@@ -1,52 +1,52 @@
|
|
|
1
1
|
import { attr } from "./directives/attribute-sync.js";
|
|
2
|
-
import {
|
|
2
|
+
import { boost } from "./directives/boost.js";
|
|
3
|
+
import { indicator } from "./directives/busy-flag.js";
|
|
3
4
|
import { className } from "./directives/class-toggle.js";
|
|
5
|
+
import { cloak } from "./directives/cloak.js";
|
|
6
|
+
import { collapse } from "./directives/collapse.js";
|
|
7
|
+
import { signals } from "./directives/declare.js";
|
|
4
8
|
import { computed } from "./directives/derive.js";
|
|
5
|
-
import {
|
|
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";
|
|
9
|
+
import { ref } from "./directives/element-ref.js";
|
|
11
10
|
import { on } from "./directives/event-listener.js";
|
|
12
|
-
import { onIntersect } from "./directives/viewport.js";
|
|
13
|
-
import { onInterval } from "./directives/timer.js";
|
|
14
11
|
import { onRaf } from "./directives/frame-loop.js";
|
|
15
|
-
import {
|
|
12
|
+
import { html } from "./directives/html.js";
|
|
13
|
+
import { style } from "./directives/inline-style.js";
|
|
14
|
+
import { applyMask, mask } from "./directives/mask.js";
|
|
15
|
+
import { matchMedia } from "./directives/media-query.js";
|
|
16
|
+
import { init } from "./directives/on-mount.js";
|
|
16
17
|
import { onSignalPatch } from "./directives/patch-listener.js";
|
|
18
|
+
import { removeMe } from "./directives/remove-me.js";
|
|
19
|
+
import { scrollIntoView } from "./directives/scroll-to.js";
|
|
20
|
+
import { onResize } from "./directives/size-watch.js";
|
|
21
|
+
import { jsonSignals } from "./directives/state-dump.js";
|
|
17
22
|
import { persist } from "./directives/storage-sync.js";
|
|
23
|
+
import { teleport } from "./directives/teleport.js";
|
|
24
|
+
import { text } from "./directives/text-content.js";
|
|
25
|
+
import { onInterval } from "./directives/timer.js";
|
|
26
|
+
import { transition } from "./directives/transition.js";
|
|
27
|
+
import { viewTransition } from "./directives/transition-name.js";
|
|
28
|
+
import { trap } from "./directives/trap.js";
|
|
29
|
+
import { animate } from "./directives/tween.js";
|
|
30
|
+
import { bind } from "./directives/two-way-bind.js";
|
|
18
31
|
import { queryString } from "./directives/url-params.js";
|
|
19
|
-
import { ref } from "./directives/element-ref.js";
|
|
20
32
|
import { replaceUrl } from "./directives/url-replace.js";
|
|
21
|
-
import {
|
|
33
|
+
import { customValidity } from "./directives/validity.js";
|
|
34
|
+
import { onIntersect } from "./directives/viewport.js";
|
|
22
35
|
import { show } from "./directives/visibility.js";
|
|
23
|
-
import {
|
|
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";
|
|
36
|
+
import { effect } from "./directives/watch.js";
|
|
31
37
|
import { setAll } from "./functions/bulk-set.js";
|
|
32
38
|
import { toggleAll } from "./functions/bulk-toggle.js";
|
|
33
|
-
import {
|
|
39
|
+
import { confirm } from "./functions/confirm.js";
|
|
40
|
+
import { clipboard } from "./functions/copy-text.js";
|
|
41
|
+
import { dispatch } from "./functions/dispatch.js";
|
|
42
|
+
import { intl } from "./functions/locale-format.js";
|
|
43
|
+
import { fit } from "./functions/range-map.js";
|
|
34
44
|
import { httpDelete, httpGet, httpPatch, httpPost, httpPut } from "./functions/request.js";
|
|
45
|
+
import { peek } from "./functions/untracked-read.js";
|
|
46
|
+
import { websocket } from "./functions/websocket.js";
|
|
35
47
|
import { applyElements } from "./server-events/apply-elements.js";
|
|
36
48
|
import { applyState } from "./server-events/apply-state.js";
|
|
37
49
|
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
50
|
export {
|
|
51
51
|
activateScripts,
|
|
52
52
|
animate,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/plugins/index.ts"],
|
|
4
|
-
"sourcesContent": ["
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["export { attr } from './directives/attribute-sync.js';\nexport { boost } from './directives/boost.js';\nexport { indicator } from './directives/busy-flag.js';\nexport { className } from './directives/class-toggle.js';\nexport { cloak } from './directives/cloak.js';\nexport { collapse } from './directives/collapse.js';\nexport { signals } from './directives/declare.js';\nexport { computed } from './directives/derive.js';\nexport { ref } from './directives/element-ref.js';\nexport { on } from './directives/event-listener.js';\nexport { onRaf } from './directives/frame-loop.js';\nexport { html } from './directives/html.js';\nexport { style } from './directives/inline-style.js';\nexport { applyMask, mask } from './directives/mask.js';\nexport { matchMedia } from './directives/media-query.js';\nexport { init } from './directives/on-mount.js';\nexport { onSignalPatch } from './directives/patch-listener.js';\nexport { removeMe } from './directives/remove-me.js';\nexport { scrollIntoView } from './directives/scroll-to.js';\nexport { onResize } from './directives/size-watch.js';\nexport { jsonSignals } from './directives/state-dump.js';\nexport { persist } from './directives/storage-sync.js';\nexport { teleport } from './directives/teleport.js';\nexport { text } from './directives/text-content.js';\nexport { onInterval } from './directives/timer.js';\nexport { transition } from './directives/transition.js';\nexport { viewTransition } from './directives/transition-name.js';\nexport { trap } from './directives/trap.js';\nexport { animate } from './directives/tween.js';\nexport { bind } from './directives/two-way-bind.js';\nexport { queryString } from './directives/url-params.js';\nexport { replaceUrl } from './directives/url-replace.js';\nexport { customValidity } from './directives/validity.js';\nexport { onIntersect } from './directives/viewport.js';\nexport { show } from './directives/visibility.js';\nexport { effect } from './directives/watch.js';\nexport { setAll } from './functions/bulk-set.js';\nexport { toggleAll } from './functions/bulk-toggle.js';\nexport { confirm } from './functions/confirm.js';\nexport { clipboard } from './functions/copy-text.js';\nexport { dispatch } from './functions/dispatch.js';\nexport { intl } from './functions/locale-format.js';\nexport { fit } from './functions/range-map.js';\nexport type { RequestOptions } from './functions/request.js';\nexport { httpDelete, httpGet, httpPatch, httpPost, httpPut } from './functions/request.js';\nexport { peek } from './functions/untracked-read.js';\nexport type { Socket } from './functions/websocket.js';\nexport { websocket } from './functions/websocket.js';\nexport { applyElements } from './server-events/apply-elements.js';\nexport { applyState } from './server-events/apply-state.js';\nexport type { MorphOptions } from './server-events/morph.js';\nexport { activateScripts, morph, morphInner } from './server-events/morph.js';\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,YAAY;AACrB,SAAS,aAAa;AACtB,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAC1B,SAAS,aAAa;AACtB,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB,SAAS,WAAW;AACpB,SAAS,UAAU;AACnB,SAAS,aAAa;AACtB,SAAS,YAAY;AACrB,SAAS,aAAa;AACtB,SAAS,WAAW,YAAY;AAChC,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAC/B,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,YAAY;AACrB,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAC/B,SAAS,mBAAmB;AAC5B,SAAS,YAAY;AACrB,SAAS,cAAc;AACvB,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,WAAW;AAEpB,SAAS,YAAY,SAAS,WAAW,UAAU,eAAe;AAClE,SAAS,YAAY;AAErB,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB;AAE3B,SAAS,iBAAiB,OAAO,kBAAkB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -29,7 +29,10 @@ const apply = (runtime, html, selector, mode) => {
|
|
|
29
29
|
continue;
|
|
30
30
|
}
|
|
31
31
|
if (mode === "outer") morph(target, child, o);
|
|
32
|
-
else
|
|
32
|
+
else {
|
|
33
|
+
target.replaceWith(child);
|
|
34
|
+
activateScripts(child);
|
|
35
|
+
}
|
|
33
36
|
}
|
|
34
37
|
return;
|
|
35
38
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/plugins/server-events/apply-elements.ts"],
|
|
4
|
-
"sourcesContent": ["import { handler, type Runtime } from '../../kernel/index.js'
|
|
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,
|
|
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 {\n target.replaceWith(child);\n activateScripts(child);\n }\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,WACvC;AACH,eAAO,YAAY,KAAK;AACxB,wBAAgB,KAAK;AAAA,MACvB;AAAA,IACF;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
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/plugins/server-events/apply-state.ts"],
|
|
4
|
-
"sourcesContent": ["import { handler } from '../../kernel/index.js'
|
|
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
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
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -6,7 +6,5 @@ export type MorphOptions = {
|
|
|
6
6
|
};
|
|
7
7
|
/** Scripts inserted through the DOM do not execute; replace them with fresh copies that do. */
|
|
8
8
|
export declare const activateScripts: (root: Node) => void;
|
|
9
|
-
/** Morph `target` into `next` (outer). */
|
|
10
9
|
export declare const morph: (target: Element, next: Element, o?: MorphOptions) => void;
|
|
11
|
-
/** Morph the children of `target` into the children of `next` (inner). */
|
|
12
10
|
export declare const morphInner: (target: Element, next: ParentNode, o?: MorphOptions) => void;
|
|
@@ -30,20 +30,38 @@ const findKept = (id, from, ctx) => {
|
|
|
30
30
|
};
|
|
31
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
32
|
const syncAttributes = (a, b, ctx) => {
|
|
33
|
-
const keep = new Set(
|
|
33
|
+
const keep = new Set(
|
|
34
|
+
(b.getAttribute(ctx.preserve) ?? a.getAttribute(ctx.preserve) ?? "").split(/\s+/).filter(Boolean)
|
|
35
|
+
);
|
|
34
36
|
let changed = false;
|
|
35
37
|
const attrDiffers = (name) => !keep.has(name) && a.getAttribute(name) !== b.getAttribute(name);
|
|
36
38
|
if (a instanceof HTMLInputElement && b instanceof HTMLInputElement && a.type !== "file") {
|
|
37
|
-
if (attrDiffers("value"))
|
|
38
|
-
|
|
39
|
+
if (attrDiffers("value")) {
|
|
40
|
+
a.value = b.getAttribute("value") ?? "";
|
|
41
|
+
changed = true;
|
|
42
|
+
}
|
|
43
|
+
if (attrDiffers("checked")) {
|
|
44
|
+
a.checked = b.hasAttribute("checked");
|
|
45
|
+
changed = true;
|
|
46
|
+
}
|
|
39
47
|
} else if (a instanceof HTMLTextAreaElement && b instanceof HTMLTextAreaElement) {
|
|
40
|
-
if (!keep.has("value") && a.defaultValue !== b.defaultValue)
|
|
48
|
+
if (!keep.has("value") && a.defaultValue !== b.defaultValue) {
|
|
49
|
+
a.value = b.defaultValue;
|
|
50
|
+
changed = true;
|
|
51
|
+
}
|
|
41
52
|
} else if (a instanceof HTMLOptionElement && b instanceof HTMLOptionElement) {
|
|
42
|
-
if (attrDiffers("selected"))
|
|
53
|
+
if (attrDiffers("selected")) {
|
|
54
|
+
a.selected = b.hasAttribute("selected");
|
|
55
|
+
changed = true;
|
|
56
|
+
}
|
|
43
57
|
}
|
|
44
|
-
for (const { name, value } of b.attributes)
|
|
58
|
+
for (const { name, value } of b.attributes)
|
|
59
|
+
if (!keep.has(name) && a.getAttribute(name) !== value) a.setAttribute(name, value);
|
|
45
60
|
for (const { name } of [...a.attributes]) if (!keep.has(name) && !b.hasAttribute(name)) a.removeAttribute(name);
|
|
46
|
-
if (changed)
|
|
61
|
+
if (changed)
|
|
62
|
+
(a instanceof HTMLOptionElement ? a.closest("select") : a)?.dispatchEvent(
|
|
63
|
+
new Event("sigmx-prop-change", { bubbles: true })
|
|
64
|
+
);
|
|
47
65
|
};
|
|
48
66
|
const morphNode = (a, b, ctx) => {
|
|
49
67
|
if (a.nodeType !== b.nodeType || a.nodeName !== b.nodeName) {
|
|
@@ -106,7 +124,12 @@ const context = (target, next, o) => {
|
|
|
106
124
|
const keep = /* @__PURE__ */ new Set();
|
|
107
125
|
const wanted = new Map(idsIn(next).map((e) => [e.id, e.tagName]));
|
|
108
126
|
for (const e of idsIn(target)) if (wanted.get(e.id) === e.tagName) keep.add(e.id);
|
|
109
|
-
return {
|
|
127
|
+
return {
|
|
128
|
+
keep,
|
|
129
|
+
pantry: document.createDocumentFragment(),
|
|
130
|
+
ignore: o.ignoreAttr ?? "data-ignore-morph",
|
|
131
|
+
preserve: o.preserveAttr ?? "data-preserve-attr"
|
|
132
|
+
};
|
|
110
133
|
};
|
|
111
134
|
const morph = (target, next, o = {}) => {
|
|
112
135
|
const ctx = context(target, next, o);
|