covara 0.7.0 → 0.8.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 (204) hide show
  1. package/README.md +98 -62
  2. package/dist/cli/args.d.ts +14 -0
  3. package/dist/cli/args.d.ts.map +1 -0
  4. package/dist/cli/args.js +78 -0
  5. package/dist/cli/args.js.map +1 -0
  6. package/dist/cli/commands/data.d.ts +2 -0
  7. package/dist/cli/commands/data.d.ts.map +1 -0
  8. package/dist/cli/commands/data.js +31 -0
  9. package/dist/cli/commands/data.js.map +1 -0
  10. package/dist/cli/commands/db.d.ts +2 -0
  11. package/dist/cli/commands/db.d.ts.map +1 -0
  12. package/dist/cli/commands/db.js +100 -0
  13. package/dist/cli/commands/db.js.map +1 -0
  14. package/dist/cli/commands/dev.d.ts +2 -0
  15. package/dist/cli/commands/dev.d.ts.map +1 -0
  16. package/dist/cli/commands/dev.js +125 -0
  17. package/dist/cli/commands/dev.js.map +1 -0
  18. package/dist/cli/commands/env.d.ts +2 -0
  19. package/dist/cli/commands/env.d.ts.map +1 -0
  20. package/dist/cli/commands/env.js +94 -0
  21. package/dist/cli/commands/env.js.map +1 -0
  22. package/dist/cli/commands/import-export.d.ts +3 -0
  23. package/dist/cli/commands/import-export.d.ts.map +1 -0
  24. package/dist/cli/commands/import-export.js +156 -0
  25. package/dist/cli/commands/import-export.js.map +1 -0
  26. package/dist/cli/commands/migrate.d.ts +2 -0
  27. package/dist/cli/commands/migrate.d.ts.map +1 -0
  28. package/dist/cli/commands/migrate.js +12 -0
  29. package/dist/cli/commands/migrate.js.map +1 -0
  30. package/dist/cli/commands/push.d.ts +2 -0
  31. package/dist/cli/commands/push.d.ts.map +1 -0
  32. package/dist/cli/commands/push.js +45 -0
  33. package/dist/cli/commands/push.js.map +1 -0
  34. package/dist/cli/commands/run.d.ts +2 -0
  35. package/dist/cli/commands/run.d.ts.map +1 -0
  36. package/dist/cli/commands/run.js +54 -0
  37. package/dist/cli/commands/run.js.map +1 -0
  38. package/dist/cli/commands/seed.d.ts +2 -0
  39. package/dist/cli/commands/seed.d.ts.map +1 -0
  40. package/dist/cli/commands/seed.js +32 -0
  41. package/dist/cli/commands/seed.js.map +1 -0
  42. package/dist/cli/commands/studio.d.ts +2 -0
  43. package/dist/cli/commands/studio.d.ts.map +1 -0
  44. package/dist/cli/commands/studio.js +22 -0
  45. package/dist/cli/commands/studio.js.map +1 -0
  46. package/dist/cli/commands/types.d.ts +2 -0
  47. package/dist/cli/commands/types.d.ts.map +1 -0
  48. package/dist/cli/commands/types.js +28 -0
  49. package/dist/cli/commands/types.js.map +1 -0
  50. package/dist/cli/config.d.ts +28 -0
  51. package/dist/cli/config.d.ts.map +1 -0
  52. package/dist/cli/config.js +81 -0
  53. package/dist/cli/config.js.map +1 -0
  54. package/dist/cli/drizzle-bridge.d.ts +29 -0
  55. package/dist/cli/drizzle-bridge.d.ts.map +1 -0
  56. package/dist/cli/drizzle-bridge.js +85 -0
  57. package/dist/cli/drizzle-bridge.js.map +1 -0
  58. package/dist/cli/index.d.ts +2 -1
  59. package/dist/cli/index.d.ts.map +1 -1
  60. package/dist/cli/index.js +74 -20
  61. package/dist/cli/index.js.map +1 -1
  62. package/dist/cli/prompt.d.ts +2 -0
  63. package/dist/cli/prompt.d.ts.map +1 -0
  64. package/dist/cli/prompt.js +16 -0
  65. package/dist/cli/prompt.js.map +1 -0
  66. package/dist/cli/templates/package-json.js +1 -1
  67. package/dist/cli/worker.d.ts +2 -0
  68. package/dist/cli/worker.d.ts.map +1 -0
  69. package/dist/cli/worker.js +120 -0
  70. package/dist/cli/worker.js.map +1 -0
  71. package/dist/client/file-upload.d.ts +2 -1
  72. package/dist/client/file-upload.d.ts.map +1 -1
  73. package/dist/client/file-upload.js +5 -5
  74. package/dist/client/file-upload.js.map +1 -1
  75. package/dist/client/live-store.d.ts.map +1 -1
  76. package/dist/client/live-store.js +12 -6
  77. package/dist/client/live-store.js.map +1 -1
  78. package/dist/client/react-files.js +1 -1
  79. package/dist/client/react-files.js.map +1 -1
  80. package/dist/client/subscription-manager.d.ts.map +1 -1
  81. package/dist/client/subscription-manager.js +7 -0
  82. package/dist/client/subscription-manager.js.map +1 -1
  83. package/dist/htmx/client/runtime.d.ts +2 -0
  84. package/dist/htmx/client/runtime.d.ts.map +1 -0
  85. package/dist/htmx/client/runtime.js +195 -0
  86. package/dist/htmx/client/runtime.js.map +1 -0
  87. package/dist/htmx/context.d.ts +16 -0
  88. package/dist/htmx/context.d.ts.map +1 -0
  89. package/dist/htmx/context.js +52 -0
  90. package/dist/htmx/context.js.map +1 -0
  91. package/dist/htmx/forms.d.ts +3 -0
  92. package/dist/htmx/forms.d.ts.map +1 -0
  93. package/dist/htmx/forms.js +32 -0
  94. package/dist/htmx/forms.js.map +1 -0
  95. package/dist/htmx/ids.d.ts +11 -0
  96. package/dist/htmx/ids.d.ts.map +1 -0
  97. package/dist/htmx/ids.js +27 -0
  98. package/dist/htmx/ids.js.map +1 -0
  99. package/dist/htmx/index.d.ts +11 -0
  100. package/dist/htmx/index.d.ts.map +1 -0
  101. package/dist/htmx/index.js +15 -0
  102. package/dist/htmx/index.js.map +1 -0
  103. package/dist/htmx/live.d.ts +39 -0
  104. package/dist/htmx/live.d.ts.map +1 -0
  105. package/dist/htmx/live.js +37 -0
  106. package/dist/htmx/live.js.map +1 -0
  107. package/dist/htmx/page.d.ts +14 -0
  108. package/dist/htmx/page.d.ts.map +1 -0
  109. package/dist/htmx/page.js +59 -0
  110. package/dist/htmx/page.js.map +1 -0
  111. package/dist/htmx/render-util.d.ts +2 -0
  112. package/dist/htmx/render-util.d.ts.map +1 -0
  113. package/dist/htmx/render-util.js +15 -0
  114. package/dist/htmx/render-util.js.map +1 -0
  115. package/dist/htmx/server.d.ts +21 -0
  116. package/dist/htmx/server.d.ts.map +1 -0
  117. package/dist/htmx/server.js +286 -0
  118. package/dist/htmx/server.js.map +1 -0
  119. package/dist/htmx/sse-render.d.ts +10 -0
  120. package/dist/htmx/sse-render.d.ts.map +1 -0
  121. package/dist/htmx/sse-render.js +40 -0
  122. package/dist/htmx/sse-render.js.map +1 -0
  123. package/dist/htmx/template-gen.d.ts +7 -0
  124. package/dist/htmx/template-gen.d.ts.map +1 -0
  125. package/dist/htmx/template-gen.js +38 -0
  126. package/dist/htmx/template-gen.js.map +1 -0
  127. package/dist/resource/hook.d.ts.map +1 -1
  128. package/dist/resource/hook.js +101 -24
  129. package/dist/resource/hook.js.map +1 -1
  130. package/dist/resource/relations.d.ts +15 -4
  131. package/dist/resource/relations.d.ts.map +1 -1
  132. package/dist/resource/relations.js +146 -26
  133. package/dist/resource/relations.js.map +1 -1
  134. package/dist/resource/subscription.d.ts +15 -2
  135. package/dist/resource/subscription.d.ts.map +1 -1
  136. package/dist/resource/subscription.js +184 -3
  137. package/dist/resource/subscription.js.map +1 -1
  138. package/dist/resource/track-mutations.d.ts.map +1 -1
  139. package/dist/resource/track-mutations.js +11 -1
  140. package/dist/resource/track-mutations.js.map +1 -1
  141. package/dist/resource/types.d.ts +8 -0
  142. package/dist/resource/types.d.ts.map +1 -1
  143. package/dist/server/admin-bypass.d.ts +7 -0
  144. package/dist/server/admin-bypass.d.ts.map +1 -0
  145. package/dist/server/admin-bypass.js +22 -0
  146. package/dist/server/admin-bypass.js.map +1 -0
  147. package/dist/server/app.d.ts +9 -0
  148. package/dist/server/app.d.ts.map +1 -1
  149. package/dist/server/app.js +101 -1
  150. package/dist/server/app.js.map +1 -1
  151. package/dist/server/impersonation.d.ts +18 -0
  152. package/dist/server/impersonation.d.ts.map +1 -0
  153. package/dist/server/impersonation.js +53 -0
  154. package/dist/server/impersonation.js.map +1 -0
  155. package/dist/shared/escape.d.ts +3 -0
  156. package/dist/shared/escape.d.ts.map +1 -0
  157. package/dist/shared/escape.js +12 -0
  158. package/dist/shared/escape.js.map +1 -0
  159. package/dist/storage/local.d.ts +4 -0
  160. package/dist/storage/local.d.ts.map +1 -1
  161. package/dist/storage/local.js +5 -0
  162. package/dist/storage/local.js.map +1 -1
  163. package/dist/storage/resource.d.ts +5 -11
  164. package/dist/storage/resource.d.ts.map +1 -1
  165. package/dist/storage/resource.js +156 -194
  166. package/dist/storage/resource.js.map +1 -1
  167. package/dist/ui/admin-auth.d.ts +6 -0
  168. package/dist/ui/admin-auth.d.ts.map +1 -1
  169. package/dist/ui/admin-auth.js +59 -1
  170. package/dist/ui/admin-auth.js.map +1 -1
  171. package/dist/ui/data-explorer.d.ts.map +1 -1
  172. package/dist/ui/data-explorer.js +91 -4
  173. package/dist/ui/data-explorer.js.map +1 -1
  174. package/dist/ui/html/client/data-explorer-app.d.ts.map +1 -1
  175. package/dist/ui/html/client/data-explorer-app.js +20 -7
  176. package/dist/ui/html/client/data-explorer-app.js.map +1 -1
  177. package/dist/ui/html/client/runtime.d.ts.map +1 -1
  178. package/dist/ui/html/client/runtime.js +70 -2
  179. package/dist/ui/html/client/runtime.js.map +1 -1
  180. package/dist/ui/html/icons.d.ts.map +1 -1
  181. package/dist/ui/html/icons.js +2 -0
  182. package/dist/ui/html/icons.js.map +1 -1
  183. package/dist/ui/html/layout.d.ts +1 -0
  184. package/dist/ui/html/layout.d.ts.map +1 -1
  185. package/dist/ui/html/layout.js +274 -146
  186. package/dist/ui/html/layout.js.map +1 -1
  187. package/dist/ui/html/pages/filter-tester.d.ts.map +1 -1
  188. package/dist/ui/html/pages/filter-tester.js +15 -0
  189. package/dist/ui/html/pages/filter-tester.js.map +1 -1
  190. package/dist/ui/html/pages/users.d.ts.map +1 -1
  191. package/dist/ui/html/pages/users.js +8 -1
  192. package/dist/ui/html/pages/users.js.map +1 -1
  193. package/dist/ui/index.d.ts +1 -1
  194. package/dist/ui/index.d.ts.map +1 -1
  195. package/dist/ui/index.js +1 -1
  196. package/dist/ui/index.js.map +1 -1
  197. package/dist/ui/middleware.d.ts.map +1 -1
  198. package/dist/ui/middleware.js +121 -5
  199. package/dist/ui/middleware.js.map +1 -1
  200. package/dist/ui/schema-registry.d.ts +5 -0
  201. package/dist/ui/schema-registry.d.ts.map +1 -1
  202. package/dist/ui/schema-registry.js +14 -0
  203. package/dist/ui/schema-registry.js.map +1 -1
  204. package/package.json +6 -2
