create-t3-app-deepmeta
Version:
Create web application with the t3 stack
97 lines (81 loc) • 2.7 kB
text/typescript
import { type PackageJson } from "type-fest";
import path from "path";
import fs from "fs-extra";
import { runCli } from "~/cli/index.js";
import { createProject } from "~/helpers/createProject.js";
import { initializeGit } from "~/helpers/git.js";
import { setImportAlias } from "~/helpers/setImportAlias.js";
import { logNextSteps } from "~/helpers/logNextSteps.js";
import { buildPkgInstallerMap } from "~/installers/index.js";
import { logger } from "~/utils/logger.js";
import { parseNameAndPath } from "~/utils/parseNameAndPath.js";
import { renderTitle } from "~/utils/renderTitle.js";
import {
getNpmVersion,
renderVersionWarning,
} from "./utils/renderVersionWarning.js";
import { installDependencies } from "./helpers/installDependencies.js";
import { getVersion } from "./utils/getT3Version.js";
type CT3APackageJSON = PackageJson & {
ct3aMetadata?: {
initVersion: string;
};
};
const main = async () => {
const npmVersion = await getNpmVersion();
renderTitle();
npmVersion && renderVersionWarning(npmVersion);
const {
appName,
packages,
flags: { noGit, noInstall, importAlias },
} = 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,
packages: usePackages,
importAlias: importAlias,
noInstall,
});
// Write name to package.json
const pkgJson = fs.readJSONSync(
path.join(projectDir, "package.json"),
) as CT3APackageJSON;
pkgJson.name = scopedAppName;
pkgJson.ct3aMetadata = { initVersion: getVersion() };
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 });
}
// Rename _eslintrc.json to .eslintrc.json - we use _eslintrc.json to avoid conflicts with the monorepos linter
fs.renameSync(
path.join(projectDir, "_eslintrc.cjs"),
path.join(projectDir, ".eslintrc.cjs"),
);
if (!noGit) {
await initializeGit(projectDir);
}
logNextSteps({ projectName: appDir, packages: usePackages, noInstall });
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);
});