Skip to content
Snippets Groups Projects
create-app.ts 1.96 KiB
Newer Older
  • Learn to ignore specific revisions
  • /* 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 { TemplateFramework, TemplateType } from "./templates";
    
    import { installTemplate } from "./templates";
    
    
    export async function createApp({
    
      appPath,
      packageManager,
      eslint,
      srcDir,
      importAlias,
    }: {
    
    Marcus Schiesser's avatar
    Marcus Schiesser committed
      appPath: string;
      packageManager: PackageManager;
      eslint: boolean;
      srcDir: boolean;
      importAlias: string;
    
    }): Promise<void> {
    
    Marcus Schiesser's avatar
    Marcus Schiesser committed
      const template: TemplateType = "simple";
    
    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 an example repository is not provided for cloning, proceed
       * by installing from a template.
       */
      await installTemplate({
        appName,
        root,
        template,
    
        packageManager,
        isOnline,
        eslint,
        srcDir,
        importAlias,
      });
    
    
      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();