treesap 0.3.6 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -0
- 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 +5 -1
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +32 -12
- 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()`:
|
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
|
@@ -7,13 +7,17 @@ interface NormalizedTreesapIslandEntry {
|
|
|
7
7
|
entry: string;
|
|
8
8
|
absolutePath: string;
|
|
9
9
|
}
|
|
10
|
+
interface TreesapRuntimeEntry {
|
|
11
|
+
entry: string;
|
|
12
|
+
absolutePath: string;
|
|
13
|
+
}
|
|
10
14
|
export interface TreesapVitePluginOptions {
|
|
11
15
|
appEntry: string;
|
|
12
16
|
appFactoryExport?: string;
|
|
13
17
|
appEntryPath?: string;
|
|
14
18
|
browserEntry?: string;
|
|
15
19
|
islands?: NormalizedTreesapIslandEntry[];
|
|
16
|
-
islandRuntimeEntry?:
|
|
20
|
+
islandRuntimeEntry?: TreesapRuntimeEntry;
|
|
17
21
|
spaBase?: string;
|
|
18
22
|
spaIndexHtml?: string;
|
|
19
23
|
spaEntryModule?: string;
|
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,
|
|
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,UAAU,mBAAmB;IAC3B,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,mBAAmB,CAAC;IACzC,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;AAwTD,wBAAgB,OAAO,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,CAmGjE;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;;;EAsDA;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
|
}
|
|
@@ -139,7 +140,8 @@ function resolveIslandEntries(options) {
|
|
|
139
140
|
};
|
|
140
141
|
});
|
|
141
142
|
}
|
|
142
|
-
function resolveIslandRuntimeEntry() {
|
|
143
|
+
function resolveIslandRuntimeEntry(options) {
|
|
144
|
+
const root = resolveConfigRoot(options.vite);
|
|
143
145
|
const runtimeDir = path.dirname(fileURLToPath(import.meta.url));
|
|
144
146
|
const candidates = [
|
|
145
147
|
path.resolve(runtimeDir, "island-runtime.js"),
|
|
@@ -149,19 +151,37 @@ function resolveIslandRuntimeEntry() {
|
|
|
149
151
|
if (!resolved) {
|
|
150
152
|
throw new Error("Treesap could not resolve its island runtime module.");
|
|
151
153
|
}
|
|
152
|
-
return
|
|
154
|
+
return {
|
|
155
|
+
entry: normalizeManifestLookupPath(path.relative(root, resolved)),
|
|
156
|
+
absolutePath: resolved,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function resolveOptionalSpaEntry(options) {
|
|
160
|
+
const root = resolveConfigRoot(options.vite);
|
|
161
|
+
const defaultSpaEntry = path.resolve(root, "src/app/main.tsx");
|
|
162
|
+
if (!existsSync(defaultSpaEntry)) {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
entry: "src/app/main.tsx",
|
|
167
|
+
absolutePath: defaultSpaEntry,
|
|
168
|
+
};
|
|
153
169
|
}
|
|
154
170
|
function createClientBuildInputs(options) {
|
|
155
171
|
const browserEntry = resolveBrowserEntry(options);
|
|
156
172
|
const islandEntries = resolveIslandEntries(options);
|
|
173
|
+
const spaEntry = resolveOptionalSpaEntry(options);
|
|
157
174
|
const input = {
|
|
158
175
|
browser: browserEntry.absolutePath,
|
|
159
176
|
};
|
|
177
|
+
if (spaEntry) {
|
|
178
|
+
input["spa"] = spaEntry.absolutePath;
|
|
179
|
+
}
|
|
160
180
|
islandEntries.forEach((island) => {
|
|
161
181
|
input[`island-${island.name}`] = island.absolutePath;
|
|
162
182
|
});
|
|
163
183
|
if (islandEntries.length > 0) {
|
|
164
|
-
input["treesap-island-runtime"] = resolveIslandRuntimeEntry();
|
|
184
|
+
input["treesap-island-runtime"] = resolveIslandRuntimeEntry(options).absolutePath;
|
|
165
185
|
}
|
|
166
186
|
return input;
|
|
167
187
|
}
|
|
@@ -196,7 +216,7 @@ function createTreesapDevConfig(options) {
|
|
|
196
216
|
appEntryPath: resolveAppEntry(options),
|
|
197
217
|
browserEntry: browserEntry.entry,
|
|
198
218
|
islands: resolveIslandEntries(options),
|
|
199
|
-
islandRuntimeEntry: resolveIslandRuntimeEntry(),
|
|
219
|
+
islandRuntimeEntry: resolveIslandRuntimeEntry(options),
|
|
200
220
|
}),
|
|
201
221
|
...(options.plugins ?? []),
|
|
202
222
|
],
|
|
@@ -215,7 +235,7 @@ function createTreesapClientBuildConfig(options) {
|
|
|
215
235
|
appEntryPath: resolveAppEntry(options),
|
|
216
236
|
browserEntry: browserEntry.entry,
|
|
217
237
|
islands: resolveIslandEntries(options),
|
|
218
|
-
islandRuntimeEntry: resolveIslandRuntimeEntry(),
|
|
238
|
+
islandRuntimeEntry: resolveIslandRuntimeEntry(options),
|
|
219
239
|
}),
|
|
220
240
|
...(options.plugins ?? []),
|
|
221
241
|
],
|
|
@@ -241,7 +261,7 @@ function createTreesapServerBuildConfig(options) {
|
|
|
241
261
|
appEntryPath: resolveAppEntry(options),
|
|
242
262
|
browserEntry: browserEntry.entry,
|
|
243
263
|
islands: resolveIslandEntries(options),
|
|
244
|
-
islandRuntimeEntry: resolveIslandRuntimeEntry(),
|
|
264
|
+
islandRuntimeEntry: resolveIslandRuntimeEntry(options),
|
|
245
265
|
}),
|
|
246
266
|
...(options.plugins ?? []),
|
|
247
267
|
],
|
|
@@ -281,9 +301,7 @@ export function treesap(options) {
|
|
|
281
301
|
const spaEntryModule = options.spaEntryModule ?? "/src/app/main.tsx";
|
|
282
302
|
const appEntryPath = options.appEntryPath ? path.resolve(options.appEntryPath) : null;
|
|
283
303
|
const islandEntries = options.islands ?? [];
|
|
284
|
-
const islandRuntimeEntry = options.islandRuntimeEntry
|
|
285
|
-
? path.resolve(options.islandRuntimeEntry)
|
|
286
|
-
: null;
|
|
304
|
+
const islandRuntimeEntry = options.islandRuntimeEntry ?? null;
|
|
287
305
|
return {
|
|
288
306
|
name: "treesap",
|
|
289
307
|
transform(code, id) {
|
|
@@ -301,7 +319,7 @@ export function treesap(options) {
|
|
|
301
319
|
? `globalThis.__TREESAP_BROWSER_ENTRY__ = ${JSON.stringify(normalizeManifestLookupPath(options.browserEntry))};`
|
|
302
320
|
: null,
|
|
303
321
|
hasIslands && islandRuntimeEntry
|
|
304
|
-
? `globalThis.__TREESAP_ISLAND_RUNTIME_ENTRY__ = ${JSON.stringify(islandRuntimeEntry)};`
|
|
322
|
+
? `globalThis.__TREESAP_ISLAND_RUNTIME_ENTRY__ = ${JSON.stringify(islandRuntimeEntry.entry)};`
|
|
305
323
|
: null,
|
|
306
324
|
]
|
|
307
325
|
.filter(Boolean)
|
|
@@ -416,8 +434,10 @@ export function getViteEntryAssets(options) {
|
|
|
416
434
|
: undefined;
|
|
417
435
|
return (normalizedKey === lookupEntry ||
|
|
418
436
|
normalizedKey.endsWith(lookupEntry) ||
|
|
437
|
+
lookupEntry.endsWith("/" + normalizedKey) ||
|
|
419
438
|
normalizedSrc === lookupEntry ||
|
|
420
|
-
normalizedSrc?.endsWith(lookupEntry) === true
|
|
439
|
+
normalizedSrc?.endsWith(lookupEntry) === true ||
|
|
440
|
+
(normalizedSrc != null && lookupEntry.endsWith("/" + normalizedSrc)));
|
|
421
441
|
})?.[1];
|
|
422
442
|
return {
|
|
423
443
|
scripts: entry?.file ? [normalizePublicPath(entry.file, base)] : [],
|
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 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"]}
|
|
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\ninterface TreesapRuntimeEntry {\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?: TreesapRuntimeEntry;\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 options: DefineTreesapConfigOptions\n): TreesapRuntimeEntry {\n const root = resolveConfigRoot(options.vite);\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 {\n entry: normalizeManifestLookupPath(path.relative(root, resolved)),\n absolutePath: resolved,\n };\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(options).absolutePath;\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(options),\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(options),\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(options),\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 ?? 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.entry\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 lookupEntry.endsWith(\"/\" + normalizedKey) ||\n normalizedSrc === lookupEntry ||\n normalizedSrc?.endsWith(lookupEntry) === true ||\n (normalizedSrc != null && lookupEntry.endsWith(\"/\" + normalizedSrc))\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"]}
|