treesap 0.3.5 → 0.4.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/README.md +32 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +4 -1
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js.map +1 -1
- package/dist/vite.d.ts +1 -0
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +18 -2
- package/dist/vite.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,6 +5,7 @@ Treesap is a Vite-first Node SSR framework.
|
|
|
5
5
|
This package provides:
|
|
6
6
|
|
|
7
7
|
- a small request/response app runtime for Node
|
|
8
|
+
- support for any fetch-compatible server app, including Hono
|
|
8
9
|
- router and middleware primitives
|
|
9
10
|
- static file serving with sensible cache defaults
|
|
10
11
|
- a `treesap/vite` entry for Vite dev and production builds
|
|
@@ -59,6 +60,32 @@ node dist/server/main.js
|
|
|
59
60
|
|
|
60
61
|
If your browser entry lives somewhere else, set `browserEntry` explicitly rather than relying on a fixed file location.
|
|
61
62
|
|
|
63
|
+
## Hono Server App
|
|
64
|
+
|
|
65
|
+
Treesap only requires that your server factory return an object with `fetch(request)`. That means a `Hono` app works without a second dev server:
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
/** @jsxImportSource hono/jsx */
|
|
69
|
+
import { Hono } from "hono";
|
|
70
|
+
import { jsxRenderer } from "hono/jsx-renderer";
|
|
71
|
+
|
|
72
|
+
export function createServerApp() {
|
|
73
|
+
const app = new Hono();
|
|
74
|
+
|
|
75
|
+
app.use("/*", jsxRenderer());
|
|
76
|
+
|
|
77
|
+
app.get("/", (c) => {
|
|
78
|
+
return c.render(<h1>Hello from Hono</h1>);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
app.get("/api/health", (c) => c.json({ ok: true }));
|
|
82
|
+
|
|
83
|
+
return app;
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
In production, mount your own static middleware for `dist/client`, for example `@hono/node-server/serve-static`.
|
|
88
|
+
|
|
62
89
|
## Layout Assets
|
|
63
90
|
|
|
64
91
|
Render your browser assets from server layouts with `getViteBrowserAssets()`:
|
|
@@ -67,7 +94,9 @@ Render your browser assets from server layouts with `getViteBrowserAssets()`:
|
|
|
67
94
|
import { getViteBrowserAssets } from "treesap/vite";
|
|
68
95
|
|
|
69
96
|
export default function BaseLayout(props: { children: string | object }) {
|
|
70
|
-
const browserAssets = getViteBrowserAssets(
|
|
97
|
+
const browserAssets = getViteBrowserAssets({
|
|
98
|
+
devStyles: ["/src/styles/main.css"],
|
|
99
|
+
});
|
|
71
100
|
|
|
72
101
|
return (
|
|
73
102
|
<html>
|
|
@@ -85,6 +114,8 @@ export default function BaseLayout(props: { children: string | object }) {
|
|
|
85
114
|
}
|
|
86
115
|
```
|
|
87
116
|
|
|
117
|
+
Use `devStyles` when you want an eager stylesheet `<link>` during development to avoid a flash of unstyled content before the browser entry module loads.
|
|
118
|
+
|
|
88
119
|
## Islands
|
|
89
120
|
|
|
90
121
|
Register island client entries explicitly in `defineTreesapConfig()`:
|
package/dist/index.d.ts
CHANGED
|
@@ -3,5 +3,5 @@ export { createApp, createRouter, type CreateAppOptions, type Handler, type Next
|
|
|
3
3
|
export { cors } from "./middleware/cors.ts";
|
|
4
4
|
export { Island, type IslandProps } from "./island.tsx";
|
|
5
5
|
export { serveStatic } from "./middleware/serve-static.ts";
|
|
6
|
-
export { serve, sendNodeResponse, toWebRequest } from "./node.ts";
|
|
6
|
+
export { serve, sendNodeResponse, toWebRequest, type FetchApp } from "./node.ts";
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EACL,SAAS,EACT,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,OAAO,EACZ,KAAK,IAAI,EACT,KAAK,aAAa,EAClB,SAAS,GACV,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EACL,SAAS,EACT,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,OAAO,EACZ,KAAK,IAAI,EACT,KAAK,aAAa,EAClB,SAAS,GACV,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAmB,MAAM,cAAc,CAAC;AACxD,OAAO,EACL,SAAS,EACT,YAAY,EAKZ,SAAS,GACV,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAoB,MAAM,aAAc,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAmB,MAAM,cAAc,CAAC;AACxD,OAAO,EACL,SAAS,EACT,YAAY,EAKZ,SAAS,GACV,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAoB,MAAM,aAAc,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAiB,MAAM,WAAW,CAAC","sourcesContent":["export { Context, type Renderable } from \"./context.ts\";\nexport {\n createApp,\n createRouter,\n type CreateAppOptions,\n type Handler,\n type Next,\n type HandlerResult,\n ServerApp,\n} from \"./app.ts\";\nexport { cors } from \"./middleware/cors.ts\";\nexport { Island, type IslandProps } from \"./island.tsx\";\nexport { serveStatic } from \"./middleware/serve-static.ts\";\nexport { serve, sendNodeResponse, toWebRequest, type FetchApp } from \"./node.ts\";\n"]}
|
package/dist/node.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { type IncomingMessage, type ServerResponse } from "node:http";
|
|
2
|
+
export interface FetchApp {
|
|
3
|
+
fetch(request: Request): Response | Promise<Response>;
|
|
4
|
+
}
|
|
2
5
|
export declare function toWebRequest(req: IncomingMessage): Promise<Request>;
|
|
3
6
|
export declare function sendNodeResponse(res: ServerResponse, response: Response): Promise<void>;
|
|
4
7
|
export declare function serve(options: {
|
|
5
|
-
fetch:
|
|
8
|
+
fetch: FetchApp["fetch"];
|
|
6
9
|
port: number;
|
|
7
10
|
}): import("node:http").Server<typeof IncomingMessage, typeof ServerResponse>;
|
|
8
11
|
//# sourceMappingURL=node.d.ts.map
|
package/dist/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAGpF,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,oBAoBtD;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,iBAgB7E;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE;IAC7B,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAGpF,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACvD;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,oBAoBtD;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,iBAgB7E;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE;IAC7B,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd,6EAgBA"}
|
package/dist/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAMvC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAoB;IACrD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,MAAM,CAAC;IAC5D,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,gBAAgB,CAAC;IAClD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,QAAQ,MAAM,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,IAAI,GACR,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;QAC3C,CAAC,CAAC,SAAS;QACX,CAAC,CAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAgC,CAAC;IAE1D,MAAM,IAAI,GAAsC;QAC9C,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAsB;QACnC,IAAI;KACL,CAAC;IAEF,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAmB,EAAE,QAAkB;IAC5E,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnB,GAAG,CAAC,GAAG,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAW,CAAC,CAAC;IACtD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3B,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAGrB;IACC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC9C,MAAM,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { Readable } from \"node:stream\";\n\nexport interface FetchApp {\n fetch(request: Request): Response | Promise<Response>;\n}\n\nexport async function toWebRequest(req: IncomingMessage) {\n const protocol = req.headers[\"x-forwarded-proto\"] ?? \"http\";\n const host = req.headers.host ?? \"localhost:8080\";\n const url = new URL(req.url ?? \"/\", `${protocol}://${host}`);\n const body =\n req.method === \"GET\" || req.method === \"HEAD\"\n ? undefined\n : (Readable.toWeb(req) as ReadableStream<Uint8Array>);\n\n const init: RequestInit & { duplex?: \"half\" } = {\n method: req.method,\n headers: req.headers as HeadersInit,\n body,\n };\n\n if (body) {\n init.duplex = \"half\";\n }\n\n return new Request(url, init);\n}\n\nexport async function sendNodeResponse(res: ServerResponse, response: Response) {\n res.statusCode = response.status;\n response.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n\n if (!response.body) {\n res.end();\n return;\n }\n\n const stream = Readable.fromWeb(response.body as any);\n stream.on(\"error\", (error) => {\n res.destroy(error);\n });\n stream.pipe(res);\n}\n\nexport function serve(options: {\n fetch: FetchApp[\"fetch\"];\n port: number;\n}) {\n const server = createServer(async (req, res) => {\n try {\n const request = await toWebRequest(req);\n const response = await options.fetch(request);\n await sendNodeResponse(res, response);\n } catch (error) {\n console.error(error);\n res.statusCode = 500;\n res.setHeader(\"Content-Type\", \"text/plain; charset=UTF-8\");\n res.end(\"Internal Server Error\");\n }\n });\n\n server.listen(options.port);\n return server;\n}\n"]}
|
package/dist/vite.d.ts
CHANGED
package/dist/vite.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,KAAK,UAAU,EAEhB,MAAM,MAAM,CAAC;AASd,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,UAAU,4BAA4B;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,4BAA4B,EAAE,CAAC;IACzC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAiED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,KAAK,UAAU,EAEhB,MAAM,MAAM,CAAC;AASd,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,UAAU,4BAA4B;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,4BAA4B,EAAE,CAAC;IACzC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAiED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,WAU7C;AAkTD,wBAAgB,OAAO,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,CAqGjE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,qCA6BtE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;;;EAoDA;AAMD,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;;;EAgBA;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,UAWA"}
|
package/dist/vite.js
CHANGED
|
@@ -53,6 +53,7 @@ function isFileRequest(pathname) {
|
|
|
53
53
|
}
|
|
54
54
|
export function isViteRequest(pathname) {
|
|
55
55
|
return (pathname === "/@vite/client" ||
|
|
56
|
+
pathname.startsWith("/@") ||
|
|
56
57
|
pathname.startsWith("/@fs/") ||
|
|
57
58
|
pathname.startsWith("/@id/") ||
|
|
58
59
|
pathname.startsWith("/@vite/") ||
|
|
@@ -94,7 +95,7 @@ async function loadTreesapApp(server, entry, exportName) {
|
|
|
94
95
|
}
|
|
95
96
|
const app = await createApp();
|
|
96
97
|
if (!app || typeof app.fetch !== "function") {
|
|
97
|
-
throw new Error(`Treesap app factory "${exportName}" in ${entry} did not return
|
|
98
|
+
throw new Error(`Treesap app factory "${exportName}" in ${entry} did not return a fetch-compatible app. Return Treesap's createApp() result or any object with fetch(), such as a Hono app.`);
|
|
98
99
|
}
|
|
99
100
|
return app;
|
|
100
101
|
}
|
|
@@ -151,12 +152,27 @@ function resolveIslandRuntimeEntry() {
|
|
|
151
152
|
}
|
|
152
153
|
return resolved;
|
|
153
154
|
}
|
|
155
|
+
function resolveOptionalSpaEntry(options) {
|
|
156
|
+
const root = resolveConfigRoot(options.vite);
|
|
157
|
+
const defaultSpaEntry = path.resolve(root, "src/app/main.tsx");
|
|
158
|
+
if (!existsSync(defaultSpaEntry)) {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
entry: "src/app/main.tsx",
|
|
163
|
+
absolutePath: defaultSpaEntry,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
154
166
|
function createClientBuildInputs(options) {
|
|
155
167
|
const browserEntry = resolveBrowserEntry(options);
|
|
156
168
|
const islandEntries = resolveIslandEntries(options);
|
|
169
|
+
const spaEntry = resolveOptionalSpaEntry(options);
|
|
157
170
|
const input = {
|
|
158
171
|
browser: browserEntry.absolutePath,
|
|
159
172
|
};
|
|
173
|
+
if (spaEntry) {
|
|
174
|
+
input["spa"] = spaEntry.absolutePath;
|
|
175
|
+
}
|
|
160
176
|
islandEntries.forEach((island) => {
|
|
161
177
|
input[`island-${island.name}`] = island.absolutePath;
|
|
162
178
|
});
|
|
@@ -438,7 +454,7 @@ export function getViteBrowserAssets(options) {
|
|
|
438
454
|
manifestPath: options?.manifestPath,
|
|
439
455
|
base: options?.base,
|
|
440
456
|
devScripts: ["/@vite/client"],
|
|
441
|
-
devStyles: [],
|
|
457
|
+
devStyles: options?.devStyles ?? [],
|
|
442
458
|
});
|
|
443
459
|
}
|
|
444
460
|
export function getViteModuleAsset(options) {
|
package/dist/vite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite.js","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n build,\n defineConfig,\n mergeConfig,\n type Plugin,\n type PluginOption,\n type UserConfig,\n type ViteDevServer,\n} from \"vite\";\nimport { sendNodeResponse, toWebRequest } from \"./node.ts\";\n\ninterface ManifestEntry {\n file: string;\n src?: string;\n css?: string[];\n}\n\nexport interface TreesapIslandsOptions {\n entries: Record<string, string>;\n}\n\ninterface NormalizedTreesapIslandEntry {\n name: string;\n entry: string;\n absolutePath: string;\n}\n\nexport interface TreesapVitePluginOptions {\n appEntry: string;\n appFactoryExport?: string;\n appEntryPath?: string;\n browserEntry?: string;\n islands?: NormalizedTreesapIslandEntry[];\n islandRuntimeEntry?: string;\n spaBase?: string;\n spaIndexHtml?: string;\n spaEntryModule?: string;\n}\n\nexport interface DefineTreesapConfigOptions {\n appEntry: string;\n appFactoryExport?: string;\n serverEntry?: string;\n browserEntry?: string;\n islands?: TreesapIslandsOptions;\n plugins?: PluginOption[];\n vite?: UserConfig;\n}\n\nfunction resolveRuntimeMode() {\n const viteEnv = (import.meta as ImportMeta & {\n env?: { PROD?: boolean };\n }).env;\n\n if (viteEnv?.PROD === true || process.env.NODE_ENV === \"production\") {\n return \"production\";\n }\n\n return \"development\";\n}\n\nfunction normalizePublicPath(href: string, base: string) {\n if (href.startsWith(\"/\")) {\n return href;\n }\n\n return `${base.replace(/\\/$/, \"\")}/${href}`;\n}\n\nfunction resolveDefaultManifestPath() {\n const candidates = [\n path.resolve(process.cwd(), \"dist/client/.vite/manifest.json\"),\n path.resolve(process.cwd(), \"static/.vite/manifest.json\"),\n path.resolve(process.cwd(), \"static/app/.vite/manifest.json\"),\n ];\n\n return candidates.find((candidate) => existsSync(candidate)) ?? candidates[0];\n}\n\nfunction normalizeManifestLookupPath(entry: string) {\n const normalized = path.posix.normalize(entry.replaceAll(\"\\\\\", \"/\"));\n return normalized\n .replace(/^\\/+/, \"\")\n .replace(/^(\\.\\.\\/)+/, \"\")\n .replace(/^\\.\\//, \"\");\n}\n\nfunction stripQuery(id: string) {\n return id.replace(/\\?.*$/, \"\");\n}\n\nfunction createDevEntryScriptPath(entry: string) {\n if (path.isAbsolute(entry)) {\n return `/@fs/${entry.replaceAll(\"\\\\\", \"/\").replace(/^\\/+/, \"\")}`;\n }\n\n return `/${normalizeManifestLookupPath(entry)}`;\n}\n\nfunction normalizeSpaBase(base: string) {\n if (!base.startsWith(\"/\")) {\n return `/${base}`;\n }\n\n return base.endsWith(\"/\") ? base.slice(0, -1) : base;\n}\n\nfunction isFileRequest(pathname: string) {\n const lastSegment = pathname.split(\"/\").at(-1) ?? \"\";\n return lastSegment.includes(\".\");\n}\n\nexport function isViteRequest(pathname: string) {\n return (\n pathname === \"/@vite/client\" ||\n pathname.startsWith(\"/@fs/\") ||\n pathname.startsWith(\"/@id/\") ||\n pathname.startsWith(\"/@vite/\") ||\n pathname.startsWith(\"/node_modules/\") ||\n pathname.startsWith(\"/src/\")\n );\n}\n\nfunction maybeRewriteSpaAssetRequest(url: string, spaBase: string) {\n const currentUrl = new URL(url, \"http://treesap.local\");\n if (!currentUrl.pathname.startsWith(`${spaBase}/`)) {\n return null;\n }\n\n const strippedPathname = currentUrl.pathname.slice(spaBase.length) || \"/\";\n\n if (!isViteRequest(strippedPathname) && !isFileRequest(strippedPathname)) {\n return null;\n }\n\n currentUrl.pathname = strippedPathname;\n return `${currentUrl.pathname}${currentUrl.search}`;\n}\n\nfunction isSpaShellRequest(pathname: string, spaBase: string) {\n if (pathname === spaBase || pathname === `${spaBase}/`) {\n return true;\n }\n\n if (!pathname.startsWith(`${spaBase}/`)) {\n return false;\n }\n\n const suffix = pathname.slice(spaBase.length + 1);\n return suffix.length > 0 && !suffix.split(\"/\").at(-1)?.includes(\".\");\n}\n\nasync function renderSpaShell(\n server: ViteDevServer,\n pathname: string,\n options: Required<Pick<TreesapVitePluginOptions, \"spaIndexHtml\" | \"spaEntryModule\">>\n) {\n const templatePath = path.resolve(server.config.root, options.spaIndexHtml);\n const template = (await readFile(templatePath, \"utf-8\")).replace(\n \"./main.tsx\",\n options.spaEntryModule\n );\n return server.transformIndexHtml(pathname, template);\n}\n\nasync function loadTreesapApp(server: ViteDevServer, entry: string, exportName: string) {\n const module = await server.ssrLoadModule(entry);\n const createApp = module[exportName];\n\n if (typeof createApp !== \"function\") {\n throw new Error(\n `Treesap could not find exported app factory \"${exportName}\" in ${entry}.`\n );\n }\n\n const app = await createApp();\n if (!app || typeof app.fetch !== \"function\") {\n throw new Error(\n `Treesap app factory \"${exportName}\" in ${entry} did not return an object with fetch().`\n );\n }\n\n return app as { fetch(request: Request): Response | Promise<Response> };\n}\n\nfunction resolveConfigRoot(viteConfig?: UserConfig) {\n return path.resolve(viteConfig?.root ?? process.cwd());\n}\n\nfunction resolveBrowserEntry(options: DefineTreesapConfigOptions) {\n const root = resolveConfigRoot(options.vite);\n const browserEntry = options.browserEntry ?? \"src/treesap-client.ts\";\n const absolutePath = path.resolve(root, browserEntry);\n\n if (!existsSync(absolutePath)) {\n if (options.browserEntry) {\n throw new Error(\n `Treesap could not find browserEntry \"${options.browserEntry}\". Check the path or update defineTreesapConfig({ browserEntry }).`\n );\n }\n\n throw new Error(\n 'Treesap could not find the default browser entry \"src/treesap-client.ts\". Set browserEntry in defineTreesapConfig(...) if your client entry lives elsewhere.'\n );\n }\n\n return {\n entry: normalizeManifestLookupPath(browserEntry),\n absolutePath,\n };\n}\n\nfunction resolveAppEntry(options: DefineTreesapConfigOptions) {\n const root = resolveConfigRoot(options.vite);\n\n return path.resolve(root, options.appEntry);\n}\n\nfunction resolveIslandEntries(\n options: DefineTreesapConfigOptions\n): NormalizedTreesapIslandEntry[] {\n const root = resolveConfigRoot(options.vite);\n const rawEntries = options.islands?.entries ?? {};\n\n return Object.entries(rawEntries).map(([name, entry]) => {\n const normalizedName = name.trim();\n const normalizedEntry = entry.trim();\n\n if (!normalizedName) {\n throw new Error(\"Treesap islands entries must have a non-empty name.\");\n }\n\n if (!normalizedEntry) {\n throw new Error(\n `Treesap island \"${normalizedName}\" must point to a non-empty entry path.`\n );\n }\n\n return {\n name: normalizedName,\n entry: normalizeManifestLookupPath(normalizedEntry),\n absolutePath: path.resolve(root, normalizedEntry),\n };\n });\n}\n\nfunction resolveIslandRuntimeEntry() {\n const runtimeDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(runtimeDir, \"island-runtime.js\"),\n path.resolve(runtimeDir, \"island-runtime.ts\"),\n ];\n\n const resolved = candidates.find((candidate) => existsSync(candidate));\n if (!resolved) {\n throw new Error(\"Treesap could not resolve its island runtime module.\");\n }\n\n return resolved;\n}\n\nfunction createClientBuildInputs(options: DefineTreesapConfigOptions) {\n const browserEntry = resolveBrowserEntry(options);\n const islandEntries = resolveIslandEntries(options);\n\n const input: Record<string, string> = {\n browser: browserEntry.absolutePath,\n };\n\n islandEntries.forEach((island) => {\n input[`island-${island.name}`] = island.absolutePath;\n });\n\n if (islandEntries.length > 0) {\n input[\"treesap-island-runtime\"] = resolveIslandRuntimeEntry();\n }\n\n return input;\n}\n\nfunction createTreesapDefineConfig(options: DefineTreesapConfigOptions) {\n const islandEntries = Object.fromEntries(\n resolveIslandEntries(options).map((entry) => [entry.name, entry.entry])\n );\n\n return {\n \"globalThis.__TREESAP_ISLANDS__\": JSON.stringify(islandEntries),\n };\n}\n\nfunction createTreesapSharedConfig(options: DefineTreesapConfigOptions): UserConfig {\n const root = resolveConfigRoot(options.vite);\n\n return mergeConfig(\n {\n appType: \"custom\",\n root,\n define: createTreesapDefineConfig(options),\n ssr: {\n noExternal: [\"hono\"],\n },\n },\n {\n ...(options.vite ?? {}),\n plugins: undefined,\n }\n );\n}\n\nfunction createTreesapDevConfig(options: DefineTreesapConfigOptions): UserConfig {\n const browserEntry = resolveBrowserEntry(options);\n\n return mergeConfig(createTreesapSharedConfig(options), {\n base: \"/\",\n plugins: [\n treesap({\n appEntry: options.appEntry,\n appFactoryExport: options.appFactoryExport,\n appEntryPath: resolveAppEntry(options),\n browserEntry: browserEntry.entry,\n islands: resolveIslandEntries(options),\n islandRuntimeEntry: resolveIslandRuntimeEntry(),\n }),\n ...(options.plugins ?? []),\n ],\n });\n}\n\nfunction createTreesapClientBuildConfig(\n options: DefineTreesapConfigOptions\n): UserConfig {\n const root = resolveConfigRoot(options.vite);\n const browserEntry = resolveBrowserEntry(options);\n\n return mergeConfig(createTreesapSharedConfig(options), {\n base: \"/\",\n publicDir: path.resolve(root, \"public\"),\n plugins: [\n treesap({\n appEntry: options.appEntry,\n appFactoryExport: options.appFactoryExport,\n appEntryPath: resolveAppEntry(options),\n browserEntry: browserEntry.entry,\n islands: resolveIslandEntries(options),\n islandRuntimeEntry: resolveIslandRuntimeEntry(),\n }),\n ...(options.plugins ?? []),\n ],\n build: {\n manifest: true,\n outDir: \"dist/client\",\n emptyOutDir: true,\n rolldownOptions: {\n input: createClientBuildInputs(options),\n },\n },\n });\n}\n\nfunction createTreesapServerBuildConfig(\n options: DefineTreesapConfigOptions\n): UserConfig {\n const browserEntry = resolveBrowserEntry(options);\n\n return mergeConfig(createTreesapSharedConfig(options), {\n base: \"/\",\n publicDir: false,\n plugins: [\n treesap({\n appEntry: options.appEntry,\n appFactoryExport: options.appFactoryExport,\n appEntryPath: resolveAppEntry(options),\n browserEntry: browserEntry.entry,\n islands: resolveIslandEntries(options),\n islandRuntimeEntry: resolveIslandRuntimeEntry(),\n }),\n ...(options.plugins ?? []),\n ],\n build: {\n ssr: options.serverEntry ?? \"src/main.tsx\",\n target: \"node22\",\n outDir: \"dist/server\",\n sourcemap: true,\n emptyOutDir: false,\n rolldownOptions: {\n external: [\n \"fs\",\n \"path\",\n \"url\",\n \"module\",\n \"crypto\",\n \"stream\",\n /^node:/,\n ],\n output: {\n format: \"esm\",\n },\n },\n },\n oxc: {\n jsx: {\n runtime: \"automatic\",\n importSource: \"hono/jsx\",\n },\n },\n });\n}\n\nexport function treesap(options: TreesapVitePluginOptions): Plugin {\n const spaBase = normalizeSpaBase(options.spaBase ?? \"/app\");\n const appFactoryExport = options.appFactoryExport ?? \"createServerApp\";\n const spaIndexHtml = options.spaIndexHtml ?? \"src/app/index.html\";\n const spaEntryModule = options.spaEntryModule ?? \"/src/app/main.tsx\";\n const appEntryPath = options.appEntryPath ? path.resolve(options.appEntryPath) : null;\n const islandEntries = options.islands ?? [];\n const islandRuntimeEntry = options.islandRuntimeEntry\n ? path.resolve(options.islandRuntimeEntry)\n : null;\n\n return {\n name: \"treesap\",\n transform(code, id) {\n const hasBrowserEntry = Boolean(options.browserEntry);\n const hasIslands = islandEntries.length > 0;\n\n if (!hasBrowserEntry && !hasIslands) {\n return null;\n }\n\n const moduleId = path.resolve(stripQuery(id));\n const injectedGlobals = [\n hasIslands\n ? `globalThis.__TREESAP_ISLANDS__ = ${JSON.stringify(\n Object.fromEntries(islandEntries.map((entry) => [entry.name, entry.entry]))\n )};`\n : null,\n hasBrowserEntry\n ? `globalThis.__TREESAP_BROWSER_ENTRY__ = ${JSON.stringify(\n normalizeManifestLookupPath(options.browserEntry)\n )};`\n : null,\n hasIslands && islandRuntimeEntry\n ? `globalThis.__TREESAP_ISLAND_RUNTIME_ENTRY__ = ${JSON.stringify(\n islandRuntimeEntry\n )};`\n : null,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n if (appEntryPath && moduleId === appEntryPath) {\n const alreadyInjected =\n (!hasIslands || code.includes(\"globalThis.__TREESAP_ISLANDS__\")) &&\n (!hasBrowserEntry || code.includes(\"globalThis.__TREESAP_BROWSER_ENTRY__\")) &&\n (!hasIslands ||\n code.includes(\"globalThis.__TREESAP_ISLAND_RUNTIME_ENTRY__\"));\n\n if (alreadyInjected) {\n return null;\n }\n\n return {\n code: `${injectedGlobals}\\n${code}`,\n map: null,\n };\n }\n\n return null;\n },\n configureServer(server) {\n server.middlewares.use(async (req, res, next) => {\n const rewrittenUrl = maybeRewriteSpaAssetRequest(req.url ?? \"/\", spaBase);\n if (rewrittenUrl) {\n req.url = rewrittenUrl;\n }\n\n const pathname = new URL(req.url ?? \"/\", \"http://treesap.local\").pathname;\n\n try {\n if (isViteRequest(pathname)) {\n next();\n return;\n }\n\n if (isSpaShellRequest(pathname, spaBase)) {\n const html = await renderSpaShell(server, pathname, {\n spaIndexHtml,\n spaEntryModule,\n });\n res.statusCode = 200;\n res.setHeader(\"Content-Type\", \"text/html; charset=UTF-8\");\n res.end(html);\n return;\n }\n\n const app = await loadTreesapApp(server, options.appEntry, appFactoryExport);\n const request = await toWebRequest(req);\n const response = await app.fetch(request);\n await sendNodeResponse(res, response);\n } catch (error) {\n server.ssrFixStacktrace(error as Error);\n console.error(error);\n res.statusCode = 500;\n res.setHeader(\"Content-Type\", \"text/plain; charset=UTF-8\");\n res.end(\"Internal Server Error\");\n }\n });\n },\n };\n}\n\nexport function defineTreesapConfig(options: DefineTreesapConfigOptions) {\n return defineConfig(({ command }) => {\n if (command === \"serve\") {\n return createTreesapDevConfig(options);\n }\n\n return {\n ...createTreesapSharedConfig(options),\n base: \"/\",\n publicDir: false,\n builder: {\n async buildApp(builder) {\n await build({\n ...createTreesapClientBuildConfig(options),\n configFile: false,\n });\n\n await build({\n ...createTreesapServerBuildConfig(options),\n configFile: false,\n });\n\n Object.values(builder.environments).forEach((environment) => {\n environment.isBuilt = true;\n });\n },\n },\n };\n });\n}\n\nexport function getViteEntryAssets(options: {\n entry: string;\n mode?: string;\n devScripts?: string[];\n devStyles?: string[];\n manifestPath?: string;\n base?: string;\n}) {\n const mode = options.mode ?? resolveRuntimeMode();\n if (mode !== \"production\") {\n const scripts = Array.from(\n new Set([\n ...(options.devScripts ?? []),\n createDevEntryScriptPath(options.entry),\n ])\n );\n\n return {\n scripts,\n styles: options.devStyles ?? [],\n };\n }\n\n const manifestPath = options.manifestPath ?? resolveDefaultManifestPath();\n const base = options.base ?? \"/\";\n\n if (!existsSync(manifestPath)) {\n return {\n scripts: [] as string[],\n styles: [] as string[],\n };\n }\n\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf-8\")) as Record<\n string,\n ManifestEntry\n >;\n const lookupEntry = normalizeManifestLookupPath(options.entry);\n\n const entry =\n manifest[options.entry] ??\n Object.entries(manifest).find(([key, value]) => {\n const normalizedKey = normalizeManifestLookupPath(key);\n const normalizedSrc = value.src\n ? normalizeManifestLookupPath(value.src)\n : undefined;\n\n return (\n normalizedKey === lookupEntry ||\n normalizedKey.endsWith(lookupEntry) ||\n normalizedSrc === lookupEntry ||\n normalizedSrc?.endsWith(lookupEntry) === true\n );\n })?.[1];\n\n return {\n scripts: entry?.file ? [normalizePublicPath(entry.file, base)] : [],\n styles: (entry?.css ?? []).map((href) => normalizePublicPath(href, base)),\n };\n}\n\nfunction getRegisteredBrowserEntry() {\n return globalThis.__TREESAP_BROWSER_ENTRY__ ?? null;\n}\n\nexport function getViteBrowserAssets(options?: {\n mode?: string;\n manifestPath?: string;\n base?: string;\n}) {\n const entry = getRegisteredBrowserEntry();\n if (!entry) {\n throw new Error(\n \"Treesap browser entry is not registered. Set browserEntry in defineTreesapConfig(...) or restart Vite.\"\n );\n }\n\n return getViteEntryAssets({\n entry,\n mode: options?.mode,\n manifestPath: options?.manifestPath,\n base: options?.base,\n devScripts: [\"/@vite/client\"],\n devStyles: [],\n });\n}\n\nexport function getViteModuleAsset(options: {\n entry: string;\n mode?: string;\n manifestPath?: string;\n base?: string;\n}) {\n return (\n getViteEntryAssets({\n entry: options.entry,\n mode: options.mode,\n manifestPath: options.manifestPath,\n base: options.base,\n devScripts: [createDevEntryScriptPath(options.entry)],\n devStyles: [],\n }).scripts[0] ?? null\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"vite.js","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n build,\n defineConfig,\n mergeConfig,\n type Plugin,\n type PluginOption,\n type UserConfig,\n type ViteDevServer,\n} from \"vite\";\nimport { sendNodeResponse, toWebRequest, type FetchApp } from \"./node.ts\";\n\ninterface ManifestEntry {\n file: string;\n src?: string;\n css?: string[];\n}\n\nexport interface TreesapIslandsOptions {\n entries: Record<string, string>;\n}\n\ninterface NormalizedTreesapIslandEntry {\n name: string;\n entry: string;\n absolutePath: string;\n}\n\nexport interface TreesapVitePluginOptions {\n appEntry: string;\n appFactoryExport?: string;\n appEntryPath?: string;\n browserEntry?: string;\n islands?: NormalizedTreesapIslandEntry[];\n islandRuntimeEntry?: string;\n spaBase?: string;\n spaIndexHtml?: string;\n spaEntryModule?: string;\n}\n\nexport interface DefineTreesapConfigOptions {\n appEntry: string;\n appFactoryExport?: string;\n serverEntry?: string;\n browserEntry?: string;\n islands?: TreesapIslandsOptions;\n plugins?: PluginOption[];\n vite?: UserConfig;\n}\n\nfunction resolveRuntimeMode() {\n const viteEnv = (import.meta as ImportMeta & {\n env?: { PROD?: boolean };\n }).env;\n\n if (viteEnv?.PROD === true || process.env.NODE_ENV === \"production\") {\n return \"production\";\n }\n\n return \"development\";\n}\n\nfunction normalizePublicPath(href: string, base: string) {\n if (href.startsWith(\"/\")) {\n return href;\n }\n\n return `${base.replace(/\\/$/, \"\")}/${href}`;\n}\n\nfunction resolveDefaultManifestPath() {\n const candidates = [\n path.resolve(process.cwd(), \"dist/client/.vite/manifest.json\"),\n path.resolve(process.cwd(), \"static/.vite/manifest.json\"),\n path.resolve(process.cwd(), \"static/app/.vite/manifest.json\"),\n ];\n\n return candidates.find((candidate) => existsSync(candidate)) ?? candidates[0];\n}\n\nfunction normalizeManifestLookupPath(entry: string) {\n const normalized = path.posix.normalize(entry.replaceAll(\"\\\\\", \"/\"));\n return normalized\n .replace(/^\\/+/, \"\")\n .replace(/^(\\.\\.\\/)+/, \"\")\n .replace(/^\\.\\//, \"\");\n}\n\nfunction stripQuery(id: string) {\n return id.replace(/\\?.*$/, \"\");\n}\n\nfunction createDevEntryScriptPath(entry: string) {\n if (path.isAbsolute(entry)) {\n return `/@fs/${entry.replaceAll(\"\\\\\", \"/\").replace(/^\\/+/, \"\")}`;\n }\n\n return `/${normalizeManifestLookupPath(entry)}`;\n}\n\nfunction normalizeSpaBase(base: string) {\n if (!base.startsWith(\"/\")) {\n return `/${base}`;\n }\n\n return base.endsWith(\"/\") ? base.slice(0, -1) : base;\n}\n\nfunction isFileRequest(pathname: string) {\n const lastSegment = pathname.split(\"/\").at(-1) ?? \"\";\n return lastSegment.includes(\".\");\n}\n\nexport function isViteRequest(pathname: string) {\n return (\n pathname === \"/@vite/client\" ||\n pathname.startsWith(\"/@\") ||\n pathname.startsWith(\"/@fs/\") ||\n pathname.startsWith(\"/@id/\") ||\n pathname.startsWith(\"/@vite/\") ||\n pathname.startsWith(\"/node_modules/\") ||\n pathname.startsWith(\"/src/\")\n );\n}\n\nfunction maybeRewriteSpaAssetRequest(url: string, spaBase: string) {\n const currentUrl = new URL(url, \"http://treesap.local\");\n if (!currentUrl.pathname.startsWith(`${spaBase}/`)) {\n return null;\n }\n\n const strippedPathname = currentUrl.pathname.slice(spaBase.length) || \"/\";\n\n if (!isViteRequest(strippedPathname) && !isFileRequest(strippedPathname)) {\n return null;\n }\n\n currentUrl.pathname = strippedPathname;\n return `${currentUrl.pathname}${currentUrl.search}`;\n}\n\nfunction isSpaShellRequest(pathname: string, spaBase: string) {\n if (pathname === spaBase || pathname === `${spaBase}/`) {\n return true;\n }\n\n if (!pathname.startsWith(`${spaBase}/`)) {\n return false;\n }\n\n const suffix = pathname.slice(spaBase.length + 1);\n return suffix.length > 0 && !suffix.split(\"/\").at(-1)?.includes(\".\");\n}\n\nasync function renderSpaShell(\n server: ViteDevServer,\n pathname: string,\n options: Required<Pick<TreesapVitePluginOptions, \"spaIndexHtml\" | \"spaEntryModule\">>\n) {\n const templatePath = path.resolve(server.config.root, options.spaIndexHtml);\n const template = (await readFile(templatePath, \"utf-8\")).replace(\n \"./main.tsx\",\n options.spaEntryModule\n );\n return server.transformIndexHtml(pathname, template);\n}\n\nasync function loadTreesapApp(server: ViteDevServer, entry: string, exportName: string) {\n const module = await server.ssrLoadModule(entry);\n const createApp = module[exportName];\n\n if (typeof createApp !== \"function\") {\n throw new Error(\n `Treesap could not find exported app factory \"${exportName}\" in ${entry}.`\n );\n }\n\n const app = await createApp();\n if (!app || typeof app.fetch !== \"function\") {\n throw new Error(\n `Treesap app factory \"${exportName}\" in ${entry} did not return a fetch-compatible app. Return Treesap's createApp() result or any object with fetch(), such as a Hono app.`\n );\n }\n\n return app as FetchApp;\n}\n\nfunction resolveConfigRoot(viteConfig?: UserConfig) {\n return path.resolve(viteConfig?.root ?? process.cwd());\n}\n\nfunction resolveBrowserEntry(options: DefineTreesapConfigOptions) {\n const root = resolveConfigRoot(options.vite);\n const browserEntry = options.browserEntry ?? \"src/treesap-client.ts\";\n const absolutePath = path.resolve(root, browserEntry);\n\n if (!existsSync(absolutePath)) {\n if (options.browserEntry) {\n throw new Error(\n `Treesap could not find browserEntry \"${options.browserEntry}\". Check the path or update defineTreesapConfig({ browserEntry }).`\n );\n }\n\n throw new Error(\n 'Treesap could not find the default browser entry \"src/treesap-client.ts\". Set browserEntry in defineTreesapConfig(...) if your client entry lives elsewhere.'\n );\n }\n\n return {\n entry: normalizeManifestLookupPath(browserEntry),\n absolutePath,\n };\n}\n\nfunction resolveAppEntry(options: DefineTreesapConfigOptions) {\n const root = resolveConfigRoot(options.vite);\n\n return path.resolve(root, options.appEntry);\n}\n\nfunction resolveIslandEntries(\n options: DefineTreesapConfigOptions\n): NormalizedTreesapIslandEntry[] {\n const root = resolveConfigRoot(options.vite);\n const rawEntries = options.islands?.entries ?? {};\n\n return Object.entries(rawEntries).map(([name, entry]) => {\n const normalizedName = name.trim();\n const normalizedEntry = entry.trim();\n\n if (!normalizedName) {\n throw new Error(\"Treesap islands entries must have a non-empty name.\");\n }\n\n if (!normalizedEntry) {\n throw new Error(\n `Treesap island \"${normalizedName}\" must point to a non-empty entry path.`\n );\n }\n\n return {\n name: normalizedName,\n entry: normalizeManifestLookupPath(normalizedEntry),\n absolutePath: path.resolve(root, normalizedEntry),\n };\n });\n}\n\nfunction resolveIslandRuntimeEntry() {\n const runtimeDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(runtimeDir, \"island-runtime.js\"),\n path.resolve(runtimeDir, \"island-runtime.ts\"),\n ];\n\n const resolved = candidates.find((candidate) => existsSync(candidate));\n if (!resolved) {\n throw new Error(\"Treesap could not resolve its island runtime module.\");\n }\n\n return resolved;\n}\n\nfunction resolveOptionalSpaEntry(options: DefineTreesapConfigOptions) {\n const root = resolveConfigRoot(options.vite);\n const defaultSpaEntry = path.resolve(root, \"src/app/main.tsx\");\n\n if (!existsSync(defaultSpaEntry)) {\n return null;\n }\n\n return {\n entry: \"src/app/main.tsx\",\n absolutePath: defaultSpaEntry,\n };\n}\n\nfunction createClientBuildInputs(options: DefineTreesapConfigOptions) {\n const browserEntry = resolveBrowserEntry(options);\n const islandEntries = resolveIslandEntries(options);\n const spaEntry = resolveOptionalSpaEntry(options);\n\n const input: Record<string, string> = {\n browser: browserEntry.absolutePath,\n };\n\n if (spaEntry) {\n input[\"spa\"] = spaEntry.absolutePath;\n }\n\n islandEntries.forEach((island) => {\n input[`island-${island.name}`] = island.absolutePath;\n });\n\n if (islandEntries.length > 0) {\n input[\"treesap-island-runtime\"] = resolveIslandRuntimeEntry();\n }\n\n return input;\n}\n\nfunction createTreesapDefineConfig(options: DefineTreesapConfigOptions) {\n const islandEntries = Object.fromEntries(\n resolveIslandEntries(options).map((entry) => [entry.name, entry.entry])\n );\n\n return {\n \"globalThis.__TREESAP_ISLANDS__\": JSON.stringify(islandEntries),\n };\n}\n\nfunction createTreesapSharedConfig(options: DefineTreesapConfigOptions): UserConfig {\n const root = resolveConfigRoot(options.vite);\n\n return mergeConfig(\n {\n appType: \"custom\",\n root,\n define: createTreesapDefineConfig(options),\n ssr: {\n noExternal: [\"hono\"],\n },\n },\n {\n ...(options.vite ?? {}),\n plugins: undefined,\n }\n );\n}\n\nfunction createTreesapDevConfig(options: DefineTreesapConfigOptions): UserConfig {\n const browserEntry = resolveBrowserEntry(options);\n\n return mergeConfig(createTreesapSharedConfig(options), {\n base: \"/\",\n plugins: [\n treesap({\n appEntry: options.appEntry,\n appFactoryExport: options.appFactoryExport,\n appEntryPath: resolveAppEntry(options),\n browserEntry: browserEntry.entry,\n islands: resolveIslandEntries(options),\n islandRuntimeEntry: resolveIslandRuntimeEntry(),\n }),\n ...(options.plugins ?? []),\n ],\n });\n}\n\nfunction createTreesapClientBuildConfig(\n options: DefineTreesapConfigOptions\n): UserConfig {\n const root = resolveConfigRoot(options.vite);\n const browserEntry = resolveBrowserEntry(options);\n\n return mergeConfig(createTreesapSharedConfig(options), {\n base: \"/\",\n publicDir: path.resolve(root, \"public\"),\n plugins: [\n treesap({\n appEntry: options.appEntry,\n appFactoryExport: options.appFactoryExport,\n appEntryPath: resolveAppEntry(options),\n browserEntry: browserEntry.entry,\n islands: resolveIslandEntries(options),\n islandRuntimeEntry: resolveIslandRuntimeEntry(),\n }),\n ...(options.plugins ?? []),\n ],\n build: {\n manifest: true,\n outDir: \"dist/client\",\n emptyOutDir: true,\n rolldownOptions: {\n input: createClientBuildInputs(options),\n },\n },\n });\n}\n\nfunction createTreesapServerBuildConfig(\n options: DefineTreesapConfigOptions\n): UserConfig {\n const browserEntry = resolveBrowserEntry(options);\n\n return mergeConfig(createTreesapSharedConfig(options), {\n base: \"/\",\n publicDir: false,\n plugins: [\n treesap({\n appEntry: options.appEntry,\n appFactoryExport: options.appFactoryExport,\n appEntryPath: resolveAppEntry(options),\n browserEntry: browserEntry.entry,\n islands: resolveIslandEntries(options),\n islandRuntimeEntry: resolveIslandRuntimeEntry(),\n }),\n ...(options.plugins ?? []),\n ],\n build: {\n ssr: options.serverEntry ?? \"src/main.tsx\",\n target: \"node22\",\n outDir: \"dist/server\",\n sourcemap: true,\n emptyOutDir: false,\n rolldownOptions: {\n external: [\n \"fs\",\n \"path\",\n \"url\",\n \"module\",\n \"crypto\",\n \"stream\",\n /^node:/,\n ],\n output: {\n format: \"esm\",\n },\n },\n },\n oxc: {\n jsx: {\n runtime: \"automatic\",\n importSource: \"hono/jsx\",\n },\n },\n });\n}\n\nexport function treesap(options: TreesapVitePluginOptions): Plugin {\n const spaBase = normalizeSpaBase(options.spaBase ?? \"/app\");\n const appFactoryExport = options.appFactoryExport ?? \"createServerApp\";\n const spaIndexHtml = options.spaIndexHtml ?? \"src/app/index.html\";\n const spaEntryModule = options.spaEntryModule ?? \"/src/app/main.tsx\";\n const appEntryPath = options.appEntryPath ? path.resolve(options.appEntryPath) : null;\n const islandEntries = options.islands ?? [];\n const islandRuntimeEntry = options.islandRuntimeEntry\n ? path.resolve(options.islandRuntimeEntry)\n : null;\n\n return {\n name: \"treesap\",\n transform(code, id) {\n const hasBrowserEntry = Boolean(options.browserEntry);\n const hasIslands = islandEntries.length > 0;\n\n if (!hasBrowserEntry && !hasIslands) {\n return null;\n }\n\n const moduleId = path.resolve(stripQuery(id));\n const injectedGlobals = [\n hasIslands\n ? `globalThis.__TREESAP_ISLANDS__ = ${JSON.stringify(\n Object.fromEntries(islandEntries.map((entry) => [entry.name, entry.entry]))\n )};`\n : null,\n hasBrowserEntry\n ? `globalThis.__TREESAP_BROWSER_ENTRY__ = ${JSON.stringify(\n normalizeManifestLookupPath(options.browserEntry)\n )};`\n : null,\n hasIslands && islandRuntimeEntry\n ? `globalThis.__TREESAP_ISLAND_RUNTIME_ENTRY__ = ${JSON.stringify(\n islandRuntimeEntry\n )};`\n : null,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n if (appEntryPath && moduleId === appEntryPath) {\n const alreadyInjected =\n (!hasIslands || code.includes(\"globalThis.__TREESAP_ISLANDS__\")) &&\n (!hasBrowserEntry || code.includes(\"globalThis.__TREESAP_BROWSER_ENTRY__\")) &&\n (!hasIslands ||\n code.includes(\"globalThis.__TREESAP_ISLAND_RUNTIME_ENTRY__\"));\n\n if (alreadyInjected) {\n return null;\n }\n\n return {\n code: `${injectedGlobals}\\n${code}`,\n map: null,\n };\n }\n\n return null;\n },\n configureServer(server) {\n server.middlewares.use(async (req, res, next) => {\n const rewrittenUrl = maybeRewriteSpaAssetRequest(req.url ?? \"/\", spaBase);\n if (rewrittenUrl) {\n req.url = rewrittenUrl;\n }\n\n const pathname = new URL(req.url ?? \"/\", \"http://treesap.local\").pathname;\n\n try {\n if (isViteRequest(pathname)) {\n next();\n return;\n }\n\n if (isSpaShellRequest(pathname, spaBase)) {\n const html = await renderSpaShell(server, pathname, {\n spaIndexHtml,\n spaEntryModule,\n });\n res.statusCode = 200;\n res.setHeader(\"Content-Type\", \"text/html; charset=UTF-8\");\n res.end(html);\n return;\n }\n\n const app = await loadTreesapApp(server, options.appEntry, appFactoryExport);\n const request = await toWebRequest(req);\n const response = await app.fetch(request);\n await sendNodeResponse(res, response);\n } catch (error) {\n server.ssrFixStacktrace(error as Error);\n console.error(error);\n res.statusCode = 500;\n res.setHeader(\"Content-Type\", \"text/plain; charset=UTF-8\");\n res.end(\"Internal Server Error\");\n }\n });\n },\n };\n}\n\nexport function defineTreesapConfig(options: DefineTreesapConfigOptions) {\n return defineConfig(({ command }) => {\n if (command === \"serve\") {\n return createTreesapDevConfig(options);\n }\n\n return {\n ...createTreesapSharedConfig(options),\n base: \"/\",\n publicDir: false,\n builder: {\n async buildApp(builder) {\n await build({\n ...createTreesapClientBuildConfig(options),\n configFile: false,\n });\n\n await build({\n ...createTreesapServerBuildConfig(options),\n configFile: false,\n });\n\n Object.values(builder.environments).forEach((environment) => {\n environment.isBuilt = true;\n });\n },\n },\n };\n });\n}\n\nexport function getViteEntryAssets(options: {\n entry: string;\n mode?: string;\n devScripts?: string[];\n devStyles?: string[];\n manifestPath?: string;\n base?: string;\n}) {\n const mode = options.mode ?? resolveRuntimeMode();\n if (mode !== \"production\") {\n const scripts = Array.from(\n new Set([\n ...(options.devScripts ?? []),\n createDevEntryScriptPath(options.entry),\n ])\n );\n\n return {\n scripts,\n styles: options.devStyles ?? [],\n };\n }\n\n const manifestPath = options.manifestPath ?? resolveDefaultManifestPath();\n const base = options.base ?? \"/\";\n\n if (!existsSync(manifestPath)) {\n return {\n scripts: [] as string[],\n styles: [] as string[],\n };\n }\n\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf-8\")) as Record<\n string,\n ManifestEntry\n >;\n const lookupEntry = normalizeManifestLookupPath(options.entry);\n\n const entry =\n manifest[options.entry] ??\n Object.entries(manifest).find(([key, value]) => {\n const normalizedKey = normalizeManifestLookupPath(key);\n const normalizedSrc = value.src\n ? normalizeManifestLookupPath(value.src)\n : undefined;\n\n return (\n normalizedKey === lookupEntry ||\n normalizedKey.endsWith(lookupEntry) ||\n normalizedSrc === lookupEntry ||\n normalizedSrc?.endsWith(lookupEntry) === true\n );\n })?.[1];\n\n return {\n scripts: entry?.file ? [normalizePublicPath(entry.file, base)] : [],\n styles: (entry?.css ?? []).map((href) => normalizePublicPath(href, base)),\n };\n}\n\nfunction getRegisteredBrowserEntry() {\n return globalThis.__TREESAP_BROWSER_ENTRY__ ?? null;\n}\n\nexport function getViteBrowserAssets(options?: {\n mode?: string;\n manifestPath?: string;\n base?: string;\n devStyles?: string[];\n}) {\n const entry = getRegisteredBrowserEntry();\n if (!entry) {\n throw new Error(\n \"Treesap browser entry is not registered. Set browserEntry in defineTreesapConfig(...) or restart Vite.\"\n );\n }\n\n return getViteEntryAssets({\n entry,\n mode: options?.mode,\n manifestPath: options?.manifestPath,\n base: options?.base,\n devScripts: [\"/@vite/client\"],\n devStyles: options?.devStyles ?? [],\n });\n}\n\nexport function getViteModuleAsset(options: {\n entry: string;\n mode?: string;\n manifestPath?: string;\n base?: string;\n}) {\n return (\n getViteEntryAssets({\n entry: options.entry,\n mode: options.mode,\n manifestPath: options.manifestPath,\n base: options.base,\n devScripts: [createDevEntryScriptPath(options.entry)],\n devStyles: [],\n }).scripts[0] ?? null\n );\n}\n"]}
|