Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions scripts/build-cli.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,19 @@ describe("build-cli", () => {
await expect(readdir(cliWebDir)).resolves.toEqual([]);
});

it("does not recreate retired migration artifacts when preparing output directories", async () => {
const cliDistDir = await mkdtemp(join(tmpdir(), "coder-studio-cli-dist-"));
const cliEsmDir = join(cliDistDir, "esm");
const cliWebDir = join(cliDistDir, "web");

await mkdir(join(cliEsmDir, "migrations"), { recursive: true });
await writeFile(join(cliEsmDir, "migrations", "001_init.sql"), "-- stale\n");

await prepareCliOutputDirs({ cliDistDir, cliEsmDir, cliWebDir });

await expect(readdir(cliEsmDir)).resolves.toEqual([]);
});

it("declares every bundled production dependency in the CLI package manifest", async () => {
const pkg = JSON.parse(await readFile(join(CLI_DIR, "package.json"), "utf8")) as {
dependencies?: Record<string, string>;
Expand Down
20 changes: 2 additions & 18 deletions scripts/build-cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
*/

import * as esbuild from "esbuild";
import { copyFile, rm, writeFile } from "fs/promises";
import { join, resolve } from "path";
import { rm, writeFile } from "fs/promises";
import { resolve } from "path";
import {
CLI_DIR,
CLI_ESM_DIR,
Expand Down Expand Up @@ -69,22 +69,6 @@ import('./esm/bin.mjs').catch((err) => {
await writeFile(binPath, binContent, { mode: 0o755 });
success(`bin.js: ${binPath}`);

// Copy migrations
info("Copying database migrations...");
const migrationsSrc = join(SERVER_DIR, "src/storage/migrations");
const migrationsDest = join(CLI_ESM_DIR, "migrations");
if (await exists(migrationsSrc)) {
await ensureDir(migrationsDest);
const { readdir } = await import("fs/promises");
const files = await readdir(migrationsSrc);
for (const file of files) {
await copyFile(join(migrationsSrc, file), join(migrationsDest, file));
}
success(`Migrations: ${migrationsDest}`);
} else {
error("Warning: migrations source not found, skipping");
}

// Copy web assets
info("Copying web assets...");
if (await exists(WEB_DIST_DIR)) {
Expand Down
9 changes: 3 additions & 6 deletions scripts/publish-cli.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,13 +86,12 @@ describe("publish-cli", () => {
const dir = await mkdtemp(join(tmpdir(), "coder-studio-publish-"));
const cliDir = join(dir, "packages", "cli");

await mkdir(join(cliDir, "dist", "esm", "migrations"), { recursive: true });
await mkdir(join(cliDir, "dist", "esm"), { recursive: true });
await mkdir(join(cliDir, "dist", "web"), { recursive: true });
await writeFile(join(cliDir, "dist", "bin.js"), "#!/usr/bin/env node\n");
await writeFile(join(cliDir, "dist", "esm", "bin.mjs"), "export {};\n");
await writeFile(join(cliDir, "dist", "esm", "index.mjs"), "export {};\n");
await writeFile(join(cliDir, "dist", "esm", "server-runner.mjs"), "export {};\n");
await writeFile(join(cliDir, "dist", "esm", "migrations", "001_init.sql"), "-- init\n");
await writeFile(join(cliDir, "dist", "web", "index.html"), "<!doctype html>\n");
await writeFile(
join(cliDir, "package.json"),
Expand Down Expand Up @@ -130,7 +129,7 @@ describe("publish-cli", () => {
const dir = await mkdtemp(join(tmpdir(), "coder-studio-publish-"));
const cliDir = join(dir, "packages", "cli");

await mkdir(join(cliDir, "dist", "esm", "migrations"), { recursive: true });
await mkdir(join(cliDir, "dist", "esm"), { recursive: true });
await mkdir(join(cliDir, "dist", "web"), { recursive: true });
await writeFile(join(cliDir, "dist", "bin.js"), "#!/usr/bin/env node\n");
await writeFile(
Expand All @@ -139,7 +138,6 @@ describe("publish-cli", () => {
);
await writeFile(join(cliDir, "dist", "esm", "index.mjs"), "export {};\n");
await writeFile(join(cliDir, "dist", "esm", "server-runner.mjs"), "export {};\n");
await writeFile(join(cliDir, "dist", "esm", "migrations", "001_init.sql"), "-- init\n");
await writeFile(join(cliDir, "dist", "web", "index.html"), "<!doctype html>\n");
await writeFile(
join(cliDir, "package.json"),
Expand Down Expand Up @@ -172,13 +170,12 @@ describe("publish-cli", () => {
const dir = await mkdtemp(join(tmpdir(), "coder-studio-publish-"));
const cliDir = join(dir, "packages", "cli");

await mkdir(join(cliDir, "dist", "esm", "migrations"), { recursive: true });
await mkdir(join(cliDir, "dist", "esm"), { recursive: true });
await mkdir(join(cliDir, "dist", "web"), { recursive: true });
await writeFile(join(cliDir, "dist", "bin.js"), "#!/usr/bin/env node\n");
await writeFile(join(cliDir, "dist", "esm", "bin.mjs"), "export {};\n");
await writeFile(join(cliDir, "dist", "esm", "index.mjs"), "export {};\n");
await writeFile(join(cliDir, "dist", "esm", "server-runner.mjs"), "export {};\n");
await writeFile(join(cliDir, "dist", "esm", "migrations", "001_init.sql"), "-- init\n");
await writeFile(join(cliDir, "dist", "web", "index.html"), "<!doctype html>\n");
await writeFile(
join(cliDir, "package.json"),
Expand Down
13 changes: 0 additions & 13 deletions scripts/publish-cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,6 @@ export async function assertCliPublishArtifacts(
await assertFile(resolve(cliDir, "dist/esm/index.mjs"));
await assertFile(resolve(cliDir, "dist/esm/server-runner.mjs"));
await assertFile(resolve(cliDir, "dist/web/index.html"));
await assertDirectoryHasFile(resolve(cliDir, "dist/esm/migrations"), ".sql");
assertBundleRuntimeDependenciesDeclared(
pkg.dependencies,
await collectBareImports(resolve(cliDir, "dist/esm"), [
Expand Down Expand Up @@ -300,18 +299,6 @@ async function assertFile(path: string): Promise<void> {
}
}

async function assertDirectoryHasFile(dir: string, extension: string): Promise<void> {
const stats = await stat(dir).catch(() => null);
if (!stats?.isDirectory()) {
throw new Error(`Required publish artifact directory is missing: ${dir}`);
}

const files = await readdir(dir);
if (!files.some((file) => file.endsWith(extension))) {
throw new Error(`Required publish artifact directory has no ${extension} files: ${dir}`);
}
}

function hasRecordValue(value: unknown, key: string, expected: string): boolean {
return (
typeof value === "object" &&
Expand Down
Loading