Skip to content
Snippets Groups Projects
is-folder-empty.ts 1.38 KiB
Newer Older
/* eslint-disable import/no-extraneous-dependencies */
Marcus Schiesser's avatar
Marcus Schiesser committed
import fs from "fs";
import path from "path";
import { blue, green } from "picocolors";

export function isFolderEmpty(root: string, name: string): boolean {
  const validFiles = [
Marcus Schiesser's avatar
Marcus Schiesser committed
    ".DS_Store",
    ".git",
    ".gitattributes",
    ".gitignore",
    ".gitlab-ci.yml",
    ".hg",
    ".hgcheck",
    ".hgignore",
    ".idea",
    ".npmignore",
    ".travis.yml",
    "LICENSE",
    "Thumbs.db",
    "docs",
    "mkdocs.yml",
    "npm-debug.log",
    "yarn-debug.log",
    "yarn-error.log",
    "yarnrc.yml",
    ".yarn",
  ];

  const conflicts = fs
    .readdirSync(root)
    .filter((file) => !validFiles.includes(file))
    // Support IntelliJ IDEA-based editors
Marcus Schiesser's avatar
Marcus Schiesser committed
    .filter((file) => !/\.iml$/.test(file));

  if (conflicts.length > 0) {
    console.log(
Marcus Schiesser's avatar
Marcus Schiesser committed
      `The directory ${green(name)} contains files that could conflict:`,
    );
    console.log();
    for (const file of conflicts) {
      try {
Marcus Schiesser's avatar
Marcus Schiesser committed
        const stats = fs.lstatSync(path.join(root, file));
        if (stats.isDirectory()) {
Marcus Schiesser's avatar
Marcus Schiesser committed
          console.log(`  ${blue(file)}/`);
        } else {
Marcus Schiesser's avatar
Marcus Schiesser committed
          console.log(`  ${file}`);
        }
      } catch {
Marcus Schiesser's avatar
Marcus Schiesser committed
        console.log(`  ${file}`);
Marcus Schiesser's avatar
Marcus Schiesser committed
    console.log();
    console.log(
Marcus Schiesser's avatar
Marcus Schiesser committed
      "Either try using a new directory name, or remove the files listed above.",
    );
    console.log();
    return false;
Marcus Schiesser's avatar
Marcus Schiesser committed
  return true;