ultracite 6.5.1 → 7.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/config/biome/angular/biome.jsonc +9 -0
- package/config/{astro → biome/astro}/biome.jsonc +1 -1
- package/config/{core → biome/core}/biome.jsonc +45 -44
- package/config/{next → biome/next}/biome.jsonc +1 -1
- package/config/{qwik → biome/qwik}/biome.jsonc +1 -1
- package/config/{react → biome/react}/biome.jsonc +1 -1
- package/config/{remix → biome/remix}/biome.jsonc +1 -1
- package/config/{solid → biome/solid}/biome.jsonc +1 -1
- package/config/{svelte → biome/svelte}/biome.jsonc +1 -1
- package/config/{vue → biome/vue}/biome.jsonc +1 -1
- package/config/eslint/angular/eslint.config.mjs +18 -0
- package/config/eslint/angular/rules/angular.mjs +17 -0
- package/config/eslint/astro/eslint.config.mjs +18 -0
- package/config/eslint/astro/rules/astro.mjs +17 -0
- package/config/eslint/core/eslint.config.mjs +168 -0
- package/config/eslint/core/rules/compat.mjs +5 -0
- package/config/eslint/core/rules/cypress.mjs +17 -0
- package/config/eslint/core/rules/eslint-typescript.mjs +43 -0
- package/config/eslint/core/rules/eslint.mjs +30 -0
- package/config/eslint/core/rules/github.mjs +19 -0
- package/config/eslint/core/rules/import.mjs +44 -0
- package/config/eslint/core/rules/jest.mjs +17 -0
- package/config/eslint/core/rules/n.mjs +24 -0
- package/config/eslint/core/rules/prettier.mjs +5 -0
- package/config/eslint/core/rules/promise.mjs +20 -0
- package/config/eslint/core/rules/sonarjs.mjs +19 -0
- package/config/eslint/core/rules/storybook.mjs +17 -0
- package/config/eslint/core/rules/tailwindcss.mjs +22 -0
- package/config/eslint/core/rules/typescript.mjs +62 -0
- package/config/eslint/core/rules/unicorn.mjs +34 -0
- package/config/eslint/core/rules/unused-imports.mjs +17 -0
- package/config/eslint/next/eslint.config.mjs +18 -0
- package/config/eslint/next/rules/next.mjs +17 -0
- package/config/eslint/qwik/eslint.config.mjs +18 -0
- package/config/eslint/qwik/rules/qwik.mjs +17 -0
- package/config/eslint/react/eslint.config.mjs +43 -0
- package/config/eslint/react/rules/jsx-a11y.mjs +27 -0
- package/config/eslint/react/rules/query.mjs +15 -0
- package/config/eslint/react/rules/react-hooks.mjs +17 -0
- package/config/eslint/react/rules/react.mjs +46 -0
- package/config/eslint/remix/eslint.config.mjs +18 -0
- package/config/eslint/remix/rules/remix.mjs +17 -0
- package/config/eslint/solid/eslint.config.mjs +18 -0
- package/config/eslint/solid/rules/solid.mjs +17 -0
- package/config/eslint/svelte/eslint.config.mjs +18 -0
- package/config/eslint/svelte/rules/svelte.mjs +17 -0
- package/config/eslint/vue/eslint.config.mjs +18 -0
- package/config/eslint/vue/rules/vue.mjs +17 -0
- package/config/oxlint/angular/.oxlintrc.json +4 -0
- package/config/oxlint/astro/.oxlintrc.json +4 -0
- package/config/oxlint/core/.oxlintrc.json +92 -0
- package/config/oxlint/next/.oxlintrc.json +13 -0
- package/config/oxlint/qwik/.oxlintrc.json +4 -0
- package/config/oxlint/react/.oxlintrc.json +18 -0
- package/config/oxlint/remix/.oxlintrc.json +4 -0
- package/config/oxlint/solid/.oxlintrc.json +4 -0
- package/config/oxlint/svelte/.oxlintrc.json +4 -0
- package/config/oxlint/vue/.oxlintrc.json +5 -0
- package/config/prettier/prettier.config.mjs +14 -0
- package/config/stylelint/stylelint.config.mjs +38 -0
- package/dist/aider-K7JLZT2D.svg +1 -0
- package/dist/amazon-q-TSOJNPXB.svg +1 -0
- package/dist/amp-EV4LVL5I.svg +1 -0
- package/dist/antigravity-JVONECNW.svg +1 -0
- package/dist/augmentcode-Q62PVXKO.svg +1 -0
- package/dist/biome-TVLEY2T4.svg +1 -0
- package/dist/claude-6DLEHRDQ.svg +1 -0
- package/dist/cline-6HWKIYN7.svg +1 -0
- package/dist/codex-NQZ5TJCL.svg +1 -0
- package/dist/copilot-L2IY45R2.svg +1 -0
- package/dist/crush-LYLRDQGZ.svg +1 -0
- package/dist/cursor-GQNH5LCA.svg +1 -0
- package/dist/droid-266OHJBT.svg +1 -0
- package/dist/eslint-7IULJKW7.svg +1 -0
- package/dist/firebase-studio-ILLWWYU7.svg +1 -0
- package/dist/firebender-UNO6LSZG.svg +1 -0
- package/dist/gemini-OYS6V4BH.svg +1 -0
- package/dist/goose-XBIEVD4H.svg +1 -0
- package/dist/index.d.ts +6 -15
- package/dist/index.js +84 -52
- package/dist/jules-HJPVWU73.svg +1 -0
- package/dist/junie-RUWBUV6N.svg +1 -0
- package/dist/kilo-code-4QYUYY2E.svg +1 -0
- package/dist/kiro-N2M256R6.svg +1 -0
- package/dist/open-hands-K5EYKO6T.svg +1 -0
- package/dist/opencode-K3274JKQ.svg +1 -0
- package/dist/oxlint-5IE3ABOZ.svg +1 -0
- package/dist/prettier-O4V2FSEA.svg +1 -0
- package/dist/qwen-N3D5CQYL.svg +1 -0
- package/dist/roo-code-CVLBTS7D.svg +1 -0
- package/dist/stylelint-DEBSWZVS.svg +1 -0
- package/dist/trae-RXVCFBOF.svg +1 -0
- package/dist/void-NYH3U3BB.svg +1 -0
- package/dist/vscode-DEOUEB65.svg +1 -0
- package/dist/warp-OZKAAQRT.svg +1 -0
- package/dist/windsurf-5T7JOTST.svg +1 -0
- package/dist/zed-SIARPESF.svg +1 -0
- package/package.json +50 -9
- package/config/angular/biome.jsonc +0 -9
package/dist/index.js
CHANGED
|
@@ -1,14 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
888 888 888 88888888888 8888888b. d8888 .d8888b. 8888888 88888888888 8888888888
|
|
4
|
-
888 888 888 888 888 Y88b d88888 d88P Y88b 888 888 888
|
|
5
|
-
888 888 888 888 888 888 d88P888 888 888 888 888 888
|
|
6
|
-
888 888 888 888 888 d88P d88P 888 888 888 888 8888888
|
|
7
|
-
888 888 888 888 8888888P" d88P 888 888 888 888 888
|
|
8
|
-
888 888 888 888 888 T88b d88P 888 888 888 888 888 888
|
|
9
|
-
Y88b. .d88P 888 888 888 T88b d8888888888 Y88b d88P 888 888 888
|
|
10
|
-
"Y88888P" 88888888 888 888 T88b d88P 888 "Y8888P" 8888888 888 8888888888
|
|
11
|
-
`,v=async({dependencies:e,devDependencies:t,scripts:s})=>{let n=await Fe("package.json","utf8"),o=JSON.parse(n),i={...o};(o.devDependencies||t)&&(i.devDependencies={...o.devDependencies,...t}),(o.dependencies||e)&&(i.dependencies={...o.dependencies,...e}),(o.scripts||s)&&(i.scripts={...o.scripts,...s}),await Ft("package.json",JSON.stringify(i,null,2))},Ot=/[ $(){}[\]&|;<>!"'`*?#~]/,Dt=/'/g,K=e=>e.map(t=>Ot.test(t)?`'${t.replace(Dt,"'\\''")}' `:t)});var st={};z(st,{husky:()=>S});import{execSync as Os}from"child_process";import{mkdir as Ds,readFile as Ms,writeFile as et}from"fs/promises";import{addDevDependency as Ts,dlxCommand as ke}from"nypm";var tt,ie,S,be=F(()=>{"use strict";h();tt=e=>`#!/bin/sh
|
|
2
|
+
var z1=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var de=Object.getOwnPropertyNames;var fe=Object.prototype.hasOwnProperty;var C1=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,i)=>(typeof require<"u"?require:e)[i]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')}),G1=t=>e=>{var i=t[e];if(i)return i();throw new Error("Module not found in bundle: "+e)};var $=(t,e)=>()=>(t&&(e=t(t=0)),e);var e1=(t,e)=>{for(var i in e)z1(t,i,{get:e[i],enumerable:!0})},me=(t,e,i,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of de(e))!fe.call(t,n)&&n!==i&&z1(t,n,{get:()=>e[n],enumerable:!(o=le(e,n))||o.enumerable});return t};var i1=t=>me(z1({},"__esModule",{value:!0}),t);import{access as s2,mkdir as r2,readFile as Ct,writeFile as a2}from"fs/promises";import{dirname as c2}from"path";import{parse as l2}from"jsonc-parser";var c,z,k,d2,f2,u,b,m2,p2,g2,r1,f=$(()=>{"use strict";c=async t=>{try{return await s2(t),!0}catch{return!1}},z=async()=>{if(await c("pnpm-workspace.yaml"))return!0;try{let t=l2(await Ct("package.json","utf-8"));return t?!!t.workspaces||!!t.workspace:!1}catch{return!1}},k=async({dependencies:t,devDependencies:e,scripts:i})=>{let o=await Ct("package.json","utf8"),n=JSON.parse(o),s={...n};(n.devDependencies||e)&&(s.devDependencies={...n.devDependencies,...e}),(n.dependencies||t)&&(s.dependencies={...n.dependencies,...t}),(n.scripts||i)&&(s.scripts={...n.scripts,...i}),await a2("package.json",JSON.stringify(s,null,2))},d2=/[ $(){}[\]&|;<>!"'`*?#~]/,f2=/'/g,u=t=>t.map(e=>d2.test(e)?`'${e.replace(f2,"'\\''")}' `:e),b=async t=>{let e=c2(t);if(e!=="."){let i=e.startsWith("./")?e.slice(2):e;await r2(i,{recursive:!0})}},m2=["./biome.json","./biome.jsonc"],p2=["./eslint.config.mjs","./eslint.config.js","./eslint.config.cjs","./eslint.config.ts","./eslint.config.mts","./eslint.config.cts"],g2="./.oxlintrc.json",r1=async()=>{for(let t of m2)if(await c(t))return"biome";for(let t of p2)if(await c(t))return"eslint";return await c(g2)?"oxlint":null}});var _t={};e1(_t,{husky:()=>B});import{execSync as X2}from"child_process";import{mkdir as Q2,readFile as K2,writeFile as Ft}from"fs/promises";import{addDevDependency as Y2,dlxCommand as O1}from"nypm";var $t,f1,B,B1=$(()=>{"use strict";f();$t=t=>`#!/bin/sh
|
|
12
3
|
# Exit on any error
|
|
13
4
|
set -e
|
|
14
5
|
|
|
@@ -31,7 +22,7 @@ git stash push --quiet --keep-index --message "pre-commit-stash" || true
|
|
|
31
22
|
STASHED=$?
|
|
32
23
|
|
|
33
24
|
# Run formatter on the staged files
|
|
34
|
-
${
|
|
25
|
+
${t}
|
|
35
26
|
FORMAT_EXIT_CODE=$?
|
|
36
27
|
|
|
37
28
|
# Restore working directory state
|
|
@@ -76,10 +67,10 @@ if [ "$STAGED_HASH" != "$NEW_STAGED_HASH" ]; then
|
|
|
76
67
|
fi
|
|
77
68
|
|
|
78
69
|
exit $FORMAT_EXIT_CODE
|
|
79
|
-
`,
|
|
80
|
-
${
|
|
70
|
+
`,f1="./.husky/pre-commit",B={exists:()=>c(f1),install:async t=>{await Y2("husky",{packageManager:t,workspace:await z(),silent:!0}),await k({scripts:{prepare:"husky"}})},init:t=>{let e=O1(t,"husky",{args:["init"]});try{X2(e,{stdio:"pipe"})}catch{}},create:async t=>{await Q2(".husky",{recursive:!0});let e=O1(t,"ultracite",{args:["fix"],short:t==="npm"}),i=$t(e);await Ft(f1,i)},update:async t=>{let e=await K2(f1,"utf-8"),i=O1(t,"ultracite",{args:["fix"],short:t==="npm"}),o=$t(i);await Ft(f1,`${e}
|
|
71
|
+
${o}`)}}});var Dt={};e1(Dt,{lefthook:()=>W});import{execSync as Z2}from"child_process";import{readFile as q2,writeFile as Q}from"fs/promises";import{addDevDependency as t3,dlxCommand as Lt}from"nypm";var e3,i3,Rt,I,Ut,W,I1=$(()=>{"use strict";f();e3=/(pre-commit:\s*\n\s*jobs:\s*\n)/,i3=/(pre-commit:\s*\n)/,Rt=t=>Lt(t,"ultracite",{args:["fix"],short:t==="npm"}),I="./lefthook.yml",Ut=t=>`pre-commit:
|
|
81
72
|
jobs:
|
|
82
|
-
- run: ${
|
|
73
|
+
- run: ${Rt(t)}
|
|
83
74
|
glob:
|
|
84
75
|
- "*.js"
|
|
85
76
|
- "*.jsx"
|
|
@@ -89,7 +80,7 @@ ${n}`)}}});var rt={};z(rt,{lefthook:()=>O});import{execSync as Us}from"child_pro
|
|
|
89
80
|
- "*.jsonc"
|
|
90
81
|
- "*.css"
|
|
91
82
|
stage_fixed: true
|
|
92
|
-
`,
|
|
83
|
+
`,W={exists:()=>c(I),install:async t=>{await t3("lefthook",{packageManager:t,workspace:await z(),silent:!0}),await k({scripts:{prepare:"lefthook install"}});let e=Lt(t,"lefthook",{args:["install"],short:t==="npm"});Z2(e,{stdio:"pipe"})},create:async t=>{let e=Ut(t);await Q(I,e)},update:async t=>{let e=await q2(I,"utf-8"),i=Rt(t),o=Ut(t);if(e.includes(i))return;if(e.startsWith("# EXAMPLE USAGE:")){await Q(I,o);return}if(e.includes("pre-commit:"))if(e.includes("jobs:")){let s=` - run: ${i}
|
|
93
84
|
glob:
|
|
94
85
|
- "*.js"
|
|
95
86
|
- "*.jsx"
|
|
@@ -98,9 +89,9 @@ ${n}`)}}});var rt={};z(rt,{lefthook:()=>O});import{execSync as Us}from"child_pro
|
|
|
98
89
|
- "*.json"
|
|
99
90
|
- "*.jsonc"
|
|
100
91
|
- "*.css"
|
|
101
|
-
stage_fixed: true`,
|
|
102
|
-
`);await
|
|
103
|
-
- run: ${
|
|
92
|
+
stage_fixed: true`,r=e.replace(e3,`$1${s}
|
|
93
|
+
`);await Q(I,r)}else{let s=` jobs:
|
|
94
|
+
- run: ${i}
|
|
104
95
|
glob:
|
|
105
96
|
- "*.js"
|
|
106
97
|
- "*.jsx"
|
|
@@ -109,57 +100,83 @@ ${n}`)}}});var rt={};z(rt,{lefthook:()=>O});import{execSync as Us}from"child_pro
|
|
|
109
100
|
- "*.json"
|
|
110
101
|
- "*.jsonc"
|
|
111
102
|
- "*.css"
|
|
112
|
-
stage_fixed: true`,
|
|
113
|
-
`);await
|
|
114
|
-
${
|
|
103
|
+
stage_fixed: true`,r=e.replace(i3,`$1${s}
|
|
104
|
+
`);await Q(I,r)}else await Q(I,`${e}
|
|
105
|
+
${o}`)}}});var Tt={};e1(Tt,{preCommit:()=>Y});import{readFile as o3,writeFile as F1}from"fs/promises";import{dlxCommand as n3}from"nypm";var K,s3,Nt,r3,Y,$1=$(()=>{"use strict";f();K="./.pre-commit-config.yaml",s3=/^repos:\s*\n/m,Nt=t=>n3(t,"ultracite",{args:["fix"],short:t==="npm"}),r3=t=>`repos:
|
|
115
106
|
- repo: local
|
|
116
107
|
hooks:
|
|
117
108
|
- id: ultracite
|
|
118
109
|
name: ultracite
|
|
119
|
-
entry: ${
|
|
110
|
+
entry: ${Nt(t)}
|
|
120
111
|
language: system
|
|
121
112
|
types_or: [javascript, jsx, ts, tsx, json, css]
|
|
122
113
|
pass_filenames: false
|
|
123
|
-
`,
|
|
114
|
+
`,Y={exists:()=>c(K),create:async t=>{let e=r3(t);await F1(K,e)},update:async t=>{let e=await o3(K,"utf-8"),i=Nt(t);if(e.includes("id: ultracite"))return;let o=` - repo: local
|
|
124
115
|
hooks:
|
|
125
116
|
- id: ultracite
|
|
126
117
|
name: ultracite
|
|
127
|
-
entry: ${
|
|
118
|
+
entry: ${i}
|
|
128
119
|
language: system
|
|
129
120
|
types_or: [javascript, jsx, ts, tsx, json, css]
|
|
130
121
|
pass_filenames: false
|
|
131
|
-
`;if(
|
|
132
|
-
${
|
|
122
|
+
`;if(e.includes("repos:")){let n=e.replace(s3,`repos:
|
|
123
|
+
${o}`);await F1(K,n)}else await F1(K,`${e}
|
|
133
124
|
repos:
|
|
134
|
-
${
|
|
135
|
-
`).filter(
|
|
136
|
-
`;for(let
|
|
137
|
-
`}else
|
|
138
|
-
`;return
|
|
139
|
-
`;await
|
|
140
|
-
`;await
|
|
141
|
-
`);return{line:n.length,column:(n.at(-1)?.length??0)+1}},xt=(e,t)=>{let s=e.split(`
|
|
142
|
-
`),{line:n,column:o}=Ae(e,t),i=[],a=Math.max(1,n-1),r=Math.min(s.length,n+2);for(let c=a;c<=r;c++){let p=String(c).padStart(5," "),u=s[c-1]||"";if(c===n){i.push(`${b(">")}${l.dim(p)} ${l.gray("\u2502")} ${u}`);let x=" ".repeat(o-1),y=Math.min(t[1]-t[0],u.length-o+1),m="^".repeat(Math.max(1,y));i.push(`${l.dim(" ")} ${l.gray("\u2502")} ${x}${b(m)}`)}else i.push(` ${l.dim(p)} ${l.gray("\u2502")} ${u}`)}return i},vt=e=>{let t=e.secs*1e3+e.nanos/1e6;return t<1e3?`${Math.round(t)}ms`:`${(t/1e3).toFixed(2)}s`},Ct=l.dim("\u2500".repeat(60)),jt=e=>e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase(),Pt=e=>{let t=e.split("/");if(t.length<3||t[0]!=="lint")return null;let s=t.at(-1);return s?`https://biomejs.dev/linter/rules/${jt(s)}/`:null},$t=e=>["",`${b("Ultracite")} ${b(`v${k.version}`)} ${e}`],St=(e,t)=>{let s=[],n=e.changed+e.unchanged,o=e.errors+e.warnings,i=vt(e.duration);if(o>0){let r=o!==1?"errors":"error";s.push(`${l.dim("Found")} ${o} ${r}${l.dim(".")}`)}let a=n!==1?"files":"file";if(s.push(`${l.green("\u2713")} ${l.dim("Finished in")} ${i} ${l.dim("on")} ${n} ${a}${l.dim(".")}`),t==="fix"&&e.changed>0){let r=e.changed!==1?"files":"file";s.push(`${l.dim("Fixed")} ${e.changed} ${r}${l.dim(".")}`)}if(t==="fix"&&e.suggestedFixesSkipped>0){let r=e.suggestedFixesSkipped!==1?"fixes":"fix";s.push(`${l.yellow("!")} ${l.dim("Skipped")} ${e.suggestedFixesSkipped} ${l.dim("unsafe")} ${r}${l.dim(".")}`),s.push(` ${l.dim("Run with")} ${l.cyan("--unsafe")} ${l.dim("to apply them.")}`)}return s},Rt=e=>{let t=[],{location:s,category:n,description:o,advices:i}=e,a=s.path.file,r=a;if(s.span&&s.sourceCode){let{line:p,column:u}=Ae(s.sourceCode,s.span);r=`${a}:${p}:${u}`}if(t.push(`${b(r)} ${l.dim(n)}`),t.push(l.dim(o)),s.span&&s.sourceCode){t.push("");let p=xt(s.sourceCode,s.span);for(let u of p)t.push(` ${u}`)}for(let p of i.advices)if(p.log){let[u,x]=p.log,y=b(u==="info"?"i":"!"),m=l.dim(x.map(g=>g.content).join(""));t.push(""),t.push(` ${y} ${m}`)}let c=Pt(n);return c&&(t.push(""),t.push(` ${l.cyan("\u2192")} ${l.dim("Docs:")} ${l.cyan(c)}`)),t.push(""),t.push(`${Ct}`),t.push(""),t},Et=(e,t)=>{if(e.length===0)return[];let s=[""],n=t==="fix"?"Here are the issues we couldn't fix automatically:":"Issues found:";s.push(`${l.yellow(n)}`),s.push("");for(let o of e)s.push(...Rt(o));return s},V=(e,t)=>{if(!e.trim())return{output:`${b("Ultracite")} ${b(`v${k.version}`)} ${l.magenta(t)}
|
|
143
|
-
${l.red("Error:")} No output received from Biome. The command may have failed silently.`,hasErrors:!0};try{let s=JSON.parse(e),{summary:n,diagnostics:o}=s;return{output:[...$t(t),...St(n,t),...Et(o,t)].join(`
|
|
144
|
-
`),hasErrors:n.errors>0}}catch{return{output:`${b("Ultracite")} ${b(`v${k.version}`)} ${l.magenta(t)}
|
|
145
|
-
${l.red("Error:")} Failed to parse Biome output.
|
|
146
|
-
|
|
147
|
-
Raw output:
|
|
148
|
-
${e}`,hasErrors:!0}}};h();var fe=async e=>{let t=e?.[0]||[],s=e?.[1]["diagnostic-level"],n=["check","--no-errors-on-unmatched","--reporter=json"];s&&n.push(`--diagnostic-level=${s}`),t.length>0?n.push(...K(t)):n.push("./");let i=(await Ut(Tt.cwd()))?.name||"npm",a=It(i,"@biomejs/biome",{args:n,short:i==="npm"}),r=Mt(a,{stdio:"pipe",shell:!0,maxBuffer:100*1024*1024});if(r.error)throw new Error(`Failed to run Ultracite: ${r.error.message}`);let c=r.stdout?.toString()||"",p=r.stderr?.toString()||"",u=c.trim().startsWith("{")?c:p,{output:x,hasErrors:y}=V(u,"check");return console.log(x),{hasErrors:y}};import{spawnSync as qt}from"child_process";import{existsSync as I}from"fs";import{readFile as Ie}from"fs/promises";import{join as _}from"path";import $ from"process";import{intro as es,log as Z,outro as ue,spinner as ts}from"@clack/prompts";import{parse as ss}from"jsonc-parser";import{detectPackageManager as _e,dlxCommand as Je}from"nypm";h();import{readFile as Ne,unlink as _t,writeFile as Jt}from"fs/promises";import{parse as Oe}from"jsonc-parser";import{removeDependency as Bt}from"nypm";var X=[".eslintrc",".eslintrc.js",".eslintrc.json",".eslintrc.yml",".eslintrc.yaml",".eslintrc.config.js","eslint.config.js","eslint.config.mjs","eslint.config.cjs",".eslintignore"],De=async()=>{try{let e=await Ne("package.json","utf-8"),t=Oe(e);if(!t||typeof t!="object")return[];let s=t.dependencies||{},n=t.devDependencies||{},o={...s,...n};return Object.keys(o).filter(i=>i.includes("eslint"))}catch{return[]}},Lt=async(e,t)=>{if(t.length!==0)try{for(let s of t)await Bt(s,{packageManager:e})}catch(s){console.warn(s)}},Wt=async()=>{let e=[];for(let t of X)if(await f(t))try{await _t(t),e.push(t)}catch(s){console.warn(s)}return e},Ht=async()=>{let e="./.vscode/settings.json";if(!await f(e))return!1;try{let t=await Ne(e,"utf-8"),s=Oe(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 a of i)a in o&&(delete o[a],n=!0);if("editor.codeActionsOnSave"in o){let a=o["editor.codeActionsOnSave"];if(a&&typeof a=="object"){let r=["source.fixAll.eslint","source.organizeImports.eslint"];for(let c of r)c in a&&(delete a[c],n=!0);Object.keys(a).length===0&&(o["editor.codeActionsOnSave"]=void 0)}}return n?(await Jt(e,JSON.stringify(o,null,2)),!0):!1}catch(t){return console.warn(t),!1}},zt=async()=>{if((await De()).length>0)return!0;for(let t of X)if(await f(t))return!0;return!1},me={hasEsLint:zt,remove:async e=>{let t=await De();await Lt(e,t);let s=await Wt(),n=await Ht();return{packagesRemoved:t,filesRemoved:s,vsCodeCleaned:n}}};h();import{readFile as Me,unlink as Gt,writeFile as Vt}from"fs/promises";import{parse as Te}from"jsonc-parser";import{removeDependency as Yt}from"nypm";var Q=[".prettierrc",".prettierrc.js",".prettierrc.json",".prettierrc.yml",".prettierrc.yaml",".prettierrc.config.js","prettier.config.js","prettier.config.mjs",".prettierignore"],Ue=async()=>{try{let e=await Me("package.json","utf-8"),t=Te(e);if(!t||typeof t!="object")return[];let s=t.dependencies||{},n=t.devDependencies||{},o={...s,...n};return Object.keys(o).filter(i=>i.includes("prettier"))}catch{return[]}},Kt=async(e,t)=>{if(t.length!==0)try{for(let s of t)await Yt(s,{packageManager:e})}catch(s){console.warn(s)}},Xt=async()=>{let e=[];for(let t of Q)if(await f(t))try{await Gt(t),e.push(t)}catch(s){console.warn(s)}return e},Qt=async()=>{let e="./.vscode/settings.json";if(!await f(e))return!1;try{let t=await Me(e,"utf-8"),s=Te(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 r of i)r in o&&(r==="editor.defaultFormatter"&&o[r]==="esbenp.prettier-vscode"||r!=="editor.defaultFormatter")&&(delete o[r],n=!0);let a=Object.keys(o).filter(r=>r.startsWith("[")&&r.includes("javascript"));for(let r of a){let c=o[r];c&&typeof c=="object"&&"editor.defaultFormatter"in c&&c["editor.defaultFormatter"]==="esbenp.prettier-vscode"&&(delete c["editor.defaultFormatter"],n=!0,Object.keys(c).length===0&&delete o[r])}return n?(await Vt(e,JSON.stringify(o,null,2)),!0):!1}catch(t){return console.warn(t),!1}},Zt=async()=>{if((await Ue()).length>0)return!0;for(let t of Q)if(await f(t))return!0;return!1},pe={hasPrettier:Zt,remove:async e=>{let t=await Ue();await Kt(e,t);let s=await Xt(),n=await Qt();return{packagesRemoved:t,filesRemoved:s,vsCodeCleaned:n}}};h();var ns=async()=>{let t=(await _e($.cwd()))?.name||"npm",s=Je(t,"@biomejs/biome",{args:["--version"],short:t==="npm"}),n=qt(s,{shell:!0,encoding:"utf-8"});return n.status===0&&n.stdout?{name:"Biome installation",status:"pass",message:`Biome is installed (${n.stdout.trim()})`}:{name:"Biome installation",status:"fail",message:"Biome is not installed or not accessible"}},os=async()=>{let e=_($.cwd(),"biome.json"),t=_($.cwd(),"biome.jsonc"),s=null;if(I(e)?s=e:I(t)&&(s=t),!s)return{name:"Biome configuration",status:"fail",message:"No biome.json or biome.jsonc file found"};try{let n=await Ie(s,"utf-8"),o=ss(n);return Array.isArray(o?.extends)&&o.extends.includes("ultracite/core")?{name:"Biome configuration",status:"pass",message:"biome.json(c) extends ultracite/core"}:{name:"Biome configuration",status:"warn",message:"biome.json(c) exists but doesn't extend ultracite/core"}}catch{return{name:"Biome configuration",status:"fail",message:"Could not parse biome.json(c) file"}}},is=async()=>{let e=_($.cwd(),"package.json");if(!I(e))return{name:"Ultracite dependency",status:"warn",message:"No package.json found"};try{let t=JSON.parse(await Ie(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"}}},rs=()=>{let e=Q.some(s=>I(_($.cwd(),s))),t=X.some(s=>I(_($.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"}},q=async(e,t)=>{let s=ts();s.start(`Checking ${t}...`);let n=await e();return n.status==="pass"||n.status,s.stop(n.message),n},Be=async()=>{es(Y);let t=(await _e($.cwd()))?.name||"npm",s=Je(t,"ultracite",{args:["init"],short:t==="npm"}),n=[];n.push(await q(ns,"Biome installation")),n.push(await q(os,"Biome configuration")),n.push(await q(is,"Ultracite dependency")),n.push(await q(rs,"conflicting tools"));let o=n.filter(r=>r.status==="pass").length,i=n.filter(r=>r.status==="fail").length,a=n.filter(r=>r.status==="warn").length;if(Z.info(`Summary: ${o} passed, ${a} warnings, ${i} failed`),i>0)throw Z.error(`Some checks failed. Run '${s}' to fix issues.`),ue("Doctor complete"),new Error("Doctor checks failed");if(a>0){Z.warn(`Some optional improvements available. Run '${s}' to configure.`),ue("Doctor complete");return}Z.success("Everything looks good!"),ue("Doctor complete")};import{spawnSync as as}from"child_process";import cs from"process";import{detectPackageManager as ls,dlxCommand as ds}from"nypm";h();var ge=async(e,t={})=>{let s=["check","--write","--no-errors-on-unmatched","--reporter=json"];t.unsafe&&s.push("--unsafe"),e.length>0?s.push(...K(e)):s.push("./");let o=(await ls(cs.cwd()))?.name||"npm",i=ds(o,"@biomejs/biome",{args:s,short:o==="npm"}),a=as(i,{stdio:"pipe",shell:!0,maxBuffer:100*1024*1024});if(a.error)throw new Error(`Failed to run Ultracite: ${a.error.message}`);let r=a.stdout?.toString()||"",c=a.stderr?.toString()||"",p=r.trim().startsWith("{")?r:c,{output:u,hasErrors:x}=V(p,"fix");return console.log(u),{hasErrors:x}};import{packageManagers as fs}from"nypm";var j={packageManagers:fs.map(e=>e.name),editorConfigs:["vscode","zed"],agents:["vscode-copilot","cursor","windsurf","zed","claude","codex","kiro","cline","amp","aider","firebase-studio","open-hands","gemini-cli","junie","augmentcode","kilo-code","goose","roo-code","warp","droid","antigravity"],integrations:["husky","lefthook","lint-staged","pre-commit"],hooks:["cursor","claude"],frameworks:["react","next","solid","vue","svelte","qwik","remix","angular","astro"],migrations:["eslint","prettier"]};import un from"process";import{cancel as M,intro as gn,isCancel as T,log as ae,multiselect as U,spinner as w}from"@clack/prompts";import{addDevDependency as hn,detectPackageManager as yn}from"nypm";import{mkdir as ms,readFile as ps,writeFile as ee}from"fs/promises";import{dirname as us}from"path";import{dlxCommand as gs}from"nypm";var Le={"vscode-copilot":{path:"./.github/copilot-instructions.md",header:`---
|
|
125
|
+
${o}`)}}});var a3,_1=$(()=>{a3=G1({"./husky.ts":()=>(B1(),i1(_t)),"./lefthook.ts":()=>(I1(),i1(Dt)),"./lint-staged.ts":()=>(U1(),i1(Gt)),"./pre-commit.ts":()=>($1(),i1(Tt))})});var Gt={};e1(Gt,{lintStaged:()=>H});import{readFile as m1,writeFile as F}from"fs/promises";import{pathToFileURL as c3}from"url";import Z from"deepmerge";import{parse as R1}from"jsonc-parser";import{addDevDependency as l3,dlxCommand as d3}from"nypm";var S,Mt,f3,m3,p3,g3,u3,h3,w3,x3,v3,L1,y3,H,U1=$(()=>{"use strict";f();_1();S=t=>({"*.{js,jsx,ts,tsx,json,jsonc,css,scss,md,mdx}":[d3(t,"ultracite",{args:["fix"],short:t==="npm"})]}),Mt=["./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"],f3=(t,e,i,o)=>{let n=t.trim();if(n.includes(":")&&!n.startsWith("-")){i&&o.length>0&&(e[i]=o);let[s,...r]=n.split(":"),a=r.join(":").trim(),m=s.trim().replace(/['"]/g,"");return a&&a!==""?(a.startsWith("[")&&a.endsWith("]")?e[m]=a.slice(1,-1).split(",").map(h=>h.trim().replace(/['"]/g,"")):e[m]=a.replace(/['"]/g,""),{newCurrentKey:null,newCurrentArray:[]}):{newCurrentKey:m,newCurrentArray:[]}}if(n.startsWith("-")&&i){let s=[...o,n.slice(1).trim().replace(/['"]/g,"")];return{newCurrentKey:i,newCurrentArray:s}}return{newCurrentKey:i,newCurrentArray:o}},m3=t=>{let e=t.split(`
|
|
126
|
+
`).filter(s=>s.trim()&&!s.trim().startsWith("#")),i={},o=null,n=[];for(let s of e){let r=f3(s,i,o,n);o=r.newCurrentKey,n=r.newCurrentArray}return o&&n.length>0&&(i[o]=n),i},p3=t=>{let e="";for(let[i,o]of Object.entries(t))if(Array.isArray(o)){e+=`${i}:
|
|
127
|
+
`;for(let n of o)e+=` - '${n}'
|
|
128
|
+
`}else e+=`${i}: '${o}'
|
|
129
|
+
`;return e},g3=async()=>{try{let t=R1(await m1("./package.json","utf-8"));return t?t.type==="module":!1}catch{return!1}},u3=async t=>{let e=R1(await m1("./package.json","utf-8"));e&&(e["lint-staged"]?e["lint-staged"]=Z(e["lint-staged"],S(t)):e["lint-staged"]=S(t),await F("./package.json",JSON.stringify(e,null,2)))},h3=async(t,e)=>{let i=await m1(t,"utf-8"),o=R1(i);if(!o)return;let n=Z(o,S(e));await F(t,JSON.stringify(n,null,2))},w3=async(t,e)=>{let i=await m1(t,"utf-8"),o=m3(i);if(!o)return;let n=Z(o,S(e));await F(t,p3(n))},x3=async(t,e)=>{let n=(await import(c3(t).href)).default||{},s=Z(n,S(e)),r=`export default ${JSON.stringify(s,null,2)};
|
|
130
|
+
`;await F(t,r)},v3=async(t,e)=>{delete C1.cache[C1.resolve(`./${t}`)];let i=a3(`./${t}`),o=Z(i,S(e)),n=`module.exports = ${JSON.stringify(o,null,2)};
|
|
131
|
+
`;await F(t,n)},L1=async t=>{await F(".lintstagedrc.json",JSON.stringify(S(t),null,2))},y3=async(t,e)=>{if(t==="./package.json"){await u3(e);return}if(t.endsWith(".json")||t==="./.lintstagedrc"){await h3(t,e);return}if(t.endsWith(".yaml")||t.endsWith(".yml")){await w3(t,e);return}let i=await g3();if(t.endsWith(".mjs")||t.endsWith(".js")&&i){try{await x3(t,e)}catch{await L1(e)}return}if(t.endsWith(".cjs")||t.endsWith(".js")&&!i)try{await v3(t,e)}catch{await L1(e)}},H={exists:async()=>{for(let t of Mt)if(await c(t))return!0;return!1},install:async t=>{await l3("lint-staged",{packageManager:t,workspace:await z(),silent:!0})},create:async t=>{await F(".lintstagedrc.json",JSON.stringify(S(t),null,2))},update:async t=>{let e=null;for(let i of Mt)if(await c(i)){e=i;break}if(!e){await L1(t);return}await y3(e,t)}}});var M1="./aider-K7JLZT2D.svg";var J1="./amazon-q-TSOJNPXB.svg";var W1="./amp-EV4LVL5I.svg";var H1="./augmentcode-Q62PVXKO.svg";var V1="./claude-6DLEHRDQ.svg";var X1="./cline-6HWKIYN7.svg";var Q1="./codex-NQZ5TJCL.svg";var K1="./copilot-L2IY45R2.svg";var Y1="./crush-LYLRDQGZ.svg";var Z1="./droid-266OHJBT.svg";var q1="./firebase-studio-ILLWWYU7.svg";var tt="./firebender-UNO6LSZG.svg";var et="./gemini-OYS6V4BH.svg";var it="./goose-XBIEVD4H.svg";var ot="./jules-HJPVWU73.svg";var nt="./junie-RUWBUV6N.svg";var st="./kilo-code-4QYUYY2E.svg";var rt="./open-hands-K5EYKO6T.svg";var at="./opencode-K3274JKQ.svg";var ct="./qwen-N3D5CQYL.svg";var lt="./roo-code-CVLBTS7D.svg";var dt="./warp-OZKAAQRT.svg";var _=[{id:"claude",name:"Claude Code",subtitle:"Anthropic's agentic CLI",description:"Anthropic's official CLI for Claude, an agentic coding tool that lives in your terminal.",config:{path:".claude/CLAUDE.md",appendMode:!0},logo:V1},{id:"codex",name:"Codex",subtitle:"OpenAI's coding agent",description:"OpenAI's cloud-based coding agent for autonomous software development tasks.",config:{path:"AGENTS.md",appendMode:!0},logo:Q1},{id:"jules",name:"Jules",subtitle:"Google's async agent",description:"Google's asynchronous AI coding agent that works in the background to complete development tasks.",config:{path:"AGENTS.md",appendMode:!0},logo:ot},{id:"copilot",name:"GitHub Copilot",subtitle:"GitHub's AI pair programmer",description:"GitHub's AI pair programmer that suggests code completions and helps write code faster.",config:{path:".github/copilot-instructions.md",appendMode:!0,header:`---
|
|
149
132
|
applyTo: "**/*.{ts,tsx,js,jsx}"
|
|
150
|
-
|
|
133
|
+
---`},logo:K1},{id:"cline",name:"Cline",subtitle:"Autonomous VS Code agent",description:"An autonomous coding agent for VS Code that can create and edit files, run commands, and more.",config:{path:".clinerules",appendMode:!0},logo:X1},{id:"amp",name:"AMP",subtitle:"Sourcegraph's coding agent",description:"Sourcegraph's AI coding agent that understands your entire codebase for intelligent assistance.",config:{path:"AGENT.md",appendMode:!0},logo:W1},{id:"aider",name:"Aider",subtitle:"Terminal pair programming",description:"AI pair programming in your terminal with support for multiple LLM providers.",config:{path:"ultracite.md"},logo:M1},{id:"firebase-studio",name:"Firebase Studio",subtitle:"Google's cloud IDE",description:"Google's AI-powered development environment integrated with Firebase services.",config:{path:".idx/airules.md",appendMode:!0},logo:q1},{id:"open-hands",name:"OpenHands",subtitle:"Open-source AI agents",description:"An open-source platform for AI software development agents with autonomous capabilities.",config:{path:".openhands/microagents/repo.md",appendMode:!0},logo:rt},{id:"gemini",name:"Gemini",subtitle:"Google's terminal AI",description:"Google's command-line interface for Gemini, bringing AI assistance to your terminal.",config:{path:"GEMINI.md",appendMode:!0},logo:et},{id:"junie",name:"Junie",subtitle:"JetBrains' AI agent",description:"JetBrains' AI coding agent integrated into their IDE ecosystem.",config:{path:".junie/guidelines.md",appendMode:!0},logo:nt},{id:"augmentcode",name:"Augment Code",subtitle:"Enterprise AI assistant",description:"An AI coding assistant focused on enterprise development workflows and team collaboration.",config:{path:".augment/rules/ultracite.md"},logo:H1},{id:"kilo-code",name:"Kilo Code",subtitle:"Customizable VS Code AI",description:"A VS Code extension providing AI-powered coding assistance with customizable rules.",config:{path:".kilocode/rules/ultracite.md"},logo:st},{id:"goose",name:"Goose",subtitle:"Block's open-source agent",description:"Block's open-source AI developer agent for autonomous software development.",config:{path:".goosehints",appendMode:!0},logo:it},{id:"roo-code",name:"Roo Code",subtitle:"Codebase navigation AI",description:"An AI coding assistant focused on understanding and navigating complex codebases.",config:{path:".roo/rules/ultracite.md",appendMode:!0},logo:lt},{id:"warp",name:"Warp",subtitle:"Modern AI terminal",description:"A modern terminal with AI-powered command suggestions and workflow automation.",config:{path:"WARP.md",appendMode:!0},logo:dt},{id:"droid",name:"Droid",subtitle:"Automated code generation",description:"An AI development agent focused on automated code generation and task completion.",config:{path:"AGENTS.md",appendMode:!0},logo:Z1},{id:"opencode",name:"OpenCode",subtitle:"Open-source coding agent",description:"An open-source AI coding agent that runs in your terminal, desktop, or IDE with support for 75+ LLM providers.",config:{path:"AGENTS.md",appendMode:!0},logo:at},{id:"crush",name:"Crush",subtitle:"Glamorous terminal agent",description:"Charmbracelet's glamorous AI coding agent for your terminal with multi-model support.",config:{path:"CRUSH.md",appendMode:!0},logo:Y1},{id:"qwen",name:"Qwen Code",subtitle:"Alibaba's coding CLI",description:"Alibaba's command-line interface for Qwen3-Coder, enabling agentic coding with natural language.",config:{path:"AGENTS.md",appendMode:!0},logo:ct},{id:"amazon-q-cli",name:"Amazon Q CLI",subtitle:"AWS's terminal AI",description:"Amazon's AI-powered CLI with command autocompletion, natural language chat, and AWS integration.",config:{path:".amazonq/rules/ultracite.md",appendMode:!0},logo:J1},{id:"firebender",name:"Firebender",subtitle:"Android Studio AI",description:"The most powerful AI coding assistant for Android Studio with codebase context and up-to-date Android knowledge.",config:{path:"firebender.json"},logo:tt}];import U from"deepmerge";var ft="./antigravity-JVONECNW.svg";var mt="./cursor-GQNH5LCA.svg";var pt="./kiro-N2M256R6.svg";var gt="./trae-RXVCFBOF.svg";var ut="./void-NYH3U3BB.svg";var ht="./vscode-DEOUEB65.svg";var wt="./windsurf-5T7JOTST.svg";var xt="./zed-SIARPESF.svg";var o1={"editor.defaultFormatter":"esbenp.prettier-vscode","typescript.tsdk":"node_modules/typescript/lib","editor.formatOnSave":!0,"editor.formatOnPaste":!0,"emmet.showExpandedAbbreviation":"never"},Me={"[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"},"[html]":{"editor.defaultFormatter":"biomejs.biome"},"[vue]":{"editor.defaultFormatter":"biomejs.biome"},"[svelte]":{"editor.defaultFormatter":"biomejs.biome"},"[css]":{"editor.defaultFormatter":"biomejs.biome"},"[yaml]":{"editor.defaultFormatter":"biomejs.biome"},"[graphql]":{"editor.defaultFormatter":"biomejs.biome"},"[markdown]":{"editor.defaultFormatter":"biomejs.biome"},"[mdx]":{"editor.defaultFormatter":"biomejs.biome"},"editor.codeActionsOnSave":{"source.fixAll.biome":"explicit","source.organizeImports.biome":"explicit"}},Je={"[javascript]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[javascriptreact]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[typescript]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[typescriptreact]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[json]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[jsonc]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[yaml]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[html]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[vue]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[vue-html]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[handlebars]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[css]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[scss]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[less]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[graphql]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[markdown]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"editor.codeActionsOnSave":{"source.fixAll.oxc":"explicit"}},We={"editor.codeActionsOnSave":{"source.fixAll.eslint":"explicit","source.organizeImports":"explicit"}},E=(t="biome")=>{switch(t){case"biome":return U(o1,Me);case"eslint":return U(o1,We);case"oxlint":return U(o1,Je);default:return o1}},n1={formatter:"language_server",format_on_save:"on",lsp:{"typescript-language-server":{settings:{typescript:{preferences:{includePackageJsonAutoImports:"on"}}}}}},He={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}},TSX:{formatter:{language_server:{name:"biome"}},code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0}}}},Ve={languages:{JavaScript:{formatter:{language_server:{name:"eslint"}},code_actions_on_format:{"source.fixAll.eslint":!0,"source.organizeImports.eslint":!0}},TypeScript:{formatter:{language_server:{name:"eslint"}},code_actions_on_format:{"source.fixAll.eslint":!0,"source.organizeImports.eslint":!0}},TSX:{formatter:{language_server:{name:"eslint"}},code_actions_on_format:{"source.fixAll.eslint":!0,"source.organizeImports.eslint":!0}}}},Xe={languages:{JavaScript:{formatter:{language_server:{name:"oxfmt"}},code_actions_on_format:{"source.fixAll.oxc":!0,"source.organizeImports.oxc":!0}},TypeScript:{formatter:{language_server:{name:"oxfmt"}},code_actions_on_format:{"source.fixAll.oxc":!0,"source.organizeImports.oxc":!0}},TSX:{formatter:{language_server:{name:"oxfmt"}},code_actions_on_format:{"source.fixAll.oxc":!0,"source.organizeImports.oxc":!0}}},lsp:{oxlint:{initialization_options:{settings:{disableNestedConfig:!1,fixKind:"safe_fix",run:"onType",typeAware:!0,unusedDisableDirectives:"deny"}}},oxfmt:{initialization_options:{settings:{configPath:null,flags:{},"fmt.configPath":null,"fmt.experimental":!0,run:"onSave",typeAware:!1,unusedDisableDirectives:!1}}}}},Qe=(t="biome")=>{switch(t){case"biome":return U(n1,He);case"eslint":return U(n1,Ve);case"oxlint":return U(n1,Xe);default:return n1}},x=[{id:"vscode",name:"Visual Studio Code",subtitle:"The most popular code editor",description:"Microsoft's popular code editor with extensive extension support and built-in Git integration.",logo:ht,config:{path:".vscode/settings.json",getContent:E,extensionCommand:"code --install-extension"}},{id:"cursor",name:"Cursor",subtitle:"The AI-first code editor",description:"The AI-first code editor built on VS Code with deep AI integration for coding assistance.",logo:mt,rules:{path:".cursor/rules/ultracite.mdc",header:`---
|
|
151
134
|
description: Ultracite Rules - AI-Ready Formatter and Linter
|
|
152
135
|
globs: "**/*.{ts,tsx,js,jsx,json,jsonc,html,vue,svelte,astro,css,yaml,yml,graphql,gql,md,mdx,grit}"
|
|
153
136
|
alwaysApply: false
|
|
154
|
-
---`},
|
|
137
|
+
---`},hooks:{path:".cursor/hooks.json",getContent:t=>({version:1,hooks:{afterFileEdit:[{command:t}]}})},config:{path:".vscode/settings.json",getContent:E,extensionCommand:"code --install-extension"}},{id:"windsurf",name:"Windsurf",subtitle:"The agentic IDE by Codeium",description:"Codeium's agentic IDE that combines AI assistance with a powerful VS Code-based development environment.",logo:wt,rules:{path:".windsurf/rules/ultracite.md"},hooks:{path:".windsurf/hooks.json",getContent:t=>({hooks:{post_write_code:[{command:t,show_output:!0}]}})},config:{path:".vscode/settings.json",getContent:E,extensionCommand:"code --install-extension"}},{id:"antigravity",name:"Antigravity",subtitle:"Google's next-generation IDE",description:"An AI-powered development platform built on VS Code for building and deploying applications faster.",logo:ft,config:{path:".vscode/settings.json",getContent:E,extensionCommand:"code --install-extension"}},{id:"kiro",name:"Kiro",subtitle:"AWS's spec-driven IDE",description:"AWS's spec-driven AI development environment for building production-ready applications.",logo:pt,rules:{path:".kiro/steering/ultracite.md"},config:{path:".vscode/settings.json",getContent:E,extensionCommand:"code --install-extension"}},{id:"trae",name:"Trae AI",subtitle:"ByteDance's AI IDE",description:"ByteDance's AI-powered IDE built on VS Code - the real AI engineer.",logo:gt,rules:{path:".trae/rules/project_rules.md"},config:{path:".vscode/settings.json",getContent:E,extensionCommand:"code --install-extension"}},{id:"void",name:"Void",subtitle:"Open-source AI editor",description:"An open-source AI code editor built on VS Code with a focus on privacy and extensibility.",logo:ut,config:{path:".vscode/settings.json",getContent:E,extensionCommand:"code --install-extension"}},{id:"zed",name:"Zed",subtitle:"The high-performance editor",description:"A high-performance, multiplayer code editor built in Rust with built-in AI assistance.",logo:xt,rules:{path:".rules",appendMode:!0},config:{path:".zed/settings.json",getContent:Qe}}];var vt="./biome-TVLEY2T4.svg";var yt="./eslint-7IULJKW7.svg";var kt="./oxlint-5IE3ABOZ.svg";var bt="./prettier-O4V2FSEA.svg";var zt="./stylelint-DEBSWZVS.svg";var s1=[{id:"biome",name:"Biome",subtitle:"The modern all-in-one toolchain",description:"The modern, all-in-one toolchain. Biome is a fast formatter and linter written in Rust that handles JavaScript, TypeScript, JSON, CSS, and more with a single tool.",benefits:[{title:"Lightning fast",description:"Written in Rust, Biome can format a large codebase in milliseconds.",icon:"Zap"},{title:"All-in-one toolchain",description:"No more juggling ESLint, Prettier, and other tools. Biome handles formatting and linting in a single pass.",icon:"Layers"},{title:"287 preconfigured rules",description:"Covers accessibility, complexity, correctness, performance, security, style, and suspicious patterns.",icon:"ShieldCheck"},{title:"Multi-language support",description:"Natively supports JavaScript, TypeScript, JSX, TSX, JSON, JSONC, CSS, GraphQL, and HTML.",icon:"Code"},{title:"Smart sorting",description:"Automatically organizes imports and JSX attributes, plus sorts Tailwind CSS classes.",icon:"ArrowUpDown"},{title:"Zero dependencies",description:"Biome has no JavaScript dependencies. One binary does everything with consistent behavior.",icon:"Package"}],logo:vt,videos:["https://www.youtube.com/watch?v=lEkXbneUnWg","https://www.youtube.com/watch?v=b_F4LaycQcE"],configFiles:[{name:"biome.jsonc",lang:"json",code:t=>`{
|
|
138
|
+
"$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
|
|
139
|
+
"extends": [
|
|
140
|
+
${t.map(e=>`"ultracite/biome/${e}"`).join(`,
|
|
141
|
+
`)}
|
|
142
|
+
]
|
|
143
|
+
}`}],vscodeExtensionId:"biomejs.biome"},{id:"eslint",name:"ESLint + Prettier + Stylelint",subtitle:"The most mature linting ecosystem",description:"The most mature and comprehensive linting solution. Combines ESLint for JavaScript/TypeScript, Prettier for formatting, and Stylelint for CSS with 20+ plugins and hundreds of preconfigured rules.",benefits:[{title:"Battle-tested",description:"Used by millions of developers worldwide. The largest ecosystem of plugins and configurations available.",icon:"ShieldCheck"},{title:"20+ plugins included",description:"React, TypeScript, JSX A11y, Import, Promise, Node, Next.js, Unicorn, SonarJS, and more preconfigured.",icon:"Puzzle"},{title:"Three tools in one",description:"ESLint handles code quality, Prettier ensures consistent formatting, and Stylelint keeps your CSS clean.",icon:"Layers"},{title:"Framework-aware",description:"First-class support for React, Next.js, Vue, Svelte, and more with framework-specific rules.",icon:"Box"},{title:"Type-aware linting",description:"Deep TypeScript integration with type-aware rules that catch bugs static analysis alone can't find.",icon:"FileCode"},{title:"Maximum coverage",description:"Hundreds of rules covering accessibility, security, performance, and best practices out of the box.",icon:"Target"}],includes:["ESLint","Prettier","Stylelint"],logo:yt,additionalLogos:[bt,zt],configFiles:[{name:"eslint.config.mjs",lang:"javascript",code:t=>`import { defineConfig } from "eslint/config";
|
|
144
|
+
${t.map(e=>`import ${e} from "ultracite/eslint/${e}";`).join(`
|
|
145
|
+
`)}
|
|
146
|
+
|
|
147
|
+
export default defineConfig([
|
|
148
|
+
{
|
|
149
|
+
extends: [
|
|
150
|
+
${t.join(`,
|
|
151
|
+
`)}
|
|
152
|
+
],
|
|
153
|
+
},
|
|
154
|
+
]);`},{name:"prettier.config.mjs",lang:"javascript",code:()=>'export { default } from "ultracite/prettier";'},{name:"stylelint.config.mjs",lang:"javascript",code:()=>'export { default } from "ultracite/stylelint";'}],vscodeExtensionId:"dbaeumer.vscode-eslint"},{id:"oxlint",name:"Oxlint + Oxfmt",subtitle:"The fastest linter available",description:"The fastest linter available. Oxlint is part of the Oxc project, running 50-100x faster than ESLint with a focus on catching bugs and reducing false positives.",benefits:[{title:"50-100x faster",description:"Lint your entire codebase in milliseconds. No more waiting for slow linting processes.",icon:"Zap"},{title:"15 plugin equivalents",description:"Built-in support for React, TypeScript, Next.js, Vue, Jest, Vitest, JSDoc, and more without extra deps.",icon:"Puzzle"},{title:"Bug-focused rules",description:"Prioritizes catching real bugs over stylistic issues. High signal-to-noise ratio.",icon:"Bug"},{title:"Oxc ecosystem",description:"Part of the larger Oxc project with parser, resolver, transformer, and minifier built for speed.",icon:"Boxes"},{title:"Category-based config",description:"Rules organized into correctness, suspicious, pedantic, performance, restriction, and style categories.",icon:"FolderTree"},{title:"Drop-in ready",description:"Works alongside your existing ESLint setup or as a complete replacement with Oxfmt for formatting.",icon:"RefreshCw"}],includes:["Oxlint","Oxfmt"],logo:kt,configFiles:[{name:".oxlintrc.json",lang:"json",code:t=>`{
|
|
155
|
+
"$schema": "./node_modules/oxlint/configuration_schema.json",
|
|
156
|
+
"extends": [
|
|
157
|
+
${t.map(e=>`"ultracite/oxlint/${e}"`).join(`,
|
|
158
|
+
`)}
|
|
159
|
+
]
|
|
160
|
+
}`},{name:".oxfmtrc.jsonc",lang:"json",code:()=>`{
|
|
161
|
+
"$schema": "./node_modules/oxfmt/configuration_schema.json",
|
|
162
|
+
"tabWidth": 2,
|
|
163
|
+
"useTabs": false,
|
|
164
|
+
"semi": true,
|
|
165
|
+
"singleQuote": true,
|
|
166
|
+
"trailingComma": "es5",
|
|
167
|
+
"bracketSpacing": true,
|
|
168
|
+
"arrowParens": "always",
|
|
169
|
+
"proseWrap": "never",
|
|
170
|
+
"printWidth": 80,
|
|
171
|
+
}`}],vscodeExtensionId:"oxc.oxc-vscode"}];var e2=["react","next","solid","vue","svelte","qwik","remix","angular","astro"],i2=["husky","lefthook","lint-staged","pre-commit"],o2=["eslint","prettier"],v={linters:s1.map(t=>t.id),editorConfigs:x.map(t=>t.id),agents:_.map(t=>t.id),integrations:i2,hooks:x.filter(t=>t.hooks).map(t=>t.id),frameworks:e2,migrations:o2};import{initTRPC as pi}from"@trpc/server";import{packageManagers as gi}from"nypm";import{createCli as ui}from"trpc-cli";import d from"zod";var y={name:"ultracite",description:"The AI-ready formatter that helps you write and generate code faster.",version:"7.0.1",type:"module",bin:{ultracite:"dist/index.js"},files:["config","dist","README.md"],scripts:{build:"tsup",test:"bun test","test:coverage":"bun test --coverage"},exports:{"./biome/*":"./config/biome/*/biome.jsonc","./eslint/*":"./config/eslint/*/eslint.config.mjs","./oxlint/*":"./config/oxlint/*/.oxlintrc.json","./prettier":"./config/prettier/prettier.config.mjs","./stylelint":"./config/stylelint/stylelint.config.mjs","./*":"./config/*/biome.jsonc"},author:"Hayden Bleasel <hello@haydenbleasel.com>",bugs:{url:"https://github.com/haydenbleasel/ultracite/issues"},homepage:"https://www.ultracite.ai/",keywords:["ultracite","biome","linter","formatter","fixer"],license:"MIT",publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},repository:{type:"git",url:"git+https://github.com/haydenbleasel/ultracite.git"},devDependencies:{"@biomejs/biome":"catalog:","@eslint/js":"^9.39.2","@next/eslint-plugin-next":"^16.1.1","@repo/data":"workspace:*","@tanstack/eslint-plugin-query":"^5.91.2","@types/node":"catalog:","@typescript-eslint/eslint-plugin":"^8.51.0","@typescript-eslint/parser":"^8.51.0","eslint-config-prettier":"^10.1.8","eslint-import-resolver-typescript":"^4.4.4","eslint-plugin-angular":"^5.0.0","eslint-plugin-astro":"^1.5.0","eslint-plugin-compat":"^6.0.2","eslint-plugin-cypress":"^5.2.0","eslint-plugin-github":"6.0.0","eslint-plugin-html":"^8.1.3","eslint-plugin-import":"^2.32.0","eslint-plugin-jest":"^29.12.0","eslint-plugin-jsx-a11y":"^6.10.2","eslint-plugin-n":"^17.23.1","eslint-plugin-prettier":"^5.5.4","eslint-plugin-promise":"^7.2.1","eslint-plugin-qwik":"^1.18.0","eslint-plugin-react":"^7.37.5","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-remix":"^1.1.1","eslint-plugin-solid":"^0.14.5","eslint-plugin-sonarjs":"^3.0.5","eslint-plugin-storybook":"^10.1.11","eslint-plugin-svelte":"^3.13.1","eslint-plugin-tailwindcss":"^3.18.2","eslint-plugin-unicorn":"^62.0.0","eslint-plugin-unused-imports":"^4.3.0","eslint-plugin-vue":"^10.6.2",globals:"^16.5.0","prettier-plugin-tailwindcss":"^0.7.2","stylelint-config-idiomatic-order":"^10.0.0","stylelint-config-standard":"^39.0.1","stylelint-prettier":"^5.0.3",tsup:"^8.5.1"},dependencies:{"@clack/prompts":"^0.11.0","@trpc/server":"^11.8.1",deepmerge:"^4.3.1",glob:"^13.0.0","jsonc-parser":"^3.3.1",nypm:"^0.6.2",oxlint:"^1.36.0","trpc-cli":"^0.12.1",zod:"^4.3.2"},packageManager:"bun@1.3.5"};f();import{spawnSync as L}from"child_process";import R from"process";import{detectPackageManager as D,dlxCommand as N}from"nypm";var u2=async(t,e)=>{let i=["check","--no-errors-on-unmatched"];e&&i.push(`--diagnostic-level=${e}`),t.length>0?i.push(...u(t)):i.push("./");let n=(await D(R.cwd()))?.name||"npm",s=N(n,"@biomejs/biome",{args:i,short:n==="npm"}),r=L(s,{stdio:"inherit",shell:!0});if(r.error)throw new Error(`Failed to run Biome: ${r.error.message}`);return{hasErrors:r.status!==0}},h2=async t=>{let e=t.length>0?u(t):["."],o=(await D(R.cwd()))?.name||"npm",n=N(o,"eslint",{args:e,short:o==="npm"}),s=L(n,{stdio:"inherit",shell:!0});if(s.error)throw new Error(`Failed to run ESLint: ${s.error.message}`);return{hasErrors:s.status!==0}},w2=async t=>{let e=["--check",...t.length>0?u(t):["."]],o=(await D(R.cwd()))?.name||"npm",n=N(o,"prettier",{args:e,short:o==="npm"}),s=L(n,{stdio:"inherit",shell:!0});if(s.error)throw new Error(`Failed to run Prettier: ${s.error.message}`);return{hasErrors:s.status!==0}},x2=async t=>{let e=t.length>0?u(t):["."],o=(await D(R.cwd()))?.name||"npm",n=N(o,"stylelint",{args:e,short:o==="npm"}),s=L(n,{stdio:"inherit",shell:!0});if(s.error)throw new Error(`Failed to run Stylelint: ${s.error.message}`);return{hasErrors:s.status!==0}},v2=async t=>{let e=t.length>0?u(t):["."],o=(await D(R.cwd()))?.name||"npm",n=N(o,"oxlint",{args:e,short:o==="npm"}),s=L(n,{stdio:"inherit",shell:!0});if(s.error)throw new Error(`Failed to run Oxlint: ${s.error.message}`);return{hasErrors:s.status!==0}},y2=async t=>{let e=["--check",...t.length>0?u(t):["."]],o=(await D(R.cwd()))?.name||"npm",n=N(o,"oxfmt",{args:e,short:o==="npm"}),s=L(n,{stdio:"inherit",shell:!0});if(s.error)throw new Error(`Failed to run oxfmt: ${s.error.message}`);return{hasErrors:s.status!==0}},St=async t=>{let e=t?.[0]||[],i=t?.[1]["diagnostic-level"],n=t?.[1].linter||await r1();if(!n)throw new Error("No linter configuration found. Run `ultracite init` to set up a linter.");switch(n){case"eslint":{let s=await w2(e),r=await h2(e),a=await x2(e);return{hasErrors:s.hasErrors||r.hasErrors||a.hasErrors}}case"oxlint":{let s=await y2(e),r=await v2(e);return{hasErrors:s.hasErrors||r.hasErrors}}default:return u2(e,i)}};import{spawnSync as j1}from"child_process";import{existsSync as A}from"fs";import{readFile as c1}from"fs/promises";import{join as O}from"path";import w from"process";import{intro as k2,log as a1,outro as S1,spinner as b2}from"@clack/prompts";import{parse as jt}from"jsonc-parser";import{detectPackageManager as l1,dlxCommand as d1}from"nypm";var z2=[".prettierrc",".prettierrc.js",".prettierrc.cjs",".prettierrc.mjs",".prettierrc.json",".prettierrc.yaml",".prettierrc.yml","prettier.config.js","prettier.config.mjs","prettier.config.cjs"],C2=[".eslintrc",".eslintrc.js",".eslintrc.cjs",".eslintrc.mjs",".eslintrc.json",".eslintrc.yaml",".eslintrc.yml","eslint.config.js","eslint.config.mjs","eslint.config.cjs","eslint.config.ts","eslint.config.mts","eslint.config.cts"],S2=async()=>{let e=(await l1(w.cwd()))?.name||"npm",i=d1(e,"@biomejs/biome",{args:["--version"],short:e==="npm"}),o=j1(i,{shell:!0,encoding:"utf-8"});return o.status===0&&o.stdout?{name:"Biome installation",status:"pass",message:`Biome is installed (${o.stdout.trim()})`}:{name:"Biome installation",status:"fail",message:"Biome is not installed or not accessible"}},j2=async()=>{let e=(await l1(w.cwd()))?.name||"npm",i=d1(e,"eslint",{args:["--version"],short:e==="npm"}),o=j1(i,{shell:!0,encoding:"utf-8"});return o.status===0&&o.stdout?{name:"ESLint installation",status:"pass",message:`ESLint is installed (${o.stdout.trim()})`}:{name:"ESLint installation",status:"warn",message:"ESLint is not installed (optional)"}},P2=async()=>{let e=(await l1(w.cwd()))?.name||"npm",i=d1(e,"oxlint",{args:["--version"],short:e==="npm"}),o=j1(i,{shell:!0,encoding:"utf-8"});return o.status===0&&o.stdout?{name:"Oxlint installation",status:"pass",message:`Oxlint is installed (${o.stdout.trim()})`}:{name:"Oxlint installation",status:"warn",message:"Oxlint is not installed (optional)"}},E2=async()=>{let t=O(w.cwd(),"biome.json"),e=O(w.cwd(),"biome.jsonc"),i=null;if(A(t)?i=t:A(e)&&(i=e),!i)return{name:"Biome configuration",status:"warn",message:"No biome.json or biome.jsonc file found"};try{let o=await c1(i,"utf-8"),n=jt(o);return Array.isArray(n?.extends)&&n.extends.includes("ultracite/biome/core")?{name:"Biome configuration",status:"pass",message:"biome.json(c) extends ultracite/biome/core"}:{name:"Biome configuration",status:"warn",message:"biome.json(c) exists but doesn't extend ultracite/biome/core"}}catch{return{name:"Biome configuration",status:"fail",message:"Could not parse biome.json(c) file"}}},A2=async()=>{let t=["eslint.config.mjs","eslint.config.js","eslint.config.cjs","eslint.config.ts","eslint.config.mts","eslint.config.cts"],e=null;for(let i of t){let o=O(w.cwd(),i);if(A(o)){e=o;break}}if(!e)return{name:"ESLint configuration",status:"warn",message:"No eslint.config.* file found (optional)"};try{return(await c1(e,"utf-8")).includes("ultracite/eslint")?{name:"ESLint configuration",status:"pass",message:"eslint.config.* imports ultracite/eslint"}:{name:"ESLint configuration",status:"warn",message:"eslint.config.* exists but doesn't import ultracite/eslint"}}catch{return{name:"ESLint configuration",status:"fail",message:"Could not read eslint.config.* file"}}},O2=async()=>{let t=O(w.cwd(),".oxlintrc.json");if(!A(t))return{name:"Oxlint configuration",status:"warn",message:"No .oxlintrc.json file found (optional)"};try{let e=await c1(t,"utf-8"),i=jt(e);return Array.isArray(i?.extends)&&i.extends.includes("ultracite/oxlint/core")?{name:"Oxlint configuration",status:"pass",message:".oxlintrc.json extends ultracite/oxlint/core"}:{name:"Oxlint configuration",status:"warn",message:".oxlintrc.json exists but doesn't extend ultracite/oxlint/core"}}catch{return{name:"Oxlint configuration",status:"fail",message:"Could not parse .oxlintrc.json file"}}},B2=async()=>{let t=O(w.cwd(),"package.json");if(!A(t))return{name:"Ultracite dependency",status:"warn",message:"No package.json found"};try{let e=JSON.parse(await c1(t,"utf-8")),i=e.dependencies?.ultracite||e.devDependencies?.ultracite||e.peerDependencies?.ultracite;return i?{name:"Ultracite dependency",status:"pass",message:`Ultracite is in package.json (${i})`}:{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"}}},I2=()=>{let t=z2.some(o=>A(O(w.cwd(),o))),i=C2.filter(o=>!o.startsWith("eslint.config")).some(o=>A(O(w.cwd(),o)));if(t||i){let o=[];return t&&o.push("Prettier"),i&&o.push("ESLint (legacy config)"),{name:"Conflicting tools",status:"warn",message:`Found potentially conflicting tools: ${o.join(", ")}`}}return{name:"Conflicting tools",status:"pass",message:"No conflicting formatting/linting tools found"}},C=async(t,e)=>{let i=b2();i.start(`Checking ${e}...`);let o=await t();return o.status==="pass"||o.status,i.stop(o.message),o},Pt=async()=>{k2(`Ultracite v${y.version} Doctor`);let e=(await l1(w.cwd()))?.name||"npm",i=d1(e,"ultracite",{args:["init"],short:e==="npm"}),o=[];o.push(await C(S2,"Biome installation")),o.push(await C(j2,"ESLint installation")),o.push(await C(P2,"Oxlint installation")),o.push(await C(E2,"Biome configuration")),o.push(await C(A2,"ESLint configuration")),o.push(await C(O2,"Oxlint configuration")),o.push(await C(B2,"Ultracite dependency")),o.push(await C(I2,"conflicting tools"));let n=o.filter(a=>a.status==="pass").length,s=o.filter(a=>a.status==="fail").length,r=o.filter(a=>a.status==="warn").length;if(a1.info(`Summary: ${n} passed, ${r} warnings, ${s} failed`),s>0)throw a1.error(`Some checks failed. Run '${i}' to fix issues.`),S1("Doctor complete"),new Error("Doctor checks failed");if(r>0){a1.warn(`Some optional improvements available. Run '${i}' to configure.`),S1("Doctor complete");return}a1.success("Everything looks good!"),S1("Doctor complete")};f();import{spawnSync as T}from"child_process";import G from"process";import{detectPackageManager as M,dlxCommand as J}from"nypm";var F2=async(t,e)=>{let i=["check","--write","--no-errors-on-unmatched"];e&&i.push("--unsafe"),t.length>0?i.push(...u(t)):i.push("./");let n=(await M(G.cwd()))?.name||"npm",s=J(n,"@biomejs/biome",{args:i,short:n==="npm"}),r=T(s,{stdio:"inherit",shell:!0});if(r.error)throw new Error(`Failed to run Biome: ${r.error.message}`);return{hasErrors:r.status!==0}},$2=async t=>{let e=["--fix",...t.length>0?u(t):["."]],o=(await M(G.cwd()))?.name||"npm",n=J(o,"eslint",{args:e,short:o==="npm"}),s=T(n,{stdio:"inherit",shell:!0});if(s.error)throw new Error(`Failed to run ESLint: ${s.error.message}`);return{hasErrors:s.status!==0}},_2=async t=>{let e=["--write",...t.length>0?u(t):["."]],o=(await M(G.cwd()))?.name||"npm",n=J(o,"prettier",{args:e,short:o==="npm"}),s=T(n,{stdio:"inherit",shell:!0});if(s.error)throw new Error(`Failed to run Prettier: ${s.error.message}`);return{hasErrors:s.status!==0}},U2=async t=>{let e=["--fix",...t.length>0?u(t):["."]],o=(await M(G.cwd()))?.name||"npm",n=J(o,"stylelint",{args:e,short:o==="npm"}),s=T(n,{stdio:"inherit",shell:!0});if(s.error)throw new Error(`Failed to run Stylelint: ${s.error.message}`);return{hasErrors:s.status!==0}},L2=async t=>{let e=["--fix",...t.length>0?u(t):["."]],o=(await M(G.cwd()))?.name||"npm",n=J(o,"oxlint",{args:e,short:o==="npm"}),s=T(n,{stdio:"inherit",shell:!0});if(s.error)throw new Error(`Failed to run Oxlint: ${s.error.message}`);return{hasErrors:s.status!==0}},R2=async t=>{let e=["--write",...t.length>0?u(t):["."]],o=(await M(G.cwd()))?.name||"npm",n=J(o,"oxfmt",{args:e,short:o==="npm"}),s=T(n,{stdio:"inherit",shell:!0});if(s.error)throw new Error(`Failed to run oxfmt: ${s.error.message}`);return{hasErrors:s.status!==0}},Et=async(t,e={})=>{let i=e.linter||await r1();if(!i)throw new Error("No linter configuration found. Run `ultracite init` to set up a linter.");switch(i){case"eslint":{let o=await _2(t),n=await $2(t),s=await U2(t);return{hasErrors:o.hasErrors||n.hasErrors||s.hasErrors}}case"oxlint":{let o=await R2(t),n=await L2(t);return{hasErrors:o.hasErrors||n.hasErrors}}default:return F2(t,e.unsafe)}};import V3 from"process";import{cancel as V,intro as X3,isCancel as X,log as k1,multiselect as q,select as Q3,spinner as p}from"@clack/prompts";import{addDevDependency as K3,detectPackageManager as Y3}from"nypm";import{readFile as D2,writeFile as P1}from"fs/promises";var At=t=>`# Ultracite Code Standards
|
|
155
172
|
|
|
156
173
|
This project uses **Ultracite**, a zero-config Biome preset that enforces strict code quality standards through automated formatting and linting.
|
|
157
174
|
|
|
158
175
|
## Quick Reference
|
|
159
176
|
|
|
160
|
-
- **Format code**: \`${
|
|
161
|
-
- **Check for issues**: \`${
|
|
162
|
-
- **Diagnose setup**: \`${
|
|
177
|
+
- **Format code**: \`${t} ultracite fix\`
|
|
178
|
+
- **Check for issues**: \`${t} ultracite check\`
|
|
179
|
+
- **Diagnose setup**: \`${t} ultracite doctor\`
|
|
163
180
|
|
|
164
181
|
Biome (the underlying engine) provides extremely fast Rust-based linting and formatting. Most issues are automatically fixable.
|
|
165
182
|
|
|
@@ -273,9 +290,24 @@ Biome's linter will catch most issues automatically. Focus your attention on:
|
|
|
273
290
|
|
|
274
291
|
---
|
|
275
292
|
|
|
276
|
-
Most formatting and common issues are automatically fixed by Biome. Run \`${
|
|
277
|
-
`;var
|
|
278
|
-
|
|
279
|
-
${
|
|
280
|
-
|
|
281
|
-
${o}`)}else await ee(s.path,i)}}};h();import{readFile as hs,writeFile as Ge}from"fs/promises";import ys from"deepmerge";import{parse as ws}from"jsonc-parser";var Ve={$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["ultracite/core"]},he=async()=>await f("./biome.json")?"./biome.json":"./biome.jsonc",te={exists:async()=>{let e=await he();return f(e)},create:async e=>{let t=await he(),s=["ultracite/core"];if(e?.frameworks&&e.frameworks.length>0)for(let o of e.frameworks)s.push(`ultracite/${o}`);let n={...Ve,extends:s};return Ge(t,JSON.stringify(n,null,2))},update:async e=>{let t=await he(),s=await hs(t,"utf-8"),o=ws(s)||{},a=[...o.extends&&Array.isArray(o.extends)?o.extends:[]];if(a.includes("ultracite/core")||a.push("ultracite/core"),e?.frameworks&&e.frameworks.length>0)for(let p of e.frameworks){let u=`ultracite/${p}`;a.includes(u)||a.push(u)}o.extends=a;let r={$schema:Ve.$schema},c=ys(o,r);await Ge(t,JSON.stringify(c,null,2))}};h();import{spawnSync as ks}from"child_process";import{mkdir as bs,readFile as xs,writeFile as Ye}from"fs/promises";import vs from"deepmerge";import{parse as Cs}from"jsonc-parser";var ye={"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 se="./.vscode/settings.json",J={exists:()=>f(se),create:async()=>{await bs(".vscode",{recursive:!0}),await Ye(se,JSON.stringify(ye,null,2))},update:async()=>{let e=await xs(se,"utf-8"),s=Cs(e)||{},n=vs(s,ye);await Ye(se,JSON.stringify(n,null,2))},extension:()=>ks("code --install-extension biomejs.biome",{stdio:"pipe",shell:!0})};h();import{mkdir as js,readFile as Ps,writeFile as Ke}from"fs/promises";import $s from"deepmerge";import{parse as Ss}from"jsonc-parser";var we={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}},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 ne="./.zed/settings.json",oe={exists:()=>f(ne),create:async()=>{await js(".zed",{recursive:!0}),await Ke(ne,JSON.stringify(we,null,2))},update:async()=>{let e=await Ps(ne,"utf-8"),s=Ss(e)||{},n=$s(s,we);await Ke(ne,JSON.stringify(n,null,2))}};import{mkdir as Rs,readFile as Xe,writeFile as N}from"fs/promises";import{dirname as Es}from"path";import{dlxCommand as As}from"nypm";h();var Qe=e=>({version:1,hooks:{afterFileEdit:[{command:e}]}}),Ze=e=>({hooks:{PostToolUse:[{matcher:"Edit|Write",hooks:[{type:"command",command:e}]}]}}),Fs=async(e,t)=>{if(!await f(e)){await N(e,JSON.stringify(Qe(t),null,2));return}let s=await Xe(e,"utf-8"),n=JSON.parse(s);n.hooks.afterFileEdit.some(i=>i.command.includes("ultracite"))||(n.hooks.afterFileEdit.push({command:t}),await N(e,JSON.stringify(n,null,2)))},Ns=async(e,t)=>{if(!await f(e)){await N(e,JSON.stringify(Ze(t),null,2));return}let s=await Xe(e,"utf-8"),n=JSON.parse(s);n.hooks||(n.hooks={}),n.hooks.PostToolUse||(n.hooks.PostToolUse=[]),n.hooks.PostToolUse.some(i=>i.hooks?.some(a=>a.command.includes("ultracite")))||(n.hooks.PostToolUse.push({matcher:"Edit|Write",hooks:[{type:"command",command:t}]}),await N(e,JSON.stringify(n,null,2)))},qe=(e,t)=>{let s=We[e],n=As(t,"ultracite",{args:["fix"],short:t==="npm"}),o=async()=>{let i=Es(s.path);if(i!=="."){let a=i.startsWith("./")?i.slice(2):i;await Rs(a,{recursive:!0})}};return{exists:()=>f(s.path),create:async()=>{await o(),e==="cursor"?await N(s.path,JSON.stringify(Qe(n),null,2)):e==="claude"&&await N(s.path,JSON.stringify(Ze(n),null,2))},update:async()=>{await o(),e==="cursor"?await Fs(s.path,n):e==="claude"&&await Ns(s.path,n)}}};be();xe();Pe();Ce();import{readFile as an,writeFile as ft}from"fs/promises";import{glob as cn}from"glob";import{applyEdits as ln,modify as dn,parse as fn}from"jsonc-parser";var mt=async()=>{try{return await cn("**/tsconfig*.json",{ignore:["**/node_modules/**","**/dist/**","**/build/**","**/.next/**"],absolute:!1})}catch{return[]}},mn=e=>{if(!e)return!1;let t=e.compilerOptions;return t?t.strict===!0||t.strictNullChecks===!0:!1},pn=async e=>{try{let t=await an(e,"utf-8"),s=fn(t);if(mn(s))return;if(s===void 0){await ft(e,JSON.stringify({compilerOptions:{strictNullChecks:!0}},null,2));return}let o=dn(t,["compilerOptions","strictNullChecks"],!0,{formattingOptions:{tabSize:2,insertSpaces:!0}}),i=ln(t,o);await ft(e,i)}catch(t){console.warn(`Failed to update ${e}:`,t)}},Re={exists:async()=>(await mt()).length>0,update:async()=>{let e=await mt();if(e.length===0){console.warn("No tsconfig.json files found in the project");return}await Promise.all(e.map(t=>pn(t)))}};h();var pt=k.devDependencies["@biomejs/biome"],ut=k.version,wn=async(e,t=!0,s=!1)=>{let n=w();s||n.start("Installing dependencies...");let o=[`ultracite@${ut}`,`@biomejs/biome@${pt}`];if(t)for(let i of o)await hn(i,{packageManager:e,workspace:await C(),silent:!0});else await v({devDependencies:{"@biomejs/biome":pt,ultracite:ut}});s||n.stop("Dependencies installed.")},kn=async(e=!1)=>{let t=w();if(e||t.start("Checking for tsconfig.json files..."),await Re.exists()){e||t.message("Found tsconfig.json files, updating with strictNullChecks..."),await Re.update(),e||t.stop("tsconfig.json files updated.");return}e||t.stop("No tsconfig.json files found, skipping.")},bn=async(e=!1)=>{let t=w();if(e||t.start("Checking for .vscode/settings.json..."),await J.exists()){e||t.message("settings.json found, updating..."),await J.update(),e||t.stop("settings.json updated.");return}e||t.message("settings.json not found, creating..."),await J.create(),e||(t.message("settings.json created."),t.message("Installing Biome extension..."));try{let s=J.extension();e||(s.status===0?t.stop("settings.json created and Biome extension installed."):t.stop("settings.json created. Install Biome extension manually."))}catch{e||t.stop("settings.json created. Install Biome extension manually.")}},xn=async(e=!1)=>{let t=w();if(e||t.start("Checking for .zed/settings.json..."),await oe.exists()){e||t.message("settings.json found, updating..."),await oe.update(),e||t.stop("settings.json updated.");return}e||t.message("settings.json not found, creating..."),await oe.create(),e||t.message("settings.json created. Install the Biome extension: https://biomejs.dev/reference/zed/")},vn=async(e,t=!1)=>{let s=w();if(t||s.start("Checking for Biome configuration..."),await te.exists()){t||s.message("Biome configuration found, updating..."),await te.update({frameworks:e}),t||s.stop("Biome configuration updated.");return}t||s.message("Biome configuration not found, creating..."),await te.create({frameworks:e}),t||s.stop("Biome configuration created.")},Cn=async(e,t=!0,s=!1)=>{let n=w();if(s||(n.start("Initializing pre-commit hooks..."),n.message("Installing Husky...")),t?await S.install(e):await v({devDependencies:{husky:"latest"},scripts:{prepare:"husky"}}),s||n.message("Initializing Husky..."),S.init(e),await S.exists()){s||n.message("Pre-commit hook found, updating..."),await S.update(e),s||n.stop("Pre-commit hook updated.");return}s||n.message("Pre-commit hook not found, creating..."),await S.create(e),s||n.stop("Pre-commit hook created.")},jn=async(e,t=!0,s=!1)=>{let n=w();if(s||(n.start("Initializing lefthook..."),n.message("Installing lefthook...")),t?await O.install(e):await v({devDependencies:{lefthook:"latest"}}),await O.exists()){s||n.message("lefthook.yml found, updating..."),await O.update(e),s||n.stop("lefthook.yml updated.");return}s||n.message("lefthook.yml not found, creating..."),await O.create(e),s||n.stop("lefthook.yml created.")},Pn=async(e,t=!0,s=!1)=>{let n=w();if(s||(n.start("Initializing lint-staged..."),n.message("Installing lint-staged...")),t?await D.install(e):await v({devDependencies:{"lint-staged":"latest"}}),await D.exists()){s||n.message("lint-staged found, updating..."),await D.update(e),s||n.stop("lint-staged updated.");return}s||n.message("lint-staged not found, creating..."),await D.create(e),s||n.stop("lint-staged created.")},$n=async(e,t=!1)=>{let s=w();if(t||s.start("Initializing pre-commit..."),await W.exists()){t||s.message(".pre-commit-config.yaml found, updating..."),await W.update(e),t||s.stop(".pre-commit-config.yaml updated.");return}t||s.message(".pre-commit-config.yaml not found, creating..."),await W.create(e),t||s.stop(".pre-commit-config.yaml created.")},Sn=async(e,t,s,n=!1)=>{let o=w();n||o.start(`Checking for ${t}...`);let i=ze(e,s);if(await i.exists()){n||o.message(`${t} found, updating...`),await i.update(),n||o.stop(`${t} updated.`);return}n||o.message(`${t} not found, creating...`),await i.create(),n||o.stop(`${t} created.`)},Rn=async(e,t,s,n=!1)=>{let o=w();n||o.start(`Checking for ${t} hooks...`);let i=qe(e,s);if(await i.exists()){n||o.message(`${t} hooks found, updating...`),await i.update(),n||o.stop(`${t} hooks updated.`);return}n||o.message(`${t} hooks not found, creating...`),await i.create(),n||o.stop(`${t} hooks created.`)},En=async(e,t=!1)=>{let s=w();t||s.start("Removing Prettier dependencies and configuration...");try{let n=await pe.remove(e);t||(n.packagesRemoved.length>0&&s.message(`Removed Prettier packages: ${n.packagesRemoved.join(", ")}`),n.filesRemoved.length>0&&s.message(`Removed config files: ${n.filesRemoved.join(", ")}`),n.vsCodeCleaned&&s.message("Cleaned VS Code settings"),s.stop("Prettier removed successfully."))}catch{t||s.stop("Failed to remove Prettier completely, but continuing...")}},An=async(e,t=!1)=>{let s=w();t||s.start("Removing ESLint dependencies and configuration...");try{let n=await me.remove(e);t||(n.packagesRemoved.length>0&&s.message(`Removed ESLint packages: ${n.packagesRemoved.join(", ")}`),n.filesRemoved.length>0&&s.message(`Removed config files: ${n.filesRemoved.join(", ")}`),n.vsCodeCleaned&&s.message("Cleaned VS Code settings"),s.stop("ESLint removed successfully."))}catch{t||s.stop("Failed to remove ESLint completely, but continuing...")}},gt=async e=>{let t=e??{},s=t.quiet??!1;s||gn(Y);try{let{pm:n}=t;if(!n){let m=await yn(un.cwd());if(!m)throw new Error("No package manager specified or detected");if(!s&&m.warnings)for(let g of m.warnings)ae.warn(g);s||ae.info(`Detected lockfile, using ${m.name}`),n=m.name}let o=t.migrate?.includes("prettier"),i=t.migrate?.includes("eslint");if(!s&&(o===void 0||i===void 0)){let m=[];if(o===void 0&&await pe.hasPrettier()&&m.push({label:"Remove Prettier (dependencies, config files, VS Code settings)",value:"prettier"}),i===void 0&&await me.hasEsLint()&&m.push({label:"Remove ESLint (dependencies, config files, VS Code settings)",value:"eslint"}),m.length>0){let g=await U({message:"Remove existing formatters/linters (recommended for clean migration)?",options:m,required:!1});if(T(g)){M("Operation cancelled.");return}o===void 0&&(o=g.includes("prettier")),i===void 0&&(i=g.includes("eslint"))}}s&&(o===void 0&&(o=!1),i===void 0&&(i=!1));let a=t.frameworks;if(a===void 0)if(s||t.pm||t.editors||t.agents||t.hooks||t.integrations!==void 0||t.migrate!==void 0)a=[];else{let g=await U({message:"Which frameworks are you using (optional)?",options:[{label:"React",value:"react"},{label:"Next.js",value:"next"},{label:"Solid",value:"solid"},{label:"Vue",value:"vue"},{label:"Svelte",value:"svelte"},{label:"Qwik",value:"qwik"},{label:"Angular",value:"angular"},{label:"Remix / TanStack Router / React Router",value:"remix"},{label:"Astro",value:"astro"}],required:!1});if(T(g)){M("Operation cancelled.");return}a=g}let r=t.editors;if(!r)if(s)r=[];else{let m=await U({message:"Which editors do you want to configure (recommended)?",options:[{label:"VSCode / Cursor / Windsurf",value:"vscode"},{label:"Zed",value:"zed"}],required:!1});if(T(m)){M("Operation cancelled.");return}r=m}let c=t.agents,p=t.hooks,u={"vscode-copilot":"GitHub Copilot (VSCode)",cursor:"Cursor",windsurf:"Windsurf",zed:"Zed",claude:"Claude Code",codex:"OpenAI Codex / Jules / OpenCode",kiro:"Kiro IDE",cline:"Cline",amp:"AMP",aider:"Aider","firebase-studio":"Firebase Studio","open-hands":"Open Hands","gemini-cli":"Gemini CLI",junie:"Junie",augmentcode:"Augment Code","kilo-code":"Kilo Code",goose:"Codename Goose","roo-code":"Roo Code",warp:"Warp",droid:"Droid",antigravity:"Antigravity"};if(!c)if(s)c=[];else{let m=await U({message:"Which agents do you want to enable (optional)?",options:Object.entries(u).map(([g,ce])=>({value:g,label:ce})),required:!1});if(T(m)){M("Operation cancelled.");return}c=m}let x={cursor:"Cursor",claude:"Claude Code"};if(!p)if(s)p=[];else{let m=await U({message:"Which agent hooks do you want to enable (optional)?",options:Object.entries(x).map(([g,ce])=>({value:g,label:ce})),required:!1});if(T(m)){M("Operation cancelled.");return}p=m}let y=t.integrations;if(y===void 0)if(s||t.pm||t.editors||t.agents||t.hooks||t.migrate!==void 0)y=[];else{let g=await U({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"},{label:"pre-commit (Python framework)",value:"pre-commit"}],required:!1});if(T(g)){M("Operation cancelled.");return}y=g}o&&await En(n,s),i&&await An(n,s),await wn(n,!t.skipInstall,s),await kn(s),await vn(a,s),r?.includes("vscode")&&await bn(s),r?.includes("zed")&&await xn(s);for(let m of c??[])await Sn(m,u[m],n,s);for(let m of p??[])await Rn(m,x[m],n,s);y?.includes("husky")&&await Cn(n,!t.skipInstall,s),y?.includes("lefthook")&&await jn(n,!t.skipInstall,s),y?.includes("lint-staged")&&await Pn(n,!t.skipInstall,s),y?.includes("pre-commit")&&await $n(n,s),s||ae.success("Successfully initialized Ultracite configuration!")}catch(n){let o=n instanceof Error?n.message:"Unknown error";throw s||ae.error(`Failed to initialize Ultracite configuration: ${o}`),n}};var A=Fn.meta().create(),On=A.router({init:A.procedure.meta({description:"Initialize Ultracite in the current directory"}).input(d.object({pm:d.enum(j.packageManagers).optional().describe("Package manager to use"),editors:d.array(d.enum(j.editorConfigs)).optional().describe("Editors to configure"),agents:d.array(d.enum(j.agents)).optional().describe("Agents to enable"),hooks:d.array(d.enum(j.hooks)).optional().describe("Hooks to enable"),frameworks:d.array(d.enum(j.frameworks)).optional().describe("Frameworks being used"),integrations:d.array(d.enum(j.integrations)).optional().describe("Additional integrations to enable"),migrate:d.array(d.enum(j.migrations)).optional().describe("Migration tools to remove (e.g., eslint, prettier). Removes dependencies, config files, and editor settings."),skipInstall:d.boolean().default(!1).describe("Skip installing dependencies"),quiet:d.boolean().default(process.env.CI==="true"||process.env.CI==="1").describe("Suppress all interactive prompts and visual output. Automatically enabled in CI environments.")})).mutation(async({input:e})=>{await gt(e)}),check:A.procedure.meta({description:"Run Biome linter without fixing files"}).input(d.tuple([d.array(d.string()).optional().default([]).describe("specific files to lint"),d.object({"diagnostic-level":d.enum(["info","warn","error"]).optional().describe("level of diagnostics to show. In order, from the lowest to the most important: info, warn, error.")})]).optional()).query(async({input:e})=>{await fe(e)}),fix:A.procedure.meta({description:"Run Biome linter and fixes files"}).input(d.tuple([d.array(d.string()).optional().default([]).describe("specific files to format"),d.object({unsafe:d.boolean().optional().describe("apply unsafe fixes")})]).optional()).mutation(async({input:e})=>{let[t,s]=e??[[],{}];await ge(t,{unsafe:s.unsafe})}),doctor:A.procedure.meta({description:"Verify your Ultracite setup and check for issues"}).query(async()=>{await Be()}),lint:A.procedure.meta({description:"\u26A0\uFE0F DEPRECATED: Use 'check' instead - Run Biome linter without fixing files"}).input(d.array(d.string()).optional().default([]).describe("specific files to lint")).query(async({input:e})=>{console.warn("\u26A0\uFE0F Warning: 'lint' command is deprecated. Please use 'check' instead."),await fe([e,{}])}),format:A.procedure.meta({description:"\u26A0\uFE0F DEPRECATED: Use 'fix' instead - Run Biome linter and fixes files"}).input(d.tuple([d.array(d.string()).optional().default([]).describe("specific files to format"),d.object({unsafe:d.boolean().optional().describe("apply unsafe fixes")})]).optional()).mutation(async({input:e})=>{let[t,s]=e??[[],{}];console.warn("\u26A0\uFE0F Warning: 'format' command is deprecated. Please use 'fix' instead."),await ge(t,{unsafe:s.unsafe})})}),Dn=Nn({router:On,name:k.name,version:k.version,description:k.description});process.env.TEST||Dn.run();export{On as router};
|
|
293
|
+
Most formatting and common issues are automatically fixed by Biome. Run \`${t} ultracite fix\` before committing to ensure compliance.
|
|
294
|
+
`;f();import{dlxCommand as N2}from"nypm";var Ot=(t,e)=>{let i=_.find(r=>r.id===t);if(!i)throw new Error(`Agent "${t}" not found`);let o=N2(e,""),n=At(o),s=i.config.header?`${i.config.header}
|
|
295
|
+
|
|
296
|
+
${n}`:n;return{exists:()=>c(i.config.path),create:async()=>{await b(i.config.path),await P1(i.config.path,s)},update:async()=>{await b(i.config.path);let r=await c(i.config.path);if(!(i.config.appendMode&&r)){await P1(i.config.path,s);return}let a=await D2(i.config.path,"utf-8");a.includes(n.trim())||await P1(i.config.path,`${a}
|
|
297
|
+
|
|
298
|
+
${n}`)}}};import{spawnSync as T2}from"child_process";import{readFile as G2,writeFile as E1}from"fs/promises";f();import M2 from"deepmerge";import{parse as J2}from"jsonc-parser";var Bt=(t,e="biome")=>{let i=x.find(n=>n.id===t);if(!i)throw new Error(`Editor "${t}" not found`);let o=i.config.getContent(e);return{exists:()=>c(i.config.path),create:async()=>{await b(i.config.path),await E1(i.config.path,JSON.stringify(o,null,2))},update:async()=>{if(await b(i.config.path),!await c(i.config.path)){await E1(i.config.path,JSON.stringify(o,null,2));return}let s=await G2(i.config.path,"utf-8"),a=J2(s)||{},m=M2(a,o);await E1(i.config.path,JSON.stringify(m,null,2))},extension:i.config.extensionCommand?n=>T2(`${i.config.extensionCommand} ${n}`,{stdio:"pipe",shell:!0}):void 0}};import{readFile as W2,writeFile as A1}from"fs/promises";f();import H2 from"deepmerge";import{dlxCommand as V2}from"nypm";var It=(t,e)=>{let i=x.find(a=>a.id===t);if(!i)throw new Error(`Editor "${t}" not found`);if(!i.hooks)throw new Error(`Editor "${t}" does not support hooks`);let o=V2(e,"ultracite",{args:["fix"],short:e==="npm"}),n=i.hooks.getContent(o),s=a=>JSON.stringify(a).includes("ultracite"),r=async()=>{if(!i.hooks?.path)throw new Error(`Editor "${t}" does not support hooks`);if(!await c(i.hooks.path)){await A1(i.hooks.path,JSON.stringify(n,null,2));return}let m=await W2(i.hooks.path,"utf-8"),h=JSON.parse(m);if(!s(h)){let j=H2(h,n);await A1(i.hooks.path,JSON.stringify(j,null,2))}};return{exists:()=>i.hooks?.path?c(i.hooks.path):!1,create:async()=>{if(!i.hooks?.path)throw new Error(`Editor "${t}" does not support hooks`);await b(i.hooks.path),await A1(i.hooks.path,JSON.stringify(n,null,2))},update:async()=>{if(!i.hooks?.path)throw new Error(`Editor "${t}" does not support hooks`);await b(i.hooks.path),await r()}}};B1();I1();U1();$1();f();import{readFile as k3,writeFile as Jt}from"fs/promises";import b3 from"deepmerge";import{parse as z3}from"jsonc-parser";var Wt={$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["ultracite/biome/core"]},D1=async()=>await c("./biome.json")?"./biome.json":"./biome.jsonc",p1={exists:async()=>{let t=await D1();return c(t)},create:async t=>{let e=await D1(),i=["ultracite/biome/core"];if(t?.frameworks&&t.frameworks.length>0)for(let n of t.frameworks)i.push(`ultracite/biome/${n}`);let o={...Wt,extends:i};return Jt(e,JSON.stringify(o,null,2))},update:async t=>{let e=await D1(),i=await k3(e,"utf-8"),n=z3(i)||{},r=[...n.extends&&Array.isArray(n.extends)?n.extends:[]];if(r.includes("ultracite/biome/core")||r.push("ultracite/biome/core"),t?.frameworks&&t.frameworks.length>0)for(let h of t.frameworks){let j=`ultracite/biome/${h}`;r.includes(j)||r.push(j)}n.extends=r;let a={$schema:Wt.$schema},m=b3(n,a);await Jt(e,JSON.stringify(m,null,2))}};f();import{writeFile as Ht}from"fs/promises";var C3=["./eslint.config.mjs","./eslint.config.js","./eslint.config.cjs","./eslint.config.ts","./eslint.config.mts","./eslint.config.cts"],Vt="./eslint.config.mjs",S3=async()=>{for(let t of C3)if(await c(t))return t;return null},Xt=t=>{let e=['import core from "ultracite/eslint/core";'],i=["...core"];if(t?.frameworks&&t.frameworks.length>0)for(let o of t.frameworks)e.push(`import ${o} from "ultracite/eslint/${o}";`),i.push(`...${o}`);return`${e.join(`
|
|
299
|
+
`)}
|
|
300
|
+
|
|
301
|
+
export default [
|
|
302
|
+
${i.join(`,
|
|
303
|
+
`)},
|
|
304
|
+
];
|
|
305
|
+
`},g1={exists:async()=>await S3()!==null,create:async t=>{let e=Xt(t);await Ht(Vt,e)},update:async t=>{let e=Xt(t);await Ht(Vt,e)}};f();import{readFile as j3,writeFile as Qt}from"fs/promises";import P3 from"deepmerge";import{parse as E3}from"jsonc-parser";var u1="./.oxfmtrc.jsonc",Kt={$schema:"./node_modules/oxfmt/configuration_schema.json",printWidth:80,tabWidth:2,useTabs:!1,semi:!0,singleQuote:!1,quoteProps:"as-needed",jsxSingleQuote:!1,trailingComma:"es5",bracketSpacing:!0,bracketSameLine:!1,arrowParens:"always",endOfLine:"lf",experimentalSortPackageJson:!0,experimentalSortImports:{ignoreCase:!0,newlinesBetween:!0,order:"asc"}},h1={exists:async()=>await c(u1),create:async()=>{let t=`// Ultracite oxfmt Configuration
|
|
306
|
+
// https://oxc.rs/docs/guide/usage/formatter/config-file-reference.html
|
|
307
|
+
${JSON.stringify(Kt,null,2)}
|
|
308
|
+
`;return await Qt(u1,t)},update:async()=>{let t=await j3(u1,"utf-8"),i=E3(t)||{},o=P3(i,Kt),n=`// Ultracite oxfmt Configuration
|
|
309
|
+
// https://oxc.rs/docs/guide/usage/formatter/config-file-reference.html
|
|
310
|
+
${JSON.stringify(o,null,2)}
|
|
311
|
+
`;await Qt(u1,n)}};f();import{readFile as A3,writeFile as Yt}from"fs/promises";import O3 from"deepmerge";import{parse as B3}from"jsonc-parser";var w1="./.oxlintrc.json",Zt={$schema:"./node_modules/oxlint/configuration_schema.json",extends:["ultracite/oxlint/core"]},x1={exists:async()=>await c(w1),create:async t=>{let e=["ultracite/oxlint/core"];if(t?.frameworks&&t.frameworks.length>0)for(let o of t.frameworks)e.push(`ultracite/oxlint/${o}`);let i={...Zt,extends:e};return await Yt(w1,JSON.stringify(i,null,2))},update:async t=>{let e=await A3(w1,"utf-8"),o=B3(e)||{},s=[...o.extends&&Array.isArray(o.extends)?o.extends:[]];if(s.includes("ultracite/oxlint/core")||s.push("ultracite/oxlint/core"),t?.frameworks&&t.frameworks.length>0)for(let m of t.frameworks){let h=`ultracite/oxlint/${m}`;s.includes(h)||s.push(h)}o.extends=s;let r={$schema:Zt.$schema},a=O3(o,r);await Yt(w1,JSON.stringify(a,null,2))}};f();import{readFile as I3,writeFile as qt}from"fs/promises";var F3=["./.prettierrc.mjs","./prettier.config.mjs","./.prettierrc.mts","./prettier.config.mts","./.prettierrc.cjs","./prettier.config.cjs","./.prettierrc.cts","./prettier.config.cts","./.prettierrc.js","./prettier.config.js","./.prettierrc.ts","./prettier.config.ts","./.prettierrc","./.prettierrc.json","./.prettierrc.json5","./.prettierrc.yml","./.prettierrc.yaml","./.prettierrc.toml"],te="./prettier.config.mjs",$3=async()=>{try{return"prettier"in JSON.parse(await I3("./package.json","utf-8"))}catch{return!1}},_3=async()=>{if(await $3())return"./package.json";for(let t of F3)if(await c(t))return t;return null},ee=()=>`export { default } from "ultracite/prettier";
|
|
312
|
+
`,v1={exists:async()=>await _3()!==null,create:async()=>{let t=ee();await qt(te,t)},update:async()=>{let t=ee();await qt(te,t)}};f();import{readFile as U3,writeFile as ie}from"fs/promises";var L3=["./.stylelintrc.mjs","./stylelint.config.mjs","./.stylelintrc.cjs","./stylelint.config.cjs","./.stylelintrc.js","./stylelint.config.js","./.stylelintrc","./.stylelintrc.json","./.stylelintrc.yml","./.stylelintrc.yaml"],oe="./stylelint.config.mjs",R3=async()=>{try{return"stylelint"in JSON.parse(await U3("./package.json","utf-8"))}catch{return!1}},D3=async()=>{if(await R3())return"./package.json";for(let t of L3)if(await c(t))return t;return null},ne=()=>`export { default } from "ultracite/stylelint";
|
|
313
|
+
`,y1={exists:async()=>await D3()!==null,create:async()=>{let t=ne();await ie(oe,t)},update:async()=>{let t=ne();await ie(oe,t)}};import{readFile as N3,writeFile as se}from"fs/promises";import{glob as T3}from"glob";import{applyEdits as G3,modify as M3,parse as J3}from"jsonc-parser";var re=async()=>{try{return await T3("**/tsconfig*.json",{ignore:["**/node_modules/**","**/dist/**","**/build/**","**/.next/**"],absolute:!1})}catch{return[]}},W3=t=>{if(!t)return!1;let e=t.compilerOptions;return e?e.strict===!0||e.strictNullChecks===!0:!1},H3=async t=>{try{let e=await N3(t,"utf-8"),i=J3(e);if(W3(i))return;if(i===void 0){await se(t,JSON.stringify({compilerOptions:{strictNullChecks:!0}},null,2));return}let n=M3(e,["compilerOptions","strictNullChecks"],!0,{formattingOptions:{tabSize:2,insertSpaces:!0}}),s=G3(e,n);await se(t,s)}catch(e){console.warn(`Failed to update ${t}:`,e)}},N1={exists:async()=>(await re()).length>0,update:async()=>{let t=await re();if(t.length===0){console.warn("No tsconfig.json files found in the project");return}await Promise.all(t.map(e=>H3(e)))}};f();var ae=y.devDependencies["@biomejs/biome"],T1=y.version,Z3=async(t,e="biome",i=!0,o=!1)=>{let n=p();o||n.start("Installing dependencies...");let s=[`ultracite@${T1}`];if(e==="biome"&&s.push(`@biomejs/biome@${ae}`),e==="eslint"&&(s.push("eslint@latest"),s.push("prettier@latest"),s.push("stylelint@latest")),e==="oxlint"&&(s.push("oxlint@latest"),s.push("oxfmt@latest")),i)for(let r of s)await K3(r,{packageManager:t,workspace:await z(),silent:!0});else{let r={ultracite:T1};e==="biome"&&(r["@biomejs/biome"]=ae),e==="eslint"&&(r.eslint="latest",r.prettier="latest",r.stylelint="latest"),e==="oxlint"&&(r.oxlint="latest",r.oxfmt="latest"),await k({devDependencies:r})}o||n.stop("Dependencies installed.")},q3=async(t=!1)=>{let e=p();if(t||e.start("Checking for tsconfig.json files..."),await N1.exists()){t||e.message("Found tsconfig.json files, updating with strictNullChecks..."),await N1.update(),t||e.stop("tsconfig.json files updated.");return}t||e.stop("No tsconfig.json files found, skipping.")},ti=async(t,e="biome",i=!1)=>{let o=x.find(r=>r.id===t);if(!o)throw new Error(`Editor "${t}" not found`);let n=Bt(t,e),s=p();if(i||s.start(`Checking for ${o.config.path}...`),await n.exists()){i||s.message(`${o.config.path} found, updating...`),await n.update(),i||s.stop(`${o.config.path} updated.`);return}if(i||s.message(`${o.config.path} not found, creating...`),await n.create(),n.extension){let r=s1.find(a=>a.id===e)?.vscodeExtensionId;if(!r)throw new Error(`Linter extension not found for ${e}`);i||s.message(`Installing ${r} extension...`);try{if(n.extension(r).status===0){i||s.stop(`${o.config.path} created and ${r} extension installed.`);return}}catch{}i||s.stop(`${o.config.path} created. Install ${r} extension manually.`);return}i||(t==="zed"?s.stop(`${o.config.path} created. Install the Biome extension: https://biomejs.dev/reference/zed/`):s.stop(`${o.config.path} created.`))},ei=async(t,e=!1)=>{let i=p();if(e||i.start("Checking for Biome configuration..."),await p1.exists()){e||i.message("Biome configuration found, updating..."),await p1.update({frameworks:t}),e||i.stop("Biome configuration updated.");return}e||i.message("Biome configuration not found, creating..."),await p1.create({frameworks:t}),e||i.stop("Biome configuration created.")},ii=async(t,e=!1)=>{let i=p();if(e||i.start("Checking for ESLint configuration..."),await g1.exists()){e||i.message("ESLint configuration found, updating..."),await g1.update({frameworks:t}),e||i.stop("ESLint configuration updated.");return}e||i.message("ESLint configuration not found, creating..."),await g1.create({frameworks:t}),e||i.stop("ESLint configuration created.")},oi=async(t,e=!1)=>{let i=p();if(e||i.start("Checking for Oxlint configuration..."),await x1.exists()){e||i.message("Oxlint configuration found, updating..."),await x1.update({frameworks:t}),e||i.stop("Oxlint configuration updated.");return}e||i.message("Oxlint configuration not found, creating..."),await x1.create({frameworks:t}),e||i.stop("Oxlint configuration created.")},ni=async(t=!1)=>{let e=p();if(t||e.start("Checking for Prettier configuration..."),await v1.exists()){t||e.message("Prettier configuration found, updating..."),await v1.update(),t||e.stop("Prettier configuration updated.");return}t||e.message("Prettier configuration not found, creating..."),await v1.create(),t||e.stop("Prettier configuration created.")},si=async(t=!1)=>{let e=p();if(t||e.start("Checking for Stylelint configuration..."),await y1.exists()){t||e.message("Stylelint configuration found, updating..."),await y1.update(),t||e.stop("Stylelint configuration updated.");return}t||e.message("Stylelint configuration not found, creating..."),await y1.create(),t||e.stop("Stylelint configuration created.")},ri=async(t=!1)=>{let e=p();if(t||e.start("Checking for oxfmt configuration..."),await h1.exists()){t||e.message("oxfmt configuration found, updating..."),await h1.update(),t||e.stop("oxfmt configuration updated.");return}t||e.message("oxfmt configuration not found, creating..."),await h1.create(),t||e.stop("oxfmt configuration created.")},ai=async(t,e=!0,i=!1)=>{let o=p();if(i||(o.start("Initializing pre-commit hooks..."),o.message("Installing Husky...")),e?await B.install(t):await k({devDependencies:{husky:"latest"},scripts:{prepare:"husky"}}),i||o.message("Initializing Husky..."),B.init(t),await B.exists()){i||o.message("Pre-commit hook found, updating..."),await B.update(t),i||o.stop("Pre-commit hook updated.");return}i||o.message("Pre-commit hook not found, creating..."),await B.create(t),i||o.stop("Pre-commit hook created.")},ci=async(t,e=!0,i=!1)=>{let o=p();if(i||(o.start("Initializing lefthook..."),o.message("Installing lefthook...")),e?await W.install(t):await k({devDependencies:{lefthook:"latest"}}),await W.exists()){i||o.message("lefthook.yml found, updating..."),await W.update(t),i||o.stop("lefthook.yml updated.");return}i||o.message("lefthook.yml not found, creating..."),await W.create(t),i||o.stop("lefthook.yml created.")},li=async(t,e=!0,i=!1)=>{let o=p();if(i||(o.start("Initializing lint-staged..."),o.message("Installing lint-staged...")),e?await H.install(t):await k({devDependencies:{"lint-staged":"latest"}}),await H.exists()){i||o.message("lint-staged found, updating..."),await H.update(t),i||o.stop("lint-staged updated.");return}i||o.message("lint-staged not found, creating..."),await H.create(t),i||o.stop("lint-staged created.")},di=async(t,e=!1)=>{let i=p();if(e||i.start("Initializing pre-commit..."),await Y.exists()){e||i.message(".pre-commit-config.yaml found, updating..."),await Y.update(t),e||i.stop(".pre-commit-config.yaml updated.");return}e||i.message(".pre-commit-config.yaml not found, creating..."),await Y.create(t),e||i.stop(".pre-commit-config.yaml created.")},fi=async(t,e,i,o=!1)=>{let n=p();o||n.start(`Checking for ${e}...`);let s=Ot(t,i);if(await s.exists()){o||n.message(`${e} found, updating...`),await s.update(),o||n.stop(`${e} updated.`);return}o||n.message(`${e} not found, creating...`),await s.create(),o||n.stop(`${e} created.`)},mi=async(t,e,i,o=!1)=>{let n=p();o||n.start(`Checking for ${e} hooks...`);let s=It(t,i);if(await s.exists()){o||n.message(`${e} hooks found, updating...`),await s.update(),o||n.stop(`${e} hooks updated.`);return}o||n.message(`${e} hooks not found, creating...`),await s.create(),o||n.stop(`${e} hooks created.`)},ce=async t=>{let e=t??{},i=e.quiet??!1;i||X3(`Ultracite v${T1} Initialization`);try{let{pm:o}=e;if(!o){let l=await Y3(V3.cwd());if(!l)throw new Error("No package manager specified or detected");if(!i&&l.warnings)for(let g of l.warnings)k1.warn(g);i||k1.info(`Detected lockfile, using ${l.name}`),o=l.name}let n=e.linter;if(n===void 0)if(i||e.pm||e.editors||e.agents||e.hooks||e.integrations!==void 0||e.frameworks!==void 0)n="biome";else{let g=await Q3({message:"Which linter do you want to use?",options:[{label:"Biome (Recommended)",value:"biome"},{label:"ESLint + Prettier + Stylelint",value:"eslint"},{label:"Oxlint + Oxfmt",value:"oxlint"}]});if(X(g)){V("Operation cancelled.");return}n=g}let s=e.frameworks;if(s===void 0)if(i||e.pm||e.editors||e.agents||e.hooks||e.integrations!==void 0)s=[];else{let g=await q({message:"Which frameworks are you using (optional)?",options:[{label:"React",value:"react"},{label:"Next.js",value:"next"},{label:"Solid",value:"solid"},{label:"Vue",value:"vue"},{label:"Svelte",value:"svelte"},{label:"Qwik",value:"qwik"},{label:"Angular",value:"angular"},{label:"Remix / TanStack Router / React Router",value:"remix"},{label:"Astro",value:"astro"}],required:!1});if(X(g)){V("Operation cancelled.");return}s=g}let r=e.editors;if(!r)if(i)r=[];else{let l=await q({message:"Which editors do you want to configure (recommended)?",options:[{label:"VSCode / Cursor / Windsurf",value:"vscode"},{label:"Zed",value:"zed"}],required:!1});if(X(l)){V("Operation cancelled.");return}r=l}let a=e.agents,m=e.hooks,h=Object.fromEntries(_.map(l=>[l.id,l.name]));if(!a)if(i)a=[];else{let l=await q({message:"Which agents do you want to enable (optional)?",options:Object.entries(h).map(([g,b1])=>({value:g,label:b1})),required:!1});if(X(l)){V("Operation cancelled.");return}a=l}let j=Object.fromEntries(x.filter(l=>l.hooks).map(l=>[l.id,l.name]));if(!m)if(i)m=[];else{let l=await q({message:"Which agent hooks do you want to enable (optional)?",options:Object.entries(j).map(([g,b1])=>({value:g,label:b1})),required:!1});if(X(l)){V("Operation cancelled.");return}m=l}let P=e.integrations;if(P===void 0)if(i||e.pm||e.editors||e.agents||e.hooks)P=[];else{let g=await q({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"},{label:"pre-commit (Python framework)",value:"pre-commit"}],required:!1});if(X(g)){V("Operation cancelled.");return}P=g}await Z3(o,n,!e.skipInstall,i),await q3(i),n==="biome"&&await ei(s,i),n==="eslint"&&(await ii(s,i),await ni(i),await si(i)),n==="oxlint"&&(await oi(s,i),await ri(i));for(let l of r??[])await ti(l,n,i);for(let l of a??[])await fi(l,h[l],o,i);for(let l of m??[])await mi(l,j[l],o,i);P?.includes("husky")&&await ai(o,!e.skipInstall,i),P?.includes("lefthook")&&await ci(o,!e.skipInstall,i),P?.includes("lint-staged")&&await li(o,!e.skipInstall,i),P?.includes("pre-commit")&&await di(o,i),i||k1.success("Successfully initialized Ultracite configuration!")}catch(o){let n=o instanceof Error?o.message:"Unknown error";throw i||k1.error(`Failed to initialize Ultracite configuration: ${n}`),o}};var t1=pi.meta().create(),hi=t1.router({init:t1.procedure.meta({description:"Initialize Ultracite in the current directory"}).input(d.object({pm:d.enum(gi.map(t=>t.name)).optional().describe("Package manager to use"),linter:d.enum(v.linters).optional().describe("Linter / formatter to use"),editors:d.array(d.enum(v.editorConfigs)).optional().describe("Editors to configure"),agents:d.array(d.enum(v.agents)).optional().describe("Agents to enable"),hooks:d.array(d.enum(v.hooks)).optional().describe("Hooks to enable"),frameworks:d.array(d.enum(v.frameworks)).optional().describe("Frameworks being used"),integrations:d.array(d.enum(v.integrations)).optional().describe("Additional integrations to enable"),migrate:d.array(d.enum(v.migrations)).optional().describe("Migration tools to remove (e.g., eslint, prettier). Removes dependencies, config files, and editor settings."),skipInstall:d.boolean().default(!1).describe("Skip installing dependencies"),quiet:d.boolean().default(process.env.CI==="true"||process.env.CI==="1").describe("Suppress all interactive prompts and visual output. Automatically enabled in CI environments.")})).mutation(async({input:t})=>{await ce(t)}),check:t1.procedure.meta({description:"Run linter without fixing files"}).input(d.tuple([d.array(d.string()).optional().default([]).describe("specific files to lint"),d.object({"diagnostic-level":d.enum(["info","warn","error"]).optional().describe("level of diagnostics to show. In order, from the lowest to the most important: info, warn, error."),linter:d.enum(v.linters).optional().describe("linter to use (biome, eslint, or oxlint)")})]).optional()).query(async({input:t})=>{await St(t)}),fix:t1.procedure.meta({description:"Run linter and fix files"}).input(d.tuple([d.array(d.string()).optional().default([]).describe("specific files to format"),d.object({unsafe:d.boolean().optional().describe("apply unsafe fixes"),linter:d.enum(v.linters).optional().describe("linter to use (biome, eslint, or oxlint)")})]).optional()).mutation(async({input:t})=>{let[e,i]=t??[[],{}];await Et(e,{unsafe:i.unsafe,linter:i.linter})}),doctor:t1.procedure.meta({description:"Verify your Ultracite setup and check for issues"}).query(async()=>{await Pt()})}),wi=ui({router:hi,name:y.name,version:y.version,description:y.description});process.env.TEST||wi.run();export{hi as router};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" height="96" viewBox="0 0 96 96" width="96" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h96v96h-96z" fill="#642cc2"/><path d="m69.3127 62.6326c-1.3186 0-2.3394 1.0634-2.3394 2.3394 0 1.3187-1.0634 2.3395-2.3395 2.3395s-2.4246-1.0208-2.4246-2.2969v-11.9952c.2978-.5955.4679-1.2336.4679-1.9567v-13.7391c0-8.167-6.6356-14.8026-14.76-14.8026s-14.8026 6.6356-14.8026 14.8026v13.7391c0 .9358.2978 1.8291.8082 2.5522v11.3997c0 1.3186-1.0634 2.3395-2.382 2.3395s-2.3395-1.0634-2.3395-2.3395-1.0634-2.3395-2.3395-2.3395c-1.3186 0-2.3395 1.0634-2.3395 2.3395 0 3.7432 2.935 6.7632 6.5931 7.0184.1702.0426.2978.0426.4679.0426.1702 0 .3403 0 .4679-.0426 3.6581-.2552 6.5931-3.2752 6.5931-7.0184v-9.443s-.1276-1.9992 1.5738-1.9992c1.7015 0 1.5739 1.9992 1.5739 1.9992v9.3579c0 1.3186 1.0634 2.3395 2.3395 2.3395 1.276 0 2.3395-1.0634 2.3395-2.3395v-9.3579s-.3403-1.9992 1.5738-1.9992 1.5738 1.9992 1.5738 1.9992v9.3579c0 1.3186 1.0634 2.3395 2.3395 2.3395 1.3186 0 2.3395-1.0634 2.3395-2.3395v-9.3579s-.1276-1.9992 1.5738-1.9992c1.7015 0 1.5739 1.9992 1.5739 1.9992v9.443c0 3.7432 2.935 6.7632 6.5931 7.0184.1701.0426.2977.0426.4679.0426.1701 0 .3403 0 .4679-.0426 3.7006-.2552 6.5931-3.2752 6.5931-7.0184.085-1.3186-.9784-2.382-2.2545-2.382zm-29.1372-13.3564c-1.3186 0-2.3395-1.3186-2.3395-2.935 0-1.6163 1.0634-2.935 2.3395-2.935s2.3395 1.3187 2.3395 2.935c.0425 1.6164-1.0209 2.935-2.3395 2.935zm15.7384 0c-1.3187 0-2.3395-1.3186-2.3395-2.935 0-1.6163 1.0634-2.935 2.3395-2.935s2.3395 1.3187 2.3395 2.935c.0425 1.6164-1.0209 2.935-2.3395 2.935z" fill="#fff"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" height="96" viewBox="0 0 96 96" width="96" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h96v96h-96z" fill="#48e054"/><path d="m57.4639 38.6667h18.6666v3.1126c0 21.7794-9.338 34.2207-34.2206 34.2207h-3.1127v-18.6667h3.1127c10.885 0 15.554-4.669 15.554-15.554zm-18.7974 0h-18.6666v18.6666h18.6666zm18.6667-18.6667h-18.6667v18.6667h18.6667z" fill="#fff"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" height="96" viewBox="0 0 96 96" width="96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="a"><path d="m20 20h56v56h-56z"/></clipPath><path d="m0 0h96v96h-96z" fill="#f0f0f0"/><g clip-path="url(#a)"><path d="m20 20v56h56v-56zm51.8519 51.8519h-47.7038v-47.7038h47.7038zm-17.6297-11.5825h5.1852v4.1481h-6.5185l-2.8148-2.8148v-6.5185h4.1481zm9.3334 0h-4.1482v-5.1852h-5.1852v-4.1482h6.5185l2.8149 2.8149zm-17.6297-6.047h-4.1481v-4.1482h4.1481zm-13.4815-4.1482h4.1482v9.3334h9.3333v4.1481h-10.6666l-2.8149-2.8148zm31.1112-8.2964v4.1481h-13.4815v-4.1481h4.6358v-5.1852h-4.6358v-4.1482h5.9691l2.8148 2.8149v6.5185zm-26.963-4.6667h5.1852l4.1481 4.1482v4.6666h-4.1481v-4.6666h-5.1852v4.6666h-4.1482v-13.4815h4.1482zm9.3333 0h-4.1481v-4.6667h4.1481z" fill="#231f20"/></g></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" height="96" viewBox="0 0 96 96" width="96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><mask id="a" height="57" maskUnits="userSpaceOnUse" width="47" x="24" y="20"><path d="m70.9987 20.026h-46.0601v56h46.0601z" fill="#fff"/></mask><path d="m0 0h96v96h-96z" fill="#9046ff"/><g mask="url(#a)"><path d="m33.8075 63.4223c-5.7924 12.8272 6.545 16.0468 15.6448 8.5396 2.6776 8.4172 12.705 2.1354 16.31-4.3924 7.9276-14.3847 4.725-29.0499 3.9025-32.0774-5.635-20.6324-33.8098-20.6675-38.6573.105-1.1375 3.64-1.155 7.77-1.785 12.0575-.315 2.17-.56 3.5525-1.3825 5.8273-.49 1.3128-1.1375 2.4676-2.1875 4.4275-1.61 3.0453-.9275 8.9077 7.4025 5.8628l.7875-.3499z" fill="#fff"/><g fill="#000"><path d="m50.5406 44.4358c-2.3099 0-2.6599-2.765-2.6599-4.41 0-1.4875.2625-2.6599.7702-3.4125.4374-.6649 1.0849-.9975 1.8897-.9975.8052 0 1.5051.3326 1.995 1.015.56.7701.8576 1.9425.8576 3.395 0 2.765-1.0672 4.41-2.8348 4.41z"/><path d="m60.0575 44.4358c-2.3099 0-2.6598-2.765-2.6598-4.41 0-1.4875.2624-2.6599.7701-3.4125.4374-.6649 1.0849-.9975 1.8897-.9975.8052 0 1.5051.3326 1.995 1.015.5601.7701.8576 1.9425.8576 3.395 0 2.765-1.0672 4.41-2.8348 4.41z"/></g></g></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" height="96" viewBox="0 0 96 96" width="96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="a"><path d="m20 29h56v37.3333h-56z"/></clipPath><mask id="b" height="38" maskUnits="userSpaceOnUse" width="56" x="20" y="29"><path d="m76 29h-56v37.3333h56z" fill="#fff"/></mask><mask id="c" height="38" maskUnits="userSpaceOnUse" width="56" x="20" y="29"><path d="m76 29h-56v37.3333h56z" fill="#fff"/></mask><path d="m0 0h96v96h-96z" fill="#ffe165"/><g clip-path="url(#a)"><g mask="url(#b)"><g mask="url(#c)"><path d="m73.7941 40.1971c-1.7883-1.0708-2.9832.5704-2.8367 2.7987l-.0149.0169c.005-2.327-.3179-4.8971-1.391-6.9763-.38-.7363-1.1501-1.9468-2.6728-1.3764-.6682.2502-1.2743 1.0034-.9613 2.9478 0 0 .3478 2.0407.283 4.6059v.0361c-.4346-7.0749-2.0741-9.2334-4.419-9.0939-.7501.13-1.776.4452-1.4307 2.6206 0 0 .3751 2.2693.4968 4.0765l.0074.0915h-.0074c-1.1029-3.9008-2.5884-3.9538-3.664-3.8022-.9762.1372-2.0419 1.1238-1.5029 3.0682 1.6916 6.1003 1.3613 13.4471 1.2347 14.4987-.3454-.7194-.4522-1.2897-.9316-2.0791-1.9277-3.1693-2.8442-3.4026-3.9696-3.4508-1.1177-.0482-2.3249.6232-2.2455 1.9011.0821 1.2777.7503 1.4895 1.6991 3.2703.7403 1.3861.9514 3.2029 2.4419 6.5046 1.2344 2.7337 4.4613 5.7322 10.3384 5.376 4.7619-.1541 11.8738-1.776 10.6366-12.4269-.308-1.8505-.0769-3.4002.0846-4.9885.2508-2.4642.6185-6.5479-1.1726-7.6212z" fill="#ffe165"/><path d="m44.0604 48.2539c-1.1254.0697-2.0345.3176-3.9025 3.5206-.4644.7966-.5589 1.3691-.8916 2.0935-.1467-1.0491-.6162-8.3887.9586-14.5179.5019-1.9516-.5811-2.919-1.5599-3.0393-1.078-.1324-2.566-.053-3.5943 3.8864h-.0125l.0149-.1132c.087-1.8096.4198-4.0837.4198-4.0837.3006-2.1826-.7278-2.4786-1.4804-2.5965-2.34-.0962-3.9348 2.0719-4.2428 9.0843h-.0049c-.1068-2.5388.1987-4.5602.1987-4.5602.2757-1.9516-.3453-2.6928-1.0185-2.9311-1.5326-.5438-2.2803.6811-2.6455 1.4247-1.0333 2.0984-1.309 4.6733-1.2594 7.0003l-.0149-.0169c.1019-2.2307-1.1227-3.8503-2.8914-2.7481-1.7686 1.1045-1.324 5.181-1.0259 7.6404.1938 1.5859.4521 3.1308.1789 4.9861-1.0334 10.6701 6.1082 12.1645 10.8726 12.2343 5.8822.2527 9.0518-2.806 10.2341-5.5612 1.4259-3.3257 1.6048-5.1474 2.3177-6.5455.9141-1.7977 1.5798-2.0215 1.637-3.2993.0571-1.2779-1.1625-1.9276-2.2804-1.8601z" fill="#ffe165"/><g fill="#000"><path d="m46.415 48.2707c-.5962-.5655-1.4928-.8663-2.4044-.8134-1.4608.089-2.4966.6063-4.0888 3.1332-.0422-2.8901.1242-7.2289 1.1029-11.0455.3676-1.4343-.0025-2.3704-.38-2.9022-.4398-.6208-1.1229-1.0299-1.878-1.1214-.6881-.0842-1.5873-.089-2.4641.6088 0-.0096.0024-.0216.0024-.0216.2832-2.0503-.4471-3.2246-2.1685-3.4893l-.0944-.0097c-1.0607-.0457-1.9698.2912-2.7026.9987-.3925.3778-.7328.8663-1.0284 1.4703-.3304-.4692-.7552-.7075-1.0905-.8278-2.0493-.7291-3.182.8326-3.6739 1.8289-.5713 1.1599-.9265 2.4594-1.1253 3.7853-.0422-.0265-.0819-.0529-.1242-.077-.4521-.2527-1.3935-.5607-2.6156.2022-2.0717 1.2946-1.8084 5.015-1.3961 8.4031.0224.1806.0447.3587.0671.5391.1764 1.3886.3428 2.7.1143 4.2427l-.005.0384c-.4148 4.281.4173 7.5755 2.4741 9.7966 1.9773 2.1368 5.0749 3.2486 9.181 3.3088.3005.012.5936.0169.8793.0144 7.0149-.0626 9.5313-4.6228 10.1497-6.0666.7998-1.8675 1.2147-3.2606 1.5452-4.3821.2558-.8663.4594-1.5497.7476-2.1177.328-.6448.616-1.0637.8695-1.4341.4322-.6305.8048-1.1745.8495-2.1852.0322-.7314-.226-1.3811-.7502-1.8769zm-13.9105-13.5314c.3949-.3802.8495-.5486 1.4258-.5366.4993.0794.9514.1973.7452 1.6893-.0149.0939-.3378 2.3342-.4247 4.1583v.0361c-.4546 1.7808-.8347 4.346-1.0384 8.0953-.8818.0528-1.7611.1444-2.6157.2646-.2757-7.6067.3627-12.2198 1.9053-13.707zm-5.4674 2.0287c.6186-1.2514 1.1377-1.1888 1.6196-1.018.6682.2383.5639 1.5305.4869 2.0672-.0124.0866-.3105 2.1008-.2062 4.6636-.077 1.7976-.0671 3.8696.0248 6.24-.8172.1564-1.5922.3367-2.3002.5318-.3353-1.0926-1.8183-8.0328.3751-12.4822zm17.9049 14.6815c-.2683.3899-.6011.876-.9762 1.6124-.3552.6954-.5739 1.4413-.8544 2.3823-.3206 1.0806-.7204 2.4257-1.4831 4.209-.5415 1.2609-2.8169 5.3565-9.4617 5.0678-3.7036-.053-6.3218-.9625-8.0035-2.7795-1.7338-1.8722-2.4269-4.755-2.0617-8.5643.2533-1.7423.067-3.2176-.1143-4.6421-.0224-.1781-.0447-.3538-.0671-.5319-.1987-1.6435-.7303-6.0112.6533-6.8751.3726-.2334.6782-.2863.9042-.1612.385.2142.7725.9939.7179 2.2019-.0025.065.005.1275.0174.1901.0695 2.8155.5887 5.2653.8843 6.1845-.4844.1757-.9116.3585-1.2693.5414-.4024.207-.554.6884-.3404 1.0781.1491.272.4372.4261.7353.4236.1267 0 .2559-.0313.3776-.0939 2.0096-1.0324 6.7764-2.0815 10.9769-1.9684.4571.0072.8322-.3345.8446-.7749.0124-.4403-.3453-.8062-.7999-.8182-.2509-.0073-.5042-.0073-.7576-.0073.4198-7.5609 1.5749-10.0275 2.4741-10.7566.3726-.3008.7278-.3249 1.2197-.2648.1366.0169.4794.0939.7253.4404.2659.3778.3154.9361.1417 1.6147-1.5203 5.9222-1.1775 12.8865-1.0037 14.5758-.0298.0578-.0571.1155-.0894.1757-.3552.6472-1.0159 1.3211-1.8034 1.2754-.4496-.0217-.8446.3105-.8719.7484-.0273.4404.318.8181.7726.8445 1.3314.0772 2.5858-.7146 3.3558-2.1175.0821-.1493.1516-.2912.2137-.4284.005-.0097.0099-.0217.0149-.0312.1441-.313.2483-.5992.3403-.8568.144-.3994.2682-.7461.5166-1.1742 1.7638-3.0275 2.4792-3.0707 3.2368-3.1164.4445-.0265.8868.1106 1.1476.3609.1863.1756.2684.3947.2558.669-.0248.5655-.1863.8013-.5762 1.3693z"/><path d="m75.692 52.6793c-.2559-1.5377-.1143-2.8517.0348-4.2425.0198-.1806.0396-.3587.0572-.5391.3476-3.393.5415-7.1206-1.5576-8.3768-1.2371-.7411-2.1735-.4163-2.6207-.1564-.0421.0241-.0819.053-.1242.0794-.2261-1.3211-.6036-2.6133-1.1974-3.7636-.5091-.9867-1.6691-2.5292-3.706-1.7639-.333.1251-.7501.3706-1.0732.847-.308-.5992-.6583-1.0805-1.0581-1.451-.7453-.6931-1.6619-1.0156-2.72-.9506l-.0945.0096c-1.7163.296-2.4243 1.4824-2.1015 3.5327 0 0 0 .0096.0025.0168-.8892-.6834-1.7884-.6617-2.4741-.5655-.7526.1059-1.4282.527-1.8554 1.1551-.3654.539-.7204 1.4799-.3256 2.907 1.0534 3.7997 1.3018 8.1361 1.3141 11.0261-1.6394-2.4977-2.6853-2.9959-4.1459-3.0584-.9091-.0385-1.8059.2815-2.3895.8567-.5143.5054-.7602 1.1598-.7129 1.889.0645 1.0084.447 1.5474.8918 2.1682.2607.3657.5563.7796.8965 1.4173.3006.5632.5168 1.2417.7901 2.1032.3526 1.1143.7924 2.5004 1.6296 4.3534.6457 1.4318 3.2489 5.9486 10.244 5.8836.2832-.0023.5763-.012.8744-.0312 4.1284-.1324 7.2037-1.3019 9.1412-3.4726 2.0122-2.2572 2.7821-5.5659 2.2878-9.8398l-.005-.0385zm-8.965-15.1918c-.0869-.5438-.2185-1.8337.4472-2.0815.477-.1805.9985-.2503 1.6395.989 2.2779 4.411.9289 11.3776.6135 12.4749-.713-.1828-1.4905-.3489-2.3101-.4908.0448-2.3704.0149-4.4448-.0945-6.24.0547-2.5628-.2805-4.5722-.2956-4.6516zm-4.8562-3.535c.5789-.0241 1.0358.1371 1.4358.5125 1.5699 1.4607 2.2977 6.0594 2.1661 13.671-.8571-.1059-1.7364-.1805-2.6207-.219-.2732-3.7468-.7029-6.3025-1.1922-8.076 0-.012 0-.0241 0-.0361-.1219-1.8241-.4896-4.0572-.5044-4.1439-.236-1.4944.2137-1.6195.7129-1.7085zm12.1941 18.9626c.4372 3.8023-.2011 6.6971-1.8977 8.6005-1.6471 1.8458-4.2478 2.8037-7.9739 2.9239-6.6074.4043-8.9672-3.648-9.5311-4.8995-.8-1.771-1.2247-3.1066-1.5649-4.1823-.2981-.9386-.5316-1.6773-.8993-2.368-.3876-.7291-.7302-1.208-1.006-1.5931-.4-.5606-.5663-.7941-.6037-1.3596-.0173-.2743.0621-.4956.2435-.6737.2583-.2551.6956-.4019 1.1426-.3802.7577.0337 1.473.0625 3.2964 3.0585.2583.4236.3874.7676.5391 1.1647.0992.2575.2085.5438.3602.8543.0049.0095.0074.0192.0123.0265.0671.1371.1391.2767.2235.4259.7975 1.3886 2.0668 2.1586 3.3958 2.0575.452-.0337.7924-.4187.7575-.8568-.0347-.4379-.4297-.7628-.8842-.7339-.7874.0578-1.4608-.604-1.8284-1.2442-.0346-.06-.0621-.1154-.0918-.1731.1415-1.6893.3528-8.6608-1.2817-14.5541-.189-.6762-.1491-1.2345.1091-1.6172.241-.3513.5814-.4355.7179-.4548.4894-.0697.8471-.0505 1.2248.2431.9141.7147 2.1164 3.1596 2.6777 10.711-.2533.0024-.5066.0096-.7552.0217-.4545.0192-.8048.3922-.785.8326.02.4404.3976.7724.8597.7604 4.1954-.1876 8.9847.7748 11.0116 1.7735.1217.0602.2508.0867.38.0867.2981-.0023.5838-.1612.7278-.4379.2063-.3922.0447-.8736-.3627-1.0734-.3602-.1781-.7924-.3512-1.2792-.5198.2783-.924.7527-3.3834.7676-6.1989.0124-.0626.0173-.1251.0124-.1901-.0795-1.2056.2956-1.9925.6756-2.2139.2236-.13.5291-.0818.9067.1444 1.4011.8398.9539 5.2147.7849 6.8631-.0173.1781-.0371.3537-.0571.5318-.1539 1.4295-.313 2.9046-.0248 4.6444z"/><path d="m51.033 37.5284c-.1316 0-.2659-.024-.3926-.0818-.4643-.207-.6682-.7388-.4544-1.1888.6904-1.4607 1.7015-2.8083 2.9211-3.896.375-.3345.9613-.3128 1.3067.053.3453.3633.3228.9312-.0547 1.2657-1.0408.9289-1.9029 2.0792-2.4939 3.3257-.1541.3249-.4844.5198-.8322.5222z"/><path d="m47.9181 37.011c-.4794.0048-.8893-.3513-.9291-.823-.1764-2.1104-.1838-4.2497-.0174-6.3602.0397-.4933.4844-.8615.9911-.8254.5093.0385.8893.4669.852.9602-.1589 2.0166-.1514 4.0621.0175 6.0787.0421.4933-.3379.9264-.847.9649-.0225 0-.0448.0024-.0671.0024z"/><path d="m44.7335 37.5669c-.4149.0048-.7973-.2671-.9042-.6738-.3926-1.492-1.1352-2.9094-2.1463-4.0957-.3253-.3827-.2682-.9458.1242-1.261.395-.3153.9764-.2599 1.3017.1203 1.1825 1.3909 2.0518 3.049 2.509 4.7936.1266.4789-.1739.9674-.6684 1.0901-.0745.0193-.1465.0265-.221.0289z"/></g></g></g></g></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" height="96" viewBox="0 0 96 96" width="96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="a"><path d="m28 23h40v50h-40z"/></clipPath><mask id="b" height="50" maskUnits="userSpaceOnUse" width="40" x="28" y="23"><path d="m68 23h-40v50h40z" fill="#fff"/></mask><path d="m0 0h96v96h-96z" fill="#fafafa"/><g clip-path="url(#a)"><g mask="url(#b)"><path d="m58 63h-20v-20h20z" fill="#bcbbbb"/><path d="m58 33h-20v30h20zm10 40h-40v-50h40z" fill="#211e1e"/></g></g></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" height="96" viewBox="0 0 96 96" width="96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="a"><path d="m0 0h96v96h-96z"/></clipPath><clipPath id="b"><path d="m-.04541 8h96v96h-96z"/></clipPath><g clip-path="url(#a)"><path d="m0 0h96v96h-96z" fill="#91ede9"/><g clip-path="url(#b)"><path d="m7.95459 16h80.00001v80h-80.00001z" fill="#91ede9"/><path d="m101.025 99.9998h-105.08188v-21.1624s9.33092-7.6866 13.86502-8.0271c5.76006-.433 7.19036 1.7513 12.89206 2.6757 5.9984.973 9.8515-5.3028 15.811-4.1352 6.0811 1.187 13.9477 5.7698 18.9732 5.5946 10.625-.3697 9.9974-2.3692 18.7299-.4864 3.712.8027 7.672-7.0153 13.8651-5.838 3.1378.5936 10.9456 1.2163 10.9456 1.2163z" fill="#48acba"/><path d="m97.62 100h-103.13636v-19.4597s9.57417-5.2541 14.10828-5.5947c5.76008-.4329 6.94708 3.8579 12.64878 4.7871 5.9985.973 8.1488-4.9817 14.1083-3.8141 6.0811 1.1871 11.0288 6.986 16.0542 6.8109 10.625-.3697 11.2137-5.5314 19.9462-3.6487 3.7119.8027 4.6217 2.6757 13.3785.6519 8.7569-2.0238 12.8921.8076 12.8921.8076z" fill="#2b3c5a"/><path d="m47.9546 11.2031c1.7367 0 3.4209.5949 4.7725 1.6856 1.3515 1.0906 2.2893 2.6111 2.6562 4.3086.3669 1.6976.1409 3.47-.6396 5.0215-.6988 1.3887-1.8054 2.5241-3.1641 3.2617l.1289 3.7734 8.7978.6641h.002c.5022.0387.9712.2662 1.3135.6357.3422.3695.533.8547.5332 1.3584v2.5762l-.0088.1875c-.0411.4355-.2248.8474-.5244 1.1709-.3423.3694-.8114.596-1.3135.6347l-8.5342.6573.4199 15.9482.0342.9473c.1017 2.2255.3704 4.5304 1.0635 6.4414.7854 2.165 2.0625 3.6994 4.1621 4.1592h.002c.4922.1091.9948.1635 1.499.164 1.1717 0 2.5744-.7401 4.0254-2.0761 1.2176-1.1213 2.3807-2.5835 3.3564-4.1182-.3411-.1328-.6844-.2599-1.0312-.377l-.6416-.207c-1.1668-.359-1.3929-1.9466-.3799-2.6191 3.1444-2.086 5.6266-4.8817 7.1474-8.0918.2451-.5216.7448-.8019 1.2364-.8233.4996-.0215 1.0409.2271 1.3037.7813h.001c.5719 1.1993 1.0547 2.4394 1.4433 3.7099l.2022.6944c.9639 3.4826 1.1877 7.1318.6523 10.7109l-.0166.1065-.001.0058-.0195.1289v.001c-.1885 1.1905-1.6123 1.5039-2.374.7598v-.001c-.3701-.3585-.7545-.7016-1.1494-1.0322-2.2089 5.9941-6.474 10.5133-11.0635 13.5693-4.8486 3.2285-10.1397 4.8789-13.8916 4.8789-3.7498 0-9.0386-1.6486-13.8867-4.875-4.5894-3.0542-8.8571-7.5711-11.0694-13.5654-.3943.3302-.7778.6733-1.1474 1.0312l-.001.001c-.7693.7428-2.1717.4218-2.3682-.7559l-.04-.2402-.0029-.0127.0009-.001c-.5726-3.8194-.2795-7.7185.8584-11.4091l.1504-.4747c.3627-1.1052.7967-2.1861 1.2998-3.2353.5497-1.1491 2.0746-.9502 2.544.0381 1.5244 3.2135 4.0186 6.0134 7.1787 8.0996l.0019.001c1.0046.6667.8014 2.2569-.375 2.6191l-.0019.001c-.5793.1764-1.1516.3755-1.7158.5947.9752 1.5313 2.1369 2.9902 3.3525 4.1094 1.4489 1.334 2.8497 2.0741 4.0215 2.0742.5075 0 1.0103-.0568 1.5049-.165l.3838-.0987c1.8694-.5552 3.037-2.0305 3.7734-4.0605.7922-2.184 1.031-4.8824 1.0986-7.3887l.419-15.9482-8.5322-.6533h-.001c-.5032-.0388-.9731-.2661-1.3155-.6368-.3425-.3709-.5327-.8583-.5312-1.3632v-2.5694c-.0009-.504.1893-.99.5312-1.3603.3425-.3708.8123-.5989 1.3155-.6377h.0019l8.7969-.6641.1289-3.7734c-1.3584-.7376-2.4645-1.8732-3.1631-3.2617-.7806-1.5515-1.0065-3.3239-.6396-5.0215s1.3047-3.218 2.6562-4.3086c1.3516-1.0907 3.0357-1.6856 4.7725-1.6856zm0 4.3965c-.8486 0-1.6626.3375-2.2627.9375-.6001.6001-.9374 1.4141-.9375 2.2627 0 .8486.3375 1.6626.9375 2.2627.6001.6001 1.414.9375 2.2627.9375s1.6626-.3374 2.2627-.9375c.6-.6001.9375-1.4141.9375-2.2627-.0001-.8486-.3375-1.6626-.9375-2.2627-.6001-.6-1.4141-.9375-2.2627-.9375z" fill="#ff915c" stroke="#2b3c5a" stroke-width="1.6"/><g fill="#8a380f"><path d="m34.3545 34.8602c-.0006.2022.0754.3971.2127.5455s.3257.2393.5273.2545l9.66.74 2.652-2.652c.0452-.0445.0762-.1015.0889-.1636.0128-.0622.0068-.1267-.0172-.1855-.024-.0587-.065-.109-.1176-.1444-.0527-.0354-.1147-.0544-.1781-.0545h-12.828zm38.448 12.664c.0347-.054.0832-.0977.1405-.1267.0572-.029.1212-.0421.1853-.038.064.0041.1258.0252.1789.0612.0532.036.0957.0855.1233.1435.564 1.1787 1.0386 2.3982 1.42 3.648 1.1223 3.6529 1.3932 7.5142.792 11.288-.08.48-.676.652-1.028.312-1.336-1.2923-2.8259-2.4154-4.436-3.344-.1333-.0767-.2334-.2003-.2807-.3467-.0473-.1463-.0385-.3051.0247-.4453 1.348-3.032 2.34-6.668 2.82-10.988.0074-.0572.028-.112.06-.16z"/><path d="m50.7546 24.7998.2 5.2-2.328 2.172c-.057.0529-.1281.088-.2048.101-.0766.0131-.1553.0036-.2266-.0274s-.132-.0821-.1747-.147c-.0428-.0649-.0657-.1409-.0659-.2186v-7.08zm22.8 31.2c-1.6 16-17.6 24-25.6 24v-46.2c0-.1591.0632-.3117.1757-.4243.1125-.1125.2652-.1757.4243-.1757h13v1.316c-.0005.2971-.1112.5835-.3107.8037s-.4737.3586-.7693.3883l-9.32.692.44 16.708c.136 5.044.948 11.24 5.88 12.312.5424.1202 1.0964.1806 1.652.18-.2748.0019-.5463.0604-.7975.1719s-.4767.2736-.6625.4761c-1.948 2.32-4.16 4.656-7.428 5.712 8.6.4 20.44-5.452 22.516-24.36z"/><path d="m48.7546 23.9598c-.44.044-.8.4-.8.84s.36.804.8.752c1.5164-.1796 2.9282-.8644 4.008-1.944 1.2675-1.2673 1.9834-2.9837 1.992-4.776 0-.0042-.0008-.0084-.0024-.0122-.0017-.0039-.004-.0075-.007-.0104-.003-.003-.0065-.0054-.0104-.007-.0038-.0016-.008-.0024-.0122-.0024-.0078-.0001-.0154.0028-.0213.0079-.0059.0052-.0097.0123-.0107.0201-.42 2.692-2.868 4.812-5.936 5.132z"/></g></g></g></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" height="96" viewBox="0 0 96 96" width="96" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h96v96h-96z" fill="#1a2b34"/><path d="m62.4 32.3999h-2.4c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h2.4c.6628 0 1.2-.5373 1.2-1.2s-.5372-1.2-1.2-1.2z" fill="#56b3b4"/><path d="m36 70.7998h-12c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h12c.6628 0 1.2-.5373 1.2-1.2s-.5372-1.2-1.2-1.2z" fill="#ea5e5e"/><path d="m60.0001 51.6001h-7.2c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h7.2c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" fill="#bf85bf"/><path d="m48 51.6001h-9.6c-.6628 0-1.2.5373-1.2 1.2s.5372 1.2 1.2 1.2h9.6c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" fill="#ea5e5e"/><path d="m33.6 51.6001h-9.6c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h9.6c.6628 0 1.2-.5373 1.2-1.2s-.5372-1.2-1.2-1.2z" fill="#56b3b4"/><path d="m36 61.2002h-12c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h12c.6628 0 1.2-.5373 1.2-1.2s-.5372-1.2-1.2-1.2z" fill="#bf85bf"/><path d="m36 42h-12c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h12c.6628 0 1.2-.5373 1.2-1.2s-.5372-1.2-1.2-1.2z" fill="#bf85bf"/><path d="m60 27.6001h-24c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h24c.6628 0 1.2-.5373 1.2-1.2s-.5372-1.2-1.2-1.2z" fill="#f7ba3e"/><path d="m31.2 27.6001h-7.2c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h7.2c.6628 0 1.2-.5373 1.2-1.2s-.5372-1.2-1.2-1.2z" fill="#ea5e5e"/><path d="m35.9999 66h-2.4c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h2.4c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" fill="#f7ba3e"/><path d="m35.9999 37.2002h-2.4c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h2.4c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" fill="#56b3b4"/><path d="m28.8 66h-4.8c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h4.8c.6628 0 1.2-.5373 1.2-1.2s-.5372-1.2-1.2-1.2z" fill="#56b3b4"/><path d="m28.8 37.2002h-4.8c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h4.8c.6628 0 1.2-.5373 1.2-1.2s-.5372-1.2-1.2-1.2z" fill="#f7ba3e"/><g fill="#4d616e"><path d="m57.6 66h-2.4c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h2.4c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" opacity=".5"/><path d="m50.4001 66h-9.6c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h9.6c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" opacity=".5"/><path d="m72 66h-9.6c-.6628 0-1.2.5373-1.2 1.2s.5372 1.2 1.2 1.2h9.6c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" opacity=".5"/></g><path d="m62.4 46.7998h-19.2c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h19.2c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" fill="#56b3b4"/><path d="m38.4 46.7998h-7.2c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h7.2c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" fill="#f7ba3e"/><path d="m26.4 46.7998h-2.4c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h2.4c.6628 0 1.2-.5373 1.2-1.2s-.5372-1.2-1.2-1.2z" fill="#ea5e5e"/><path d="m55.1999 32.3999h-9.6c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h9.6c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" fill="#bf85bf"/><path d="m40.8 32.3999h-16.8c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h16.8c.6628 0 1.2-.5373 1.2-1.2s-.5372-1.2-1.2-1.2z" fill="#56b3b4"/><path d="m52.8 56.3999h-21.6c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h21.6c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" fill="#f7ba3e"/><path d="m26.4 56.3999h-2.4c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h2.4c.6628 0 1.2-.5373 1.2-1.2s-.5372-1.2-1.2-1.2z" fill="#bf85bf"/><path d="m64.8001 37.2002h-12c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h12c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" fill="#ea5e5e"/><path d="m64.8001 42h-12c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h12c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" fill="#f7ba3e"/><path d="m52.8001 22.7998h-28.8001c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h28.8001c.6627 0 1.1999-.5373 1.1999-1.2s-.5372-1.2-1.1999-1.2z" fill="#56b3b4"/><g fill="#4d616e"><path d="m71.9999 22.7998h-14.4c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h14.4c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" opacity=".5"/><path d="m62.3999 56.3999h-4.8c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h4.8c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" opacity=".5"/><path d="m72 56.3999h-4.8c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h4.8c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" opacity=".5"/><path d="m72.0001 51.6001h-7.2c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h7.2c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" opacity=".5"/><path d="m72.0001 27.6001h-7.2c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h7.2c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" opacity=".5"/><path d="m72 46.7998h-4.8c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h4.8c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" opacity=".5"/><path d="m72 32.3999h-4.8c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h4.8c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" opacity=".5"/><path d="m71.9999 37.2002h-2.4c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h2.4c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" opacity=".5"/><path d="m71.9999 42h-2.4c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h2.4c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" opacity=".5"/><path d="m72 61.2002h-21.6c-.6628 0-1.2.5373-1.2 1.2s.5372 1.2 1.2 1.2h21.6c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" opacity=".5"/><path d="m45.6001 61.2002h-4.8c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h4.8c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" opacity=".5"/><path d="m72 70.7998h-12c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h12c.6628 0 1.2-.5373 1.2-1.2s-.5372-1.2-1.2-1.2z" opacity=".5"/><path d="m55.2001 70.7998h-14.4c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h14.4c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" opacity=".5"/><path d="m48.0001 37.2002h-7.2c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h7.2c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" opacity=".5"/><path d="m48.0001 42h-7.2c-.6627 0-1.2.5373-1.2 1.2s.5373 1.2 1.2 1.2h7.2c.6627 0 1.2-.5373 1.2-1.2s-.5373-1.2-1.2-1.2z" opacity=".5"/></g></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" height="96" viewBox="0 0 96 96" width="96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><radialGradient id="a" cx="0" cy="0" gradientTransform="matrix(0 65.9749 -65.1841 0 47.229 54.4158)" gradientUnits="userSpaceOnUse" r="1"><stop offset="0" stop-color="#665cee"/><stop offset="1" stop-color="#332e91"/></radialGradient><path d="m0 0h96v96h-96z" fill="url(#a)"/><g fill="#fff"><path d="m48.8006 23c.37 0 .7061.1972.8826.5129l2.9673 5.1943h12.8669c.37 0 .7063.1968.8829.5126l3.4832 5.8564c.2784.4888.2784 1.0932 0 1.5821l-3.4832 5.8564 6.5997 11.4581-1.1677-1.4903c.2783.4889.2784 1.0933 0 1.5822l-3.4832 5.8563c-.1765.3157-.5129.5126-.8829.5126h-5.8939l-6.5997 11.4549c-.1765.3156-.5126.5125-.8825.5125h-6.0908l13.573-25.3574 3.4494 6.0907h6.6001l-6.6001-11.4548 3.4836-5.8564h-26.5763l3.4832-6.0908-3.4832-6.2194-7.4826 12.3102h-7.7541l14.3538 24.1384h-6.5997l-3.945 6.2198h12.8672l3.8499 6.2197-.069-.0023c-.3425-.0228-.6484-.2143-.8139-.5102l-2.967-5.1947h-12.8672c-.37 0-.706-.1968-.8826-.5125l-3.4835-5.8564c-.2784-.4889-.2784-1.0933 0-1.5822l2.9673-5.1943-5.8938-10.6296c-.2784-.4888-.2784-1.0933 0-1.5821l3.4835-5.8564c.1765-.3157.5125-.5125.8826-.5126h6.8715l6.5997-11.4548c.1766-.3157.5129-.5129.8829-.5129z"/><path d="m57.0571 44.1545h-17.5589l8.5011 14.3541z"/></g></svg>
|