ultracite 6.2.0 → 6.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -64,7 +64,7 @@ npx ultracite check
64
64
 
65
65
  ## Tests
66
66
 
67
- Tests are written in [Vitest](https://vitest.dev). You can run them with:
67
+ You can run tests with:
68
68
 
69
69
  ```bash
70
70
  bun test
@@ -238,7 +238,13 @@
238
238
  "nursery": {
239
239
  "noDuplicateDependencies": "error",
240
240
  "noEmptySource": "error",
241
- "noIncrementDecrement": "error",
241
+ "noIncrementDecrement": {
242
+ "level": "error",
243
+ "options": {
244
+ "allowForLoopAfterthoughts": true
245
+ }
246
+ },
247
+ "noParametersOnlyUsedInRecursion": "error",
242
248
  "noShadow": "error",
243
249
  "noUnusedExpressions": "error",
244
250
  "noUselessUndefined": "error",
@@ -28,6 +28,16 @@
28
28
  }
29
29
  }
30
30
  }
31
+ },
32
+ {
33
+ "includes": ["**/page.{ts,tsx,js,jsx}", "**/layout.{ts,tsx,js,jsx}"],
34
+ "linter": {
35
+ "rules": {
36
+ "suspicious": {
37
+ "useAwait": "off"
38
+ }
39
+ }
40
+ }
31
41
  }
32
42
  ]
33
43
  }
package/dist/index.js CHANGED
@@ -117,7 +117,7 @@ ${i}`)}}});var Kt,le=E(()=>{Kt=me({"./husky.ts":()=>(ae(),Q(Me)),"./lefthook.ts"
117
117
  `}else t+=`${n}: '${i}'
118
118
  `;return t},sn=async()=>{try{let e=pe(await q("./package.json","utf-8"));return e?e.type==="module":!1}catch{return!1}},on=async e=>{let t=pe(await q("./package.json","utf-8"));t&&(t["lint-staged"]?t["lint-staged"]=T(t["lint-staged"],y(e)):t["lint-staged"]=y(e),await C("./package.json",JSON.stringify(t,null,2)))},rn=async(e,t)=>{let n=await q(e,"utf-8"),i=pe(n);if(!i)return;let s=T(i,y(t));await C(e,JSON.stringify(s,null,2))},an=async(e,t)=>{let n=await q(e,"utf-8"),i=tn(n);if(!i)return;let s=T(i,y(t));await C(e,nn(s))},cn=async(e,t)=>{let s=(await import(Xt(e).href)).default||{},o=T(s,y(t)),r=`export default ${JSON.stringify(o,null,2)};
119
119
  `;await C(e,r)},ln=async(e,t)=>{delete K.cache[K.resolve(`./${e}`)];let n=Kt(`./${e}`),i=T(n,y(t)),s=`module.exports = ${JSON.stringify(i,null,2)};
120
- `;await C(e,s)},fe=async e=>{await C(".lintstagedrc.json",JSON.stringify(y(e),null,2))},dn=async(e,t)=>{if(e==="./package.json"){await on(t);return}if(e.endsWith(".json")||e==="./.lintstagedrc"){await rn(e,t);return}if(e.endsWith(".yaml")||e.endsWith(".yml")){await an(e,t);return}let n=await sn();if(e.endsWith(".mjs")||e.endsWith(".js")&&n){try{await cn(e,t)}catch{await fe(t)}return}if(e.endsWith(".cjs")||e.endsWith(".js")&&!n)try{await ln(e,t)}catch{await fe(t)}},A={exists:async()=>{for(let e of ze)if(await l(e))return!0;return!1},install:async e=>{await Qt("lint-staged",{packageManager:e,workspace:await h()})},create:async e=>{await C(".lintstagedrc.json",JSON.stringify(y(e),null,2))},update:async e=>{let t=null;for(let n of ze)if(await l(n)){t=n;break}if(!t){await fe(e);return}await dn(t,e)}}});import{initTRPC as Nn}from"@trpc/server";import{createCli as Dn}from"trpc-cli";import a from"zod";var w={name:"ultracite",description:"The AI-ready formatter that helps you write and generate code faster.",version:"6.2.0",type:"module",bin:{ultracite:"dist/index.js"},files:["config","dist","README.md"],scripts:{build:"tsup",test:"bun test","test:coverage":"bun test --coverage"},exports:{"./*":"./config/*/biome.jsonc"},author:"Hayden Bleasel <hello@haydenbleasel.com>",bugs:{url:"https://github.com/haydenbleasel/ultracite/issues"},homepage:"https://www.ultracite.ai/",keywords:["ultracite","biome","linter","formatter","fixer"],license:"MIT",publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},repository:{type:"git",url:"git+https://github.com/haydenbleasel/ultracite.git"},devDependencies:{"@biomejs/biome":"2.3.2","@types/node":"^24.10.0",tsup:"^8.5.0",turbo:"^2.6.0"},dependencies:{"@clack/prompts":"^0.11.0","@trpc/server":"^11.7.1",deepmerge:"^4.3.1",glob:"^11.0.3","jsonc-parser":"^3.3.1",nypm:"^0.6.2","trpc-cli":"^0.12.0",zod:"^4.1.12"},packageManager:"bun@1.3.1"};u();import{spawnSync as it}from"child_process";import ye from"process";var Z=e=>{let t=e?.[0]||[],n=e?.[1]["diagnostic-level"],i=["npx","@biomejs/biome","check","--no-errors-on-unmatched"];n&&i.push(`--diagnostic-level=${n}`),t.length>0?i.push(...U(t)):i.push("./");let s=i.join(" "),o=it(s,{stdio:"inherit",shell:!0});o.error&&(console.error("Failed to run Ultracite:",o.error.message),ye.exit(1)),o.status!==0&&ye.exit(o.status??1)};import{spawnSync as kt}from"child_process";import{existsSync as F}from"fs";import{readFile as je}from"fs/promises";import{join as $}from"path";import{parse as bt}from"jsonc-parser";u();import{readFile as we,unlink as ot,writeFile as rt}from"fs/promises";import{parse as ke}from"jsonc-parser";import{removeDependency as at}from"nypm";var J=[".eslintrc",".eslintrc.js",".eslintrc.json",".eslintrc.yml",".eslintrc.yaml",".eslintrc.config.js","eslint.config.js","eslint.config.mjs","eslint.config.cjs",".eslintignore"],be=async()=>{try{let e=await we("package.json","utf-8"),t=ke(e);if(!t||typeof t!="object")return[];let n=t.dependencies||{},i=t.devDependencies||{},s={...n,...i};return Object.keys(s).filter(o=>o.includes("eslint"))}catch{return[]}},ct=async(e,t)=>{if(t.length!==0)try{for(let n of t)await at(n,{packageManager:e})}catch(n){console.warn(n)}},lt=async()=>{let e=[];for(let t of J)if(await l(t))try{await ot(t),e.push(t)}catch(n){console.warn(n)}return e},dt=async()=>{let e="./.vscode/settings.json";if(!await l(e))return!1;try{let t=await we(e,"utf-8"),n=ke(t);if(!n||typeof n!="object")return!1;let i=!1,s={...n},o=["eslint.enable","eslint.format.enable","eslint.validate","eslint.workingDirectories","eslint.codeAction.showDocumentation","eslint.run","eslint.autoFixOnSave","eslint.quiet","eslint.packageManager","eslint.options","eslint.trace.server"];for(let r of o)r in s&&(delete s[r],i=!0);if("editor.codeActionsOnSave"in s){let r=s["editor.codeActionsOnSave"];if(r&&typeof r=="object"){let c=["source.fixAll.eslint","source.organizeImports.eslint"];for(let f of c)f in r&&(delete r[f],i=!0);Object.keys(r).length===0&&(s["editor.codeActionsOnSave"]=void 0)}}return i?(await rt(e,JSON.stringify(s,null,2)),!0):!1}catch(t){return console.warn(t),!1}},ft=async()=>{if((await be()).length>0)return!0;for(let t of J)if(await l(t))return!0;return!1},ee={hasEsLint:ft,remove:async e=>{let t=await be();await ct(e,t);let n=await lt(),i=await dt();return{packagesRemoved:t,filesRemoved:n,vsCodeCleaned:i}}};u();import{readFile as xe,unlink as pt,writeFile as ut}from"fs/promises";import{parse as ve}from"jsonc-parser";import{removeDependency as mt}from"nypm";var L=[".prettierrc",".prettierrc.js",".prettierrc.json",".prettierrc.yml",".prettierrc.yaml",".prettierrc.config.js","prettier.config.js","prettier.config.mjs",".prettierignore"],Ce=async()=>{try{let e=await xe("package.json","utf-8"),t=ve(e);if(!t||typeof t!="object")return[];let n=t.dependencies||{},i=t.devDependencies||{},s={...n,...i};return Object.keys(s).filter(o=>o.includes("prettier"))}catch{return[]}},gt=async(e,t)=>{if(t.length!==0)try{for(let n of t)await mt(n,{packageManager:e})}catch(n){console.warn(n)}},ht=async()=>{let e=[];for(let t of L)if(await l(t))try{await pt(t),e.push(t)}catch(n){console.warn(n)}return e},yt=async()=>{let e="./.vscode/settings.json";if(!await l(e))return!1;try{let t=await xe(e,"utf-8"),n=ve(t);if(!n||typeof n!="object")return!1;let i=!1,s={...n},o=["editor.defaultFormatter","prettier.enable","prettier.requireConfig","prettier.configPath","prettier.printWidth","prettier.tabWidth","prettier.useTabs","prettier.semi","prettier.singleQuote","prettier.quoteProps","prettier.trailingComma","prettier.bracketSpacing","prettier.arrowParens","prettier.endOfLine"];for(let c of o)c in s&&(c==="editor.defaultFormatter"&&s[c]==="esbenp.prettier-vscode"||c!=="editor.defaultFormatter")&&(delete s[c],i=!0);let r=Object.keys(s).filter(c=>c.startsWith("[")&&c.includes("javascript"));for(let c of r){let f=s[c];f&&typeof f=="object"&&"editor.defaultFormatter"in f&&f["editor.defaultFormatter"]==="esbenp.prettier-vscode"&&(delete f["editor.defaultFormatter"],i=!0,Object.keys(f).length===0&&delete s[c])}return i?(await ut(e,JSON.stringify(s,null,2)),!0):!1}catch(t){return console.warn(t),!1}},wt=async()=>{if((await Ce()).length>0)return!0;for(let t of L)if(await l(t))return!0;return!1},te={hasPrettier:wt,remove:async e=>{let t=await Ce();await gt(e,t);let n=await ht(),i=await yt();return{packagesRemoved:t,filesRemoved:n,vsCodeCleaned:i}}};var xt=()=>{let e=kt("npx @biomejs/biome --version",{shell:!0,encoding:"utf-8"});return e.status===0&&e.stdout?{name:"Biome installation",status:"pass",message:`Biome is installed (${e.stdout.trim()})`}:{name:"Biome installation",status:"fail",message:"Biome is not installed or not accessible"}},vt=async()=>{let e=$(process.cwd(),"biome.json"),t=$(process.cwd(),"biome.jsonc"),n=null;if(F(e)?n=e:F(t)&&(n=t),!n)return{name:"Biome configuration",status:"fail",message:"No biome.json or biome.jsonc file found"};try{let i=await je(n,"utf-8"),s=bt(i);return Array.isArray(s?.extends)&&s.extends.includes("ultracite/core")?{name:"Biome configuration",status:"pass",message:"biome.json(c) extends ultracite/core"}:{name:"Biome configuration",status:"warn",message:"biome.json(c) exists but doesn't extend ultracite/core"}}catch{return{name:"Biome configuration",status:"fail",message:"Could not parse biome.json(c) file"}}},Ct=async()=>{let e=$(process.cwd(),"package.json");if(!F(e))return{name:"Ultracite dependency",status:"warn",message:"No package.json found"};try{let t=JSON.parse(await je(e,"utf-8")),n=t.dependencies?.ultracite||t.devDependencies?.ultracite||t.peerDependencies?.ultracite;return n?{name:"Ultracite dependency",status:"pass",message:`Ultracite is in package.json (${n})`}:{name:"Ultracite dependency",status:"warn",message:"Ultracite not found in package.json dependencies"}}catch{return{name:"Ultracite dependency",status:"warn",message:"Could not parse package.json"}}},jt=()=>{let e=L.some(n=>F($(process.cwd(),n))),t=J.some(n=>F($(process.cwd(),n)));if(e||t){let n=[];return e&&n.push("Prettier"),t&&n.push("ESLint"),{name:"Conflicting tools",status:"warn",message:`Found potentially conflicting tools: ${n.join(", ")}`}}return{name:"Conflicting tools",status:"pass",message:"No conflicting formatting/linting tools found"}},Pe=async()=>{let e=[];console.log(`\u{1FA7A} Running Ultracite doctor...
120
+ `;await C(e,s)},fe=async e=>{await C(".lintstagedrc.json",JSON.stringify(y(e),null,2))},dn=async(e,t)=>{if(e==="./package.json"){await on(t);return}if(e.endsWith(".json")||e==="./.lintstagedrc"){await rn(e,t);return}if(e.endsWith(".yaml")||e.endsWith(".yml")){await an(e,t);return}let n=await sn();if(e.endsWith(".mjs")||e.endsWith(".js")&&n){try{await cn(e,t)}catch{await fe(t)}return}if(e.endsWith(".cjs")||e.endsWith(".js")&&!n)try{await ln(e,t)}catch{await fe(t)}},A={exists:async()=>{for(let e of ze)if(await l(e))return!0;return!1},install:async e=>{await Qt("lint-staged",{packageManager:e,workspace:await h()})},create:async e=>{await C(".lintstagedrc.json",JSON.stringify(y(e),null,2))},update:async e=>{let t=null;for(let n of ze)if(await l(n)){t=n;break}if(!t){await fe(e);return}await dn(t,e)}}});import{initTRPC as Nn}from"@trpc/server";import{createCli as Dn}from"trpc-cli";import a from"zod";var w={name:"ultracite",description:"The AI-ready formatter that helps you write and generate code faster.",version:"6.2.1",type:"module",bin:{ultracite:"dist/index.js"},files:["config","dist","README.md"],scripts:{build:"tsup",test:"bun test","test:coverage":"bun test --coverage"},exports:{"./*":"./config/*/biome.jsonc"},author:"Hayden Bleasel <hello@haydenbleasel.com>",bugs:{url:"https://github.com/haydenbleasel/ultracite/issues"},homepage:"https://www.ultracite.ai/",keywords:["ultracite","biome","linter","formatter","fixer"],license:"MIT",publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},repository:{type:"git",url:"git+https://github.com/haydenbleasel/ultracite.git"},devDependencies:{"@biomejs/biome":"2.3.3","@types/node":"^24.10.0",tsup:"^8.5.0",turbo:"^2.6.0"},dependencies:{"@clack/prompts":"^0.11.0","@trpc/server":"^11.7.1",deepmerge:"^4.3.1",glob:"^11.0.3","jsonc-parser":"^3.3.1",nypm:"^0.6.2","trpc-cli":"^0.12.0",zod:"^4.1.12"},packageManager:"bun@1.3.1"};u();import{spawnSync as it}from"child_process";import ye from"process";var Z=e=>{let t=e?.[0]||[],n=e?.[1]["diagnostic-level"],i=["npx","@biomejs/biome","check","--no-errors-on-unmatched"];n&&i.push(`--diagnostic-level=${n}`),t.length>0?i.push(...U(t)):i.push("./");let s=i.join(" "),o=it(s,{stdio:"inherit",shell:!0});o.error&&(console.error("Failed to run Ultracite:",o.error.message),ye.exit(1)),o.status!==0&&ye.exit(o.status??1)};import{spawnSync as kt}from"child_process";import{existsSync as F}from"fs";import{readFile as je}from"fs/promises";import{join as $}from"path";import{parse as bt}from"jsonc-parser";u();import{readFile as we,unlink as ot,writeFile as rt}from"fs/promises";import{parse as ke}from"jsonc-parser";import{removeDependency as at}from"nypm";var J=[".eslintrc",".eslintrc.js",".eslintrc.json",".eslintrc.yml",".eslintrc.yaml",".eslintrc.config.js","eslint.config.js","eslint.config.mjs","eslint.config.cjs",".eslintignore"],be=async()=>{try{let e=await we("package.json","utf-8"),t=ke(e);if(!t||typeof t!="object")return[];let n=t.dependencies||{},i=t.devDependencies||{},s={...n,...i};return Object.keys(s).filter(o=>o.includes("eslint"))}catch{return[]}},ct=async(e,t)=>{if(t.length!==0)try{for(let n of t)await at(n,{packageManager:e})}catch(n){console.warn(n)}},lt=async()=>{let e=[];for(let t of J)if(await l(t))try{await ot(t),e.push(t)}catch(n){console.warn(n)}return e},dt=async()=>{let e="./.vscode/settings.json";if(!await l(e))return!1;try{let t=await we(e,"utf-8"),n=ke(t);if(!n||typeof n!="object")return!1;let i=!1,s={...n},o=["eslint.enable","eslint.format.enable","eslint.validate","eslint.workingDirectories","eslint.codeAction.showDocumentation","eslint.run","eslint.autoFixOnSave","eslint.quiet","eslint.packageManager","eslint.options","eslint.trace.server"];for(let r of o)r in s&&(delete s[r],i=!0);if("editor.codeActionsOnSave"in s){let r=s["editor.codeActionsOnSave"];if(r&&typeof r=="object"){let c=["source.fixAll.eslint","source.organizeImports.eslint"];for(let f of c)f in r&&(delete r[f],i=!0);Object.keys(r).length===0&&(s["editor.codeActionsOnSave"]=void 0)}}return i?(await rt(e,JSON.stringify(s,null,2)),!0):!1}catch(t){return console.warn(t),!1}},ft=async()=>{if((await be()).length>0)return!0;for(let t of J)if(await l(t))return!0;return!1},ee={hasEsLint:ft,remove:async e=>{let t=await be();await ct(e,t);let n=await lt(),i=await dt();return{packagesRemoved:t,filesRemoved:n,vsCodeCleaned:i}}};u();import{readFile as xe,unlink as pt,writeFile as ut}from"fs/promises";import{parse as ve}from"jsonc-parser";import{removeDependency as mt}from"nypm";var L=[".prettierrc",".prettierrc.js",".prettierrc.json",".prettierrc.yml",".prettierrc.yaml",".prettierrc.config.js","prettier.config.js","prettier.config.mjs",".prettierignore"],Ce=async()=>{try{let e=await xe("package.json","utf-8"),t=ve(e);if(!t||typeof t!="object")return[];let n=t.dependencies||{},i=t.devDependencies||{},s={...n,...i};return Object.keys(s).filter(o=>o.includes("prettier"))}catch{return[]}},gt=async(e,t)=>{if(t.length!==0)try{for(let n of t)await mt(n,{packageManager:e})}catch(n){console.warn(n)}},ht=async()=>{let e=[];for(let t of L)if(await l(t))try{await pt(t),e.push(t)}catch(n){console.warn(n)}return e},yt=async()=>{let e="./.vscode/settings.json";if(!await l(e))return!1;try{let t=await xe(e,"utf-8"),n=ve(t);if(!n||typeof n!="object")return!1;let i=!1,s={...n},o=["editor.defaultFormatter","prettier.enable","prettier.requireConfig","prettier.configPath","prettier.printWidth","prettier.tabWidth","prettier.useTabs","prettier.semi","prettier.singleQuote","prettier.quoteProps","prettier.trailingComma","prettier.bracketSpacing","prettier.arrowParens","prettier.endOfLine"];for(let c of o)c in s&&(c==="editor.defaultFormatter"&&s[c]==="esbenp.prettier-vscode"||c!=="editor.defaultFormatter")&&(delete s[c],i=!0);let r=Object.keys(s).filter(c=>c.startsWith("[")&&c.includes("javascript"));for(let c of r){let f=s[c];f&&typeof f=="object"&&"editor.defaultFormatter"in f&&f["editor.defaultFormatter"]==="esbenp.prettier-vscode"&&(delete f["editor.defaultFormatter"],i=!0,Object.keys(f).length===0&&delete s[c])}return i?(await ut(e,JSON.stringify(s,null,2)),!0):!1}catch(t){return console.warn(t),!1}},wt=async()=>{if((await Ce()).length>0)return!0;for(let t of L)if(await l(t))return!0;return!1},te={hasPrettier:wt,remove:async e=>{let t=await Ce();await gt(e,t);let n=await ht(),i=await yt();return{packagesRemoved:t,filesRemoved:n,vsCodeCleaned:i}}};var xt=()=>{let e=kt("npx @biomejs/biome --version",{shell:!0,encoding:"utf-8"});return e.status===0&&e.stdout?{name:"Biome installation",status:"pass",message:`Biome is installed (${e.stdout.trim()})`}:{name:"Biome installation",status:"fail",message:"Biome is not installed or not accessible"}},vt=async()=>{let e=$(process.cwd(),"biome.json"),t=$(process.cwd(),"biome.jsonc"),n=null;if(F(e)?n=e:F(t)&&(n=t),!n)return{name:"Biome configuration",status:"fail",message:"No biome.json or biome.jsonc file found"};try{let i=await je(n,"utf-8"),s=bt(i);return Array.isArray(s?.extends)&&s.extends.includes("ultracite/core")?{name:"Biome configuration",status:"pass",message:"biome.json(c) extends ultracite/core"}:{name:"Biome configuration",status:"warn",message:"biome.json(c) exists but doesn't extend ultracite/core"}}catch{return{name:"Biome configuration",status:"fail",message:"Could not parse biome.json(c) file"}}},Ct=async()=>{let e=$(process.cwd(),"package.json");if(!F(e))return{name:"Ultracite dependency",status:"warn",message:"No package.json found"};try{let t=JSON.parse(await je(e,"utf-8")),n=t.dependencies?.ultracite||t.devDependencies?.ultracite||t.peerDependencies?.ultracite;return n?{name:"Ultracite dependency",status:"pass",message:`Ultracite is in package.json (${n})`}:{name:"Ultracite dependency",status:"warn",message:"Ultracite not found in package.json dependencies"}}catch{return{name:"Ultracite dependency",status:"warn",message:"Could not parse package.json"}}},jt=()=>{let e=L.some(n=>F($(process.cwd(),n))),t=J.some(n=>F($(process.cwd(),n)));if(e||t){let n=[];return e&&n.push("Prettier"),t&&n.push("ESLint"),{name:"Conflicting tools",status:"warn",message:`Found potentially conflicting tools: ${n.join(", ")}`}}return{name:"Conflicting tools",status:"pass",message:"No conflicting formatting/linting tools found"}},Pe=async()=>{let e=[];console.log(`\u{1FA7A} Running Ultracite doctor...
121
121
  `),e.push(xt()),e.push(await vt()),e.push(await Ct()),e.push(jt());let t=e.filter(s=>s.status==="pass").length,n=e.filter(s=>s.status==="fail").length,i=e.filter(s=>s.status==="warn").length;for(let s of e){let o;s.status==="pass"?o="\u2705":s.status==="fail"?o="\u274C":o="\u26A0\uFE0F",console.log(`${o} ${s.name}: ${s.message}`)}console.log(`
122
122
  \u{1F4CA} Summary:`),console.log(` ${t} passed, ${i} warnings, ${n} failed`),n>0&&(console.log(`
123
123
  \u{1F4A1} To fix issues, run: npx ultracite init`),process.exit(1)),i>0?console.log(`
@@ -255,4 +255,4 @@ Most formatting and common issues are automatically fixed by Biome. Run \`npx ul
255
255
 
256
256
  ${N}`:N,i=async()=>{let s=At(t.path);if(s!=="."){let o=s.startsWith("./")?s.slice(2):s;await Rt(o,{recursive:!0})}};return{exists:()=>l(t.path),create:async()=>{await i(),await S(t.path,n),e==="cursor"&&await S("./.cursor/hooks.json",JSON.stringify({version:1,hooks:{afterFileEdit:[{command:"npx ultracite fix"}]}},null,2))},update:async()=>{if(await i(),t.appendMode){if(!await l(t.path)){await S(t.path,n);return}let s=await Ae(t.path,"utf-8");if(s.includes(N.trim()))return;await S(t.path,`${s}
257
257
 
258
- ${N}`)}else await S(t.path,n);if(e==="cursor"){let s=await Ae("./.cursor/hooks.json","utf-8"),o=JSON.parse(s);o.hooks.afterFileEdit.some(c=>c.command.includes("ultracite"))||(o.hooks.afterFileEdit.push({command:"npx ultracite fix"}),await S("./.cursor/hooks.json",JSON.stringify(o,null,2)))}}}};u();import{readFile as Et,writeFile as Fe}from"fs/promises";import Ft from"deepmerge";import{parse as $t}from"jsonc-parser";var $e={$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["ultracite/core"]},se=async()=>await l("./biome.json")?"./biome.json":"./biome.jsonc",z={exists:async()=>{let e=await se();return l(e)},create:async e=>{let t=await se(),n=["ultracite/core"];if(e?.frameworks&&e.frameworks.length>0)for(let s of e.frameworks)n.push(`ultracite/${s}`);let i={...$e,extends:n};return Fe(t,JSON.stringify(i,null,2))},update:async e=>{let t=await se(),n=await Et(t,"utf-8"),s=$t(n)||{},r=[...s.extends&&Array.isArray(s.extends)?s.extends:[]];if(r.includes("ultracite/core")||r.push("ultracite/core"),e?.frameworks&&e.frameworks.length>0)for(let g of e.frameworks){let d=`ultracite/${g}`;r.includes(d)||r.push(d)}s.extends=r;let c={$schema:$e.$schema},f=Ft(s,c);await Fe(t,JSON.stringify(f,null,2))}};u();import{spawnSync as Nt}from"child_process";import{mkdir as Dt,readFile as Ot,writeFile as Ne}from"fs/promises";import Tt from"deepmerge";import{parse as Mt}from"jsonc-parser";var ie={"editor.defaultFormatter":"esbenp.prettier-vscode","[javascript]":{"editor.defaultFormatter":"biomejs.biome"},"[typescript]":{"editor.defaultFormatter":"biomejs.biome"},"[javascriptreact]":{"editor.defaultFormatter":"biomejs.biome"},"[typescriptreact]":{"editor.defaultFormatter":"biomejs.biome"},"[json]":{"editor.defaultFormatter":"biomejs.biome"},"[jsonc]":{"editor.defaultFormatter":"biomejs.biome"},"[css]":{"editor.defaultFormatter":"biomejs.biome"},"[graphql]":{"editor.defaultFormatter":"biomejs.biome"},"typescript.tsdk":"node_modules/typescript/lib","editor.formatOnSave":!0,"editor.formatOnPaste":!0,"emmet.showExpandedAbbreviation":"never","editor.codeActionsOnSave":{"source.fixAll.biome":"explicit","source.organizeImports.biome":"explicit"}};var B="./.vscode/settings.json",D={exists:()=>l(B),create:async()=>{await Dt(".vscode",{recursive:!0}),await Ne(B,JSON.stringify(ie,null,2))},update:async()=>{let e=await Ot(B,"utf-8"),n=Mt(e)||{},i=Tt(n,ie);await Ne(B,JSON.stringify(i,null,2))},extension:()=>Nt("code --install-extension biomejs.biome",{stdio:"inherit",shell:!0})};u();import{mkdir as It,readFile as _t,writeFile as De}from"fs/promises";import Ut from"deepmerge";import{parse as Jt}from"jsonc-parser";var oe={formatter:"language_server",format_on_save:"on",languages:{JavaScript:{formatter:{language_server:{name:"biome"}},code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0}},TypeScript:{formatter:{language_server:{name:"biome"}},code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0}},JSX:{formatter:{language_server:{name:"biome"}},code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0}},TSX:{formatter:{language_server:{name:"biome"}},code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0}}},lsp:{"typescript-language-server":{settings:{typescript:{preferences:{includePackageJsonAutoImports:"on"}}}}}};var W="./.zed/settings.json",H={exists:()=>l(W),create:async()=>{await It(".zed",{recursive:!0}),await De(W,JSON.stringify(oe,null,2))},update:async()=>{let e=await _t(W,"utf-8"),n=Jt(e)||{},i=Ut(n,oe);await De(W,JSON.stringify(i,null,2))}};ae();ce();de();import{readFile as fn,writeFile as pn}from"fs/promises";import un from"deepmerge";import{glob as mn}from"glob";import{parse as gn}from"jsonc-parser";var hn={compilerOptions:{strictNullChecks:!0}},Be=async()=>{try{return await mn("**/tsconfig*.json",{ignore:["**/node_modules/**","**/dist/**","**/build/**","**/.next/**"],absolute:!1})}catch{return[]}},yn=async e=>{try{let t=await fn(e,"utf-8"),i=gn(t)||{},s=un(i,hn);await pn(e,JSON.stringify(s,null,2))}catch(t){console.warn(`Failed to update ${e}:`,t)}},ue={exists:async()=>(await Be()).length>0,update:async()=>{let e=await Be();if(e.length===0){console.warn("No tsconfig.json files found in the project");return}await Promise.all(e.map(t=>yn(t)))}};u();var We=w.devDependencies["@biomejs/biome"],He=w.version,xn=async(e,t=!0)=>{let n=m();n.start("Installing dependencies...");let i=[`ultracite@${He}`,`@biomejs/biome@${We}`];if(t)for(let s of i)await kn(s,{packageManager:e,workspace:await h()});else await k({devDependencies:{"@biomejs/biome":We,ultracite:He}});n.stop("Dependencies installed.")},vn=async()=>{let e=m();if(e.start("Checking for tsconfig.json files..."),await ue.exists()){e.message("Found tsconfig.json files, updating with strictNullChecks..."),await ue.update(),e.stop("tsconfig.json files updated.");return}e.stop("No tsconfig.json files found, skipping.")},Cn=async()=>{let e=m();if(e.start("Checking for .vscode/settings.json..."),await D.exists()){e.message("settings.json found, updating..."),await D.update(),e.stop("settings.json updated.");return}e.message("settings.json not found, creating..."),await D.create(),e.message("settings.json created."),e.message("Installing Biome extension...");try{D.extension(),e.stop("settings.json created.")}catch(t){e.stop(`Failed to install Biome extension (${t}), but continuing...`)}},jn=async()=>{let e=m();if(e.start("Checking for .zed/settings.json..."),await H.exists()){e.message("settings.json found, updating..."),await H.update(),e.stop("settings.json updated.");return}e.message("settings.json not found, creating..."),await H.create(),e.message("settings.json created. Install the Biome extension: https://biomejs.dev/reference/zed/")},Pn=async e=>{let t=m();if(t.start("Checking for Biome configuration..."),await z.exists()){t.message("Biome configuration found, updating..."),await z.update({frameworks:e}),t.stop("Biome configuration updated.");return}t.message("Biome configuration not found, creating..."),await z.create({frameworks:e}),t.stop("Biome configuration created.")},Sn=async(e,t=!0)=>{let n=m();if(n.start("Initializing pre-commit hooks..."),n.message("Installing Husky..."),t?await x.install(e):await k({devDependencies:{husky:"latest"},scripts:{prepare:"husky"}}),n.message("Initializing Husky..."),x.init(e),await x.exists()){n.message("Pre-commit hook found, updating..."),await x.update(e),n.stop("Pre-commit hook updated.");return}n.message("Pre-commit hook not found, creating..."),await x.create(e),n.stop("Pre-commit hook created.")},Rn=async(e,t=!0)=>{let n=m();if(n.start("Initializing lefthook..."),n.message("Installing lefthook..."),t?await R.install(e):await k({devDependencies:{lefthook:"latest"}}),await R.exists()){n.message("lefthook.yml found, updating..."),await R.update(e),n.stop("lefthook.yml updated.");return}n.message("lefthook.yml not found, creating..."),await R.create(e),n.stop("lefthook.yml created.")},An=async(e,t=!0)=>{let n=m();if(n.start("Initializing lint-staged..."),n.message("Installing lint-staged..."),t?await A.install(e):await k({devDependencies:{"lint-staged":"latest"}}),await A.exists()){n.message("lint-staged found, updating..."),await A.update(e),n.stop("lint-staged updated.");return}n.message("lint-staged not found, creating..."),await A.create(e),n.stop("lint-staged created.")},En=async(e,t)=>{let n=m();n.start(`Checking for ${t}...`);let i=Ee(e);if(await i.exists()){n.message(`${t} found, updating...`),await i.update(),n.stop(`${t} updated.`);return}n.message(`${t} not found, creating...`),await i.create(),n.stop(`${t} created.`)},Fn=async e=>{let t=m();t.start("Removing Prettier dependencies and configuration...");try{let n=await te.remove(e);n.packagesRemoved.length>0&&t.message(`Removed Prettier packages: ${n.packagesRemoved.join(", ")}`),n.filesRemoved.length>0&&t.message(`Removed config files: ${n.filesRemoved.join(", ")}`),n.vsCodeCleaned&&t.message("Cleaned VS Code settings"),t.stop("Prettier removed successfully.")}catch{t.stop("Failed to remove Prettier completely, but continuing...")}},$n=async e=>{let t=m();t.start("Removing ESLint dependencies and configuration...");try{let n=await ee.remove(e);n.packagesRemoved.length>0&&t.message(`Removed ESLint packages: ${n.packagesRemoved.join(", ")}`),n.filesRemoved.length>0&&t.message(`Removed config files: ${n.filesRemoved.join(", ")}`),n.vsCodeCleaned&&t.message("Cleaned VS Code settings"),t.stop("ESLint removed successfully.")}catch{t.stop("Failed to remove ESLint completely, but continuing...")}},Ge=async e=>{wn(he);try{let t=e??{},{pm:n}=t;if(!n){let d=await bn(j.cwd());if(!d)throw new Error("No package manager specified or detected");if(d.warnings)for(let p of d.warnings)V.warn(p);V.info(`Detected lockfile, using ${d.name}`),n=d.name}let i=t.migrate?.includes("prettier"),s=t.migrate?.includes("eslint");if(i===void 0||s===void 0){let d=[];if(i===void 0&&await te.hasPrettier()&&d.push({label:"Remove Prettier (dependencies, config files, VS Code settings)",value:"prettier"}),s===void 0&&await ee.hasEsLint()&&d.push({label:"Remove ESLint (dependencies, config files, VS Code settings)",value:"eslint"}),d.length>0){let p=await _({message:"Remove existing formatters/linters (recommended for clean migration)?",options:d,required:!1});I(p)&&(M("Operation cancelled."),j.exit(0)),i===void 0&&(i=p.includes("prettier")),s===void 0&&(s=p.includes("eslint"))}}let o=t.frameworks;if(o===void 0)if(t.pm||t.editors||t.agents||t.integrations!==void 0||t.migrate!==void 0)o=[];else{let p=await _({message:"Which frameworks are you using (optional)?",options:[{label:"React",value:"react"},{label:"Next.js",value:"next"},{label:"Solid",value:"solid"},{label:"Vue",value:"vue"},{label:"Svelte",value:"svelte"},{label:"Qwik",value:"qwik"},{label:"Angular",value:"angular"},{label:"Remix / TanStack Router / React Router",value:"remix"},{label:"Astro",value:"astro"}],required:!1});I(p)&&(M("Operation cancelled."),j.exit(0)),o=p}let r=t.editors;if(!r){let d=await _({message:"Which editors do you want to configure (recommended)?",options:[{label:"VSCode / Cursor / Windsurf",value:"vscode"},{label:"Zed",value:"zed"}],required:!1});I(d)&&(M("Operation cancelled."),j.exit(0)),r=d}let c=t.agents,f={"vscode-copilot":"GitHub Copilot (VSCode)",cursor:"Cursor",windsurf:"Windsurf",zed:"Zed",claude:"Claude Code",codex:"OpenAI Codex / Jules / OpenCode",kiro:"Kiro IDE",cline:"Cline",amp:"AMP",aider:"Aider","firebase-studio":"Firebase Studio","open-hands":"Open Hands","gemini-cli":"Gemini CLI",junie:"Junie",augmentcode:"Augment Code","kilo-code":"Kilo Code",goose:"Codename Goose","roo-code":"Roo Code",warp:"Warp"};if(!c){let d=await _({message:"Which agents do you want to enable (optional)?",options:Object.entries(f).map(([p,qe])=>({value:p,label:qe})),required:!1});I(d)&&(M("Operation cancelled."),j.exit(0)),c=d}let g=t.integrations;if(g===void 0)if(t.pm||t.editors||t.agents||t.migrate!==void 0)g=[];else{let p=await _({message:"Would you like any of the following (optional)?",options:[{label:"Husky pre-commit hook",value:"husky"},{label:"Lefthook pre-commit hook",value:"lefthook"},{label:"Lint-staged",value:"lint-staged"}],required:!1});I(p)&&(M("Operation cancelled."),j.exit(0)),g=p}i&&await Fn(n),s&&await $n(n),await xn(n,!t.skipInstall),await vn(),await Pn(o),r?.includes("vscode")&&await Cn(),r?.includes("zed")&&await jn();for(let d of c??[])await En(d,f[d]);g?.includes("husky")&&await Sn(n,!t.skipInstall),g?.includes("lefthook")&&await Rn(n,!t.skipInstall),g?.includes("lint-staged")&&await An(n,!t.skipInstall),V.success("Successfully initialized Ultracite configuration!")}catch(t){let n=t instanceof Error?t.message:"Unknown error";V.error(`Failed to initialize Ultracite configuration: ${n}`),j.exit(1)}};var P=Nn.meta().create(),On=P.router({init:P.procedure.meta({description:"Initialize Ultracite in the current directory"}).input(a.object({pm:a.enum(b.packageManagers).optional().describe("Package manager to use"),editors:a.array(a.enum(b.editorConfigs)).optional().describe("Editors to configure"),agents:a.array(a.enum(b.agents)).optional().describe("Agents to enable"),frameworks:a.array(a.enum(b.frameworks)).optional().describe("Frameworks being used"),integrations:a.array(a.enum(b.integrations)).optional().describe("Additional integrations to enable"),migrate:a.array(a.enum(b.migrations)).optional().describe("Migration tools to remove (e.g., eslint, prettier). Removes dependencies, config files, and editor settings."),skipInstall:a.boolean().default(!1).describe("Skip installing dependencies")})).mutation(async({input:e})=>{await Ge(e)}),check:P.procedure.meta({description:"Run Biome linter without fixing files"}).input(a.tuple([a.array(a.string()).optional().default([]).describe("specific files to lint"),a.object({"diagnostic-level":a.enum(["info","warn","error"]).optional().describe("level of diagnostics to show. In order, from the lowest to the most important: info, warn, error.")})]).optional()).query(({input:e})=>{Z(e)}),fix:P.procedure.meta({description:"Run Biome linter and fixes files"}).input(a.tuple([a.array(a.string()).optional().default([]).describe("specific files to format"),a.object({unsafe:a.boolean().optional().describe("apply unsafe fixes")})])).mutation(({input:e})=>{let[t,n]=e;ne(t,{unsafe:n.unsafe})}),doctor:P.procedure.meta({description:"Verify your Ultracite setup and check for issues"}).query(async()=>{await Pe()}),lint:P.procedure.meta({description:"\u26A0\uFE0F DEPRECATED: Use 'check' instead - Run Biome linter without fixing files"}).input(a.array(a.string()).optional().default([]).describe("specific files to lint")).query(({input:e})=>{console.warn("\u26A0\uFE0F Warning: 'lint' command is deprecated. Please use 'check' instead."),Z([e,{}])}),format:P.procedure.meta({description:"\u26A0\uFE0F DEPRECATED: Use 'fix' instead - Run Biome linter and fixes files"}).input(a.tuple([a.array(a.string()).optional().default([]).describe("specific files to format"),a.object({unsafe:a.boolean().optional().describe("apply unsafe fixes")})])).mutation(({input:e})=>{let[t,n]=e;console.warn("\u26A0\uFE0F Warning: 'format' command is deprecated. Please use 'fix' instead."),ne(t,{unsafe:n.unsafe})})}),Tn=Dn({router:On,name:w.name,version:w.version,description:w.description});process.env.VITEST||Tn.run();export{On as router};
258
+ ${N}`)}else await S(t.path,n);if(e==="cursor"){let s=await Ae("./.cursor/hooks.json","utf-8"),o=JSON.parse(s);o.hooks.afterFileEdit.some(c=>c.command.includes("ultracite"))||(o.hooks.afterFileEdit.push({command:"npx ultracite fix"}),await S("./.cursor/hooks.json",JSON.stringify(o,null,2)))}}}};u();import{readFile as Et,writeFile as Fe}from"fs/promises";import Ft from"deepmerge";import{parse as $t}from"jsonc-parser";var $e={$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["ultracite/core"]},se=async()=>await l("./biome.json")?"./biome.json":"./biome.jsonc",z={exists:async()=>{let e=await se();return l(e)},create:async e=>{let t=await se(),n=["ultracite/core"];if(e?.frameworks&&e.frameworks.length>0)for(let s of e.frameworks)n.push(`ultracite/${s}`);let i={...$e,extends:n};return Fe(t,JSON.stringify(i,null,2))},update:async e=>{let t=await se(),n=await Et(t,"utf-8"),s=$t(n)||{},r=[...s.extends&&Array.isArray(s.extends)?s.extends:[]];if(r.includes("ultracite/core")||r.push("ultracite/core"),e?.frameworks&&e.frameworks.length>0)for(let g of e.frameworks){let d=`ultracite/${g}`;r.includes(d)||r.push(d)}s.extends=r;let c={$schema:$e.$schema},f=Ft(s,c);await Fe(t,JSON.stringify(f,null,2))}};u();import{spawnSync as Nt}from"child_process";import{mkdir as Dt,readFile as Ot,writeFile as Ne}from"fs/promises";import Tt from"deepmerge";import{parse as Mt}from"jsonc-parser";var ie={"editor.defaultFormatter":"esbenp.prettier-vscode","[javascript]":{"editor.defaultFormatter":"biomejs.biome"},"[typescript]":{"editor.defaultFormatter":"biomejs.biome"},"[javascriptreact]":{"editor.defaultFormatter":"biomejs.biome"},"[typescriptreact]":{"editor.defaultFormatter":"biomejs.biome"},"[json]":{"editor.defaultFormatter":"biomejs.biome"},"[jsonc]":{"editor.defaultFormatter":"biomejs.biome"},"[css]":{"editor.defaultFormatter":"biomejs.biome"},"[graphql]":{"editor.defaultFormatter":"biomejs.biome"},"typescript.tsdk":"node_modules/typescript/lib","editor.formatOnSave":!0,"editor.formatOnPaste":!0,"emmet.showExpandedAbbreviation":"never","editor.codeActionsOnSave":{"source.fixAll.biome":"explicit","source.organizeImports.biome":"explicit"}};var B="./.vscode/settings.json",D={exists:()=>l(B),create:async()=>{await Dt(".vscode",{recursive:!0}),await Ne(B,JSON.stringify(ie,null,2))},update:async()=>{let e=await Ot(B,"utf-8"),n=Mt(e)||{},i=Tt(n,ie);await Ne(B,JSON.stringify(i,null,2))},extension:()=>Nt("code --install-extension biomejs.biome",{stdio:"inherit",shell:!0})};u();import{mkdir as It,readFile as _t,writeFile as De}from"fs/promises";import Ut from"deepmerge";import{parse as Jt}from"jsonc-parser";var oe={formatter:"language_server",format_on_save:"on",languages:{JavaScript:{formatter:{language_server:{name:"biome"}},code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0}},TypeScript:{formatter:{language_server:{name:"biome"}},code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0}},JSX:{formatter:{language_server:{name:"biome"}},code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0}},TSX:{formatter:{language_server:{name:"biome"}},code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0}}},lsp:{"typescript-language-server":{settings:{typescript:{preferences:{includePackageJsonAutoImports:"on"}}}}}};var W="./.zed/settings.json",H={exists:()=>l(W),create:async()=>{await It(".zed",{recursive:!0}),await De(W,JSON.stringify(oe,null,2))},update:async()=>{let e=await _t(W,"utf-8"),n=Jt(e)||{},i=Ut(n,oe);await De(W,JSON.stringify(i,null,2))}};ae();ce();de();import{readFile as fn,writeFile as pn}from"fs/promises";import un from"deepmerge";import{glob as mn}from"glob";import{parse as gn}from"jsonc-parser";var hn={compilerOptions:{strictNullChecks:!0}},Be=async()=>{try{return await mn("**/tsconfig*.json",{ignore:["**/node_modules/**","**/dist/**","**/build/**","**/.next/**"],absolute:!1})}catch{return[]}},yn=async e=>{try{let t=await fn(e,"utf-8"),i=gn(t)||{},s=un(i,hn);await pn(e,JSON.stringify(s,null,2))}catch(t){console.warn(`Failed to update ${e}:`,t)}},ue={exists:async()=>(await Be()).length>0,update:async()=>{let e=await Be();if(e.length===0){console.warn("No tsconfig.json files found in the project");return}await Promise.all(e.map(t=>yn(t)))}};u();var We=w.devDependencies["@biomejs/biome"],He=w.version,xn=async(e,t=!0)=>{let n=m();n.start("Installing dependencies...");let i=[`ultracite@${He}`,`@biomejs/biome@${We}`];if(t)for(let s of i)await kn(s,{packageManager:e,workspace:await h()});else await k({devDependencies:{"@biomejs/biome":We,ultracite:He}});n.stop("Dependencies installed.")},vn=async()=>{let e=m();if(e.start("Checking for tsconfig.json files..."),await ue.exists()){e.message("Found tsconfig.json files, updating with strictNullChecks..."),await ue.update(),e.stop("tsconfig.json files updated.");return}e.stop("No tsconfig.json files found, skipping.")},Cn=async()=>{let e=m();if(e.start("Checking for .vscode/settings.json..."),await D.exists()){e.message("settings.json found, updating..."),await D.update(),e.stop("settings.json updated.");return}e.message("settings.json not found, creating..."),await D.create(),e.message("settings.json created."),e.message("Installing Biome extension...");try{D.extension(),e.stop("settings.json created.")}catch(t){e.stop(`Failed to install Biome extension (${t}), but continuing...`)}},jn=async()=>{let e=m();if(e.start("Checking for .zed/settings.json..."),await H.exists()){e.message("settings.json found, updating..."),await H.update(),e.stop("settings.json updated.");return}e.message("settings.json not found, creating..."),await H.create(),e.message("settings.json created. Install the Biome extension: https://biomejs.dev/reference/zed/")},Pn=async e=>{let t=m();if(t.start("Checking for Biome configuration..."),await z.exists()){t.message("Biome configuration found, updating..."),await z.update({frameworks:e}),t.stop("Biome configuration updated.");return}t.message("Biome configuration not found, creating..."),await z.create({frameworks:e}),t.stop("Biome configuration created.")},Sn=async(e,t=!0)=>{let n=m();if(n.start("Initializing pre-commit hooks..."),n.message("Installing Husky..."),t?await x.install(e):await k({devDependencies:{husky:"latest"},scripts:{prepare:"husky"}}),n.message("Initializing Husky..."),x.init(e),await x.exists()){n.message("Pre-commit hook found, updating..."),await x.update(e),n.stop("Pre-commit hook updated.");return}n.message("Pre-commit hook not found, creating..."),await x.create(e),n.stop("Pre-commit hook created.")},Rn=async(e,t=!0)=>{let n=m();if(n.start("Initializing lefthook..."),n.message("Installing lefthook..."),t?await R.install(e):await k({devDependencies:{lefthook:"latest"}}),await R.exists()){n.message("lefthook.yml found, updating..."),await R.update(e),n.stop("lefthook.yml updated.");return}n.message("lefthook.yml not found, creating..."),await R.create(e),n.stop("lefthook.yml created.")},An=async(e,t=!0)=>{let n=m();if(n.start("Initializing lint-staged..."),n.message("Installing lint-staged..."),t?await A.install(e):await k({devDependencies:{"lint-staged":"latest"}}),await A.exists()){n.message("lint-staged found, updating..."),await A.update(e),n.stop("lint-staged updated.");return}n.message("lint-staged not found, creating..."),await A.create(e),n.stop("lint-staged created.")},En=async(e,t)=>{let n=m();n.start(`Checking for ${t}...`);let i=Ee(e);if(await i.exists()){n.message(`${t} found, updating...`),await i.update(),n.stop(`${t} updated.`);return}n.message(`${t} not found, creating...`),await i.create(),n.stop(`${t} created.`)},Fn=async e=>{let t=m();t.start("Removing Prettier dependencies and configuration...");try{let n=await te.remove(e);n.packagesRemoved.length>0&&t.message(`Removed Prettier packages: ${n.packagesRemoved.join(", ")}`),n.filesRemoved.length>0&&t.message(`Removed config files: ${n.filesRemoved.join(", ")}`),n.vsCodeCleaned&&t.message("Cleaned VS Code settings"),t.stop("Prettier removed successfully.")}catch{t.stop("Failed to remove Prettier completely, but continuing...")}},$n=async e=>{let t=m();t.start("Removing ESLint dependencies and configuration...");try{let n=await ee.remove(e);n.packagesRemoved.length>0&&t.message(`Removed ESLint packages: ${n.packagesRemoved.join(", ")}`),n.filesRemoved.length>0&&t.message(`Removed config files: ${n.filesRemoved.join(", ")}`),n.vsCodeCleaned&&t.message("Cleaned VS Code settings"),t.stop("ESLint removed successfully.")}catch{t.stop("Failed to remove ESLint completely, but continuing...")}},Ge=async e=>{wn(he);try{let t=e??{},{pm:n}=t;if(!n){let d=await bn(j.cwd());if(!d)throw new Error("No package manager specified or detected");if(d.warnings)for(let p of d.warnings)V.warn(p);V.info(`Detected lockfile, using ${d.name}`),n=d.name}let i=t.migrate?.includes("prettier"),s=t.migrate?.includes("eslint");if(i===void 0||s===void 0){let d=[];if(i===void 0&&await te.hasPrettier()&&d.push({label:"Remove Prettier (dependencies, config files, VS Code settings)",value:"prettier"}),s===void 0&&await ee.hasEsLint()&&d.push({label:"Remove ESLint (dependencies, config files, VS Code settings)",value:"eslint"}),d.length>0){let p=await _({message:"Remove existing formatters/linters (recommended for clean migration)?",options:d,required:!1});I(p)&&(M("Operation cancelled."),j.exit(0)),i===void 0&&(i=p.includes("prettier")),s===void 0&&(s=p.includes("eslint"))}}let o=t.frameworks;if(o===void 0)if(t.pm||t.editors||t.agents||t.integrations!==void 0||t.migrate!==void 0)o=[];else{let p=await _({message:"Which frameworks are you using (optional)?",options:[{label:"React",value:"react"},{label:"Next.js",value:"next"},{label:"Solid",value:"solid"},{label:"Vue",value:"vue"},{label:"Svelte",value:"svelte"},{label:"Qwik",value:"qwik"},{label:"Angular",value:"angular"},{label:"Remix / TanStack Router / React Router",value:"remix"},{label:"Astro",value:"astro"}],required:!1});I(p)&&(M("Operation cancelled."),j.exit(0)),o=p}let r=t.editors;if(!r){let d=await _({message:"Which editors do you want to configure (recommended)?",options:[{label:"VSCode / Cursor / Windsurf",value:"vscode"},{label:"Zed",value:"zed"}],required:!1});I(d)&&(M("Operation cancelled."),j.exit(0)),r=d}let c=t.agents,f={"vscode-copilot":"GitHub Copilot (VSCode)",cursor:"Cursor",windsurf:"Windsurf",zed:"Zed",claude:"Claude Code",codex:"OpenAI Codex / Jules / OpenCode",kiro:"Kiro IDE",cline:"Cline",amp:"AMP",aider:"Aider","firebase-studio":"Firebase Studio","open-hands":"Open Hands","gemini-cli":"Gemini CLI",junie:"Junie",augmentcode:"Augment Code","kilo-code":"Kilo Code",goose:"Codename Goose","roo-code":"Roo Code",warp:"Warp"};if(!c){let d=await _({message:"Which agents do you want to enable (optional)?",options:Object.entries(f).map(([p,qe])=>({value:p,label:qe})),required:!1});I(d)&&(M("Operation cancelled."),j.exit(0)),c=d}let g=t.integrations;if(g===void 0)if(t.pm||t.editors||t.agents||t.migrate!==void 0)g=[];else{let p=await _({message:"Would you like any of the following (optional)?",options:[{label:"Husky pre-commit hook",value:"husky"},{label:"Lefthook pre-commit hook",value:"lefthook"},{label:"Lint-staged",value:"lint-staged"}],required:!1});I(p)&&(M("Operation cancelled."),j.exit(0)),g=p}i&&await Fn(n),s&&await $n(n),await xn(n,!t.skipInstall),await vn(),await Pn(o),r?.includes("vscode")&&await Cn(),r?.includes("zed")&&await jn();for(let d of c??[])await En(d,f[d]);g?.includes("husky")&&await Sn(n,!t.skipInstall),g?.includes("lefthook")&&await Rn(n,!t.skipInstall),g?.includes("lint-staged")&&await An(n,!t.skipInstall),V.success("Successfully initialized Ultracite configuration!")}catch(t){let n=t instanceof Error?t.message:"Unknown error";V.error(`Failed to initialize Ultracite configuration: ${n}`),j.exit(1)}};var P=Nn.meta().create(),On=P.router({init:P.procedure.meta({description:"Initialize Ultracite in the current directory"}).input(a.object({pm:a.enum(b.packageManagers).optional().describe("Package manager to use"),editors:a.array(a.enum(b.editorConfigs)).optional().describe("Editors to configure"),agents:a.array(a.enum(b.agents)).optional().describe("Agents to enable"),frameworks:a.array(a.enum(b.frameworks)).optional().describe("Frameworks being used"),integrations:a.array(a.enum(b.integrations)).optional().describe("Additional integrations to enable"),migrate:a.array(a.enum(b.migrations)).optional().describe("Migration tools to remove (e.g., eslint, prettier). Removes dependencies, config files, and editor settings."),skipInstall:a.boolean().default(!1).describe("Skip installing dependencies")})).mutation(async({input:e})=>{await Ge(e)}),check:P.procedure.meta({description:"Run Biome linter without fixing files"}).input(a.tuple([a.array(a.string()).optional().default([]).describe("specific files to lint"),a.object({"diagnostic-level":a.enum(["info","warn","error"]).optional().describe("level of diagnostics to show. In order, from the lowest to the most important: info, warn, error.")})]).optional()).query(({input:e})=>{Z(e)}),fix:P.procedure.meta({description:"Run Biome linter and fixes files"}).input(a.tuple([a.array(a.string()).optional().default([]).describe("specific files to format"),a.object({unsafe:a.boolean().optional().describe("apply unsafe fixes")})])).mutation(({input:e})=>{let[t,n]=e;ne(t,{unsafe:n.unsafe})}),doctor:P.procedure.meta({description:"Verify your Ultracite setup and check for issues"}).query(async()=>{await Pe()}),lint:P.procedure.meta({description:"\u26A0\uFE0F DEPRECATED: Use 'check' instead - Run Biome linter without fixing files"}).input(a.array(a.string()).optional().default([]).describe("specific files to lint")).query(({input:e})=>{console.warn("\u26A0\uFE0F Warning: 'lint' command is deprecated. Please use 'check' instead."),Z([e,{}])}),format:P.procedure.meta({description:"\u26A0\uFE0F DEPRECATED: Use 'fix' instead - Run Biome linter and fixes files"}).input(a.tuple([a.array(a.string()).optional().default([]).describe("specific files to format"),a.object({unsafe:a.boolean().optional().describe("apply unsafe fixes")})])).mutation(({input:e})=>{let[t,n]=e;console.warn("\u26A0\uFE0F Warning: 'format' command is deprecated. Please use 'fix' instead."),ne(t,{unsafe:n.unsafe})})}),Tn=Dn({router:On,name:w.name,version:w.version,description:w.description});process.env.TEST||Tn.run();export{On as router};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ultracite",
3
3
  "description": "The AI-ready formatter that helps you write and generate code faster.",
4
- "version": "6.2.0",
4
+ "version": "6.2.1",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "ultracite": "dist/index.js"
@@ -41,7 +41,7 @@
41
41
  "url": "git+https://github.com/haydenbleasel/ultracite.git"
42
42
  },
43
43
  "devDependencies": {
44
- "@biomejs/biome": "2.3.2",
44
+ "@biomejs/biome": "2.3.3",
45
45
  "@types/node": "^24.10.0",
46
46
  "tsup": "^8.5.0",
47
47
  "turbo": "^2.6.0"