sigmx 0.1.1 → 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.
Files changed (165) hide show
  1. package/README.md +10 -10
  2. package/dist/kernel/compile.d.ts +8 -9
  3. package/dist/kernel/compile.js +102 -67
  4. package/dist/kernel/compile.js.map +2 -2
  5. package/dist/kernel/contracts.d.ts +11 -5
  6. package/dist/kernel/index.d.ts +2 -2
  7. package/dist/kernel/index.js +5 -6
  8. package/dist/kernel/index.js.map +2 -2
  9. package/dist/kernel/precompile.d.ts +8 -10
  10. package/dist/kernel/precompile.js +25 -75
  11. package/dist/kernel/precompile.js.map +2 -2
  12. package/dist/kernel/precompiled.d.ts +7 -4
  13. package/dist/kernel/precompiled.js +5 -5
  14. package/dist/kernel/precompiled.js.map +2 -2
  15. package/dist/kernel/reactive.d.ts +8 -2
  16. package/dist/kernel/reactive.js +91 -62
  17. package/dist/kernel/reactive.js.map +3 -3
  18. package/dist/kernel/runtime.js +78 -68
  19. package/dist/kernel/runtime.js.map +3 -3
  20. package/dist/kernel/scan.d.ts +1 -1
  21. package/dist/kernel/scan.js +3 -3
  22. package/dist/kernel/scan.js.map +2 -2
  23. package/dist/kernel/state.d.ts +4 -3
  24. package/dist/kernel/state.js +91 -80
  25. package/dist/kernel/state.js.map +2 -2
  26. package/dist/kernel/strict-csp.d.ts +0 -5
  27. package/dist/kernel/strict-csp.js +2 -2
  28. package/dist/kernel/strict-csp.js.map +2 -2
  29. package/dist/lib/casing.d.ts +4 -1
  30. package/dist/lib/casing.js +8 -1
  31. package/dist/lib/casing.js.map +2 -2
  32. package/dist/lib/objects.d.ts +5 -3
  33. package/dist/lib/objects.js +10 -5
  34. package/dist/lib/objects.js.map +2 -2
  35. package/dist/lib/schedule.d.ts +3 -3
  36. package/dist/lib/schedule.js +12 -10
  37. package/dist/lib/schedule.js.map +2 -2
  38. package/dist/lib/sse.d.ts +10 -0
  39. package/dist/lib/sse.js +32 -29
  40. package/dist/lib/sse.js.map +2 -2
  41. package/dist/plugins/def.d.ts +5 -0
  42. package/dist/plugins/def.js +22 -0
  43. package/dist/plugins/def.js.map +7 -0
  44. package/dist/plugins/directives/attribute-sync.js +8 -12
  45. package/dist/plugins/directives/attribute-sync.js.map +2 -2
  46. package/dist/plugins/directives/boost.d.ts +1 -1
  47. package/dist/plugins/directives/boost.js +34 -31
  48. package/dist/plugins/directives/boost.js.map +2 -2
  49. package/dist/plugins/directives/busy-flag.js +13 -16
  50. package/dist/plugins/directives/busy-flag.js.map +2 -2
  51. package/dist/plugins/directives/class-toggle.js +17 -16
  52. package/dist/plugins/directives/class-toggle.js.map +2 -2
  53. package/dist/plugins/directives/cloak.js +2 -7
  54. package/dist/plugins/directives/cloak.js.map +2 -2
  55. package/dist/plugins/directives/collapse.js +36 -37
  56. package/dist/plugins/directives/collapse.js.map +2 -2
  57. package/dist/plugins/directives/declare.js +5 -8
  58. package/dist/plugins/directives/declare.js.map +2 -2
  59. package/dist/plugins/directives/derive.js +9 -18
  60. package/dist/plugins/directives/derive.js.map +2 -2
  61. package/dist/plugins/directives/element-ref.js +8 -8
  62. package/dist/plugins/directives/element-ref.js.map +2 -2
  63. package/dist/plugins/directives/event-listener.js +18 -26
  64. package/dist/plugins/directives/event-listener.js.map +2 -2
  65. package/dist/plugins/directives/frame-loop.js +9 -14
  66. package/dist/plugins/directives/frame-loop.js.map +2 -2
  67. package/dist/plugins/directives/html.js +6 -7
  68. package/dist/plugins/directives/html.js.map +2 -2
  69. package/dist/plugins/directives/inline-style.js +17 -20
  70. package/dist/plugins/directives/inline-style.js.map +2 -2
  71. package/dist/plugins/directives/mask.js +19 -23
  72. package/dist/plugins/directives/mask.js.map +2 -2
  73. package/dist/plugins/directives/media-query.d.ts +4 -1
  74. package/dist/plugins/directives/media-query.js +13 -13
  75. package/dist/plugins/directives/media-query.js.map +2 -2
  76. package/dist/plugins/directives/on-mount.js +4 -12
  77. package/dist/plugins/directives/on-mount.js.map +2 -2
  78. package/dist/plugins/directives/patch-listener.js +24 -19
  79. package/dist/plugins/directives/patch-listener.js.map +2 -2
  80. package/dist/plugins/directives/remove-me.js +7 -8
  81. package/dist/plugins/directives/remove-me.js.map +2 -2
  82. package/dist/plugins/directives/scroll-to.d.ts +4 -1
  83. package/dist/plugins/directives/scroll-to.js +8 -14
  84. package/dist/plugins/directives/scroll-to.js.map +2 -2
  85. package/dist/plugins/directives/size-watch.js +7 -12
  86. package/dist/plugins/directives/size-watch.js.map +2 -2
  87. package/dist/plugins/directives/state-dump.js +6 -10
  88. package/dist/plugins/directives/state-dump.js.map +2 -2
  89. package/dist/plugins/directives/storage-sync.js +13 -9
  90. package/dist/plugins/directives/storage-sync.js.map +2 -2
  91. package/dist/plugins/directives/teleport.js +8 -14
  92. package/dist/plugins/directives/teleport.js.map +2 -2
  93. package/dist/plugins/directives/text-content.js +6 -7
  94. package/dist/plugins/directives/text-content.js.map +2 -2
  95. package/dist/plugins/directives/timer.js +7 -13
  96. package/dist/plugins/directives/timer.js.map +2 -2
  97. package/dist/plugins/directives/transition.d.ts +1 -2
  98. package/dist/plugins/directives/transition.js +32 -34
  99. package/dist/plugins/directives/transition.js.map +2 -2
  100. package/dist/plugins/directives/tween.d.ts +2 -2
  101. package/dist/plugins/directives/tween.js +34 -50
  102. package/dist/plugins/directives/tween.js.map +2 -2
  103. package/dist/plugins/directives/two-way-bind.d.ts +1 -1
  104. package/dist/plugins/directives/two-way-bind.js +70 -97
  105. package/dist/plugins/directives/two-way-bind.js.map +2 -2
  106. package/dist/plugins/directives/url-params.js +35 -59
  107. package/dist/plugins/directives/url-params.js.map +3 -3
  108. package/dist/plugins/directives/url-replace.js +6 -7
  109. package/dist/plugins/directives/url-replace.js.map +2 -2
  110. package/dist/plugins/directives/validity.js +6 -9
  111. package/dist/plugins/directives/validity.js.map +2 -2
  112. package/dist/plugins/directives/viewport.js +18 -26
  113. package/dist/plugins/directives/viewport.js.map +2 -2
  114. package/dist/plugins/directives/visibility.js +9 -14
  115. package/dist/plugins/directives/visibility.js.map +2 -2
  116. package/dist/plugins/directives/watch.js +2 -8
  117. package/dist/plugins/directives/watch.js.map +2 -2
  118. package/dist/plugins/functions/bulk-set.js +7 -6
  119. package/dist/plugins/functions/bulk-set.js.map +2 -2
  120. package/dist/plugins/functions/bulk-toggle.js +7 -6
  121. package/dist/plugins/functions/bulk-toggle.js.map +2 -2
  122. package/dist/plugins/functions/confirm.js +2 -2
  123. package/dist/plugins/functions/confirm.js.map +2 -2
  124. package/dist/plugins/functions/copy-text.js +5 -5
  125. package/dist/plugins/functions/copy-text.js.map +2 -2
  126. package/dist/plugins/functions/dispatch.js +5 -5
  127. package/dist/plugins/functions/dispatch.js.map +2 -2
  128. package/dist/plugins/functions/locale-format.d.ts +4 -1
  129. package/dist/plugins/functions/locale-format.js +9 -16
  130. package/dist/plugins/functions/locale-format.js.map +2 -2
  131. package/dist/plugins/functions/range-map.js +6 -6
  132. package/dist/plugins/functions/range-map.js.map +2 -2
  133. package/dist/plugins/functions/request.d.ts +7 -3
  134. package/dist/plugins/functions/request.js +77 -86
  135. package/dist/plugins/functions/request.js.map +2 -2
  136. package/dist/plugins/functions/untracked-read.js +3 -2
  137. package/dist/plugins/functions/untracked-read.js.map +2 -2
  138. package/dist/plugins/functions/websocket.d.ts +3 -3
  139. package/dist/plugins/functions/websocket.js +13 -24
  140. package/dist/plugins/functions/websocket.js.map +2 -2
  141. package/dist/plugins/index.d.ts +0 -2
  142. package/dist/plugins/index.js +0 -4
  143. package/dist/plugins/index.js.map +2 -2
  144. package/dist/plugins/server-events/apply-elements.d.ts +1 -1
  145. package/dist/plugins/server-events/apply-elements.js +41 -43
  146. package/dist/plugins/server-events/apply-elements.js.map +2 -2
  147. package/dist/plugins/server-events/apply-state.js +9 -12
  148. package/dist/plugins/server-events/apply-state.js.map +2 -2
  149. package/dist/plugins/server-events/morph.js +46 -66
  150. package/dist/plugins/server-events/morph.js.map +3 -3
  151. package/dist/presets/all.js +0 -4
  152. package/dist/presets/all.js.map +2 -2
  153. package/dist/server.d.ts +10 -4
  154. package/dist/server.js +42 -14
  155. package/dist/server.js.map +2 -2
  156. package/dist/sigmx.standalone.js +1 -1
  157. package/dist/vite.js +17 -7
  158. package/dist/vite.js.map +2 -2
  159. package/package.json +4 -2
  160. package/dist/plugins/directives/transition-name.d.ts +0 -1
  161. package/dist/plugins/directives/transition-name.js +0 -11
  162. package/dist/plugins/directives/transition-name.js.map +0 -7
  163. package/dist/plugins/directives/trap.d.ts +0 -5
  164. package/dist/plugins/directives/trap.js +0 -54
  165. package/dist/plugins/directives/trap.js.map +0 -7
@@ -48,8 +48,6 @@ import {
48
48
  text,
49
49
  toggleAll,
50
50
  transition,
51
- trap,
52
- viewTransition,
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
@@ -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';\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 trap,\n viewTransition,\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 viewTransition,\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 trap,\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,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;AAAA,EACA;AAAA,EACA;AACF;",
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
  }
package/dist/server.d.ts CHANGED
@@ -4,7 +4,6 @@ export declare const EVENT_PATCH_SIGNALS = "sigmx-patch-signals";
4
4
  export declare const SSE_HEADERS: {
5
5
  readonly 'content-type': "text/event-stream";
6
6
  readonly 'cache-control': "no-cache";
7
- readonly connection: "keep-alive";
8
7
  };
9
8
  /** HTML as a string, or anything that renders to one such as a JSX node or an `html` template. */
