Skip to content

Commit

Permalink
Merge pull request #119 from sjjj986/adaptorBuildScript
Browse files Browse the repository at this point in the history
Update adaptor build script
  • Loading branch information
sjjj986 authored Nov 21, 2023
2 parents af90eab + 3ba85fe commit d2c9d81
Showing 1 changed file with 62 additions and 5 deletions.
67 changes: 62 additions & 5 deletions packages/@apphosting/adapter-nextjs/src/bin/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,69 @@
import { spawnSync } from "child_process";
import { loadConfig, readRoutesManifest } from "../utils.js";

import { join } from "path";
import fsExtra from "fs-extra";
import { stringify as yamlStringify } from "yaml";

// unable to use shorthand imports on fsExtra since fsExtra is CJS
const { move, exists, writeFile, mkdirp } = fsExtra;
const cwd = process.cwd();

spawnSync("next", ["build"], { cwd, stdio: "inherit", env: { ...process.env, NEXT_PRIVATE_STANDALONE: 'true' } });
// Set standalone mode
process.env.NEXT_PRIVATE_STANDALONE = "true";
// Opt-out sending telemetry to Vercel
process.env.NEXT_TELEMETRY_DISABLED = "1";

build(cwd);

const {distDir} = await loadConfig(cwd);
const manifest = await readRoutesManifest(join(cwd, distDir));

const appHostingOutputDirectory = join(cwd, ".apphosting");
const appHostingStaticDirectory = join(appHostingOutputDirectory,"_next", "static");
const appHostingPublicDirectory = join(appHostingOutputDirectory, "public");
const outputBundlePath = join(appHostingOutputDirectory, "bundle.yaml");
const serverFilePath = join(appHostingOutputDirectory, "server.js");

const standaloneDirectory = join(cwd, distDir, "standalone");
const staticDirectory = join(cwd, distDir, "static");
const publicDirectory = join(cwd, "public");

await mkdirp(appHostingStaticDirectory);

// Run build command
function build(cwd: string) {
spawnSync("npm", ["run", "build"], {cwd, shell: true, stdio: "inherit"});
}

const config = await loadConfig(cwd);
const routeManifest = await readRoutesManifest(config.distDir);
// move public directory to apphosting output public directory
const movePublicDirectory = async () => {
const publicDirectoryExists = await exists(appHostingPublicDirectory);
if (!publicDirectoryExists) return;
await move(publicDirectory, appHostingPublicDirectory, { overwrite: true });
};

// generate bundle.yaml
const generateBundleYaml = async () => {
const headers = manifest.headers.map(it => ({...it, regex: undefined}));
const redirects = manifest.redirects.filter(it => !it.internal).map(it => ({...it, regex: undefined}));
const beforeFileRewrites = Array.isArray(manifest.rewrites) ? manifest.rewrites : manifest.rewrites?.beforeFiles || [];
const rewrites = beforeFileRewrites.map(it => ({...it, regex: undefined}));
await writeFile(outputBundlePath, yamlStringify({
headers,
redirects,
rewrites,
runCommand: `node ${serverFilePath}`,
neededDirs: [appHostingOutputDirectory],
staticAssets: [appHostingStaticDirectory, appHostingPublicDirectory],
}));
}

// TODO do all the things
console.log({ config, routeManifest });
// move the standalone directory, the static directory and the public directory to apphosting output directory
// as well as generating bundle.yaml
await Promise.all([
move(standaloneDirectory, appHostingOutputDirectory, { overwrite: true }),
move(staticDirectory, appHostingStaticDirectory, { overwrite: true }),
movePublicDirectory(),
generateBundleYaml(),
]);

0 comments on commit d2c9d81

Please sign in to comment.