ultracite 5.6.2 → 5.6.4

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/biome.jsonc CHANGED
@@ -426,17 +426,25 @@
426
426
  "style": "type"
427
427
  }
428
428
  },
429
+ // Require the @deprecated directive to specify a deletion date.
430
+ "useDeprecatedDate": "error",
429
431
  // Require switch-case statements to be exhaustive.
430
432
  "useExhaustiveSwitchCases": "error",
431
433
  // Enforces that <img> elements have both width and height attributes.
432
434
  "useImageSize": "error",
433
435
  // Enforce a maximum number of parameters in function definitions.
434
436
  "useMaxParams": "error",
435
- // Prefer using the class prop as a classlist over the classnames helper.
436
- "useQwikClasslist": "error",
437
437
  // Enforce that components are defined as functions and never as classes.
438
438
  "useReactFunctionComponents": "error",
439
439
 
440
+ /* Temporarily disabled until we have framework rules */
441
+ // Prefer using the class prop as a classlist over the classnames helper.
442
+ "useQwikClasslist": "off",
443
+ // Disallow unserializable expressions in Qwik dollar ($) scopes.
444
+ "useQwikValidLexicalScope": "off",
445
+ // Disallow use* hooks outside of component$ or other use* hooks in Qwik applications.
446
+ "useQwikMethodUsage": "off",
447
+
440
448
  // Disallow string literals inside JSX elements.
441
449
  "noJsxLiterals": "off",
442
450
  // Disallow unused catch bindings.
