UNPKG

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