@absolutejs/absolute 0.15.26 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +402 -423
- package/dist/index.js.map +13 -12
- package/dist/react/hooks/index.js +98 -0
- package/dist/react/hooks/index.js.map +10 -0
- package/dist/react/index.js +97 -0
- package/dist/react/index.js.map +11 -0
- package/dist/src/core/pageHandlers.d.ts +0 -13
- package/dist/src/react/hooks/index.d.ts +2 -0
- package/dist/src/react/hooks/useMediaQuery.d.ts +7 -0
- package/dist/src/react/index.d.ts +1 -0
- package/dist/src/react/pageHandler.d.ts +2 -0
- package/dist/src/svelte/index.d.ts +2 -0
- package/dist/src/svelte/pageHandler.d.ts +6 -0
- package/dist/src/utils/userAgentFunctions.d.ts +1 -0
- package/dist/src/vue/index.d.ts +1 -0
- package/dist/src/vue/pageHandler.d.ts +2 -0
- package/dist/svelte/index.js +176 -0
- package/dist/svelte/index.js.map +15 -0
- package/dist/types/build.d.ts +0 -5
- package/dist/types/mediaQuery.d.ts +9 -0
- package/dist/types/react.d.ts +2 -0
- package/dist/types/svelte.d.ts +2 -0
- package/dist/types/userAgentTypes.d.ts +2 -0
- package/dist/types/vue.d.ts +2 -0
- package/dist/types/window-globals.d.ts +26 -0
- package/dist/vue/index.js +114 -0
- package/dist/vue/index.js.map +12 -0
- package/package.json +24 -2
- package/tsconfig.build.json +1 -1
- package/types/build.ts +0 -14
- package/types/mediaQuery.ts +10 -0
- package/types/react.ts +4 -0
- package/types/svelte.ts +4 -0
- package/types/userAgentTypes.ts +3 -0
- package/types/vue.ts +4 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __export = (target, all) => {
|
|
4
|
+
for (var name in all)
|
|
5
|
+
__defProp(target, name, {
|
|
6
|
+
get: all[name],
|
|
7
|
+
enumerable: true,
|
|
8
|
+
configurable: true,
|
|
9
|
+
set: (newValue) => all[name] = () => newValue
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
13
|
+
var __require = import.meta.require;
|
|
14
|
+
// src/react/hooks/useMediaQuery.ts
|
|
15
|
+
import { createContext, useContext, useSyncExternalStore } from "react";
|
|
16
|
+
var UserAgentContext = createContext(null);
|
|
17
|
+
var UserAgentProvider = UserAgentContext.Provider;
|
|
18
|
+
var useUserAgentType = () => {
|
|
19
|
+
const context = useContext(UserAgentContext);
|
|
20
|
+
if (context === null) {
|
|
21
|
+
throw new Error("useMediaQuery must be used within a UserAgentProvider");
|
|
22
|
+
}
|
|
23
|
+
return context;
|
|
24
|
+
};
|
|
25
|
+
var defaultBreakpoints = {
|
|
26
|
+
xs: 0,
|
|
27
|
+
sm: 640,
|
|
28
|
+
md: 768,
|
|
29
|
+
lg: 1024,
|
|
30
|
+
xl: 1280,
|
|
31
|
+
"2xl": 1536
|
|
32
|
+
};
|
|
33
|
+
var userAgentInitialWidth = {
|
|
34
|
+
bot: 1024,
|
|
35
|
+
car: 768,
|
|
36
|
+
console: 1024,
|
|
37
|
+
desktop: 1024,
|
|
38
|
+
iot: 640,
|
|
39
|
+
other: 768,
|
|
40
|
+
phone: 375,
|
|
41
|
+
tablet: 768,
|
|
42
|
+
tv: 1280
|
|
43
|
+
};
|
|
44
|
+
var subscribers = new Set;
|
|
45
|
+
var width = typeof window !== "undefined" ? window.innerWidth : 0;
|
|
46
|
+
var isListening = false;
|
|
47
|
+
var ensureListener = () => {
|
|
48
|
+
if (isListening || typeof window === "undefined")
|
|
49
|
+
return;
|
|
50
|
+
isListening = true;
|
|
51
|
+
let isTicking = false;
|
|
52
|
+
const onResize = () => {
|
|
53
|
+
if (isTicking)
|
|
54
|
+
return;
|
|
55
|
+
isTicking = true;
|
|
56
|
+
requestAnimationFrame(() => {
|
|
57
|
+
isTicking = false;
|
|
58
|
+
width = window.innerWidth;
|
|
59
|
+
subscribers.forEach((notify) => notify());
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
window.addEventListener("resize", onResize, { passive: true });
|
|
63
|
+
};
|
|
64
|
+
var subscribe = (callback) => {
|
|
65
|
+
ensureListener();
|
|
66
|
+
subscribers.add(callback);
|
|
67
|
+
return () => subscribers.delete(callback);
|
|
68
|
+
};
|
|
69
|
+
var getViewportWidth = () => width;
|
|
70
|
+
var computeBreakpoint = (widthValue, breakpoints) => {
|
|
71
|
+
if (widthValue < breakpoints.sm)
|
|
72
|
+
return "xs";
|
|
73
|
+
if (widthValue < breakpoints.md)
|
|
74
|
+
return "sm";
|
|
75
|
+
if (widthValue < breakpoints.lg)
|
|
76
|
+
return "md";
|
|
77
|
+
if (widthValue < breakpoints.xl)
|
|
78
|
+
return "lg";
|
|
79
|
+
if (widthValue < breakpoints["2xl"])
|
|
80
|
+
return "xl";
|
|
81
|
+
return "2xl";
|
|
82
|
+
};
|
|
83
|
+
var useMediaQuery = (customBreakpoints = defaultBreakpoints) => {
|
|
84
|
+
const userAgentType = useUserAgentType();
|
|
85
|
+
const getServerWidth = () => userAgentInitialWidth[userAgentType];
|
|
86
|
+
const currentWidth = useSyncExternalStore(subscribe, getViewportWidth, getServerWidth);
|
|
87
|
+
const breakpoint = computeBreakpoint(currentWidth, customBreakpoints);
|
|
88
|
+
const isSizeOrGreater = (target) => customBreakpoints[breakpoint] >= customBreakpoints[target];
|
|
89
|
+
const isSizeOrLess = (target) => customBreakpoints[breakpoint] <= customBreakpoints[target];
|
|
90
|
+
return { breakpoint, isSizeOrGreater, isSizeOrLess };
|
|
91
|
+
};
|
|
92
|
+
export {
|
|
93
|
+
useMediaQuery,
|
|
94
|
+
UserAgentProvider
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
//# debugId=27AC05AE60B974B964756E2164756E21
|
|
98
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/react/hooks/useMediaQuery.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { createContext, useContext, useSyncExternalStore } from 'react';\nimport { Breakpoint, Breakpoints } from '../../../types/mediaQuery';\nimport { UserAgentType } from '../../../types/userAgentTypes';\n\nconst UserAgentContext = createContext<UserAgentType | null>(null);\n\nexport const UserAgentProvider = UserAgentContext.Provider;\n\nconst useUserAgentType = (): UserAgentType => {\n\tconst context = useContext(UserAgentContext);\n\tif (context === null) {\n\t\tthrow new Error(\n\t\t\t'useMediaQuery must be used within a UserAgentProvider'\n\t\t);\n\t}\n\n\treturn context;\n};\n\nconst defaultBreakpoints: Breakpoints = {\n\txs: 0,\n\tsm: 640,\n\tmd: 768,\n\tlg: 1024,\n\txl: 1280,\n\t'2xl': 1536\n};\n\nconst userAgentInitialWidth: Record<UserAgentType, number> = {\n\tbot: 1024,\n\tcar: 768,\n\tconsole: 1024,\n\tdesktop: 1024,\n\tiot: 640,\n\tother: 768,\n\tphone: 375,\n\ttablet: 768,\n\ttv: 1280\n};\n\nconst subscribers = new Set<() => void>();\nlet width = typeof window !== 'undefined' ? window.innerWidth : 0;\nlet isListening = false;\n\nconst ensureListener = () => {\n\tif (isListening || typeof window === 'undefined') return;\n\tisListening = true;\n\n\tlet isTicking = false;\n\tconst onResize = () => {\n\t\tif (isTicking) return;\n\t\tisTicking = true;\n\t\trequestAnimationFrame(() => {\n\t\t\tisTicking = false;\n\t\t\twidth = window.innerWidth;\n\t\t\tsubscribers.forEach((notify) => notify());\n\t\t});\n\t};\n\n\twindow.addEventListener('resize', onResize, { passive: true });\n};\n\nconst subscribe = (callback: () => void) => {\n\tensureListener();\n\tsubscribers.add(callback);\n\treturn () => subscribers.delete(callback);\n};\n\nconst getViewportWidth = () => width;\n\nconst computeBreakpoint = (widthValue: number, breakpoints: Breakpoints) => {\n\tif (widthValue < breakpoints.sm) return 'xs';\n\tif (widthValue < breakpoints.md) return 'sm';\n\tif (widthValue < breakpoints.lg) return 'md';\n\tif (widthValue < breakpoints.xl) return 'lg';\n\tif (widthValue < breakpoints['2xl']) return 'xl';\n\treturn '2xl';\n};\n\nexport const useMediaQuery = (\n\tcustomBreakpoints: Breakpoints = defaultBreakpoints\n) => {\n\tconst userAgentType = useUserAgentType();\n\tconst getServerWidth = () => userAgentInitialWidth[userAgentType];\n\n\tconst currentWidth = useSyncExternalStore(\n\t\tsubscribe,\n\t\tgetViewportWidth,\n\t\tgetServerWidth\n\t);\n\n\tconst breakpoint = computeBreakpoint(currentWidth, customBreakpoints);\n\n\tconst isSizeOrGreater = (target: Breakpoint) =>\n\t\tcustomBreakpoints[breakpoint] >= customBreakpoints[target];\n\n\tconst isSizeOrLess = (target: Breakpoint) =>\n\t\tcustomBreakpoints[breakpoint] <= customBreakpoints[target];\n\n\treturn { breakpoint, isSizeOrGreater, isSizeOrLess };\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;AAAA;AAIA,IAAM,mBAAmB,cAAoC,IAAI;AAE1D,IAAM,oBAAoB,iBAAiB;AAElD,IAAM,mBAAmB,MAAqB;AAAA,EAC7C,MAAM,UAAU,WAAW,gBAAgB;AAAA,EAC3C,IAAI,YAAY,MAAM;AAAA,IACrB,MAAM,IAAI,MACT,uDACD;AAAA,EACD;AAAA,EAEA,OAAO;AAAA;AAGR,IAAM,qBAAkC;AAAA,EACvC,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AACR;AAEA,IAAM,wBAAuD;AAAA,EAC5D,KAAK;AAAA,EACL,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AAAA,EACT,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,IAAI;AACL;AAEA,IAAM,cAAc,IAAI;AACxB,IAAI,QAAQ,OAAO,WAAW,cAAc,OAAO,aAAa;AAChE,IAAI,cAAc;AAElB,IAAM,iBAAiB,MAAM;AAAA,EAC5B,IAAI,eAAe,OAAO,WAAW;AAAA,IAAa;AAAA,EAClD,cAAc;AAAA,EAEd,IAAI,YAAY;AAAA,EAChB,MAAM,WAAW,MAAM;AAAA,IACtB,IAAI;AAAA,MAAW;AAAA,IACf,YAAY;AAAA,IACZ,sBAAsB,MAAM;AAAA,MAC3B,YAAY;AAAA,MACZ,QAAQ,OAAO;AAAA,MACf,YAAY,QAAQ,CAAC,WAAW,OAAO,CAAC;AAAA,KACxC;AAAA;AAAA,EAGF,OAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAAA;AAG9D,IAAM,YAAY,CAAC,aAAyB;AAAA,EAC3C,eAAe;AAAA,EACf,YAAY,IAAI,QAAQ;AAAA,EACxB,OAAO,MAAM,YAAY,OAAO,QAAQ;AAAA;AAGzC,IAAM,mBAAmB,MAAM;AAE/B,IAAM,oBAAoB,CAAC,YAAoB,gBAA6B;AAAA,EAC3E,IAAI,aAAa,YAAY;AAAA,IAAI,OAAO;AAAA,EACxC,IAAI,aAAa,YAAY;AAAA,IAAI,OAAO;AAAA,EACxC,IAAI,aAAa,YAAY;AAAA,IAAI,OAAO;AAAA,EACxC,IAAI,aAAa,YAAY;AAAA,IAAI,OAAO;AAAA,EACxC,IAAI,aAAa,YAAY;AAAA,IAAQ,OAAO;AAAA,EAC5C,OAAO;AAAA;AAGD,IAAM,gBAAgB,CAC5B,oBAAiC,uBAC7B;AAAA,EACJ,MAAM,gBAAgB,iBAAiB;AAAA,EACvC,MAAM,iBAAiB,MAAM,sBAAsB;AAAA,EAEnD,MAAM,eAAe,qBACpB,WACA,kBACA,cACD;AAAA,EAEA,MAAM,aAAa,kBAAkB,cAAc,iBAAiB;AAAA,EAEpE,MAAM,kBAAkB,CAAC,WACxB,kBAAkB,eAAe,kBAAkB;AAAA,EAEpD,MAAM,eAAe,CAAC,WACrB,kBAAkB,eAAe,kBAAkB;AAAA,EAEpD,OAAO,EAAE,YAAY,iBAAiB,aAAa;AAAA;",
|
|
8
|
+
"debugId": "27AC05AE60B974B964756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __export = (target, all) => {
|
|
4
|
+
for (var name in all)
|
|
5
|
+
__defProp(target, name, {
|
|
6
|
+
get: all[name],
|
|
7
|
+
enumerable: true,
|
|
8
|
+
configurable: true,
|
|
9
|
+
set: (newValue) => all[name] = () => newValue
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
13
|
+
var __require = import.meta.require;
|
|
14
|
+
|
|
15
|
+
// src/utils/ssrErrorPage.ts
|
|
16
|
+
var ssrErrorPage = (framework, error) => {
|
|
17
|
+
const frameworkColors = {
|
|
18
|
+
angular: "#dd0031",
|
|
19
|
+
html: "#e34c26",
|
|
20
|
+
htmx: "#1a365d",
|
|
21
|
+
react: "#61dafb",
|
|
22
|
+
svelte: "#ff3e00",
|
|
23
|
+
vue: "#42b883"
|
|
24
|
+
};
|
|
25
|
+
const accent = frameworkColors[framework] ?? "#94a3b8";
|
|
26
|
+
const label = framework.charAt(0).toUpperCase() + framework.slice(1);
|
|
27
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
28
|
+
return `<!DOCTYPE html>
|
|
29
|
+
<html>
|
|
30
|
+
<head>
|
|
31
|
+
<meta charset="utf-8">
|
|
32
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
33
|
+
<title>SSR Error - AbsoluteJS</title>
|
|
34
|
+
<style>
|
|
35
|
+
*{margin:0;padding:0;box-sizing:border-box}
|
|
36
|
+
body{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}
|
|
37
|
+
.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}
|
|
38
|
+
.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)}
|
|
39
|
+
.brand{font-weight:700;font-size:20px;color:#fff;letter-spacing:-0.02em}
|
|
40
|
+
.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)}
|
|
41
|
+
.kind{color:#94a3b8;font-size:13px;font-weight:500}
|
|
42
|
+
.content{padding:24px}
|
|
43
|
+
.label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.08em;color:#94a3b8;margin-bottom:8px}
|
|
44
|
+
.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}
|
|
45
|
+
.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}
|
|
46
|
+
</style>
|
|
47
|
+
</head>
|
|
48
|
+
<body>
|
|
49
|
+
<div class="card">
|
|
50
|
+
<div class="header">
|
|
51
|
+
<div style="display:flex;align-items:center;gap:12px">
|
|
52
|
+
<span class="brand">AbsoluteJS</span>
|
|
53
|
+
<span class="badge">${label}</span>
|
|
54
|
+
</div>
|
|
55
|
+
<span class="kind">Server Render Error</span>
|
|
56
|
+
</div>
|
|
57
|
+
<div class="content">
|
|
58
|
+
<div class="label">What went wrong</div>
|
|
59
|
+
<pre class="message">${message.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">")}</pre>
|
|
60
|
+
<div class="hint">A component threw during server-side rendering. Check the terminal for the full stack trace.</div>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
</body>
|
|
64
|
+
</html>`;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// src/react/pageHandler.ts
|
|
68
|
+
import { createElement } from "react";
|
|
69
|
+
import { renderToReadableStream as renderReactToReadableStream } from "react-dom/server";
|
|
70
|
+
var handleReactPageRequest = async (PageComponent, index, ...props) => {
|
|
71
|
+
try {
|
|
72
|
+
const [maybeProps] = props;
|
|
73
|
+
const element = maybeProps !== undefined ? createElement(PageComponent, maybeProps) : createElement(PageComponent);
|
|
74
|
+
const stream = await renderReactToReadableStream(element, {
|
|
75
|
+
bootstrapModules: [index],
|
|
76
|
+
bootstrapScriptContent: maybeProps ? `window.__INITIAL_PROPS__=${JSON.stringify(maybeProps)}` : undefined,
|
|
77
|
+
onError(error) {
|
|
78
|
+
console.error("[SSR] React streaming error:", error);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
return new Response(stream, {
|
|
82
|
+
headers: { "Content-Type": "text/html" }
|
|
83
|
+
});
|
|
84
|
+
} catch (error) {
|
|
85
|
+
console.error("[SSR] React render error:", error);
|
|
86
|
+
return new Response(ssrErrorPage("react", error), {
|
|
87
|
+
status: 500,
|
|
88
|
+
headers: { "Content-Type": "text/html" }
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
export {
|
|
93
|
+
handleReactPageRequest
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
//# debugId=4F6D33B3CA0D31C764756E2164756E21
|
|
97
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/ssrErrorPage.ts", "../src/react/pageHandler.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export const ssrErrorPage = (framework: string, error: unknown): string => {\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 { ComponentType as ReactComponent, createElement } from 'react';\nimport { renderToReadableStream as renderReactToReadableStream } from 'react-dom/server';\nimport { ssrErrorPage } from '../utils/ssrErrorPage';\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: Props]\n) => {\n\ttry {\n\t\tconst [maybeProps] = props;\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 stream = await renderReactToReadableStream(element, {\n\t\t\tbootstrapModules: [index],\n\t\t\tbootstrapScriptContent: maybeProps\n\t\t\t\t? `window.__INITIAL_PROPS__=${JSON.stringify(maybeProps)}`\n\t\t\t\t: 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\tstatus: 500,\n\t\t\theaders: { 'Content-Type': 'text/html' }\n\t\t});\n\t}\n};\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": ";;;;;;;;;;;;;;;IAAa,eAAe,CAAC,WAAmB,UAA2B;AAAA,EAC1E,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;AACA,mCAAS;AAGF,IAAM,yBAAyB,OAGrC,eACA,UACG,UACC;AAAA,EACJ,IAAI;AAAA,IACH,OAAO,cAAc;AAAA,IACrB,MAAM,UACL,eAAe,YACZ,cAAc,eAAe,UAAU,IACvC,cAAc,aAAa;AAAA,IAE/B,MAAM,SAAS,MAAM,4BAA4B,SAAS;AAAA,MACzD,kBAAkB,CAAC,KAAK;AAAA,MACxB,wBAAwB,aACrB,4BAA4B,KAAK,UAAU,UAAU,MACrD;AAAA,MACH,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,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,YAAY;AAAA,IACxC,CAAC;AAAA;AAAA;",
|
|
9
|
+
"debugId": "4F6D33B3CA0D31C764756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
|
@@ -1,15 +1,2 @@
|
|
|
1
|
-
import { ComponentType as ReactComponent } from 'react';
|
|
2
|
-
import { Component as SvelteComponent } from 'svelte';
|
|
3
|
-
import { Component as VueComponent } from 'vue';
|
|
4
|
-
import { PropsArgs } from '../../types/build';
|
|
5
|
-
export declare const handleReactPageRequest: <Props extends Record<string, unknown> = Record<never, never>>(PageComponent: ReactComponent<Props>, index: string, ...props: keyof Props extends never ? [] : [props: Props]) => Promise<Response>;
|
|
6
|
-
type HandleSveltePageRequest = {
|
|
7
|
-
(PageComponent: SvelteComponent<Record<string, never>>, pagePath: string, indexPath: string): Promise<Response>;
|
|
8
|
-
<P extends Record<string, unknown>>(PageComponent: SvelteComponent<P>, pagePath: string, indexPath: string, props: P): Promise<Response>;
|
|
9
|
-
};
|
|
10
|
-
export declare const handleSveltePageRequest: HandleSveltePageRequest;
|
|
11
|
-
export declare const handleVuePageRequest: <Props extends Record<string, unknown> = Record<never, never>>(_PageComponent: VueComponent<Props>, pagePath: string, indexPath: string, headTag?: `<head>${string}</head>`, ...props: keyof Props extends never ? [] : [props: Props]) => Promise<Response>;
|
|
12
1
|
export declare const handleHTMLPageRequest: (pagePath: string) => Bun.BunFile;
|
|
13
2
|
export declare const handleHTMXPageRequest: (pagePath: string) => Bun.BunFile;
|
|
14
|
-
export declare const handlePageRequest: <Component>(PageComponent: Component, ...props: PropsArgs<Component>) => void;
|
|
15
|
-
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Breakpoint, Breakpoints } from '../../../types/mediaQuery';
|
|
2
|
+
export declare const UserAgentProvider: import("react").Provider<"bot" | "phone" | "tablet" | "tv" | "console" | "car" | "iot" | "desktop" | "other" | null>;
|
|
3
|
+
export declare const useMediaQuery: (customBreakpoints?: Breakpoints) => {
|
|
4
|
+
breakpoint: string;
|
|
5
|
+
isSizeOrGreater: (target: Breakpoint) => boolean;
|
|
6
|
+
isSizeOrLess: (target: Breakpoint) => boolean;
|
|
7
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { handleReactPageRequest } from './pageHandler';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { ComponentType as ReactComponent } from 'react';
|
|
2
|
+
export declare const handleReactPageRequest: <Props extends Record<string, unknown> = Record<never, never>>(PageComponent: ReactComponent<Props>, index: string, ...props: keyof Props extends never ? [] : [props: Props]) => Promise<Response>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Component as SvelteComponent } from 'svelte';
|
|
2
|
+
export type HandleSveltePageRequest = {
|
|
3
|
+
(PageComponent: SvelteComponent<Record<string, never>>, pagePath: string, indexPath: string): Promise<Response>;
|
|
4
|
+
<P extends Record<string, unknown>>(PageComponent: SvelteComponent<P>, pagePath: string, indexPath: string, props: P): Promise<Response>;
|
|
5
|
+
};
|
|
6
|
+
export declare const handleSveltePageRequest: HandleSveltePageRequest;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getUserAgentType: (userAgent: string) => "bot" | "phone" | "tablet" | "tv" | "console" | "car" | "iot" | "desktop" | "other";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { handleVuePageRequest } from './pageHandler';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { Component as VueComponent } from 'vue';
|
|
2
|
+
export declare const handleVuePageRequest: <Props extends Record<string, unknown> = Record<never, never>>(_PageComponent: VueComponent<Props>, pagePath: string, indexPath: string, headTag?: `<head>${string}</head>`, ...props: keyof Props extends never ? [] : [props: Props]) => Promise<Response>;
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __export = (target, all) => {
|
|
4
|
+
for (var name in all)
|
|
5
|
+
__defProp(target, name, {
|
|
6
|
+
get: all[name],
|
|
7
|
+
enumerable: true,
|
|
8
|
+
configurable: true,
|
|
9
|
+
set: (newValue) => all[name] = () => newValue
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
13
|
+
var __require = import.meta.require;
|
|
14
|
+
|
|
15
|
+
// src/constants.ts
|
|
16
|
+
var UNFOUND_INDEX = -1, SECONDS_IN_A_MINUTE = 60, MILLISECONDS_IN_A_SECOND = 1000, MILLISECONDS_IN_A_MINUTE, MINUTES_IN_AN_HOUR = 60, HOURS_IN_DAY = 24, MILLISECONDS_IN_A_DAY, TIME_PRECISION = 2, TWO_THIRDS, DEFAULT_PORT = 3000, DEFAULT_CHUNK_SIZE = 16384, BUN_BUILD_WARNING_SUPPRESSION = "wildcard sideEffects are not supported yet";
|
|
17
|
+
var init_constants = __esm(() => {
|
|
18
|
+
MILLISECONDS_IN_A_MINUTE = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE;
|
|
19
|
+
MILLISECONDS_IN_A_DAY = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE * MINUTES_IN_AN_HOUR * HOURS_IN_DAY;
|
|
20
|
+
TWO_THIRDS = 2 / 3;
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
// src/utils/escapeScriptContent.ts
|
|
24
|
+
var ESCAPE_LOOKUP, ESCAPE_REGEX, escapeScriptContent = (content) => content.replace(ESCAPE_REGEX, (char) => {
|
|
25
|
+
const escaped = ESCAPE_LOOKUP[char];
|
|
26
|
+
return escaped !== undefined ? escaped : char;
|
|
27
|
+
});
|
|
28
|
+
var init_escapeScriptContent = __esm(() => {
|
|
29
|
+
ESCAPE_LOOKUP = {
|
|
30
|
+
"\u2028": "\\u2028",
|
|
31
|
+
"\u2029": "\\u2029",
|
|
32
|
+
"&": "\\u0026",
|
|
33
|
+
"<": "\\u003C",
|
|
34
|
+
">": "\\u003E"
|
|
35
|
+
};
|
|
36
|
+
ESCAPE_REGEX = /[&><\u2028\u2029]/g;
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// src/svelte/renderToReadableStream.ts
|
|
40
|
+
import { render } from "svelte/server";
|
|
41
|
+
var renderToReadableStream = async (component, props, {
|
|
42
|
+
bootstrapScriptContent,
|
|
43
|
+
bootstrapScripts = [],
|
|
44
|
+
bootstrapModules = [],
|
|
45
|
+
nonce,
|
|
46
|
+
onError = console.error,
|
|
47
|
+
progressiveChunkSize = DEFAULT_CHUNK_SIZE,
|
|
48
|
+
signal,
|
|
49
|
+
headContent,
|
|
50
|
+
bodyContent
|
|
51
|
+
} = {}) => {
|
|
52
|
+
try {
|
|
53
|
+
const { head, body } = typeof props === "undefined" ? render(component) : render(component, { props });
|
|
54
|
+
const nonceAttr = nonce ? ` nonce="${nonce}"` : "";
|
|
55
|
+
const scripts = (bootstrapScriptContent ? `<script${nonceAttr}>${escapeScriptContent(bootstrapScriptContent)}</script>` : "") + bootstrapScripts.map((src) => `<script${nonceAttr} src="${src}"></script>`).join("") + bootstrapModules.map((src) => `<script${nonceAttr} type="module" src="${src}"></script>`).join("");
|
|
56
|
+
const encoder = new TextEncoder;
|
|
57
|
+
const full = encoder.encode(`<!DOCTYPE html><html lang="en"><head>${head}${headContent ?? ""}</head><body>${body}${scripts}${bodyContent ?? ""}</body></html>`);
|
|
58
|
+
let offset = 0;
|
|
59
|
+
return new ReadableStream({
|
|
60
|
+
type: "bytes",
|
|
61
|
+
cancel(reason) {
|
|
62
|
+
onError?.(reason);
|
|
63
|
+
},
|
|
64
|
+
pull(controller) {
|
|
65
|
+
if (signal?.aborted) {
|
|
66
|
+
controller.close();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (offset >= full.length) {
|
|
70
|
+
controller.close();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const end = Math.min(offset + progressiveChunkSize, full.length);
|
|
74
|
+
controller.enqueue(full.subarray(offset, end));
|
|
75
|
+
offset = end;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
} catch (error) {
|
|
79
|
+
onError?.(error);
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
var init_renderToReadableStream = __esm(() => {
|
|
84
|
+
init_constants();
|
|
85
|
+
init_escapeScriptContent();
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// src/utils/ssrErrorPage.ts
|
|
89
|
+
var ssrErrorPage = (framework, error) => {
|
|
90
|
+
const frameworkColors = {
|
|
91
|
+
angular: "#dd0031",
|
|
92
|
+
html: "#e34c26",
|
|
93
|
+
htmx: "#1a365d",
|
|
94
|
+
react: "#61dafb",
|
|
95
|
+
svelte: "#ff3e00",
|
|
96
|
+
vue: "#42b883"
|
|
97
|
+
};
|
|
98
|
+
const accent = frameworkColors[framework] ?? "#94a3b8";
|
|
99
|
+
const label = framework.charAt(0).toUpperCase() + framework.slice(1);
|
|
100
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
101
|
+
return `<!DOCTYPE html>
|
|
102
|
+
<html>
|
|
103
|
+
<head>
|
|
104
|
+
<meta charset="utf-8">
|
|
105
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
106
|
+
<title>SSR Error - AbsoluteJS</title>
|
|
107
|
+
<style>
|
|
108
|
+
*{margin:0;padding:0;box-sizing:border-box}
|
|
109
|
+
body{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}
|
|
110
|
+
.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}
|
|
111
|
+
.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)}
|
|
112
|
+
.brand{font-weight:700;font-size:20px;color:#fff;letter-spacing:-0.02em}
|
|
113
|
+
.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)}
|
|
114
|
+
.kind{color:#94a3b8;font-size:13px;font-weight:500}
|
|
115
|
+
.content{padding:24px}
|
|
116
|
+
.label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.08em;color:#94a3b8;margin-bottom:8px}
|
|
117
|
+
.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}
|
|
118
|
+
.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}
|
|
119
|
+
</style>
|
|
120
|
+
</head>
|
|
121
|
+
<body>
|
|
122
|
+
<div class="card">
|
|
123
|
+
<div class="header">
|
|
124
|
+
<div style="display:flex;align-items:center;gap:12px">
|
|
125
|
+
<span class="brand">AbsoluteJS</span>
|
|
126
|
+
<span class="badge">${label}</span>
|
|
127
|
+
</div>
|
|
128
|
+
<span class="kind">Server Render Error</span>
|
|
129
|
+
</div>
|
|
130
|
+
<div class="content">
|
|
131
|
+
<div class="label">What went wrong</div>
|
|
132
|
+
<pre class="message">${message.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">")}</pre>
|
|
133
|
+
<div class="hint">A component threw during server-side rendering. Check the terminal for the full stack trace.</div>
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
</body>
|
|
137
|
+
</html>`;
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
// src/svelte/pageHandler.ts
|
|
141
|
+
var exports_pageHandler = {};
|
|
142
|
+
__export(exports_pageHandler, {
|
|
143
|
+
handleSveltePageRequest: () => handleSveltePageRequest
|
|
144
|
+
});
|
|
145
|
+
var handleSveltePageRequest = async (_PageComponent, pagePath, indexPath, props) => {
|
|
146
|
+
try {
|
|
147
|
+
const { default: ImportedPageComponent } = await import(pagePath);
|
|
148
|
+
const stream = await renderToReadableStream(ImportedPageComponent, props, {
|
|
149
|
+
bootstrapModules: indexPath ? [indexPath] : [],
|
|
150
|
+
bootstrapScriptContent: `window.__INITIAL_PROPS__=${JSON.stringify(props)}`
|
|
151
|
+
});
|
|
152
|
+
return new Response(stream, {
|
|
153
|
+
headers: { "Content-Type": "text/html" }
|
|
154
|
+
});
|
|
155
|
+
} catch (error) {
|
|
156
|
+
console.error("[SSR] Svelte render error:", error);
|
|
157
|
+
return new Response(ssrErrorPage("svelte", error), {
|
|
158
|
+
status: 500,
|
|
159
|
+
headers: { "Content-Type": "text/html" }
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
var init_pageHandler = __esm(() => {
|
|
164
|
+
init_renderToReadableStream();
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// src/svelte/index.ts
|
|
168
|
+
init_pageHandler();
|
|
169
|
+
init_renderToReadableStream();
|
|
170
|
+
export {
|
|
171
|
+
renderToReadableStream,
|
|
172
|
+
handleSveltePageRequest
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
//# debugId=F656EAB348363CBE64756E2164756E21
|
|
176
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/constants.ts", "../src/utils/escapeScriptContent.ts", "../src/svelte/renderToReadableStream.ts", "../src/utils/ssrErrorPage.ts", "../src/svelte/pageHandler.ts", "../src/svelte/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export const UNFOUND_INDEX = -1;\nexport const SECONDS_IN_A_MINUTE = 60;\nexport const MILLISECONDS_IN_A_SECOND = 1000;\nexport const MILLISECONDS_IN_A_MINUTE =\n\tMILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE;\nexport const MINUTES_IN_AN_HOUR = 60;\nexport const HOURS_IN_DAY = 24;\nexport const MILLISECONDS_IN_A_DAY =\n\tMILLISECONDS_IN_A_SECOND *\n\tSECONDS_IN_A_MINUTE *\n\tMINUTES_IN_AN_HOUR *\n\tHOURS_IN_DAY;\nexport const TIME_PRECISION = 2;\nexport const TWO_THIRDS = 2 / 3;\nexport const DEFAULT_PORT = 3000;\nexport const DEFAULT_CHUNK_SIZE = 16_384;\nexport const BUN_BUILD_WARNING_SUPPRESSION =\n\t'wildcard sideEffects are not supported yet';\n",
|
|
6
|
+
"const ESCAPE_LOOKUP: Record<string, string> = {\n\t'\\u2028': '\\\\u2028',\n\t'\\u2029': '\\\\u2029',\n\t'&': '\\\\u0026',\n\t'<': '\\\\u003C',\n\t'>': '\\\\u003E'\n};\n\nconst ESCAPE_REGEX = /[&><\\u2028\\u2029]/g;\n\nexport const escapeScriptContent = (content: string) =>\n\tcontent.replace(ESCAPE_REGEX, (char) => {\n\t\tconst escaped = ESCAPE_LOOKUP[char];\n\n\t\treturn escaped !== undefined ? escaped : char;\n\t});\n",
|
|
7
|
+
"import type { Component } from 'svelte';\nimport { render } from 'svelte/server';\nimport { DEFAULT_CHUNK_SIZE } from '../constants';\nimport { escapeScriptContent } from '../utils/escapeScriptContent';\n\nexport type RenderStreamOptions = {\n\tbootstrapScriptContent?: string;\n\tbootstrapScripts?: string[];\n\tbootstrapModules?: string[];\n\tnonce?: string;\n\tonError?: (error: unknown) => void;\n\tprogressiveChunkSize?: number;\n\tsignal?: AbortSignal;\n\theadContent?: string;\n\tbodyContent?: string;\n};\n\nexport const renderToReadableStream = async <\n\tProps extends Record<string, unknown> = Record<string, never>\n>(\n\tcomponent: Component<Props>,\n\tprops?: Props,\n\t{\n\t\tbootstrapScriptContent,\n\t\tbootstrapScripts = [],\n\t\tbootstrapModules = [],\n\t\tnonce,\n\t\tonError = console.error,\n\t\tprogressiveChunkSize = DEFAULT_CHUNK_SIZE,\n\t\tsignal,\n\t\theadContent,\n\t\tbodyContent\n\t}: RenderStreamOptions = {}\n) => {\n\ttry {\n\t\tconst { head, body } =\n\t\t\ttypeof props === 'undefined'\n\t\t\t\t? // @ts-expect-error Svelte's render function can't determine which overload to choose when the component is generic\n\t\t\t\t\trender(component)\n\t\t\t\t: render(component, { props });\n\t\tconst nonceAttr = nonce ? ` nonce=\"${nonce}\"` : '';\n\t\tconst scripts =\n\t\t\t(bootstrapScriptContent\n\t\t\t\t? `<script${nonceAttr}>${escapeScriptContent(bootstrapScriptContent)}</script>`\n\t\t\t\t: '') +\n\t\t\tbootstrapScripts\n\t\t\t\t.map((src) => `<script${nonceAttr} src=\"${src}\"></script>`)\n\t\t\t\t.join('') +\n\t\t\tbootstrapModules\n\t\t\t\t.map(\n\t\t\t\t\t(src) =>\n\t\t\t\t\t\t`<script${nonceAttr} type=\"module\" src=\"${src}\"></script>`\n\t\t\t\t)\n\t\t\t\t.join('');\n\t\tconst encoder = new TextEncoder();\n\t\t// Warning: this encodes the entire document into memory in one buffer\n\t\tconst full = encoder.encode(\n\t\t\t`<!DOCTYPE html><html lang=\"en\"><head>${head}${headContent ?? ''}</head><body>${body}${scripts}${bodyContent ?? ''}</body></html>`\n\t\t);\n\n\t\tlet offset = 0;\n\n\t\treturn new ReadableStream<Uint8Array>({\n\t\t\ttype: 'bytes',\n\t\t\tcancel(reason) {\n\t\t\t\tonError?.(reason);\n\t\t\t},\n\t\t\tpull(controller) {\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (offset >= full.length) {\n\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst end = Math.min(\n\t\t\t\t\toffset + progressiveChunkSize,\n\t\t\t\t\tfull.length\n\t\t\t\t);\n\t\t\t\tcontroller.enqueue(full.subarray(offset, end));\n\t\t\t\toffset = end;\n\t\t\t}\n\t\t});\n\t} catch (error) {\n\t\tonError?.(error);\n\t\tthrow error;\n\t}\n};\n",
|
|
8
|
+
"export const ssrErrorPage = (framework: string, error: unknown): string => {\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",
|
|
9
|
+
"import { Component as SvelteComponent } from 'svelte';\nimport { renderToReadableStream as renderSvelteToReadableStream } from './renderToReadableStream';\nimport { ssrErrorPage } from '../utils/ssrErrorPage';\n\n// Declare overloads matching Svelte's own component API to preserve correct type inference\nexport type HandleSveltePageRequest = {\n\t(\n\t\tPageComponent: SvelteComponent<Record<string, never>>,\n\t\tpagePath: string,\n\t\tindexPath: string\n\t): Promise<Response>;\n\t<P extends Record<string, unknown>>(\n\t\tPageComponent: SvelteComponent<P>,\n\t\tpagePath: string,\n\t\tindexPath: string,\n\t\tprops: P\n\t): Promise<Response>;\n};\n\nexport const handleSveltePageRequest: HandleSveltePageRequest = async <\n\tP extends Record<string, unknown>\n>(\n\t_PageComponent: SvelteComponent<P>,\n\tpagePath: string,\n\tindexPath: string,\n\tprops?: P\n) => {\n\ttry {\n\t\tconst { default: ImportedPageComponent } = await import(pagePath);\n\n\t\tconst stream = await renderSvelteToReadableStream(\n\t\t\tImportedPageComponent,\n\t\t\tprops,\n\t\t\t{\n\t\t\t\tbootstrapModules: indexPath ? [indexPath] : [],\n\t\t\t\tbootstrapScriptContent: `window.__INITIAL_PROPS__=${JSON.stringify(\n\t\t\t\t\tprops\n\t\t\t\t)}`\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] Svelte render error:', error);\n\n\t\treturn new Response(ssrErrorPage('svelte', error), {\n\t\t\tstatus: 500,\n\t\t\theaders: { 'Content-Type': 'text/html' }\n\t\t});\n\t}\n};\n",
|
|
10
|
+
"export { handleSveltePageRequest } from './pageHandler';\nexport { renderToReadableStream } from './renderToReadableStream';\n"
|
|
11
|
+
],
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "F656EAB348363CBE64756E2164756E21",
|
|
14
|
+
"names": []
|
|
15
|
+
}
|
package/dist/types/build.d.ts
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import { ComponentType as ReactComponent } from 'react';
|
|
2
|
-
import { Component as SvelteComponent } from 'svelte';
|
|
3
|
-
import { Component as VueComponent } from 'vue';
|
|
4
1
|
import { build } from '../src/core/build';
|
|
5
2
|
import { devBuild } from '../src/core/devBuild';
|
|
6
3
|
export type BuildOptions = {
|
|
@@ -34,8 +31,6 @@ export type BuildConfig = {
|
|
|
34
31
|
export type BuildResult = ReturnType<typeof build>;
|
|
35
32
|
export type DevBuildResult = ReturnType<typeof devBuild>;
|
|
36
33
|
export type Result = BuildResult | DevBuildResult;
|
|
37
|
-
export type PropsOf<Component> = Component extends ReactComponent<infer Props> ? Props : Component extends SvelteComponent<infer Props> ? Props : Component extends VueComponent<infer Props> ? Props : Record<string, never>;
|
|
38
|
-
export type PropsArgs<C> = keyof PropsOf<C> extends never ? [] : [PropsOf<C>];
|
|
39
34
|
export type Prettify<T> = {
|
|
40
35
|
[K in keyof T]: T[K];
|
|
41
36
|
} & {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
declare global {
|
|
2
|
+
interface Window {
|
|
3
|
+
__HMR_FRAMEWORK__?: string;
|
|
4
|
+
__HMR_MANIFEST__?: Record<string, string>;
|
|
5
|
+
__HMR_MODULE_UPDATES__?: Array<unknown>;
|
|
6
|
+
__HMR_MODULE_VERSIONS__?: Record<string, number>;
|
|
7
|
+
__HMR_SERVER_VERSIONS__?: Record<string, number>;
|
|
8
|
+
__REACT_ROOT__?: {
|
|
9
|
+
render: (element: unknown) => void;
|
|
10
|
+
};
|
|
11
|
+
__INITIAL_PROPS__?: Record<string, unknown>;
|
|
12
|
+
__HMR_PRESERVED_STATE__?: Record<string, unknown>;
|
|
13
|
+
__HMR_UPDATE_COUNT__?: number;
|
|
14
|
+
__SVELTE_COMPONENT__?: Record<string, unknown>;
|
|
15
|
+
__SVELTE_UNMOUNT__?: () => void;
|
|
16
|
+
__HMR_WS__?: WebSocket;
|
|
17
|
+
htmx?: {
|
|
18
|
+
process: (element: HTMLElement | Document) => void;
|
|
19
|
+
};
|
|
20
|
+
__HMR_DOM_STATE__?: {
|
|
21
|
+
count?: number;
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export {};
|