diff --git a/.gitignore b/.gitignore
index b6704e5..1e89a77 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,5 +3,5 @@ dist
.turbo
# Playwright
-playwright-report/
+playwright-report*/
test-results/
diff --git a/packages/static/e2e/fixture-ssr-defer/package.json b/packages/static/e2e/fixture-ssr-defer/package.json
new file mode 100644
index 0000000..78a2313
--- /dev/null
+++ b/packages/static/e2e/fixture-ssr-defer/package.json
@@ -0,0 +1,14 @@
+{
+ "name": "e2e-fixture-ssr-defer",
+ "private": true,
+ "type": "module",
+ "devDependencies": {
+ "@funstack/static": "workspace:*",
+ "@types/react": "^19.2.14",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^5.1.4",
+ "react": "catalog:",
+ "react-dom": "catalog:",
+ "vite": "catalog:"
+ }
+}
diff --git a/packages/static/e2e/fixture-ssr-defer/src/App.tsx b/packages/static/e2e/fixture-ssr-defer/src/App.tsx
new file mode 100644
index 0000000..053c5df
--- /dev/null
+++ b/packages/static/e2e/fixture-ssr-defer/src/App.tsx
@@ -0,0 +1,13 @@
+import { defer } from "@funstack/static/entries/rsc";
+import DeferredContent from "./DeferredContent";
+
+export default function App() {
+ const deferred = defer(, { name: "DeferredContent" });
+ return (
+
+ SSR Defer Test
+ Server rendered content
+ {deferred}
+
+ );
+}
diff --git a/packages/static/e2e/fixture-ssr-defer/src/DeferredContent.tsx b/packages/static/e2e/fixture-ssr-defer/src/DeferredContent.tsx
new file mode 100644
index 0000000..1aed12e
--- /dev/null
+++ b/packages/static/e2e/fixture-ssr-defer/src/DeferredContent.tsx
@@ -0,0 +1,3 @@
+export default function DeferredContent() {
+ return
Hello from deferred component
;
+}
diff --git a/packages/static/e2e/fixture-ssr-defer/src/root.tsx b/packages/static/e2e/fixture-ssr-defer/src/root.tsx
new file mode 100644
index 0000000..a5c7104
--- /dev/null
+++ b/packages/static/e2e/fixture-ssr-defer/src/root.tsx
@@ -0,0 +1,11 @@
+export default function Root({ children }: { children: React.ReactNode }) {
+ return (
+
+
+
+ SSR Defer Test
+
+ {children}
+
+ );
+}
diff --git a/packages/static/e2e/fixture-ssr-defer/vite.config.ts b/packages/static/e2e/fixture-ssr-defer/vite.config.ts
new file mode 100644
index 0000000..f686fba
--- /dev/null
+++ b/packages/static/e2e/fixture-ssr-defer/vite.config.ts
@@ -0,0 +1,14 @@
+import funstackStatic from "@funstack/static";
+import react from "@vitejs/plugin-react";
+import { defineConfig } from "vite";
+
+export default defineConfig({
+ plugins: [
+ funstackStatic({
+ root: "./src/root.tsx",
+ app: "./src/App.tsx",
+ ssr: true,
+ }),
+ react(),
+ ],
+});
diff --git a/packages/static/e2e/playwright-dev.config.ts b/packages/static/e2e/playwright-dev.config.ts
index a78d44a..0e6db32 100644
--- a/packages/static/e2e/playwright-dev.config.ts
+++ b/packages/static/e2e/playwright-dev.config.ts
@@ -29,6 +29,14 @@ export default defineConfig({
},
testMatch: /\/multi-entry\.spec\.ts$/,
},
+ {
+ name: "ssr-defer-dev",
+ use: {
+ ...devices["Desktop Chrome"],
+ baseURL: "http://localhost:4178",
+ },
+ testMatch: /\/ssr-defer\.spec\.ts$/,
+ },
],
webServer: [
@@ -45,5 +53,11 @@ export default defineConfig({
reuseExistingServer: !process.env.CI,
timeout: 120000,
},
+ {
+ command: "cd fixture-ssr-defer && pnpm vite dev --port 4178 --strictPort",
+ url: "http://localhost:4178/@vite/client",
+ reuseExistingServer: !process.env.CI,
+ timeout: 120000,
+ },
],
});
diff --git a/packages/static/e2e/playwright.config.ts b/packages/static/e2e/playwright.config.ts
index 08eb19f..16dbc9e 100644
--- a/packages/static/e2e/playwright.config.ts
+++ b/packages/static/e2e/playwright.config.ts
@@ -29,6 +29,14 @@ export default defineConfig({
},
testMatch: /\/multi-entry\.spec\.ts$/,
},
+ {
+ name: "ssr-defer",
+ use: {
+ ...devices["Desktop Chrome"],
+ baseURL: "http://localhost:4177",
+ },
+ testMatch: /\/ssr-defer\.spec\.ts$/,
+ },
],
webServer: [
@@ -46,5 +54,12 @@ export default defineConfig({
reuseExistingServer: !process.env.CI,
timeout: 120000,
},
+ {
+ command:
+ "cd fixture-ssr-defer && pnpm vite build && pnpm dlx serve -p 4177 dist/public",
+ url: "http://localhost:4177",
+ reuseExistingServer: !process.env.CI,
+ timeout: 120000,
+ },
],
});
diff --git a/packages/static/e2e/tests-dev/ssr-defer.spec.ts b/packages/static/e2e/tests-dev/ssr-defer.spec.ts
new file mode 100644
index 0000000..65f3df5
--- /dev/null
+++ b/packages/static/e2e/tests-dev/ssr-defer.spec.ts
@@ -0,0 +1,35 @@
+import { expect, test } from "@playwright/test";
+
+const htmlHeaders = { Accept: "text/html" };
+
+test.describe("SSR with defer() (dev server)", () => {
+ test("deferred content is server-rendered in HTML", async ({ request }) => {
+ const response = await request.get("/", { headers: htmlHeaders });
+ expect(response.ok()).toBe(true);
+
+ const html = await response.text();
+
+ // The deferred component's content should be present in SSR HTML
+ expect(html).toContain("Hello from deferred component");
+ });
+
+ test("page renders without errors", async ({ page }) => {
+ const errors: string[] = [];
+
+ page.on("pageerror", (error) => {
+ errors.push(error.message);
+ });
+
+ await page.goto("/");
+
+ await expect(page.locator("h1")).toHaveText("SSR Defer Test");
+ await expect(page.getByTestId("server-rendered")).toHaveText(
+ "Server rendered content",
+ );
+ await expect(page.getByTestId("deferred-content")).toHaveText(
+ "Hello from deferred component",
+ );
+
+ expect(errors).toEqual([]);
+ });
+});
diff --git a/packages/static/e2e/tests/ssr-defer.spec.ts b/packages/static/e2e/tests/ssr-defer.spec.ts
new file mode 100644
index 0000000..22a14ec
--- /dev/null
+++ b/packages/static/e2e/tests/ssr-defer.spec.ts
@@ -0,0 +1,33 @@
+import { expect, test } from "@playwright/test";
+
+test.describe("SSR with defer()", () => {
+ test("deferred content is server-rendered in HTML", async ({ request }) => {
+ const response = await request.get("/");
+ expect(response.ok()).toBe(true);
+
+ const html = await response.text();
+
+ // The deferred component's content should be present in SSR HTML
+ expect(html).toContain("Hello from deferred component");
+ });
+
+ test("page renders without errors", async ({ page }) => {
+ const errors: string[] = [];
+
+ page.on("pageerror", (error) => {
+ errors.push(error.message);
+ });
+
+ await page.goto("/");
+
+ await expect(page.locator("h1")).toHaveText("SSR Defer Test");
+ await expect(page.getByTestId("server-rendered")).toHaveText(
+ "Server rendered content",
+ );
+ await expect(page.getByTestId("deferred-content")).toHaveText(
+ "Hello from deferred component",
+ );
+
+ expect(errors).toEqual([]);
+ });
+});
diff --git a/packages/static/src/rsc/entry.tsx b/packages/static/src/rsc/entry.tsx
index f9a1099..39bff3b 100644
--- a/packages/static/src/rsc/entry.tsx
+++ b/packages/static/src/rsc/entry.tsx
@@ -81,6 +81,7 @@ async function renderEntryToResponse(
appEntryMarker: marker,
build: false,
ssr: true,
+ deferRegistry,
});
timings.push(`ssr;dur=${performance.now() - ssrStart}`);
@@ -298,6 +299,7 @@ export async function build() {
appEntryMarker: marker,
build: true,
ssr: ssrEnabled,
+ deferRegistry,
});
results.push({
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f33428f..0440e78 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -219,6 +219,30 @@ importers:
specifier: 'catalog:'
version: 7.3.1(@types/node@25.2.3)(terser@5.46.0)(tsx@4.21.0)
+ packages/static/e2e/fixture-ssr-defer:
+ devDependencies:
+ '@funstack/static':
+ specifier: workspace:*
+ version: link:../..
+ '@types/react':
+ specifier: ^19.2.14
+ version: 19.2.14
+ '@types/react-dom':
+ specifier: ^19.2.3
+ version: 19.2.3(@types/react@19.2.14)
+ '@vitejs/plugin-react':
+ specifier: ^5.1.4
+ version: 5.1.4(vite@7.3.1(@types/node@25.2.3)(terser@5.46.0)(tsx@4.21.0))
+ react:
+ specifier: 'catalog:'
+ version: 19.2.4
+ react-dom:
+ specifier: 'catalog:'
+ version: 19.2.4(react@19.2.4)
+ vite:
+ specifier: 'catalog:'
+ version: 7.3.1(@types/node@25.2.3)(terser@5.46.0)(tsx@4.21.0)
+
packages:
'@acemir/cssom@0.9.31':
@@ -428,312 +452,156 @@ packages:
'@emnapi/wasi-threads@1.1.0':
resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==}
- '@esbuild/aix-ppc64@0.27.2':
- resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==}
- engines: {node: '>=18'}
- cpu: [ppc64]
- os: [aix]
-
'@esbuild/aix-ppc64@0.27.3':
resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
- '@esbuild/android-arm64@0.27.2':
- resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [android]
-
'@esbuild/android-arm64@0.27.3':
resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
- '@esbuild/android-arm@0.27.2':
- resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==}
- engines: {node: '>=18'}
- cpu: [arm]
- os: [android]
-
'@esbuild/android-arm@0.27.3':
resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
- '@esbuild/android-x64@0.27.2':
- resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [android]
-
'@esbuild/android-x64@0.27.3':
resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
- '@esbuild/darwin-arm64@0.27.2':
- resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [darwin]
-
'@esbuild/darwin-arm64@0.27.3':
resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
- '@esbuild/darwin-x64@0.27.2':
- resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [darwin]
-
'@esbuild/darwin-x64@0.27.3':
resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
- '@esbuild/freebsd-arm64@0.27.2':
- resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [freebsd]
-
'@esbuild/freebsd-arm64@0.27.3':
resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
- '@esbuild/freebsd-x64@0.27.2':
- resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [freebsd]
-
'@esbuild/freebsd-x64@0.27.3':
resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
- '@esbuild/linux-arm64@0.27.2':
- resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [linux]
-
'@esbuild/linux-arm64@0.27.3':
resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
- '@esbuild/linux-arm@0.27.2':
- resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==}
- engines: {node: '>=18'}
- cpu: [arm]
- os: [linux]
-
'@esbuild/linux-arm@0.27.3':
resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
- '@esbuild/linux-ia32@0.27.2':
- resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==}
- engines: {node: '>=18'}
- cpu: [ia32]
- os: [linux]
-
'@esbuild/linux-ia32@0.27.3':
resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
- '@esbuild/linux-loong64@0.27.2':
- resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==}
- engines: {node: '>=18'}
- cpu: [loong64]
- os: [linux]
-
'@esbuild/linux-loong64@0.27.3':
resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
- '@esbuild/linux-mips64el@0.27.2':
- resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==}
- engines: {node: '>=18'}
- cpu: [mips64el]
- os: [linux]
-
'@esbuild/linux-mips64el@0.27.3':
resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
- '@esbuild/linux-ppc64@0.27.2':
- resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==}
- engines: {node: '>=18'}
- cpu: [ppc64]
- os: [linux]
-
'@esbuild/linux-ppc64@0.27.3':
resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
- '@esbuild/linux-riscv64@0.27.2':
- resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==}
- engines: {node: '>=18'}
- cpu: [riscv64]
- os: [linux]
-
'@esbuild/linux-riscv64@0.27.3':
resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
- '@esbuild/linux-s390x@0.27.2':
- resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==}
- engines: {node: '>=18'}
- cpu: [s390x]
- os: [linux]
-
'@esbuild/linux-s390x@0.27.3':
resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
- '@esbuild/linux-x64@0.27.2':
- resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [linux]
-
'@esbuild/linux-x64@0.27.3':
resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
- '@esbuild/netbsd-arm64@0.27.2':
- resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [netbsd]
-
'@esbuild/netbsd-arm64@0.27.3':
resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
- '@esbuild/netbsd-x64@0.27.2':
- resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [netbsd]
-
'@esbuild/netbsd-x64@0.27.3':
resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
- '@esbuild/openbsd-arm64@0.27.2':
- resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [openbsd]
-
'@esbuild/openbsd-arm64@0.27.3':
resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
- '@esbuild/openbsd-x64@0.27.2':
- resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [openbsd]
-
'@esbuild/openbsd-x64@0.27.3':
resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
- '@esbuild/openharmony-arm64@0.27.2':
- resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [openharmony]
-
'@esbuild/openharmony-arm64@0.27.3':
resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openharmony]
- '@esbuild/sunos-x64@0.27.2':
- resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [sunos]
-
'@esbuild/sunos-x64@0.27.3':
resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
- '@esbuild/win32-arm64@0.27.2':
- resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [win32]
-
'@esbuild/win32-arm64@0.27.3':
resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
- '@esbuild/win32-ia32@0.27.2':
- resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==}
- engines: {node: '>=18'}
- cpu: [ia32]
- os: [win32]
-
'@esbuild/win32-ia32@0.27.3':
resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
- '@esbuild/win32-x64@0.27.2':
- resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [win32]
-
'@esbuild/win32-x64@0.27.3':
resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==}
engines: {node: '>=18'}
@@ -1694,11 +1562,6 @@ packages:
esast-util-from-js@2.0.1:
resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==}
- esbuild@0.27.2:
- resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==}
- engines: {node: '>=18'}
- hasBin: true
-
esbuild@0.27.3:
resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==}
engines: {node: '>=18'}
@@ -2937,159 +2800,81 @@ snapshots:
tslib: 2.8.1
optional: true
- '@esbuild/aix-ppc64@0.27.2':
- optional: true
-
'@esbuild/aix-ppc64@0.27.3':
optional: true
- '@esbuild/android-arm64@0.27.2':
- optional: true
-
'@esbuild/android-arm64@0.27.3':
optional: true
- '@esbuild/android-arm@0.27.2':
- optional: true
-
'@esbuild/android-arm@0.27.3':
optional: true
- '@esbuild/android-x64@0.27.2':
- optional: true
-
'@esbuild/android-x64@0.27.3':
optional: true
- '@esbuild/darwin-arm64@0.27.2':
- optional: true
-
'@esbuild/darwin-arm64@0.27.3':
optional: true
- '@esbuild/darwin-x64@0.27.2':
- optional: true
-
'@esbuild/darwin-x64@0.27.3':
optional: true
- '@esbuild/freebsd-arm64@0.27.2':
- optional: true
-
'@esbuild/freebsd-arm64@0.27.3':
optional: true
- '@esbuild/freebsd-x64@0.27.2':
- optional: true
-
'@esbuild/freebsd-x64@0.27.3':
optional: true
- '@esbuild/linux-arm64@0.27.2':
- optional: true
-
'@esbuild/linux-arm64@0.27.3':
optional: true
- '@esbuild/linux-arm@0.27.2':
- optional: true
-
'@esbuild/linux-arm@0.27.3':
optional: true
- '@esbuild/linux-ia32@0.27.2':
- optional: true
-
'@esbuild/linux-ia32@0.27.3':
optional: true
- '@esbuild/linux-loong64@0.27.2':
- optional: true
-
'@esbuild/linux-loong64@0.27.3':
optional: true
- '@esbuild/linux-mips64el@0.27.2':
- optional: true
-
'@esbuild/linux-mips64el@0.27.3':
optional: true
- '@esbuild/linux-ppc64@0.27.2':
- optional: true
-
'@esbuild/linux-ppc64@0.27.3':
optional: true
- '@esbuild/linux-riscv64@0.27.2':
- optional: true
-
'@esbuild/linux-riscv64@0.27.3':
optional: true
- '@esbuild/linux-s390x@0.27.2':
- optional: true
-
'@esbuild/linux-s390x@0.27.3':
optional: true
- '@esbuild/linux-x64@0.27.2':
- optional: true
-
'@esbuild/linux-x64@0.27.3':
optional: true
- '@esbuild/netbsd-arm64@0.27.2':
- optional: true
-
'@esbuild/netbsd-arm64@0.27.3':
optional: true
- '@esbuild/netbsd-x64@0.27.2':
- optional: true
-
'@esbuild/netbsd-x64@0.27.3':
optional: true
- '@esbuild/openbsd-arm64@0.27.2':
- optional: true
-
'@esbuild/openbsd-arm64@0.27.3':
optional: true
- '@esbuild/openbsd-x64@0.27.2':
- optional: true
-
'@esbuild/openbsd-x64@0.27.3':
optional: true
- '@esbuild/openharmony-arm64@0.27.2':
- optional: true
-
'@esbuild/openharmony-arm64@0.27.3':
optional: true
- '@esbuild/sunos-x64@0.27.2':
- optional: true
-
'@esbuild/sunos-x64@0.27.3':
optional: true
- '@esbuild/win32-arm64@0.27.2':
- optional: true
-
'@esbuild/win32-arm64@0.27.3':
optional: true
- '@esbuild/win32-ia32@0.27.2':
- optional: true
-
'@esbuild/win32-ia32@0.27.3':
optional: true
- '@esbuild/win32-x64@0.27.2':
- optional: true
-
'@esbuild/win32-x64@0.27.3':
optional: true
@@ -3962,35 +3747,6 @@ snapshots:
esast-util-from-estree: 2.0.0
vfile-message: 4.0.3
- esbuild@0.27.2:
- optionalDependencies:
- '@esbuild/aix-ppc64': 0.27.2
- '@esbuild/android-arm': 0.27.2
- '@esbuild/android-arm64': 0.27.2
- '@esbuild/android-x64': 0.27.2
- '@esbuild/darwin-arm64': 0.27.2
- '@esbuild/darwin-x64': 0.27.2
- '@esbuild/freebsd-arm64': 0.27.2
- '@esbuild/freebsd-x64': 0.27.2
- '@esbuild/linux-arm': 0.27.2
- '@esbuild/linux-arm64': 0.27.2
- '@esbuild/linux-ia32': 0.27.2
- '@esbuild/linux-loong64': 0.27.2
- '@esbuild/linux-mips64el': 0.27.2
- '@esbuild/linux-ppc64': 0.27.2
- '@esbuild/linux-riscv64': 0.27.2
- '@esbuild/linux-s390x': 0.27.2
- '@esbuild/linux-x64': 0.27.2
- '@esbuild/netbsd-arm64': 0.27.2
- '@esbuild/netbsd-x64': 0.27.2
- '@esbuild/openbsd-arm64': 0.27.2
- '@esbuild/openbsd-x64': 0.27.2
- '@esbuild/openharmony-arm64': 0.27.2
- '@esbuild/sunos-x64': 0.27.2
- '@esbuild/win32-arm64': 0.27.2
- '@esbuild/win32-ia32': 0.27.2
- '@esbuild/win32-x64': 0.27.2
-
esbuild@0.27.3:
optionalDependencies:
'@esbuild/aix-ppc64': 0.27.3
@@ -5210,7 +4966,7 @@ snapshots:
vite@7.3.1(@types/node@25.2.3)(terser@5.46.0)(tsx@4.21.0):
dependencies:
- esbuild: 0.27.2
+ esbuild: 0.27.3
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
postcss: 8.5.6
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 229fe18..a8711d3 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -2,6 +2,7 @@ packages:
- packages/*
- packages/static/e2e/fixture
- packages/static/e2e/fixture-multi-entry
+ - packages/static/e2e/fixture-ssr-defer
catalog:
"@types/node": ^25.2.3