create-w3-app
Version:
Create ethereum dApps with w3 stack
120 lines (102 loc) • 3.12 kB
text/typescript
import path from "path";
import { execa } from "execa";
import fs from "fs-extra";
import { type PackageJson } from "type-fest";
import { runCli } from "~/cli/index.js";
import { createProject } from "~/helpers/createProject.js";
import { initializeGit } from "~/helpers/git.js";
import { logNextSteps } from "~/helpers/logNextSteps.js";
import { setImportAlias } from "~/helpers/setImportAlias.js";
import { buildPkgInstallerMap } from "~/installers/index.js";
import { getVersion } from "~/utils/getKitVersion.js";
import { getUserPkgManager } from "~/utils/getUserPkgManager.js";
import { logger } from "~/utils/logger.js";
import { parseNameAndPath } from "~/utils/parseNameAndPath.js";
import { renderTitle } from "~/utils/renderTitle.js";
import { formatProject } from "./helpers/format.js";
import { installDependencies } from "./helpers/installDependencies.js";
import {
getNpmVersion,
renderVersionWarning,
} from "./utils/renderVersionWarning.js";
type CWeb3APackageJSON = PackageJson & {
cweb3aMetadata?: {
initVersion: string;
};
};
const main = async () => {
const npmVersion = await getNpmVersion();
const pkgManager = getUserPkgManager();
renderTitle();
if (npmVersion) {
renderVersionWarning(npmVersion);
}
const {
appName,
packages,
flags: { noGit, noInstall, importAlias, appRouter },
} = await runCli();
const usePackages = buildPkgInstallerMap(packages);
// e.g. dir/@mono/app returns ["@mono/app", "dir/app"]
const [scopedAppName, appDir] = parseNameAndPath(appName);
const projectDir = await createProject({
projectName: appDir,
scopedAppName,
packages: usePackages,
importAlias,
noInstall,
appRouter,
});
// Write name to package.json
const pkgJson = fs.readJSONSync(
path.join(projectDir, "package.json")
) as CWeb3APackageJSON;
pkgJson.name = scopedAppName;
pkgJson.cweb3aMetadata = { initVersion: getVersion() };
// ? Bun doesn't support this field (yet)
if (pkgManager !== "bun") {
const { stdout } = await execa(pkgManager, ["-v"], {
cwd: projectDir,
});
pkgJson.packageManager = `${pkgManager}@${stdout.trim()}`;
}
fs.writeJSONSync(path.join(projectDir, "package.json"), pkgJson, {
spaces: 2,
});
// update import alias in any generated files if not using the default
if (importAlias !== "~/") {
setImportAlias(projectDir, importAlias);
}
if (!noInstall) {
await installDependencies({ projectDir });
await formatProject({
pkgManager,
projectDir,
eslint: packages.includes("eslint"),
});
}
if (!noGit) {
await initializeGit(projectDir);
}
await logNextSteps({
projectName: appDir,
packages: usePackages,
appRouter,
noInstall,
projectDir,
});
process.exit(0);
};
main().catch((err) => {
logger.error("Aborting installation...");
if (err instanceof Error) {
logger.error(err);
} else {
logger.error(
"An unknown error has occurred. Please open an issue on github with the below:"
);
console.log(err);
}
process.exit(1);
});