ultracite 5.3.11 → 5.4.0

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
@@ -383,6 +383,8 @@
383
383
  "noUnmatchableAnbSelector": "error"
384
384
  },
385
385
  "nursery": {
386
+ // Prevent the listing of duplicate dependencies.
387
+ "noDuplicateDependencies": "error",
386
388
  // Disallow Promises to be used in places where they are almost certainly a mistake.
387
389
  "noMisusedPromises": "error",
388
390
  // Prevent client components from being async functions.
@@ -393,8 +395,6 @@
393
395
  "noQwikUseVisibleTask": "error",
394
396
  // Disallow variable declarations from shadowing variables declared in the outer scope.
395
397
  "noShadow": "error",
396
- // Disallow unnecessary type-based conditions that can be statically determined as redundant.
397
- "noUnnecessaryConditions": "error",
398
398
  // Disallow the use of useless undefined.
399
399
  "noUselessUndefined": "error",
400
400
  // Enforce that Vue component data options are declared as functions.
@@ -405,6 +405,8 @@
405
405
  "noVueReservedProps": "error",
406
406
  // Enforces href attribute for <a> elements.
407
407
  "useAnchorHref": "error",
408
+ // Enforce consistent arrow function bodies.
409
+ "useConsistentArrowReturn": "error",
408
410
  //Enforce type definitions to consistently use either interface or type.
409
411
  "useConsistentTypeDefinitions": {
410
412
  "level": "error",
@@ -423,6 +425,12 @@
423
425
  // Enforce that components are defined as functions and never as classes.
424
426
  "useReactFunctionComponents": "error",
425
427
 
428
+ // Disallow string literals inside JSX elements.
429
+ "noJsxLiterals": "off",
430
+ // Disallow unused catch bindings.
431
+ "noUselessCatchBinding": "off",
432
+ // Disallow unnecessary type-based conditions that can be statically determined as redundant.
433
+ "noUnnecessaryConditions": "off",
426
434
  // Disallow usage of sensitive data such as API keys and tokens.
427
435
  "noSecrets": "off",
428
436
  // Enforce types in functions, methods, variables, and parameters.
@@ -436,6 +444,7 @@
436
444
  "functions": ["clsx", "cva", "tw", "twMerge", "cn", "twJoin", "tv"]
437
445
  }
438
446
  },
447
+ "useVueMultiWordComponentNames": "off",
439
448
 
440
449
  /** ------ These rules should be enabled but Scanner makes them too slow ------ **/
441
450
  // Require Promise-like statements to be handled appropriately.
@@ -553,6 +562,8 @@
553
562
  "useDefaultParameterLast": "error",
554
563
  // Require the default clause in switch statements.
555
564
  "useDefaultSwitchClause": "error",
565
+ // Require specifying the reason argument when using @deprecated directive
566
+ "useDeprecatedReason": "error",
556
567
  // Require that each enum member value be explicitly initialized.
557
568
  "useEnumInitializers": "error",
558
569
  // Disallow the use of Math.pow in favor of the ** operator.
@@ -583,6 +594,8 @@
583
594
  "useLiteralEnumMembers": "error",
584
595
  // Reports usage of “magic numbers” — numbers used directly instead of being assigned to named constants.
585
596
  "noMagicNumbers": "error",
597
+ // Enforce naming conventions for everything across a codebase.
598
+ "useNamingConvention": "error",
586
599
  // Promotes the usage of node:assert/strict over node:assert.
587
600
  "useNodeAssertStrict": "error",
588
601
  // Enforces using the node: protocol for Node.js builtin modules.