@@ -0,0 +1,195 @@
1
+ // The covara/htmx client runtime. Shipped (with vendored htmx core) by
2
+ // serveHtmxBundle(). htmx core powers the mutation controls (hx-post/hx-patch/
3
+ // hx-delete emitted by the c.* helpers); this runtime adds:
4
+ // - the live SSE channel (connect each <Live> container, apply named events),
5
+ // - optimistic create rendered from the server-shipped row <template> (no
6
+ // ghost) reconciled by the authoritative HTML response,
7
+ // - optimistic delete (row hidden immediately, restored on failure),
8
+ // - a basic offline queue (mutations replay + resync on reconnect).
9
+ export const covaraRuntimeScript = String.raw `(function () {
10
+ var LIVE = "/__covara/live/";
11
+ var QUEUE_KEY = "cv-offline-queue";
12
+
13
+ function firstEl(html) {
14
+ var tpl = document.createElement("template");
15
+ tpl.innerHTML = (html || "").trim();
16
+ return tpl.content.firstElementChild;
17
+ }
18
+ function process(el) { if (window.htmx && el) window.htmx.process(el); }
19
+
20
+ function escapeHtml(v) {
21
+ if (v === null || v === undefined) return "";
22
+ return String(v)
23
+ .replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")
24
+ .replace(/"/g, "&quot;").replace(/'/g, "&#039;");
25
+ }
26
+ function applyTemplate(tmpl, values) {
27
+ return tmpl.replace(/\{\{(\w+)\}\}/g, function (_m, k) { return escapeHtml(values[k]); });
28
+ }
29
+
30
+ function upsert(container, html) {
31
+ var el = firstEl(html);
32
+ if (!el) return;
33
+ var existing = el.id ? document.getElementById(el.id) : null;
34
+ if (existing) existing.replaceWith(el); else container.appendChild(el);
35
+ process(el);
36
+ }
37
+ // For "changed": only patch a row this client is actually showing. A change
38
+ // for a row outside the loaded page (pagination) is ignored rather than
39
+ // appended out of order — the row arrives when this client loads that page.
40
+ function replaceExisting(html) {
41
+ var el = firstEl(html);
42
+ if (!el || !el.id) return;
43
+ var existing = document.getElementById(el.id);
44
+ if (existing) {
45
+ existing.replaceWith(el);
46
+ process(el);
47
+ }
48
+ }
49
+ function removeById(domId) {
50
+ var el = document.getElementById((domId || "").trim());
51
+ if (el) el.remove();
52
+ }
53
+ function refetch(container) {
54
+ var url = container.getAttribute("data-cv-list");
55
+ if (!url) return;
56
+ fetch(url, { credentials: "include", headers: { "HX-Request": "true" } })
57
+ .then(function (r) { return r.text(); })
58
+ .then(function (html) { container.innerHTML = html; process(container); });
59
+ }
60
+
61
+ function connect(container) {
62
+ var url = container.getAttribute("data-cv-sse");
63
+ if (!url || container.__cvES) return;
64
+ var es = new EventSource(url, { withCredentials: true });
65
+ es.addEventListener("added", function (e) { upsert(container, e.data); });
66
+ es.addEventListener("changed", function (e) { replaceExisting(e.data); });
67
+ es.addEventListener("removed", function (e) { removeById(e.data); });
68
+ es.addEventListener("aggregate", function (e) { container.innerHTML = e.data; process(container); });
69
+ es.addEventListener("invalidate", function () { refetch(container); });
70
+ container.__cvES = es;
71
+ }
72
+ function init(root) {
73
+ (root || document).querySelectorAll("[data-cv-sse]").forEach(connect);
74
+ }
75
+
76
+ // ---- region helpers ----------------------------------------------------
77
+ function regionOf(url) {
78
+ if (!url || url.indexOf(LIVE) !== 0) return null;
79
+ return url.slice(LIVE.length).split("/")[0];
80
+ }
81
+ function containerFor(region) {
82
+ return document.querySelector('[data-cv-region="' + region + '"]');
83
+ }
84
+ function templateFor(container) {
85
+ var id = container && container.getAttribute("data-cv-template");
86
+ var tpl = id && document.getElementById(id);
87
+ return tpl ? tpl.innerHTML : null;
88
+ }
89
+ function formValues(form) {
90
+ var out = {};
91
+ if (!form) return out;
92
+ new FormData(form).forEach(function (v, k) { out[k] = v; });
93
+ return out;
94
+ }
95
+
96
+ // ---- offline queue -----------------------------------------------------
97
+ function loadQueue() {
98
+ try { return JSON.parse(localStorage.getItem(QUEUE_KEY) || "[]"); } catch (e) { return []; }
99
+ }
100
+ function saveQueue(q) {
101
+ try { localStorage.setItem(QUEUE_KEY, JSON.stringify(q)); } catch (e) {}
102
+ }
103
+ function enqueue(entry) { var q = loadQueue(); q.push(entry); saveQueue(q); }
104
+ function flushQueue() {
105
+ var q = loadQueue();
106
+ if (!q.length) return;
107
+ saveQueue([]);
108
+ var regions = {};
109
+ q.reduce(function (p, e) {
110
+ return p.then(function () {
111
+ regions[e.region] = true;
112
+ return fetch(e.url, {
113
+ method: e.method,
114
+ credentials: "include",
115
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
116
+ body: e.body,
117
+ }).catch(function () { enqueue(e); });
118
+ });
119
+ }, Promise.resolve()).then(function () {
120
+ Object.keys(regions).forEach(function (r) {
121
+ var c = containerFor(r);
122
+ if (c) refetch(c);
123
+ });
124
+ });
125
+ }
126
+ window.addEventListener("online", flushQueue);
127
+
128
+ // ---- optimistic mutations (htmx integration) ---------------------------
129
+ // Per-request state, keyed by the xhr (the one object htmx shares across
130
+ // beforeRequest/afterRequest — event.detail is NOT shared between them).
131
+ var pending = new WeakMap();
132
+
133
+ function reqPath(detail) {
134
+ return (detail.pathInfo && detail.pathInfo.requestPath) ||
135
+ detail.path || (detail.requestConfig && detail.requestConfig.path) || "";
136
+ }
137
+ function reqVerb(detail) {
138
+ return (detail.requestConfig && detail.requestConfig.verb) || "";
139
+ }
140
+
141
+ document.addEventListener("htmx:beforeRequest", function (evt) {
142
+ var detail = evt.detail || {};
143
+ var region = regionOf(reqPath(detail));
144
+ if (!region || !detail.xhr) return;
145
+ var verb = reqVerb(detail);
146
+ var el = detail.elt;
147
+
148
+ // CREATE is NOT optimistically inserted here. The create response uses
149
+ // hx-swap="none"; the new row is inserted exactly once by the SSE "added"
150
+ // event (same path every tab uses), which avoids the duplicate + phantom
151
+ // row that an optimistic placeholder caused.
152
+ if (verb === "delete") {
153
+ var row = el && el.closest && el.closest("[data-covara-id]");
154
+ if (row) {
155
+ row.style.display = "none";
156
+ pending.set(detail.xhr, { hidden: row });
157
+ }
158
+ }
159
+ });
160
+
161
+ document.addEventListener("htmx:afterRequest", function (evt) {
162
+ var detail = evt.detail || {};
163
+ if (!detail.xhr) return;
164
+ var p = pending.get(detail.xhr);
165
+ if (!p) return;
166
+ pending.delete(detail.xhr);
167
+ // On failure, restore the optimistically-hidden row. On success the row is
168
+ // removed by the response swap / SSE "removed" event.
169
+ if (p.hidden && !detail.successful) p.hidden.style.display = "";
170
+ });
171
+
172
+ document.addEventListener("htmx:sendError", function (evt) {
173
+ var detail = evt.detail || {};
174
+ var cfg = detail.requestConfig || {};
175
+ var region = regionOf(cfg.path || "");
176
+ if (!region) return;
177
+ if (cfg.verb === "post") {
178
+ enqueue({ region: region, url: LIVE + region, method: "POST", body: serialize(cfg.parameters) });
179
+ }
180
+ });
181
+
182
+ function serialize(params) {
183
+ if (!params) return "";
184
+ var p = new URLSearchParams();
185
+ Object.keys(params).forEach(function (k) { p.append(k, params[k]); });
186
+ return p.toString();
187
+ }
188
+
189
+ if (document.readyState !== "loading") init();
190
+ else document.addEventListener("DOMContentLoaded", function () { init(); });
191
+ if (navigator.onLine) flushQueue();
192
+ window.Covara = { init: init, flushQueue: flushQueue };
193
+ })();
194
+ `;
195
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/htmx/client/runtime.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,+EAA+E;AAC/E,4DAA4D;AAC5D,gFAAgF;AAChF,4EAA4E;AAC5E,4DAA4D;AAC5D,uEAAuE;AACvE,sEAAsE;AACtE,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyL5C,CAAC"}
@@ -0,0 +1,16 @@
1
+ export type Attrs = Record<string, string>;
2
+ export type LiveMode = "live" | "page";
3
+ export declare const attrsToHtml: (attrs: Attrs) => string;
4
+ export declare const loadMoreButtonHtml: (region: string, cursor: string, label?: string) => string;
5
+ export interface RegionContext {
6
+ readonly regionId: string;
7
+ container(extra?: Attrs): Attrs;
8
+ row(id: string | number, extra?: Attrs): Attrs;
9
+ create(extra?: Attrs): Attrs;
10
+ update(id: string | number, extra?: Attrs): Attrs;
11
+ delete(id: string | number, extra?: Attrs): Attrs;
12
+ }
13
+ export declare const createRegionContext: (region: string, opts?: {
14
+ mode?: LiveMode;
15
+ }) => RegionContext;
16
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/htmx/context.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC3C,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAKvC,eAAO,MAAM,WAAW,GAAI,OAAO,KAAK,KAAG,MAG9B,CAAC;AAKd,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,cAAmB,KAClB,MASF,CAAC;AAKF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAEhC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAE/C,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAE7B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAElD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;CACnD;AAKD,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,MAAM,EACd,OAAM;IAAE,IAAI,CAAC,EAAE,QAAQ,CAAA;CAAO,KAC7B,aA6CD,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { escapeAttr } from "../shared/escape.js";
2
+ import { containerDomId, regionBaseUrl, regionItemUrl, regionSubscribeUrl, rowDomId, templateDomId, } from "./ids.js";
3
+ // Render an attribute object to an HTML attribute string (leading space when
4
+ // non-empty). Values are attribute-escaped; used when the framework builds a
5
+ // default container/element rather than the developer's JSX.
6
+ export const attrsToHtml = (attrs) => Object.entries(attrs)
7
+ .map(([k, v]) => ` ${k}="${escapeAttr(v)}"`)
8
+ .join("");
9
+ // The cursor-driven "load more" control for a paginated ("page" mode) region.
10
+ // It replaces itself (outerHTML) with the next page's rows + the following
11
+ // control, so the list grows in order; it vanishes when there is no next page.
12
+ export const loadMoreButtonHtml = (region, cursor, label = "Load more") => {
13
+ const attrs = {
14
+ type: "button",
15
+ "data-cv-more": "",
16
+ "hx-get": `${regionBaseUrl(region)}?cursor=${encodeURIComponent(cursor)}`,
17
+ "hx-target": "this",
18
+ "hx-swap": "outerHTML",
19
+ };
20
+ return `<button${attrsToHtml(attrs)}>${escapeAttr(label)}</button>`;
21
+ };
22
+ const merge = (base, extra) => extra ? { ...base, ...extra } : base;
23
+ export const createRegionContext = (region, opts = {}) => ({
24
+ regionId: region,
25
+ container: (extra) => merge({
26
+ id: containerDomId(region),
27
+ "data-cv-region": region,
28
+ "data-cv-sse": regionSubscribeUrl(region),
29
+ "data-cv-list": regionBaseUrl(region),
30
+ "data-cv-template": templateDomId(region),
31
+ "data-cv-mode": opts.mode ?? "live",
32
+ }, extra),
33
+ row: (id, extra) => merge({ id: rowDomId(region, id), "data-covara-id": String(id) }, extra),
34
+ create: (extra) => merge({
35
+ "hx-post": regionBaseUrl(region),
36
+ // The new row is inserted once, by the region's live SSE "added" event
37
+ // (the same path every connected client uses) — so the create response
38
+ // itself is not swapped in. This avoids a duplicate/phantom row.
39
+ "hx-swap": "none",
40
+ }, extra),
41
+ update: (id, extra) => merge({
42
+ "hx-patch": regionItemUrl(region, id),
43
+ "hx-target": `#${rowDomId(region, id)}`,
44
+ "hx-swap": "outerHTML",
45
+ }, extra),
46
+ delete: (id, extra) => merge({
47
+ "hx-delete": regionItemUrl(region, id),
48
+ "hx-target": `#${rowDomId(region, id)}`,
49
+ "hx-swap": "outerHTML",
50
+ }, extra),
51
+ });
52
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/htmx/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type Table } from "drizzle-orm";
2
+ export declare const coerceFormBody: (body: Record<string, unknown>, table: Table) => Record<string, unknown>;
3
+ //# sourceMappingURL=forms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../src/htmx/forms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAM1D,eAAO,MAAM,cAAc,GACzB,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,KAAK,KACX,MAAM,CAAC,MAAM,EAAE,OAAO,CA0BxB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { getTableColumns } from "drizzle-orm";
2
+ // Coerce an htmx form body (all string values) into the shapes the resource's
3
+ // insert/update validation expects, using the table's column data types. Only
4
+ // present keys are coerced (so PATCH keeps partial semantics); unchecked
5
+ // checkboxes are simply absent. Unknown keys pass through unchanged.
6
+ export const coerceFormBody = (body, table) => {
7
+ const columns = getTableColumns(table);
8
+ const out = {};
9
+ for (const [key, value] of Object.entries(body)) {
10
+ if (typeof File !== "undefined" && value instanceof File)
11
+ continue;
12
+ const column = columns[key];
13
+ if (!column) {
14
+ out[key] = value;
15
+ continue;
16
+ }
17
+ const str = typeof value === "string" ? value : String(value);
18
+ switch (column.dataType) {
19
+ case "number":
20
+ case "bigint":
21
+ out[key] = str === "" ? null : Number(str);
22
+ break;
23
+ case "boolean":
24
+ out[key] = str === "on" || str === "true" || str === "1";
25
+ break;
26
+ default:
27
+ out[key] = value;
28
+ }
29
+ }
30
+ return out;
31
+ };
32
+ //# sourceMappingURL=forms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/htmx/forms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAc,MAAM,aAAa,CAAC;AAE1D,8EAA8E;AAC9E,8EAA8E;AAC9E,yEAAyE;AACzE,qEAAqE;AACrE,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,IAA6B,EAC7B,KAAY,EACa,EAAE;IAC3B,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAA0C,CAAC;IAChF,MAAM,GAAG,GAA4B,EAAE,CAAC;IAExC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,KAAK,YAAY,IAAI;YAAE,SAAS;QACnE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACjB,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9D,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxB,KAAK,QAAQ,CAAC;YACd,KAAK,QAAQ;gBACX,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC3C,MAAM;YACR,KAAK,SAAS;gBACZ,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC;gBACzD,MAAM;YACR;gBACE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare const LIVE_PREFIX = "/__covara/live";
2
+ export declare const slugifyPath: (path: string) => string;
3
+ export declare const regionId: (pagePath: string, index: number) => string;
4
+ export declare const domSafeId: (id: string | number) => string;
5
+ export declare const containerDomId: (region: string) => string;
6
+ export declare const templateDomId: (region: string) => string;
7
+ export declare const rowDomId: (region: string, id: string | number) => string;
8
+ export declare const regionBaseUrl: (region: string) => string;
9
+ export declare const regionItemUrl: (region: string, id: string | number) => string;
10
+ export declare const regionSubscribeUrl: (region: string) => string;
11
+ //# sourceMappingURL=ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../../src/htmx/ids.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,mBAAmB,CAAC;AAI5C,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,MAM1C,CAAC;AAIF,eAAO,MAAM,QAAQ,GAAI,UAAU,MAAM,EAAE,OAAO,MAAM,KAAG,MACtB,CAAC;AAItC,eAAO,MAAM,SAAS,GAAI,IAAI,MAAM,GAAG,MAAM,KAAG,MACsC,CAAC;AAEvF,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,MAA6B,CAAC;AAE9E,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,KAAG,MAA6B,CAAC;AAE7E,eAAO,MAAM,QAAQ,GAAI,QAAQ,MAAM,EAAE,IAAI,MAAM,GAAG,MAAM,KAAG,MAC9B,CAAC;AAGlC,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,KAAG,MAAoC,CAAC;AAEpF,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,EAAE,IAAI,MAAM,GAAG,MAAM,KAAG,MACN,CAAC;AAE/D,eAAO,MAAM,kBAAkB,GAAI,QAAQ,MAAM,KAAG,MACd,CAAC"}
@@ -0,0 +1,27 @@
1
+ // Framework-internal namespace for the htmx endpoints Covara generates from a
2
+ // page's <Live> regions. Mounted alongside the admin UI / OpenAPI under
3
+ // `/__covara`, so it never collides with a user's own routes or a page path.
4
+ export const LIVE_PREFIX = "/__covara/live";
5
+ // Turn a page path into a stable, URL/DOM-safe slug used to build region ids.
6
+ // "/" -> "root", "/todos" -> "todos", "/admin/users" -> "admin-users".
7
+ export const slugifyPath = (path) => {
8
+ const slug = path
9
+ .toLowerCase()
10
+ .replace(/[^a-z0-9]+/g, "-")
11
+ .replace(/^-+|-+$/g, "");
12
+ return slug.length > 0 ? slug : "root";
13
+ };
14
+ // Deterministic region id: page slug + structural position. Stable across
15
+ // requests/deploys as long as the page's regions keep their order.
16
+ export const regionId = (pagePath, index) => `${slugifyPath(pagePath)}-${index}`;
17
+ // Make an arbitrary resource id safe to embed in a DOM id / CSS selector while
18
+ // staying collision-free (unsafe chars are hex-escaped, not flattened).
19
+ export const domSafeId = (id) => String(id).replace(/[^A-Za-z0-9_-]/g, (ch) => `-x${ch.charCodeAt(0).toString(16)}-`);
20
+ export const containerDomId = (region) => `cv-${region}-list`;
21
+ export const templateDomId = (region) => `cv-${region}-tmpl`;
22
+ export const rowDomId = (region, id) => `cv-${region}-${domSafeId(id)}`;
23
+ // Generated endpoint URLs (what the c.* attribute helpers point at).
24
+ export const regionBaseUrl = (region) => `${LIVE_PREFIX}/${region}`;
25
+ export const regionItemUrl = (region, id) => `${LIVE_PREFIX}/${region}/${encodeURIComponent(String(id))}`;
26
+ export const regionSubscribeUrl = (region) => `${LIVE_PREFIX}/${region}/subscribe`;
27
+ //# sourceMappingURL=ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.js","sourceRoot":"","sources":["../../src/htmx/ids.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,wEAAwE;AACxE,6EAA6E;AAC7E,MAAM,CAAC,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAE5C,8EAA8E;AAC9E,uEAAuE;AACvE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAU,EAAE;IAClD,MAAM,IAAI,GAAG,IAAI;SACd,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AACzC,CAAC,CAAC;AAEF,0EAA0E;AAC1E,mEAAmE;AACnE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,KAAa,EAAU,EAAE,CAClE,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC;AAEtC,+EAA+E;AAC/E,wEAAwE;AACxE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAmB,EAAU,EAAE,CACvD,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;AAEvF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,MAAM,MAAM,OAAO,CAAC;AAE9E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,MAAM,MAAM,OAAO,CAAC;AAE7E,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAE,EAAmB,EAAU,EAAE,CACtE,MAAM,MAAM,IAAI,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;AAElC,qEAAqE;AACrE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,GAAG,WAAW,IAAI,MAAM,EAAE,CAAC;AAEpF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,EAAmB,EAAU,EAAE,CAC3E,GAAG,WAAW,IAAI,MAAM,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAE/D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAU,EAAE,CAC3D,GAAG,WAAW,IAAI,MAAM,YAAY,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Context } from "hono";
2
+ export { escapeHtml, escapeAttr } from "../shared/escape.js";
3
+ export { LIVE_PREFIX, slugifyPath, regionId, domSafeId, containerDomId, rowDomId, regionBaseUrl, regionItemUrl, regionSubscribeUrl, } from "./ids.js";
4
+ export { createRegionContext, attrsToHtml } from "./context.js";
5
+ export type { RegionContext, Attrs } from "./context.js";
6
+ export { Live, LiveAggregate } from "./live.js";
7
+ export type { LiveProps, LiveAggregateProps, LiveQuery, Renderable, } from "./live.js";
8
+ export type { PageComponent, PageContext } from "./server.js";
9
+ export declare const htmxBundle: () => string;
10
+ export declare const serveHtmxBundle: () => (c: Context) => Response & import("hono").TypedResponse<string, import("hono/utils/http-status").ContentfulStatusCode, "body">;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/htmx/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAIpC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EACL,WAAW,EACX,WAAW,EACX,QAAQ,EACR,SAAS,EACT,cAAc,EACd,QAAQ,EACR,aAAa,EACb,aAAa,EACb,kBAAkB,GACnB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC7C,YAAY,EACV,SAAS,EACT,kBAAkB,EAClB,SAAS,EACT,UAAU,GACX,MAAM,QAAQ,CAAC;AAChB,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAK3D,eAAO,MAAM,UAAU,QAAO,MAAiD,CAAC;AAEhF,eAAO,MAAM,eAAe,SAAU,GAAG,OAAO,mHAG/C,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { htmxScript } from "../ui/html/client/htmx-vendor.js";
2
+ import { covaraRuntimeScript } from "./client/runtime.js";
3
+ export { escapeHtml, escapeAttr } from "../shared/escape.js";
4
+ export { LIVE_PREFIX, slugifyPath, regionId, domSafeId, containerDomId, rowDomId, regionBaseUrl, regionItemUrl, regionSubscribeUrl, } from "./ids.js";
5
+ export { createRegionContext, attrsToHtml } from "./context.js";
6
+ export { Live, LiveAggregate } from "./live.js";
7
+ // The full client bundle (vendored htmx core + the covara live runtime). Served
8
+ // automatically at `/__covara/live/_runtime.js` once a page is registered; this
9
+ // helper lets you serve/inline it yourself if needed.
10
+ export const htmxBundle = () => `${htmxScript}\n${covaraRuntimeScript}`;
11
+ export const serveHtmxBundle = () => (c) => {
12
+ c.header("Content-Type", "application/javascript; charset=utf-8");
13
+ return c.body(htmxBundle());
14
+ };
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/htmx/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EACL,WAAW,EACX,WAAW,EACX,QAAQ,EACR,SAAS,EACT,cAAc,EACd,QAAQ,EACR,aAAa,EACb,aAAa,EACb,kBAAkB,GACnB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7D,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAS7C,gFAAgF;AAChF,gFAAgF;AAChF,sDAAsD;AACtD,MAAM,CAAC,MAAM,UAAU,GAAG,GAAW,EAAE,CAAC,GAAG,UAAU,KAAK,mBAAmB,EAAE,CAAC;AAEhF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,CAAC,CAAU,EAAE,EAAE;IAClD,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,uCAAuC,CAAC,CAAC;IAClE,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;AAC9B,CAAC,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { HtmlEscapedString } from "hono/utils/html";
2
+ import type { RegionContext } from "./context.js";
3
+ export type Renderable = unknown;
4
+ export interface LiveQuery {
5
+ filter?: string;
6
+ orderBy?: string;
7
+ limit?: number;
8
+ }
9
+ export interface LiveProps<Row extends Record<string, unknown> = Record<string, unknown>> {
10
+ resource: unknown;
11
+ query?: LiveQuery;
12
+ mode?: "live" | "page";
13
+ moreLabel?: string;
14
+ idField?: string;
15
+ create?: (c: RegionContext) => Renderable;
16
+ container?: (rows: Renderable, c: RegionContext) => Renderable;
17
+ render: (row: Row, c: RegionContext) => Renderable;
18
+ empty?: (c: RegionContext) => Renderable;
19
+ }
20
+ export interface LiveAggregateProps {
21
+ resource: unknown;
22
+ query?: LiveQuery;
23
+ groupBy?: string[];
24
+ render: (data: unknown, c: RegionContext) => Renderable;
25
+ }
26
+ export interface CollectedRegion {
27
+ index: number;
28
+ regionId: string;
29
+ kind: "live" | "aggregate";
30
+ token: string;
31
+ props: LiveProps | LiveAggregateProps;
32
+ }
33
+ export declare const collectRegions: (pagePath: string, renderSync: () => string) => {
34
+ html: string;
35
+ regions: CollectedRegion[];
36
+ };
37
+ export declare const Live: <Row extends Record<string, unknown> = Record<string, unknown>>(props: LiveProps<Row>) => HtmlEscapedString;
38
+ export declare const LiveAggregate: (props: LiveAggregateProps) => HtmlEscapedString;
39
+ //# sourceMappingURL=live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../src/htmx/live.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAI/C,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC;AAEjC,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS,CAAC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAGtF,QAAQ,EAAE,OAAO,CAAC;IAIlB,KAAK,CAAC,EAAE,SAAS,CAAC;IAMlB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAEvB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,UAAU,CAAC;IAG1C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,KAAK,UAAU,CAAC;IAE/D,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,aAAa,KAAK,UAAU,CAAC;IAEnD,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,UAAU,CAAC;CAC1C;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,KAAK,UAAU,CAAC;CACzD;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,GAAG,kBAAkB,CAAC;CACvC;AAaD,eAAO,MAAM,cAAc,GACzB,UAAU,MAAM,EAChB,YAAY,MAAM,MAAM,KACvB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,eAAe,EAAE,CAAA;CAU5C,CAAC;AAqBF,eAAO,MAAM,IAAI,GAAI,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChF,OAAO,SAAS,CAAC,GAAG,CAAC,KACpB,iBAA+D,CAAC;AAEnE,eAAO,MAAM,aAAa,GAAI,OAAO,kBAAkB,KAAG,iBACtB,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { raw } from "hono/html";
2
+ import { regionId } from "./ids.js";
3
+ // Render-scoped collector. Safe as a module global because a page render is
4
+ // SYNCHRONOUS: <Live> returns a token string immediately (data fetching happens
5
+ // later, outside JSX), so toString() never yields and no two renders interleave
6
+ // while the collector is set.
7
+ let activeCollector = null;
8
+ export const collectRegions = (pagePath, renderSync) => {
9
+ const collector = { pagePath, regions: [] };
10
+ const previous = activeCollector;
11
+ activeCollector = collector;
12
+ try {
13
+ const html = renderSync();
14
+ return { html, regions: collector.regions };
15
+ }
16
+ finally {
17
+ activeCollector = previous;
18
+ }
19
+ };
20
+ const registerRegion = (kind, props) => {
21
+ const collector = activeCollector;
22
+ if (!collector) {
23
+ // Rendered outside a page render (e.g. a stray <Live> in a fragment); emit
24
+ // nothing rather than throwing.
25
+ return raw("");
26
+ }
27
+ const index = collector.regions.length;
28
+ const rid = regionId(collector.pagePath, index);
29
+ const token = `<!--cv-region:${rid}-->`;
30
+ collector.regions.push({ index, regionId: rid, kind, token, props });
31
+ return raw(token);
32
+ };
33
+ // hono/jsx function components. Returned token is replaced with the region's
34
+ // rendered HTML in the assemble phase (see renderPage).
35
+ export const Live = (props) => registerRegion("live", props);
36
+ export const LiveAggregate = (props) => registerRegion("aggregate", props);
37
+ //# sourceMappingURL=live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.js","sourceRoot":"","sources":["../../src/htmx/live.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AA8DjC,4EAA4E;AAC5E,gFAAgF;AAChF,gFAAgF;AAChF,8BAA8B;AAC9B,IAAI,eAAe,GAAqB,IAAI,CAAC;AAE7C,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,QAAgB,EAChB,UAAwB,EACsB,EAAE;IAChD,MAAM,SAAS,GAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACvD,MAAM,QAAQ,GAAG,eAAe,CAAC;IACjC,eAAe,GAAG,SAAS,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC;IAC9C,CAAC;YAAS,CAAC;QACT,eAAe,GAAG,QAAQ,CAAC;IAC7B,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CACrB,IAA6B,EAC7B,KAAqC,EAClB,EAAE;IACrB,MAAM,SAAS,GAAG,eAAe,CAAC;IAClC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,2EAA2E;QAC3E,gCAAgC;QAChC,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;IACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,iBAAiB,GAAG,KAAK,CAAC;IACxC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;AACpB,CAAC,CAAC;AAEF,6EAA6E;AAC7E,wDAAwD;AACxD,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,KAAqB,EACF,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,KAAkB,CAAC,CAAC;AAEnE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAyB,EAAqB,EAAE,CAC5E,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type CollectedRegion, type Renderable } from "./live.js";
2
+ export interface PageResult {
3
+ items: Record<string, unknown>[];
4
+ nextCursor?: string | null;
5
+ hasMore?: boolean;
6
+ }
7
+ export interface RenderPageOptions {
8
+ pagePath: string;
9
+ ctx: unknown;
10
+ fetchRows: (region: CollectedRegion) => Promise<PageResult>;
11
+ fetchAggregate?: (region: CollectedRegion) => Promise<unknown>;
12
+ }
13
+ export declare const renderPage: (component: (ctx: any) => Renderable, options: RenderPageOptions) => Promise<string>;
14
+ //# sourceMappingURL=page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/htmx/page.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,eAAe,EAGpB,KAAK,UAAU,EAChB,MAAM,QAAQ,CAAC;AAEhB,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;IAGb,SAAS,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAE5D,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAChE;AAwDD,eAAO,MAAM,UAAU,GACrB,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,UAAU,EACnC,SAAS,iBAAiB,KACzB,OAAO,CAAC,MAAM,CAchB,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { raw } from "hono/html";
2
+ import { attrsToHtml, createRegionContext, loadMoreButtonHtml } from "./context.js";
3
+ import { templateDomId } from "./ids.js";
4
+ import { toHtmlString } from "./render-util.js";
5
+ import { buildRowTemplate } from "./template-gen.js";
6
+ import { collectRegions, } from "./live.js";
7
+ const renderLiveRegion = async (region, options) => {
8
+ const props = region.props;
9
+ const mode = props.mode ?? "live";
10
+ const c = createRegionContext(region.regionId, { mode });
11
+ const { items, nextCursor, hasMore } = await options.fetchRows(region);
12
+ let body = items.length > 0
13
+ ? items.map((row) => toHtmlString(props.render(row, c))).join("")
14
+ : props.empty
15
+ ? toHtmlString(props.empty(c))
16
+ : "";
17
+ // In "page" mode, append the cursor-driven load-more control inside the
18
+ // container so it grows in order and the control advances itself.
19
+ if (mode === "page" && hasMore && nextCursor) {
20
+ body += loadMoreButtonHtml(region.regionId, nextCursor, props.moreLabel);
21
+ }
22
+ const container = props.container
23
+ ? toHtmlString(props.container(raw(body), c))
24
+ : `<div${attrsToHtml(c.container())}>${body}</div>`;
25
+ const create = props.create ? toHtmlString(props.create(c)) : "";
26
+ // Ship the server-derived row template so the client can render optimistic
27
+ // rows that match the server's markup (no ghost). Inert until the runtime
28
+ // uses it; <template> content is not executed by htmx.
29
+ const template = `<template id="${templateDomId(region.regionId)}">${buildRowTemplate({
30
+ regionId: region.regionId,
31
+ props,
32
+ })}</template>`;
33
+ return create + container + template;
34
+ };
35
+ const renderAggregateRegion = async (region, options) => {
36
+ const props = region.props;
37
+ const c = createRegionContext(region.regionId);
38
+ const data = options.fetchAggregate ? await options.fetchAggregate(region) : null;
39
+ // Wrap in a live container: the client connects its SSE and replaces the
40
+ // inner aggregate fragment whenever the resource changes.
41
+ return `<div${attrsToHtml(c.container())}>${toHtmlString(props.render(data, c))}</div>`;
42
+ };
43
+ // Render a registered page: a synchronous collect pass gathers the <Live>
44
+ // regions (each leaves a placeholder token), then an async assemble pass fetches
45
+ // each region's data, renders it via the page's own closures, and substitutes
46
+ // the token. Live updates/optimism use the same closures via the generated
47
+ // endpoints, so the markup has a single source of truth.
48
+ export const renderPage = async (component, options) => {
49
+ const { html, regions } = collectRegions(options.pagePath, () => toHtmlString(component(options.ctx)));
50
+ let output = html;
51
+ for (const region of regions) {
52
+ const replacement = region.kind === "aggregate"
53
+ ? await renderAggregateRegion(region, options)
54
+ : await renderLiveRegion(region, options);
55
+ output = output.replace(region.token, () => replacement);
56
+ }
57
+ return output;
58
+ };
59
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/htmx/page.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const toHtmlString: (value: unknown) => string;
2
+ //# sourceMappingURL=render-util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-util.d.ts","sourceRoot":"","sources":["../../src/htmx/render-util.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,MAU7C,CAAC"}
@@ -0,0 +1,15 @@
1
+ // Coerce a closure return value (string / hono-jsx node / anything with a sync
2
+ // toString) into an HTML string. Throws on async shells — page shells must be
3
+ // synchronous; async data fetching is handled per <Live> region.
4
+ export const toHtmlString = (value) => {
5
+ if (value === null || value === undefined || value === false)
6
+ return "";
7
+ if (typeof value === "string")
8
+ return value;
9
+ const out = value.toString();
10
+ if (out instanceof Promise) {
11
+ throw new Error("covara/htmx: page components must render synchronously (no async components in the page shell); data fetching is handled per <Live> region");
12
+ }
13
+ return String(out);
14
+ };
15
+ //# sourceMappingURL=render-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-util.js","sourceRoot":"","sources":["../../src/htmx/render-util.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,8EAA8E;AAC9E,iEAAiE;AACjE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAU,EAAE;IACrD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IACxE,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,GAAG,GAAI,KAAiC,CAAC,QAAQ,EAAE,CAAC;IAC1D,IAAI,GAAG,YAAY,OAAO,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,4IAA4I,CAC7I,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC,CAAC"}