@funish/basis
Version:
A unified development toolkit with CLI for package management, versioning, publishing, linting, and git hooks management for JavaScript/TypeScript projects.
9 lines (6 loc) • 3.76 kB
JavaScript
;const update=require("c12/update"),consola=require("consola"),magicast=require("magicast"),nypm=require("nypm"),pathe=require("pathe"),pkgTypes=require("pkg-types"),utils=require("./basis.D3fInv-P.cjs"),git=require("./basis.DuZo2uz1.cjs"),S={ts:{ext:"ts",label:"TypeScript"},mjs:{ext:"mjs",label:"ES Module"},cjs:{ext:"cjs",label:"CommonJS"}};function J(i,r="npm"){const o=magicast.parseModule(i==="cjs"?`const { defineBasisConfig } = require("@funish/basis");
module.exports = defineBasisConfig({});`:`import { defineBasisConfig } from "@funish/basis";
export default defineBasisConfig({});`),{execPrefix:n}=utils.getPackageManagerCommands(r),c={git:{hooks:{"pre-commit":`${n} basis lint --staged`,"commit-msg":`${n} basis git --lint-commit`}}},a=o.exports.default.$args[0];return Object.assign(a,c),a.$ast.leadingComments=[{type:"Block",value:`
Configure your project here
See: https://github.com/funish/basis/tree/main/packages/basis#configuration
`}],magicast.generateCode(o).code}async function A(i){if(await utils.fileExists(pathe.resolve(i,"tsconfig.json")))return"ts";try{if((await pkgTypes.readPackageJSON(i)).type==="module")return"mjs"}catch{}return"ts"}async function init(i=process.cwd(),r={}){const{force:o=!1,skipGitCheck:n=!1,skipInstall:c=!1}=r;consola.consola.start("Initializing basis configuration...");const a=await A(i),d=await consola.consola.prompt("Choose config file format:",{type:"select",initial:a,options:Object.entries(S).map(([e,{label:s,ext:p}])=>({value:e,label:`${s} (${p}) ${a===e?"(recommended)":""}`}))}),g=S[d].ext,m=`basis.config.${g}`,k=pathe.resolve(i,m);if(await utils.fileExists(k)&&!o)return consola.consola.error(`${m} already exists. Use --force to overwrite.`),!1;let t=!1;if(!n)if(await utils.fileExists(pathe.resolve(i,".git")))t=await consola.consola.prompt("Setup Git hooks and configuration?",{type:"confirm",initial:!0});else if(consola.consola.info("No Git repository found."),await consola.consola.prompt("Initialize Git repository?",{type:"confirm",initial:!0}))try{await git.initGitRepo(i)?t=await consola.consola.prompt("Setup Git hooks and configuration?",{type:"confirm",initial:!0}):(consola.consola.warn("Git initialization failed, skipping Git setup"),t=!1)}catch(e){consola.consola.error("Failed to initialize Git repository:",e),consola.consola.warn("Skipping Git setup"),t=!1}else consola.consola.info("Skipping Git initialization"),t=!1;const w=(await nypm.detectPackageManager(i))?.name||"npm";await update.updateConfig({cwd:i,configFile:"basis.config",createExtension:`.${g}`,onCreate:()=>J(d,w)});let l=!1;c||(l=await consola.consola.prompt("Install @funish/basis dependency now?",{type:"confirm",initial:!0}));const h=await pkgTypes.findWorkspaceDir(i)===i;if(l)try{await nypm.addDevDependency(["@funish/basis"],{workspace:h})}catch(e){consola.consola.error("Failed to install @funish/basis:",e),consola.consola.info("You can install it manually with: basis add -D @funish/basis")}if(t)try{const e=pathe.resolve(i,"package.json");if(await utils.fileExists(e)){const s=await pkgTypes.readPackageJSON(e),p=w,u="basis git setup";s.scripts=s.scripts||{};const y=p==="yarn"?"prepare":"postinstall",f=s.scripts[y];let b=!1;f?.includes(u)||(s.scripts[y]=f?`${f} && ${u}`:u,b=!0),b&&await pkgTypes.writePackageJSON(e,s)}else consola.consola.warn("No package.json found. You'll need to run git setup manually.")}catch(e){consola.consola.error("Failed to update package.json:",e),consola.consola.warn("You can manually add 'basis git setup' to your postinstall script")}return t&&!l&&(await git.setupGit(i)||consola.consola.warn("Git setup failed, but basis config was created successfully")),consola.consola.success("Basis initialization completed!"),!0}exports.init=init;