kinglint
Version:
Load all needed configuration for your project
88 lines (74 loc) • 2.8 kB
JavaScript
import { exec } from "child_process";
import { program } from "commander";
import { readFileSync } from "fs";
import ora from "ora";
import path, { join } from "path";
import { commitMsg } from "./files/commitMsg.js";
import { editorConfig } from "./files/editorConfig.js";
import { eslintJs } from "./files/javascript.js";
import { lintstaged } from "./files/lintstaged.js";
import { eslintNextjs } from "./files/nextjs.js";
import { prettier } from "./files/prettier.js";
import { husky } from "./packages/husky.js";
import { javascript } from "./packages/javascript.js";
import { nextjs } from "./packages/nextjs.js";
import { huskyScript } from "./scripts/husky.js";
import { loadOptions } from "./utils/programOptions.js";
import { deletePkgJsonScript, writeFiles, writePkgJson } from "./utils/writeFiles.js";
const kinglintDir = path.dirname(path.dirname(new URL(import.meta.url).pathname));
const kinglintPkgJson = readFileSync(join(kinglintDir, "package.json"), "utf8");
const { version } = JSON.parse(kinglintPkgJson);
program.version(version, "-v, --version", "current version");
loadOptions(program);
program.parse(process.argv);
const options = program.opts();
const buildConfig = {};
const setOptions = (pckg, files, options = {}) => {
const setupFiles = Array.isArray(files) ? files : [files];
buildConfig.package = pckg;
buildConfig.files = setupFiles;
buildConfig.options = options;
};
const buildOptions = Object.freeze({
javascript: () =>
setOptions(javascript, [
{ file: eslintJs, fileName: ".eslintrc.cjs" },
{ file: editorConfig, fileName: ".editorconfig" },
]),
nextjs: () =>
setOptions(nextjs, [
{ file: eslintNextjs, fileName: ".eslintrc.cjs" },
{ file: editorConfig, fileName: ".editorconfig" },
{ file: prettier, fileName: ".prettierrc" },
]),
husky: () =>
setOptions(
husky,
[
{ file: lintstaged, fileName: ".lintstagedrc" },
{ file: commitMsg, fileName: ".husky/commit-msg" },
],
{ file: "package.json", script: huskyScript, delete: true }
),
});
buildOptions[Object.keys(options)[0]] && buildOptions[Object.keys(options)[0]]();
if (!Object.keys(buildConfig).length) {
console.error("Option entered does not exist, insert --help to see options");
}
if (Object.keys(buildConfig).length) {
const spinner = ora("Installing dependencies").start();
const childProcess = exec(buildConfig.package.join(" "));
childProcess.on("exit", (code) => {
writeFiles(buildConfig.files);
if (buildConfig?.options?.delete) {
deletePkgJsonScript(buildConfig.options);
}
code === 0
? spinner.succeed("Dependencies installed successfully")
: spinner.fail("Error installing dependencies");
});
if (Object.keys(buildConfig.options).length) {
writePkgJson(buildConfig.options);
}
}