fix: remove entry-server handler copy in adapters
commit
75c92c079c
@ -0,0 +1,5 @@
|
||||
# start-node
|
||||
|
||||
Adapter for Solid apps that builds a Node server.
|
||||
|
||||
This is very experimental; the adapter API isn't at all fleshed out, and things will definitely change.
|
@ -0,0 +1,27 @@
|
||||
import { dirname, join } from "path";
|
||||
import { createServer } from "solid-start-node/server.js";
|
||||
import "solid-start/node/globals.js";
|
||||
import { fileURLToPath } from "url";
|
||||
import manifest from "../../dist/public/route-manifest.json";
|
||||
import handler from "./entry-server.js";
|
||||
|
||||
const { PORT = 3000 } = process.env;
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const paths = {
|
||||
assets: join(__dirname, "/public")
|
||||
};
|
||||
|
||||
const server = createServer({
|
||||
paths,
|
||||
handler,
|
||||
env: { manifest },
|
||||
});
|
||||
|
||||
server.listen(PORT, err => {
|
||||
if (err) {
|
||||
console.log("error", err);
|
||||
} else {
|
||||
console.log(`Listening on port ${PORT}`);
|
||||
}
|
||||
});
|
@ -0,0 +1,59 @@
|
||||
import common from "@rollup/plugin-commonjs";
|
||||
import json from "@rollup/plugin-json";
|
||||
import nodeResolve from "@rollup/plugin-node-resolve";
|
||||
import { readFileSync, writeFileSync } from "fs";
|
||||
import { dirname, join } from "path";
|
||||
import { rollup } from "rollup";
|
||||
import { fileURLToPath, pathToFileURL } from "url";
|
||||
|
||||
export default function () {
|
||||
return {
|
||||
name: "node",
|
||||
start(config, { port }) {
|
||||
process.env.PORT = port;
|
||||
import(pathToFileURL(join(config.root, "dist", "server.js")).toString());
|
||||
return `http://localhost:${process.env.PORT}`;
|
||||
},
|
||||
async build(config, builder) {
|
||||
const ssrExternal = config?.ssr?.external || [];
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
|
||||
if (!config.solidOptions.ssr) {
|
||||
await builder.spaClient(join(config.root, "dist", "public"));
|
||||
await builder.server(join(config.root, ".solid", "server"));
|
||||
} else if (config.solidOptions.islands) {
|
||||
await builder.islandsClient(join(config.root, "dist", "public"));
|
||||
await builder.server(join(config.root, ".solid", "server"));
|
||||
} else {
|
||||
await builder.client(join(config.root, "dist", "public"));
|
||||
await builder.server(join(config.root, ".solid", "server"));
|
||||
}
|
||||
|
||||
let text = readFileSync(join(__dirname, "entry.js")).toString();
|
||||
|
||||
writeFileSync(join(config.root, ".solid", "server", "server.js"), text);
|
||||
|
||||
builder.debug(`bundling server with rollup`);
|
||||
|
||||
const bundle = await rollup({
|
||||
input: join(config.root, ".solid", "server", "server.js"),
|
||||
plugins: [
|
||||
json(),
|
||||
nodeResolve({
|
||||
preferBuiltins: true,
|
||||
exportConditions: ["node", "solid"]
|
||||
}),
|
||||
common({ strictRequires: true, ...config.build.commonjsOptions })
|
||||
],
|
||||
external: ["undici", "stream/web", ...ssrExternal]
|
||||
});
|
||||
// or write the bundle to disk
|
||||
await bundle.write({ format: "esm", dir: join(config.root, "dist") });
|
||||
|
||||
// closes the bundle
|
||||
await bundle.close();
|
||||
|
||||
builder.debug(`bundling server done`);
|
||||
}
|
||||
};
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
{
|
||||
"name": "solid-start-node",
|
||||
"version": "0.2.22",
|
||||
"main": "./index.js",
|
||||
"type": "module",
|
||||
"solid": {
|
||||
"type": "adapter"
|
||||
},
|
||||
"dependencies": {
|
||||
"@rollup/plugin-commonjs": "^24.0.0",
|
||||
"@rollup/plugin-json": "^6.0.0",
|
||||
"@rollup/plugin-node-resolve": "^13.3.0",
|
||||
"compression": "^1.7.4",
|
||||
"polka": "1.0.0-next.22",
|
||||
"rollup": "^3.10.0",
|
||||
"sirv": "^2.0.2",
|
||||
"terser": "^5.16.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"solid-start": "workspace:*",
|
||||
"undici": "^5.15.1",
|
||||
"vite": "^3.2.5"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"solid-start": "*",
|
||||
"undici": "^5.8.0",
|
||||
"vite": "*"
|
||||
}
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
import compression from "compression";
|
||||
import fs from "fs";
|
||||
import { readFile } from "fs/promises";
|
||||
import { join } from "path";
|
||||
import polka from "polka";
|
||||
import sirv from "sirv";
|
||||
import { createRequest, handleNodeResponse } from "solid-start/node/fetch.js";
|
||||
|
||||
global.onunhandledrejection = (err, promise) => {
|
||||
console.error(err);
|
||||
console.error(promise);
|
||||
};
|
||||
|
||||
export function createServer({ handler, paths, env }) {
|
||||
const comp = compression({
|
||||
threshold: 0,
|
||||
filter: req => {
|
||||
return !req.headers["accept"]?.startsWith("text/event-stream");
|
||||
}
|
||||
});
|
||||
const assets_handler = fs.existsSync(paths.assets)
|
||||
? sirv(paths.assets, {
|
||||
setHeaders: (res, pathname) => {
|
||||
const isAsset = pathname.startsWith("/assets/");
|
||||
if (isAsset) {
|
||||
res.setHeader("cache-control", "public, immutable, max-age=31536000");
|
||||
}
|
||||
}
|
||||
})
|
||||
: (_req, _res, next) => next();
|
||||
|
||||
const render = async (req, res) => {
|
||||
try {
|
||||
env.getStaticHTML = async assetPath => {
|
||||
let text = await readFile(join(paths.assets, assetPath + ".html"), "utf8");
|
||||
return new Response(text, {
|
||||
headers: {
|
||||
"content-type": "text/html"
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const webRes = await handler({
|
||||
request: createRequest(req),
|
||||
clientAddress: req.socket.remoteAddress,
|
||||
locals: {},
|
||||
env
|
||||
});
|
||||
|
||||
handleNodeResponse(webRes, res);
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
res.statusCode = 500;
|
||||
res.statusMessage = "Internal Server Error";
|
||||
res.end();
|
||||
}
|
||||
};
|
||||
|
||||
const server = polka().use("/", comp, assets_handler).use(comp, render);
|
||||
|
||||
return server;
|
||||
}
|
Loading…
Reference in New Issue