ui-thing
Version:
CLI used to add Nuxt 3 components to a project
77 lines (73 loc) • 3.14 kB
text/typescript
import { Command } from "commander";
import { defu } from "defu";
import fse from "fs-extra";
import kleur from "kleur";
import { createCSS } from "../templates/css";
import { TAILWIND_CONFIG_JS } from "../templates/tailwind";
import { InitOptions, UIConfig } from "../types";
import { addPrettierConfig } from "../utils/addPrettierConfig";
import { addModuleToConfig, getNuxtConfig, getUIConfig, updateConfig } from "../utils/config";
import { INIT_DEPS, INIT_DEV_DEPS, INIT_MODULES } from "../utils/constants";
import { installPackages } from "../utils/installPackages";
import { printFancyBoxMessage } from "../utils/printFancyBoxMessage";
export const init = new Command()
.command("init")
.name("init")
.description(
"Initialize UI Thing in your Nuxt project. This will: 1. Create a tailwind.config.js file 2. Update your nuxt.config.ts file 3. Add the necessary dependencies 4. Create a ui-thing.config.ts file with the default configuration"
)
.option("-f --force", "Overwrite config file if it exists.", false)
.option("-y --yes", "Skip prompts and use default values.", false)
.option("-n --nuxtVersion <number>", "Specify the Nuxt version you are using.", "3")
.action(async (options: InitOptions) => {
// Get nuxt config
const cfg = await getNuxtConfig();
// Get ui config
let uiConfig: UIConfig = await getUIConfig(options);
// Add tailwindcss
await fse.writeFile(uiConfig.tailwindConfigLocation, TAILWIND_CONFIG_JS, "utf-8");
// create css path if it does not exist
// add css file
fse.writeFileSync(
uiConfig.tailwindCSSLocation,
createCSS(uiConfig.theme.toUpperCase() as any),
"utf-8"
);
// Add init modules ot nuxt cinfig
addModuleToConfig(cfg.nuxtConfig, INIT_MODULES);
// Configure modules in nuxt config
cfg.defaultExport.tailwindcss = defu(cfg.defaultExport.tailwindcss, {
exposeConfig: true,
editorSupport: true,
});
cfg.defaultExport.colorMode = defu(cfg.defaultExport.colorMode, { classSuffix: "" });
cfg.defaultExport.imports ||= {};
cfg.defaultExport.imports.imports ||= [];
const tvExists = cfg.defaultExport.imports.imports.find(
(i: any) => i.from === "tailwind-variants" && i.name === "tv"
);
if (!tvExists) {
cfg.defaultExport.imports.imports.push({ from: "tailwind-variants", name: "tv" });
}
const variantPropsExists = cfg.defaultExport.imports.imports.find(
(i: any) => i.from === "tailwind-variants" && i.name === "VariantProps"
);
if (!variantPropsExists) {
cfg.defaultExport.imports.imports.push({
from: "tailwind-variants",
name: "VariantProps",
type: true,
});
}
// Write changes to nuxt config
await updateConfig(cfg.nuxtConfig, "nuxt.config.ts");
// instal deps
await installPackages(uiConfig.packageManager, INIT_DEPS, INIT_DEV_DEPS);
// Add prettier config
await addPrettierConfig();
printFancyBoxMessage(
"Initialized",
{ title: "Complete" },
`Feel free to start adding components with the ${kleur.bgWhite(" add ")} command.`
);
});