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.
- package/README.md +311 -0
- package/dist/arctic-auth.d.ts +101 -0
- package/dist/arctic-auth.d.ts.map +1 -0
- package/dist/arctic-auth.js +538 -0
- package/dist/arctic-auth.js.map +1 -0
- package/dist/asset-manifest.d.ts +14 -0
- package/dist/asset-manifest.d.ts.map +1 -0
- package/dist/asset-manifest.js +102 -0
- package/dist/asset-manifest.js.map +1 -0
- package/dist/browser.d.ts +18 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +25 -0
- package/dist/browser.js.map +1 -0
- package/dist/build-esbuild.d.ts +29 -0
- package/dist/build-esbuild.d.ts.map +1 -0
- package/dist/build-esbuild.js +699 -0
- package/dist/build-esbuild.js.map +1 -0
- package/dist/build-prod.d.ts +126 -0
- package/dist/build-prod.d.ts.map +1 -0
- package/dist/build-prod.js +1014 -0
- package/dist/build-prod.js.map +1 -0
- package/dist/cli-new.d.ts +14 -0
- package/dist/cli-new.d.ts.map +1 -0
- package/dist/cli-new.js +637 -0
- package/dist/cli-new.js.map +1 -0
- package/dist/client.d.ts +43 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +130 -0
- package/dist/client.js.map +1 -0
- package/dist/cors.d.ts +16 -0
- package/dist/cors.d.ts.map +1 -0
- package/dist/cors.js +60 -0
- package/dist/cors.js.map +1 -0
- package/dist/ctx.d.ts +78 -0
- package/dist/ctx.d.ts.map +1 -0
- package/dist/ctx.js +280 -0
- package/dist/ctx.js.map +1 -0
- package/dist/dev-watcher.d.ts +23 -0
- package/dist/dev-watcher.d.ts.map +1 -0
- package/dist/dev-watcher.js +136 -0
- package/dist/dev-watcher.js.map +1 -0
- package/dist/docs-generator.d.ts +69 -0
- package/dist/docs-generator.d.ts.map +1 -0
- package/dist/docs-generator.js +557 -0
- package/dist/docs-generator.js.map +1 -0
- package/dist/docs-page.d.ts +20 -0
- package/dist/docs-page.d.ts.map +1 -0
- package/dist/docs-page.js +1152 -0
- package/dist/docs-page.js.map +1 -0
- package/dist/download.d.ts +78 -0
- package/dist/download.d.ts.map +1 -0
- package/dist/download.js +202 -0
- package/dist/download.js.map +1 -0
- package/dist/env-loader.d.ts +76 -0
- package/dist/env-loader.d.ts.map +1 -0
- package/dist/env-loader.js +213 -0
- package/dist/env-loader.js.map +1 -0
- package/dist/errors.d.ts +146 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +386 -0
- package/dist/errors.js.map +1 -0
- package/dist/head.d.ts +31 -0
- package/dist/head.d.ts.map +1 -0
- package/dist/head.js +245 -0
- package/dist/head.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/internal-prefixes.d.ts +16 -0
- package/dist/internal-prefixes.d.ts.map +1 -0
- package/dist/internal-prefixes.js +16 -0
- package/dist/internal-prefixes.js.map +1 -0
- package/dist/internal.d.ts +25 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +25 -0
- package/dist/internal.js.map +1 -0
- package/dist/jwt.d.ts +166 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +261 -0
- package/dist/jwt.js.map +1 -0
- package/dist/log.d.ts +44 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +66 -0
- package/dist/log.js.map +1 -0
- package/dist/logger.d.ts +76 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +138 -0
- package/dist/logger.js.map +1 -0
- package/dist/main-runner.d.ts +59 -0
- package/dist/main-runner.d.ts.map +1 -0
- package/dist/main-runner.js +157 -0
- package/dist/main-runner.js.map +1 -0
- package/dist/mates-auth.d.ts +82 -0
- package/dist/mates-auth.d.ts.map +1 -0
- package/dist/mates-auth.js +323 -0
- package/dist/mates-auth.js.map +1 -0
- package/dist/middleware.d.ts +30 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +67 -0
- package/dist/middleware.js.map +1 -0
- package/dist/project-resolver.d.ts +102 -0
- package/dist/project-resolver.d.ts.map +1 -0
- package/dist/project-resolver.js +271 -0
- package/dist/project-resolver.js.map +1 -0
- package/dist/rate-limit.d.ts +37 -0
- package/dist/rate-limit.d.ts.map +1 -0
- package/dist/rate-limit.js +109 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/redirect.d.ts +84 -0
- package/dist/redirect.d.ts.map +1 -0
- package/dist/redirect.js +105 -0
- package/dist/redirect.js.map +1 -0
- package/dist/renderer.d.ts +91 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +630 -0
- package/dist/renderer.js.map +1 -0
- package/dist/request-logger.d.ts +12 -0
- package/dist/request-logger.d.ts.map +1 -0
- package/dist/request-logger.js +55 -0
- package/dist/request-logger.js.map +1 -0
- package/dist/rest.d.ts +25 -0
- package/dist/rest.d.ts.map +1 -0
- package/dist/rest.js +93 -0
- package/dist/rest.js.map +1 -0
- package/dist/router.d.ts +71 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +222 -0
- package/dist/router.js.map +1 -0
- package/dist/rpc-registry.d.ts +84 -0
- package/dist/rpc-registry.d.ts.map +1 -0
- package/dist/rpc-registry.js +271 -0
- package/dist/rpc-registry.js.map +1 -0
- package/dist/rpc-runner.d.ts +82 -0
- package/dist/rpc-runner.d.ts.map +1 -0
- package/dist/rpc-runner.js +564 -0
- package/dist/rpc-runner.js.map +1 -0
- package/dist/sanitize.d.ts +61 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +193 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/security-headers.d.ts +114 -0
- package/dist/security-headers.d.ts.map +1 -0
- package/dist/security-headers.js +121 -0
- package/dist/security-headers.js.map +1 -0
- package/dist/server-fn.d.ts +323 -0
- package/dist/server-fn.d.ts.map +1 -0
- package/dist/server-fn.js +373 -0
- package/dist/server-fn.js.map +1 -0
- package/dist/server-public.d.ts +13 -0
- package/dist/server-public.d.ts.map +1 -0
- package/dist/server-public.js +12 -0
- package/dist/server-public.js.map +1 -0
- package/dist/server-timeout.d.ts +38 -0
- package/dist/server-timeout.d.ts.map +1 -0
- package/dist/server-timeout.js +46 -0
- package/dist/server-timeout.js.map +1 -0
- package/dist/server.d.ts +100 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1218 -0
- package/dist/server.js.map +1 -0
- package/dist/socket-router.d.ts +153 -0
- package/dist/socket-router.d.ts.map +1 -0
- package/dist/socket-router.js +612 -0
- package/dist/socket-router.js.map +1 -0
- package/dist/sso.d.ts +90 -0
- package/dist/sso.d.ts.map +1 -0
- package/dist/sso.js +261 -0
- package/dist/sso.js.map +1 -0
- package/dist/ssr-context.d.ts +49 -0
- package/dist/ssr-context.d.ts.map +1 -0
- package/dist/ssr-context.js +85 -0
- package/dist/ssr-context.js.map +1 -0
- package/dist/ssr-globals.d.ts +32 -0
- package/dist/ssr-globals.d.ts.map +1 -0
- package/dist/ssr-globals.js +1010 -0
- package/dist/ssr-globals.js.map +1 -0
- package/dist/ssr-template.d.ts +73 -0
- package/dist/ssr-template.d.ts.map +1 -0
- package/dist/ssr-template.js +507 -0
- package/dist/ssr-template.js.map +1 -0
- package/dist/stack-mapper.d.ts +25 -0
- package/dist/stack-mapper.d.ts.map +1 -0
- package/dist/stack-mapper.js +139 -0
- package/dist/stack-mapper.js.map +1 -0
- package/dist/stream.d.ts +89 -0
- package/dist/stream.d.ts.map +1 -0
- package/dist/stream.js +299 -0
- package/dist/stream.js.map +1 -0
- package/dist/upload.d.ts +69 -0
- package/dist/upload.d.ts.map +1 -0
- package/dist/upload.js +110 -0
- package/dist/upload.js.map +1 -0
- package/dist/validate.d.ts +58 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +89 -0
- package/dist/validate.js.map +1 -0
- package/dist/verify-package.d.ts +3 -0
- package/dist/verify-package.d.ts.map +1 -0
- package/dist/verify-package.js +128 -0
- package/dist/verify-package.js.map +1 -0
- package/package.json +79 -0
package/dist/renderer.js
ADDED
|
@@ -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
|