10
9
  export type Markup = string | {
@@ -25,7 +24,6 @@ export interface EventOptions {
25
24
  export interface PatchElementsOptions extends EventOptions {
26
25
  selector?: string;
27
26
  mode?: PatchMode;
28
- useViewTransition?: boolean;
29
27
  }
30
28
  export interface PatchSignalsOptions extends EventOptions {
31
29
  onlyIfMissing?: boolean;
@@ -42,6 +40,10 @@ export declare const removeElements: (selector: string, o?: EventOptions) => Ser
42
40
  export declare const patchSignals: (signals: Record<string, unknown> | string, o?: PatchSignalsOptions) => ServerEvent;
43
41
  export declare const removeSignals: (paths: string[], o?: EventOptions) => ServerEvent;
44
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
+ */
45
47
  export declare const formatEvent: (e: ServerEvent) => string;
46
48
  export declare class SigmxStream {
47
49
  readonly response: Response;
@@ -57,6 +59,8 @@ export declare class SigmxStream {
57
59
  removeSignals(paths: string[], o?: EventOptions): this;
58
60
  executeScript(script: string, o?: ExecuteScriptOptions): this;
59
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;
60
64
  }
61
65
  export declare const sse: (...events: ServerEvent[]) => Response;
62
66
  /** Stream events while `fn` runs; the response closes when it resolves. */
@@ -92,9 +96,11 @@ export declare class SignalsError extends Error {
92
96
  constructor(message: string, issues?: ReadonlyArray<SchemaIssue>, status?: 400 | 422);
93
97
  response(): Response;
94
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>;
95
101
  /**
96
- * Read the signals a sigmx request carries: the `sigmx` query parameter on GET/DELETE, a JSON
97
- * body otherwise, or form fields for `contentType: 'form'` requests. Validates with `schema` if given.
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.
98
104
  */
99
105
  export declare function readSignals(request: Request): Promise<Record<string, any>>;
100
106
  export declare function readSignals<T>(request: Request, schema: StandardSchema<T>): Promise<T>;
package/dist/server.js CHANGED
@@ -3,15 +3,13 @@ const EVENT_PATCH_ELEMENTS = "sigmx-patch-elements";
3
3
  const EVENT_PATCH_SIGNALS = "sigmx-patch-signals";
4
4
  const SSE_HEADERS = {
5
5
  "content-type": "text/event-stream",
6
- "cache-control": "no-cache",
7
- connection: "keep-alive"
6
+ "cache-control": "no-cache"
8
7
  };
9
8
  const patchElements = (html2, o = {}) => {
10
9
  const lines = [];
11
10
  if (o.selector) lines.push(`selector ${o.selector}`);
12
11
  if (o.mode && o.mode !== "outer") lines.push(`mode ${o.mode}`);
13
- if (o.useViewTransition) lines.push("useViewTransition true");
14
- for (const l of String(html2).trim().split("\n")) lines.push(`elements ${l}`);
12
+ lines.push(`elements ${String(html2).trim()}`);
15
13
  return { event: EVENT_PATCH_ELEMENTS, lines, id: o.id, retry: o.retry };
16
14
  };
17
15
  const removeElements = (selector, o = {}) => ({
@@ -49,11 +47,16 @@ const executeScript = (script, o = {}) => {
49
47
  retry: o.retry
50
48
  });
51
49
  };
50
+ const oneLine = (s) => s.replace(/[\r\n]+/g, " ");
52
51
  const formatEvent = (e) => `${[
53
- e.id !== void 0 && `id: ${e.id}`,
52
+ e.id !== void 0 && `id: ${oneLine(e.id)}`,
54
53
  e.retry !== void 0 && `retry: ${e.retry}`,
55
- `event: ${e.event}`,
56
- ...e.lines.map((l) => `data: ${l}`)
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
+ })
57
60
  ].filter(Boolean).join("\n")}
58
61
 
59
62
  `;
@@ -104,11 +107,24 @@ class SigmxStream {
104
107
  this.controller.close();
105
108
  }
106
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
+ }
107
117
  }
108
118
  const sse = (...events) => new Response(events.map(formatEvent).join(""), { headers: SSE_HEADERS });
109
119
  const sseStream = (fn, init) => {
110
120
  const stream = new SigmxStream(init);
111
- Promise.resolve().then(() => fn(stream)).catch((e) => console.error("sigmx sseStream:", e)).finally(() => stream.close());
121
+ Promise.resolve().then(() => fn(stream)).then(
122
+ () => stream.close(),
123
+ (e) => {
124
+ console.error("sigmx sseStream:", e);
125
+ stream.error(e);
126
+ }
127
+ );
112
128
  return stream.response;
113
129
  };
114
130
  const html = (body, o = {}) => new Response(String(body), {
@@ -116,8 +132,7 @@ const html = (body, o = {}) => new Response(String(body), {
116
132
  headers: {
117
133
  "content-type": "text/html; charset=utf-8",
118
134
  ...o.selector ? { "sigmx-selector": o.selector } : {},
119
- ...o.mode ? { "sigmx-mode": o.mode } : {},
120
- ...o.useViewTransition ? { "sigmx-use-view-transition": "true" } : {}
135
+ ...o.mode ? { "sigmx-mode": o.mode } : {}
121
136
  }
122
137
  });
123
138
  const json = (signals, o = {}) => new Response(JSON.stringify(signals), {
@@ -137,32 +152,44 @@ class SignalsError extends Error {
137
152
  return Response.json({ error: this.message, issues: this.issues }, { status: this.status });
138
153
  }
139
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);
140
161
  async function readSignals(request, schema) {
141
162
  let raw;
142
163
  const method = request.method.toUpperCase();
143
164
  const type = request.headers.get("content-type") ?? "";
144
165
  try {
145
166
  if (method === "GET" || method === "DELETE") {
146
- const q = new URL(request.url).searchParams.get(SIGNALS_KEY);
147
- raw = q ? JSON.parse(q) : {};
167
+ const params = new URL(request.url).searchParams;
168
+ const q = params.get(SIGNALS_KEY);
169
+ raw = q ? JSON.parse(q) : fieldsToObject(params);
148
170
  } else if (type.includes("application/json")) {
149
171
  const text = await request.text();
150
172
  raw = text ? JSON.parse(text) : {};
151
173
  } else if (type.includes("form")) {
152
- raw = Object.fromEntries((await request.formData()).entries());
174
+ raw = fieldsToObject(await request.formData());
153
175
  } else {
154
176
  raw = {};
155
177
  }
156
178
  } catch (e) {
157
179
  throw new SignalsError(`could not parse signals: ${e.message}`, [], 400);
158
180
  }
181
+ if (!isObject(raw)) throw new SignalsError("signals must be an object", [], 400);
159
182
  return validateSignals(raw, schema);
160
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
+ };
161
188
  async function validateSignals(raw, schema) {
162
189
  if (!schema) return raw;
163
190
  const result = await schema["~standard"].validate(raw);
164
191
  if (result.issues)
165
- throw new SignalsError(`invalid signals: ${result.issues.map((i) => i.message).join("; ")}`, result.issues);
192
+ throw new SignalsError(`invalid signals: ${result.issues.map(describeIssue).join("; ")}`, result.issues);
166
193
  return result.value;
167
194
  }
168
195
  const isSigmxRequest = (request) => request.headers.get("sigmx-request") === "true";
@@ -174,6 +201,7 @@ export {
174
201
  SigmxStream,
175
202
  SignalsError,
176
203
  executeScript,
204
+ fieldsToObject,
177
205
  formatEvent,
178
206
  html,
179
207
  isSigmxRequest,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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 connection: 'keep-alive',\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 useViewTransition?: boolean;\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 if (o.useViewTransition) lines.push('useViewTransition true');\n for (const l of String(html).trim().split('\\n')) lines.push(`elements ${l}`);\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, '&quot;')}\"`)\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\nexport const formatEvent = (e: ServerEvent): string =>\n `${[\n e.id !== undefined && `id: ${e.id}`,\n e.retry !== undefined && `retry: ${e.retry}`,\n `event: ${e.event}`,\n ...e.lines.map((l) => `data: ${l}`),\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}\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 .catch((e) => console.error('sigmx sseStream:', e))\n .finally(() => stream.close());\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 ...(o.useViewTransition ? { 'sigmx-use-view-transition': 'true' } : {}),\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/**\n * Read the signals a sigmx request carries: the `sigmx` query parameter on GET/DELETE, a JSON\n * body otherwise, or form fields for `contentType: 'form'` requests. 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 q = new URL(request.url).searchParams.get(SIGNALS_KEY);\n raw = q ? JSON.parse(q) : {};\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 = Object.fromEntries((await request.formData()).entries());\n } else {\n raw = {};\n }\n } catch (e) {\n throw new SignalsError(`could not parse signals: ${(e as Error).message}`, [], 400);\n }\n return validateSignals(raw, schema);\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((i) => i.message).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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",
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, '&quot;')}\"`)\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
6
  "names": ["html"]
7
7
  }
@@ -1 +1 @@
1
- var e,t,n=e=>e.replace(/([a-z0-9])([A-Z])|([A-Z]+)([A-Z][a-z])/g,"$1$3 $2$4").split(/[^A-Za-z0-9]+/).filter(Boolean).map(e=>e.toLowerCase()),r=e=>e[0].toUpperCase()+e.slice(1),a=e=>n(e).join("-"),i=e=>n(e).map((e,t)=>t?r(e):e).join(""),l={camel:i,kebab:a,snake:e=>n(e).join("_"),pascal:e=>n(e).map(r).join("")},o=e=>{if(null===e||"object"!=typeof e)return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||null===t},s=(e,t,n)=>{let r=t.split("."),a=r.pop(),i=e;for(let e of r)o(i[e])||(i[e]={}),i=i[e];return i[a]=n,e},u=(e,t)=>void 0===e?t:"string"==typeof e?new RegExp(e.replace(/^\/|\/$/g,"")):e,d=e=>{if("function"==typeof e)return e;let t=u(e?.include,/(?:)/),n=u(e?.exclude,/(?!)/);return e=>t.test(e)&&!n.test(e)},c=(e,t=0)=>{for(let t of e??[]){let e=/^(\d+(?:\.\d+)?)(ms|s)?$/.exec(t);if(e)return+e[1]*("s"===e[2]?1e3:1)}return t},f=(e,t,n,r,a)=>{let i,l,o=()=>{i=void 0,r&&l&&e(...l),l=void 0};return(...r)=>{if(i)return l=r,void(a&&(clearTimeout(i),i=setTimeout(o,t)));n?e(...r):l=r,i=setTimeout(o,t)}},m=(e,t)=>{let n=t.get("delay");n&&(e=((e,t)=>(...n)=>{setTimeout(e,t,...n)})(e,c(n)));let r=t.get("debounce");r&&(e=((e,t,n=!1,r=!0)=>f(e,t,n,r,!0))(e,c(r,300),r.includes("leading"),!r.includes("notrailing")));let a=t.get("throttle");return a&&(e=((e,t,n=!0,r=!1)=>f(e,t,n,r,!1))(e,c(a,300),!a.includes("noleading"),a.includes("trailing"))),e},h=(e,t)=>t.has("viewtransition")&&"startViewTransition"in document?(...t)=>{document.startViewTransition(()=>e(...t))}:e,p=(e,t)=>Function(...e,t),g=new Map,v=e=>/[A-Za-z0-9_$]/.test(e),y=(e,t)=>{let n=0,r=e.length;for(;n<r;){let a=e[n],i=e[n+1];if('"'===a||"'"===a||"`"===a){let i=n+1;for(;i<r&&e[i]!==a;)i+="\\"===e[i]?2:1;t(e.slice(n,i+1),n),n=i+1}else if("/"===a&&"/"===i){let t=e.indexOf("\n",n);n=t<0?r:t}else if("/"===a&&"*"===i){let t=e.indexOf("*/",n+2);n=t<0?r:t+2}else n+=t(a,n)||1}},b=e=>(t,n,r)=>((e,t,n,r)=>{let a=`${+r}|${n.join()}|${t}`,i=g.get(a);if(i)return i;let l,o=(e=>{let t="";return y(e,(n,r)=>{if("@"===n){let n=r+1;for(;n<e.length&&v(e[n]);)n++;let a=n;for(;a<e.length&&/\s/.test(e[a]);)a++;if(n>r+1&&"("===e[a])return t+=`__a.${e.slice(r+1,n)}(`,a+1-r}t+=n}),t})(t.trim()),s=t=>e(["$","__a",...n],`with($.scope){${t}\n}`);if(r)try{l=s(`return(${o}\n)`)}catch{let e=(e=>{let t=[],n=0,r=0;return y(e,(a,i)=>{a.length>1||("([{".includes(a)?n++:")]}".includes(a)?n--:";"===a&&!n&&(t.push(e.slice(r,i)),r=i+1))}),t.push(e.slice(r)),t.filter(e=>e.trim())})(o),t=e.pop()??"";try{l=s(`${e.join(";")};return(${t}\n)`)}catch{l=s(o)}}else l=s(o);return g.set(a,l),l})(e,t,n,r),w=0,k=!1,S=new Set,x=new Set,A=class{e;i=0;s=new Set;constructor(e){this.e=e}get value(){return e&&(e.t.set(this,this.i),this.s.add(e)),this.e}set value(e){Object.is(e,this.e)||(this.e=e,this.bump())}peek(){return this.e}bump(){this.i++;for(let e of this.s)e.u();w||N()}},E=e=>{for(let t of e.t.keys())t.s.delete(e);e.t.clear()},T=e=>{for(let[t,n]of e.t)if(t instanceof M&&t.f(),t.i!==n)return!0;return!1},$=(t,n)=>{E(t);let r=e;e=t;try{return n()}finally{e=r}},M=class extends A{t=new Map;c=!0;r;constructor(e){super(void 0),this.r=e}f(){if(!this.c||(this.c=!1,this.t.size&&!T(this)))return;let e=$(this,this.r);Object.is(e,this.e)||(this.e=e,this.i++)}get value(){return this.f(),super.value}set value(e){throw new Error("computed signals are read-only")}peek(){return this.f(),this.e}u(){if(!this.c){this.c=!0;for(let e of this.s)e.u()}}},L=class{t=new Map;d=!1;p=!1;o=new Set;r;m;constructor(e,t){this.r=e,this.m=t}u(){!this.p&&!this.d&&(this.d=!0,S.add(this))}b(){if(this.d=!1,this.p||this.t.size&&!T(this))return;for(let e of this.o)e.g();this.o.clear();let e=t;t=this,w++;try{$(this,this.r)}catch(e){if(!this.m)throw e;this.m(e)}finally{w--,t=e}}g(){this.p=!0,E(this);for(let e of this.o)e.g();this.o.clear(),S.delete(this)}},q=e=>new M(e),O=e=>{w++;try{return e()}finally{--w||N()}},P=t=>{let n=e;e=void 0;try{return t()}finally{e=n}},N=()=>{if(!k&&!w){k=!0;try{let e=0;for(;S.size;){if(++e>1e5)throw S.clear(),new Error("effect loop");let t=S.values().next().value;S.delete(t),t.b()}}finally{k=!1}for(let e of x)e()}},j=e=>e.slice(0,Math.max(0,e.lastIndexOf("."))),C=e=>e.slice(e.lastIndexOf(".")+1),H=(e,t)=>e?`${e}.${t}`:t,R=(e,t)=>!t||e===t||e.startsWith(`${t}.`),I=e=>"string"==typeof e,V=()=>{let e=new Map,t=new Map([["",new Set]]),n=new A(0),r=new Map,a=new Set,i=new Map,l=new WeakMap,u=r=>{let a=t.get(r);return a||(e.has(r)&&c(r),a=new Set,t.set(r,a),u(j(r)).add(C(r)),n.bump()),a},c=a=>{let i=e.get(a);i&&(e.delete(a),t.get(j(a))?.delete(C(a)),r.set(a,null),i.bump(),n.bump())},f=e=>{let r=t.get(e);if(r){for(let t of[...r])m(H(e,t));e&&(t.delete(e),t.get(j(e))?.delete(C(e)),i.delete(e)),n.bump()}},m=e=>O(()=>{c(e),f(e)}),h=(r,a)=>O(()=>{t.has(r)&&f(r);let i=e.get(r);e.set(r,a),u(j(r)).add(C(r)),i?.bump(),n.bump()}),p=(n,a)=>O(()=>{if(null==a)return m(n);if(o(a)){let e=u(n);for(let t of[...e])t in a||m(H(n,t));for(let e in a)p(H(n,e),a[e]);return}t.has(n)&&f(n);let i=e.get(n);if(i instanceof M)throw new Error(`"${n}" is a computed signal and cannot be assigned`);if(i){if(Object.is(i.peek(),a))return;i.value=a}else h(n,new A(a));r.set(n,a)}),g=(n,{at:r="",ifMissing:a=!1}={})=>O(()=>{if(o(n)){u(r);for(let i in n){let l=H(r,i),s=n[i];null===s?a||m(l):o(s)?g(s,{at:l,ifMissing:a}):(!a||!e.has(l)&&!t.has(l))&&!(e.get(l)instanceof M)&&p(l,s)}}}),v=a=>{let i=e.get(a);if(i){let e=i.value;return Array.isArray(e)?((e,t,n)=>{let a=l.get(e);if(!a){let i=()=>{r.set(n,e),t.bump()};a=new Proxy(e,{set:(e,t,n)=>(e[t]=n,i(),!0),deleteProperty:(e,t)=>(delete e[t],i(),!0)}),l.set(e,a)}return a})(e,i,a):e}if(t.has(a))return y(a);n.value},y=e=>{let r=i.get(e);if(!r){let a=()=>(n.value,t.get(e));r=new Proxy({},{get:(t,n)=>I(n)?"toJSON"===n?()=>w(void 0,{at:e}):v(H(e,n)):void 0,set:(t,n,r)=>(I(n)&&p(H(e,n),r),!0),deleteProperty:(t,n)=>(I(n)&&m(H(e,n)),!0),has:(e,t)=>I(t)&&!!a()?.has(t),ownKeys:()=>[...a()??[]],getOwnPropertyDescriptor:(t,n)=>I(n)&&a()?.has(n)?{enumerable:!0,configurable:!0,writable:!0,value:v(H(e,n))}:void 0}),i.set(e,r)}return r},b=new Proxy({},{has:(e,t)=>I(t)&&"$"===t[0],get:(e,t)=>I(t)?"$"===t?y(""):v(t.slice(1)):void 0,set:(e,t,n)=>(I(t)&&("$"===t?g(n):p(t.slice(1),n)),!0)}),w=(r,{at:a="",computed:i=!0}={})=>{n.value;let l=d(r),o={},u=e=>a?e.slice(a.length+1):e;for(let[t,n]of e)!R(t,a)||!l(t)||!i&&n instanceof M||s(o,u(t),n.value);for(let e of t.keys())e&&e!==a&&R(e,a)&&l(e)&&!t.get(e)?.size&&s(o,u(e),{});return o};return x.add(()=>{if(!r.size)return;let e={};for(let[t,n]of r)s(e,t,n);r.clear();for(let t of a)t(e)}),{get:v,set:p,merge:g,remove:m,has:n=>e.has(n)||t.has(n),define:h,paths:t=>{n.value;let r=d(t);return[...e.keys()].filter(r)},snapshot:w,onPatch:e=>(a.add(e),()=>a.delete(e)),get $(){return y("")},scope:b}},z=e=>1===e.nodeType,D=e=>z(e)?[e,...e.querySelectorAll("*")]:e instanceof ShadowRoot?[...e.querySelectorAll("*")]:[],B=new Map,F=e=>({type:"attribute",...e}),U=e=>({type:"action",...e}),W=e=>({type:"handler",...e}),J=(e,t,n)=>{!1===n||null==n?e.removeAttribute(t):e.setAttribute(t,!0===n?"":"object"==typeof n?JSON.stringify(n):String(n))},_=F({name:"attr",value:"required",mount({el:e,key:t,cased:n,evaluate:r,effect:a}){a(()=>{if(t)return J(e,n("kebab"),r());let a=r();for(let t in a)J(e,t,a[t])})}}),Z=F({name:"boost",key:"forbidden",value:"forbidden",mount({el:e,mods:t,store:n,runtime:r,listen:a,error:i,cleanup:l}){let o={el:e,store:n,runtime:r,error:i,cleanup:l},s=(n,a="get",i,l)=>{let s=l?{contentType:"form",selector:void 0,openWhenHidden:!0}:{openWhenHidden:!0},u=r.call(a,{...o,el:l??e,evt:i},[n,s]);history[t.has("replace")?"replaceState":"pushState"](null,"",n),Promise.resolve(u).then(()=>scrollTo(0,0))};a(e,"click",e=>{let t=e.target.closest("a[href]");!t||e.defaultPrevented||e.button||e.metaKey||e.ctrlKey||e.shiftKey||t.target||t.hasAttribute("download")||t.origin!==location.origin||t.hash&&t.pathname===location.pathname||(e.preventDefault(),s(t.href,"get",e))}),a(e,"submit",e=>{let t=e.target;if(e.defaultPrevented||t.target)return;let n=new URL(t.action||location.href);n.origin===location.origin&&(e.preventDefault(),s(n.href,"post"===t.method.toLowerCase()?"post":"get",e,t))}),a(window,"popstate",()=>r.call("get",o,[location.href,{openWhenHidden:!0}]))}}),K=F({name:"indicator",mount({el:e,key:t,value:n,cased:r,store:a,listen:i}){let l=t?r():n.trim(),o=new Set;return a.set(l,!1),i(document,"sigmx-fetch",t=>{let{el:n,type:r,rid:i}=t.detail;if("started"!==r||n!==e&&!e.contains(n)){if("finished"!==r)return;o.delete(i)}else o.add(i);a.set(l,o.size>0)}),()=>a.set(l,!1)}}),G=F({name:"class",value:"required",mount({el:e,key:t,cased:n,evaluate:r,effect:a}){let i=new Set;return a(()=>{let a=t?{[n("kebab")]:r()}:r();for(let t in a)for(let n of t.split(/\s+/).filter(Boolean))e.classList.toggle(n,!!a[t]),a[t]?i.add(n):i.delete(n)}),()=>e.classList.remove(...i)}}),Q=F({name:"cloak",key:"forbidden",value:"forbidden",mount:({el:e,attr:t})=>e.removeAttribute(t)}),X=F({name:"collapse",key:"forbidden",value:"required",mount({el:e,mods:t,evaluate:n,effect:r,cleanup:a}){let i,l,o=e.style,s=c(t.get("duration"),250),u=t.get("min")?.[0]??"0px",d=matchMedia("(prefers-reduced-motion: reduce)").matches,f=!0,m=e=>{o.transition="",o.overflow=e?"":"hidden",o.height=e?"":u};r(()=>{let t=!!n();if(t===l)return;if(l=t,clearTimeout(i),f||d)return f=!1,m(t);let r=`${e.getBoundingClientRect().height}px`;o.overflow="hidden",o.height=t?u:r,e.getBoundingClientRect(),o.transition=`height ${s}ms ease`,o.height=t?`${e.scrollHeight}px`:u,i=setTimeout(()=>m(t),s+20)}),a(()=>clearTimeout(i))}}),Y=F({name:"signals",value:"required",mount({key:e,cased:t,evaluate:n,store:r,mods:a}){let i=n();r.merge(e?s({},t(),i):i,{ifMissing:a.has("ifmissing")})}}),ee=F({name:"computed",value:"required",mount({key:e,cased:t,evaluate:n,store:r,error:a}){if(e)return void r.define(t(),q(()=>n()));let i=n();for(let e in i){if("function"!=typeof i[e])throw a(`"${e}" must be a function`);r.define(e,q(i[e]))}}}),te=F({name:"ref",mount({el:e,key:t,value:n,cased:r,store:a}){let i=t?r():n.trim();return a.set(i,e),()=>a.remove(i)}}),ne=F({name:"on",key:"required",value:"required",returns:!1,mount({el:e,mods:t,cased:n,evaluate:r,listen:a}){let i=n("kebab"),l=t.has("outside"),o=t.has("window")?window:t.has("document")||l||i.startsWith("sigmx-")?document:e,s=m(h(e=>r(e),t),t);a(o,i,n=>{l&&e.contains(n.target)||((t.has("prevent")||"submit"===i&&e instanceof HTMLFormElement)&&n.preventDefault(),t.has("stop")&&n.stopPropagation(),s(n))},{capture:t.has("capture"),passive:t.has("passive"),once:t.has("once")})}}),re=F({name:"on-raf",key:"forbidden",value:"required",returns:!1,mount({mods:e,evaluate:t}){let n=m(()=>t(),e),r=requestAnimationFrame(function e(){n(),r=requestAnimationFrame(e)});return()=>cancelAnimationFrame(r)}}),ae=F({name:"html",key:"forbidden",value:"required",mount:({el:e,evaluate:t,effect:n})=>n(()=>{e.innerHTML=String(t()??"")})}),ie=F({name:"style",value:"required",mount({el:e,key:t,cased:n,evaluate:r,effect:i}){let l=new Map,o=(t,n)=>{l.has(t)||l.set(t,e.style.getPropertyValue(t)),n||0===n?e.style.setProperty(t,String(n)):e.style.setProperty(t,l.get(t)??"")};return i(()=>{let e=t?{[n("kebab")]:r()}:r();for(let t of l.keys())t in e||o(t,"");for(let t in e)o(a(t),e[t])}),()=>{for(let[t,n]of l)e.style.setProperty(t,n)}}}),le={9:/\d/,a:/[a-zA-Z]/,"*":/[a-zA-Z0-9]/},oe=F({name:"mask",key:"forbidden",value:"required",mount({el:e,value:t,mods:n,evaluate:r,listen:a,effect:i}){let l=e,o=t,s=()=>{let e=((e,t)=>{let n="",r=0;for(let a of e){if(r>=t.length)break;let e=le[a];if(e){for(;r<t.length&&!e.test(t[r]);)r++;if(r>=t.length)break;n+=t[r++]}else n+=a,t[r]===a&&r++}return n})(o,l.value);e!==l.value&&(l.value=e,l.dispatchEvent(new Event("input",{bubbles:!0})))};a(l,"input",s),n.has("dynamic")?i(()=>{o=String(r()??""),s()}):s()}}),se=F({name:"match-media",key:"required",value:"required",mount({cased:e,evaluate:t,store:n,listen:r}){let a=String(t()).trim();(!/^[(a-z]/.test(a)||!a.startsWith("(")&&a.includes(":")&&!/^(not|only|all|screen|print)\b/.test(a))&&(a=`(${a})`);let i=window.matchMedia(a),l=e(),o=()=>n.set(l,i.matches);o(),r(i,"change",o)}}),ue=F({name:"init",key:"forbidden",value:"required",returns:!1,mount({mods:e,evaluate:t}){m(h(()=>t(),e),e)()}}),de=F({name:"on-signal-patch",value:"required",returns:!1,args:["patch"],mount({key:e,cased:t,mods:n,evaluate:r,listen:a}){let i=e?t():"",l=!1,o=m(e=>{if(!l){l=!0;try{r(void 0,e)}finally{l=!1}}},n);a(document,"sigmx-signal-patch",e=>{(!i||((e,t)=>{let n=e;for(let e of t.split(".")){if(null==n||"object"!=typeof n||!(e in n))return!1;n=n[e]}return!0})(e.detail,i))&&o(e.detail)})}}),ce=F({name:"remove-me",key:"forbidden",mount({el:e,value:t,cleanup:n}){let r=setTimeout(()=>e.remove(),c([t],0));n(()=>clearTimeout(r))}}),fe=(e,t,n)=>t.find(t=>e.has(t))??n,me=F({name:"scroll-into-view",key:"forbidden",value:"forbidden",mount({el:e,mods:t}){e.scrollIntoView({behavior:fe(t,["smooth","instant","auto"],"smooth"),block:fe(t,["vstart","vcenter","vend","vnearest"],"vcenter").slice(1),inline:fe(t,["hstart","hcenter","hend","hnearest"],"hcenter").slice(1)}),t.has("focus")&&e.focus?.()}}),he=F({name:"on-resize",key:"forbidden",value:"required",returns:!1,mount({el:e,mods:t,evaluate:n}){let r=m(()=>n(),t),a=new ResizeObserver(()=>r());return a.observe(e),()=>a.disconnect()}}),pe=F({name:"json-signals",key:"forbidden",mount({el:e,value:t,mods:n,evaluate:r,effect:a,store:i}){let l=t?r():void 0;a(()=>{e.textContent=JSON.stringify(i.snapshot(l),null,n.has("terse")?0:2)})}}),ge=F({name:"persist",mount({key:e,value:t,mods:n,evaluate:r,store:a,effect:i}){let l=n.has("session")?sessionStorage:localStorage,o=e||"sigmx",s=t?r():void 0,u=l.getItem(o);u&&a.merge(JSON.parse(u)),i(()=>l.setItem(o,JSON.stringify(a.snapshot(s,{computed:!1}))))}}),ve=F({name:"teleport",key:"forbidden",value:"required",mount({el:e,value:t,mods:n,error:r}){let a=document.querySelector(t);if(!a)throw r(`no element matches "${t}"`);if(e.parentElement===a)return;let i=n.has("prepend")?a.firstChild:null,l=a;l.moveBefore?l.moveBefore(e,i):a.insertBefore(e,i)}}),ye=F({name:"text",key:"forbidden",value:"required",mount:({el:e,evaluate:t,effect:n})=>n(()=>{e.textContent=String(t()??"")})}),be=F({name:"on-interval",key:"forbidden",value:"required",returns:!1,mount({mods:e,evaluate:t}){let n=e.get("duration"),r=h(()=>t(),e);n?.includes("leading")&&r();let a=setInterval(r,c(n,1e3));return()=>clearInterval(a)}}),we=F({name:"transition",key:"forbidden",value:"required",mount({el:e,mods:t,evaluate:n,effect:r}){let a=e.style,i=matchMedia("(prefers-reduced-motion: reduce)").matches?0:c(t.get("duration"),200),l=t.has("scale")?+(t.get("scale")?.[0]??95)/100:1,o=t.get("origin")?.join(" ");o&&(a.transformOrigin=o);let s,u,d={opacity:0,transform:`scale(${l})`},f={opacity:1,transform:"scale(1)"},m="none"===a.display?"":a.display,h=!0;r(()=>{let t=!!n();if(t!==u){if(u=t,s?.cancel(),h)return h=!1,void(a.display=t?m:"none");t&&(a.display=m),s=e.animate(t?[d,f]:[f,d],{duration:i,easing:"ease-out",fill:"forwards"}),s.onfinish=()=>{s?.cancel(),t||(a.display="none")}}})}}),ke=F({name:"view-transition",key:"forbidden",value:"required",mount:({el:e,evaluate:t,effect:n})=>n(()=>e.style.setProperty("view-transition-name",String(t())))}),Se=F({name:"trap",key:"forbidden",value:"required",mount({el:e,mods:t,evaluate:n,effect:r,listen:a,cleanup:i}){let l=null,o=!1,s=[],u=()=>[...e.querySelectorAll('a[href],button:not([disabled]),input:not([disabled]):not([type=hidden]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex="-1"]),[contenteditable]')].filter(e=>null!==e.offsetParent||e===document.activeElement),d=()=>{if(o){o=!1;for(let e of s.splice(0))e.removeAttribute("inert");l?.focus?.()}};a(document,"keydown",e=>{if(!o||"Tab"!==e.key)return;let t=u();if(!t.length)return e.preventDefault();let n=t.indexOf(document.activeElement),r=e.shiftKey?n<=0?t.length-1:n-1:n===t.length-1?0:n+1;(n<0||r!==n+(e.shiftKey?-1:1))&&(e.preventDefault(),t[r].focus())}),r(()=>{if(n()){if(o)return;if(o=!0,l=document.activeElement,t.has("inert"))for(let t=e;t&&t!==document.body;t=t.parentElement)for(let e of t.parentElement?.children??[])e!==t&&!e.hasAttribute("inert")&&(e.setAttribute("inert",""),s.push(e));queueMicrotask(()=>(u()[0]??e).focus?.())}else d()}),i(d)}}),xe={linear:e=>e,"ease-in":e=>e*e,"ease-out":e=>1-(1-e)*(1-e),"ease-in-out":e=>e<.5?2*e*e:1-(-2*e+2)**2/2},Ae=e=>{let t=/^\s*(-?\d*\.?\d+)([a-z%]*)\s*$/i.exec(e);return t?{n:+t[1],unit:t[2]}:void 0},Ee=F({name:"animate",key:"required",value:"required",mount({el:e,mods:t,cased:n,evaluate:r,effect:a,cleanup:i}){let l,o=n("kebab"),s=CSS.supports(o,"inherit"),u=c(t.get("duration"),300),d=xe[t.get("easing")?.[0]??"ease-out"]??xe["ease-out"],f=matchMedia("(prefers-reduced-motion: reduce)").matches,m=t=>s?e.style.setProperty(o,t):e.setAttribute(o,t),h=0,p=!0;a(()=>{let t=String(r());if(t===l)return;l=t,cancelAnimationFrame(h);let n=Ae(s?e.style.getPropertyValue(o)||getComputedStyle(e).getPropertyValue(o):e.getAttribute(o)??""),a=Ae(t);if(n&&a&&"px"===n.unit&&"%"===a.unit&&("width"===o||"height"===o)&&e.parentElement){let t="width"===o?e.parentElement.clientWidth:e.parentElement.clientHeight;t&&(n={n:n.n/t*100,unit:"%"})}if(p||f||!n||!a||n.unit!==a.unit)return p=!1,m(t);let i=n.n,c=a.n,g=performance.now(),v=e=>{let t=Math.min(1,(e-g)/u);m(`${i+(c-i)*d(t)}${a.unit}`),t<1&&(h=requestAnimationFrame(v))};h=requestAnimationFrame(v)}),i(()=>cancelAnimationFrame(h))}}),Te=(e,t,...n)=>({l:e,h:t,y:n}),$e=F({name:"bind",mount({el:e,key:t,value:n,cased:r,mods:a,store:i,listen:l,effect:o}){let s,u=t?r():n.trim(),d=()=>i.get(u),c=e=>"number"==typeof d()?+e:e,f=a.get("prop")?.[0];if(f)s=Te(()=>e[f],t=>e[f]=t,"input","change");else if(e instanceof HTMLInputElement){let t=e.type;if("checkbox"===t){let t=e.hasAttribute("value")&&"on"!==e.value;s={l:()=>{let n=d();if(Array.isArray(n)){let t=new Set(n);return e.checked?t.add(e.value):t.delete(e.value),[...t]}return t?e.checked?e.value:"":e.checked},h:n=>{e.checked=Array.isArray(n)?n.includes(e.value):t?n===e.value:!!n},y:["input"]}}else if("radio"===t)e.name||(e.name=u),s=Te(()=>e.checked?c(e.value):d(),t=>e.checked=String(t)===e.value,"input");else{if("file"===t)return void l(e,"change",()=>(e=>Promise.all([...e.files??[]].map(e=>new Promise(t=>{let n=new FileReader;n.onloadend=()=>t({name:e.name,type:e.type,size:e.size,contents:String(n.result).split(",")[1]??""}),n.readAsDataURL(e)}))))(e).then(e=>i.set(u,e)));s=Te("number"===t||"range"===t?()=>""===e.value?"":+e.value:()=>e.value,t=>e.value=String(t??""),"input")}}else s=e instanceof HTMLSelectElement?{l:()=>e.multiple?[...e.selectedOptions].map(e=>c(e.value)):c(e.value),h:t=>{if(e.multiple)for(let n of e.options)n.selected=Array.isArray(t)&&t.map(String).includes(n.value);else e.value=String(t??"")},y:["change"]}:e instanceof HTMLTextAreaElement||"value"in e?Te(()=>e.value,t=>e.value=String(t??""),"input","change"):Te(()=>e.getAttribute("value"),t=>e.setAttribute("value",String(t??"")),"change");if(!i.has(u)){let e=s.l();void 0!==e&&""!==e&&i.set(u,e)}let m=()=>i.set(u,s.l());for(let t of a.get("event")??s.y)l(e,t,m);l(e,"sigmx-prop-change",m),o(()=>{let e=d();void 0!==e&&s.h(e)})}}),Me=e=>{try{return JSON.parse(e)}catch{return e}},Le=F({name:"query-string",mount({key:e,value:t,mods:n,evaluate:r,cased:a,store:i,listen:l,effect:o}){let u=n.has("history"),c=e=>{e!==location.pathname+location.search+location.hash&&window.history[u?"pushState":"replaceState"](null,"",e)},f=e=>`${location.pathname}${e.size?`?${e}`:""}${location.hash}`,m=!1,h=e=>{m=!0;try{e()}finally{m=!1}};if(e){let n=a(),s=t?r():"",d=()=>{let t=new URLSearchParams(location.search).get(e);i.set(n,null===t?s:Me(t))};return(!i.has(n)||new URLSearchParams(location.search).has(e))&&d(),o(()=>{let t=i.get(n);if(m)return;let r=new URLSearchParams(location.search);void 0===t||((e,t)=>JSON.stringify(e)===JSON.stringify(t))(t,s)?r.delete(e):r.set(e,"string"==typeof t?t:JSON.stringify(t)),c(f(r))}),void(u&&l(window,"popstate",()=>h(d)))}let p=t?r():void 0,g=d(p),v=()=>{let e={};for(let[t,n]of new URLSearchParams(location.search))g(t)&&s(e,t,Me(n));i.merge(e)};v(),o(()=>{let e=i.snapshot(p,{computed:!1});if(m)return;let t=new URLSearchParams(location.search),r=(e,a)=>{for(let i in e){let l=a?`${a}.${i}`:i,o=e[i];o&&"object"==typeof o&&!Array.isArray(o)?r(o,l):!n.has("filter")||""!==o&&null!=o?t.set(l,"string"==typeof o?o:JSON.stringify(o)):t.delete(l)}};r(e,""),c(f(t))}),u&&l(window,"popstate",()=>h(v))}}),qe=F({name:"replace-url",key:"forbidden",value:"required",mount:({evaluate:e,effect:t})=>t(()=>history.replaceState(history.state,"",new URL(String(e()),location.href)))}),Oe=F({name:"custom-validity",key:"forbidden",value:"required",mount({el:e,evaluate:t,effect:n,error:r}){if(!("setCustomValidity"in e))throw r("only works on form fields");n(()=>e.setCustomValidity(String(t()??"")))}}),Pe=F({name:"on-intersect",key:"forbidden",value:"required",returns:!1,mount({el:e,mods:t,evaluate:n}){let r=t.get("threshold")?.[0],a=t.has("full")?1:t.has("half")?.5:r?Math.min(100,Math.max(0,+r))/100:0,i=m(h(()=>n(),t),t),l=new IntersectionObserver(e=>{for(let n of e)n.isIntersecting!==t.has("exit")&&(i(),t.has("once")&&l.disconnect())},{threshold:a});return l.observe(e),()=>l.disconnect()}}),Ne=F({name:"show",key:"forbidden",value:"required",mount({el:e,evaluate:t,effect:n}){let r="none"===e.style.display?"":e.style.display;return n(()=>{e.style.display=t()?r:"none"}),()=>{e.style.display=r}}}),je=F({name:"effect",key:"forbidden",value:"required",returns:!1,mount:e=>e.effect(()=>e.evaluate())}),Ce=U({name:"setAll",call:({store:e},t,n)=>O(()=>P(()=>{for(let r of e.paths(n))e.set(r,t)}))}),He=U({name:"toggleAll",call:({store:e},t)=>O(()=>P(()=>{for(let n of e.paths(t))e.set(n,!e.get(n))}))}),Re=U({name:"confirm",call:(e,t)=>window.confirm(t)}),Ie=U({name:"clipboard",call:(e,t,n=!1)=>navigator.clipboard.writeText(n?(new TextDecoder).decode(Uint8Array.from(atob(t),e=>e.charCodeAt(0))):t)}),Ve=U({name:"dispatch",call:({el:e},t,n)=>e.dispatchEvent(new CustomEvent(t,{detail:n,bubbles:!0,composed:!0}))}),ze={number:(e,t,n)=>new Intl.NumberFormat(e,n).format(t),datetime:(e,t,n)=>new Intl.DateTimeFormat(e,n).format(t),pluralRules:(e,t,n)=>new Intl.PluralRules(e,n).select(t),relativeTime:(e,t,n)=>new Intl.RelativeTimeFormat(e,n).format(t[0],t[1]),list:(e,t,n)=>new Intl.ListFormat(e,n).format(t),displayNames:(e,t,n)=>new Intl.DisplayNames(e,n).of(t)??""},De=U({name:"intl",call:({error:e},t,n,r,a)=>{let i=ze[t];if(!i)throw e(`unknown @intl type "${t}"`);return i(a,n,r)}}),Be=U({name:"fit",call:(e,t,n,r,a,i,l=!1,o=!1)=>{let s=(t-n)/(r-n);l&&(s=Math.min(1,Math.max(0,s)));let u=a+s*(i-a);return o?Math.round(u):u}}),Fe=async(e,t)=>{let n,r,a=e.getReader(),i=new TextDecoder,l="",o="",s=[],u=()=>{s.length&&t({event:o||"message",data:s.join("\n"),id:n,retry:r}),o="",s=[]},d=e=>{if(!e)return u();if(":"===e[0])return;let t=e.indexOf(":"),a=t<0?e:e.slice(0,t),i=t<0?"":e.slice(t+1);" "===i[0]&&(i=i.slice(1)),"event"===a?o=i:"data"===a?s.push(i):"id"===a?n=i:"retry"===a&&/^\d+$/.test(i)&&(r=+i)};for(;;){let{value:e,done:t}=await a.read();if(t)break;for(l+=i.decode(e,{stream:!0});;){let e=l.search(/\r\n|\r|\n/);if(e<0)break;let t=l.slice(0,e);l=l.slice(e+("\r"===l[e]&&"\n"===l[e+1]?2:1)),d(t)}}l&&d(l),u()},Ue=new Map,We=0,Je=()=>new Promise(e=>document.addEventListener("visibilitychange",()=>!document.hidden&&e(),{once:!0})),_e=(e,t,n)=>{for(let r of t){let t=e.headers.get(`sigmx-${r}`);t&&(n[i(r)]=t)}return n},Ze=e=>{let t=document.createElement("script");t.text=e,document.head.append(t),t.remove()},Ke=(e,t)=>U({name:e,call:(e,n,r)=>(async(e,t,n,r={})=>{let{el:a,evt:i,store:l,runtime:o,error:s}=t;if(!n)throw s(`@${e.toLowerCase()} needs a URL`);let u=`${e} ${n}`,d=r.abort instanceof AbortController?r.abort:new AbortController;"none"!==r.abort&&(Ue.get(u)?.abort(),Ue.set(u,d)),t.cleanup(()=>d.abort());let c,f=++We,m=(t,r={})=>o.emit("fetch",{el:a,type:t,method:e,url:n,rid:f,...r}),h={attempts:5,interval:1e3,factor:2,max:3e4,onStatusError:!1,...r.retry},p=!(r.openWhenHidden??"GET"!==e),g="GET"!==e&&"DELETE"!==e,v=()=>{let t,o=new URL(n,location.href),u={Accept:"text/event-stream, text/html, application/json","Sigmx-Request":"true",...r.headers};if("json"===(r.contentType??"json")){let e=r.payload??P(()=>l.snapshot(r.filter??{exclude:/(^|\.)_/})),n=JSON.stringify(e);g?(t=n,u["Content-Type"]??="application/json"):o.searchParams.set("sigmx",n)}else{let e=r.selector?document.querySelector(r.selector):a.closest("form");if(!e)throw s("no form found",{selector:r.selector});if(!e.noValidate&&!e.checkValidity())return void e.reportValidity();let n=i instanceof SubmitEvent?i.submitter:a instanceof HTMLButtonElement&&a.form===e?a:null,l=new FormData(e,n),d="multipart/form-data"===e.enctype;if(g)t=d?l:new URLSearchParams(l),d||(u["Content-Type"]="application/x-www-form-urlencoded");else for(let[e,t]of new URLSearchParams(l))o.searchParams.append(e,t)}return{url:o.toString(),init:{method:e,headers:u,body:t}}},y=(e,t)=>{let n=(e=>{let t={};for(let n of e.split("\n")){let e=n.indexOf(" "),r=e<0?n:n.slice(0,e),a=e<0?"":n.slice(e+1);t[r]=r in t?`${t[r]}\n${a}`:a}return t})(t);o.emit("server-event",{el:a,event:e,data:n}),o.handle(e,n)},b=0,w=h.interval,k=async()=>{if(b++>=h.attempts)throw new Error("retries exhausted");m("retrying",{attempt:b}),await((e,t)=>new Promise(n=>{let r=setTimeout(n,e);t.addEventListener("abort",()=>{clearTimeout(r),n()},{once:!0})}))(w,d.signal),w=Math.min(w*h.factor,h.max)};m("started");try{for(;!d.signal.aborted;){let e=v();if(!e)return;c&&(e.init.headers["Last-Event-ID"]=c);let t=new AbortController,n=()=>document.hidden&&t.abort();p&&document.addEventListener("visibilitychange",n);try{let n=await fetch(e.url,{...e.init,signal:AbortSignal.any([d.signal,t.signal])}),a=n.headers.get("content-type")??"";if(n.status>=400){if(m("error",{status:n.status}),!h.onStatusError)return;await k();continue}if(204===n.status||304===n.status||!n.body)return;if(a.includes("text/event-stream")){if(b=0,w=h.interval,await Fe(n.body,e=>{void 0!==e.id&&(c=e.id),e.retry&&(w=h.interval=e.retry),y(e.event,e.data)}),!r.reconnect)return;await k();continue}let i=await n.text();return void(a.includes("text/html")?o.handle("patch-elements",_e(n,["selector","mode","use-view-transition"],{elements:i})):a.includes("application/json")?o.handle("patch-signals",_e(n,["only-if-missing"],{signals:i})):a.includes("javascript")&&Ze(i))}catch{if(d.signal.aborted)return;t.signal.aborted?await Je():await k()}finally{document.removeEventListener("visibilitychange",n)}}}catch(t){throw m("error",{message:t?.message}),s(`${e} ${n}: ${t?.message??t}`)}finally{m("finished"),Ue.get(u)===d&&Ue.delete(u)}})(t,e,n,r)}),Ge=Ke("get","GET"),Qe=Ke("post","POST"),Xe=Ke("put","PUT"),Ye=Ke("patch","PATCH"),et=Ke("delete","DELETE"),tt=U({name:"peek",call:(e,t)=>P(t)}),nt=U({name:"ws",call({el:e,runtime:t,cleanup:n},r,a={}){let i=new WebSocket(new URL(r,location.href.replace(/^http/,"ws")),a.protocols);return i.onmessage=n=>{for(let r of String(n.data).split(/\n\n+/)){let n="message",a={};for(let e of r.split("\n")){let t=e.indexOf(":");if(t<0)continue;let r=e.slice(0,t),i=e.slice(t+1).trimStart();if("event"===r)n=i;else if("data"===r){let e=i.indexOf(" "),t=e<0?i:i.slice(0,e),n=e<0?"":i.slice(e+1);a[t]=t in a?`${a[t]}\n${n}`:n}}t.emit("server-event",{el:e,event:n,data:a}),t.handle(n,a)}},n(()=>i.close()),{send:e=>i.send("string"==typeof e?e:JSON.stringify(e)),close:()=>i.close(),socket:i}}}),rt=new WeakSet,at=e=>!!e&&1===e.nodeType,it=e=>{if(at(e))for(let t of e.matches("script")?[e]:[...e.querySelectorAll("script")]){if(rt.has(t))continue;let e=document.createElement("script");for(let{name:n,value:r}of t.attributes)e.setAttribute(n,r);e.text=t.text,rt.add(e),t.replaceWith(e)}},lt=e=>[...at(e)&&e.id?[e]:[],...e.querySelectorAll("[id]")],ot=(e,t)=>at(e)&&lt(e).some(e=>t.keep.has(e.id)),st=(e,t)=>{ot(e,t)?t.pantry.append(e):e.remove()},ut=(e,t,n)=>{let r=e;try{r.moveBefore?r.moveBefore(t,n):e.insertBefore(t,n)}catch{e.insertBefore(t,n)}},dt=(e,t,n)=>{for(let n=t;n;n=n.nextSibling)if(at(n)&&n.id===e)return n;return n.pantry.querySelector(`#${CSS.escape(e)}`)??document.getElementById(e)},ct=(e,t,n)=>!(e.nodeType!==t.nodeType||e.nodeName!==t.nodeName||at(e)&&e.id&&e.id!==t.id||at(e)&&n.keep.has(e.id)&&e.id!==t.id),ft=(e,t,n)=>{if(e.nodeType!==t.nodeType||e.nodeName!==t.nodeName){let n=document.importNode(t,!0);return e.replaceWith(n),void it(n)}at(e)&&at(t)?e.hasAttribute(n.ignore)&&t.hasAttribute(n.ignore)||(((e,t,n)=>{let r=new Set((t.getAttribute(n.preserve)??e.getAttribute(n.preserve)??"").split(/\s+/).filter(Boolean)),a=!1,i=n=>!r.has(n)&&e.getAttribute(n)!==t.getAttribute(n);e instanceof HTMLInputElement&&t instanceof HTMLInputElement&&"file"!==e.type?(i("value")&&(e.value=t.getAttribute("value")??"",a=!0),i("checked")&&(e.checked=t.hasAttribute("checked"),a=!0)):e instanceof HTMLTextAreaElement&&t instanceof HTMLTextAreaElement?!r.has("value")&&e.defaultValue!==t.defaultValue&&(e.value=t.defaultValue,a=!0):e instanceof HTMLOptionElement&&t instanceof HTMLOptionElement&&i("selected")&&(e.selected=t.hasAttribute("selected"),a=!0);for(let{name:n,value:a}of t.attributes)!r.has(n)&&e.getAttribute(n)!==a&&e.setAttribute(n,a);for(let{name:n}of[...e.attributes])!r.has(n)&&!t.hasAttribute(n)&&e.removeAttribute(n);a&&(e instanceof HTMLOptionElement?e.closest("select"):e)?.dispatchEvent(new Event("sigmx-prop-change",{bubbles:!0}))})(e,t,n),e instanceof HTMLTemplateElement&&t instanceof HTMLTemplateElement?e.innerHTML=t.innerHTML:e.isEqualNode(t)||mt(e,t,n)):e.nodeValue!==t.nodeValue&&(e.nodeValue=t.nodeValue)},mt=(e,t,n)=>{let r=e.firstChild,a=e=>{for(;r&&r!==e;){let e=r;r=r.nextSibling,st(e,n)}return r===e};for(let i of[...t.childNodes]){if(at(i)&&i.id&&n.keep.has(i.id)){let t=dt(i.id,r,n);if(t){a(t)&&r?r=t.nextSibling:ut(e,t,r),ft(t,i,n);continue}}let t=r;for(;t&&!ct(t,i,n);)t=t.nextSibling;if(t)a(t),r=t.nextSibling,ft(t,i,n);else if(at(i)&&ot(i,n)){let t=document.createElementNS(i.namespaceURI??"http://www.w3.org/1999/xhtml",i.tagName);e.insertBefore(t,r),ft(t,i,n)}else{let t=document.importNode(i,!0);e.insertBefore(t,r),it(t)}}a(null)},ht=(e,t,n)=>{let r=new Set,a=new Map(lt(t).map(e=>[e.id,e.tagName]));for(let t of lt(e))a.get(t.id)===t.tagName&&r.add(t.id);return{keep:r,pantry:document.createDocumentFragment(),ignore:n.ignoreAttr??"data-ignore-morph",preserve:n.preserveAttr??"data-preserve-attr"}},pt=(e,t,n={})=>{let r=ht(e,t,n);ft(e,t,r)},gt=(e,t,n={})=>{let r=ht(e,t,n);mt(e,t,r)},vt=["outer","inner","replace","prepend","append","before","after","remove"],yt=e=>1===e.nodeType,bt=((e={})=>(e=>{let n=[].concat(e.prefix??"data-"),r=[].concat(e.eventPrefix??"sigmx-"),a=e.store??V(),i=e.compile??p,{expressions:o}=e,s=e.onError??((e,t)=>console.error(e,t)),u=Object.create(null),d=Object.create(null),c=Object.create(null),f={prefixes:n,attr:e=>n[0]+e,store:a,compiler:i,emit:(e,t)=>document.dispatchEvent(new CustomEvent(`sigmx-${e}`,{detail:t})),call:(e,t,n)=>{let r=d[e];if(!r)throw t.error(`unknown action @${e}`);return r.call(t,...n)},eventPrefixes:r,handle:(e,t)=>{let n=r.find(t=>e.startsWith(t)),a=c[n?e.slice(n.length):e];return a?.handle(f,t),!!a},attributes:u,actions:d,handlers:c},m=new Map,h=new Set,g=n.map(e=>`[${e}ignore__self]`).join(),v=n.map(e=>`[${e}ignore]`).join(),y=e=>e.matches(g)||!!e.closest(v),b=e=>{for(let t of n)if(e.startsWith(t))return e.slice(t.length)},k=e=>{for(let t of e){let e=m.get(t);if(e&&m.delete(t))for(let t of e.values())t()}},S=(e,t)=>{let n=m.get(e);n?.get(t)?.(),n?.delete(t)},x=(e,r,i,d,c)=>{let{plugin:h,key:p,mods:g}=(e=>{let t=B.get(e);if(!t){let[n,...r]=e.split("__"),a=n.indexOf(":"),i=new Map;for(let e of r){let[t,...n]=e.split(".");i.set(t,n)}t={plugin:a<0?n:n.slice(0,a),key:a<0?void 0:n.slice(a+1),mods:i},B.set(e,t)}return t})(i),v=u[h];if(!v||c&&!c.has(h))return;S(e,r);let y,b=[],k={plugin:h,el:e,attr:r},x=(e,t)=>((e,t)=>Object.assign(new Error(e),{info:t}))(`${n[0]}${h}: ${e}`,{...k,...t}),A=e=>s(e,k),E={el:e,plugin:h,attr:r,key:p,value:d,mods:g,cased:(e="camel")=>((e,t)=>e.split(".").map(l[t]).join("."))(p??"",g.get("case")?.[0]||e),evaluate:(t,...n)=>(y??=o(d,["el","evt",...v.args??[]],v.returns??!0),y(a,((e,t,n,r,i)=>{let l={el:e,evt:t,store:a,runtime:f,error:n,cleanup:r};return new Proxy({},{get:(e,t)=>(...e)=>{let n=f.call(t,l,e);return n instanceof Promise&&n.catch(i),n}})})(e,t,x,E.cleanup,A),e,t,...n)),effect:e=>b.push(((e,n)=>{let r=new L(e,n);return t?.o.add(r),r.b(),w||N(),()=>r.g()})(e,A)),listen:(e,t,n,r)=>{let a=e=>{try{n(e)}catch(e){A(e)}};e.addEventListener(t,a,r),b.push(()=>e.removeEventListener(t,a,r))},cleanup:e=>b.push(e),error:x,store:a,runtime:f},T=m.get(e);T||(T=new Map,m.set(e,T)),T.set(r,()=>{for(let e of b.splice(0))e()});try{if("required"===v.key&&!p)throw x("needs a key");if("forbidden"===v.key&&p)throw x("takes no key");if("required"===v.value&&!d)throw x("needs a value");if("forbidden"===v.value&&d)throw x("takes no value");let e=v.mount(E);"function"==typeof e&&b.push(e)}catch(e){A(e)}},A=(e,t)=>{for(let n of e)if(!y(n))for(let{name:e,value:r}of[...n.attributes]){let a=b(e);a&&!m.get(n)?.has(e)&&x(n,e,a,r,t)}},E=new MutationObserver(e=>{for(let{type:t,target:n,attributeName:r,addedNodes:a,removedNodes:i}of e)if("childList"===t){for(let e of i)k(D(e));for(let e of a)A(D(e))}else if(r&&z(n)&&!y(n)){let e=b(r);if(!e)continue;let t=n.getAttribute(r);null===t?S(n,r):x(n,r,e,t)}}),T=!1,$=(e=document.documentElement,t=!0,n)=>{A(D(e),n),t&&!h.has(e)&&(E.observe(e,{subtree:!0,childList:!0,attributes:!0}),h.add(e)),!T&&h.has(document.documentElement)&&(T=!0,f.emit("ready"))},M=(...e)=>{let t=new Set;for(let n of e)"attribute"===n.type?(u[n.name]=n,t.add(n.name)):"action"===n.type?d[n.name]=n:c[n.name]=n;if(t.size)for(let e of h)$(e,!1,t)},q=a.onPatch(e=>f.emit("signal-patch",e));M(...e.plugins??[]);let O={runtime:f,store:a,get $(){return a.$},apply:(e,t)=>$(e,t),use:M,destroy:()=>{E.disconnect(),q(),k([...m.keys()]),h.clear()}};return(e.autoStart??!0)&&("loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>O.apply(),{once:!0}):O.apply()),O})({...e,expressions:e.expressions??b(e.compile??p)}))({plugins:[_,$e,G,ee,Oe,je,K,ue,pe,se,ne,Pe,be,re,he,de,ge,Le,te,qe,me,Ne,Y,ie,ye,ke,Ie,Be,De,tt,Ce,He,Ee,et,Ge,Ye,Qe,Xe,W({name:"patch-elements",handle(e,{elements:t="",selector:n="",mode:r="outer",useViewTransition:a}){if(!vt.includes(r))throw new Error(`patch-elements: unknown mode "${r}"`);let i=()=>((e,t,n,r)=>{let a={ignoreAttr:e.attr("ignore-morph"),preserveAttr:e.attr("preserve-attr")},i=(e=>{if(/<\/(html|head|body)>/i.test(e))return(new DOMParser).parseFromString(e,"text/html");let t=document.createElement("template");return t.innerHTML=e,t.content})(t);if(i instanceof Document)return i.head.childNodes.length&&gt(document.head,i.head,a),void pt(document.body,i.body,a);let l=i;if("remove"===r){for(let e of document.querySelectorAll(n))e.remove();return}if(!n){if("outer"!==r&&"replace"!==r)throw new Error(`patch-elements mode "${r}" needs a selector`);for(let e of[...l.children]){let t=e.id&&document.getElementById(e.id);t?"outer"===r?pt(t,e,a):(t.replaceWith(e),it(e)):console.warn("patch-elements: no element with id",e.id)}return}let o=[...document.querySelectorAll(n)];o.length||console.warn("patch-elements: no elements match",n),o.forEach((e,t)=>{let n=t===o.length-1?l:l.cloneNode(!0),i=[...n.childNodes];if("outer"===r&&1===i.length&&yt(i[0]))pt(e,i[0],a);else if("inner"===r)gt(e,n,a);else{"outer"===r||"replace"===r?e.replaceWith(n):e[r](n);for(let e of i)it(e)}})})(e,t,n,r);"true"===a&&"startViewTransition"in document?document.startViewTransition(i):i()}}),W({name:"patch-signals",handle(e,{signals:t,onlyIfMissing:n}){if(!t)return;let r;try{r=JSON.parse(t)}catch{r=e.compiler([],`return (${t})`)()}e.store.merge(r,{ifMissing:"true"===n})}}),Z,Q,X,ae,oe,ce,ve,we,Se,Re,Ve,nt]});globalThis.sigmx=bt;export{bt as sigmx};
1
+ var e,t,r=e=>e.replace(/([a-z0-9])([A-Z])|([A-Z]+)([A-Z][a-z])/g,"$1$3 $2$4").split(/[^A-Za-z0-9]+/).filter(Boolean).map(e=>e.toLowerCase()),l=e=>e[0].toUpperCase()+e.slice(1),n=e=>r(e).join("-"),a=e=>r(e).map((e,t)=>t?l(e):e).join(""),i={camel:a,kebab:n,snake:e=>r(e).join("_"),pascal:e=>r(e).map(l).join("")},o=e=>{if(null===e||"object"!=typeof e)return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||null===t},s=e=>"__proto__"!==e&&"constructor"!==e&&"prototype"!==e,c=(e,t,r)=>{let l=t.split(".");if(!l.every(s))return e;let n=l.pop(),a=e;for(let e of l)(!o(a[e])||!Object.hasOwn(a,e))&&(a[e]={}),a=a[e];return a[n]=r,e},u=(e,t=0)=>{for(let t of e?.length?[e.join("."),...e]:[]){let e=/^(\d+(?:\.\d+)?)(ms|s)?$/.exec(t);if(e)return+e[1]*("s"===e[2]?1e3:1)}return t},d=(e,t,r,l,n)=>{let a,i,o=()=>{a=void 0,l&&i&&e(...i),i=void 0},s=(...l)=>{if(a)return i=l,void(n&&(clearTimeout(a),a=setTimeout(o,t)));r?e(...l):i=l,a=setTimeout(o,t)};return s.cancel=()=>{clearTimeout(a),a=i=void 0},s},f=(e,t,r)=>{let l=t.get("debounce"),n=t.get("throttle");return l&&(e=d(e,u(l,300),l.includes("leading"),!l.includes("notrailing"),!0)),n&&(e=d(e,u(n,300),!n.includes("noleading"),n.includes("trailing"),!1)),(l||n)&&r?.(e.cancel),e},h=(e,t)=>Function(...e,t),p=/[A-Za-z_$]/,m=/[\w$]/,g=/(^|[(,=:[!&|?{};+\-*%<>~^]|\b(?:return|typeof|case|in|of|do|else|void|delete|throw|new))$/,v=(e,t,r)=>{let l="",n=t,a=0,i=e.length,o=()=>l.trimEnd();for(;n<i;){let t=e[n],s=e[n+1];if('"'===t||"'"===t){let r=n+1;for(;r<i&&e[r]!==t;)r+="\\"===e[r]?2:1;l+=e.slice(n,r+1),n=r+1}else if("`"===t){for(l+=t,n++;n<i&&"`"!==e[n];)if("\\"===e[n])l+=e.slice(n,n+2),n+=2;else if("$"===e[n]&&"{"===e[n+1]){let[t,r]=v(e,n+2,!0);l+=`\${${t}}`,n=r}else l+=e[n++];l+="`",n++}else if("/"===t&&"/"===s){let t=e.indexOf("\n",n);n=t<0?i:t}else if("/"===t&&"*"===s){let t=e.indexOf("*/",n+2);n=t<0?i:t+2}else if("/"===t&&g.test(o())){let t=n+1,r=!1;for(;t<i&&(r||"/"!==e[t]);t++)"\\"===e[t]?t++:"["===e[t]?r=!0:"]"===e[t]&&(r=!1);for(t++;t<i&&/[a-z]/i.test(e[t]);t++);l+=e.slice(n,t),n=t}else if(!r||"{"!==t&&"}"!==t)if("$"===t&&p.test(s??"")&&"$"!==s&&!m.test(l.at(-1)??"")){let r=o();if(r.endsWith(".")&&!r.endsWith("...")){l+=t,n++;continue}let a=n+1;for(;a<i&&m.test(e[a]);)a++;l+=`$.${e.slice(n+1,a)}`,n=a}else if("@"===t&&p.test(s??"")){let r=n+1;for(;r<i&&m.test(e[r]);)r++;let a=r;for(;a<i&&/\s/.test(e[a]);)a++;"("===e[a]?(l+=`__a.${e.slice(n+1,r)}(`,n=a+1):(l+=t,n++)}else l+=t,n++;else{if("{"===t)a++;else{if(!a)return[l,n+1];a--}l+=t,n++}}return[l,n]},y=new Map,w=e=>(t,r)=>{let l=((e,t,r)=>{let l=`${r.join()}|${t}`,n=y.get(l);return n||(n=((e,t,r)=>{let l;for(let n of(e=>{let t=[`return(${e}\n)`];for(let r=e.lastIndexOf(";");r>=0;r=e.lastIndexOf(";",r-1))t.push(`${e.slice(0,r)};return(${e.slice(r+1)}\n)`);return t.push(e),t.map(e=>`"use strict";${e}`)})((e=>v(e,0,!1)[0])(t.trim())))try{return[n,e(["$","__a",...r],n)]}catch(e){l=e}throw l})(e,t,r)[1],y.size>=2e3&&y.delete(y.keys().next().value),y.set(l,n)),n})(e,t,r);return(e,t,...r)=>l(e.$,t,...r)},b=0,x=!1,S=new Set,$=new Set,A=class{i=0;c=new Set;constructor(e){this.t=e}get value(){return e&&(e.e.set(this,this.i),this.c.add(e)),this.t}set value(e){Object.is(e,this.t)||(this.t=e,this.bump())}peek(){return this.t}bump(){this.i++;for(let e of this.c)e.p();b||j()}},k=e=>{for(let t of e.e.keys())t.c.delete(e);e.e.clear()},E=(t,r)=>{k(t);let l=e;e=t;try{return r()}finally{e=l}},M=e=>{if(!e.e.size)return!0;for(let[t,r]of e.e)if(t instanceof T&&t.g(),t.i!==r)return!0;return!1},T=class extends A{e=new Map;o=!0;constructor(e){super(void 0),this.f=e}g(){if(!this.o||(this.o=!1,!M(this)))return;let e=E(this,this.f);Object.is(e,this.t)||(this.t=e,this.i++)}get value(){return this.g(),super.value}set value(e){throw new Error("computed is read-only")}p(){if(!this.o){this.o=!0;for(let e of this.c)e.p()}}dispose(){k(this),this.o=!1}},L=class{e=new Map;l=!1;u=!1;d=new Set;constructor(e,t){this.f=e,this.h=t}p(){!this.u&&!this.l&&(this.l=!0,S.add(this))}y(){if(this.l=!1,this.u)return;let e=t;t=this,b++;try{M(this)&&(this.x(),E(this,this.f))}catch(e){if(!this.h)throw e;this.h(e)}finally{b--,t=e}}x(){for(let e of this.d)e.m();this.d.clear()}m(){this.u=!0,k(this),e===this&&(e=void 0),this.x(),S.delete(this)}},O=e=>{b++;try{return e()}finally{--b||j()}},P=t=>{let r=e;e=void 0;try{return t()}finally{e=r}},j=()=>{if(x||b)return;x=!0;let e,t=!1;try{let r=0;for(;S.size;){if(++r>1e5){for(let e of S)e.l=!1;throw S.clear(),new Error("effect loop")}let l=S.values().next().value;S.delete(l);try{l.y()}catch(r){t||(t=!0,e=r)}}}finally{x=!1}for(let e of $)e();if(t)throw e},N=e=>{let t=e.lastIndexOf(".");return[t<0?"":e.slice(0,t),e.slice(t+1)]},C=(e,t)=>e?`${e}.${t}`:t,I=(e,t)=>!t||e.startsWith(`${t}.`),q=e=>"string"==typeof e,R=new WeakMap,z=()=>{let e=new Map,t=new Map([["",new Set]]),r=new A(0),l=new Map,n=new Set,a=new Map,i=new WeakMap,u=e=>{let[t,l]=N(e);f(t).add(l),r.bump()},d=e=>{let[l,n]=N(e);t.get(l)?.delete(n),r.bump()},f=r=>{let l=t.get(r);return l||(e.has(r)&&h(r),l=new Set,t.set(r,l),u(r)),l},h=t=>{let r=e.get(t);r&&(e.delete(t),d(t),l.set(t,null),r.bump(),r instanceof T&&r.dispose())},p=e=>{let r=t.get(e);if(r){for(let t of[...r])m(C(e,t));e&&(t.delete(e),a.delete(e),d(e))}},m=e=>O(()=>{h(e),p(e)}),g=(t,r)=>O(()=>{p(t);let l=e.get(t);e.set(t,r),u(t),l&&(l.bump(),l instanceof T&&l.dispose())}),v=(t,r)=>O(()=>{if(null==r)return m(t);if(r=(r&&R.get(r))??r,o(r)){for(let e of[...f(t)])e in r||m(C(t,e));for(let e in r)s(e)&&v(C(t,e),r[e]);return}p(t);let n=e.get(t);if(n instanceof T)throw new Error(`computed "${t}" is read-only`);if(n){if(Object.is(n.peek(),r))return;n.value=r}else g(t,new A(r));l.set(t,r)}),y=(r,{at:l="",ifMissing:n=!1}={})=>O(()=>{if(!o(r))return;let a=Object.keys(r).filter(s);a.length&&f(l);for(let i of a){let a=C(l,i),s=r[i],c=e.get(a);c&&(n||c instanceof T)||(null===s?n||m(a):o(s)?y(s,{at:a,ifMissing:n}):n&&t.has(a)||v(a,s))}}),w=n=>{let a=e.get(n);if(a){let e=a.value;return Array.isArray(e)?((e,t,r)=>{let n=i.get(t);n||(n=new WeakMap,i.set(t,n));let a=()=>(l.set(r,e),t.bump(),!0),s=e=>{let t=n?.get(e);return t||(t=new Proxy(e,{get:(e,t,r)=>{let l=Reflect.get(e,t,r);if("function"==typeof l&&Array.isArray(e))return(...e)=>O(()=>l.apply(r,e));if(!l||"object"!=typeof l||!Array.isArray(l)&&!o(l))return l;let n=Object.getOwnPropertyDescriptor(e,t);return!n||n.configurable||n.writable?s(l):l},set:(e,t,r)=>(e[t]=(r&&R.get(r))??r,a()),deleteProperty:(e,t)=>(delete e[t],a())}),n?.set(e,t),R.set(t,e)),t};return s(e)})(e,a,n):e}if(r.value,t.has(n))return b(n)},b=e=>{let l=a.get(e);if(!l){let n=l=>(r.value,q(l)&&!!t.get(e)?.has(l));l=new Proxy({},{get:(t,r)=>q(r)?"toJSON"===r?()=>S(void 0,{at:e}):w(C(e,r)):void 0,set:(t,r,l)=>(q(r)&&v(C(e,r),l),!0),deleteProperty:(t,r)=>(q(r)&&m(C(e,r)),!0),has:(e,t)=>n(t),ownKeys:()=>(r.value,[...t.get(e)??[]]),getOwnPropertyDescriptor:(t,r)=>n(r)?{enumerable:!0,configurable:!0,writable:!0,value:w(C(e,r))}:void 0}),a.set(e,l)}return l},x=(t,{computed:l=!0}={})=>{r.value;let n=(e=>{if("function"==typeof e)return e;let t=(e,t)=>{if(e)return e.lastIndex=0,e.test(t)};return r=>(t(e?.include,r)??!0)&&!t(e?.exclude,r)})(t);return[...e].filter(([e,t])=>n(e)&&(l||!(t instanceof T))).map(([e])=>e)},S=(t,{at:r="",computed:l=!0}={})=>{let n={};for(let a of x(t,{computed:l}))I(a,r)&&c(n,r?a.slice(r.length+1):a,e.get(a)?.value);return n};return $.add(()=>{if(!l.size)return;let e={};for(let[t,r]of l)c(e,t,r);l.clear();for(let t of n)t(e)}),{get:w,set:v,merge:y,remove:m,has:r=>e.has(r)||t.has(r),define:g,paths:x,snapshot:S,onPatch:e=>(n.add(e),()=>n.delete(e)),get $(){return b("")}}},V=e=>1===e.nodeType,H=e=>e.querySelectorAll?[...V(e)?[e]:[],...e.querySelectorAll("*")]:[],W=(e,t)=>{for(let r of e)if(t.startsWith(r))return t.slice(r.length)},D=e=>{let r=[].concat(e.prefix??"data-"),l=[].concat(e.eventPrefix??"sigmx-"),n=e.store??z(),{expressions:a}=e,o=e.onError??((e,t)=>console.error(e,t)),s=Object.create(null),c={prefixes:r,attr:e=>r[0]+e,store:n,compiler:e.compile??h,emit:(e,t)=>document.dispatchEvent(new CustomEvent(`sigmx-${e}`,{detail:t})),call:(e,t,r)=>{let l=c.actions[e];if(!l)throw t.error(`unknown action @${e}`);return l.call(t,...r)},eventPrefixes:l,handle:(e,t)=>{let r=c.handlers[W(l,e)??e];return r?.handle(c,t),!!r},attributes:s,actions:Object.create(null),handlers:Object.create(null)},u=new Map,d=new Set,f=r.map(e=>`[${e}ignore]`).join(),p=e=>!!e.closest(f),m=!1,g=e=>{for(let t of e){let e=u.get(t);if(e&&u.delete(t))for(let t of e.values())t()}},v=(e,t)=>{let r=u.get(e);r?.get(t)?.(),r?.delete(t)},y=(e,l,d,f,h)=>{let{plugin:p,key:m,mods:g}=(e=>{let[t,...r]=e.split("__"),[,l,n]=/^([^:]*)(?::(.*))?$/.exec(t);return{plugin:l,key:n,mods:new Map(r.map(e=>{let[t,...r]=e.split(".");return[t,r]}))}})(d),y=s[p];if(!y||h&&!h.has(p))return;v(e,l);let w,x=[],S=e=>(x.push(e),()=>{let t=x.indexOf(e);t>=0&&x.splice(t,1)}),$={plugin:p,el:e,attr:l},A=(e,t)=>Object.assign(new Error(`${r[0]}${p}: ${e}`),{info:{...$,...t}}),k=e=>o(e,$),E=new WeakSet,M=e=>{e instanceof Promise&&!E.has(e)&&(E.add(e),e.catch(k))},T={el:e,plugin:p,attr:l,key:m,value:f,mods:g,cased:(e="camel")=>((e,t)=>{let r=i[t];if(!r)throw new Error(`unknown case "${t}"`);return e.split(".").map(e=>{let t=/^_+/.exec(e)?.[0]??"";return t+r(e.slice(t.length))}).join(".")})(m??"",g.get("case")?.[0]||e),evaluate:(t,...r)=>{if(y.literal&&!g.has("dynamic"))return f;w??=a(f,["el","evt",...y.args??[]]);let l={el:e,evt:t,store:n,runtime:c,error:A,cleanup:S,report:k},i=new Proxy({},{get:(e,t)=>(...e)=>{let r=c.call(t,l,e);return M(r),r}}),o=w(n,i,e,t,...r);return M(o),o},effect:e=>{S(((e,r)=>{let l=t;t=void 0;try{return((e,r)=>{let l=new L(e,r);t?.d.add(l);try{l.y(),b||j()}catch(e){throw l.m(),e}return()=>l.m()})(e,r)}finally{t=l}})(e,k))},listen:(e,t,r,l)=>{let n=e=>{try{r(e)}catch(e){k(e)}};e.addEventListener(t,n,l),S(()=>e.removeEventListener(t,n,l))},cleanup:S,error:A,report:k,store:n,runtime:c},O=u.get(e);O||(O=new Map,u.set(e,O)),O.set(l,()=>{for(let e of x.splice(0))e()});try{for(let[e,t]of[["key",m],["value",f]]){let r=y[e];if(r&&"required"===r==!t)throw A(`${"required"===r?"needs a":"takes no"} ${e}`)}let e=y.mount(T);"function"==typeof e?S(e):M(e)}catch(e){k(e)}},w=(e,t)=>{for(let l of e)if(!p(l))for(let{name:e,value:n}of[...l.attributes]){let a=W(r,e);a&&!u.get(l)?.has(e)&&y(l,e,a,n,t)}},x=new MutationObserver(e=>{for(let{type:t,target:l,attributeName:n,addedNodes:a,removedNodes:i}of e)if("childList"===t){for(let e of i)e.isConnected||g(H(e));for(let e of a)w(H(e))}else if(n&&V(l)&&!p(l)){let e=W(r,n);if(!e)continue;let t=l.getAttribute(n);null===t?v(l,n):y(l,n,e,t)}}),S=(e=document.documentElement,t=!0,r)=>{m||(w(H(e),r),t&&!d.has(e)&&(x.observe(e,{subtree:!0,childList:!0,attributes:!0}),d.add(e)))},$=(...e)=>{let t=new Set;for(let r of e)c[`${r.type}s`][r.name]=r,"attribute"===r.type&&t.add(r.name);if(t.size)for(let e of d)S(e,!1,t)},A=n.onPatch(e=>c.emit("signal-patch",e));$(...e.plugins??[]);let k={runtime:c,store:n,get $(){return n.$},apply:(e,t)=>S(e,t),use:$,destroy:()=>{m=!0,x.disconnect(),A(),g([...u.keys()]),d.clear()}};return(e.autoStart??!0)&&("loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>k.apply(),{once:!0}):k.apply()),k},F=(e,t,r)=>e&t?"required":e&r?"forbidden":void 0,_=(e,t,r,l)=>({type:"attribute",name:e,key:F(t,1,2),value:F(t,4,8),literal:!!(32&t),args:l,mount:r}),U=(e,t)=>({type:"action",name:e,call:t}),B=(e,t)=>({type:"handler",name:e,handle:t}),J=(e,t,r)=>{!1===r||null==r?e.removeAttribute(t):e.setAttribute(t,!0===r?"":String(r))},Z=_("attr",4,({el:e,key:t,cased:r,evaluate:l,effect:n})=>{n(()=>{if(t)return J(e,r("kebab"),l());let n=l();for(let t in n)J(e,t,n[t])})}),K=_("boost",10,({el:e,store:t,runtime:r,listen:l,error:n,cleanup:a,report:i})=>{let o={el:e,store:t,runtime:r,error:n,cleanup:a,report:i},s=location.pathname+location.search,c=(t,l,n,a)=>{n.preventDefault();let c=r.call(l,{...o,el:a??e,evt:n},[t.href,{contentType:a&&"form"}]);Promise.resolve(c).then(e=>{let r=new URL(e&&(e.redirected||a&&"get"===l)?e.url:t.href);s=r.pathname+r.search,history.pushState(null,"",r.href);let n=r.hash&&document.querySelector(r.hash);n?n.scrollIntoView():scrollTo(0,0)},i)};l(e,"click",e=>{let t=e.target.closest("a[href]");t&&!(e.defaultPrevented||e.button||e.metaKey||e.ctrlKey||e.shiftKey||t.target)&&!t.hasAttribute("download")&&t.origin===location.origin&&(!t.hash||t.pathname!==location.pathname||t.search!==location.search)&&c(new URL(t.href),"get",e)}),l(e,"submit",e=>{let t=e.target,r=r=>e.submitter?.getAttribute(`form${r}`)??t.getAttribute(r),l=(r("method")??"get").toLowerCase(),n=new URL(r("action")||location.href,location.href);!e.defaultPrevented&&!t.target&&"dialog"!==l&&n.origin===location.origin&&c(n,"post"===l?"post":"get",e,t)}),l(window,"popstate",()=>{let e=location.pathname+location.search;e!==s&&(s=e,Promise.resolve(r.call("get",o,[location.href,{}])).then(void 0,i))})}),G=_("indicator",0,({el:e,key:t,value:r,cased:l,store:n,listen:a})=>{let i=t?l():r.trim(),o=new Set;return n.set(i,!1),a(document,"sigmx-fetch",t=>{let{el:r,type:l,rid:a}=t.detail;if("started"===l&&e.contains(r))o.add(a);else{if("finished"!==l)return;o.delete(a)}n.set(i,o.size>0)}),()=>n.set(i,!1)}),Q=_("class",4,({el:e,key:t,cased:r,evaluate:l,effect:n})=>{let a=new Set;return n(()=>{let n=t?{[r("kebab")]:l()}:l(),i=new Set;for(let t in n)for(let r of t.split(/\s+/).filter(Boolean))i.add(r),n[t]?(e.classList.contains(r)||a.add(r),e.classList.add(r)):a.delete(r)&&e.classList.remove(r);for(let t of a)!i.has(t)&&a.delete(t)&&e.classList.remove(t)}),()=>e.classList.remove(...a)}),X=_("cloak",10,({el:e,attr:t})=>e.removeAttribute(t)),Y=_("collapse",6,({el:e,mods:t,evaluate:r,effect:l,cleanup:n})=>{let a,i,o=e.style,s=u(t.get("duration"),250),c=matchMedia("(prefers-reduced-motion: reduce)").matches,d=[o.height,o.overflow,o.transition],f=!0,h=e=>{o.transition="",o.overflow=e?"":"hidden",o.height=e?"":"0px"};l(()=>{let t=!!r();if(t===i)return;if(i=t,clearTimeout(a),f||c)return f=!1,h(t);let l=`${e.getBoundingClientRect().height}px`;o.overflow="hidden",o.height=t?"0px":l,e.getBoundingClientRect(),o.transition=`height ${s}ms ease`,o.height=t?`${e.scrollHeight}px`:"0px",a=setTimeout(()=>h(t),s+20)}),n(()=>{clearTimeout(a),[o.height,o.overflow,o.transition]=d})}),ee=_("signals",4,({key:e,cased:t,evaluate:r,store:l,mods:n})=>{let a=r();l.merge(e?c({},t(),a):a,{ifMissing:n.has("ifmissing")})}),te=_("computed",5,({cased:e,evaluate:t,store:r})=>{let l=e();return r.define(l,new T(()=>t())),()=>r.remove(l)}),re=_("ref",0,({el:e,key:t,value:r,cased:l,store:n})=>{let a=t?l():r.trim();return n.set(a,e),()=>{P(()=>n.get(a))===e&&n.remove(a)}}),le=_("on",21,({el:e,mods:t,cased:r,evaluate:l,listen:n,cleanup:a})=>{let i=r("kebab"),o=t.has("outside"),s=t.has("window")?window:t.has("document")||o||i.startsWith("sigmx-")?document:e,c=f(e=>l(e),t,a);n(s,i,r=>{o&&e.contains(r.target)||((t.has("prevent")||"submit"===i&&e instanceof HTMLFormElement)&&r.preventDefault(),t.has("stop")&&r.stopPropagation(),c(r))},{once:t.has("once")})}),ne=_("on-raf",22,({mods:e,evaluate:t,cleanup:r})=>{let l=f(()=>t(),e,r),n=requestAnimationFrame(function e(){l(),n=requestAnimationFrame(e)});return()=>cancelAnimationFrame(n)}),ae=_("html",6,({el:e,evaluate:t,effect:r})=>r(()=>{e.innerHTML=String(t()??"")})),ie=_("style",4,({el:e,key:t,cased:r,evaluate:l,effect:a})=>{let i=new Map,o=(t,r)=>{i.has(t)||i.set(t,e.style.getPropertyValue(t)),r||0===r?e.style.setProperty(t,String(r)):e.style.setProperty(t,i.get(t)??"")};return a(()=>{let e=t?{[r("kebab")]:l()}:l();for(let t of i.keys())t in e||o(t,"");for(let t in e)o(t.startsWith("--")?t:n(t),e[t])}),()=>{for(let[t,r]of i)e.style.setProperty(t,r)}}),oe={9:/\d/,a:/[a-zA-Z]/,"*":/[a-zA-Z0-9]/},se=_("mask",38,({el:e,evaluate:t,listen:r,effect:l})=>{let n=e,a="",i=()=>{let e=((e,t)=>{let r="",l=0;for(let n of e){if(l>=t.length)break;let e=oe[n];if(e){for(;l<t.length&&!e.test(t[l]);)l++;if(l>=t.length)break;r+=t[l++]}else r+=n,t[l]===n&&l++}return r})(a,n.value);if(e!==n.value){let t=n.selectionStart,r=null===t||t>=n.value.length;n.value=e,r||n.setSelectionRange(t,t),n.dispatchEvent(new Event("input",{bubbles:!0}))}};r(n,"input",i),l(()=>{a=String(t()??""),i()})}),ce=_("match-media",37,({cased:e,evaluate:t,store:r,effect:l,cleanup:n})=>{let a,i=e(),o=()=>r.set(i,!!a?.matches),s=()=>a?.removeEventListener("change",o);l(()=>{let e=String(t()).trim();/^[\w-]+\s*:/.test(e)&&(e=`(${e})`),s(),a=window.matchMedia(e),o(),a.addEventListener("change",o)}),n(s)}),ue=_("init",22,({mods:e,evaluate:t,cleanup:r})=>{f(()=>t(),e,r)()}),de=_("on-signal-patch",20,({key:e,cased:t,mods:r,evaluate:l,listen:n,cleanup:a})=>{let i=e?t():"",o=!1,s=f(e=>{if(!o){o=!0;try{l(void 0,e)}finally{o=!1}}},r,a);n(document,"sigmx-signal-patch",e=>{(!i||((e,t)=>{let r=e;for(let e of t.split(".")){if(null===r)return!0;if("object"!=typeof r||!(e in r))return!1;r=r[e]}return!0})(e.detail,i))&&s(e.detail)})},["patch"]),fe=_("remove-me",34,({el:e,evaluate:t,value:r,cleanup:l,error:n})=>{let a=r?String(t()):"";if(a&&u([a],-1)<0)throw n(`bad delay "${a}"`);let i=setTimeout(()=>e.remove(),u([a],0));l(()=>clearTimeout(i))}),he=(e,t,r)=>[...e.keys()].find(e=>t.test(e))??r,pe=_("scroll-into-view",10,({el:e,mods:t})=>{e.scrollIntoView({behavior:he(t,/^(smooth|instant|auto)$/,"smooth"),block:he(t,/^v(start|center|end|nearest)$/,"vcenter").slice(1)}),t.has("focus")&&e.focus?.()}),me=_("on-resize",22,({el:e,mods:t,evaluate:r,cleanup:l})=>{let n=f(()=>r(),t,l),a=new ResizeObserver(()=>n());return a.observe(e),()=>a.disconnect()}),ge=_("json-signals",2,({el:e,value:t,evaluate:r,effect:l,store:n})=>{let a=t?r():void 0;l(()=>{e.textContent=JSON.stringify(n.snapshot(a),null,2)})}),ve=_("persist",0,({key:e,value:t,evaluate:r,store:l,effect:n})=>{let a=e||"sigmx",i=t?r():void 0;try{let e=localStorage.getItem(a);e&&l.merge(JSON.parse(e))}catch{}n(()=>{try{localStorage.setItem(a,JSON.stringify(l.snapshot(i,{computed:!1})))}catch{}})}),ye=_("teleport",38,({el:e,evaluate:t,error:r})=>{let l=String(t()),n=document.querySelector(l);if(!n)throw r(`no element matches "${l}"`);if(e.parentElement===n)return;let a=n;(a.moveBefore??a.insertBefore).call(a,e,null)}),we=_("text",6,({el:e,evaluate:t,effect:r})=>r(()=>{e.textContent=String(t()??"")})),be=_("on-interval",22,({mods:e,evaluate:t})=>{let r=e.get("duration"),l=setInterval(()=>t(),u(r,1e3));return()=>clearInterval(l)}),xe=_("transition",6,({el:e,mods:t,evaluate:r,effect:l,cleanup:n})=>{let a,i,o=e.style,s=matchMedia("(prefers-reduced-motion: reduce)").matches?0:u(t.get("duration"),200),c={opacity:0},d={opacity:1},f=o.display,h="none"===f?"":f,p=!0;l(()=>{let t=!!r();if(t!==i){if(i=t,a?.cancel(),p||!e.animate)return p=!1,void(o.display=t?h:"none");t&&(o.display=h),a=e.animate(t?[c,d]:[d,c],{duration:s,easing:"ease-out",fill:"forwards"}),a.onfinish=()=>{a?.cancel(),t||(o.display="none")}}}),n(()=>{a?.cancel(),o.display=f})}),Se=e=>{let t=/^\s*(-?\d*\.?\d+)([a-z%]*)\s*$/i.exec(e);return t?[+t[1],t[2]]:void 0},$e=_("animate",5,({el:e,mods:t,cased:r,evaluate:l,effect:n,cleanup:a})=>{let i,o=r("kebab"),s=u(t.get("duration"),300),c=matchMedia("(prefers-reduced-motion: reduce)").matches,d=t=>e.style.setProperty(o,t),f=0,h=!0;n(()=>{let t=String(l());if(t===i)return;i=t,cancelAnimationFrame(f);let r=Se(e.style.getPropertyValue(o)||getComputedStyle(e).getPropertyValue(o)),n=Se(t);if(h||c||s<=0||!r||!n||r[1]!==n[1])return h=!1,d(t);let[a,u]=r,p=n[0],m=performance.now(),g=e=>{let t=Math.min(1,(e-m)/s);d(`${a+(p-a)*(1-(1-t)**2)}${u}`),t<1&&(f=requestAnimationFrame(g))};f=requestAnimationFrame(g)}),a(()=>cancelAnimationFrame(f))}),Ae=e=>String(e??""),ke=_("bind",0,({el:e,key:t,value:r,cased:l,mods:n,store:a,listen:i,effect:o})=>{let s,c=t?l():r.trim(),u=()=>a.get(c),d=e=>"number"==typeof u()?+e:e,f=e,h=e instanceof HTMLInputElement?f.type:"",p=(e,...t)=>({n:e,r:e=>{Ae(e)!==f.value&&!f.validity?.badInput&&(f.value=Ae(e))},s:t});if("checkbox"===h){let t=e.hasAttribute("value")&&"on"!==f.value;s={n:()=>{let e=u();if(Array.isArray(e)){let t=new Set(e);return f.checked?t.add(f.value):t.delete(f.value),[...t]}return t?f.checked?f.value:"":f.checked},r:e=>{f.checked=Array.isArray(e)?e.includes(f.value):t?e===f.value:!!e},s:["input"]}}else if("radio"===h)f.name||=c,s={n:()=>f.checked?d(f.value):u(),r:e=>f.checked=String(e)===f.value,s:["input"]};else{if("file"===h)return void i(e,"change",()=>(e=>Promise.all([...e.files??[]].map(e=>new Promise(t=>{let r=new FileReader;r.onloadend=()=>t({name:e.name,type:e.type,size:e.size,contents:String(r.result).split(",")[1]??""}),r.readAsDataURL(e)}))))(f).then(e=>a.set(c,e)));if(h){let e="number"===h||"range"===h;s=p(()=>e&&""!==f.value?+f.value:f.value,"input")}else s=e instanceof HTMLSelectElement?{n:()=>e.multiple?[...e.selectedOptions].map(e=>d(e.value)):d(e.value),r:t=>{if(e.multiple)for(let r of e.options)r.selected=Array.isArray(t)&&t.map(String).includes(r.value);else e.value=Ae(t)},s:["change"]}:"value"in e?p(()=>f.value,"input","change"):{n:()=>e.getAttribute("value"),r:t=>e.setAttribute("value",Ae(t)),s:["change"]}}if(!a.has(c)){let e=s.n();void 0!==e&&""!==e&&a.set(c,e)}let m=()=>a.set(c,s.n());for(let t of[...n.get("event")??s.s,"sigmx-prop-change"])i(e,t,m);o(()=>s.r(u()))}),Ee=e=>"string"==typeof e?e:JSON.stringify(e),Me=()=>new URLSearchParams(location.search),Te=_("query-string",1,({key:e,value:t,mods:r,evaluate:l,cased:n,store:a,listen:i,effect:o})=>{let s=r.has("history"),c=!1;{let r=e,u=n(),d=t?l():"",f=e=>{let t=e.get(r);a.set(u,null===t?d:"string"==typeof d?t:(e=>{try{return JSON.parse(e)}catch{return e}})(t))};(!a.has(u)||Me().has(r))&&f(Me()),((e,t)=>{o(()=>{let e=Me();if(t(e),c)return;let r=String(e),l=`${location.pathname}${r?`?${r}`:""}${location.hash}`;l!==location.pathname+location.search+location.hash&&window.history[s?"pushState":"replaceState"](null,"",l)}),s&&i(window,"popstate",()=>{c=!0;try{e(Me())}finally{c=!1}})})(f,e=>{let t=a.get(u);void 0===t||((e,t)=>Ee(e)===Ee(t))(t,d)?e.delete(r):e.set(r,Ee(t))})}}),Le=_("replace-url",6,({evaluate:e,effect:t})=>t(()=>history.replaceState(history.state,"",new URL(String(e()),location.href)))),Oe=_("custom-validity",6,({el:e,evaluate:t,effect:r,error:l})=>{if(!("setCustomValidity"in e))throw l("only works on form fields");let n=e;return r(()=>n.setCustomValidity(String(t()??""))),()=>n.setCustomValidity("")}),Pe=_("on-intersect",22,({el:e,mods:t,evaluate:r,cleanup:l})=>{let n=+(t.get("threshold")?.join(".")??0),a=Number.isFinite(n)?Math.min(100,Math.max(0,n))/100:0,i=f(()=>r(),t,l),o=new IntersectionObserver(e=>{for(let r of e)r.isIntersecting!==t.has("exit")&&(i(),t.has("once")&&o.disconnect())},{threshold:a});return o.observe(e),()=>o.disconnect()}),je=_("show",6,({el:e,evaluate:t,effect:r})=>{let l="none"===e.style.display?"":e.style.display;return r(()=>{e.style.display=t()?l:"none"}),()=>{e.style.display=l}}),Ne=_("effect",22,e=>e.effect(()=>e.evaluate())),Ce=U("setAll",({store:e},t,r)=>O(()=>P(()=>{for(let l of e.paths(r,{computed:!1}))e.set(l,t)}))),Ie=U("toggleAll",({store:e},t)=>O(()=>P(()=>{for(let r of e.paths(t,{computed:!1}))e.set(r,!e.get(r))}))),qe=U("confirm",(e,t)=>window.confirm(t)),Re=U("clipboard",(e,t,r=!1)=>navigator.clipboard.writeText(r?(new TextDecoder).decode(Uint8Array.from(atob(t),e=>e.charCodeAt(0))):t)),ze=U("dispatch",({el:e},t,r)=>e.dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0,composed:!0}))),Ve=U("intl",({error:e},t,r,l,n)=>{let a=Intl[t];if(!a)throw e(`unknown @intl type "${t}"`);let i=new a(n,l);return(i.select??i.of??i.format).call(i,..."RelativeTimeFormat"===t?r:[r])??""}),He=U("fit",(e,t,r,l,n,a,i=!1,o=!1)=>{let s=l===r?0:(t-r)/(l-r);i&&(s=Math.min(1,Math.max(0,s)));let c=n+s*(a-n);return o?Math.round(c):c}),We=(e,t={})=>{let r="",l=[];for(let n of e.split(/\r?\n/)){let e=n.indexOf(":");if(!e)continue;let a=e<0?n:n.slice(0,e),i=(e<0?"":n.slice(e+1)).replace(/^ /,"");"event"===a?r=i:"data"===a?l.push(i):"id"===a?t.id=i:"retry"===a&&/^\d+$/.test(i)&&(t.retry=+i)}if(l.length)return{event:r||"message",data:l.join("\n"),id:t.id,retry:t.retry}},De=async(e,t)=>{let r=e.getReader(),l=new TextDecoder,n={},a="",i=0,o=e=>{let r=We(e,n);r&&t(r)};for(;;){let{value:e,done:t}=await r.read();a+=l.decode(e,{stream:!t});let n=/\r?\n\r?\n/g;n.lastIndex=i;for(let e=n.exec(a);e;e=n.exec(a))o(a.slice(0,e.index)),a=a.slice(e.index+e[0].length),n.lastIndex=0;if(i=Math.max(0,a.length-3),t){o(a);break}}},Fe=e=>{let t={};for(let r of e.split("\n")){let e=r.indexOf(" "),l=e<0?r:r.slice(0,e),n=e<0?"":r.slice(e+1);t[l]=l in t?`${t[l]}\n${n}`:n}return t},_e=new Map,Ue=0,Be=(e,t,r)=>{for(let l of t){let t=e.headers.get(`sigmx-${l}`);t&&(r[a(l)]=t)}return r},Je=(e,t)=>U(e,(e,r,l)=>(async(e,t,r,l={})=>{let{el:n,evt:a,store:i,runtime:o,error:s}=t;if(!r)throw s(`@${e.toLowerCase()} needs a URL`);let c=new URL(r,location.href),u=`${e} ${c.href}`,d="GET"!==e&&"DELETE"!==e,f=new Headers({Accept:"text/event-stream, text/html, application/json","Sigmx-Request":"true"});for(let[e,t]of new Headers(l.headers))f.set(e,t);let h,p=e=>{d&&!f.has("Content-Type")&&f.set("Content-Type",e)};if("json"===(l.contentType??"json")){let e=JSON.stringify(l.payload??P(()=>i.snapshot(l.filter??{exclude:/(^|\.)_/})));d?(h=e,p("application/json")):c.searchParams.set("sigmx",e)}else{let e=l.selector?document.querySelector(l.selector):n.closest("form");if(!e)throw s("no form found",{selector:l.selector});if(!e.noValidate&&!e.checkValidity())return void e.reportValidity();let t=a instanceof SubmitEvent?a.submitter:n instanceof HTMLButtonElement&&n.form===e&&"submit"===n.type?n:null,r=new FormData(e,t),i=new URLSearchParams(r);if(d)"multipart/form-data"===e.enctype?h=r:(h=i,p("application/x-www-form-urlencoded"));else for(let[e,t]of i)c.searchParams.append(e,t)}let m=new AbortController;"none"!==l.abort&&(_e.get(u)?.abort(),_e.set(u,m));let g,v,y,w=t.cleanup(()=>m.abort()),b=++Ue,x=(t,l)=>o.emit("fetch",{el:n,type:t,method:e,url:r,rid:b,...l}),S={attempts:5,interval:1e3,factor:2,max:3e4,...l.retry},$=0,A=S.interval,k=e=>{try{e()}catch(e){throw y=e,e}},E=async()=>{if($++>=S.attempts)throw new Error("retries exhausted");await((e,t)=>new Promise(r=>{if(t.aborted)return r();let l=setTimeout(r,e);t.addEventListener("abort",()=>{clearTimeout(l),r()},{once:!0})}))(A,m.signal),A=Math.min(A*S.factor,S.max)};x("started");try{for(;!m.signal.aborted;){g&&f.set("Last-Event-ID",g);try{let t=await fetch(c.href,{method:e,headers:f,body:h,signal:m.signal});v={url:t.url,status:t.status,redirected:t.redirected};let r=t.headers.get("content-type")??"";if(!t.ok){if(x("error",{status:t.status}),!S.onStatusError)return v;await E();continue}if(!t.body)return v;if(r.includes("text/event-stream")){if($=0,A=S.interval,await De(t.body,e=>{void 0!==e.id&&(g=e.id),e.retry&&(A=S.interval=e.retry);let t=Fe(e.data);k(()=>{o.emit("server-event",{el:n,event:e.event,data:t}),o.handle(e.event,t)})}),!l.reconnect)return v;await E();continue}let a=await t.text();return k(()=>{r.includes("text/html")?o.handle("patch-elements",Be(t,["selector","mode"],{elements:a})):r.includes("application/json")&&o.handle("patch-signals",Be(t,["only-if-missing"],{signals:a}))}),v}catch(e){if(m.signal.aborted)return v;if(y)throw e;await E()}}return v}catch(t){throw x("error",{message:t?.message}),s(`${e} ${r}: ${t?.message??t}`)}finally{m.abort(),w(),x("finished",v),_e.get(u)===m&&_e.delete(u)}})(t,e,r,l)),Ze=Je("get","GET"),Ke=Je("post","POST"),Ge=Je("put","PUT"),Qe=Je("patch","PATCH"),Xe=Je("delete","DELETE"),Ye=U("peek",(e,t)=>"function"==typeof t?P(t):t),et=U("ws",({el:e,runtime:t,cleanup:r},l,n={})=>{let a=new WebSocket(new URL(l,location.href.replace(/^http/,"ws")),n.protocols);return a.onmessage=r=>{if("string"==typeof r.data)for(let l of r.data.split(/(?:\r?\n){2,}/)){let r=We(l);if(!r)continue;let n=Fe(r.data);t.emit("server-event",{el:e,event:r.event,data:n}),t.handle(r.event,n)}},r(()=>a.close()),{send:e=>a.send("string"==typeof e?e:JSON.stringify(e)),close:()=>a.close(),socket:a}}),tt=new WeakSet,rt=e=>1===e?.nodeType,lt=e=>{if(rt(e))for(let t of[e,...e.querySelectorAll("script")]){if(!t.matches("script")||tt.has(t))continue;let e=document.createElement("script");for(let{name:r,value:l}of t.attributes)e.setAttribute(r,l);e.text=t.text,tt.add(e),t.replaceWith(e)}},nt=(e,t)=>{let r=document.importNode(e,!0);t(r),lt(r)},at=e=>[e,...e.querySelectorAll?.("[id]")??[]].filter(e=>rt(e)&&e.id),it=(e,t)=>at(e).some(e=>t.keep.has(e.id)),ot=(e,t,r)=>{try{e.moveBefore(t,r)}catch{e.insertBefore(t,r)}},st=(e,t)=>!(e.nodeName!==t.nodeName||rt(e)&&e.id&&e.id!==t.id),ct=(e,t,r)=>{e.nodeName===t.nodeName?rt(e)&&rt(t)?"script"!==t.localName||e.isEqualNode(t)?e.hasAttribute(r.ignore)&&t.hasAttribute(r.ignore)||(((e,t,r)=>{let l=new Set((t.getAttribute(r.preserve)??e.getAttribute(r.preserve)??"").split(/\s+/)),n=r=>!l.has(r)&&e.getAttribute(r)!==t.getAttribute(r),a=!1,i=e instanceof HTMLInputElement&&"file"!==e.type?["value","checked"]:e instanceof HTMLOptionElement?["selected"]:[];for(let r of i)n(r)&&(e[r]="value"===r?t.getAttribute(r)??"":t.hasAttribute(r),a=!0);e instanceof HTMLTextAreaElement&&!l.has("value")&&e.defaultValue!==t.defaultValue&&(e.value=t.defaultValue,a=!0);for(let{name:r,value:n}of t.attributes)!l.has(r)&&e.getAttribute(r)!==n&&e.setAttribute(r,n);for(let{name:r}of[...e.attributes])!l.has(r)&&!t.hasAttribute(r)&&e.removeAttribute(r);a&&(e instanceof HTMLOptionElement?e.closest("select"):e)?.dispatchEvent(new Event("sigmx-prop-change",{bubbles:!0}))})(e,t,r),e instanceof HTMLTemplateElement?e.innerHTML=t.innerHTML:e.isEqualNode(t)||ut(e,t,r)):nt(t,t=>e.replaceWith(t)):e.nodeValue!==t.nodeValue&&(e.nodeValue=t.nodeValue):nt(t,t=>e.replaceWith(t))},ut=(e,t,r)=>{let l=e.firstChild,n=e=>{for(;l&&l!==e;){let e=l;l=l.nextSibling,rt(e)&&r.keep.get(e.id)===e||e.remove()}return l===e};for(let a of[...t.childNodes]){let t=rt(a)&&r.keep.get(a.id);if(t){let i=l;for(;i&&i!==t;)i=i.nextSibling;i?(n(t),l=t.nextSibling):ot(e,t,l),ct(t,a,r);continue}let i=l;for(;i&&!st(i,a);)i=i.nextSibling;if(i)n(i),l=i.nextSibling,ct(i,a,r);else if(rt(a)&&it(a,r)){let t=document.importNode(a,!1);e.insertBefore(t,l),ct(t,a,r)}else nt(a,t=>e.insertBefore(t,l))}n(null)},dt=(e,t,r)=>{let l=new Map(at(t).map(e=>[e.id,e.tagName]));return{keep:new Map(at(e).flatMap(e=>l.get(e.id)===e.tagName?[[e.id,e]]:[])),ignore:r.ignoreAttr??"data-ignore-morph",preserve:r.preserveAttr??"data-preserve-attr"}},ft=(e,t,r={})=>{ct(e,t,dt(e,t,r))},ht=((e={})=>D({...e,expressions:e.expressions??w(e.compile??h)}))({plugins:[Z,ke,Q,te,Oe,Ne,G,ue,ge,ce,le,Pe,be,ne,me,de,ve,Te,re,Le,pe,je,ee,ie,we,Re,He,Ve,Ye,Ce,Ie,$e,Xe,Ze,Qe,Ke,Ge,B("patch-elements",(e,{elements:t="",selector:r="",mode:l="outer"})=>{let n={ignoreAttr:e.attr("ignore-morph"),preserveAttr:e.attr("preserve-attr")},a=(e=>{if(/^\s*<(!doctype|html)[\s>]|<\/(html|head|body)>/i.test(e))return(new DOMParser).parseFromString(e,"text/html");let t=document.createElement("template");return t.innerHTML=e,t.content})(t);if(a instanceof Document){for(let{name:e,value:t}of a.documentElement.attributes)document.documentElement.setAttribute(e,t);return a.head.childNodes.length&&((e,t)=>{let r=[...t.children];for(let t of[...e.children]){let e=r.findIndex(e=>e.isEqualNode(t));e<0?t.remove():r.splice(e,1)}for(let t of r){let r=document.importNode(t,!0);e.append(r),lt(r)}})(document.head,a.head),void ft(document.body,a.body,n)}let i=(e,t)=>{let r=[...t.childNodes];if("outer"===l&&1===r.length&&1===r[0].nodeType)ft(e,r[0],n);else if("inner"===l)((e,t,r={})=>{ut(e,t,dt(e,t,r))})(e,t,n);else{"outer"===l||"replace"===l?e.replaceWith(t):e[l](t);for(let e of r)lt(e)}};if(r){let e=[...document.querySelectorAll(r)];if("remove"===l)for(let t of e)t.remove();else e.forEach((t,r)=>{i(t,r+1<e.length?a.cloneNode(!0):a)})}else{if("outer"!==l&&"replace"!==l)throw new Error(`mode "${l}" needs a selector`);for(let e of[...a.children]){let t=e.id&&document.getElementById(e.id);if(t){let r=document.createDocumentFragment();r.append(e),i(t,r)}}}}),B("patch-signals",(e,{signals:t,onlyIfMissing:r})=>{if(!t)return;let l;try{l=JSON.parse(t)}catch{l=e.compiler([],`return (${t})`)()}e.store.merge(l,{ifMissing:"true"===r})}),K,X,Y,ae,se,fe,ye,xe,qe,ze,et]});globalThis.sigmx=ht;export{ht as sigmx};
package/dist/vite.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { readdirSync, readFileSync, statSync } from "node:fs";
2
2
  import { isAbsolute, join, relative } from "node:path";
3
- import { extractExpressions, generateTable } from "./kernel/precompile.js";
3
+ import { extractExpressions, generateTable, lintSource } from "./kernel/precompile.js";
4
4
  import {
5
5
  builtinPlugins,
6
6
  customPluginMeta,
@@ -24,24 +24,31 @@ const DEFAULT_EXTENSIONS = [
24
24
  ".hbs"
25
25
  ];
26
26
  const walk = (dir, exts, out = []) => {
27
+ const self = statSync(dir, { throwIfNoEntry: false });
28
+ if (self?.isFile()) {
29
+ if (exts.some((x) => dir.endsWith(x))) out.push(dir);
30
+ return out;
31
+ }
27
32
  let entries = [];
28
33
  try {
29
- entries = readdirSync(dir);
34
+ entries = readdirSync(dir, { withFileTypes: true });
30
35
  } catch {
31
36
  return out;
32
37
  }
33
38
  for (const e of entries) {
34
- if (e === "node_modules" || e.startsWith(".")) continue;
35
- const p = join(dir, e);
36
- if (statSync(p).isDirectory()) walk(p, exts, out);
37
- else if (exts.some((x) => p.endsWith(x))) out.push(p);
39
+ if (e.name === "node_modules" || e.name.startsWith(".")) continue;
40
+ const p = join(dir, e.name);
41
+ if (e.isDirectory()) walk(p, exts, out);
42
+ else if (e.isFile() && exts.some((x) => p.endsWith(x))) out.push(p);
38
43
  }
39
44
  return out;
40
45
  };
41
46
  const files = (o) => {
42
47
  const root = o.root ?? process.cwd();
43
48
  const exts = o.extensions ?? DEFAULT_EXTENSIONS;
44
- return (o.include ?? ["src"]).flatMap((d) => walk(join(root, d), exts));
49
+ const found = (o.include ?? ["src", "index.html"]).flatMap((d) => walk(join(root, d), exts));
50
+ if (!found.length) console.warn("[sigmx] no source files found to scan; check the `include` option");
51
+ return found;
45
52
  };
46
53
  const customMeta = (root, custom = {}) => Object.entries(custom).flatMap(([exp, path]) => {
47
54
  const abs = isAbsolute(path) ? path : join(root, path);
@@ -56,6 +63,9 @@ const scanProject = (o = {}) => {
56
63
  const root = o.root ?? process.cwd();
57
64
  const list = files(o);
58
65
  const sources = list.map((f) => readFileSync(f, "utf8"));
66
+ list.forEach((f, i) => {
67
+ for (const w of lintSource(sources[i], o.prefixes)) console.warn(`[sigmx] ${relative(root, f)}: ${w}`);
68
+ });
59
69
  const sel = selectPlugins(sources, { prefixes: o.prefixes, always: o.always, custom: customMeta(root, o.custom) });
60
70
  return { ...sel, files: list };
61
71
  };
package/dist/vite.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/vite.ts"],
4
- "sourcesContent": ["import { readdirSync, readFileSync, statSync } from 'node:fs';\nimport { isAbsolute, join, relative } from 'node:path';\nimport { extractExpressions, generateTable } from './kernel/precompile.js';\nimport {\n builtinPlugins,\n customPluginMeta,\n generatePluginsModule,\n type PluginMeta,\n type Selection,\n selectPlugins,\n} from './kernel/scan.js';\n\nexport type ScanOptions = {\n /** Project root; defaults to the current working directory. */\n root?: string;\n /** Directories to scan, relative to root. Default `['src']`. */\n include?: string[];\n extensions?: string[];\n /** Attribute prefixes in use. Default `['data-']`. */\n prefixes?: string[];\n};\nexport type AutoOptions = ScanOptions & {\n /** Export names that ship no matter what, e.g. `['signals', 'httpGet']`. */\n always?: string[];\n /** Custom plugins: export name \u2192 module path (absolute or root-relative), e.g. `{ upper: 'src/plugins/upper.ts' }`. */\n custom?: Record<string, string>;\n /** Print the selection at build time. Default true. */\n log?: boolean;\n};\nexport type PrecompileOptions = ScanOptions & {\n /** Custom plugins whose expressions should be precompiled too. */\n custom?: Record<string, string>;\n};\n\nexport const DEFAULT_EXTENSIONS = [\n '.astro',\n '.html',\n '.mdx',\n '.md',\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.svelte',\n '.vue',\n '.php',\n '.erb',\n '.twig',\n '.hbs',\n];\n\nexport const walk = (dir: string, exts: string[], out: string[] = []): string[] => {\n let entries: string[] = [];\n try {\n entries = readdirSync(dir);\n } catch {\n return out;\n }\n for (const e of entries) {\n if (e === 'node_modules' || e.startsWith('.')) continue;\n const p = join(dir, e);\n if (statSync(p).isDirectory()) walk(p, exts, out);\n else if (exts.some((x) => p.endsWith(x))) out.push(p);\n }\n return out;\n};\n\nconst files = (o: ScanOptions) => {\n const root = o.root ?? process.cwd();\n const exts = o.extensions ?? DEFAULT_EXTENSIONS;\n return (o.include ?? ['src']).flatMap((d) => walk(join(root, d), exts));\n};\n\nconst customMeta = (root: string, custom: Record<string, string> = {}): PluginMeta[] =>\n Object.entries(custom).flatMap(([exp, path]) => {\n const abs = isAbsolute(path) ? path : join(root, path);\n const meta = customPluginMeta(exp, readFileSync(abs, 'utf8'), `/${relative(root, abs).replace(/\\\\/g, '/')}`);\n if (!meta)\n console.warn(\n `[sigmx] could not read plugin metadata for \"${exp}\" in ${path}; include it via \"always\" if it must ship`,\n );\n return meta ? [meta] : [];\n });\n\n/** Scan once and pick plugins: what the Vite plugin and the CLI both do. */\nexport const scanProject = (o: AutoOptions = {}): Selection & { files: string[] } => {\n const root = o.root ?? process.cwd();\n const list = files(o);\n const sources = list.map((f) => readFileSync(f, 'utf8'));\n const sel = selectPlugins(sources, { prefixes: o.prefixes, always: o.always, custom: customMeta(root, o.custom) });\n return { ...sel, files: list };\n};\n\nexport const AUTO_ID = 'virtual:sigmx-plugins';\nexport const EXPRESSIONS_ID = 'virtual:sigmx-expressions';\n\n/** Serves `virtual:sigmx-plugins`, exporting the `plugins` array your source actually uses. */\nexport const sigmxAuto = (o: AutoOptions = {}) => ({\n name: 'sigmx-auto',\n resolveId: (id: string) => (id === AUTO_ID ? `\\0${AUTO_ID}` : undefined),\n load(this: any, id: string) {\n if (id !== `\\0${AUTO_ID}`) return;\n const sel = scanProject(o);\n for (const f of sel.files) this.addWatchFile?.(f);\n if (o.log ?? true) {\n const names = sel.plugins.map((p) => p.export);\n console.info(`[sigmx] auto: ${names.length} plugins (${names.join(', ')}); ${sel.unused.length} unused`);\n }\n return generatePluginsModule(sel);\n },\n});\n\n/** Serves `virtual:sigmx-expressions`, a table of every attribute expression compiled at build time. */\nexport const sigmxPrecompile = (o: PrecompileOptions = {}) => ({\n name: 'sigmx-precompile',\n resolveId: (id: string) => (id === EXPRESSIONS_ID ? `\\0${EXPRESSIONS_ID}` : undefined),\n load(this: any, id: string) {\n if (id !== `\\0${EXPRESSIONS_ID}`) return;\n const root = o.root ?? process.cwd();\n const meta = [...builtinPlugins(), ...customMeta(root, o.custom)].filter((p) => p.type === 'attribute');\n const items = [];\n for (const f of files(o)) {\n this.addWatchFile?.(f);\n items.push(...extractExpressions(readFileSync(f, 'utf8'), meta, o.prefixes ?? ['data-']));\n }\n return generateTable(items);\n },\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { readdirSync, readFileSync, statSync } from 'node:fs';\nimport { isAbsolute, join, relative } from 'node:path';\nimport { extractExpressions, generateTable, lintSource } from './kernel/precompile.js';\nimport {\n builtinPlugins,\n customPluginMeta,\n generatePluginsModule,\n type PluginMeta,\n type Selection,\n selectPlugins,\n} from './kernel/scan.js';\n\nexport type ScanOptions = {\n /** Project root; defaults to the current working directory. */\n root?: string;\n /** Directories to scan, relative to root. Default `['src']`. */\n include?: string[];\n extensions?: string[];\n /** Attribute prefixes in use. Default `['data-']`. */\n prefixes?: string[];\n};\nexport type AutoOptions = ScanOptions & {\n /** Export names that ship no matter what, e.g. `['signals', 'httpGet']`. */\n always?: string[];\n /** Custom plugins: export name \u2192 module path (absolute or root-relative), e.g. `{ upper: 'src/plugins/upper.ts' }`. */\n custom?: Record<string, string>;\n /** Print the selection at build time. Default true. */\n log?: boolean;\n};\nexport type PrecompileOptions = ScanOptions & {\n /** Custom plugins whose expressions should be precompiled too. */\n custom?: Record<string, string>;\n};\n\nexport const DEFAULT_EXTENSIONS = [\n '.astro',\n '.html',\n '.mdx',\n '.md',\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.svelte',\n '.vue',\n '.php',\n '.erb',\n '.twig',\n '.hbs',\n];\n\nexport const walk = (dir: string, exts: string[], out: string[] = []): string[] => {\n // `include` entries may be files (index.html) as well as directories.\n const self = statSync(dir, { throwIfNoEntry: false });\n if (self?.isFile()) {\n if (exts.some((x) => dir.endsWith(x))) out.push(dir);\n return out;\n }\n let entries: import('node:fs').Dirent[] = [];\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return out;\n }\n for (const e of entries) {\n if (e.name === 'node_modules' || e.name.startsWith('.')) continue;\n const p = join(dir, e.name);\n if (e.isDirectory()) walk(p, exts, out);\n else if (e.isFile() && exts.some((x) => p.endsWith(x))) out.push(p);\n }\n return out;\n};\n\nconst files = (o: ScanOptions) => {\n const root = o.root ?? process.cwd();\n const exts = o.extensions ?? DEFAULT_EXTENSIONS;\n const found = (o.include ?? ['src', 'index.html']).flatMap((d) => walk(join(root, d), exts));\n if (!found.length) console.warn('[sigmx] no source files found to scan; check the `include` option');\n return found;\n};\n\nconst customMeta = (root: string, custom: Record<string, string> = {}): PluginMeta[] =>\n Object.entries(custom).flatMap(([exp, path]) => {\n const abs = isAbsolute(path) ? path : join(root, path);\n const meta = customPluginMeta(exp, readFileSync(abs, 'utf8'), `/${relative(root, abs).replace(/\\\\/g, '/')}`);\n if (!meta)\n console.warn(\n `[sigmx] could not read plugin metadata for \"${exp}\" in ${path}; include it via \"always\" if it must ship`,\n );\n return meta ? [meta] : [];\n });\n\n/** Scan once and pick plugins: what the Vite plugin and the CLI both do. */\nexport const scanProject = (o: AutoOptions = {}): Selection & { files: string[] } => {\n const root = o.root ?? process.cwd();\n const list = files(o);\n const sources = list.map((f) => readFileSync(f, 'utf8'));\n list.forEach((f, i) => {\n for (const w of lintSource(sources[i], o.prefixes)) console.warn(`[sigmx] ${relative(root, f)}: ${w}`);\n });\n const sel = selectPlugins(sources, { prefixes: o.prefixes, always: o.always, custom: customMeta(root, o.custom) });\n return { ...sel, files: list };\n};\n\nexport const AUTO_ID = 'virtual:sigmx-plugins';\nexport const EXPRESSIONS_ID = 'virtual:sigmx-expressions';\n\n/** Serves `virtual:sigmx-plugins`, exporting the `plugins` array your source actually uses. */\nexport const sigmxAuto = (o: AutoOptions = {}) => ({\n name: 'sigmx-auto',\n resolveId: (id: string) => (id === AUTO_ID ? `\\0${AUTO_ID}` : undefined),\n load(this: any, id: string) {\n if (id !== `\\0${AUTO_ID}`) return;\n const sel = scanProject(o);\n for (const f of sel.files) this.addWatchFile?.(f);\n if (o.log ?? true) {\n const names = sel.plugins.map((p) => p.export);\n console.info(`[sigmx] auto: ${names.length} plugins (${names.join(', ')}); ${sel.unused.length} unused`);\n }\n return generatePluginsModule(sel);\n },\n});\n\n/** Serves `virtual:sigmx-expressions`, a table of every attribute expression compiled at build time. */\nexport const sigmxPrecompile = (o: PrecompileOptions = {}) => ({\n name: 'sigmx-precompile',\n resolveId: (id: string) => (id === EXPRESSIONS_ID ? `\\0${EXPRESSIONS_ID}` : undefined),\n load(this: any, id: string) {\n if (id !== `\\0${EXPRESSIONS_ID}`) return;\n const root = o.root ?? process.cwd();\n const meta = [...builtinPlugins(), ...customMeta(root, o.custom)].filter((p) => p.type === 'attribute');\n const items = [];\n for (const f of files(o)) {\n this.addWatchFile?.(f);\n items.push(...extractExpressions(readFileSync(f, 'utf8'), meta, o.prefixes ?? ['data-']));\n }\n return generateTable(items);\n },\n});\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }