mates-fullstack 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/README.md +311 -0
  2. package/dist/arctic-auth.d.ts +101 -0
  3. package/dist/arctic-auth.d.ts.map +1 -0
  4. package/dist/arctic-auth.js +538 -0
  5. package/dist/arctic-auth.js.map +1 -0
  6. package/dist/asset-manifest.d.ts +14 -0
  7. package/dist/asset-manifest.d.ts.map +1 -0
  8. package/dist/asset-manifest.js +102 -0
  9. package/dist/asset-manifest.js.map +1 -0
  10. package/dist/browser.d.ts +18 -0
  11. package/dist/browser.d.ts.map +1 -0
  12. package/dist/browser.js +25 -0
  13. package/dist/browser.js.map +1 -0
  14. package/dist/build-esbuild.d.ts +29 -0
  15. package/dist/build-esbuild.d.ts.map +1 -0
  16. package/dist/build-esbuild.js +699 -0
  17. package/dist/build-esbuild.js.map +1 -0
  18. package/dist/build-prod.d.ts +126 -0
  19. package/dist/build-prod.d.ts.map +1 -0
  20. package/dist/build-prod.js +1014 -0
  21. package/dist/build-prod.js.map +1 -0
  22. package/dist/cli-new.d.ts +14 -0
  23. package/dist/cli-new.d.ts.map +1 -0
  24. package/dist/cli-new.js +637 -0
  25. package/dist/cli-new.js.map +1 -0
  26. package/dist/client.d.ts +43 -0
  27. package/dist/client.d.ts.map +1 -0
  28. package/dist/client.js +130 -0
  29. package/dist/client.js.map +1 -0
  30. package/dist/cors.d.ts +16 -0
  31. package/dist/cors.d.ts.map +1 -0
  32. package/dist/cors.js +60 -0
  33. package/dist/cors.js.map +1 -0
  34. package/dist/ctx.d.ts +78 -0
  35. package/dist/ctx.d.ts.map +1 -0
  36. package/dist/ctx.js +280 -0
  37. package/dist/ctx.js.map +1 -0
  38. package/dist/dev-watcher.d.ts +23 -0
  39. package/dist/dev-watcher.d.ts.map +1 -0
  40. package/dist/dev-watcher.js +136 -0
  41. package/dist/dev-watcher.js.map +1 -0
  42. package/dist/docs-generator.d.ts +69 -0
  43. package/dist/docs-generator.d.ts.map +1 -0
  44. package/dist/docs-generator.js +557 -0
  45. package/dist/docs-generator.js.map +1 -0
  46. package/dist/docs-page.d.ts +20 -0
  47. package/dist/docs-page.d.ts.map +1 -0
  48. package/dist/docs-page.js +1152 -0
  49. package/dist/docs-page.js.map +1 -0
  50. package/dist/download.d.ts +78 -0
  51. package/dist/download.d.ts.map +1 -0
  52. package/dist/download.js +202 -0
  53. package/dist/download.js.map +1 -0
  54. package/dist/env-loader.d.ts +76 -0
  55. package/dist/env-loader.d.ts.map +1 -0
  56. package/dist/env-loader.js +213 -0
  57. package/dist/env-loader.js.map +1 -0
  58. package/dist/errors.d.ts +146 -0
  59. package/dist/errors.d.ts.map +1 -0
  60. package/dist/errors.js +386 -0
  61. package/dist/errors.js.map +1 -0
  62. package/dist/head.d.ts +31 -0
  63. package/dist/head.d.ts.map +1 -0
  64. package/dist/head.js +245 -0
  65. package/dist/head.js.map +1 -0
  66. package/dist/index.d.ts +30 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +30 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/internal-prefixes.d.ts +16 -0
  71. package/dist/internal-prefixes.d.ts.map +1 -0
  72. package/dist/internal-prefixes.js +16 -0
  73. package/dist/internal-prefixes.js.map +1 -0
  74. package/dist/internal.d.ts +25 -0
  75. package/dist/internal.d.ts.map +1 -0
  76. package/dist/internal.js +25 -0
  77. package/dist/internal.js.map +1 -0
  78. package/dist/jwt.d.ts +166 -0
  79. package/dist/jwt.d.ts.map +1 -0
  80. package/dist/jwt.js +261 -0
  81. package/dist/jwt.js.map +1 -0
  82. package/dist/log.d.ts +44 -0
  83. package/dist/log.d.ts.map +1 -0
  84. package/dist/log.js +66 -0
  85. package/dist/log.js.map +1 -0
  86. package/dist/logger.d.ts +76 -0
  87. package/dist/logger.d.ts.map +1 -0
  88. package/dist/logger.js +138 -0
  89. package/dist/logger.js.map +1 -0
  90. package/dist/main-runner.d.ts +59 -0
  91. package/dist/main-runner.d.ts.map +1 -0
  92. package/dist/main-runner.js +157 -0
  93. package/dist/main-runner.js.map +1 -0
  94. package/dist/mates-auth.d.ts +82 -0
  95. package/dist/mates-auth.d.ts.map +1 -0
  96. package/dist/mates-auth.js +323 -0
  97. package/dist/mates-auth.js.map +1 -0
  98. package/dist/middleware.d.ts +30 -0
  99. package/dist/middleware.d.ts.map +1 -0
  100. package/dist/middleware.js +67 -0
  101. package/dist/middleware.js.map +1 -0
  102. package/dist/project-resolver.d.ts +102 -0
  103. package/dist/project-resolver.d.ts.map +1 -0
  104. package/dist/project-resolver.js +271 -0
  105. package/dist/project-resolver.js.map +1 -0
  106. package/dist/rate-limit.d.ts +37 -0
  107. package/dist/rate-limit.d.ts.map +1 -0
  108. package/dist/rate-limit.js +109 -0
  109. package/dist/rate-limit.js.map +1 -0
  110. package/dist/redirect.d.ts +84 -0
  111. package/dist/redirect.d.ts.map +1 -0
  112. package/dist/redirect.js +105 -0
  113. package/dist/redirect.js.map +1 -0
  114. package/dist/renderer.d.ts +91 -0
  115. package/dist/renderer.d.ts.map +1 -0
  116. package/dist/renderer.js +630 -0
  117. package/dist/renderer.js.map +1 -0
  118. package/dist/request-logger.d.ts +12 -0
  119. package/dist/request-logger.d.ts.map +1 -0
  120. package/dist/request-logger.js +55 -0
  121. package/dist/request-logger.js.map +1 -0
  122. package/dist/rest.d.ts +25 -0
  123. package/dist/rest.d.ts.map +1 -0
  124. package/dist/rest.js +93 -0
  125. package/dist/rest.js.map +1 -0
  126. package/dist/router.d.ts +71 -0
  127. package/dist/router.d.ts.map +1 -0
  128. package/dist/router.js +222 -0
  129. package/dist/router.js.map +1 -0
  130. package/dist/rpc-registry.d.ts +84 -0
  131. package/dist/rpc-registry.d.ts.map +1 -0
  132. package/dist/rpc-registry.js +271 -0
  133. package/dist/rpc-registry.js.map +1 -0
  134. package/dist/rpc-runner.d.ts +82 -0
  135. package/dist/rpc-runner.d.ts.map +1 -0
  136. package/dist/rpc-runner.js +564 -0
  137. package/dist/rpc-runner.js.map +1 -0
  138. package/dist/sanitize.d.ts +61 -0
  139. package/dist/sanitize.d.ts.map +1 -0
  140. package/dist/sanitize.js +193 -0
  141. package/dist/sanitize.js.map +1 -0
  142. package/dist/security-headers.d.ts +114 -0
  143. package/dist/security-headers.d.ts.map +1 -0
  144. package/dist/security-headers.js +121 -0
  145. package/dist/security-headers.js.map +1 -0
  146. package/dist/server-fn.d.ts +323 -0
  147. package/dist/server-fn.d.ts.map +1 -0
  148. package/dist/server-fn.js +373 -0
  149. package/dist/server-fn.js.map +1 -0
  150. package/dist/server-public.d.ts +13 -0
  151. package/dist/server-public.d.ts.map +1 -0
  152. package/dist/server-public.js +12 -0
  153. package/dist/server-public.js.map +1 -0
  154. package/dist/server-timeout.d.ts +38 -0
  155. package/dist/server-timeout.d.ts.map +1 -0
  156. package/dist/server-timeout.js +46 -0
  157. package/dist/server-timeout.js.map +1 -0
  158. package/dist/server.d.ts +100 -0
  159. package/dist/server.d.ts.map +1 -0
  160. package/dist/server.js +1218 -0
  161. package/dist/server.js.map +1 -0
  162. package/dist/socket-router.d.ts +153 -0
  163. package/dist/socket-router.d.ts.map +1 -0
  164. package/dist/socket-router.js +612 -0
  165. package/dist/socket-router.js.map +1 -0
  166. package/dist/sso.d.ts +90 -0
  167. package/dist/sso.d.ts.map +1 -0
  168. package/dist/sso.js +261 -0
  169. package/dist/sso.js.map +1 -0
  170. package/dist/ssr-context.d.ts +49 -0
  171. package/dist/ssr-context.d.ts.map +1 -0
  172. package/dist/ssr-context.js +85 -0
  173. package/dist/ssr-context.js.map +1 -0
  174. package/dist/ssr-globals.d.ts +32 -0
  175. package/dist/ssr-globals.d.ts.map +1 -0
  176. package/dist/ssr-globals.js +1010 -0
  177. package/dist/ssr-globals.js.map +1 -0
  178. package/dist/ssr-template.d.ts +73 -0
  179. package/dist/ssr-template.d.ts.map +1 -0
  180. package/dist/ssr-template.js +507 -0
  181. package/dist/ssr-template.js.map +1 -0
  182. package/dist/stack-mapper.d.ts +25 -0
  183. package/dist/stack-mapper.d.ts.map +1 -0
  184. package/dist/stack-mapper.js +139 -0
  185. package/dist/stack-mapper.js.map +1 -0
  186. package/dist/stream.d.ts +89 -0
  187. package/dist/stream.d.ts.map +1 -0
  188. package/dist/stream.js +299 -0
  189. package/dist/stream.js.map +1 -0
  190. package/dist/upload.d.ts +69 -0
  191. package/dist/upload.d.ts.map +1 -0
  192. package/dist/upload.js +110 -0
  193. package/dist/upload.js.map +1 -0
  194. package/dist/validate.d.ts +58 -0
  195. package/dist/validate.d.ts.map +1 -0
  196. package/dist/validate.js +89 -0
  197. package/dist/validate.js.map +1 -0
  198. package/dist/verify-package.d.ts +3 -0
  199. package/dist/verify-package.d.ts.map +1 -0
  200. package/dist/verify-package.js +128 -0
  201. package/dist/verify-package.js.map +1 -0
  202. package/package.json +79 -0
@@ -0,0 +1,630 @@
1
+ /**
2
+ * mates-ssr — renderer.ts
3
+ *
4
+ * The SSR render pipeline. Takes a Mates Component function, runs it through
5
+ * the custom TemplateResult serializer (ssrTemplate), and returns clean HTML.
6
+ *
7
+ * No happy-dom. No DOM. No per-request global patching. Fully concurrent.
8
+ *
9
+ * Design decisions:
10
+ * - SSR globals (installSsrGlobals) are installed ONCE at boot — no per-request
11
+ * Window creation, no global swapping.
12
+ * - Requests are fully concurrent — no render queue. ssrTemplate is a pure
13
+ * function that walks TemplateResult data structures directly.
14
+ * - Async work (onMount, asyncAction) is tracked via the global SSR async
15
+ * counter and per-host queues. The render loop drains and re-serializes.
16
+ * - CSS-in-JS styles are collected after render via collectSSRStyles().
17
+ * - pathAtom is set before each render via explicit .set() call.
18
+ * - Components run inside withHost(fakeHost, ...) on the server. No custom
19
+ * element is created — hooks get a fake host object that satisfies their
20
+ * getCurrentHost() calls.
21
+ */
22
+ import fs from "node:fs";
23
+ import path from "node:path";
24
+ import crypto from "node:crypto";
25
+ import { devWarn } from "./log.js";
26
+ import { installSsrGlobals } from "./ssr-globals.js";
27
+ import { ssrTemplate } from "./ssr-template.js";
28
+ export const DEFAULT_SSR_TIMEOUT_MS = 10000;
29
+ /**
30
+ * Render the app from a file path.
31
+ * Imports client/App.ts (or .js), renders it with pathAtom set to pathname.
32
+ * This is the main SSR entry point — called once per incoming GET request.
33
+ *
34
+ * The app's Router() reads pathAtom and renders the correct page.
35
+ * No file-based routing on the server — the SPA router IS the server router.
36
+ */
37
+ export async function renderApp(appFile, pathname, dev, ssrTimeoutMs = DEFAULT_SSR_TIMEOUT_MS) {
38
+ if (!_mates) {
39
+ throw new Error("mates-ssr: renderer not booted. Call bootRenderer() before rendering.");
40
+ }
41
+ return _doRenderApp(appFile, pathname, dev, ssrTimeoutMs);
42
+ }
43
+ // ─── Module-level state ───────────────────────────────────────────────────────
44
+ let _mates = null;
45
+ let _matesPath = null; // absolute path to the mates ESM dist
46
+ let _bootPromise = null;
47
+ let _ssrStyles = ""; // CSS collected from collectSSRStyles() after boot
48
+ // Debug: track which mates module instance was loaded at boot time.
49
+ // ESM namespace objects are frozen, so we cannot stamp properties on them.
50
+ // Instead we store a reference and use identity comparison.
51
+ let _matesModuleRef = null;
52
+ /**
53
+ * Must be called once at server startup, before any route handler runs.
54
+ * Initialises the boot window and imports lit-html + mates into module cache.
55
+ *
56
+ * @param matesPath Absolute path to the mates ESM dist file, e.g.
57
+ * "/project/node_modules/mates/dist/index.esm.js"
58
+ * When provided, mates is imported from this exact path so that the module
59
+ * instance (and its internal host stack) is shared with the page files.
60
+ * When omitted, we attempt a bare `import("mates")` which may resolve to a
61
+ * different instance — withHost/getCurrentHost will not share state with
62
+ * page files in that case and hooks will not work on the server.
63
+ */
64
+ export async function bootRenderer(matesPath) {
65
+ if (_bootPromise)
66
+ return _bootPromise;
67
+ // Install stateless no-op browser stubs once at boot.
68
+ // This satisfies lit-html's module-level `document` reference without
69
+ // needing a full DOM implementation like happy-dom.
70
+ installSsrGlobals();
71
+ _bootPromise = (async () => {
72
+ // -- Ensure document.adoptedStyleSheets is writable ----------------
73
+ // happy-dom may define adoptedStyleSheets as a readonly getter.
74
+ // mates CSS-in-JS does document.adoptedStyleSheets = [...sheets, s]
75
+ // which throws "Attempted to assign to readonly property" if the
76
+ // property is not writable. We detect and redefine it here BEFORE
77
+ // importing mates so the module-level side-effects succeed.
78
+ const _doc = globalThis.document;
79
+ if (_doc) {
80
+ try {
81
+ const _sheets = _doc.adoptedStyleSheets ?? [];
82
+ _doc.adoptedStyleSheets = _sheets;
83
+ }
84
+ catch {
85
+ Object.defineProperty(_doc, "adoptedStyleSheets", {
86
+ value: [],
87
+ writable: true,
88
+ configurable: true,
89
+ });
90
+ }
91
+ }
92
+ // -- Polyfill CSSStyleSheet ────────────────────────────────────────
93
+ if (typeof globalThis.CSSStyleSheet === "undefined") {
94
+ class CSSStyleSheetStub {
95
+ cssRules = [];
96
+ replaceSync(_text) { }
97
+ replace(_text) {
98
+ return Promise.resolve(this);
99
+ }
100
+ insertRule(rule, index = 0) {
101
+ this.cssRules.splice(index, 0, rule);
102
+ return index;
103
+ }
104
+ deleteRule(_index) { }
105
+ }
106
+ globalThis.CSSStyleSheet = CSSStyleSheetStub;
107
+ }
108
+ // Patch customElements.define() to ignore re-registrations
109
+ _patchCustomElementsDefine(globalThis.customElements);
110
+ // Import mates
111
+ _matesPath = matesPath ?? null;
112
+ _mates = await _tryImportMates(matesPath ?? "mates");
113
+ if (_mates)
114
+ _matesModuleRef = _mates;
115
+ else
116
+ devWarn("[mates-ssr] Could not import mates. SSR hooks will not work.");
117
+ // Collect SSR styles
118
+ if (_mates && typeof _mates.collectSSRStyles === "function") {
119
+ _ssrStyles = _mates.collectSSRStyles();
120
+ }
121
+ })();
122
+ return _bootPromise;
123
+ }
124
+ /**
125
+ * Try to import the mates module from multiple paths.
126
+ */
127
+ async function _tryImportMates(specifier) {
128
+ try {
129
+ return await import(specifier);
130
+ }
131
+ catch { }
132
+ if (specifier !== "mates") {
133
+ try {
134
+ return await import("mates");
135
+ }
136
+ catch { }
137
+ }
138
+ const g = globalThis;
139
+ if (g.document && !g.document.adoptedStyleSheets) {
140
+ Object.defineProperty(g.document, "adoptedStyleSheets", {
141
+ value: [],
142
+ writable: true,
143
+ configurable: true,
144
+ });
145
+ }
146
+ try {
147
+ return await import(specifier);
148
+ }
149
+ catch { }
150
+ return null;
151
+ }
152
+ /**
153
+ * Returns the CSS string collected from all stylesheet() and globalCSS()
154
+ * Tear down the boot window. Call this when the server is shutting down.
155
+ */
156
+ export function shutdownRenderer() {
157
+ _mates = null;
158
+ _matesPath = null;
159
+ _bootPromise = null;
160
+ _ssrStyles = "";
161
+ }
162
+ /**
163
+ * Returns the CSS string collected from all stylesheet() and globalCSS()
164
+ * instances after bootRenderer() completed. Inject this into the HTML <head>
165
+ * as `<style id="mates-ssr-styles">` to prevent FOUC on first paint.
166
+ */
167
+ export function getSSRStyles() {
168
+ return _ssrStyles;
169
+ }
170
+ // ─── Public render API ────────────────────────────────────────────────────────
171
+ /**
172
+ * Render a Mates Component to an HTML string.
173
+ *
174
+ * Enqueues the render so that globals are never mutated concurrently.
175
+ * Resolves with a clean HTML string (lit-html comment markers stripped).
176
+ *
177
+ * @example
178
+ * const { html } = await renderToString(MyPage, { pathname: '/about', props: {} });
179
+ */
180
+ export async function renderToString(component, options) {
181
+ if (!_mates) {
182
+ throw new Error("mates-ssr: renderer not booted. Call bootRenderer() at server startup before rendering.");
183
+ }
184
+ // Template engine: no queue, fully concurrent
185
+ return _doRender(component, options);
186
+ }
187
+ /**
188
+ * Register a callback to be called on every render completion.
189
+ * Used by devtools / HMR.
190
+ */
191
+ export function onRenderComplete(cb) {
192
+ _renderCompleteCallbacks.push(cb);
193
+ }
194
+ let _renderCompleteCallbacks = [];
195
+ function _notifyRenderComplete() {
196
+ for (const cb of _renderCompleteCallbacks) {
197
+ try {
198
+ cb();
199
+ }
200
+ catch {
201
+ /* ignore */
202
+ }
203
+ }
204
+ }
205
+ // ─── Fake SSR host ────────────────────────────────────────────────────────────
206
+ /**
207
+ * Build a minimal fake host object that satisfies all Mates hook internals
208
+ * (useState, onMount, onCleanup, atom, memo, etc.) during an SSR render.
209
+ *
210
+ * The real host is an x-x HTMLElement. On the server we have no DOM custom
211
+ * element, so we provide a plain object with the same shape that the hook
212
+ * implementations actually read/write.
213
+ *
214
+ * Hooks that schedule side-effects (onMount, onPaint, onCleanup) store their
215
+ * callbacks on the host but never fire them server-side — which is correct:
216
+ * these are DOM lifecycle hooks and only make sense in the browser.
217
+ */
218
+ function _makeFakeHost() {
219
+ const cleanups = new Map();
220
+ const noop = () => { };
221
+ // Minimal event object that satisfies DOMReadyEvent / PaintEvent
222
+ const makeEvent = () => ({
223
+ __subscribe: () => noop,
224
+ trigger: noop,
225
+ hasSubscribers: false,
226
+ cleanupAndClearSubs: noop,
227
+ });
228
+ return {
229
+ // ── Identity ────────────────────────────────────────────────────────────
230
+ componentId: Math.random(),
231
+ name: "SSRHost",
232
+ isConnected: false,
233
+ // ── Host stack API (read by getCurrentHost) ──────────────────────────
234
+ _setupStack: [],
235
+ _setupIndex: 0,
236
+ _useStates: [],
237
+ // ── Cleanup registry (used by useState, onMount, onCleanup, etc.) ───
238
+ cleanups,
239
+ addToCleanUps(key, fn) {
240
+ const existing = cleanups.get(key);
241
+ if (existing)
242
+ existing.push(fn);
243
+ else
244
+ cleanups.set(key, [fn]);
245
+ },
246
+ // ── Async SSR queues ─────────────────────────────────────────────────
247
+ // Collected during the setup (outer fn) phase and drained — in parallel —
248
+ // after setup completes but BEFORE the template function runs.
249
+ //
250
+ // _asyncMountQueue: populated by onMount(async fn) when isSSR() is true.
251
+ // Each entry is an async function registered via onMount.
252
+ //
253
+ // _ssrPromiseQueue: populated by asyncAction's executeAction when isSSR()
254
+ // is true and the action is invoked during setup. Each entry is the
255
+ // live Promise returned by that executeAction call — the action is
256
+ // already running; we just need to wait for it to settle.
257
+ //
258
+ // Both are awaited via Promise.all before templateFn() is called, so
259
+ // any state mutations made inside these async fns are already applied
260
+ // when the HTML is serialized.
261
+ _asyncMountQueue: [],
262
+ _ssrPromiseQueue: [],
263
+ // ── Lifecycle events (no-op on server) ───────────────────────────────
264
+ DOMReadyEvent: makeEvent(),
265
+ PaintEvent: makeEvent(),
266
+ // ── Per-update callbacks (no-op on server) ───────────────────────────
267
+ onEachUpdateCallbacks: new Set(),
268
+ onEachUpdate(cb) {
269
+ this.onEachUpdateCallbacks.add(cb);
270
+ },
271
+ // ── Scopes ────────────────────────────────────────────────────────────
272
+ scopes: new Map(),
273
+ addScope(cls, instance) {
274
+ this.scopes.set(cls, instance);
275
+ },
276
+ // ── Error handlers ────────────────────────────────────────────────────
277
+ _errorHandlers: [],
278
+ _errorState: null,
279
+ // ── Depth (used by scheduler — irrelevant on server) ─────────────────
280
+ _depth: 0,
281
+ _parentComponent: null,
282
+ _renderVersion: 0,
283
+ };
284
+ }
285
+ // ─── SSR bundle cache ───────────────────────────────────────────────────────
286
+ // In dev mode, App.ts may import .css files. Node.js's native
287
+ // ESM loader can't handle these. We use esbuild to pre-bundle the app entry
288
+ // point for SSR with stylesheets stubbed out as empty modules, then import
289
+ // the bundled JS file instead. This matches what buildServerRuntime() does
290
+ // for production — just done on-demand with a mtime-based cache.
291
+ /** appFile → { bundlePath, mtime } */
292
+ const _ssrBundleCache = new Map();
293
+ /** Walk up from appFile's directory to find the nearest package.json root. */
294
+ function _getProjectRoot(appFile) {
295
+ let dir = path.dirname(appFile);
296
+ while (true) {
297
+ if (fs.existsSync(path.join(dir, "package.json")))
298
+ return dir;
299
+ const parent = path.dirname(dir);
300
+ if (parent === dir)
301
+ return path.dirname(appFile); // filesystem root fallback
302
+ dir = parent;
303
+ }
304
+ }
305
+ async function _bundleAppForSSR(appFile, projectRoot, force = false) {
306
+ const stat = fs.statSync(appFile);
307
+ // Also invalidate when the SSR engine itself changes
308
+ const selfPath = new URL(import.meta.url).pathname;
309
+ let selfMtime = 0;
310
+ try {
311
+ selfMtime = fs.statSync(selfPath).mtimeMs;
312
+ }
313
+ catch {
314
+ /* ignore */
315
+ }
316
+ const cached = _ssrBundleCache.get(appFile);
317
+ if (!force &&
318
+ cached &&
319
+ cached.mtime === stat.mtimeMs &&
320
+ cached.selfMtime === selfMtime)
321
+ return cached.bundlePath;
322
+ const { build } = await import("esbuild");
323
+ const tempDir = path.join(projectRoot, ".mates-dev");
324
+ fs.mkdirSync(tempDir, { recursive: true });
325
+ const hash = crypto
326
+ .createHash("md5")
327
+ .update(appFile)
328
+ .digest("hex")
329
+ .slice(0, 8);
330
+ const outFile = path.join(tempDir, `App-ssr-${hash}.mjs`);
331
+ await build({
332
+ entryPoints: [appFile],
333
+ outfile: outFile,
334
+ bundle: true,
335
+ platform: "node",
336
+ format: "esm",
337
+ // Keep all node_modules (mates, lit-html, etc.) as external bare
338
+ // imports so Node.js uses its cached module instances — this is
339
+ // critical for withHost()/getCurrentHost() and pathAtom identity.
340
+ packages: "external",
341
+ // Stub all stylesheets — CSS has no effect during SSR.
342
+ plugins: [_ssrRpcStubPlugin(projectRoot), ssrAssetStubPlugin()],
343
+ logLevel: "silent",
344
+ });
345
+ _ssrBundleCache.set(appFile, {
346
+ bundlePath: outFile,
347
+ mtime: stat.mtimeMs,
348
+ selfMtime,
349
+ });
350
+ return outFile;
351
+ }
352
+ function _ssrRpcStubPlugin(projectRoot) {
353
+ const apiDir = path.join(projectRoot, "server", "api");
354
+ const distApiDir = path.join(projectRoot, "dist", "server", "api");
355
+ if (!fs.existsSync(apiDir))
356
+ return { name: "mates-ssr-rpc-stub", setup() { } };
357
+ // Use package import paths so esbuild resolves through package.json exports.
358
+ // file:// URLs get mapped to the package boundary and lose the named export.
359
+ const rpcRegistryUrl = "mates-fullstack/internal";
360
+ const ssrContextUrl = "mates-fullstack/internal";
361
+ const normalApiDir = path.resolve(apiDir);
362
+ const normalDistApiDir = path.resolve(distApiDir);
363
+ function isInApiDir(filePath) {
364
+ const resolved = path.resolve(filePath);
365
+ return (resolved === normalApiDir ||
366
+ resolved.startsWith(normalApiDir + path.sep) ||
367
+ (normalDistApiDir !== normalApiDir &&
368
+ (resolved === normalDistApiDir ||
369
+ resolved.startsWith(normalDistApiDir + path.sep))));
370
+ }
371
+ return {
372
+ name: "mates-ssr-rpc-stub",
373
+ setup(builder) {
374
+ builder.onLoad({ filter: /\.(ts|tsx|js|jsx|mjs)$/ }, (args) => {
375
+ const filePath = path.resolve(args.path);
376
+ if (!isInApiDir(filePath)) {
377
+ return undefined;
378
+ }
379
+ const source = fs.readFileSync(filePath, "utf-8");
380
+ const names = _extractSsrRpcExportNames(source);
381
+ const lines = [
382
+ `import { lookupRpcFn } from ${JSON.stringify(rpcRegistryUrl)};`,
383
+ `import { getSSRContext } from ${JSON.stringify(ssrContextUrl)};`,
384
+ "",
385
+ ];
386
+ for (const name of names) {
387
+ const url = _deriveSsrRpcUrl(normalApiDir, filePath, name);
388
+ lines.push(`export async function ${name}(payload = {}) {`, ` const entry = lookupRpcFn(${JSON.stringify(url)});`, ` if (!entry) throw new Error(${JSON.stringify(`[mates-fullstack] SSR RPC function not found: ${url}`)});`, ` const ssrCtx = getSSRContext();`, ` const auth = ssrCtx?.auth ?? null;`, ` return entry.fn(payload, { auth });`, `}`, "");
389
+ }
390
+ if (names.length > 0) {
391
+ lines.unshift(`// mates-ssr RPC stub: ${path.relative(normalApiDir, filePath)}`);
392
+ }
393
+ return { contents: lines.join("\n"), loader: "js" };
394
+ });
395
+ },
396
+ };
397
+ }
398
+ function _extractSsrRpcExportNames(source) {
399
+ const names = [];
400
+ const seen = new Set();
401
+ const add = (name) => {
402
+ if (seen.has(name))
403
+ return;
404
+ seen.add(name);
405
+ names.push(name);
406
+ };
407
+ let m;
408
+ const fnPat = /^export\s+async\s+function\s+(\w+)\s*\(/gm;
409
+ while ((m = fnPat.exec(source)) !== null)
410
+ add(m[1]);
411
+ const constPat = /^export\s+const\s+(\w+)\s*=\s*async\b/gm;
412
+ while ((m = constPat.exec(source)) !== null)
413
+ add(m[1]);
414
+ return names;
415
+ }
416
+ function _deriveSsrRpcUrl(apiDir, filePath, fnName) {
417
+ const rel = path.relative(apiDir, filePath);
418
+ const withoutExt = rel.replace(/\.(ts|js|tsx|jsx|mjs)$/, "");
419
+ let modulePath = withoutExt.split(path.sep).join("/");
420
+ if (modulePath.endsWith("/index"))
421
+ modulePath = modulePath.slice(0, -6);
422
+ else if (modulePath === "index")
423
+ modulePath = "";
424
+ return modulePath ? `/api/${modulePath}/${fnName}` : `/api/${fnName}`;
425
+ }
426
+ /**
427
+ * Stub all asset imports (.svg, .png, .jpg, .css, etc.) in the SSR bundle
428
+ * so esbuild doesn't fail resolving them. Assets have no effect in SSR — the
429
+ * browser resolves the real URLs during hydration.
430
+ */
431
+ function ssrAssetStubPlugin() {
432
+ const STUB_RE = /\.(css|svg|png|jpe?g|gif|webp|avif|ico|bmp|tiff|woff2?|ttf|otf|eot|mp4|webm|ogg|mov|avi|mkv|mp3|wav|flac|aac|m4a|opus|pdf|docx?|xlsx?|pptx?|txt|csv|glb|gltf|obj|fbx|wasm|json5|geojson|toml|ya?ml|zip|tar|gz)$/i;
433
+ return {
434
+ name: "mates-ssr-asset-stub",
435
+ setup(builder) {
436
+ builder.onLoad({ filter: STUB_RE }, () => ({
437
+ contents: "export default {};",
438
+ loader: "js",
439
+ }));
440
+ },
441
+ };
442
+ }
443
+ // ─── Internal render (App-based) ────────────────────────────────────────────
444
+ /**
445
+ * Import App.ts and render it with pathAtom set to pathname.
446
+ * Called inside the render queue — globals are patched before this runs.
447
+ */
448
+ async function _doRenderApp(appFile, pathname, dev, ssrTimeoutMs) {
449
+ // In dev mode, App.ts may import .css files. Node.js can't load
450
+ // those natively. We pre-bundle with esbuild (stylesheets stubbed as
451
+ // empty modules) and import the bundled output instead.
452
+ // In production, buildServerRuntime() already handled this.
453
+ const projectRoot = _getProjectRoot(appFile);
454
+ const importPath = dev
455
+ ? `${await _bundleAppForSSR(appFile, projectRoot, true)}?t=${Date.now()}`
456
+ : appFile;
457
+ let mod;
458
+ try {
459
+ mod = await import(importPath);
460
+ }
461
+ catch (err) {
462
+ throw new Error(`Failed to import ${appFile}: ${err?.message ?? err}`);
463
+ }
464
+ const comp = (mod.default ?? mod.App);
465
+ if (!comp || typeof comp !== "function") {
466
+ throw new Error(`${appFile} must have a default export that is a Mates component function.`);
467
+ }
468
+ return _doRender(comp, { pathname, ssrTimeoutMs });
469
+ }
470
+ // ─── Template SSR engine (no DOM, no queue, concurrent) ────────────────────
471
+ async function _doRender(component, { pathname, props = {}, layout = null, ssrTimeoutMs = DEFAULT_SSR_TIMEOUT_MS, }) {
472
+ // ── Build props accessor ─────────────────────────────────────────────
473
+ const propsFn = () => props;
474
+ // ── Push a fake host context ─────────────────────────────────────────
475
+ // Same as _doRender — satisfies hook internals without a real DOM element.
476
+ let templateFn = null;
477
+ let fakeHost = null;
478
+ if (_mates?.withHost) {
479
+ fakeHost = _makeFakeHost();
480
+ templateFn = _mates.withHost(fakeHost, () => component(propsFn));
481
+ }
482
+ else {
483
+ templateFn = component(propsFn);
484
+ }
485
+ if (typeof templateFn !== "function") {
486
+ throw new Error(`mates-ssr: component "${component.name || "Anonymous"}" did not return a template function. ` +
487
+ `Make sure your component follows the pattern: (props) => () => html\`...\``);
488
+ }
489
+ const deadline = Date.now() + ssrTimeoutMs;
490
+ const assertDeadline = () => {
491
+ if (Date.now() > deadline) {
492
+ throw new Error(`SSR render timed out after ${ssrTimeoutMs}ms waiting for async work`);
493
+ }
494
+ };
495
+ function hasPendingSsrWork() {
496
+ return ((_mates?.getSsrAsyncCounter?.() ?? 0) > 0 ||
497
+ (fakeHost?._asyncMountQueue?.length ?? 0) > 0 ||
498
+ (fakeHost?._ssrPromiseQueue?.length ?? 0) > 0);
499
+ }
500
+ // ── SSR context for ssrTemplate ──────────────────────────────────────
501
+ // rootHost is set so child x-view components push their async work
502
+ // into the root host, where the drain loop can process it.
503
+ const ssrCtx = {
504
+ mates: _mates,
505
+ makeFakeHost: _makeFakeHost,
506
+ rootHost: fakeHost ?? undefined,
507
+ componentCache: new Map(),
508
+ };
509
+ // ── Async drain loop (same pattern as happy-dom, but no DOM) ────────
510
+ // Replaces: render(result, container) → waitForSsrIdle() → container.innerHTML
511
+ // With: ssrTemplate(result, ctx) → waitForSsrIdle() → ssrTemplate() again
512
+ async function waitForSsrDoneSignal() {
513
+ await new Promise((resolve, reject) => {
514
+ const remaining = Math.max(0, deadline - Date.now());
515
+ if (remaining <= 0) {
516
+ resolve();
517
+ return;
518
+ }
519
+ const timer = setTimeout(() => reject(new Error(`SSR render timed out after ${ssrTimeoutMs}ms waiting for async work`)), remaining);
520
+ const done = () => {
521
+ clearTimeout(timer);
522
+ resolve();
523
+ };
524
+ if (_mates?.setSsrDoneCallback)
525
+ _mates.setSsrDoneCallback(done);
526
+ else
527
+ done();
528
+ });
529
+ }
530
+ async function drainWork(observedWorkBefore) {
531
+ let didDrain = observedWorkBefore;
532
+ while (true) {
533
+ assertDeadline();
534
+ // Execute queued onMount(async) callbacks
535
+ if (fakeHost?._asyncMountQueue?.length) {
536
+ didDrain = true;
537
+ const fns = fakeHost._asyncMountQueue.splice(0);
538
+ for (const fn of fns) {
539
+ try {
540
+ const p = fn();
541
+ if (p && typeof p.then === "function") {
542
+ fakeHost._ssrPromiseQueue.push(p);
543
+ }
544
+ }
545
+ catch {
546
+ /* ignore */
547
+ }
548
+ }
549
+ }
550
+ await new Promise((r) => setTimeout(r, 1));
551
+ const counter = _mates?.getSsrAsyncCounter?.() ?? 0;
552
+ const queued = fakeHost?._ssrPromiseQueue ?? [];
553
+ if (counter === 0 && queued.length === 0)
554
+ return didDrain;
555
+ const pending = queued.splice(0);
556
+ if (pending.length > 0) {
557
+ didDrain = true;
558
+ await Promise.allSettled(pending);
559
+ }
560
+ if ((_mates?.getSsrAsyncCounter?.() ?? 0) > 0) {
561
+ didDrain = true;
562
+ await waitForSsrDoneSignal();
563
+ }
564
+ }
565
+ }
566
+ // ── Render loop ────────────────────────────────────────────────────
567
+ let html = "";
568
+ let iteration = 0;
569
+ while (true) {
570
+ iteration++;
571
+ const result = templateFn();
572
+ if (!result) {
573
+ html = "";
574
+ break;
575
+ }
576
+ // Serialize directly from TemplateResult — no DOM involved
577
+ html = ssrTemplate(result, ssrCtx);
578
+ // Drain async work. First iteration always checks — asyncAction/fetch
579
+ // may start AND complete during templateFn() before we check the counter.
580
+ // Setting observedBefore=true on first render ensures we always wait
581
+ // and re-serialize once, capturing data loaded by fast async work.
582
+ const didDrain = await drainWork(iteration === 1);
583
+ await new Promise((r) => setTimeout(r, 1));
584
+ if (!didDrain && !hasPendingSsrWork())
585
+ break;
586
+ assertDeadline();
587
+ }
588
+ // ── Wrap in layout if provided ───────────────────────────────────────
589
+ if (layout && _mates?.withHost) {
590
+ const layoutHost = _makeFakeHost();
591
+ const layoutPropsFn = () => ({ children: html, ...props });
592
+ const layoutTemplateFn = _mates.withHost(layoutHost, () => layout(layoutPropsFn));
593
+ if (typeof layoutTemplateFn === "function") {
594
+ const layoutResult = layoutTemplateFn();
595
+ if (layoutResult) {
596
+ html = ssrTemplate(layoutResult, ssrCtx);
597
+ }
598
+ }
599
+ }
600
+ // ── Collect SSR styles ───────────────────────────────────────────────
601
+ const styles = _mates && typeof _mates.collectSSRStyles === "function"
602
+ ? _mates.collectSSRStyles()
603
+ : _ssrStyles;
604
+ return { html, styles };
605
+ }
606
+ // ─── customElements.define() guard ───────────────────────────────────────────
607
+ /**
608
+ * Wrap customElements.define() so that re-registering an already-known name
609
+ * is a silent no-op instead of a DOMException.
610
+ *
611
+ * Why: Dynamic imports can re-evaluate modules. Mates calls
612
+ * customElements.define('x-x', ...) and customElements.define('x-provider', ...)
613
+ * at module level. On the first import those succeed; on re-evaluation the
614
+ * names are already registered and define() throws. We guard here.
615
+ */
616
+ function _patchCustomElementsDefine(registry) {
617
+ if (!registry || registry.__matesSSRPatched__)
618
+ return;
619
+ const originalDefine = registry.define.bind(registry);
620
+ registry.define = function define(name, constructor, options) {
621
+ if (registry.get(name))
622
+ return;
623
+ try {
624
+ originalDefine(name, constructor, options);
625
+ }
626
+ catch { }
627
+ };
628
+ registry.__matesSSRPatched__ = true;
629
+ }
630
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * mates-fullstack — request-logger.ts
3
+ *
4
+ * Drop-in request/response logging middleware.
5
+ * Logs every incoming request and framework-managed REST/RPC responses.
6
+ */
7
+ export interface RequestLoggerOptions {
8
+ /** Paths matching any of these patterns are not logged. */
9
+ skip?: RegExp[];
10
+ }
11
+ export declare function requestLogger(options?: RequestLoggerOptions): void;
12
+ //# sourceMappingURL=request-logger.d.ts.map