Files
test-repo/scripts/build-website.js
T

125 lines
3.2 KiB
JavaScript
Raw Normal View History

2021-09-11 09:55:46 +08:00
#!/usr/bin/env node
import fs from "node:fs/promises";
import path from "node:path";
import url from "node:url";
2025-02-25 06:27:02 +08:00
import esbuild from "esbuild";
2021-11-29 10:07:11 +08:00
import { execa } from "execa";
import fastGlob from "fast-glob";
2025-02-25 06:27:02 +08:00
import serialize from "serialize-javascript";
2021-09-11 09:55:46 +08:00
import {
copyFile,
DIST_DIR,
PROJECT_ROOT,
WEBSITE_DIR,
2021-09-11 09:55:46 +08:00
writeFile,
writeJson,
2023-03-28 16:18:53 +08:00
} from "./utils/index.js";
2021-09-11 09:55:46 +08:00
const runYarn = (command, args, options) =>
execa("yarn", [command, ...args], {
stdout: "inherit",
stderr: "inherit",
...options,
});
const IS_PULL_REQUEST = process.env.PULL_REQUEST === "true";
const PRETTIER_DIR = IS_PULL_REQUEST
? DIST_DIR
: url.fileURLToPath(new URL("../node_modules/prettier", import.meta.url));
2021-09-11 09:55:46 +08:00
const PLAYGROUND_PRETTIER_DIR = path.join(WEBSITE_DIR, "static/lib");
async function buildPrettier() {
// --- Build prettier for PR ---
const packageJsonFile = path.join(PROJECT_ROOT, "package.json");
2022-01-26 20:33:15 +08:00
const packageJsonContent = await fs.readFile(packageJsonFile);
const packageJson = JSON.parse(packageJsonContent);
2021-09-11 09:55:46 +08:00
await writeJson(packageJsonFile, {
...packageJson,
version: `999.999.999-pr.${process.env.REVIEW_ID}`,
});
try {
2022-02-09 09:31:03 +08:00
await runYarn("build", ["--playground", "--clean"], {
2022-01-26 20:33:15 +08:00
cwd: PROJECT_ROOT,
});
2021-09-11 09:55:46 +08:00
} finally {
// restore
2022-01-26 20:33:15 +08:00
await writeFile(packageJsonFile, packageJsonContent);
2021-09-11 09:55:46 +08:00
}
}
async function buildPlaygroundFiles() {
2023-07-11 14:50:00 +08:00
const patterns = ["standalone.js", "plugins/*.js"];
const files = await fastGlob(patterns, {
2021-09-11 09:55:46 +08:00
cwd: PRETTIER_DIR,
});
2023-03-28 08:55:54 +08:00
const packageManifest = {
builtinPlugins: [],
};
2021-09-11 09:55:46 +08:00
for (const fileName of files) {
const file = path.join(PRETTIER_DIR, fileName);
2022-02-12 15:39:16 +08:00
const dist = path.join(PLAYGROUND_PRETTIER_DIR, fileName);
await copyFile(file, dist);
2021-09-11 09:55:46 +08:00
if (fileName === "standalone.js") {
continue;
}
2025-02-25 06:27:02 +08:00
const { default: pluginModule } = await import(url.pathToFileURL(dist));
const plugin = {
name: path.basename(fileName, ".js"),
2023-03-28 08:55:54 +08:00
file: fileName,
2025-02-25 06:27:02 +08:00
};
for (const property of ["languages", "options", "defaultOptions"]) {
const value = pluginModule[property];
if (value !== undefined) {
plugin[property] = value;
}
}
for (const property of ["parsers", "printers"]) {
const value = pluginModule[property];
if (value !== undefined) {
plugin[property] = Object.keys(value);
}
}
packageManifest.builtinPlugins.push(plugin);
2021-09-11 09:55:46 +08:00
}
2025-02-25 06:27:02 +08:00
const code = /* Indent */ `
"use strict";
self.prettierPackageManifest = ${serialize(packageManifest, { space: 2 })};
`;
2021-09-11 09:55:46 +08:00
await writeFile(
2023-03-28 08:55:54 +08:00
path.join(PLAYGROUND_PRETTIER_DIR, "package-manifest.js"),
2025-02-25 06:27:02 +08:00
esbuild.transformSync(code, { loader: "js", minify: true }).code.trim(),
2021-09-11 09:55:46 +08:00
);
}
if (IS_PULL_REQUEST) {
console.log("Building prettier...");
await buildPrettier();
}
2021-09-11 09:55:46 +08:00
console.log("Preparing files for playground...");
await buildPlaygroundFiles();
2021-09-11 09:55:46 +08:00
// --- Site ---
console.log("Installing website dependencies...");
await runYarn("install", [], { cwd: WEBSITE_DIR });
2021-09-11 09:55:46 +08:00
2023-04-27 04:26:06 +02:00
if (IS_PULL_REQUEST) {
console.log("Synchronizing docs...");
process.env.PRETTIER_VERSION = `999.999.999-pr.${process.env.REVIEW_ID}`;
2023-04-27 04:26:06 +02:00
await runYarn("update-stable-docs", [], { cwd: WEBSITE_DIR });
}
console.log("Building website...");
await runYarn("build", [], { cwd: WEBSITE_DIR });