sveltekit-lambda-adapter
Version:
Adapter for SvelteKit apps to work on AWS Lambda
66 lines (65 loc) • 2.54 kB
JavaScript
import fs from "node:fs";
import { fileURLToPath } from "node:url";
const __dirname = fileURLToPath(new URL(".", import.meta.url));
import { build } from "esbuild";
import * as path from "path";
import { cp, rm, } from "fs/promises";
import { existsSync } from "node:fs";
async function bundleApp() {
await rm(path.join("build"), { recursive: true, force: true });
await build({
entryPoints: [path.join("out", "server", "lambda-handler", "index.js")],
bundle: true,
platform: "node",
target: ["esnext"],
format: "esm",
outExtension: {
".js": ".mjs",
},
banner: {
js: [
`import { createRequire as topLevelCreateRequire } from 'module';`,
`const require = topLevelCreateRequire(import.meta.url);`,
].join(""),
},
outdir: path.join("build"),
});
if (existsSync(path.join("out", "prerendered"))) {
await cp(path.join("out", "prerendered"), path.join("build", "prerendered"), {
recursive: true,
});
}
else {
console.log("No Prerendered Directory found.");
}
console.log("BUILD SUCEEDED!");
}
function adapter() {
const adapter = {
name: "sachtak-adapter",
async adapt(builder) {
const out = path.join("out");
const clientDir = path.join(out, "client");
const serverDir = path.join(out, "server");
const prerenderedDir = path.join(out, "prerendered");
// Cleanup output folder
builder.rimraf(out);
// builder.mkdirp(clientDir);
// builder.mkdirp(serverDir);
// builder.mkdirp(prerenderedDir);
// Create static output
builder.log.minor("Copying assets...");
builder.writeClient(clientDir);
const prerenderedFiles = builder.writePrerendered(prerenderedDir);
// Create Lambda function
builder.log.minor("Generating server function...");
builder.writeServer(serverDir);
// copy over handler files in server handler folder
builder.copy(path.join(__dirname, "handler"), path.join(serverDir, "lambda-handler"));
// save a list of files in server handler folder
fs.writeFileSync(path.join(serverDir, "lambda-handler", "prerendered-file-list.js"), `export default ${JSON.stringify(prerenderedFiles)}`);
},
};
return adapter;
}
export { adapter, bundleApp };