Skip to content
Snippets Groups Projects
create-app.ts 2.03 KiB
Newer Older
/* eslint-disable import/no-extraneous-dependencies */
Marcus Schiesser's avatar
Marcus Schiesser committed
import path from "path";
import { green } from "picocolors";
Marcus Schiesser's avatar
Marcus Schiesser committed
import type { PackageManager } from "./helpers/get-pkg-manager";
import { tryGitInit } from "./helpers/git";
import { isFolderEmpty } from "./helpers/is-folder-empty";
import { getOnline } from "./helpers/is-online";
import { isWriteable } from "./helpers/is-writeable";
import { makeDir } from "./helpers/make-dir";
import type {
  TemplateEngine,
  TemplateFramework,
  TemplateType,
import { installPythonTemplate, installTemplate } from "./templates";

export async function createApp({
  appPath,
  packageManager,
  eslint,
}: {
  template: TemplateType;
Marcus Schiesser's avatar
Marcus Schiesser committed
  appPath: string;
  packageManager: PackageManager;
  eslint: boolean;
}): Promise<void> {
Marcus Schiesser's avatar
Marcus Schiesser committed
  const root = path.resolve(appPath);

  if (!(await isWriteable(path.dirname(root)))) {
    console.error(
Marcus Schiesser's avatar
Marcus Schiesser committed
      "The application path is not writable, please check folder permissions and try again.",
    );
    console.error(
Marcus Schiesser's avatar
Marcus Schiesser committed
      "It is likely you do not have write permissions for this folder.",
    );
    process.exit(1);
Marcus Schiesser's avatar
Marcus Schiesser committed
  const appName = path.basename(root);
Marcus Schiesser's avatar
Marcus Schiesser committed
  await makeDir(root);
  if (!isFolderEmpty(root, appName)) {
Marcus Schiesser's avatar
Marcus Schiesser committed
    process.exit(1);
Marcus Schiesser's avatar
Marcus Schiesser committed
  const useYarn = packageManager === "yarn";
  const isOnline = !useYarn || (await getOnline());
Marcus Schiesser's avatar
Marcus Schiesser committed
  console.log(`Creating a new LlamaIndex app in ${green(root)}.`);
  console.log();
Marcus Schiesser's avatar
Marcus Schiesser committed
  process.chdir(root);
  if (framework === "fastapi") {
    await installPythonTemplate({ appName, root, template, framework });
  } else {
    await installTemplate({
      appName,
      root,
      template,
      framework,
      engine,
      ui,
      packageManager,
      isOnline,
      eslint,
    });
  }

  if (tryGitInit(root)) {
Marcus Schiesser's avatar
Marcus Schiesser committed
    console.log("Initialized a git repository.");
    console.log();
Marcus Schiesser's avatar
Marcus Schiesser committed
  console.log(`${green("Success!")} Created ${appName} at ${appPath}`);
  console.log();