@@ -642,6 +655,8 @@
642
655
  "suspicious": {
643
656
  /** ------------------------ JavaScript Rules ------------------------ **/
644
657
 
658
+ // Disallow the use of alert, confirm, and prompt.
659
+ "noAlert": "error",
645
660
  // Use standard constants instead of approximated literals.
646
661
  "noApproximativeNumericConstant": "error",
647
662
  // Discourage the usage of Array index in keys.
@@ -650,6 +665,8 @@
650
665
  "noAssignInExpressions": "error",
651
666
  // Disallows using an async function as a Promise executor.
652
667
  "noAsyncPromiseExecutor": "error",
668
+ // Prevents the use of the ! pattern in the first position of files.includes in the configuration file.
669
+ "noBiomeFirstException": "error",
653
670
  // Disallow bitwise operators.
654
671
  "noBitwiseOperators": "error",
655
672
  // Disallow expressions where the operation doesn't affect the value
@@ -686,6 +703,8 @@
686
703
  "noDuplicateClassMembers": "error",
687
704
  // Disallow duplicate conditions in if-else-if chains
688
705
  "noDuplicateElseIf": "error",
706
+ // Disallow duplicated fields in GraphQL operations.
707
+ "noDuplicateFields": "error",
689
708
  // Prevents JSX properties to be assigned multiple times.
690
709
  "noDuplicateJsxProps": "error",
691
710
  // Disallow two keys with the same name inside objects.
@@ -740,6 +759,8 @@
740
759
  "noOctalEscape": "error",
741
760
  // Disallow direct use of Object.prototype builtins.
742
761
  "noPrototypeBuiltins": "error",
762
+ // Disallow the use if quickfix.biome inside editor settings file.
763
+ "noQuickfixBiome": "error",
743
764
  // Disallow variable, function, class, and type redeclarations in the same scope.
744
765
  "noRedeclare": "error",
745
766
  // Prevents from having redundant "use strict".
@@ -778,6 +799,8 @@
778
799
  "useAdjacentOverloadSignatures": "error",
779
800
  // Ensure async functions utilize await.
780
801
  "useAwait": "error",
802
+ // Promotes the correct usage for ignoring folders in the configuration file.
803
+ "useBiomeIgnoreFolder": "error",
781
804
  // Enforce consistent return values in iterable callbacks.
782
805
  "useIterableCallbackReturn": "error",
783
806
  // Enforce default clauses in switch statements to be last
package/dist/index.d.ts CHANGED
@@ -1,13 +1,13 @@
1
- #!/usr/bin/env node
2
- import { trpcServer, TrpcCliMeta } from 'trpc-cli';
1
+ import * as _trpc_server from '@trpc/server';
2
+ import { TrpcCliMeta } from 'trpc-cli';
3
3
 
4
- declare const router: trpcServer.TRPCBuiltRouter<{
4
+ declare const router: _trpc_server.TRPCBuiltRouter<{
5
5
  ctx: object;
6
6
  meta: TrpcCliMeta;
7
- errorShape: trpcServer.TRPCDefaultErrorShape;
7
+ errorShape: _trpc_server.TRPCDefaultErrorShape;
8
8
  transformer: false;
9
- }, trpcServer.TRPCDecorateCreateRouterOptions<{
10
- init: trpcServer.TRPCMutationProcedure<{
9
+ }, _trpc_server.TRPCDecorateCreateRouterOptions<{
10
+ init: _trpc_server.TRPCMutationProcedure<{
11
11
  input: {
12
12
  pm?: "npm" | "yarn" | "pnpm" | "bun" | "deno" | undefined;
13
13
  editors?: ("vscode" | "zed")[] | undefined;
@@ -20,29 +20,29 @@ declare const router: trpcServer.TRPCBuiltRouter<{
20
20
  output: void;
21
21
  meta: TrpcCliMeta;
22
22
  }>;
23
- check: trpcServer.TRPCQueryProcedure<{
23
+ check: _trpc_server.TRPCQueryProcedure<{
24
24
  input: string[] | undefined;
25
25
  output: void;
26
26
  meta: TrpcCliMeta;
27
27
  }>;
28
- fix: trpcServer.TRPCMutationProcedure<{
28
+ fix: _trpc_server.TRPCMutationProcedure<{
29
29
  input: [string[] | undefined, {
30
30
  unsafe?: boolean | undefined;
31
31
  }];
32
32
  output: void;
33
33
  meta: TrpcCliMeta;
34
34
  }>;
35
- doctor: trpcServer.TRPCQueryProcedure<{
35
+ doctor: _trpc_server.TRPCQueryProcedure<{
36
36
  input: void;
37
37
  output: void;
38
38
  meta: TrpcCliMeta;
39
39
  }>;
40
- lint: trpcServer.TRPCQueryProcedure<{
40
+ lint: _trpc_server.TRPCQueryProcedure<{
41
41
  input: string[] | undefined;
42
42
  output: void;
43
43
  meta: TrpcCliMeta;
44
44
  }>;
45
- format: trpcServer.TRPCMutationProcedure<{
45
+ format: _trpc_server.TRPCMutationProcedure<{
46
46
  input: [string[] | undefined, {
47
47
  unsafe?: boolean | undefined;
48
48
  }];
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- var H=Object.defineProperty;var Qe=Object.getOwnPropertyDescriptor;var et=Object.getOwnPropertyNames;var tt=Object.prototype.hasOwnProperty;var V=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,s)=>(typeof require<"u"?require:t)[s]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')}),ce=e=>t=>{var s=e[t];if(s)return s();throw new Error("Module not found in bundle: "+t)};var j=(e,t)=>()=>(e&&(t=e(e=0)),t);var X=(e,t)=>{for(var s in t)H(e,s,{get:t[s],enumerable:!0})},st=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of et(t))!tt.call(e,o)&&o!==s&&H(e,o,{get:()=>t[o],enumerable:!(n=Qe(t,o))||n.enumerable});return e};var Y=e=>st(H({},"__esModule",{value:!0}),e);import{access as ot,readFile as le,writeFile as it}from"fs/promises";import{parse as at}from"jsonc-parser";var a,f,de,C,rt,ct,F,p=j(()=>{"use strict";a=async e=>{try{return await ot(e),!0}catch{return!1}},f=async()=>{if(await a("pnpm-workspace.yaml"))return!0;try{let e=at(await le("package.json","utf-8"));return e?!!e.workspaces||!!e.workspace:!1}catch{return!1}},de=`
2
+ var H=Object.defineProperty;var Qe=Object.getOwnPropertyDescriptor;var et=Object.getOwnPropertyNames;var tt=Object.prototype.hasOwnProperty;var V=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,s)=>(typeof require<"u"?require:t)[s]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')}),de=e=>t=>{var s=e[t];if(s)return s();throw new Error("Module not found in bundle: "+t)};var j=(e,t)=>()=>(e&&(t=e(e=0)),t);var X=(e,t)=>{for(var s in t)H(e,s,{get:t[s],enumerable:!0})},st=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of et(t))!tt.call(e,o)&&o!==s&&H(e,o,{get:()=>t[o],enumerable:!(n=Qe(t,o))||n.enumerable});return e};var Y=e=>st(H({},"__esModule",{value:!0}),e);import{access as ot,readFile as ue,writeFile as it}from"fs/promises";import{parse as at}from"jsonc-parser";var a,f,pe,C,rt,ct,F,p=j(()=>{"use strict";a=async e=>{try{return await ot(e),!0}catch{return!1}},f=async()=>{if(await a("pnpm-workspace.yaml"))return!0;try{let e=at(await ue("package.json","utf-8"));return e?!!e.workspaces||!!e.workspace:!1}catch{return!1}},pe=`
3
3
  888 888 888 88888888888 8888888b. d8888 .d8888b. 8888888 88888888888 8888888888
4
4
  888 888 888 888 888 Y88b d88888 d88P Y88b 888 888 888
5
5
  888 888 888 888 888 888 d88P888 888 888 888 888 888
@@ -8,7 +8,7 @@ var H=Object.defineProperty;var Qe=Object.getOwnPropertyDescriptor;var et=Object
8
8
  888 888 888 888 888 T88b d88P 888 888 888 888 888 888
9
9
  Y88b. .d88P 888 888 888 T88b d8888888888 Y88b d88P 888 888 888
10
10
  "Y88888P" 88888888 888 888 T88b d88P 888 "Y8888P" 8888888 888 8888888888
11
- `,C=async({dependencies:e,devDependencies:t})=>{let s=await le("package.json","utf8"),n=JSON.parse(s),o={...n,devDependencies:{...n.devDependencies,...t},dependencies:{...n.dependencies,...e}};await it("package.json",JSON.stringify(o,null,2))},rt=/[ $(){}[\]&|;<>!"'`*?#~]/,ct=/'/g,F=e=>e.map(t=>rt.test(t)?`'${t.replace(ct,"'\\''")}' `:t)});var Je={};X(Je,{husky:()=>v});import{mkdir as Ht,readFile as Vt,writeFile as Te}from"fs/promises";import{addDevDependency as Xt,dlxCommand as Oe}from"nypm";var _e,L,v,se=j(()=>{"use strict";p();_e=e=>`#!/bin/sh
11
+ `,C=async({dependencies:e,devDependencies:t})=>{let s=await ue("package.json","utf8"),n=JSON.parse(s),o={...n,devDependencies:{...n.devDependencies,...t},dependencies:{...n.dependencies,...e}};await it("package.json",JSON.stringify(o,null,2))},rt=/[ $(){}[\]&|;<>!"'`*?#~]/,ct=/'/g,F=e=>e.map(t=>rt.test(t)?`'${t.replace(ct,"'\\''")}' `:t)});var Je={};X(Je,{husky:()=>v});import{mkdir as Ht,readFile as Vt,writeFile as Te}from"fs/promises";import{addDevDependency as Xt,dlxCommand as Oe}from"nypm";var _e,L,v,oe=j(()=>{"use strict";p();_e=e=>`#!/bin/sh
12
12
  # Exit on any error
13
13
  set -e
14
14
 
@@ -77,7 +77,7 @@ fi
77
77
 
78
78
  exit $FORMAT_EXIT_CODE
79
79
  `,L="./.husky/pre-commit",v={exists:()=>a(L),install:async e=>{await Xt("husky",{packageManager:e,workspace:await f()})},create:async e=>{await Ht(".husky",{recursive:!0});let t=Oe(e,"ultracite",{args:["fix"],short:e==="npm"}),s=_e(t);await Te(L,s)},update:async e=>{let t=await Vt(L,"utf-8"),s=Oe(e,"ultracite",{args:["fix"],short:e==="npm"}),n=_e(s);await Te(L,`${t}
80
- ${n}`)}}});var We={};X(We,{lefthook:()=>x});import{execSync as Yt}from"child_process";import{readFile as Kt,writeFile as E}from"fs/promises";import{addDevDependency as Zt,dlxCommand as ze}from"nypm";var Qt,es,Be,y,Le,x,ne=j(()=>{"use strict";p();Qt=/(pre-commit:\s*\n\s*jobs:\s*\n)/,es=/(pre-commit:\s*\n)/,Be=e=>ze(e,"ultracite",{args:["fix"],short:e==="npm"}),y="./lefthook.yml",Le=e=>`pre-commit:
80
+ ${n}`)}}});var We={};X(We,{lefthook:()=>x});import{execSync as Yt}from"child_process";import{readFile as Kt,writeFile as E}from"fs/promises";import{addDevDependency as Zt,dlxCommand as ze}from"nypm";var Qt,es,Be,y,Le,x,ie=j(()=>{"use strict";p();Qt=/(pre-commit:\s*\n\s*jobs:\s*\n)/,es=/(pre-commit:\s*\n)/,Be=e=>ze(e,"ultracite",{args:["fix"],short:e==="npm"}),y="./lefthook.yml",Le=e=>`pre-commit:
81
81
  jobs:
82
82
  - run: ${Be(e)}
83
83
  glob:
@@ -111,18 +111,18 @@ ${n}`)}}});var We={};X(We,{lefthook:()=>x});import{execSync as Yt}from"child_pro
111
111
  - "*.css"
112
112
  stage_fixed: true`,r=t.replace(es,`$1${i}
113
113
  `);await E(y,r)}else await E(y,`${t}
114
- ${n}`)}}});var ts,oe=j(()=>{ts=ce({"./husky.ts":()=>(se(),Y(Je)),"./lefthook.ts":()=>(ne(),Y(We)),"./lint-staged.ts":()=>(ie(),Y(qe))})});var qe={};X(qe,{lintStaged:()=>D});import{readFile as z,writeFile as w}from"fs/promises";import{pathToFileURL as ss}from"url";import $ from"deepmerge";import{parse as re}from"jsonc-parser";import{addDevDependency as ns,dlxCommand as os}from"nypm";var g,Ge,is,as,rs,cs,ls,ds,us,ps,ms,ae,fs,D,ie=j(()=>{"use strict";p();oe();g=e=>({"*.{js,jsx,ts,tsx,json,jsonc,css,scss,md,mdx}":[os(e,"ultracite",{args:["fix"],short:e==="npm"})]}),Ge=["./package.json","./.lintstagedrc.json","./.lintstagedrc.js","./.lintstagedrc.cjs","./.lintstagedrc.mjs","./lint-staged.config.js","./lint-staged.config.cjs","./lint-staged.config.mjs","./.lintstagedrc.yaml","./.lintstagedrc.yml","./.lintstagedrc"],is=(e,t,s,n)=>{let o=e.trim();if(o.includes(":")&&!o.startsWith("-")){s&&n.length>0&&(t[s]=n);let[i,...r]=o.split(":"),l=r.join(":").trim(),d=i.trim().replace(/['"]/g,"");return l&&l!==""?(l.startsWith("[")&&l.endsWith("]")?t[d]=l.slice(1,-1).split(",").map(u=>u.trim().replace(/['"]/g,"")):t[d]=l.replace(/['"]/g,""),{newCurrentKey:null,newCurrentArray:[]}):{newCurrentKey:d,newCurrentArray:[]}}if(o.startsWith("-")&&s){let i=[...n,o.slice(1).trim().replace(/['"]/g,"")];return{newCurrentKey:s,newCurrentArray:i}}return{newCurrentKey:s,newCurrentArray:n}},as=e=>{let t=e.split(`
114
+ ${n}`)}}});var ts,ae=j(()=>{ts=de({"./husky.ts":()=>(oe(),Y(Je)),"./lefthook.ts":()=>(ie(),Y(We)),"./lint-staged.ts":()=>(re(),Y(qe))})});var qe={};X(qe,{lintStaged:()=>D});import{readFile as z,writeFile as w}from"fs/promises";import{pathToFileURL as ss}from"url";import $ from"deepmerge";import{parse as le}from"jsonc-parser";import{addDevDependency as ns,dlxCommand as os}from"nypm";var g,Ge,is,as,rs,cs,ls,ds,us,ps,ms,ce,fs,D,re=j(()=>{"use strict";p();ae();g=e=>({"*.{js,jsx,ts,tsx,json,jsonc,css,scss,md,mdx}":[os(e,"ultracite",{args:["fix"],short:e==="npm"})]}),Ge=["./package.json","./.lintstagedrc.json","./.lintstagedrc.js","./.lintstagedrc.cjs","./.lintstagedrc.mjs","./lint-staged.config.js","./lint-staged.config.cjs","./lint-staged.config.mjs","./.lintstagedrc.yaml","./.lintstagedrc.yml","./.lintstagedrc"],is=(e,t,s,n)=>{let o=e.trim();if(o.includes(":")&&!o.startsWith("-")){s&&n.length>0&&(t[s]=n);let[i,...r]=o.split(":"),l=r.join(":").trim(),d=i.trim().replace(/['"]/g,"");return l&&l!==""?(l.startsWith("[")&&l.endsWith("]")?t[d]=l.slice(1,-1).split(",").map(u=>u.trim().replace(/['"]/g,"")):t[d]=l.replace(/['"]/g,""),{newCurrentKey:null,newCurrentArray:[]}):{newCurrentKey:d,newCurrentArray:[]}}if(o.startsWith("-")&&s){let i=[...n,o.slice(1).trim().replace(/['"]/g,"")];return{newCurrentKey:s,newCurrentArray:i}}return{newCurrentKey:s,newCurrentArray:n}},as=e=>{let t=e.split(`
115
115
  `).filter(i=>i.trim()&&!i.trim().startsWith("#")),s={},n=null,o=[];for(let i of t){let r=is(i,s,n,o);n=r.newCurrentKey,o=r.newCurrentArray}return n&&o.length>0&&(s[n]=o),s},rs=e=>{let t="";for(let[s,n]of Object.entries(e))if(Array.isArray(n)){t+=`${s}:
116
116
  `;for(let o of n)t+=` - '${o}'
117
117
  `}else t+=`${s}: '${n}'
118
- `;return t},cs=async()=>{try{let e=re(await z("./package.json","utf-8"));return e?e.type==="module":!1}catch{return!1}},ls=async e=>{let t=re(await z("./package.json","utf-8"));t&&(t["lint-staged"]?t["lint-staged"]=$(t["lint-staged"],g(e)):t["lint-staged"]=g(e),await w("./package.json",JSON.stringify(t,null,2)))},ds=async(e,t)=>{let s=await z(e,"utf-8"),n=re(s);if(!n)return;let o=$(n,g(t));await w(e,JSON.stringify(o,null,2))},us=async(e,t)=>{let s=await z(e,"utf-8"),n=as(s);if(!n)return;let o=$(n,g(t));await w(e,rs(o))},ps=async(e,t)=>{let o=(await import(ss(e).href)).default||{},i=$(o,g(t)),r=`export default ${JSON.stringify(i,null,2)};
118
+ `;return t},cs=async()=>{try{let e=le(await z("./package.json","utf-8"));return e?e.type==="module":!1}catch{return!1}},ls=async e=>{let t=le(await z("./package.json","utf-8"));t&&(t["lint-staged"]?t["lint-staged"]=$(t["lint-staged"],g(e)):t["lint-staged"]=g(e),await w("./package.json",JSON.stringify(t,null,2)))},ds=async(e,t)=>{let s=await z(e,"utf-8"),n=le(s);if(!n)return;let o=$(n,g(t));await w(e,JSON.stringify(o,null,2))},us=async(e,t)=>{let s=await z(e,"utf-8"),n=as(s);if(!n)return;let o=$(n,g(t));await w(e,rs(o))},ps=async(e,t)=>{let o=(await import(ss(e).href)).default||{},i=$(o,g(t)),r=`export default ${JSON.stringify(i,null,2)};
119
119
  `;await w(e,r)},ms=async(e,t)=>{delete V.cache[V.resolve(`./${e}`)];let s=ts(`./${e}`),n=$(s,g(t)),o=`module.exports = ${JSON.stringify(n,null,2)};
120
- `;await w(e,o)},ae=async e=>{await w(".lintstagedrc.json",JSON.stringify(g(e),null,2))},fs=async(e,t)=>{if(e==="./package.json"){await ls(t);return}if(e.endsWith(".json")||e==="./.lintstagedrc"){await ds(e,t);return}if(e.endsWith(".yaml")||e.endsWith(".yml")){await us(e,t);return}let s=await cs();if(e.endsWith(".mjs")||e.endsWith(".js")&&s){try{await ps(e,t)}catch{await ae(t)}return}if(e.endsWith(".cjs")||e.endsWith(".js")&&!s)try{await ms(e,t)}catch{await ae(t)}},D={exists:async()=>{for(let e of Ge)if(await a(e))return!0;return!1},install:async e=>{await ns("lint-staged",{packageManager:e,workspace:await f()})},create:async e=>{await w(".lintstagedrc.json",JSON.stringify(g(e),null,2))},update:async e=>{let t=null;for(let s of Ge)if(await a(s)){t=s;break}if(!t){await ae(e);return}await fs(t,e)}}});import{createCli as $s,trpcServer as Fs}from"trpc-cli";import c from"zod";var h={name:"ultracite",description:"The AI-ready formatter that helps you write and generate code faster.",version:"5.3.10",type:"module",bin:{ultracite:"dist/index.js"},files:["biome.jsonc","dist"],scripts:{build:"tsup",test:"vitest run","test:coverage":"vitest --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:{"@auto-it/all-contributors":"^11.3.0","@auto-it/first-time-contributor":"^11.3.0","@biomejs/biome":"2.2.2","@types/node":"^24.3.0","@vitest/coverage-v8":"3.2.4",tsup:"^8.5.0"},dependencies:{"@clack/prompts":"^0.11.0",deepmerge:"^4.3.1","jsonc-parser":"^3.3.1",nypm:"^0.6.1","trpc-cli":"^0.10.2",vitest:"^3.2.4",zod:"^4.1.5"},packageManager:"pnpm@10.15.0"};p();import{spawnSync as lt}from"child_process";import ue from"process";var K=e=>{let t=["npx","@biomejs/biome","check","--no-errors-on-unmatched"];e.length>0?t.push(...F(e)):t.push("./");let s=t.join(" "),n=lt(s,{stdio:"inherit",shell:!0});n.error&&(console.error("Failed to run Ultracite:",n.error.message),ue.exit(1)),n.status!==0&&ue.exit(n.status??1)};import{spawnSync as jt}from"child_process";import{existsSync as S}from"fs";import{readFile as we}from"fs/promises";import{join as P}from"path";import{parse as Ct}from"jsonc-parser";p();import{readFile as pe,unlink as dt,writeFile as ut}from"fs/promises";import{parse as me}from"jsonc-parser";import{removeDependency as pt}from"nypm";var N=[".eslintrc",".eslintrc.js",".eslintrc.json",".eslintrc.yml",".eslintrc.yaml",".eslintrc.config.js","eslint.config.js","eslint.config.mjs","eslint.config.cjs",".eslintignore"],fe=async()=>{try{let e=await pe("package.json","utf-8"),t=me(e);if(!t||typeof t!="object")return[];let s=t.dependencies||{},n=t.devDependencies||{},o={...s,...n};return Object.keys(o).filter(i=>i.startsWith("eslint")||i.startsWith("@eslint/")||i==="@typescript-eslint/parser"||i==="@typescript-eslint/eslint-plugin")}catch{return[]}},mt=async(e,t)=>{if(t.length!==0)try{for(let s of t)await pt(s,{packageManager:e})}catch(s){console.warn(s)}},ft=async()=>{let e=[];for(let t of N)if(await a(t))try{await dt(t),e.push(t)}catch(s){console.warn(s)}return e},gt=async()=>{let e="./.vscode/settings.json";if(!await a(e))return!1;try{let t=await pe(e,"utf-8"),s=me(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 d of l)d in r&&(delete r[d],n=!0);Object.keys(r).length===0&&(o["editor.codeActionsOnSave"]=void 0)}}return n?(await ut(e,JSON.stringify(o,null,2)),!0):!1}catch(t){return console.warn(t),!1}},ht=async()=>{if((await fe()).length>0)return!0;for(let t of N)if(await a(t))return!0;return!1},Z={hasESLint:ht,remove:async e=>{let t=await fe();mt(e,t);let s=await ft(),n=await gt();return{packagesRemoved:t,filesRemoved:s,vsCodeCleaned:n}}};p();import{readFile as ge,unlink as yt,writeFile as wt}from"fs/promises";import{parse as he}from"jsonc-parser";import{removeDependency as bt}from"nypm";var I=[".prettierrc",".prettierrc.js",".prettierrc.json",".prettierrc.yml",".prettierrc.yaml",".prettierrc.config.js","prettier.config.js","prettier.config.mjs",".prettierignore"],ye=async()=>{try{let e=await ge("package.json","utf-8"),t=he(e);if(!t||typeof t!="object")return[];let s=t.dependencies||{},n=t.devDependencies||{},o={...s,...n};return Object.keys(o).filter(i=>i.startsWith("prettier")||i==="eslint-config-prettier"||i==="eslint-plugin-prettier")}catch{return[]}},kt=async(e,t)=>{if(t.length!==0)try{for(let s of t)await bt(s,{packageManager:e})}catch(s){console.warn(s)}},vt=async()=>{let e=[];for(let t of I)if(await a(t))try{await yt(t),e.push(t)}catch(s){console.warn(s)}return e},xt=async()=>{let e="./.vscode/settings.json";if(!await a(e))return!1;try{let t=await ge(e,"utf-8"),s=he(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 d=o[l];d&&typeof d=="object"&&"editor.defaultFormatter"in d&&d["editor.defaultFormatter"]==="esbenp.prettier-vscode"&&(d["editor.defaultFormatter"]=void 0,n=!0,Object.keys(d).length===0&&delete o[l])}return n?(await wt(e,JSON.stringify(o,null,2)),!0):!1}catch(t){return console.warn(t),!1}},Dt=async()=>{if((await ye()).length>0)return!0;for(let t of I)if(await a(t))return!0;return!1},Q={hasPrettier:Dt,remove:async e=>{let t=await ye();kt(e,t);let s=await vt(),n=await xt();return{packagesRemoved:t,filesRemoved:s,vsCodeCleaned:n}}};var St=()=>{let e=jt("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"}},Pt=async()=>{let e=P(process.cwd(),"biome.json"),t=P(process.cwd(),"biome.jsonc"),s=null;if(S(e)?s=e:S(t)&&(s=t),!s)return{name:"Biome configuration",status:"fail",message:"No biome.json or biome.jsonc file found"};try{let n=await we(s,"utf-8"),o=Ct(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"}}},Rt=async()=>{let e=P(process.cwd(),"package.json");if(!S(e))return{name:"Ultracite dependency",status:"warn",message:"No package.json found"};try{let t=JSON.parse(await we(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"}}},At=()=>{let e=I.some(s=>S(P(process.cwd(),s))),t=N.some(s=>S(P(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"}},be=async()=>{let e=[];console.log(`\u{1FA7A} Running Ultracite doctor...
120
+ `;await w(e,o)},ce=async e=>{await w(".lintstagedrc.json",JSON.stringify(g(e),null,2))},fs=async(e,t)=>{if(e==="./package.json"){await ls(t);return}if(e.endsWith(".json")||e==="./.lintstagedrc"){await ds(e,t);return}if(e.endsWith(".yaml")||e.endsWith(".yml")){await us(e,t);return}let s=await cs();if(e.endsWith(".mjs")||e.endsWith(".js")&&s){try{await ps(e,t)}catch{await ce(t)}return}if(e.endsWith(".cjs")||e.endsWith(".js")&&!s)try{await ms(e,t)}catch{await ce(t)}},D={exists:async()=>{for(let e of Ge)if(await a(e))return!0;return!1},install:async e=>{await ns("lint-staged",{packageManager:e,workspace:await f()})},create:async e=>{await w(".lintstagedrc.json",JSON.stringify(g(e),null,2))},update:async e=>{let t=null;for(let s of Ge)if(await a(s)){t=s;break}if(!t){await ce(e);return}await fs(t,e)}}});import{initTRPC as $s}from"@trpc/server";import{createCli as Fs}from"trpc-cli";import c from"zod";var h={name:"ultracite",description:"The AI-ready formatter that helps you write and generate code faster.",version:"5.3.11",type:"module",bin:{ultracite:"dist/index.js"},files:["biome.jsonc","dist"],scripts:{build:"tsup",test:"vitest run","test:coverage":"vitest --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:{"@auto-it/all-contributors":"^11.3.0","@auto-it/first-time-contributor":"^11.3.0","@biomejs/biome":"2.2.4","@types/node":"^24.5.2","@vitest/coverage-v8":"3.2.4",tsup:"^8.5.0"},dependencies:{"@clack/prompts":"^0.11.0","@trpc/server":"^11.5.1",deepmerge:"^4.3.1","jsonc-parser":"^3.3.1",nypm:"^0.6.2","trpc-cli":"^0.11.0",vitest:"^3.2.4",zod:"^4.1.11"},packageManager:"pnpm@10.17.0"};p();import{spawnSync as lt}from"child_process";import me from"process";var K=e=>{let t=["npx","@biomejs/biome","check","--no-errors-on-unmatched"];e.length>0?t.push(...F(e)):t.push("./");let s=t.join(" "),n=lt(s,{stdio:"inherit",shell:!0});n.error&&(console.error("Failed to run Ultracite:",n.error.message),me.exit(1)),n.status!==0&&me.exit(n.status??1)};import{spawnSync as jt}from"child_process";import{existsSync as S}from"fs";import{readFile as ke}from"fs/promises";import{join as P}from"path";import{parse as Ct}from"jsonc-parser";p();import{readFile as fe,unlink as dt,writeFile as ut}from"fs/promises";import{parse as ge}from"jsonc-parser";import{removeDependency as pt}from"nypm";var N=[".eslintrc",".eslintrc.js",".eslintrc.json",".eslintrc.yml",".eslintrc.yaml",".eslintrc.config.js","eslint.config.js","eslint.config.mjs","eslint.config.cjs",".eslintignore"],he=async()=>{try{let e=await fe("package.json","utf-8"),t=ge(e);if(!t||typeof t!="object")return[];let s=t.dependencies||{},n=t.devDependencies||{},o={...s,...n};return Object.keys(o).filter(i=>i.startsWith("eslint")||i.startsWith("@eslint/")||i==="@typescript-eslint/parser"||i==="@typescript-eslint/eslint-plugin")}catch{return[]}},mt=async(e,t)=>{if(t.length!==0)try{for(let s of t)await pt(s,{packageManager:e})}catch(s){console.warn(s)}},ft=async()=>{let e=[];for(let t of N)if(await a(t))try{await dt(t),e.push(t)}catch(s){console.warn(s)}return e},gt=async()=>{let e="./.vscode/settings.json";if(!await a(e))return!1;try{let t=await fe(e,"utf-8"),s=ge(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 d of l)d in r&&(delete r[d],n=!0);Object.keys(r).length===0&&(o["editor.codeActionsOnSave"]=void 0)}}return n?(await ut(e,JSON.stringify(o,null,2)),!0):!1}catch(t){return console.warn(t),!1}},ht=async()=>{if((await he()).length>0)return!0;for(let t of N)if(await a(t))return!0;return!1},Z={hasEsLint:ht,remove:async e=>{let t=await he();mt(e,t);let s=await ft(),n=await gt();return{packagesRemoved:t,filesRemoved:s,vsCodeCleaned:n}}};p();import{readFile as ye,unlink as yt,writeFile as wt}from"fs/promises";import{parse as we}from"jsonc-parser";import{removeDependency as bt}from"nypm";var I=[".prettierrc",".prettierrc.js",".prettierrc.json",".prettierrc.yml",".prettierrc.yaml",".prettierrc.config.js","prettier.config.js","prettier.config.mjs",".prettierignore"],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.startsWith("prettier")||i==="eslint-config-prettier"||i==="eslint-plugin-prettier")}catch{return[]}},kt=async(e,t)=>{if(t.length!==0)try{for(let s of t)await bt(s,{packageManager:e})}catch(s){console.warn(s)}},vt=async()=>{let e=[];for(let t of I)if(await a(t))try{await yt(t),e.push(t)}catch(s){console.warn(s)}return e},xt=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=["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 d=o[l];d&&typeof d=="object"&&"editor.defaultFormatter"in d&&d["editor.defaultFormatter"]==="esbenp.prettier-vscode"&&(d["editor.defaultFormatter"]=void 0,n=!0,Object.keys(d).length===0&&delete o[l])}return n?(await wt(e,JSON.stringify(o,null,2)),!0):!1}catch(t){return console.warn(t),!1}},Dt=async()=>{if((await be()).length>0)return!0;for(let t of I)if(await a(t))return!0;return!1},Q={hasPrettier:Dt,remove:async e=>{let t=await be();kt(e,t);let s=await vt(),n=await xt();return{packagesRemoved:t,filesRemoved:s,vsCodeCleaned:n}}};var St=()=>{let e=jt("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"}},Pt=async()=>{let e=P(process.cwd(),"biome.json"),t=P(process.cwd(),"biome.jsonc"),s=null;if(S(e)?s=e:S(t)&&(s=t),!s)return{name:"Biome configuration",status:"fail",message:"No biome.json or biome.jsonc file found"};try{let n=await ke(s,"utf-8"),o=Ct(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"}}},Rt=async()=>{let e=P(process.cwd(),"package.json");if(!S(e))return{name:"Ultracite dependency",status:"warn",message:"No package.json found"};try{let t=JSON.parse(await ke(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"}}},At=()=>{let e=I.some(s=>S(P(process.cwd(),s))),t=N.some(s=>S(P(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"}},ve=async()=>{let e=[];console.log(`\u{1FA7A} Running Ultracite doctor...
121
121
  `),e.push(St()),e.push(await Pt()),e.push(await Rt()),e.push(At());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(`
124
124
  \u{1F4A1} Some optional improvements available. Run 'npx ultracite init' to configure.`):console.log(`
125
- \u2728 Everything looks good!`)};p();import{spawnSync as Mt}from"child_process";import ke from"process";var ee=(e,t={})=>{let s=["npx","@biomejs/biome","check","--write","--no-errors-on-unmatched"];t.unsafe&&s.push("--unsafe"),e.length>0?s.push(...F(e)):s.push("./");let n=s.join(" "),o=Mt(n,{stdio:"inherit",shell:!0});o.error&&(console.error("Failed to run Ultracite:",o.error.message),ke.exit(1)),o.status!==0&&ke.exit(o.status??1)};import{packageManagers as Et}from"nypm";var R={packageManagers:Et.map(e=>e.name),editorConfigs:["vscode","zed"],editorRules:["vscode-copilot","cursor","windsurf","zed","claude","codex","kiro","cline","amp","aider","firebase-studio","open-hands","gemini-cli","junie","augmentcode","kilo-code","goose"],integrations:["husky","lefthook","lint-staged"]};import Xe from"process";import{intro as ws,log as q,multiselect as G,spinner as m}from"@clack/prompts";import{addDevDependency as bs,detectPackageManager as ks}from"nypm";p();import{readFile as $t,writeFile as ve}from"fs/promises";import Ft from"deepmerge";import{parse as Nt}from"jsonc-parser";var xe={$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["ultracite"]},te=async()=>await a("./biome.json")?"./biome.json":"./biome.jsonc",U={exists:async()=>{let e=await te();return a(e)},create:async()=>{let e=await te();return ve(e,JSON.stringify(xe,null,2))},update:async()=>{let e=await te(),t=await $t(e,"utf-8"),n=Nt(t)||{},o=n.extends&&Array.isArray(n.extends)?n.extends:[];o.includes("ultracite")||(n.extends=[...o,"ultracite"]);let i={$schema:xe.$schema},r=Ft(n,i);await ve(e,JSON.stringify(r,null,2))}};p();import{spawnSync as It}from"child_process";import{mkdir as Ut,readFile as Tt,writeFile as De}from"fs/promises";import Ot from"deepmerge";import{parse as _t}from"jsonc-parser";var je={"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"}},T="./.vscode/settings.json",A={exists:()=>a(T),create:async()=>{await Ut(".vscode",{recursive:!0}),await De(T,JSON.stringify(je,null,2))},update:async()=>{let e=await Tt(T,"utf-8"),s=_t(e)||{},n=Ot(s,je);await De(T,JSON.stringify(n,null,2))},extension:()=>It("code --install-extension biomejs.biome",{stdio:"inherit",shell:!0})};p();import{mkdir as Jt,readFile as Lt,writeFile as Ce}from"fs/promises";import zt from"deepmerge";import{parse as Bt}from"jsonc-parser";var Se={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"}}}}}},O="./.zed/settings.json",_={exists:()=>a(O),create:async()=>{await Jt(".zed",{recursive:!0}),await Ce(O,JSON.stringify(Se,null,2))},update:async()=>{let e=await Lt(O,"utf-8"),s=Bt(e)||{},n=zt(s,Se);await Ce(O,JSON.stringify(n,null,2))}};import{mkdir as Wt,readFile as qt,writeFile as J}from"fs/promises";import{dirname as Gt}from"path";var Pe=["Don't use `accessKey` attribute on any HTML element.",'Don\'t set `aria-hidden="true"` on focusable elements.',"Don't add ARIA roles, states, and properties to elements that don't support them.","Don't use distracting elements like `<marquee>` or `<blink>`.","Only use the `scope` prop on `<th>` elements.","Don't assign non-interactive ARIA roles to interactive HTML elements.","Make sure label elements have text content and are associated with an input.","Don't assign interactive ARIA roles to non-interactive HTML elements.","Don't assign `tabIndex` to non-interactive HTML elements.","Don't use positive integers for `tabIndex` property.",`Don't include "image", "picture", or "photo" in img alt prop.`,"Don't use explicit role property that's the same as the implicit/default role.","Make static elements with click handlers use a valid role attribute.","Always include a `title` element for SVG elements.","Give all elements requiring alt text meaningful information for screen readers.","Make sure anchors have content that's accessible to screen readers.","Assign `tabIndex` to non-interactive HTML elements with `aria-activedescendant`.","Include all required ARIA attributes for elements with ARIA roles.","Make sure ARIA properties are valid for the element's supported roles.","Always include a `type` attribute for button elements.","Make elements with interactive roles and handlers focusable.","Give heading elements content that's accessible to screen readers (not hidden with `aria-hidden`).","Always include a `lang` attribute on the html element.","Always include a `title` attribute for iframe elements.","Accompany `onClick` with at least one of: `onKeyUp`, `onKeyDown`, or `onKeyPress`.","Accompany `onMouseOver`/`onMouseOut` with `onFocus`/`onBlur`.","Include caption tracks for audio and video elements.","Use semantic elements instead of role attributes in JSX.","Make sure all anchors are valid and navigable.","Ensure all ARIA properties (`aria-*`) are valid.","Use valid, non-abstract ARIA roles for elements with ARIA roles.","Use valid ARIA state and property values.","Use valid values for the `autocomplete` attribute on input elements.","Use correct ISO language/country codes for the `lang` attribute."],Re=["Don't use consecutive spaces in regular expression literals.","Don't use the `arguments` object.","Don't use primitive type aliases or misleading types.","Don't use the comma operator.","Don't use empty type parameters in type aliases and interfaces.","Don't write functions that exceed a given Cognitive Complexity score.","Don't nest describe() blocks too deeply in test files.","Don't use unnecessary boolean casts.","Don't use unnecessary callbacks with flatMap.","Use for...of statements instead of Array.forEach.","Don't create classes that only have static members (like a static namespace).","Don't use this and super in static contexts.","Don't use unnecessary catch clauses.","Don't use unnecessary constructors.","Don't use unnecessary continue statements.","Don't export empty modules that don't change anything.","Don't use unnecessary escape sequences in regular expression literals.","Don't use unnecessary fragments.","Don't use unnecessary labels.","Don't use unnecessary nested block statements.","Don't rename imports, exports, and destructured assignments to the same name.","Don't use unnecessary string or template literal concatenation.","Don't use String.raw in template literals when there are no escape sequences.","Don't use useless case statements in switch statements.","Don't use ternary operators when simpler alternatives exist.","Don't use useless `this` aliasing.","Don't use any or unknown as type constraints.","Don't initialize variables to undefined.","Don't use the void operators (they're not familiar).","Use arrow functions instead of function expressions.","Use Date.now() to get milliseconds since the Unix Epoch.","Use .flatMap() instead of map().flat() when possible.","Use literal property access instead of computed property access.","Don't use parseInt() or Number.parseInt() when binary, octal, or hexadecimal literals work.","Use concise optional chaining instead of chained logical expressions.","Use regular expression literals instead of the RegExp constructor when possible.","Don't use number literal object member names that aren't base 10 or use underscore separators.","Remove redundant terms from logical expressions.","Use while loops instead of for loops when you don't need initializer and update expressions.","Don't pass children as props.","Don't reassign const variables.","Don't use constant expressions in conditions.","Don't use `Math.min` and `Math.max` to clamp values when the result is constant.","Don't return a value from a constructor.","Don't use empty character classes in regular expression literals.","Don't use empty destructuring patterns.","Don't call global object properties as functions.","Don't declare functions and vars that are accessible outside their block.","Make sure builtins are correctly instantiated.","Don't use super() incorrectly inside classes. Also check that super() is called in classes that extend other constructors.","Don't use variables and function parameters before they're declared.","Don't use 8 and 9 escape sequences in string literals.","Don't use literal numbers that lose precision."],Ae=["Don't use the return value of React.render.","Make sure all dependencies are correctly specified in React hooks.","Make sure all React hooks are called from the top level of component functions.","Don't forget key props in iterators and collection literals.","Don't destructure props inside JSX components in Solid projects.","Don't define React components inside other components.","Don't use event handlers on non-interactive elements.","Don't assign to React component props.","Don't use both `children` and `dangerouslySetInnerHTML` props on the same element.","Don't use dangerous JSX props.","Don't use Array index in keys.","Don't insert comments as text nodes.","Don't assign JSX properties multiple times.","Don't add extra closing tags for components without children.","Use `<>...</>` instead of `<Fragment>...</Fragment>`.",'Watch out for possible "wrong" semicolons inside JSX elements.'],Me=["Don't assign a value to itself.","Don't return a value from a setter.","Don't compare expressions that modify string case with non-compliant values.","Don't use lexical declarations in switch clauses.","Don't use variables that haven't been declared in the document.","Don't write unreachable code.","Make sure super() is called exactly once on every code path in a class constructor before this is accessed if the class has a superclass.","Don't use control flow statements in finally blocks.","Don't use optional chaining where undefined values aren't allowed.","Don't have unused function parameters.","Don't have unused imports.","Don't have unused labels.","Don't have unused private class members.","Don't have unused variables.","Make sure void (self-closing) elements don't have children.","Don't return a value from a function with the return type 'void'","Use isNaN() when checking for NaN.",'Make sure "for" loop update clauses move the counter in the right direction.',"Make sure typeof expressions are compared to valid values.","Make sure generator functions contain yield.","Don't use await inside loops.","Don't use bitwise operators.","Don't use expressions where the operation doesn't change the value.","Make sure Promise-like statements are handled appropriately.","Don't use __dirname and __filename in the global scope.","Prevent import cycles.","Don't use configured elements.","Don't hardcode sensitive data like API keys and tokens.","Don't let variable declarations shadow variables from outer scopes.","Don't use the TypeScript directive @ts-ignore.","Prevent duplicate polyfills from Polyfill.io.","Don't use useless backreferences in regular expressions that always match empty strings.","Don't use unnecessary escapes in string literals.","Don't use useless undefined.","Make sure getters and setters for the same property are next to each other in class and object definitions.","Make sure object literals are declared consistently (defaults to explicit definitions).","Use static Response methods instead of new Response() constructor when possible.","Make sure switch-case statements are exhaustive.","Make sure the `preconnect` attribute is used when using Google Fonts.","Use `Array#{indexOf,lastIndexOf}()` instead of `Array#{findIndex,findLastIndex}()` when looking for the index of an item.","Make sure iterable callbacks return consistent values.",'Use `with { type: "json" }` for JSON module imports.',"Use numeric separators in numeric literals.","Use object spread instead of `Object.assign()` when constructing new objects.","Always use the radix argument when using `parseInt()`.","Make sure JSDoc comment lines start with a single asterisk, except for the first one.","Include a description parameter for `Symbol()`.","Don't use spread (`...`) syntax on accumulators.","Don't use the `delete` operator.","Don't access namespace imports dynamically.","Don't use namespace imports.","Declare regex literals at the top level.",'Don\'t use `target="_blank"` without `rel="noopener"`.'],Ee=["Don't use TypeScript enums.","Don't export imported variables.","Don't add type annotations to variables, parameters, and class properties that are initialized with literal expressions.","Don't use TypeScript namespaces.","Don't use non-null assertions with the `!` postfix operator.","Don't use parameter properties in class constructors.","Don't use user-defined types.","Use `as const` instead of literal types and type annotations.","Use either `T[]` or `Array<T>` consistently.","Initialize each enum member value explicitly.","Use `export type` for types.","Use `import type` for types.","Make sure all enum members are literal values.","Don't use TypeScript const enum.","Don't declare empty interfaces.","Don't let variables evolve into any type through reassignments.","Don't use the any type.","Don't misuse the non-null assertion operator (!) in TypeScript files.","Don't use implicit any type on variable declarations.","Don't merge interfaces and classes unsafely.","Don't use overload signatures that aren't next to each other.","Use the namespace keyword instead of the module keyword to declare TypeScript namespaces."],$e=["Don't use global `eval()`.","Don't use callbacks in asynchronous tests and hooks.","Don't use negation in `if` statements that have `else` clauses.","Don't use nested ternary expressions.","Don't reassign function parameters.","This rule lets you specify global variable names you don't want to use in your application.","Don't use specified modules when loaded by import or require.","Don't use constants whose value is the upper-case version of their name.","Use `String.slice()` instead of `String.substr()` and `String.substring()`.","Don't use template literals if you don't need interpolation or special-character handling.","Don't use `else` blocks when the `if` block breaks early.","Don't use yoda expressions.","Don't use Array constructors.","Use `at()` instead of integer index access.","Follow curly brace conventions.","Use `else if` instead of nested `if` statements in `else` clauses.","Use single `if` statements instead of nested `if` clauses.","Use `new` for all builtins except `String`, `Number`, and `Boolean`.","Use consistent accessibility modifiers on class properties and methods.","Use `const` declarations for variables that are only assigned once.","Put default function parameters and optional function parameters last.","Include a `default` clause in switch statements.","Use the `**` operator instead of `Math.pow`.","Use `for-of` loops when you need the index to extract an item from the iterated array.","Use `node:assert/strict` over `node:assert`.","Use the `node:` protocol for Node.js builtin modules.","Use Number properties instead of global ones.","Use assignment operator shorthand where possible.","Use function types instead of object types with call signatures.","Use template literals over string concatenation.","Use `new` when throwing an error.","Don't throw non-Error values.","Use `String.trimStart()` and `String.trimEnd()` over `String.trimLeft()` and `String.trimRight()`.","Use standard constants instead of approximated literals.","Don't assign values in expressions.","Don't use async functions as Promise executors.","Don't reassign exceptions in catch clauses.","Don't reassign class members.","Don't compare against -0.","Don't use labeled statements that aren't loops.","Don't use void type outside of generic or return types.","Don't use console.","Don't use control characters and escape sequences that match control characters in regular expression literals.","Don't use debugger.","Don't assign directly to document.cookie.","Use `===` and `!==`.","Don't use duplicate case labels.","Don't use duplicate class members.","Don't use duplicate conditions in if-else-if chains.","Don't use two keys with the same name inside objects.","Don't use duplicate function parameter names.","Don't have duplicate hooks in describe blocks.","Don't use empty block statements and static blocks.","Don't let switch clauses fall through.","Don't reassign function declarations.","Don't allow assignments to native objects and read-only global variables.","Use Number.isFinite instead of global isFinite.","Use Number.isNaN instead of global isNaN.","Don't assign to imported bindings.","Don't use irregular whitespace characters.","Don't use labels that share a name with a variable.","Don't use characters made with multiple code points in character class syntax.","Make sure to use new and constructor properly.","Don't use shorthand assign when the variable appears on both sides.","Don't use octal escape sequences in string literals.","Don't use Object.prototype builtins directly.","Don't redeclare variables, functions, classes, and types in the same scope.",`Don't have redundant "use strict".`,"Don't compare things where both sides are exactly the same.","Don't let identifiers shadow restricted names.","Don't use sparse arrays (arrays with holes).","Don't use template literal placeholder syntax in regular strings.","Don't use the then property.","Don't use unsafe negation.","Don't use var.","Don't use with statements in non-strict contexts.","Make sure async functions actually use await.","Make sure default clauses in switch statements come last.","Make sure to pass a message value when creating a built-in error.","Make sure get methods always return a value.","Use a recommended display strategy with Google Fonts.","Make sure for-in loops include an if statement.","Use Array.isArray() instead of instanceof Array.","Make sure to use the digits argument with Number#toFixed().",'Make sure to use the "use strict" directive in script files.'],Fe=["Don't use `<img>` elements in Next.js projects.","Don't use `<head>` elements in Next.js projects.","Don't import next/document outside of pages/_document.jsx in Next.js projects.","Don't use the next/head module in pages/_document.js on Next.js projects."],Ne=["Don't use export or module.exports in test files.","Don't use focused tests.","Make sure the assertion function, like expect, is placed inside an it() function call.","Don't use disabled tests."],$n=[...Pe,...Re,...Ae,...Me,...Ee,...$e,...Fe,...Ne],M=`# Project Context
125
+ \u2728 Everything looks good!`)};p();import{spawnSync as Mt}from"child_process";import xe from"process";var ee=(e,t={})=>{let s=["npx","@biomejs/biome","check","--write","--no-errors-on-unmatched"];t.unsafe&&s.push("--unsafe"),e.length>0?s.push(...F(e)):s.push("./");let n=s.join(" "),o=Mt(n,{stdio:"inherit",shell:!0});o.error&&(console.error("Failed to run Ultracite:",o.error.message),xe.exit(1)),o.status!==0&&xe.exit(o.status??1)};import{packageManagers as Et}from"nypm";var R={packageManagers:Et.map(e=>e.name),editorConfigs:["vscode","zed"],editorRules:["vscode-copilot","cursor","windsurf","zed","claude","codex","kiro","cline","amp","aider","firebase-studio","open-hands","gemini-cli","junie","augmentcode","kilo-code","goose"],integrations:["husky","lefthook","lint-staged"]};import Xe from"process";import{intro as ws,log as q,multiselect as G,spinner as m}from"@clack/prompts";import{addDevDependency as bs,detectPackageManager as ks}from"nypm";p();import{readFile as $t,writeFile as De}from"fs/promises";import Ft from"deepmerge";import{parse as Nt}from"jsonc-parser";var je={$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["ultracite"]},te=async()=>await a("./biome.json")?"./biome.json":"./biome.jsonc",U={exists:async()=>{let e=await te();return a(e)},create:async()=>{let e=await te();return De(e,JSON.stringify(je,null,2))},update:async()=>{let e=await te(),t=await $t(e,"utf-8"),n=Nt(t)||{},o=n.extends&&Array.isArray(n.extends)?n.extends:[];o.includes("ultracite")||(n.extends=[...o,"ultracite"]);let i={$schema:je.$schema},r=Ft(n,i);await De(e,JSON.stringify(r,null,2))}};p();import{spawnSync as It}from"child_process";import{mkdir as Ut,readFile as Tt,writeFile as Ce}from"fs/promises";import Ot from"deepmerge";import{parse as _t}from"jsonc-parser";var se={"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 T="./.vscode/settings.json",A={exists:()=>a(T),create:async()=>{await Ut(".vscode",{recursive:!0}),await Ce(T,JSON.stringify(se,null,2))},update:async()=>{let e=await Tt(T,"utf-8"),s=_t(e)||{},n=Ot(s,se);await Ce(T,JSON.stringify(n,null,2))},extension:()=>It("code --install-extension biomejs.biome",{stdio:"inherit",shell:!0})};p();import{mkdir as Jt,readFile as Lt,writeFile as Se}from"fs/promises";import zt from"deepmerge";import{parse as Bt}from"jsonc-parser";var ne={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 O="./.zed/settings.json",_={exists:()=>a(O),create:async()=>{await Jt(".zed",{recursive:!0}),await Se(O,JSON.stringify(ne,null,2))},update:async()=>{let e=await Lt(O,"utf-8"),s=Bt(e)||{},n=zt(s,ne);await Se(O,JSON.stringify(n,null,2))}};import{mkdir as Wt,readFile as qt,writeFile as J}from"fs/promises";import{dirname as Gt}from"path";var Pe=["Don't use `accessKey` attribute on any HTML element.",'Don\'t set `aria-hidden="true"` on focusable elements.',"Don't add ARIA roles, states, and properties to elements that don't support them.","Don't use distracting elements like `<marquee>` or `<blink>`.","Only use the `scope` prop on `<th>` elements.","Don't assign non-interactive ARIA roles to interactive HTML elements.","Make sure label elements have text content and are associated with an input.","Don't assign interactive ARIA roles to non-interactive HTML elements.","Don't assign `tabIndex` to non-interactive HTML elements.","Don't use positive integers for `tabIndex` property.",`Don't include "image", "picture", or "photo" in img alt prop.`,"Don't use explicit role property that's the same as the implicit/default role.","Make static elements with click handlers use a valid role attribute.","Always include a `title` element for SVG elements.","Give all elements requiring alt text meaningful information for screen readers.","Make sure anchors have content that's accessible to screen readers.","Assign `tabIndex` to non-interactive HTML elements with `aria-activedescendant`.","Include all required ARIA attributes for elements with ARIA roles.","Make sure ARIA properties are valid for the element's supported roles.","Always include a `type` attribute for button elements.","Make elements with interactive roles and handlers focusable.","Give heading elements content that's accessible to screen readers (not hidden with `aria-hidden`).","Always include a `lang` attribute on the html element.","Always include a `title` attribute for iframe elements.","Accompany `onClick` with at least one of: `onKeyUp`, `onKeyDown`, or `onKeyPress`.","Accompany `onMouseOver`/`onMouseOut` with `onFocus`/`onBlur`.","Include caption tracks for audio and video elements.","Use semantic elements instead of role attributes in JSX.","Make sure all anchors are valid and navigable.","Ensure all ARIA properties (`aria-*`) are valid.","Use valid, non-abstract ARIA roles for elements with ARIA roles.","Use valid ARIA state and property values.","Use valid values for the `autocomplete` attribute on input elements.","Use correct ISO language/country codes for the `lang` attribute."],Re=["Don't use consecutive spaces in regular expression literals.","Don't use the `arguments` object.","Don't use primitive type aliases or misleading types.","Don't use the comma operator.","Don't use empty type parameters in type aliases and interfaces.","Don't write functions that exceed a given Cognitive Complexity score.","Don't nest describe() blocks too deeply in test files.","Don't use unnecessary boolean casts.","Don't use unnecessary callbacks with flatMap.","Use for...of statements instead of Array.forEach.","Don't create classes that only have static members (like a static namespace).","Don't use this and super in static contexts.","Don't use unnecessary catch clauses.","Don't use unnecessary constructors.","Don't use unnecessary continue statements.","Don't export empty modules that don't change anything.","Don't use unnecessary escape sequences in regular expression literals.","Don't use unnecessary fragments.","Don't use unnecessary labels.","Don't use unnecessary nested block statements.","Don't rename imports, exports, and destructured assignments to the same name.","Don't use unnecessary string or template literal concatenation.","Don't use String.raw in template literals when there are no escape sequences.","Don't use useless case statements in switch statements.","Don't use ternary operators when simpler alternatives exist.","Don't use useless `this` aliasing.","Don't use any or unknown as type constraints.","Don't initialize variables to undefined.","Don't use the void operators (they're not familiar).","Use arrow functions instead of function expressions.","Use Date.now() to get milliseconds since the Unix Epoch.","Use .flatMap() instead of map().flat() when possible.","Use literal property access instead of computed property access.","Don't use parseInt() or Number.parseInt() when binary, octal, or hexadecimal literals work.","Use concise optional chaining instead of chained logical expressions.","Use regular expression literals instead of the RegExp constructor when possible.","Don't use number literal object member names that aren't base 10 or use underscore separators.","Remove redundant terms from logical expressions.","Use while loops instead of for loops when you don't need initializer and update expressions.","Don't pass children as props.","Don't reassign const variables.","Don't use constant expressions in conditions.","Don't use `Math.min` and `Math.max` to clamp values when the result is constant.","Don't return a value from a constructor.","Don't use empty character classes in regular expression literals.","Don't use empty destructuring patterns.","Don't call global object properties as functions.","Don't declare functions and vars that are accessible outside their block.","Make sure builtins are correctly instantiated.","Don't use super() incorrectly inside classes. Also check that super() is called in classes that extend other constructors.","Don't use variables and function parameters before they're declared.","Don't use 8 and 9 escape sequences in string literals.","Don't use literal numbers that lose precision."],Ae=["Don't use the return value of React.render.","Make sure all dependencies are correctly specified in React hooks.","Make sure all React hooks are called from the top level of component functions.","Don't forget key props in iterators and collection literals.","Don't destructure props inside JSX components in Solid projects.","Don't define React components inside other components.","Don't use event handlers on non-interactive elements.","Don't assign to React component props.","Don't use both `children` and `dangerouslySetInnerHTML` props on the same element.","Don't use dangerous JSX props.","Don't use Array index in keys.","Don't insert comments as text nodes.","Don't assign JSX properties multiple times.","Don't add extra closing tags for components without children.","Use `<>...</>` instead of `<Fragment>...</Fragment>`.",'Watch out for possible "wrong" semicolons inside JSX elements.'],Me=["Don't assign a value to itself.","Don't return a value from a setter.","Don't compare expressions that modify string case with non-compliant values.","Don't use lexical declarations in switch clauses.","Don't use variables that haven't been declared in the document.","Don't write unreachable code.","Make sure super() is called exactly once on every code path in a class constructor before this is accessed if the class has a superclass.","Don't use control flow statements in finally blocks.","Don't use optional chaining where undefined values aren't allowed.","Don't have unused function parameters.","Don't have unused imports.","Don't have unused labels.","Don't have unused private class members.","Don't have unused variables.","Make sure void (self-closing) elements don't have children.","Don't return a value from a function with the return type 'void'","Use isNaN() when checking for NaN.",'Make sure "for" loop update clauses move the counter in the right direction.',"Make sure typeof expressions are compared to valid values.","Make sure generator functions contain yield.","Don't use await inside loops.","Don't use bitwise operators.","Don't use expressions where the operation doesn't change the value.","Make sure Promise-like statements are handled appropriately.","Don't use __dirname and __filename in the global scope.","Prevent import cycles.","Don't use configured elements.","Don't hardcode sensitive data like API keys and tokens.","Don't let variable declarations shadow variables from outer scopes.","Don't use the TypeScript directive @ts-ignore.","Prevent duplicate polyfills from Polyfill.io.","Don't use useless backreferences in regular expressions that always match empty strings.","Don't use unnecessary escapes in string literals.","Don't use useless undefined.","Make sure getters and setters for the same property are next to each other in class and object definitions.","Make sure object literals are declared consistently (defaults to explicit definitions).","Use static Response methods instead of new Response() constructor when possible.","Make sure switch-case statements are exhaustive.","Make sure the `preconnect` attribute is used when using Google Fonts.","Use `Array#{indexOf,lastIndexOf}()` instead of `Array#{findIndex,findLastIndex}()` when looking for the index of an item.","Make sure iterable callbacks return consistent values.",'Use `with { type: "json" }` for JSON module imports.',"Use numeric separators in numeric literals.","Use object spread instead of `Object.assign()` when constructing new objects.","Always use the radix argument when using `parseInt()`.","Make sure JSDoc comment lines start with a single asterisk, except for the first one.","Include a description parameter for `Symbol()`.","Don't use spread (`...`) syntax on accumulators.","Don't use the `delete` operator.","Don't access namespace imports dynamically.","Don't use namespace imports.","Declare regex literals at the top level.",'Don\'t use `target="_blank"` without `rel="noopener"`.'],Ee=["Don't use TypeScript enums.","Don't export imported variables.","Don't add type annotations to variables, parameters, and class properties that are initialized with literal expressions.","Don't use TypeScript namespaces.","Don't use non-null assertions with the `!` postfix operator.","Don't use parameter properties in class constructors.","Don't use user-defined types.","Use `as const` instead of literal types and type annotations.","Use either `T[]` or `Array<T>` consistently.","Initialize each enum member value explicitly.","Use `export type` for types.","Use `import type` for types.","Make sure all enum members are literal values.","Don't use TypeScript const enum.","Don't declare empty interfaces.","Don't let variables evolve into any type through reassignments.","Don't use the any type.","Don't misuse the non-null assertion operator (!) in TypeScript files.","Don't use implicit any type on variable declarations.","Don't merge interfaces and classes unsafely.","Don't use overload signatures that aren't next to each other.","Use the namespace keyword instead of the module keyword to declare TypeScript namespaces."],$e=["Don't use global `eval()`.","Don't use callbacks in asynchronous tests and hooks.","Don't use negation in `if` statements that have `else` clauses.","Don't use nested ternary expressions.","Don't reassign function parameters.","This rule lets you specify global variable names you don't want to use in your application.","Don't use specified modules when loaded by import or require.","Don't use constants whose value is the upper-case version of their name.","Use `String.slice()` instead of `String.substr()` and `String.substring()`.","Don't use template literals if you don't need interpolation or special-character handling.","Don't use `else` blocks when the `if` block breaks early.","Don't use yoda expressions.","Don't use Array constructors.","Use `at()` instead of integer index access.","Follow curly brace conventions.","Use `else if` instead of nested `if` statements in `else` clauses.","Use single `if` statements instead of nested `if` clauses.","Use `new` for all builtins except `String`, `Number`, and `Boolean`.","Use consistent accessibility modifiers on class properties and methods.","Use `const` declarations for variables that are only assigned once.","Put default function parameters and optional function parameters last.","Include a `default` clause in switch statements.","Use the `**` operator instead of `Math.pow`.","Use `for-of` loops when you need the index to extract an item from the iterated array.","Use `node:assert/strict` over `node:assert`.","Use the `node:` protocol for Node.js builtin modules.","Use Number properties instead of global ones.","Use assignment operator shorthand where possible.","Use function types instead of object types with call signatures.","Use template literals over string concatenation.","Use `new` when throwing an error.","Don't throw non-Error values.","Use `String.trimStart()` and `String.trimEnd()` over `String.trimLeft()` and `String.trimRight()`.","Use standard constants instead of approximated literals.","Don't assign values in expressions.","Don't use async functions as Promise executors.","Don't reassign exceptions in catch clauses.","Don't reassign class members.","Don't compare against -0.","Don't use labeled statements that aren't loops.","Don't use void type outside of generic or return types.","Don't use console.","Don't use control characters and escape sequences that match control characters in regular expression literals.","Don't use debugger.","Don't assign directly to document.cookie.","Use `===` and `!==`.","Don't use duplicate case labels.","Don't use duplicate class members.","Don't use duplicate conditions in if-else-if chains.","Don't use two keys with the same name inside objects.","Don't use duplicate function parameter names.","Don't have duplicate hooks in describe blocks.","Don't use empty block statements and static blocks.","Don't let switch clauses fall through.","Don't reassign function declarations.","Don't allow assignments to native objects and read-only global variables.","Use Number.isFinite instead of global isFinite.","Use Number.isNaN instead of global isNaN.","Don't assign to imported bindings.","Don't use irregular whitespace characters.","Don't use labels that share a name with a variable.","Don't use characters made with multiple code points in character class syntax.","Make sure to use new and constructor properly.","Don't use shorthand assign when the variable appears on both sides.","Don't use octal escape sequences in string literals.","Don't use Object.prototype builtins directly.","Don't redeclare variables, functions, classes, and types in the same scope.",`Don't have redundant "use strict".`,"Don't compare things where both sides are exactly the same.","Don't let identifiers shadow restricted names.","Don't use sparse arrays (arrays with holes).","Don't use template literal placeholder syntax in regular strings.","Don't use the then property.","Don't use unsafe negation.","Don't use var.","Don't use with statements in non-strict contexts.","Make sure async functions actually use await.","Make sure default clauses in switch statements come last.","Make sure to pass a message value when creating a built-in error.","Make sure get methods always return a value.","Use a recommended display strategy with Google Fonts.","Make sure for-in loops include an if statement.","Use Array.isArray() instead of instanceof Array.","Make sure to use the digits argument with Number#toFixed().",'Make sure to use the "use strict" directive in script files.'],Fe=["Don't use `<img>` elements in Next.js projects.","Don't use `<head>` elements in Next.js projects.","Don't import next/document outside of pages/_document.jsx in Next.js projects.","Don't use the next/head module in pages/_document.js on Next.js projects."],Ne=["Don't use export or module.exports in test files.","Don't use focused tests.","Make sure the assertion function, like expect, is placed inside an it() function call.","Don't use disabled tests."],Un=[...Pe,...Re,...Ae,...Me,...Ee,...$e,...Fe,...Ne],M=`# Project Context
126
126
  Ultracite enforces strict type safety, accessibility standards, and consistent code quality for JavaScript/TypeScript projects using Biome's lightning-fast formatter and linter.
127
127
 
128
128
  ## Key Principles
@@ -203,4 +203,4 @@ alwaysApply: true
203
203
 
204
204
  ${M}`:M,n=async()=>{let o=Gt(t.path);if(o!=="."){let i=o.startsWith("./")?o.slice(2):o;await Wt(i,{recursive:!0})}};return{exists:()=>a(t.path),create:async()=>{await n(),await J(t.path,s)},update:async()=>{if(await n(),t.appendMode){if(!await a(t.path)){await J(t.path,s);return}let o=await qt(t.path,"utf-8");if(o.includes(M.trim()))return;await J(t.path,`${o}
205
205
 
206
- ${M}`)}else await J(t.path,s)}}};se();ne();ie();p();import{readFile as gs,writeFile as He}from"fs/promises";import hs from"deepmerge";import{parse as ys}from"jsonc-parser";var Ve={compilerOptions:{strictNullChecks:!0}},B="./tsconfig.json",W={exists:()=>a(B),create:()=>He(B,JSON.stringify(Ve,null,2)),update:async()=>{let e=await gs(B,"utf-8"),s=ys(e)||{},n=hs(s,Ve);await He(B,JSON.stringify(n,null,2))}};p();var Ye=h.devDependencies["@biomejs/biome"],Ke=h.version,vs=async(e,t=!0)=>{let s=m();s.start("Installing dependencies...");let n=[`ultracite@${Ke}`,`@biomejs/biome@${Ye}`];if(t)for(let o of n)await bs(o,{packageManager:e,workspace:await f()});else await C({devDependencies:{"@biomejs/biome":Ye,ultracite:Ke}});s.stop("Dependencies installed.")},xs=async()=>{let e=m();if(e.start("Checking for tsconfig.json..."),await W.exists()){e.message("tsconfig.json found, updating..."),await W.update(),e.stop("tsconfig.json updated.");return}e.message("tsconfig.json not found, creating..."),await W.create(),e.stop("tsconfig.json created.")},Ds=async()=>{let e=m();if(e.start("Checking for .vscode/settings.json..."),await A.exists()){e.message("settings.json found, updating..."),await A.update(),e.stop("settings.json updated.");return}e.message("settings.json not found, creating..."),await A.create(),e.message("settings.json created."),e.message("Installing Biome extension...");try{A.extension(),e.stop("settings.json created.")}catch(t){e.stop(`Failed to install Biome extension (${t}), but continuing...`)}},js=async()=>{let e=m();if(e.start("Checking for .zed/settings.json..."),await _.exists()){e.message("settings.json found, updating..."),await _.update(),e.stop("settings.json updated.");return}e.message("settings.json not found, creating..."),await _.create(),e.message("settings.json created. Install the Biome extension: https://biomejs.dev/reference/zed/")},Cs=async()=>{let e=m();if(e.start("Checking for Biome configuration..."),await U.exists()){e.message("Biome configuration found, updating..."),await U.update(),e.stop("Biome configuration updated.");return}e.message("Biome configuration not found, creating..."),await U.create(),e.stop("Biome configuration created.")},Ss=async(e,t=!0)=>{let s=m();if(s.start("Initializing pre-commit hooks..."),s.message("Installing Husky..."),t?await v.install(e):await C({devDependencies:{husky:"latest"}}),await v.exists()){s.message("Pre-commit hook found, updating..."),await v.update(e),s.stop("Pre-commit hook updated.");return}s.message("Pre-commit hook not found, creating..."),await v.create(e),s.stop("Pre-commit hook created.")},Ps=async(e,t=!0)=>{let s=m();if(s.start("Initializing lefthook..."),s.message("Installing lefthook..."),t?await x.install(e):await C({devDependencies:{lefthook:"latest"}}),await x.exists()){s.message("lefthook.yml found, updating..."),await x.update(e),s.stop("lefthook.yml updated.");return}s.message("lefthook.yml not found, creating..."),await x.create(e),s.stop("lefthook.yml created.")},Rs=async(e,t=!0)=>{let s=m();if(s.start("Initializing lint-staged..."),s.message("Installing lint-staged..."),t?await D.install(e):await C({devDependencies:{"lint-staged":"latest"}}),await D.exists()){s.message("lint-staged found, updating..."),await D.update(e),s.stop("lint-staged updated.");return}s.message("lint-staged not found, creating..."),await D.create(e),s.stop("lint-staged created.")},As=async(e,t)=>{let s=m();s.start(`Checking for ${t}...`);let n=Ue(e);if(await n.exists()){s.message(`${t} found, updating...`),await n.update(),s.stop(`${t} updated.`);return}s.message(`${t} not found, creating...`),await n.create(),s.stop(`${t} created.`)},Ms=async e=>{let t=m();t.start("Removing Prettier dependencies and configuration...");try{let s=await Q.remove(e);s.packagesRemoved.length>0&&t.message(`Removed Prettier packages: ${s.packagesRemoved.join(", ")}`),s.filesRemoved.length>0&&t.message(`Removed config files: ${s.filesRemoved.join(", ")}`),s.vsCodeCleaned&&t.message("Cleaned VS Code settings"),t.stop("Prettier removed successfully.")}catch{t.stop("Failed to remove Prettier completely, but continuing...")}},Es=async e=>{let t=m();t.start("Removing ESLint dependencies and configuration...");try{let s=await Z.remove(e);s.packagesRemoved.length>0&&t.message(`Removed ESLint packages: ${s.packagesRemoved.join(", ")}`),s.filesRemoved.length>0&&t.message(`Removed config files: ${s.filesRemoved.join(", ")}`),s.vsCodeCleaned&&t.message("Cleaned VS Code settings"),t.stop("ESLint removed successfully.")}catch{t.stop("Failed to remove ESLint completely, but continuing...")}},Ze=async e=>{ws(de);try{let t=e??{},{pm:s}=t;if(!s){let u=await ks(Xe.cwd());if(!u)throw new Error("No package manager specified or detected");if(u.warnings)for(let k of u.warnings)q.warn(k);q.info(`Detected lockfile, using ${u.name}`),s=u.name}let n=t.removePrettier,o=t.removeEslint;if(n===void 0||o===void 0){let u=[];if(n===void 0&&await Q.hasPrettier()&&u.push({label:"Remove Prettier (dependencies, config files, VS Code settings)",value:"prettier"}),o===void 0&&await Z.hasESLint()&&u.push({label:"Remove ESLint (dependencies, config files, VS Code settings)",value:"eslint"}),u.length>0){let k=await G({message:"Remove existing formatters/linters (recommended for clean migration)?",options:u,required:!1});n===void 0&&(n=k.includes("prettier")),o===void 0&&(o=k.includes("eslint"))}}let i=t.editors;i||(i=await G({message:"Which editors do you want to configure (recommended)?",options:[{label:"VSCode / Cursor / Windsurf",value:"vscode"},{label:"Zed",value:"zed"}],required:!1}));let r=t.rules,l={"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"};r||(r=await G({message:"Which editor rules do you want to enable (optional)?",options:Object.entries(l).map(([u,k])=>({value:u,label:k})),required:!1}));let d=t.integrations;d===void 0&&(t.pm||t.editors||t.rules||t.removePrettier!==void 0||t.removeEslint!==void 0?d=[]:d=await G({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})),n&&await Ms(s),o&&await Es(s),await vs(s,!t.skipInstall),await xs(),await Cs(),i?.includes("vscode")&&await Ds(),i?.includes("zed")&&await js();for(let u of r??[])await As(u,l[u]);d?.includes("husky")&&await Ss(s,!t.skipInstall),d?.includes("lefthook")&&await Ps(s,!t.skipInstall),d?.includes("lint-staged")&&await Rs(s,!t.skipInstall),q.success("Successfully initialized Ultracite configuration!")}catch(t){let s=t instanceof Error?t.message:"Unknown error";q.error(`Failed to initialize Ultracite configuration: ${s}`),Xe.exit(1)}};var b=Fs.initTRPC.meta().create(),Ns=b.router({init:b.procedure.meta({description:"Initialize Ultracite in the current directory"}).input(c.object({pm:c.enum(R.packageManagers).optional().describe("Package manager to use"),editors:c.array(c.enum(R.editorConfigs)).optional().describe("Editors to configure"),rules:c.array(c.enum(R.editorRules)).optional().describe("Editor rules to enable"),integrations:c.array(c.enum(R.integrations)).optional().describe("Additional integrations to enable"),removePrettier:c.boolean().optional().describe("Remove Prettier dependencies and configuration"),removeEslint:c.boolean().optional().describe("Remove ESLint dependencies and configuration"),skipInstall:c.boolean().default(!1).describe("Skip installing dependencies")})).mutation(async({input:e})=>{await Ze(e)}),check:b.procedure.meta({description:"Run Biome linter without fixing files"}).input(c.array(c.string()).optional().default([]).describe("specific files to lint")).query(({input:e})=>{K(e)}),fix:b.procedure.meta({description:"Run Biome linter and fixes files"}).input(c.tuple([c.array(c.string()).optional().default([]).describe("specific files to format"),c.object({unsafe:c.boolean().optional().describe("apply unsafe fixes")})])).mutation(({input:e})=>{let[t,s]=e;ee(t,{unsafe:s.unsafe})}),doctor:b.procedure.meta({description:"Verify your Ultracite setup and check for issues"}).query(async()=>{await be()}),lint:b.procedure.meta({description:"\u26A0\uFE0F DEPRECATED: Use 'check' instead - Run Biome linter without fixing files"}).input(c.array(c.string()).optional().default([]).describe("specific files to lint")).query(({input:e})=>{console.warn("\u26A0\uFE0F Warning: 'lint' command is deprecated. Please use 'check' instead."),K(e)}),format:b.procedure.meta({description:"\u26A0\uFE0F DEPRECATED: Use 'fix' instead - Run Biome linter and fixes files"}).input(c.tuple([c.array(c.string()).optional().default([]).describe("specific files to format"),c.object({unsafe:c.boolean().optional().describe("apply unsafe fixes")})])).mutation(({input:e})=>{let[t,s]=e;console.warn("\u26A0\uFE0F Warning: 'format' command is deprecated. Please use 'fix' instead."),ee(t,{unsafe:s.unsafe})})}),Is=$s({router:Ns,name:h.name,version:h.version,description:h.description});process.env.VITEST||Is.run();export{Ns as router};
206
+ ${M}`)}else await J(t.path,s)}}};oe();ie();re();p();import{readFile as gs,writeFile as He}from"fs/promises";import hs from"deepmerge";import{parse as ys}from"jsonc-parser";var Ve={compilerOptions:{strictNullChecks:!0}},B="./tsconfig.json",W={exists:()=>a(B),create:()=>He(B,JSON.stringify(Ve,null,2)),update:async()=>{let e=await gs(B,"utf-8"),s=ys(e)||{},n=hs(s,Ve);await He(B,JSON.stringify(n,null,2))}};p();var Ye=h.devDependencies["@biomejs/biome"],Ke=h.version,vs=async(e,t=!0)=>{let s=m();s.start("Installing dependencies...");let n=[`ultracite@${Ke}`,`@biomejs/biome@${Ye}`];if(t)for(let o of n)await bs(o,{packageManager:e,workspace:await f()});else await C({devDependencies:{"@biomejs/biome":Ye,ultracite:Ke}});s.stop("Dependencies installed.")},xs=async()=>{let e=m();if(e.start("Checking for tsconfig.json..."),await W.exists()){e.message("tsconfig.json found, updating..."),await W.update(),e.stop("tsconfig.json updated.");return}e.message("tsconfig.json not found, creating..."),await W.create(),e.stop("tsconfig.json created.")},Ds=async()=>{let e=m();if(e.start("Checking for .vscode/settings.json..."),await A.exists()){e.message("settings.json found, updating..."),await A.update(),e.stop("settings.json updated.");return}e.message("settings.json not found, creating..."),await A.create(),e.message("settings.json created."),e.message("Installing Biome extension...");try{A.extension(),e.stop("settings.json created.")}catch(t){e.stop(`Failed to install Biome extension (${t}), but continuing...`)}},js=async()=>{let e=m();if(e.start("Checking for .zed/settings.json..."),await _.exists()){e.message("settings.json found, updating..."),await _.update(),e.stop("settings.json updated.");return}e.message("settings.json not found, creating..."),await _.create(),e.message("settings.json created. Install the Biome extension: https://biomejs.dev/reference/zed/")},Cs=async()=>{let e=m();if(e.start("Checking for Biome configuration..."),await U.exists()){e.message("Biome configuration found, updating..."),await U.update(),e.stop("Biome configuration updated.");return}e.message("Biome configuration not found, creating..."),await U.create(),e.stop("Biome configuration created.")},Ss=async(e,t=!0)=>{let s=m();if(s.start("Initializing pre-commit hooks..."),s.message("Installing Husky..."),t?await v.install(e):await C({devDependencies:{husky:"latest"}}),await v.exists()){s.message("Pre-commit hook found, updating..."),await v.update(e),s.stop("Pre-commit hook updated.");return}s.message("Pre-commit hook not found, creating..."),await v.create(e),s.stop("Pre-commit hook created.")},Ps=async(e,t=!0)=>{let s=m();if(s.start("Initializing lefthook..."),s.message("Installing lefthook..."),t?await x.install(e):await C({devDependencies:{lefthook:"latest"}}),await x.exists()){s.message("lefthook.yml found, updating..."),await x.update(e),s.stop("lefthook.yml updated.");return}s.message("lefthook.yml not found, creating..."),await x.create(e),s.stop("lefthook.yml created.")},Rs=async(e,t=!0)=>{let s=m();if(s.start("Initializing lint-staged..."),s.message("Installing lint-staged..."),t?await D.install(e):await C({devDependencies:{"lint-staged":"latest"}}),await D.exists()){s.message("lint-staged found, updating..."),await D.update(e),s.stop("lint-staged updated.");return}s.message("lint-staged not found, creating..."),await D.create(e),s.stop("lint-staged created.")},As=async(e,t)=>{let s=m();s.start(`Checking for ${t}...`);let n=Ue(e);if(await n.exists()){s.message(`${t} found, updating...`),await n.update(),s.stop(`${t} updated.`);return}s.message(`${t} not found, creating...`),await n.create(),s.stop(`${t} created.`)},Ms=async e=>{let t=m();t.start("Removing Prettier dependencies and configuration...");try{let s=await Q.remove(e);s.packagesRemoved.length>0&&t.message(`Removed Prettier packages: ${s.packagesRemoved.join(", ")}`),s.filesRemoved.length>0&&t.message(`Removed config files: ${s.filesRemoved.join(", ")}`),s.vsCodeCleaned&&t.message("Cleaned VS Code settings"),t.stop("Prettier removed successfully.")}catch{t.stop("Failed to remove Prettier completely, but continuing...")}},Es=async e=>{let t=m();t.start("Removing ESLint dependencies and configuration...");try{let s=await Z.remove(e);s.packagesRemoved.length>0&&t.message(`Removed ESLint packages: ${s.packagesRemoved.join(", ")}`),s.filesRemoved.length>0&&t.message(`Removed config files: ${s.filesRemoved.join(", ")}`),s.vsCodeCleaned&&t.message("Cleaned VS Code settings"),t.stop("ESLint removed successfully.")}catch{t.stop("Failed to remove ESLint completely, but continuing...")}},Ze=async e=>{ws(pe);try{let t=e??{},{pm:s}=t;if(!s){let u=await ks(Xe.cwd());if(!u)throw new Error("No package manager specified or detected");if(u.warnings)for(let k of u.warnings)q.warn(k);q.info(`Detected lockfile, using ${u.name}`),s=u.name}let n=t.removePrettier,o=t.removeEslint;if(n===void 0||o===void 0){let u=[];if(n===void 0&&await Q.hasPrettier()&&u.push({label:"Remove Prettier (dependencies, config files, VS Code settings)",value:"prettier"}),o===void 0&&await Z.hasEsLint()&&u.push({label:"Remove ESLint (dependencies, config files, VS Code settings)",value:"eslint"}),u.length>0){let k=await G({message:"Remove existing formatters/linters (recommended for clean migration)?",options:u,required:!1});n===void 0&&(n=k.includes("prettier")),o===void 0&&(o=k.includes("eslint"))}}let i=t.editors;i||(i=await G({message:"Which editors do you want to configure (recommended)?",options:[{label:"VSCode / Cursor / Windsurf",value:"vscode"},{label:"Zed",value:"zed"}],required:!1}));let r=t.rules,l={"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"};r||(r=await G({message:"Which editor rules do you want to enable (optional)?",options:Object.entries(l).map(([u,k])=>({value:u,label:k})),required:!1}));let d=t.integrations;d===void 0&&(t.pm||t.editors||t.rules||t.removePrettier!==void 0||t.removeEslint!==void 0?d=[]:d=await G({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})),n&&await Ms(s),o&&await Es(s),await vs(s,!t.skipInstall),await xs(),await Cs(),i?.includes("vscode")&&await Ds(),i?.includes("zed")&&await js();for(let u of r??[])await As(u,l[u]);d?.includes("husky")&&await Ss(s,!t.skipInstall),d?.includes("lefthook")&&await Ps(s,!t.skipInstall),d?.includes("lint-staged")&&await Rs(s,!t.skipInstall),q.success("Successfully initialized Ultracite configuration!")}catch(t){let s=t instanceof Error?t.message:"Unknown error";q.error(`Failed to initialize Ultracite configuration: ${s}`),Xe.exit(1)}};var b=$s.meta().create(),Ns=b.router({init:b.procedure.meta({description:"Initialize Ultracite in the current directory"}).input(c.object({pm:c.enum(R.packageManagers).optional().describe("Package manager to use"),editors:c.array(c.enum(R.editorConfigs)).optional().describe("Editors to configure"),rules:c.array(c.enum(R.editorRules)).optional().describe("Editor rules to enable"),integrations:c.array(c.enum(R.integrations)).optional().describe("Additional integrations to enable"),removePrettier:c.boolean().optional().describe("Remove Prettier dependencies and configuration"),removeEslint:c.boolean().optional().describe("Remove ESLint dependencies and configuration"),skipInstall:c.boolean().default(!1).describe("Skip installing dependencies")})).mutation(async({input:e})=>{await Ze(e)}),check:b.procedure.meta({description:"Run Biome linter without fixing files"}).input(c.array(c.string()).optional().default([]).describe("specific files to lint")).query(({input:e})=>{K(e)}),fix:b.procedure.meta({description:"Run Biome linter and fixes files"}).input(c.tuple([c.array(c.string()).optional().default([]).describe("specific files to format"),c.object({unsafe:c.boolean().optional().describe("apply unsafe fixes")})])).mutation(({input:e})=>{let[t,s]=e;ee(t,{unsafe:s.unsafe})}),doctor:b.procedure.meta({description:"Verify your Ultracite setup and check for issues"}).query(async()=>{await ve()}),lint:b.procedure.meta({description:"\u26A0\uFE0F DEPRECATED: Use 'check' instead - Run Biome linter without fixing files"}).input(c.array(c.string()).optional().default([]).describe("specific files to lint")).query(({input:e})=>{console.warn("\u26A0\uFE0F Warning: 'lint' command is deprecated. Please use 'check' instead."),K(e)}),format:b.procedure.meta({description:"\u26A0\uFE0F DEPRECATED: Use 'fix' instead - Run Biome linter and fixes files"}).input(c.tuple([c.array(c.string()).optional().default([]).describe("specific files to format"),c.object({unsafe:c.boolean().optional().describe("apply unsafe fixes")})])).mutation(({input:e})=>{let[t,s]=e;console.warn("\u26A0\uFE0F Warning: 'format' command is deprecated. Please use 'fix' instead."),ee(t,{unsafe:s.unsafe})})}),Is=Fs({router:Ns,name:h.name,version:h.version,description:h.description});process.env.VITEST||Is.run();export{Ns 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": "5.3.11",
4
+ "version": "5.4.0",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "ultracite": "dist/index.js"
@@ -40,19 +40,20 @@
40
40
  "devDependencies": {
41
41
  "@auto-it/all-contributors": "^11.3.0",
42
42
  "@auto-it/first-time-contributor": "^11.3.0",
43
- "@biomejs/biome": "2.2.2",
44
- "@types/node": "^24.3.0",
43
+ "@biomejs/biome": "2.2.4",
44
+ "@types/node": "^24.5.2",
45
45
  "@vitest/coverage-v8": "3.2.4",
46
46
  "tsup": "^8.5.0"
47
47
  },
48
48
  "dependencies": {
49
49
  "@clack/prompts": "^0.11.0",
50
+ "@trpc/server": "^11.5.1",
50
51
  "deepmerge": "^4.3.1",
51
52
  "jsonc-parser": "^3.3.1",
52
- "nypm": "^0.6.1",
53
- "trpc-cli": "^0.10.2",
53
+ "nypm": "^0.6.2",
54
+ "trpc-cli": "^0.11.0",
54
55
  "vitest": "^3.2.4",
55
- "zod": "^4.1.5"
56
+ "zod": "^4.1.11"
56
57
  },
57
- "packageManager": "pnpm@10.15.0"
58
+ "packageManager": "pnpm@10.17.0"
58
59
  }