Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
devcontainer.ts 1.72 KiB
import fs from "fs";
import path from "path";
import { TemplateFramework } from "./types";

function renderDevcontainerContent(
  templatesDir: string,
  framework: TemplateFramework,
  frontend: boolean,
) {
  const devcontainerJson: any = JSON.parse(
    fs.readFileSync(path.join(templatesDir, "devcontainer.json"), "utf8"),
  );

  // Modify postCreateCommand
  if (frontend) {
    devcontainerJson.postCreateCommand =
      framework === "fastapi"
        ? "cd backend && poetry install && cd ../frontend && npm install"
        : "cd backend && npm install && cd ../frontend && npm install";
  } else {
    devcontainerJson.postCreateCommand =
      framework === "fastapi" ? "poetry install" : "npm install";
  }

  // Modify containerEnv
  if (framework === "fastapi") {
    if (frontend) {
      devcontainerJson.containerEnv = {
        ...devcontainerJson.containerEnv,
        PYTHONPATH: "${PYTHONPATH}:${workspaceFolder}/backend",
      };
    } else {
      devcontainerJson.containerEnv = {
        ...devcontainerJson.containerEnv,
        PYTHONPATH: "${PYTHONPATH}:${workspaceFolder}",
      };
    }
  }

  return JSON.stringify(devcontainerJson, null, 2);
}

export const writeDevcontainer = async (
  root: string,
  templatesDir: string,
  framework: TemplateFramework,
  frontend: boolean,
) => {
  const devcontainerDir = path.join(root, ".devcontainer");
  if (fs.existsSync(devcontainerDir)) {
    console.log("Template already has a .devcontainer. Using it.");
    return;
  }
  const devcontainerContent = renderDevcontainerContent(
    templatesDir,
    framework,
    frontend,
  );
  fs.mkdirSync(devcontainerDir);
  await fs.promises.writeFile(
    path.join(devcontainerDir, "devcontainer.json"),
    devcontainerContent,
  );
};