package/dist/index.js CHANGED
@@ -117,7 +117,7 @@ ${n}`)}}});var os,le=C(()=>{os=me({"./husky.ts":()=>(re(),Q(Be)),"./lefthook.ts"
117
117
  `}else t+=`${s}: '${n}'
118
118
  `;return t},us=async()=>{try{let e=pe(await B("./package.json","utf-8"));return e?e.type==="module":!1}catch{return!1}},ps=async e=>{let t=pe(await B("./package.json","utf-8"));t&&(t["lint-staged"]?t["lint-staged"]=F(t["lint-staged"],h(e)):t["lint-staged"]=h(e),await b("./package.json",JSON.stringify(t,null,2)))},ms=async(e,t)=>{let s=await B(e,"utf-8"),n=pe(s);if(!n)return;let o=F(n,h(t));await b(e,JSON.stringify(o,null,2))},fs=async(e,t)=>{let s=await B(e,"utf-8"),n=ls(s);if(!n)return;let o=F(n,h(t));await b(e,ds(o))},gs=async(e,t)=>{let o=(await import(is(e).href)).default||{},i=F(o,h(t)),r=`export default ${JSON.stringify(i,null,2)};
119
119
  `;await b(e,r)},hs=async(e,t)=>{delete K.cache[K.resolve(`./${e}`)];let s=os(`./${e}`),n=F(s,h(t)),o=`module.exports = ${JSON.stringify(n,null,2)};
120
- `;await b(e,o)},ue=async e=>{await b(".lintstagedrc.json",JSON.stringify(h(e),null,2))},ys=async(e,t)=>{if(e==="./package.json"){await ps(t);return}if(e.endsWith(".json")||e==="./.lintstagedrc"){await ms(e,t);return}if(e.endsWith(".yaml")||e.endsWith(".yml")){await fs(e,t);return}let s=await us();if(e.endsWith(".mjs")||e.endsWith(".js")&&s){try{await gs(e,t)}catch{await ue(t)}return}if(e.endsWith(".cjs")||e.endsWith(".js")&&!s)try{await hs(e,t)}catch{await ue(t)}},D={exists:async()=>{for(let e of Xe)if(await a(e))return!0;return!1},install:async e=>{await as("lint-staged",{packageManager:e,workspace:await g()})},create:async e=>{await b(".lintstagedrc.json",JSON.stringify(h(e),null,2))},update:async e=>{let t=null;for(let s of Xe)if(await a(s)){t=s;break}if(!t){await ue(e);return}await ys(t,e)}}});import{initTRPC as Is}from"@trpc/server";import{createCli as Us}from"trpc-cli";import c from"zod";var y={name:"ultracite",description:"The AI-ready formatter that helps you write and generate code faster.",version:"5.6.2",type:"module",bin:{ultracite:"dist/index.js"},files:["biome.jsonc","dist","README.md"],scripts:{build:"tsup",test:"vitest run","test:coverage":"vitest run --coverage"},main:"./biome.jsonc",author:"Hayden Bleasel <hello@haydenbleasel.com>",bugs:{url:"https://github.com/haydenbleasel/ultracite/issues"},homepage:"https://github.com/haydenbleasel/ultracite#readme",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.2.5","@types/node":"^24.7.0","@vitest/coverage-v8":"3.2.4",tsup:"^8.5.0",turbo:"^2.5.8",vitest:"^3.2.4"},dependencies:{"@clack/prompts":"^0.11.0","@trpc/server":"^11.6.0",deepmerge:"^4.3.1","jsonc-parser":"^3.3.1",nypm:"^0.6.2","trpc-cli":"^0.11.0",zod:"^4.1.12"},packageManager:"pnpm@10.18.1"};p();import{spawnSync as pt}from"child_process";import he from"process";var ee=e=>{let t=["npx","@biomejs/biome","check","--no-errors-on-unmatched"];e.length>0?t.push(...N(e)):t.push("./");let s=t.join(" "),n=pt(s,{stdio:"inherit",shell:!0});n.error&&(console.error("Failed to run Ultracite:",n.error.message),he.exit(1)),n.status!==0&&he.exit(n.status??1)};import{spawnSync as Pt}from"child_process";import{existsSync as P}from"fs";import{readFile as De}from"fs/promises";import{join as R}from"path";import{parse as Rt}from"jsonc-parser";p();import{readFile as ye,unlink as mt,writeFile as ft}from"fs/promises";import{parse as we}from"jsonc-parser";import{removeDependency as gt}from"nypm";var I=[".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 ye("package.json","utf-8"),t=we(e);if(!t||typeof t!="object")return[];let s=t.dependencies||{},n=t.devDependencies||{},o={...s,...n};return Object.keys(o).filter(i=>i.includes("eslint"))}catch{return[]}},ht=async(e,t)=>{if(t.length!==0)try{for(let s of t)await gt(s,{packageManager:e})}catch(s){console.warn(s)}},yt=async()=>{let e=[];for(let t of I)if(await a(t))try{await mt(t),e.push(t)}catch(s){console.warn(s)}return e},wt=async()=>{let e="./.vscode/settings.json";if(!await a(e))return!1;try{let t=await ye(e,"utf-8"),s=we(t);if(!s||typeof s!="object")return!1;let n=!1,o={...s},i=["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 i)r in o&&(delete o[r],n=!0);if("editor.codeActionsOnSave"in o){let r=o["editor.codeActionsOnSave"];if(r&&typeof r=="object"){let l=["source.fixAll.eslint","source.organizeImports.eslint"];for(let u of l)u in r&&(delete r[u],n=!0);Object.keys(r).length===0&&(o["editor.codeActionsOnSave"]=void 0)}}return n?(await ft(e,JSON.stringify(o,null,2)),!0):!1}catch(t){return console.warn(t),!1}},bt=async()=>{if((await be()).length>0)return!0;for(let t of I)if(await a(t))return!0;return!1},te={hasEsLint:bt,remove:async e=>{let t=await be();await ht(e,t);let s=await yt(),n=await wt();return{packagesRemoved:t,filesRemoved:s,vsCodeCleaned:n}}};p();import{readFile as ke,unlink as kt,writeFile as vt}from"fs/promises";import{parse as ve}from"jsonc-parser";import{removeDependency as xt}from"nypm";var U=[".prettierrc",".prettierrc.js",".prettierrc.json",".prettierrc.yml",".prettierrc.yaml",".prettierrc.config.js","prettier.config.js","prettier.config.mjs",".prettierignore"],xe=async()=>{try{let e=await ke("package.json","utf-8"),t=ve(e);if(!t||typeof t!="object")return[];let s=t.dependencies||{},n=t.devDependencies||{},o={...s,...n};return Object.keys(o).filter(i=>i.includes("prettier"))}catch{return[]}},Dt=async(e,t)=>{if(t.length!==0)try{for(let s of t)await xt(s,{packageManager:e})}catch(s){console.warn(s)}},jt=async()=>{let e=[];for(let t of U)if(await a(t))try{await kt(t),e.push(t)}catch(s){console.warn(s)}return e},Ct=async()=>{let e="./.vscode/settings.json";if(!await a(e))return!1;try{let t=await ke(e,"utf-8"),s=ve(t);if(!s||typeof s!="object")return!1;let n=!1,o={...s},i=["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 l of i)l in o&&(l==="editor.defaultFormatter"&&o[l]==="esbenp.prettier-vscode"||l!=="editor.defaultFormatter")&&(delete o[l],n=!0);let r=Object.keys(o).filter(l=>l.startsWith("[")&&l.includes("javascript"));for(let l of r){let u=o[l];u&&typeof u=="object"&&"editor.defaultFormatter"in u&&u["editor.defaultFormatter"]==="esbenp.prettier-vscode"&&(u["editor.defaultFormatter"]=void 0,n=!0,Object.keys(u).length===0&&delete o[l])}return n?(await vt(e,JSON.stringify(o,null,2)),!0):!1}catch(t){return console.warn(t),!1}},St=async()=>{if((await xe()).length>0)return!0;for(let t of U)if(await a(t))return!0;return!1},se={hasPrettier:St,remove:async e=>{let t=await xe();await Dt(e,t);let s=await jt(),n=await Ct();return{packagesRemoved:t,filesRemoved:s,vsCodeCleaned:n}}};var At=()=>{let e=Pt("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"}},Mt=async()=>{let e=R(process.cwd(),"biome.json"),t=R(process.cwd(),"biome.jsonc"),s=null;if(P(e)?s=e:P(t)&&(s=t),!s)return{name:"Biome configuration",status:"fail",message:"No biome.json or biome.jsonc file found"};try{let n=await De(s,"utf-8"),o=Rt(n);return Array.isArray(o?.extends)&&o.extends.includes("ultracite")?{name:"Biome configuration",status:"pass",message:"biome.json(c) extends ultracite"}:{name:"Biome configuration",status:"warn",message:"biome.json(c) exists but doesn't extend ultracite"}}catch{return{name:"Biome configuration",status:"fail",message:"Could not parse biome.json(c) file"}}},Et=async()=>{let e=R(process.cwd(),"package.json");if(!P(e))return{name:"Ultracite dependency",status:"warn",message:"No package.json found"};try{let t=JSON.parse(await De(e,"utf-8")),s=t.dependencies?.ultracite||t.devDependencies?.ultracite||t.peerDependencies?.ultracite;return s?{name:"Ultracite dependency",status:"pass",message:`Ultracite is in package.json (${s})`}:{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"}}},$t=()=>{let e=U.some(s=>P(R(process.cwd(),s))),t=I.some(s=>P(R(process.cwd(),s)));if(e||t){let s=[];return e&&s.push("Prettier"),t&&s.push("ESLint"),{name:"Conflicting tools",status:"warn",message:`Found potentially conflicting tools: ${s.join(", ")}`}}return{name:"Conflicting tools",status:"pass",message:"No conflicting formatting/linting tools found"}},je=async()=>{let e=[];console.log(`\u{1FA7A} Running Ultracite doctor...
120
+ `;await b(e,o)},ue=async e=>{await b(".lintstagedrc.json",JSON.stringify(h(e),null,2))},ys=async(e,t)=>{if(e==="./package.json"){await ps(t);return}if(e.endsWith(".json")||e==="./.lintstagedrc"){await ms(e,t);return}if(e.endsWith(".yaml")||e.endsWith(".yml")){await fs(e,t);return}let s=await us();if(e.endsWith(".mjs")||e.endsWith(".js")&&s){try{await gs(e,t)}catch{await ue(t)}return}if(e.endsWith(".cjs")||e.endsWith(".js")&&!s)try{await hs(e,t)}catch{await ue(t)}},D={exists:async()=>{for(let e of Xe)if(await a(e))return!0;return!1},install:async e=>{await as("lint-staged",{packageManager:e,workspace:await g()})},create:async e=>{await b(".lintstagedrc.json",JSON.stringify(h(e),null,2))},update:async e=>{let t=null;for(let s of Xe)if(await a(s)){t=s;break}if(!t){await ue(e);return}await ys(t,e)}}});import{initTRPC as Is}from"@trpc/server";import{createCli as Us}from"trpc-cli";import c from"zod";var y={name:"ultracite",description:"The AI-ready formatter that helps you write and generate code faster.",version:"5.6.4",type:"module",bin:{ultracite:"dist/index.js"},files:["biome.jsonc","dist","README.md"],scripts:{build:"tsup",test:"vitest run","test:coverage":"vitest run --coverage"},main:"./biome.jsonc",author:"Hayden Bleasel <hello@haydenbleasel.com>",bugs:{url:"https://github.com/haydenbleasel/ultracite/issues"},homepage:"https://github.com/haydenbleasel/ultracite#readme",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.2.6","@types/node":"^24.7.0","@vitest/coverage-v8":"3.2.4",tsup:"^8.5.0",turbo:"^2.5.8",vitest:"^3.2.4"},dependencies:{"@clack/prompts":"^0.11.0","@trpc/server":"^11.6.0",deepmerge:"^4.3.1","jsonc-parser":"^3.3.1",nypm:"^0.6.2","trpc-cli":"^0.11.0",zod:"^4.1.12"},packageManager:"pnpm@10.18.1"};p();import{spawnSync as pt}from"child_process";import he from"process";var ee=e=>{let t=["npx","@biomejs/biome","check","--no-errors-on-unmatched"];e.length>0?t.push(...N(e)):t.push("./");let s=t.join(" "),n=pt(s,{stdio:"inherit",shell:!0});n.error&&(console.error("Failed to run Ultracite:",n.error.message),he.exit(1)),n.status!==0&&he.exit(n.status??1)};import{spawnSync as Pt}from"child_process";import{existsSync as P}from"fs";import{readFile as De}from"fs/promises";import{join as R}from"path";import{parse as Rt}from"jsonc-parser";p();import{readFile as ye,unlink as mt,writeFile as ft}from"fs/promises";import{parse as we}from"jsonc-parser";import{removeDependency as gt}from"nypm";var I=[".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 ye("package.json","utf-8"),t=we(e);if(!t||typeof t!="object")return[];let s=t.dependencies||{},n=t.devDependencies||{},o={...s,...n};return Object.keys(o).filter(i=>i.includes("eslint"))}catch{return[]}},ht=async(e,t)=>{if(t.length!==0)try{for(let s of t)await gt(s,{packageManager:e})}catch(s){console.warn(s)}},yt=async()=>{let e=[];for(let t of I)if(await a(t))try{await mt(t),e.push(t)}catch(s){console.warn(s)}return e},wt=async()=>{let e="./.vscode/settings.json";if(!await a(e))return!1;try{let t=await ye(e,"utf-8"),s=we(t);if(!s||typeof s!="object")return!1;let n=!1,o={...s},i=["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 i)r in o&&(delete o[r],n=!0);if("editor.codeActionsOnSave"in o){let r=o["editor.codeActionsOnSave"];if(r&&typeof r=="object"){let l=["source.fixAll.eslint","source.organizeImports.eslint"];for(let u of l)u in r&&(delete r[u],n=!0);Object.keys(r).length===0&&(o["editor.codeActionsOnSave"]=void 0)}}return n?(await ft(e,JSON.stringify(o,null,2)),!0):!1}catch(t){return console.warn(t),!1}},bt=async()=>{if((await be()).length>0)return!0;for(let t of I)if(await a(t))return!0;return!1},te={hasEsLint:bt,remove:async e=>{let t=await be();await ht(e,t);let s=await yt(),n=await wt();return{packagesRemoved:t,filesRemoved:s,vsCodeCleaned:n}}};p();import{readFile as ke,unlink as kt,writeFile as vt}from"fs/promises";import{parse as ve}from"jsonc-parser";import{removeDependency as xt}from"nypm";var U=[".prettierrc",".prettierrc.js",".prettierrc.json",".prettierrc.yml",".prettierrc.yaml",".prettierrc.config.js","prettier.config.js","prettier.config.mjs",".prettierignore"],xe=async()=>{try{let e=await ke("package.json","utf-8"),t=ve(e);if(!t||typeof t!="object")return[];let s=t.dependencies||{},n=t.devDependencies||{},o={...s,...n};return Object.keys(o).filter(i=>i.includes("prettier"))}catch{return[]}},Dt=async(e,t)=>{if(t.length!==0)try{for(let s of t)await xt(s,{packageManager:e})}catch(s){console.warn(s)}},jt=async()=>{let e=[];for(let t of U)if(await a(t))try{await kt(t),e.push(t)}catch(s){console.warn(s)}return e},Ct=async()=>{let e="./.vscode/settings.json";if(!await a(e))return!1;try{let t=await ke(e,"utf-8"),s=ve(t);if(!s||typeof s!="object")return!1;let n=!1,o={...s},i=["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 l of i)l in o&&(l==="editor.defaultFormatter"&&o[l]==="esbenp.prettier-vscode"||l!=="editor.defaultFormatter")&&(delete o[l],n=!0);let r=Object.keys(o).filter(l=>l.startsWith("[")&&l.includes("javascript"));for(let l of r){let u=o[l];u&&typeof u=="object"&&"editor.defaultFormatter"in u&&u["editor.defaultFormatter"]==="esbenp.prettier-vscode"&&(u["editor.defaultFormatter"]=void 0,n=!0,Object.keys(u).length===0&&delete o[l])}return n?(await vt(e,JSON.stringify(o,null,2)),!0):!1}catch(t){return console.warn(t),!1}},St=async()=>{if((await xe()).length>0)return!0;for(let t of U)if(await a(t))return!0;return!1},se={hasPrettier:St,remove:async e=>{let t=await xe();await Dt(e,t);let s=await jt(),n=await Ct();return{packagesRemoved:t,filesRemoved:s,vsCodeCleaned:n}}};var At=()=>{let e=Pt("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"}},Mt=async()=>{let e=R(process.cwd(),"biome.json"),t=R(process.cwd(),"biome.jsonc"),s=null;if(P(e)?s=e:P(t)&&(s=t),!s)return{name:"Biome configuration",status:"fail",message:"No biome.json or biome.jsonc file found"};try{let n=await De(s,"utf-8"),o=Rt(n);return Array.isArray(o?.extends)&&o.extends.includes("ultracite")?{name:"Biome configuration",status:"pass",message:"biome.json(c) extends ultracite"}:{name:"Biome configuration",status:"warn",message:"biome.json(c) exists but doesn't extend ultracite"}}catch{return{name:"Biome configuration",status:"fail",message:"Could not parse biome.json(c) file"}}},Et=async()=>{let e=R(process.cwd(),"package.json");if(!P(e))return{name:"Ultracite dependency",status:"warn",message:"No package.json found"};try{let t=JSON.parse(await De(e,"utf-8")),s=t.dependencies?.ultracite||t.devDependencies?.ultracite||t.peerDependencies?.ultracite;return s?{name:"Ultracite dependency",status:"pass",message:`Ultracite is in package.json (${s})`}:{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"}}},$t=()=>{let e=U.some(s=>P(R(process.cwd(),s))),t=I.some(s=>P(R(process.cwd(),s)));if(e||t){let s=[];return e&&s.push("Prettier"),t&&s.push("ESLint"),{name:"Conflicting tools",status:"warn",message:`Found potentially conflicting tools: ${s.join(", ")}`}}return{name:"Conflicting tools",status:"pass",message:"No conflicting formatting/linting tools found"}},je=async()=>{let e=[];console.log(`\u{1FA7A} Running Ultracite doctor...
121
121
  `),e.push(At()),e.push(await Mt()),e.push(await Et()),e.push($t());let t=e.filter(o=>o.status==="pass").length,s=e.filter(o=>o.status==="fail").length,n=e.filter(o=>o.status==="warn").length;for(let o of e){let i;o.status==="pass"?i="\u2705":o.status==="fail"?i="\u274C":i="\u26A0\uFE0F",console.log(`${i} ${o.name}: ${o.message}`)}console.log(`
122
122
  \u{1F4CA} Summary:`),console.log(` ${t} passed, ${n} warnings, ${s} failed`),s>0&&(console.log(`
123
123
  \u{1F4A1} To fix issues, run: npx ultracite init`),process.exit(1)),n>0?console.log(`
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": "5.6.2",
4
+ "version": "5.6.4",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "ultracite": "dist/index.js"
@@ -34,7 +34,7 @@
34
34
  "url": "git+https://github.com/haydenbleasel/ultracite.git"
35
35
  },
36
36
  "devDependencies": {
37
- "@biomejs/biome": "2.2.5",
37
+ "@biomejs/biome": "2.2.6",
38
38
  "@types/node": "^24.7.0",
39
39
  "@vitest/coverage-v8": "3.2.4",
40
40
  "tsup": "^8.5.0",