sigmx 0.1.0 → 0.2.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/README.md +54 -43
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +2 -2
- package/dist/kernel/compile.d.ts +8 -9
- package/dist/kernel/compile.js +102 -67
- package/dist/kernel/compile.js.map +2 -2
- package/dist/kernel/contracts.d.ts +12 -13
- package/dist/kernel/index.d.ts +11 -12
- package/dist/kernel/index.js +14 -12
- package/dist/kernel/index.js.map +3 -3
- package/dist/kernel/precompile.d.ts +8 -12
- package/dist/kernel/precompile.js +33 -76
- package/dist/kernel/precompile.js.map +2 -2
- package/dist/kernel/precompiled.d.ts +7 -4
- package/dist/kernel/precompiled.js +5 -5
- package/dist/kernel/precompiled.js.map +2 -2
- package/dist/kernel/reactive.d.ts +13 -11
- package/dist/kernel/reactive.js +96 -71
- package/dist/kernel/reactive.js.map +3 -3
- package/dist/kernel/runtime.js +85 -63
- package/dist/kernel/runtime.js.map +3 -3
- package/dist/kernel/scan.d.ts +2 -11
- package/dist/kernel/scan.js +26 -9
- package/dist/kernel/scan.js.map +2 -2
- package/dist/kernel/state.d.ts +5 -8
- package/dist/kernel/state.js +114 -76
- package/dist/kernel/state.js.map +2 -2
- package/dist/kernel/strict-csp.d.ts +0 -5
- package/dist/kernel/strict-csp.js +2 -2
- package/dist/kernel/strict-csp.js.map +2 -2
- package/dist/lib/casing.d.ts +4 -1
- package/dist/lib/casing.js +8 -1
- package/dist/lib/casing.js.map +2 -2
- package/dist/lib/objects.d.ts +5 -4
- package/dist/lib/objects.js +13 -5
- package/dist/lib/objects.js.map +2 -2
- package/dist/lib/schedule.d.ts +3 -5
- package/dist/lib/schedule.js +12 -10
- package/dist/lib/schedule.js.map +2 -2
- package/dist/lib/sse.d.ts +10 -1
- package/dist/lib/sse.js +32 -28
- package/dist/lib/sse.js.map +2 -2
- package/dist/plugins/def.d.ts +5 -0
- package/dist/plugins/def.js +22 -0
- package/dist/plugins/def.js.map +7 -0
- package/dist/plugins/directives/attribute-sync.js +8 -12
- package/dist/plugins/directives/attribute-sync.js.map +2 -2
- package/dist/plugins/directives/boost.d.ts +1 -1
- package/dist/plugins/directives/boost.js +34 -30
- package/dist/plugins/directives/boost.js.map +2 -2
- package/dist/plugins/directives/busy-flag.js +13 -16
- package/dist/plugins/directives/busy-flag.js.map +2 -2
- package/dist/plugins/directives/class-toggle.js +17 -16
- package/dist/plugins/directives/class-toggle.js.map +2 -2
- package/dist/plugins/directives/cloak.js +2 -7
- package/dist/plugins/directives/cloak.js.map +2 -2
- package/dist/plugins/directives/collapse.js +36 -37
- package/dist/plugins/directives/collapse.js.map +2 -2
- package/dist/plugins/directives/declare.js +5 -8
- package/dist/plugins/directives/declare.js.map +2 -2
- package/dist/plugins/directives/derive.js +9 -15
- package/dist/plugins/directives/derive.js.map +2 -2
- package/dist/plugins/directives/element-ref.js +8 -8
- package/dist/plugins/directives/element-ref.js.map +2 -2
- package/dist/plugins/directives/event-listener.js +18 -23
- package/dist/plugins/directives/event-listener.js.map +2 -2
- package/dist/plugins/directives/frame-loop.js +9 -14
- package/dist/plugins/directives/frame-loop.js.map +2 -2
- package/dist/plugins/directives/html.js +6 -7
- package/dist/plugins/directives/html.js.map +2 -2
- package/dist/plugins/directives/inline-style.js +17 -20
- package/dist/plugins/directives/inline-style.js.map +2 -2
- package/dist/plugins/directives/mask.js +19 -23
- package/dist/plugins/directives/mask.js.map +2 -2
- package/dist/plugins/directives/media-query.d.ts +4 -1
- package/dist/plugins/directives/media-query.js +13 -12
- package/dist/plugins/directives/media-query.js.map +2 -2
- package/dist/plugins/directives/on-mount.js +4 -9
- package/dist/plugins/directives/on-mount.js.map +2 -2
- package/dist/plugins/directives/patch-listener.js +24 -19
- package/dist/plugins/directives/patch-listener.js.map +2 -2
- package/dist/plugins/directives/remove-me.js +7 -8
- package/dist/plugins/directives/remove-me.js.map +2 -2
- package/dist/plugins/directives/scroll-to.d.ts +4 -1
- package/dist/plugins/directives/scroll-to.js +8 -14
- package/dist/plugins/directives/scroll-to.js.map +2 -2
- package/dist/plugins/directives/size-watch.js +7 -12
- package/dist/plugins/directives/size-watch.js.map +2 -2
- package/dist/plugins/directives/state-dump.js +6 -10
- package/dist/plugins/directives/state-dump.js.map +2 -2
- package/dist/plugins/directives/storage-sync.js +13 -9
- package/dist/plugins/directives/storage-sync.js.map +2 -2
- package/dist/plugins/directives/teleport.js +8 -14
- package/dist/plugins/directives/teleport.js.map +2 -2
- package/dist/plugins/directives/text-content.js +6 -7
- package/dist/plugins/directives/text-content.js.map +2 -2
- package/dist/plugins/directives/timer.js +7 -13
- package/dist/plugins/directives/timer.js.map +2 -2
- package/dist/plugins/directives/transition.d.ts +1 -2
- package/dist/plugins/directives/transition.js +32 -34
- package/dist/plugins/directives/transition.js.map +2 -2
- package/dist/plugins/directives/tween.d.ts +2 -2
- package/dist/plugins/directives/tween.js +34 -50
- package/dist/plugins/directives/tween.js.map +2 -2
- package/dist/plugins/directives/two-way-bind.d.ts +1 -1
- package/dist/plugins/directives/two-way-bind.js +70 -67
- package/dist/plugins/directives/two-way-bind.js.map +2 -2
- package/dist/plugins/directives/url-params.js +36 -59
- package/dist/plugins/directives/url-params.js.map +3 -3
- package/dist/plugins/directives/url-replace.js +6 -7
- package/dist/plugins/directives/url-replace.js.map +2 -2
- package/dist/plugins/directives/validity.js +6 -9
- package/dist/plugins/directives/validity.js.map +2 -2
- package/dist/plugins/directives/viewport.js +18 -23
- package/dist/plugins/directives/viewport.js.map +2 -2
- package/dist/plugins/directives/visibility.js +9 -14
- package/dist/plugins/directives/visibility.js.map +2 -2
- package/dist/plugins/directives/watch.d.ts +0 -1
- package/dist/plugins/directives/watch.js +2 -8
- package/dist/plugins/directives/watch.js.map +2 -2
- package/dist/plugins/functions/bulk-set.js +10 -7
- package/dist/plugins/functions/bulk-set.js.map +2 -2
- package/dist/plugins/functions/bulk-toggle.js +10 -7
- package/dist/plugins/functions/bulk-toggle.js.map +2 -2
- package/dist/plugins/functions/confirm.js +2 -2
- package/dist/plugins/functions/confirm.js.map +2 -2
- package/dist/plugins/functions/copy-text.js +5 -5
- package/dist/plugins/functions/copy-text.js.map +2 -2
- package/dist/plugins/functions/dispatch.js +5 -5
- package/dist/plugins/functions/dispatch.js.map +2 -2
- package/dist/plugins/functions/locale-format.d.ts +4 -1
- package/dist/plugins/functions/locale-format.js +9 -16
- package/dist/plugins/functions/locale-format.js.map +2 -2
- package/dist/plugins/functions/range-map.js +6 -6
- package/dist/plugins/functions/range-map.js.map +2 -2
- package/dist/plugins/functions/request.d.ts +7 -3
- package/dist/plugins/functions/request.js +85 -80
- package/dist/plugins/functions/request.js.map +2 -2
- package/dist/plugins/functions/untracked-read.js +3 -2
- package/dist/plugins/functions/untracked-read.js.map +2 -2
- package/dist/plugins/functions/websocket.d.ts +3 -3
- package/dist/plugins/functions/websocket.js +18 -25
- package/dist/plugins/functions/websocket.js.map +2 -2
- package/dist/plugins/index.d.ts +34 -36
- package/dist/plugins/index.js +31 -35
- package/dist/plugins/index.js.map +2 -2
- package/dist/plugins/server-events/apply-elements.d.ts +1 -1
- package/dist/plugins/server-events/apply-elements.js +41 -40
- package/dist/plugins/server-events/apply-elements.js.map +2 -2
- package/dist/plugins/server-events/apply-state.js +9 -12
- package/dist/plugins/server-events/apply-state.js.map +2 -2
- package/dist/plugins/server-events/morph.d.ts +0 -2
- package/dist/plugins/server-events/morph.js +58 -55
- package/dist/plugins/server-events/morph.js.map +3 -3
- package/dist/presets/all.d.ts +0 -1
- package/dist/presets/all.js +22 -26
- 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 +108 -0
- package/dist/server.js +218 -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 +48 -15
- package/dist/vite.js.map +2 -2
- package/package.json +21 -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/plugins/directives/transition-name.d.ts +0 -1
- package/dist/plugins/directives/transition-name.js +0 -11
- package/dist/plugins/directives/transition-name.js.map +0 -7
- package/dist/plugins/directives/trap.d.ts +0 -5
- package/dist/plugins/directives/trap.js +0 -48
- package/dist/plugins/directives/trap.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
package/dist/presets/all.js
CHANGED
|
@@ -1,13 +1,31 @@
|
|
|
1
1
|
import {
|
|
2
|
+
animate,
|
|
3
|
+
applyElements,
|
|
4
|
+
applyState,
|
|
2
5
|
attr,
|
|
3
6
|
bind,
|
|
7
|
+
boost,
|
|
4
8
|
className,
|
|
9
|
+
clipboard,
|
|
10
|
+
cloak,
|
|
11
|
+
collapse,
|
|
5
12
|
computed,
|
|
13
|
+
confirm,
|
|
6
14
|
customValidity,
|
|
15
|
+
dispatch,
|
|
7
16
|
effect,
|
|
17
|
+
fit,
|
|
18
|
+
html,
|
|
19
|
+
httpDelete,
|
|
20
|
+
httpGet,
|
|
21
|
+
httpPatch,
|
|
22
|
+
httpPost,
|
|
23
|
+
httpPut,
|
|
8
24
|
indicator,
|
|
9
25
|
init,
|
|
26
|
+
intl,
|
|
10
27
|
jsonSignals,
|
|
28
|
+
mask,
|
|
11
29
|
matchMedia,
|
|
12
30
|
on,
|
|
13
31
|
onIntersect,
|
|
@@ -15,41 +33,21 @@ import {
|
|
|
15
33
|
onRaf,
|
|
16
34
|
onResize,
|
|
17
35
|
onSignalPatch,
|
|
36
|
+
peek,
|
|
18
37
|
persist,
|
|
19
38
|
queryString,
|
|
20
39
|
ref,
|
|
40
|
+
removeMe,
|
|
21
41
|
replaceUrl,
|
|
22
42
|
scrollIntoView,
|
|
43
|
+
setAll,
|
|
23
44
|
show,
|
|
24
45
|
signals,
|
|
25
46
|
style,
|
|
47
|
+
teleport,
|
|
26
48
|
text,
|
|
27
|
-
viewTransition,
|
|
28
|
-
clipboard,
|
|
29
|
-
fit,
|
|
30
|
-
intl,
|
|
31
|
-
peek,
|
|
32
|
-
setAll,
|
|
33
49
|
toggleAll,
|
|
34
|
-
animate,
|
|
35
|
-
httpDelete,
|
|
36
|
-
httpGet,
|
|
37
|
-
httpPatch,
|
|
38
|
-
httpPost,
|
|
39
|
-
httpPut,
|
|
40
|
-
applyElements,
|
|
41
|
-
applyState,
|
|
42
|
-
boost,
|
|
43
|
-
cloak,
|
|
44
|
-
collapse,
|
|
45
|
-
html,
|
|
46
|
-
mask,
|
|
47
|
-
removeMe,
|
|
48
|
-
teleport,
|
|
49
50
|
transition,
|
|
50
|
-
trap,
|
|
51
|
-
confirm,
|
|
52
|
-
dispatch,
|
|
53
51
|
websocket
|
|
54
52
|
} from "../plugins/index.js";
|
|
55
53
|
const all = [
|
|
@@ -78,7 +76,6 @@ const all = [
|
|
|
78
76
|
signals,
|
|
79
77
|
style,
|
|
80
78
|
text,
|
|
81
|
-
viewTransition,
|
|
82
79
|
clipboard,
|
|
83
80
|
fit,
|
|
84
81
|
intl,
|
|
@@ -101,7 +98,6 @@ const all = [
|
|
|
101
98
|
removeMe,
|
|
102
99
|
teleport,
|
|
103
100
|
transition,
|
|
104
|
-
trap,
|
|
105
101
|
confirm,
|
|
106
102
|
dispatch,
|
|
107
103
|
websocket
|
package/dist/presets/all.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/presets/all.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Plugin } from '../kernel/contracts.js'
|
|
5
|
-
"mappings": "AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,
|
|
4
|
+
"sourcesContent": ["import type { Plugin } from '../kernel/contracts.js';\nimport {\n animate,\n applyElements,\n applyState,\n attr,\n bind,\n boost,\n className,\n clipboard,\n cloak,\n collapse,\n computed,\n confirm,\n customValidity,\n dispatch,\n effect,\n fit,\n html,\n httpDelete,\n httpGet,\n httpPatch,\n httpPost,\n httpPut,\n indicator,\n init,\n intl,\n jsonSignals,\n mask,\n matchMedia,\n on,\n onIntersect,\n onInterval,\n onRaf,\n onResize,\n onSignalPatch,\n peek,\n persist,\n queryString,\n ref,\n removeMe,\n replaceUrl,\n scrollIntoView,\n setAll,\n show,\n signals,\n style,\n teleport,\n text,\n toggleAll,\n transition,\n websocket,\n} from '../plugins/index.js';\n\nexport const all: Plugin[] = [\n attr,\n bind,\n className,\n computed,\n customValidity,\n effect,\n indicator,\n init,\n jsonSignals,\n matchMedia,\n on,\n onIntersect,\n onInterval,\n onRaf,\n onResize,\n onSignalPatch,\n persist,\n queryString,\n ref,\n replaceUrl,\n scrollIntoView,\n show,\n signals,\n style,\n text,\n clipboard,\n fit,\n intl,\n peek,\n setAll,\n toggleAll,\n animate,\n httpDelete,\n httpGet,\n httpPatch,\n httpPost,\n httpPut,\n applyElements,\n applyState,\n boost,\n cloak,\n collapse,\n html,\n mask,\n removeMe,\n teleport,\n transition,\n confirm,\n dispatch,\n websocket,\n];\n"],
|
|
5
|
+
"mappings": "AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,MAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,17 +1,35 @@
|
|
|
1
|
-
import { applyElements } from "../plugins/server-events/apply-elements.js";
|
|
2
|
-
import { applyState } from "../plugins/server-events/apply-state.js";
|
|
3
1
|
import { attr } from "../plugins/directives/attribute-sync.js";
|
|
4
|
-
import {
|
|
2
|
+
import { indicator } from "../plugins/directives/busy-flag.js";
|
|
5
3
|
import { className } from "../plugins/directives/class-toggle.js";
|
|
4
|
+
import { signals } from "../plugins/directives/declare.js";
|
|
6
5
|
import { computed } from "../plugins/directives/derive.js";
|
|
7
|
-
import { httpDelete, httpGet, httpPatch, httpPost, httpPut } from "../plugins/functions/request.js";
|
|
8
|
-
import { indicator } from "../plugins/directives/busy-flag.js";
|
|
9
|
-
import { init } from "../plugins/directives/on-mount.js";
|
|
10
6
|
import { on } from "../plugins/directives/event-listener.js";
|
|
11
|
-
import {
|
|
12
|
-
import { signals } from "../plugins/directives/declare.js";
|
|
7
|
+
import { init } from "../plugins/directives/on-mount.js";
|
|
13
8
|
import { text } from "../plugins/directives/text-content.js";
|
|
14
|
-
|
|
9
|
+
import { bind } from "../plugins/directives/two-way-bind.js";
|
|
10
|
+
import { show } from "../plugins/directives/visibility.js";
|
|
11
|
+
import { httpDelete, httpGet, httpPatch, httpPost, httpPut } from "../plugins/functions/request.js";
|
|
12
|
+
import { applyElements } from "../plugins/server-events/apply-elements.js";
|
|
13
|
+
import { applyState } from "../plugins/server-events/apply-state.js";
|
|
14
|
+
const essentials = [
|
|
15
|
+
signals,
|
|
16
|
+
computed,
|
|
17
|
+
text,
|
|
18
|
+
show,
|
|
19
|
+
className,
|
|
20
|
+
attr,
|
|
21
|
+
bind,
|
|
22
|
+
on,
|
|
23
|
+
init,
|
|
24
|
+
indicator,
|
|
25
|
+
httpGet,
|
|
26
|
+
httpPost,
|
|
27
|
+
httpPut,
|
|
28
|
+
httpPatch,
|
|
29
|
+
httpDelete,
|
|
30
|
+
applyElements,
|
|
31
|
+
applyState
|
|
32
|
+
];
|
|
15
33
|
export {
|
|
16
34
|
essentials
|
|
17
35
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/presets/essentials.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Plugin } from '../kernel/contracts.js'
|
|
5
|
-
"mappings": "AACA,SAAS,
|
|
4
|
+
"sourcesContent": ["import type { Plugin } from '../kernel/contracts.js';\nimport { attr } from '../plugins/directives/attribute-sync.js';\nimport { indicator } from '../plugins/directives/busy-flag.js';\nimport { className } from '../plugins/directives/class-toggle.js';\nimport { signals } from '../plugins/directives/declare.js';\nimport { computed } from '../plugins/directives/derive.js';\nimport { on } from '../plugins/directives/event-listener.js';\nimport { init } from '../plugins/directives/on-mount.js';\nimport { text } from '../plugins/directives/text-content.js';\nimport { bind } from '../plugins/directives/two-way-bind.js';\nimport { show } from '../plugins/directives/visibility.js';\nimport { httpDelete, httpGet, httpPatch, httpPost, httpPut } from '../plugins/functions/request.js';\nimport { applyElements } from '../plugins/server-events/apply-elements.js';\nimport { applyState } from '../plugins/server-events/apply-state.js';\n\nexport const essentials: Plugin[] = [\n signals,\n computed,\n text,\n show,\n className,\n attr,\n bind,\n on,\n init,\n indicator,\n httpGet,\n httpPost,\n httpPut,\n httpPatch,\n httpDelete,\n applyElements,\n applyState,\n];\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB,SAAS,UAAU;AACnB,SAAS,YAAY;AACrB,SAAS,YAAY;AACrB,SAAS,YAAY;AACrB,SAAS,YAAY;AACrB,SAAS,YAAY,SAAS,WAAW,UAAU,eAAe;AAClE,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB;AAEpB,MAAM,aAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/presets/minimal.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { on } from "../plugins/directives/event-listener.js";
|
|
2
|
-
import { show } from "../plugins/directives/visibility.js";
|
|
3
1
|
import { signals } from "../plugins/directives/declare.js";
|
|
2
|
+
import { on } from "../plugins/directives/event-listener.js";
|
|
4
3
|
import { text } from "../plugins/directives/text-content.js";
|
|
4
|
+
import { show } from "../plugins/directives/visibility.js";
|
|
5
5
|
const minimal = [signals, text, show, on];
|
|
6
6
|
export {
|
|
7
7
|
minimal
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/presets/minimal.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Plugin } from '../kernel/contracts.js'
|
|
5
|
-
"mappings": "AACA,SAAS,UAAU;AACnB,SAAS,YAAY;AACrB,SAAS,
|
|
4
|
+
"sourcesContent": ["import type { Plugin } from '../kernel/contracts.js';\nimport { signals } from '../plugins/directives/declare.js';\nimport { on } from '../plugins/directives/event-listener.js';\nimport { text } from '../plugins/directives/text-content.js';\nimport { show } from '../plugins/directives/visibility.js';\n\nexport const minimal: Plugin[] = [signals, text, show, on];\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,eAAe;AACxB,SAAS,UAAU;AACnB,SAAS,YAAY;AACrB,SAAS,YAAY;AAEd,MAAM,UAAoB,CAAC,SAAS,MAAM,MAAM,EAAE;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
export declare const SIGNALS_KEY = "sigmx";
|
|
2
|
+
export declare const EVENT_PATCH_ELEMENTS = "sigmx-patch-elements";
|
|
3
|
+
export declare const EVENT_PATCH_SIGNALS = "sigmx-patch-signals";
|
|
4
|
+
export declare const SSE_HEADERS: {
|
|
5
|
+
readonly 'content-type': "text/event-stream";
|
|
6
|
+
readonly 'cache-control': "no-cache";
|
|
7
|
+
};
|
|
8
|
+
/** HTML as a string, or anything that renders to one such as a JSX node or an `html` template. */
|
|
9
|
+
export type Markup = string | {
|
|
10
|
+
toString(): string;
|
|
11
|
+
};
|
|
12
|
+
export type PatchMode = 'outer' | 'inner' | 'replace' | 'prepend' | 'append' | 'before' | 'after' | 'remove';
|
|
13
|
+
export interface ServerEvent {
|
|
14
|
+
event: string;
|
|
15
|
+
/** Data lines, each `key value`. */
|
|
16
|
+
lines: string[];
|
|
17
|
+
id?: string;
|
|
18
|
+
retry?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface EventOptions {
|
|
21
|
+
id?: string;
|
|
22
|
+
retry?: number;
|
|
23
|
+
}
|
|
24
|
+
export interface PatchElementsOptions extends EventOptions {
|
|
25
|
+
selector?: string;
|
|
26
|
+
mode?: PatchMode;
|
|
27
|
+
}
|
|
28
|
+
export interface PatchSignalsOptions extends EventOptions {
|
|
29
|
+
onlyIfMissing?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface ExecuteScriptOptions extends EventOptions {
|
|
32
|
+
/** Remove the script element after it runs (default true). */
|
|
33
|
+
autoRemove?: boolean;
|
|
34
|
+
attributes?: Record<string, string>;
|
|
35
|
+
}
|
|
36
|
+
/** Patch HTML into the page. Without a selector, top-level elements are morphed by id. */
|
|
37
|
+
export declare const patchElements: (html: Markup, o?: PatchElementsOptions) => ServerEvent;
|
|
38
|
+
export declare const removeElements: (selector: string, o?: EventOptions) => ServerEvent;
|
|
39
|
+
/** Merge signals (JSON merge-patch: null removes). Accepts an object or pre-serialised JSON. */
|
|
40
|
+
export declare const patchSignals: (signals: Record<string, unknown> | string, o?: PatchSignalsOptions) => ServerEvent;
|
|
41
|
+
export declare const removeSignals: (paths: string[], o?: EventOptions) => ServerEvent;
|
|
42
|
+
export declare const executeScript: (script: string, o?: ExecuteScriptOptions) => ServerEvent;
|
|
43
|
+
/**
|
|
44
|
+
* One event on the wire. A `key value` line whose value spans several lines becomes several
|
|
45
|
+
* `data: key …` lines (the client joins them again), so no value can inject an extra field or event.
|
|
46
|
+
*/
|
|
47
|
+
export declare const formatEvent: (e: ServerEvent) => string;
|
|
48
|
+
export declare class SigmxStream {
|
|
49
|
+
readonly response: Response;
|
|
50
|
+
private controller;
|
|
51
|
+
private readonly encoder;
|
|
52
|
+
private open;
|
|
53
|
+
constructor(init?: ResponseInit);
|
|
54
|
+
get closed(): boolean;
|
|
55
|
+
send(event: ServerEvent): this;
|
|
56
|
+
patchElements(html: Markup, o?: PatchElementsOptions): this;
|
|
57
|
+
removeElements(selector: string, o?: EventOptions): this;
|
|
58
|
+
patchSignals(signals: Record<string, unknown> | string, o?: PatchSignalsOptions): this;
|
|
59
|
+
removeSignals(paths: string[], o?: EventOptions): this;
|
|
60
|
+
executeScript(script: string, o?: ExecuteScriptOptions): this;
|
|
61
|
+
close(): void;
|
|
62
|
+
/** End the stream with an error so the client sees a failure (and retries) rather than a clean end. */
|
|
63
|
+
error(reason: unknown): void;
|
|
64
|
+
}
|
|
65
|
+
export declare const sse: (...events: ServerEvent[]) => Response;
|
|
66
|
+
/** Stream events while `fn` runs; the response closes when it resolves. */
|
|
67
|
+
export declare const sseStream: (fn: (stream: SigmxStream) => Promise<void> | void, init?: ResponseInit) => Response;
|
|
68
|
+
/** A plain HTML response; the client morphs it by id, or honours the selector and mode headers. */
|
|
69
|
+
export declare const html: (body: Markup, o?: PatchElementsOptions & {
|
|
70
|
+
status?: number;
|
|
71
|
+
}) => Response;
|
|
72
|
+
export declare const json: (signals: Record<string, unknown>, o?: PatchSignalsOptions & {
|
|
73
|
+
status?: number;
|
|
74
|
+
}) => Response;
|
|
75
|
+
/** Minimal Standard Schema (standardschema.dev) so any compliant validator works without a dependency. */
|
|
76
|
+
export interface StandardSchema<Output = unknown> {
|
|
77
|
+
readonly '~standard': {
|
|
78
|
+
readonly validate: (value: unknown) => SchemaResult<Output> | Promise<SchemaResult<Output>>;
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export type SchemaIssue = {
|
|
82
|
+
readonly message: string;
|
|
83
|
+
readonly path?: ReadonlyArray<PropertyKey | {
|
|
84
|
+
readonly key: PropertyKey;
|
|
85
|
+
}>;
|
|
86
|
+
};
|
|
87
|
+
export type SchemaResult<T> = {
|
|
88
|
+
readonly value: T;
|
|
89
|
+
readonly issues?: undefined;
|
|
90
|
+
} | {
|
|
91
|
+
readonly issues: ReadonlyArray<SchemaIssue>;
|
|
92
|
+
};
|
|
93
|
+
export declare class SignalsError extends Error {
|
|
94
|
+
readonly issues: ReadonlyArray<SchemaIssue>;
|
|
95
|
+
readonly status: 400 | 422;
|
|
96
|
+
constructor(message: string, issues?: ReadonlyArray<SchemaIssue>, status?: 400 | 422);
|
|
97
|
+
response(): Response;
|
|
98
|
+
}
|
|
99
|
+
/** Form fields as an object; a repeated name becomes an array. */
|
|
100
|
+
export declare const fieldsToObject: (entries: Iterable<[string, unknown]>) => Record<string, any>;
|
|
101
|
+
/**
|
|
102
|
+
* Read the signals a sigmx request carries: the `sigmx` query parameter on GET/DELETE (or the plain
|
|
103
|
+
* query parameters of a `contentType: 'form'` GET), a JSON body, or form fields. Validates with `schema` if given.
|
|
104
|
+
*/
|
|
105
|
+
export declare function readSignals(request: Request): Promise<Record<string, any>>;
|
|
106
|
+
export declare function readSignals<T>(request: Request, schema: StandardSchema<T>): Promise<T>;
|
|
107
|
+
export declare function validateSignals(raw: unknown, schema?: StandardSchema<any>): Promise<any>;
|
|
108
|
+
export declare const isSigmxRequest: (request: Request) => boolean;
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
const SIGNALS_KEY = "sigmx";
|
|
2
|
+
const EVENT_PATCH_ELEMENTS = "sigmx-patch-elements";
|
|
3
|
+
const EVENT_PATCH_SIGNALS = "sigmx-patch-signals";
|
|
4
|
+
const SSE_HEADERS = {
|
|
5
|
+
"content-type": "text/event-stream",
|
|
6
|
+
"cache-control": "no-cache"
|
|
7
|
+
};
|
|
8
|
+
const patchElements = (html2, o = {}) => {
|
|
9
|
+
const lines = [];
|
|
10
|
+
if (o.selector) lines.push(`selector ${o.selector}`);
|
|
11
|
+
if (o.mode && o.mode !== "outer") lines.push(`mode ${o.mode}`);
|
|
12
|
+
lines.push(`elements ${String(html2).trim()}`);
|
|
13
|
+
return { event: EVENT_PATCH_ELEMENTS, lines, id: o.id, retry: o.retry };
|
|
14
|
+
};
|
|
15
|
+
const removeElements = (selector, o = {}) => ({
|
|
16
|
+
event: EVENT_PATCH_ELEMENTS,
|
|
17
|
+
lines: [`selector ${selector}`, "mode remove"],
|
|
18
|
+
...o
|
|
19
|
+
});
|
|
20
|
+
const patchSignals = (signals, o = {}) => ({
|
|
21
|
+
event: EVENT_PATCH_SIGNALS,
|
|
22
|
+
lines: [
|
|
23
|
+
...o.onlyIfMissing ? ["onlyIfMissing true"] : [],
|
|
24
|
+
`signals ${typeof signals === "string" ? signals : JSON.stringify(signals)}`
|
|
25
|
+
],
|
|
26
|
+
id: o.id,
|
|
27
|
+
retry: o.retry
|
|
28
|
+
});
|
|
29
|
+
const removeSignals = (paths, o = {}) => {
|
|
30
|
+
const patch = {};
|
|
31
|
+
for (const p of paths) {
|
|
32
|
+
const keys = p.split(".");
|
|
33
|
+
const last = keys.pop();
|
|
34
|
+
let cur = patch;
|
|
35
|
+
for (const k of keys) cur = cur[k] ??= {};
|
|
36
|
+
cur[last] = null;
|
|
37
|
+
}
|
|
38
|
+
return patchSignals(patch, o);
|
|
39
|
+
};
|
|
40
|
+
const executeScript = (script, o = {}) => {
|
|
41
|
+
const attrs = { ...o.autoRemove ?? true ? { "data-init": "el.remove()" } : {}, ...o.attributes };
|
|
42
|
+
const attrText = Object.entries(attrs).map(([k, v]) => ` ${k}="${v.replace(/"/g, """)}"`).join("");
|
|
43
|
+
return patchElements(`<script${attrText}>${script}<\/script>`, {
|
|
44
|
+
selector: "body",
|
|
45
|
+
mode: "append",
|
|
46
|
+
id: o.id,
|
|
47
|
+
retry: o.retry
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
const oneLine = (s) => s.replace(/[\r\n]+/g, " ");
|
|
51
|
+
const formatEvent = (e) => `${[
|
|
52
|
+
e.id !== void 0 && `id: ${oneLine(e.id)}`,
|
|
53
|
+
e.retry !== void 0 && `retry: ${e.retry}`,
|
|
54
|
+
`event: ${oneLine(e.event)}`,
|
|
55
|
+
...e.lines.flatMap((l) => {
|
|
56
|
+
const i = l.indexOf(" ");
|
|
57
|
+
const key = i < 0 ? l : l.slice(0, i);
|
|
58
|
+
return (i < 0 ? [""] : l.slice(i + 1).split(/\r?\n/)).map((v) => `data: ${key}${i < 0 ? "" : ` ${v}`}`);
|
|
59
|
+
})
|
|
60
|
+
].filter(Boolean).join("\n")}
|
|
61
|
+
|
|
62
|
+
`;
|
|
63
|
+
class SigmxStream {
|
|
64
|
+
response;
|
|
65
|
+
controller;
|
|
66
|
+
encoder = new TextEncoder();
|
|
67
|
+
open = true;
|
|
68
|
+
constructor(init = {}) {
|
|
69
|
+
const body = new ReadableStream({
|
|
70
|
+
start: (c) => {
|
|
71
|
+
this.controller = c;
|
|
72
|
+
},
|
|
73
|
+
cancel: () => {
|
|
74
|
+
this.open = false;
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
this.response = new Response(body, {
|
|
78
|
+
...init,
|
|
79
|
+
headers: { ...SSE_HEADERS, ...init.headers }
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
get closed() {
|
|
83
|
+
return !this.open;
|
|
84
|
+
}
|
|
85
|
+
send(event) {
|
|
86
|
+
if (this.open) this.controller.enqueue(this.encoder.encode(formatEvent(event)));
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
89
|
+
patchElements(html2, o) {
|
|
90
|
+
return this.send(patchElements(html2, o));
|
|
91
|
+
}
|
|
92
|
+
removeElements(selector, o) {
|
|
93
|
+
return this.send(removeElements(selector, o));
|
|
94
|
+
}
|
|
95
|
+
patchSignals(signals, o) {
|
|
96
|
+
return this.send(patchSignals(signals, o));
|
|
97
|
+
}
|
|
98
|
+
removeSignals(paths, o) {
|
|
99
|
+
return this.send(removeSignals(paths, o));
|
|
100
|
+
}
|
|
101
|
+
executeScript(script, o) {
|
|
102
|
+
return this.send(executeScript(script, o));
|
|
103
|
+
}
|
|
104
|
+
close() {
|
|
105
|
+
if (this.open) {
|
|
106
|
+
this.open = false;
|
|
107
|
+
this.controller.close();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/** End the stream with an error so the client sees a failure (and retries) rather than a clean end. */
|
|
111
|
+
error(reason) {
|
|
112
|
+
if (this.open) {
|
|
113
|
+
this.open = false;
|
|
114
|
+
this.controller.error(reason);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const sse = (...events) => new Response(events.map(formatEvent).join(""), { headers: SSE_HEADERS });
|
|
119
|
+
const sseStream = (fn, init) => {
|
|
120
|
+
const stream = new SigmxStream(init);
|
|
121
|
+
Promise.resolve().then(() => fn(stream)).then(
|
|
122
|
+
() => stream.close(),
|
|
123
|
+
(e) => {
|
|
124
|
+
console.error("sigmx sseStream:", e);
|
|
125
|
+
stream.error(e);
|
|
126
|
+
}
|
|
127
|
+
);
|
|
128
|
+
return stream.response;
|
|
129
|
+
};
|
|
130
|
+
const html = (body, o = {}) => new Response(String(body), {
|
|
131
|
+
status: o.status ?? 200,
|
|
132
|
+
headers: {
|
|
133
|
+
"content-type": "text/html; charset=utf-8",
|
|
134
|
+
...o.selector ? { "sigmx-selector": o.selector } : {},
|
|
135
|
+
...o.mode ? { "sigmx-mode": o.mode } : {}
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
const json = (signals, o = {}) => new Response(JSON.stringify(signals), {
|
|
139
|
+
status: o.status ?? 200,
|
|
140
|
+
headers: { "content-type": "application/json", ...o.onlyIfMissing ? { "sigmx-only-if-missing": "true" } : {} }
|
|
141
|
+
});
|
|
142
|
+
class SignalsError extends Error {
|
|
143
|
+
constructor(message, issues = [], status = 422) {
|
|
144
|
+
super(message);
|
|
145
|
+
this.issues = issues;
|
|
146
|
+
this.status = status;
|
|
147
|
+
this.name = "SignalsError";
|
|
148
|
+
}
|
|
149
|
+
issues;
|
|
150
|
+
status;
|
|
151
|
+
response() {
|
|
152
|
+
return Response.json({ error: this.message, issues: this.issues }, { status: this.status });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const fieldsToObject = (entries) => {
|
|
156
|
+
const out = {};
|
|
157
|
+
for (const [k, v] of entries) out[k] = k in out ? [].concat(out[k], v) : v;
|
|
158
|
+
return out;
|
|
159
|
+
};
|
|
160
|
+
const isObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
161
|
+
async function readSignals(request, schema) {
|
|
162
|
+
let raw;
|
|
163
|
+
const method = request.method.toUpperCase();
|
|
164
|
+
const type = request.headers.get("content-type") ?? "";
|
|
165
|
+
try {
|
|
166
|
+
if (method === "GET" || method === "DELETE") {
|
|
167
|
+
const params = new URL(request.url).searchParams;
|
|
168
|
+
const q = params.get(SIGNALS_KEY);
|
|
169
|
+
raw = q ? JSON.parse(q) : fieldsToObject(params);
|
|
170
|
+
} else if (type.includes("application/json")) {
|
|
171
|
+
const text = await request.text();
|
|
172
|
+
raw = text ? JSON.parse(text) : {};
|
|
173
|
+
} else if (type.includes("form")) {
|
|
174
|
+
raw = fieldsToObject(await request.formData());
|
|
175
|
+
} else {
|
|
176
|
+
raw = {};
|
|
177
|
+
}
|
|
178
|
+
} catch (e) {
|
|
179
|
+
throw new SignalsError(`could not parse signals: ${e.message}`, [], 400);
|
|
180
|
+
}
|
|
181
|
+
if (!isObject(raw)) throw new SignalsError("signals must be an object", [], 400);
|
|
182
|
+
return validateSignals(raw, schema);
|
|
183
|
+
}
|
|
184
|
+
const describeIssue = (i) => {
|
|
185
|
+
const path = i.path?.map((p) => typeof p === "object" ? p.key : p).join(".");
|
|
186
|
+
return path ? `${path}: ${i.message}` : i.message;
|
|
187
|
+
};
|
|
188
|
+
async function validateSignals(raw, schema) {
|
|
189
|
+
if (!schema) return raw;
|
|
190
|
+
const result = await schema["~standard"].validate(raw);
|
|
191
|
+
if (result.issues)
|
|
192
|
+
throw new SignalsError(`invalid signals: ${result.issues.map(describeIssue).join("; ")}`, result.issues);
|
|
193
|
+
return result.value;
|
|
194
|
+
}
|
|
195
|
+
const isSigmxRequest = (request) => request.headers.get("sigmx-request") === "true";
|
|
196
|
+
export {
|
|
197
|
+
EVENT_PATCH_ELEMENTS,
|
|
198
|
+
EVENT_PATCH_SIGNALS,
|
|
199
|
+
SIGNALS_KEY,
|
|
200
|
+
SSE_HEADERS,
|
|
201
|
+
SigmxStream,
|
|
202
|
+
SignalsError,
|
|
203
|
+
executeScript,
|
|
204
|
+
fieldsToObject,
|
|
205
|
+
formatEvent,
|
|
206
|
+
html,
|
|
207
|
+
isSigmxRequest,
|
|
208
|
+
json,
|
|
209
|
+
patchElements,
|
|
210
|
+
patchSignals,
|
|
211
|
+
readSignals,
|
|
212
|
+
removeElements,
|
|
213
|
+
removeSignals,
|
|
214
|
+
sse,
|
|
215
|
+
sseStream,
|
|
216
|
+
validateSignals
|
|
217
|
+
};
|
|
218
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/server.ts"],
|
|
4
|
+
"sourcesContent": ["export const SIGNALS_KEY = 'sigmx';\nexport const EVENT_PATCH_ELEMENTS = 'sigmx-patch-elements';\nexport const EVENT_PATCH_SIGNALS = 'sigmx-patch-signals';\nexport const SSE_HEADERS = {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-cache',\n} as const;\n\n/** HTML as a string, or anything that renders to one such as a JSX node or an `html` template. */\nexport type Markup = string | { toString(): string };\n\nexport type PatchMode = 'outer' | 'inner' | 'replace' | 'prepend' | 'append' | 'before' | 'after' | 'remove';\n\nexport interface ServerEvent {\n event: string;\n /** Data lines, each `key value`. */\n lines: string[];\n id?: string;\n retry?: number;\n}\nexport interface EventOptions {\n id?: string;\n retry?: number;\n}\nexport interface PatchElementsOptions extends EventOptions {\n selector?: string;\n mode?: PatchMode;\n}\nexport interface PatchSignalsOptions extends EventOptions {\n onlyIfMissing?: boolean;\n}\nexport interface ExecuteScriptOptions extends EventOptions {\n /** Remove the script element after it runs (default true). */\n autoRemove?: boolean;\n attributes?: Record<string, string>;\n}\n\n/** Patch HTML into the page. Without a selector, top-level elements are morphed by id. */\nexport const patchElements = (html: Markup, o: PatchElementsOptions = {}): ServerEvent => {\n const lines: string[] = [];\n if (o.selector) lines.push(`selector ${o.selector}`);\n if (o.mode && o.mode !== 'outer') lines.push(`mode ${o.mode}`);\n lines.push(`elements ${String(html).trim()}`);\n return { event: EVENT_PATCH_ELEMENTS, lines, id: o.id, retry: o.retry };\n};\n\nexport const removeElements = (selector: string, o: EventOptions = {}): ServerEvent => ({\n event: EVENT_PATCH_ELEMENTS,\n lines: [`selector ${selector}`, 'mode remove'],\n ...o,\n});\n\n/** Merge signals (JSON merge-patch: null removes). Accepts an object or pre-serialised JSON. */\nexport const patchSignals = (signals: Record<string, unknown> | string, o: PatchSignalsOptions = {}): ServerEvent => ({\n event: EVENT_PATCH_SIGNALS,\n lines: [\n ...(o.onlyIfMissing ? ['onlyIfMissing true'] : []),\n `signals ${typeof signals === 'string' ? signals : JSON.stringify(signals)}`,\n ],\n id: o.id,\n retry: o.retry,\n});\n\nexport const removeSignals = (paths: string[], o: EventOptions = {}): ServerEvent => {\n const patch: Record<string, any> = {};\n for (const p of paths) {\n const keys = p.split('.');\n const last = keys.pop() as string;\n let cur = patch;\n for (const k of keys) cur = cur[k] ??= {};\n cur[last] = null;\n }\n return patchSignals(patch, o);\n};\n\nexport const executeScript = (script: string, o: ExecuteScriptOptions = {}): ServerEvent => {\n const attrs = { ...((o.autoRemove ?? true) ? { 'data-init': 'el.remove()' } : {}), ...o.attributes };\n const attrText = Object.entries(attrs)\n .map(([k, v]) => ` ${k}=\"${v.replace(/\"/g, '"')}\"`)\n .join('');\n return patchElements(`<script${attrText}>${script}</script>`, {\n selector: 'body',\n mode: 'append',\n id: o.id,\n retry: o.retry,\n });\n};\n\nconst oneLine = (s: string) => s.replace(/[\\r\\n]+/g, ' ');\n\n/**\n * One event on the wire. A `key value` line whose value spans several lines becomes several\n * `data: key \u2026` lines (the client joins them again), so no value can inject an extra field or event.\n */\nexport const formatEvent = (e: ServerEvent): string =>\n `${[\n e.id !== undefined && `id: ${oneLine(e.id)}`,\n e.retry !== undefined && `retry: ${e.retry}`,\n `event: ${oneLine(e.event)}`,\n ...e.lines.flatMap((l) => {\n const i = l.indexOf(' ');\n const key = i < 0 ? l : l.slice(0, i);\n return (i < 0 ? [''] : l.slice(i + 1).split(/\\r?\\n/)).map((v) => `data: ${key}${i < 0 ? '' : ` ${v}`}`);\n }),\n ]\n .filter(Boolean)\n .join('\\n')}\\n\\n`;\n\nexport class SigmxStream {\n readonly response: Response;\n private controller!: ReadableStreamDefaultController<Uint8Array>;\n private readonly encoder = new TextEncoder();\n private open = true;\n\n constructor(init: ResponseInit = {}) {\n const body = new ReadableStream<Uint8Array>({\n start: (c) => {\n this.controller = c;\n },\n cancel: () => {\n this.open = false;\n },\n });\n this.response = new Response(body, {\n ...init,\n headers: { ...SSE_HEADERS, ...(init.headers as Record<string, string>) },\n });\n }\n get closed(): boolean {\n return !this.open;\n }\n send(event: ServerEvent): this {\n if (this.open) this.controller.enqueue(this.encoder.encode(formatEvent(event)));\n return this;\n }\n patchElements(html: Markup, o?: PatchElementsOptions): this {\n return this.send(patchElements(html, o));\n }\n removeElements(selector: string, o?: EventOptions): this {\n return this.send(removeElements(selector, o));\n }\n patchSignals(signals: Record<string, unknown> | string, o?: PatchSignalsOptions): this {\n return this.send(patchSignals(signals, o));\n }\n removeSignals(paths: string[], o?: EventOptions): this {\n return this.send(removeSignals(paths, o));\n }\n executeScript(script: string, o?: ExecuteScriptOptions): this {\n return this.send(executeScript(script, o));\n }\n close(): void {\n if (this.open) {\n this.open = false;\n this.controller.close();\n }\n }\n /** End the stream with an error so the client sees a failure (and retries) rather than a clean end. */\n error(reason: unknown): void {\n if (this.open) {\n this.open = false;\n this.controller.error(reason);\n }\n }\n}\n\nexport const sse = (...events: ServerEvent[]): Response =>\n new Response(events.map(formatEvent).join(''), { headers: SSE_HEADERS });\n\n/** Stream events while `fn` runs; the response closes when it resolves. */\nexport const sseStream = (fn: (stream: SigmxStream) => Promise<void> | void, init?: ResponseInit): Response => {\n const stream = new SigmxStream(init);\n Promise.resolve()\n .then(() => fn(stream))\n .then(\n () => stream.close(),\n (e) => {\n console.error('sigmx sseStream:', e);\n stream.error(e);\n },\n );\n return stream.response;\n};\n\n/** A plain HTML response; the client morphs it by id, or honours the selector and mode headers. */\nexport const html = (body: Markup, o: PatchElementsOptions & { status?: number } = {}): Response =>\n new Response(String(body), {\n status: o.status ?? 200,\n headers: {\n 'content-type': 'text/html; charset=utf-8',\n ...(o.selector ? { 'sigmx-selector': o.selector } : {}),\n ...(o.mode ? { 'sigmx-mode': o.mode } : {}),\n },\n });\n\nexport const json = (signals: Record<string, unknown>, o: PatchSignalsOptions & { status?: number } = {}): Response =>\n new Response(JSON.stringify(signals), {\n status: o.status ?? 200,\n headers: { 'content-type': 'application/json', ...(o.onlyIfMissing ? { 'sigmx-only-if-missing': 'true' } : {}) },\n });\n\n/** Minimal Standard Schema (standardschema.dev) so any compliant validator works without a dependency. */\nexport interface StandardSchema<Output = unknown> {\n readonly '~standard': {\n readonly validate: (value: unknown) => SchemaResult<Output> | Promise<SchemaResult<Output>>;\n };\n}\nexport type SchemaIssue = {\n readonly message: string;\n readonly path?: ReadonlyArray<PropertyKey | { readonly key: PropertyKey }>;\n};\nexport type SchemaResult<T> =\n | { readonly value: T; readonly issues?: undefined }\n | { readonly issues: ReadonlyArray<SchemaIssue> };\n\nexport class SignalsError extends Error {\n constructor(\n message: string,\n readonly issues: ReadonlyArray<SchemaIssue> = [],\n readonly status: 400 | 422 = 422,\n ) {\n super(message);\n this.name = 'SignalsError';\n }\n response(): Response {\n return Response.json({ error: this.message, issues: this.issues }, { status: this.status });\n }\n}\n\n/** Form fields as an object; a repeated name becomes an array. */\nexport const fieldsToObject = (entries: Iterable<[string, unknown]>): Record<string, any> => {\n const out: Record<string, any> = {};\n for (const [k, v] of entries) out[k] = k in out ? ([] as unknown[]).concat(out[k], v) : v;\n return out;\n};\n\nconst isObject = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null && !Array.isArray(v);\n\n/**\n * Read the signals a sigmx request carries: the `sigmx` query parameter on GET/DELETE (or the plain\n * query parameters of a `contentType: 'form'` GET), a JSON body, or form fields. Validates with `schema` if given.\n */\nexport async function readSignals(request: Request): Promise<Record<string, any>>;\nexport async function readSignals<T>(request: Request, schema: StandardSchema<T>): Promise<T>;\nexport async function readSignals(request: Request, schema?: StandardSchema<any>): Promise<any> {\n let raw: unknown;\n const method = request.method.toUpperCase();\n const type = request.headers.get('content-type') ?? '';\n try {\n if (method === 'GET' || method === 'DELETE') {\n const params = new URL(request.url).searchParams;\n const q = params.get(SIGNALS_KEY);\n raw = q ? JSON.parse(q) : fieldsToObject(params);\n } else if (type.includes('application/json')) {\n const text = await request.text();\n raw = text ? JSON.parse(text) : {};\n } else if (type.includes('form')) {\n raw = fieldsToObject(await request.formData());\n } else {\n raw = {};\n }\n } catch (e) {\n throw new SignalsError(`could not parse signals: ${(e as Error).message}`, [], 400);\n }\n if (!isObject(raw)) throw new SignalsError('signals must be an object', [], 400);\n return validateSignals(raw, schema);\n}\n\nconst describeIssue = (i: SchemaIssue): string => {\n const path = i.path?.map((p) => (typeof p === 'object' ? p.key : p)).join('.');\n return path ? `${path}: ${i.message}` : i.message;\n};\n\nexport async function validateSignals(raw: unknown, schema?: StandardSchema<any>): Promise<any> {\n if (!schema) return raw;\n const result = await schema['~standard'].validate(raw);\n if (result.issues)\n throw new SignalsError(`invalid signals: ${result.issues.map(describeIssue).join('; ')}`, result.issues);\n return result.value;\n}\n\nexport const isSigmxRequest = (request: Request): boolean => request.headers.get('sigmx-request') === 'true';\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["html"]
|
|
7
|
+
}
|