@absolutejs/absolute 0.19.0-beta.4 → 0.19.0-beta.41
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/.absolutejs/tsconfig.tsbuildinfo +1 -1
- package/.claude/settings.local.json +23 -1
- package/dist/build.js +633 -59
- package/dist/build.js.map +13 -10
- package/dist/cli/index.js +29 -1
- package/dist/dev/client/frameworkDetect.ts +1 -2
- package/dist/dev/client/handlers/react.ts +96 -4
- package/dist/index.js +897 -209
- package/dist/index.js.map +17 -13
- package/dist/react/index.js +86 -1
- package/dist/react/index.js.map +5 -4
- package/dist/src/build/buildDepVendor.d.ts +2 -0
- package/dist/src/dev/clientManager.d.ts +2 -0
- package/dist/src/dev/moduleServer.d.ts +11 -0
- package/dist/src/dev/ssrRenderer.d.ts +7 -0
- package/dist/src/dev/ssrWorker.d.ts +0 -0
- package/dist/src/dev/transformCache.d.ts +4 -0
- package/dist/src/plugins/hmr.d.ts +1 -1
- package/dist/ssrWorker.ts +55 -0
- package/dist/types/messages.d.ts +5 -1
- package/native/packages/darwin-arm64/fast_ops.dylib +0 -0
- package/native/packages/darwin-arm64/package.json +1 -1
- package/native/packages/darwin-x64/fast_ops.dylib +0 -0
- package/native/packages/darwin-x64/package.json +1 -1
- package/native/packages/linux-arm64/package.json +1 -1
- package/native/packages/linux-x64/fast_ops.so +0 -0
- package/native/packages/linux-x64/package.json +1 -1
- package/package.json +6 -6
- package/types/globals.d.ts +1 -0
- package/types/messages.ts +7 -1
- package/types/typeGuards.ts +2 -0
package/dist/react/index.js
CHANGED
|
@@ -98,10 +98,95 @@ body{min-height:100vh;background:linear-gradient(135deg,rgba(15,23,42,0.98) 0%,r
|
|
|
98
98
|
</html>`;
|
|
99
99
|
};
|
|
100
100
|
|
|
101
|
+
// src/dev/ssrRenderer.ts
|
|
102
|
+
var exports_ssrRenderer = {};
|
|
103
|
+
__export(exports_ssrRenderer, {
|
|
104
|
+
renderInWorker: () => renderInWorker
|
|
105
|
+
});
|
|
106
|
+
import { resolve } from "path";
|
|
107
|
+
var worker = null, requestId = 0, pending, getWorker = () => {
|
|
108
|
+
if (worker)
|
|
109
|
+
return worker;
|
|
110
|
+
const workerPath = resolve(import.meta.dir, "ssrWorker.ts");
|
|
111
|
+
worker = new Worker(workerPath, { cwd: process.cwd() });
|
|
112
|
+
worker.onmessage = (event) => {
|
|
113
|
+
const { id, ok, html, error } = event.data;
|
|
114
|
+
const req = pending.get(id);
|
|
115
|
+
if (!req)
|
|
116
|
+
return;
|
|
117
|
+
pending.delete(id);
|
|
118
|
+
if (ok) {
|
|
119
|
+
req.resolve(html);
|
|
120
|
+
} else {
|
|
121
|
+
req.reject(new Error(error ?? "SSR render failed"));
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
worker.onerror = (event) => {
|
|
125
|
+
console.error("[SSR Worker] Error:", event);
|
|
126
|
+
for (const [id, req] of pending) {
|
|
127
|
+
req.reject(new Error("SSR worker crashed"));
|
|
128
|
+
pending.delete(id);
|
|
129
|
+
}
|
|
130
|
+
worker = null;
|
|
131
|
+
};
|
|
132
|
+
return worker;
|
|
133
|
+
}, renderInWorker = (request) => new Promise((resolvePromise, rejectPromise) => {
|
|
134
|
+
const id = ++requestId;
|
|
135
|
+
pending.set(id, {
|
|
136
|
+
reject: rejectPromise,
|
|
137
|
+
resolve: resolvePromise
|
|
138
|
+
});
|
|
139
|
+
const w = getWorker();
|
|
140
|
+
w.postMessage({
|
|
141
|
+
componentPath: resolve(request.componentPath),
|
|
142
|
+
id,
|
|
143
|
+
indexPath: request.indexPath,
|
|
144
|
+
props: request.props
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
var init_ssrRenderer = __esm(() => {
|
|
148
|
+
pending = new Map;
|
|
149
|
+
});
|
|
150
|
+
|
|
101
151
|
// src/react/pageHandler.ts
|
|
152
|
+
var isDev = process.env["NODE_ENV"] === "development";
|
|
153
|
+
var findComponentPath = (component) => {
|
|
154
|
+
const name = component.displayName ?? component.name;
|
|
155
|
+
if (!name)
|
|
156
|
+
return null;
|
|
157
|
+
const config = globalThis.__hmrDevResult?.hmrState?.config;
|
|
158
|
+
const reactDir = config?.reactDirectory;
|
|
159
|
+
if (!reactDir)
|
|
160
|
+
return null;
|
|
161
|
+
const { resolve: resolve2, join } = __require("path");
|
|
162
|
+
const { existsSync } = __require("fs");
|
|
163
|
+
const pagesDir = resolve2(reactDir, "pages");
|
|
164
|
+
for (const ext of [".tsx", ".jsx", ".ts"]) {
|
|
165
|
+
const candidate = join(pagesDir, `${name}${ext}`);
|
|
166
|
+
if (existsSync(candidate))
|
|
167
|
+
return candidate;
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
};
|
|
102
171
|
var handleReactPageRequest = async (PageComponent, index, ...props) => {
|
|
103
172
|
try {
|
|
104
173
|
const [maybeProps] = props;
|
|
174
|
+
if (isDev) {
|
|
175
|
+
const componentPath = findComponentPath(PageComponent);
|
|
176
|
+
if (componentPath) {
|
|
177
|
+
try {
|
|
178
|
+
const { renderInWorker: renderInWorker2 } = await Promise.resolve().then(() => (init_ssrRenderer(), exports_ssrRenderer));
|
|
179
|
+
const html = await renderInWorker2({
|
|
180
|
+
componentPath,
|
|
181
|
+
indexPath: index,
|
|
182
|
+
props: maybeProps
|
|
183
|
+
});
|
|
184
|
+
return new Response(html, {
|
|
185
|
+
headers: { "Content-Type": "text/html" }
|
|
186
|
+
});
|
|
187
|
+
} catch {}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
105
190
|
const { createElement } = await import("react");
|
|
106
191
|
const { renderToReadableStream } = await import("react-dom/server");
|
|
107
192
|
const element = maybeProps !== undefined ? createElement(PageComponent, maybeProps) : createElement(PageComponent);
|
|
@@ -128,5 +213,5 @@ export {
|
|
|
128
213
|
handleReactPageRequest
|
|
129
214
|
};
|
|
130
215
|
|
|
131
|
-
//# debugId=
|
|
216
|
+
//# debugId=FD9B1841605D4D8164756E2164756E21
|
|
132
217
|
//# sourceMappingURL=index.js.map
|
package/dist/react/index.js.map
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/utils/ssrErrorPage.ts", "../src/react/pageHandler.ts"],
|
|
3
|
+
"sources": ["../src/utils/ssrErrorPage.ts", "../src/dev/ssrRenderer.ts", "../src/react/pageHandler.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"export const ssrErrorPage = (framework: string, error: unknown) => {\n\tconst frameworkColors: Record<string, string> = {\n\t\tangular: '#dd0031',\n\t\thtml: '#e34c26',\n\t\thtmx: '#1a365d',\n\t\treact: '#61dafb',\n\t\tsvelte: '#ff3e00',\n\t\tvue: '#42b883'\n\t};\n\n\tconst accent = frameworkColors[framework] ?? '#94a3b8';\n\tconst label = framework.charAt(0).toUpperCase() + framework.slice(1);\n\tconst message = error instanceof Error ? error.message : String(error);\n\n\treturn `<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>SSR Error - AbsoluteJS</title>\n<style>\n*{margin:0;padding:0;box-sizing:border-box}\nbody{min-height:100vh;background:linear-gradient(135deg,rgba(15,23,42,0.98) 0%,rgba(30,41,59,0.98) 100%);color:#e2e8f0;font-family:\"JetBrains Mono\",\"Fira Code\",ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:14px;line-height:1.6;display:flex;align-items:flex-start;justify-content:center;padding:32px}\n.card{max-width:720px;width:100%;background:rgba(30,41,59,0.6);border:1px solid rgba(71,85,105,0.5);border-radius:16px;box-shadow:0 25px 50px -12px rgba(0,0,0,0.5),0 0 0 1px rgba(255,255,255,0.05);overflow:hidden}\n.header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:20px 24px;background:rgba(15,23,42,0.5);border-bottom:1px solid rgba(71,85,105,0.4)}\n.brand{font-weight:700;font-size:20px;color:#fff;letter-spacing:-0.02em}\n.badge{padding:5px 10px;border-radius:8px;font-size:12px;font-weight:600;background:${accent};color:#fff;opacity:0.95;box-shadow:0 2px 4px rgba(0,0,0,0.2)}\n.kind{color:#94a3b8;font-size:13px;font-weight:500}\n.content{padding:24px}\n.label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.08em;color:#94a3b8;margin-bottom:8px}\n.message{margin:0;padding:16px 20px;background:rgba(239,68,68,0.12);border:1px solid rgba(239,68,68,0.25);border-radius:10px;overflow-x:auto;white-space:pre-wrap;word-break:break-word;color:#fca5a5;font-size:13px;line-height:1.5}\n.hint{margin-top:20px;padding:12px 20px;background:rgba(71,85,105,0.3);border-radius:10px;border:1px solid rgba(71,85,105,0.4);color:#cbd5e1;font-size:13px}\n</style>\n</head>\n<body>\n<div class=\"card\">\n<div class=\"header\">\n<div style=\"display:flex;align-items:center;gap:12px\">\n<span class=\"brand\">AbsoluteJS</span>\n<span class=\"badge\">${label}</span>\n</div>\n<span class=\"kind\">Server Render Error</span>\n</div>\n<div class=\"content\">\n<div class=\"label\">What went wrong</div>\n<pre class=\"message\">${message.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')}</pre>\n<div class=\"hint\">A component threw during server-side rendering. Check the terminal for the full stack trace.</div>\n</div>\n</div>\n</body>\n</html>`;\n};\n",
|
|
6
|
-
"import
|
|
6
|
+
"import { resolve } from 'node:path';\n\ntype RenderRequest = {\n\tcomponentPath: string;\n\tindexPath: string;\n\tprops?: Record<string, unknown>;\n};\n\ntype PendingRender = {\n\tresolve: (html: string) => void;\n\treject: (error: Error) => void;\n};\n\nlet worker: Worker | null = null;\nlet requestId = 0;\nconst pending = new Map<number, PendingRender>();\n\nconst getWorker = () => {\n\tif (worker) return worker;\n\n\t// Resolve from the package's dist/dev/ directory. The worker runs in\n\t// the user's project context so it can resolve their node_modules.\n\tconst workerPath = resolve(import.meta.dir, 'ssrWorker.ts');\n\tworker = new Worker(workerPath, { cwd: process.cwd() } as ConstructorParameters<typeof Worker>[1]);\n\n\tworker.onmessage = (event) => {\n\t\tconst { id, ok, html, error } = event.data;\n\t\tconst req = pending.get(id);\n\t\tif (!req) return;\n\t\tpending.delete(id);\n\n\t\tif (ok) {\n\t\t\treq.resolve(html);\n\t\t} else {\n\t\t\treq.reject(new Error(error ?? 'SSR render failed'));\n\t\t}\n\t};\n\n\tworker.onerror = (event) => {\n\t\tconsole.error('[SSR Worker] Error:', event);\n\t\t// Reject all pending\n\t\tfor (const [id, req] of pending) {\n\t\t\treq.reject(new Error('SSR worker crashed'));\n\t\t\tpending.delete(id);\n\t\t}\n\t\tworker = null;\n\t};\n\n\treturn worker;\n};\n\nexport const renderInWorker = (request: RenderRequest) =>\n\tnew Promise<string>((resolvePromise, rejectPromise) => {\n\t\tconst id = ++requestId;\n\t\tpending.set(id, {\n\t\t\treject: rejectPromise,\n\t\t\tresolve: resolvePromise\n\t\t});\n\n\t\tconst w = getWorker();\n\t\tw.postMessage({\n\t\t\tcomponentPath: resolve(request.componentPath),\n\t\t\tid,\n\t\t\tindexPath: request.indexPath,\n\t\t\tprops: request.props\n\t\t});\n\t});\n",
|
|
7
|
+
"import type { ComponentType as ReactComponent } from 'react';\nimport { ssrErrorPage } from '../utils/ssrErrorPage';\n\nconst isDev = process.env['NODE_ENV'] === 'development';\n\n// Resolve page component source path from its name for worker SSR\nconst findComponentPath = (component: ReactComponent<Record<string, unknown>>) => {\n\tconst name = component.displayName ?? component.name;\n\tif (!name) return null;\n\n\tconst config = globalThis.__hmrDevResult?.hmrState?.config;\n\tconst reactDir = config?.reactDirectory;\n\tif (!reactDir) return null;\n\n\tconst { resolve, join } = require('node:path');\n\tconst { existsSync } = require('node:fs');\n\tconst pagesDir = resolve(reactDir, 'pages');\n\n\tfor (const ext of ['.tsx', '.jsx', '.ts']) {\n\t\tconst candidate = join(pagesDir, `${name}${ext}`);\n\t\tif (existsSync(candidate)) return candidate;\n\t}\n\n\treturn null;\n};\n\nexport const handleReactPageRequest = async <\n\tProps extends Record<string, unknown> = Record<never, never>\n>(\n\tPageComponent: ReactComponent<Props>,\n\tindex: string,\n\t...props: keyof Props extends never ? [] : [props: NoInfer<Props>]\n) => {\n\ttry {\n\t\tconst [maybeProps] = props;\n\n\t\t// Dev mode: render in a worker to isolate frontend imports\n\t\t// from bun --hot's module graph (prevents server restarts)\n\t\tif (isDev) {\n\t\t\tconst componentPath = findComponentPath(\n\t\t\t\tPageComponent as ReactComponent<Record<string, unknown>>\n\t\t\t);\n\t\t\tif (componentPath) {\n\t\t\t\ttry {\n\t\t\t\t\tconst { renderInWorker } = await import(\n\t\t\t\t\t\t'../dev/ssrRenderer'\n\t\t\t\t\t);\n\t\t\t\t\tconst html = await renderInWorker({\n\t\t\t\t\t\tcomponentPath,\n\t\t\t\t\t\tindexPath: index,\n\t\t\t\t\t\tprops: maybeProps as\n\t\t\t\t\t\t\t| Record<string, unknown>\n\t\t\t\t\t\t\t| undefined\n\t\t\t\t\t});\n\n\t\t\t\t\treturn new Response(html, {\n\t\t\t\t\t\theaders: { 'Content-Type': 'text/html' }\n\t\t\t\t\t});\n\t\t\t\t} catch {\n\t\t\t\t\t// Worker failed — fall through to direct render\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst { createElement } = await import('react');\n\t\tconst { renderToReadableStream } = await import('react-dom/server');\n\n\t\tconst element =\n\t\t\tmaybeProps !== undefined\n\t\t\t\t? createElement(PageComponent, maybeProps)\n\t\t\t\t: createElement(PageComponent);\n\n\t\tconst propsScript = maybeProps\n\t\t\t? `window.__INITIAL_PROPS__=${JSON.stringify(maybeProps)}`\n\t\t\t: '';\n\n\t\tconst stream = await renderToReadableStream(element, {\n\t\t\tbootstrapModules: [index],\n\t\t\tbootstrapScriptContent: propsScript || undefined,\n\t\t\tonError(error: unknown) {\n\t\t\t\tconsole.error('[SSR] React streaming error:', error);\n\t\t\t}\n\t\t});\n\n\t\treturn new Response(stream, {\n\t\t\theaders: { 'Content-Type': 'text/html' }\n\t\t});\n\t} catch (error) {\n\t\tconsole.error('[SSR] React render error:', error);\n\n\t\treturn new Response(ssrErrorPage('react', error), {\n\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\tstatus: 500\n\t\t});\n\t}\n};\n"
|
|
7
8
|
],
|
|
8
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAAa,eAAe,CAAC,WAAmB,UAAmB;AAAA,EAClE,MAAM,kBAA0C;AAAA,IAC/C,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,EACN;AAAA,EAEA,MAAM,SAAS,gBAAgB,cAAc;AAAA,EAC7C,MAAM,QAAQ,UAAU,OAAO,CAAC,EAAE,YAAY,IAAI,UAAU,MAAM,CAAC;AAAA,EACnE,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,EAErE,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sFAY8E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAahE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAMC,QAAQ,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;
|
|
9
|
-
"debugId": "
|
|
9
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAAa,eAAe,CAAC,WAAmB,UAAmB;AAAA,EAClE,MAAM,kBAA0C;AAAA,IAC/C,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,EACN;AAAA,EAEA,MAAM,SAAS,gBAAgB,cAAc;AAAA,EAC7C,MAAM,QAAQ,UAAU,OAAO,CAAC,EAAE,YAAY,IAAI,UAAU,MAAM,CAAC;AAAA,EACnE,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,EAErE,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sFAY8E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAahE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAMC,QAAQ,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;AC7ChG;AAAA,IAaI,SAAwB,MACxB,YAAY,GACV,SAEA,YAAY,MAAM;AAAA,EACvB,IAAI;AAAA,IAAQ,OAAO;AAAA,EAInB,MAAM,aAAa,QAAQ,YAAY,KAAK,cAAc;AAAA,EAC1D,SAAS,IAAI,OAAO,YAAY,EAAE,KAAK,QAAQ,IAAI,EAAE,CAA4C;AAAA,EAEjG,OAAO,YAAY,CAAC,UAAU;AAAA,IAC7B,QAAQ,IAAI,IAAI,MAAM,UAAU,MAAM;AAAA,IACtC,MAAM,MAAM,QAAQ,IAAI,EAAE;AAAA,IAC1B,IAAI,CAAC;AAAA,MAAK;AAAA,IACV,QAAQ,OAAO,EAAE;AAAA,IAEjB,IAAI,IAAI;AAAA,MACP,IAAI,QAAQ,IAAI;AAAA,IACjB,EAAO;AAAA,MACN,IAAI,OAAO,IAAI,MAAM,SAAS,mBAAmB,CAAC;AAAA;AAAA;AAAA,EAIpD,OAAO,UAAU,CAAC,UAAU;AAAA,IAC3B,QAAQ,MAAM,uBAAuB,KAAK;AAAA,IAE1C,YAAY,IAAI,QAAQ,SAAS;AAAA,MAChC,IAAI,OAAO,IAAI,MAAM,oBAAoB,CAAC;AAAA,MAC1C,QAAQ,OAAO,EAAE;AAAA,IAClB;AAAA,IACA,SAAS;AAAA;AAAA,EAGV,OAAO;AAAA,GAGK,iBAAiB,CAAC,YAC9B,IAAI,QAAgB,CAAC,gBAAgB,kBAAkB;AAAA,EACtD,MAAM,KAAK,EAAE;AAAA,EACb,QAAQ,IAAI,IAAI;AAAA,IACf,QAAQ;AAAA,IACR,SAAS;AAAA,EACV,CAAC;AAAA,EAED,MAAM,IAAI,UAAU;AAAA,EACpB,EAAE,YAAY;AAAA,IACb,eAAe,QAAQ,QAAQ,aAAa;AAAA,IAC5C;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,OAAO,QAAQ;AAAA,EAChB,CAAC;AAAA,CACD;AAAA;AAAA,EAnDI,UAAU,IAAI;AAAA;;;ACZpB,IAAM,QAAQ,QAAQ,IAAI,gBAAgB;AAG1C,IAAM,oBAAoB,CAAC,cAAuD;AAAA,EACjF,MAAM,OAAO,UAAU,eAAe,UAAU;AAAA,EAChD,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAElB,MAAM,SAAS,WAAW,gBAAgB,UAAU;AAAA,EACpD,MAAM,WAAW,QAAQ;AAAA,EACzB,IAAI,CAAC;AAAA,IAAU,OAAO;AAAA,EAEtB,QAAQ,mBAAS;AAAA,EACjB,QAAQ;AAAA,EACR,MAAM,WAAW,SAAQ,UAAU,OAAO;AAAA,EAE1C,WAAW,OAAO,CAAC,QAAQ,QAAQ,KAAK,GAAG;AAAA,IAC1C,MAAM,YAAY,KAAK,UAAU,GAAG,OAAO,KAAK;AAAA,IAChD,IAAI,WAAW,SAAS;AAAA,MAAG,OAAO;AAAA,EACnC;AAAA,EAEA,OAAO;AAAA;AAGD,IAAM,yBAAyB,OAGrC,eACA,UACG,UACC;AAAA,EACJ,IAAI;AAAA,IACH,OAAO,cAAc;AAAA,IAIrB,IAAI,OAAO;AAAA,MACV,MAAM,gBAAgB,kBACrB,aACD;AAAA,MACA,IAAI,eAAe;AAAA,QAClB,IAAI;AAAA,UACH,QAAQ,oCAAmB;AAAA,UAG3B,MAAM,OAAO,MAAM,gBAAe;AAAA,YACjC;AAAA,YACA,WAAW;AAAA,YACX,OAAO;AAAA,UAGR,CAAC;AAAA,UAED,OAAO,IAAI,SAAS,MAAM;AAAA,YACzB,SAAS,EAAE,gBAAgB,YAAY;AAAA,UACxC,CAAC;AAAA,UACA,MAAM;AAAA,MAGT;AAAA,IACD;AAAA,IAEA,QAAQ,kBAAkB,MAAa;AAAA,IACvC,QAAQ,2BAA2B,MAAa;AAAA,IAEhD,MAAM,UACL,eAAe,YACZ,cAAc,eAAe,UAAU,IACvC,cAAc,aAAa;AAAA,IAE/B,MAAM,cAAc,aACjB,4BAA4B,KAAK,UAAU,UAAU,MACrD;AAAA,IAEH,MAAM,SAAS,MAAM,uBAAuB,SAAS;AAAA,MACpD,kBAAkB,CAAC,KAAK;AAAA,MACxB,wBAAwB,eAAe;AAAA,MACvC,OAAO,CAAC,OAAgB;AAAA,QACvB,QAAQ,MAAM,gCAAgC,KAAK;AAAA;AAAA,IAErD,CAAC;AAAA,IAED,OAAO,IAAI,SAAS,QAAQ;AAAA,MAC3B,SAAS,EAAE,gBAAgB,YAAY;AAAA,IACxC,CAAC;AAAA,IACA,OAAO,OAAO;AAAA,IACf,QAAQ,MAAM,6BAA6B,KAAK;AAAA,IAEhD,OAAO,IAAI,SAAS,aAAa,SAAS,KAAK,GAAG;AAAA,MACjD,SAAS,EAAE,gBAAgB,YAAY;AAAA,MACvC,QAAQ;AAAA,IACT,CAAC;AAAA;AAAA;",
|
|
10
|
+
"debugId": "FD9B1841605D4D8164756E2164756E21",
|
|
10
11
|
"names": []
|
|
11
12
|
}
|
|
@@ -23,6 +23,8 @@ export type HMRState = {
|
|
|
23
23
|
assetStore: Map<string, Uint8Array>;
|
|
24
24
|
manifest: Record<string, string>;
|
|
25
25
|
rebuildCount: number;
|
|
26
|
+
lastHmrPath?: string;
|
|
27
|
+
lastHmrFramework?: string;
|
|
26
28
|
};
|
|
27
29
|
export declare const createHMRState: (config: BuildConfig) => HMRState;
|
|
28
30
|
export declare const incrementSourceFileVersion: (state: HMRState, filePath: string) => number;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type ModuleServerConfig = {
|
|
2
|
+
projectRoot: string;
|
|
3
|
+
vendorPaths: Record<string, string>;
|
|
4
|
+
};
|
|
5
|
+
export declare const createModuleServer: (config: ModuleServerConfig) => (pathname: string) => Promise<Response | undefined>;
|
|
6
|
+
export declare const invalidateModule: (filePath: string) => void;
|
|
7
|
+
export declare const warmCache: (pathname: string) => void;
|
|
8
|
+
declare let globalModuleServer: ((pathname: string) => Promise<Response | undefined> | Response | undefined) | null;
|
|
9
|
+
export declare const setGlobalModuleServer: (handler: typeof globalModuleServer) => void;
|
|
10
|
+
export declare const SRC_URL_PREFIX = "/@src/";
|
|
11
|
+
export {};
|
|
File without changes
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const getTransformed: (filePath: string) => string | undefined;
|
|
2
|
+
export declare const setTransformed: (filePath: string, content: string, mtime: number) => void;
|
|
3
|
+
export declare const invalidate: (filePath: string) => void;
|
|
4
|
+
export declare const invalidateAll: () => void;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Elysia from 'elysia';
|
|
2
2
|
import type { HMRState } from '../dev/clientManager';
|
|
3
|
-
export declare const hmr: (hmrState: HMRState, manifest: Record<string, string>) => (app: Elysia) => Elysia<"", {
|
|
3
|
+
export declare const hmr: (hmrState: HMRState, manifest: Record<string, string>, moduleServerHandler?: (pathname: string) => Promise<Response | undefined> | Response | undefined) => (app: Elysia) => Elysia<"", {
|
|
4
4
|
decorator: {};
|
|
5
5
|
store: {};
|
|
6
6
|
derive: {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// SSR Worker — renders React components in a separate context so
|
|
2
|
+
// frontend imports don't pollute bun --hot's module graph.
|
|
3
|
+
// Each render dynamically imports the component fresh.
|
|
4
|
+
|
|
5
|
+
/* eslint-disable no-restricted-globals */
|
|
6
|
+
|
|
7
|
+
self.onmessage = async (event) => {
|
|
8
|
+
const { id, componentPath, indexPath, props } = event.data;
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
// Dynamic import with cache bust — always gets fresh module
|
|
12
|
+
const timestamp = Date.now();
|
|
13
|
+
const mod = await import(`${componentPath}?t=${timestamp}`);
|
|
14
|
+
const Component = mod.default ?? Object.values(mod)[0];
|
|
15
|
+
|
|
16
|
+
const { createElement } = await import('react');
|
|
17
|
+
const { renderToReadableStream } = await import('react-dom/server');
|
|
18
|
+
|
|
19
|
+
const propsScript = props
|
|
20
|
+
? `window.__INITIAL_PROPS__=${JSON.stringify(props)}`
|
|
21
|
+
: '';
|
|
22
|
+
|
|
23
|
+
const element = props
|
|
24
|
+
? createElement(Component, props)
|
|
25
|
+
: createElement(Component);
|
|
26
|
+
|
|
27
|
+
const stream = await renderToReadableStream(element, {
|
|
28
|
+
bootstrapModules: indexPath ? [indexPath] : [],
|
|
29
|
+
bootstrapScriptContent: propsScript || undefined,
|
|
30
|
+
onError(error: unknown) {
|
|
31
|
+
console.error('[SSR Worker] React streaming error:', error);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Collect the stream into a string
|
|
36
|
+
const reader = stream.getReader();
|
|
37
|
+
const chunks: string[] = [];
|
|
38
|
+
const decoder = new TextDecoder();
|
|
39
|
+
|
|
40
|
+
let done = false;
|
|
41
|
+
while (!done) {
|
|
42
|
+
const result = await reader.read();
|
|
43
|
+
done = result.done;
|
|
44
|
+
if (result.value) {
|
|
45
|
+
chunks.push(decoder.decode(result.value, { stream: !done }));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
self.postMessage({ html: chunks.join(''), id, ok: true });
|
|
50
|
+
} catch (error) {
|
|
51
|
+
const message =
|
|
52
|
+
error instanceof Error ? error.message : String(error);
|
|
53
|
+
self.postMessage({ error: message, id, ok: false });
|
|
54
|
+
}
|
|
55
|
+
};
|
package/dist/types/messages.d.ts
CHANGED
|
@@ -16,7 +16,11 @@ export type HydrationErrorMessage = {
|
|
|
16
16
|
error?: string;
|
|
17
17
|
};
|
|
18
18
|
};
|
|
19
|
-
export type
|
|
19
|
+
export type HMRTimingMessage = {
|
|
20
|
+
type: 'hmr-timing';
|
|
21
|
+
duration: number;
|
|
22
|
+
};
|
|
23
|
+
export type HMRClientMessage = PingMessage | ReadyMessage | RequestRebuildMessage | HydrationErrorMessage | HMRTimingMessage;
|
|
20
24
|
export type ManifestMessage = {
|
|
21
25
|
type: 'manifest';
|
|
22
26
|
data: {
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -138,17 +138,17 @@
|
|
|
138
138
|
}
|
|
139
139
|
},
|
|
140
140
|
"optionalDependencies": {
|
|
141
|
-
"@absolutejs/native-darwin-arm64": "0.19.0-beta.
|
|
142
|
-
"@absolutejs/native-darwin-x64": "0.19.0-beta.
|
|
143
|
-
"@absolutejs/native-linux-arm64": "0.19.0-beta.
|
|
144
|
-
"@absolutejs/native-linux-x64": "0.19.0-beta.
|
|
141
|
+
"@absolutejs/native-darwin-arm64": "0.19.0-beta.41",
|
|
142
|
+
"@absolutejs/native-darwin-x64": "0.19.0-beta.41",
|
|
143
|
+
"@absolutejs/native-linux-arm64": "0.19.0-beta.41",
|
|
144
|
+
"@absolutejs/native-linux-x64": "0.19.0-beta.41"
|
|
145
145
|
},
|
|
146
146
|
"repository": {
|
|
147
147
|
"type": "git",
|
|
148
148
|
"url": "https://github.com/absolutejs/absolutejs.git"
|
|
149
149
|
},
|
|
150
150
|
"scripts": {
|
|
151
|
-
"build": "rm -rf dist && bun build src/index.ts src/build.ts src/angular/index.ts src/react/index.ts src/react/hooks/index.ts src/svelte/index.ts src/vue/index.ts --outdir dist --sourcemap --target=bun --external react --external react-dom --external vue --external @vue/compiler-sfc --external vue/server-renderer --external svelte --external svelte/compiler --external svelte/server --external elysia --external @elysiajs/static --external @angular/compiler-cli --external @angular/core --external @angular/common --external @angular/platform-browser --external @angular/platform-server --external @angular/ssr --external zone.js --external debug --external @absolutejs/native-linux-x64 --external @absolutejs/native-linux-arm64 --external @absolutejs/native-darwin-x64 --external @absolutejs/native-darwin-arm64 && bun build src/cli/index.ts --outfile dist/cli/index.js --target=bun && tsc --emitDeclarationOnly --project tsconfig.build.json && mkdir -p dist/dev && cp -r src/dev/client dist/dev/client",
|
|
151
|
+
"build": "rm -rf dist && bun build src/index.ts src/build.ts src/angular/index.ts src/react/index.ts src/react/hooks/index.ts src/svelte/index.ts src/vue/index.ts --outdir dist --sourcemap --target=bun --external react --external react-dom --external vue --external @vue/compiler-sfc --external vue/server-renderer --external svelte --external svelte/compiler --external svelte/server --external elysia --external @elysiajs/static --external @angular/compiler-cli --external @angular/core --external @angular/common --external @angular/platform-browser --external @angular/platform-server --external @angular/ssr --external zone.js --external debug --external @absolutejs/native-linux-x64 --external @absolutejs/native-linux-arm64 --external @absolutejs/native-darwin-x64 --external @absolutejs/native-darwin-arm64 && bun build src/cli/index.ts --outfile dist/cli/index.js --target=bun && tsc --emitDeclarationOnly --project tsconfig.build.json && mkdir -p dist/dev && cp -r src/dev/client dist/dev/client && cp src/dev/ssrWorker.ts dist/ssrWorker.ts",
|
|
152
152
|
"build:native": "./native/build.sh",
|
|
153
153
|
"db:push": "drizzle-kit push",
|
|
154
154
|
"db:studio": "drizzle-kit studio",
|
|
@@ -162,5 +162,5 @@
|
|
|
162
162
|
"typecheck": "bun run vue-tsc --noEmit"
|
|
163
163
|
},
|
|
164
164
|
"types": "./dist/src/index.d.ts",
|
|
165
|
-
"version": "0.19.0-beta.
|
|
165
|
+
"version": "0.19.0-beta.41"
|
|
166
166
|
}
|
package/types/globals.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ declare global {
|
|
|
9
9
|
* duplicate React instances after bun install invalidates the module cache. */
|
|
10
10
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
11
11
|
var __reactModuleRef: any;
|
|
12
|
+
var __depVendorPaths: Record<string, string> | undefined;
|
|
12
13
|
var __hmrDevResult:
|
|
13
14
|
| {
|
|
14
15
|
hmrState: import('../src/dev/clientManager').HMRState;
|
package/types/messages.ts
CHANGED
|
@@ -23,11 +23,17 @@ export type HydrationErrorMessage = {
|
|
|
23
23
|
};
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
+
export type HMRTimingMessage = {
|
|
27
|
+
type: 'hmr-timing';
|
|
28
|
+
duration: number;
|
|
29
|
+
};
|
|
30
|
+
|
|
26
31
|
export type HMRClientMessage =
|
|
27
32
|
| PingMessage
|
|
28
33
|
| ReadyMessage
|
|
29
34
|
| RequestRebuildMessage
|
|
30
|
-
| HydrationErrorMessage
|
|
35
|
+
| HydrationErrorMessage
|
|
36
|
+
| HMRTimingMessage;
|
|
31
37
|
|
|
32
38
|
/* Server-to-client message types */
|
|
33
39
|
export type ManifestMessage = {
|