@create-ui/cli 0.1.0-beta.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +194 -24
  2. package/dist/chunk-EWAP55CF.js +18 -0
  3. package/dist/chunk-EWAP55CF.js.map +1 -0
  4. package/dist/chunk-MK3CCMH4.js +3 -0
  5. package/dist/chunk-MK3CCMH4.js.map +1 -0
  6. package/dist/chunk-UVIUVCLG.js +64 -0
  7. package/dist/chunk-UVIUVCLG.js.map +1 -0
  8. package/dist/chunk-Y7WZRQWW.js +2 -0
  9. package/dist/chunk-Y7WZRQWW.js.map +1 -0
  10. package/dist/index.d.ts +43 -111
  11. package/dist/index.js +62 -61
  12. package/dist/index.js.map +1 -1
  13. package/dist/mcp/index.js +1 -1
  14. package/dist/registry/index.d.ts +3 -20
  15. package/dist/registry/index.js +1 -1
  16. package/dist/schema/index.d.ts +123 -432
  17. package/dist/schema/index.js +1 -1
  18. package/dist/skills/createui/SKILL.md +212 -0
  19. package/dist/skills/createui/agents/openai.yml +5 -0
  20. package/dist/skills/createui/assets/createui-small.png +0 -0
  21. package/dist/skills/createui/assets/createui.png +0 -0
  22. package/dist/skills/createui/cli.md +309 -0
  23. package/dist/skills/createui/contributing.md +213 -0
  24. package/dist/skills/createui/customization.md +284 -0
  25. package/dist/skills/createui/evals/evals.json +47 -0
  26. package/dist/skills/createui/mcp.md +151 -0
  27. package/dist/skills/createui/rules/composition.md +249 -0
  28. package/dist/skills/createui/rules/forms.md +301 -0
  29. package/dist/skills/createui/rules/icons.md +130 -0
  30. package/dist/skills/createui/rules/styling.md +253 -0
  31. package/dist/utils/index.d.ts +2 -5
  32. package/dist/utils/index.js +1 -1
  33. package/dist/utils/index.js.map +1 -1
  34. package/package.json +4 -3
  35. package/dist/chunk-7MKTQPYI.js +0 -72
  36. package/dist/chunk-7MKTQPYI.js.map +0 -1
  37. package/dist/chunk-BVZRYLRW.js +0 -32
  38. package/dist/chunk-BVZRYLRW.js.map +0 -1
  39. package/dist/chunk-JWZJQI2B.js +0 -3
  40. package/dist/chunk-JWZJQI2B.js.map +0 -1
  41. package/dist/chunk-TIYHWTW7.js +0 -2
  42. package/dist/chunk-TIYHWTW7.js.map +0 -1
@@ -0,0 +1,253 @@
1
+ # Styling & tokens
2
+
3
+ Create UI ships one unified styling system driven by semantic design tokens. Style with those tokens and each component's built-in props — never reach for raw Tailwind colors or hand-rolled class overrides.
4
+
5
+ See [customization.md](../customization.md) for theming, CSS variables, and adding custom colors.
6
+
7
+ ## Contents
8
+
9
+ - Semantic color tokens
10
+ - Status & state colors
11
+ - Built-in props first
12
+ - className for layout only
13
+ - Semantic spacing tokens
14
+ - No space-x-* / space-y-*
15
+ - Prefer size-* over w-* h-* when equal
16
+ - Prefer truncate shorthand
17
+ - No manual dark: color overrides
18
+ - Use cn() for conditional classes
19
+ - Focus uses outline-*, never ring-*
20
+ - No manual z-index on overlay components
21
+
22
+ ---
23
+
24
+ ## Semantic color tokens
25
+
26
+ Create UI's tokens are HEX-backed CSS variables that swap automatically between light and dark via the `.dark` class. Use the semantic token names — never raw palette colors and never invented utility names.
27
+
28
+ - Surfaces (weak → strong): `bg-weakest`, `bg-weak`, `bg-light`, `bg-medium`, `bg-heavy`, `bg-strong`, `bg-strongest`. Theme-swapping page/card surface: `bg-static`.
29
+ - Text: `text-body` (primary), `text-placeholder` (hints/secondary), `text-disabled`, `text-strongest` (high-contrast). Never-swap text: `text-static`, `text-static-white`.
30
+ - Borders: `border-weakest` … `border-strongest` (commonly `border-light` / `border-medium`).
31
+ - Primary scale: `bg-primary-500` (= `bg-primary-base`), `text-primary-base`, `bg-primary-alpha-16`, `bg-primary-alpha-48`.
32
+
33
+ **Incorrect:**
34
+
35
+ ```tsx
36
+ <div className="bg-blue-500 text-white">
37
+ <p className="text-gray-600">Secondary text</p>
38
+ </div>
39
+ ```
40
+
41
+ **Correct:**
42
+
43
+ ```tsx
44
+ <div className="bg-static text-body">
45
+ <p className="text-placeholder">Secondary text</p>
46
+ </div>
47
+ ```
48
+
49
+ Quick translation from generic utility names to Create UI tokens:
50
+
51
+ | Generic intent | Create UI token |
52
+ | --- | --- |
53
+ | page / card surface | `bg-static` (or `bg-weakest` for subtle surfaces) |
54
+ | primary text | `text-body` |
55
+ | secondary / muted text | `text-placeholder` |
56
+ | primary accent fill | `bg-primary-base` (or `bg-primary-500`) |
57
+ | text on a solid primary fill | `text-white` |
58
+ | default border | `border-light` or `border-medium` |
59
+ | subtle / muted fill | `bg-weak` |
60
+ | accent tint background | `bg-primary-alpha-16` |
61
+
62
+ ---
63
+
64
+ ## Status & state colors
65
+
66
+ Each status family (`error`, `success`, `warning`, `info`) exposes `-weakest` … `-strongest` plus `-base`. Prefer these semantic tokens — or a `StatusBadge` — for positive, negative, and informational indicators.
67
+
68
+ **Incorrect:**
69
+
70
+ ```tsx
71
+ <span className="text-emerald-600">Active</span>
72
+ <span className="text-red-700">Payment failed</span>
73
+ ```
74
+
75
+ **Correct:**
76
+
77
+ ```tsx
78
+ <span className="text-success-base">Active</span>
79
+ <span className="text-error-base">Payment failed</span>
80
+ ```
81
+
82
+ Create UI's own `Button` implements its `danger` / `success` variants with the raw red/green scales (`bg-red-600`, `bg-green-600`, `bg-red-alpha-16`), so those scales are acceptable for status work — but prefer the semantic token (`text-error-base`, `bg-success-base`) unless you are intentionally matching that variant's exact look. For full status affordances, reach for `StatusBadge` rather than styling a raw `<span>`.
83
+
84
+ ---
85
+
86
+ ## Built-in props first
87
+
88
+ Every primitive exposes its full visual range through typed props. Drive appearance through those props, not through manual `border` / `bg` / `hover:` class overrides.
89
+
90
+ `Button` has four styling axes (verify any other component by reading its source in `apps/v4/registry/ui/<name>.tsx`):
91
+
92
+ - `variant`: `primary` (default), `neutral-solid`, `neutral-light`, `danger`, `success`, `inverse-solid`, `inverse-light`
93
+ - `appearance`: `solid` (default), `outline`, `ghost`, `soft`
94
+ - `size`: `xs`, `sm`, `md`, `lg` (default), `xl`
95
+ - `shape`: `rounded` (default), `pill`, `square`
96
+
97
+ There is no `variant="outline"` / `variant="destructive"` / `variant="secondary"`. An outline style is `appearance="outline"`; a destructive button is `variant="danger"`; a ghost button is `appearance="ghost"`.
98
+
99
+ **Incorrect:**
100
+
101
+ ```tsx
102
+ <Button className="border border-medium bg-transparent hover:bg-weak">
103
+ Click me
104
+ </Button>
105
+ ```
106
+
107
+ **Correct:**
108
+
109
+ ```tsx
110
+ <Button appearance="outline">Click me</Button>
111
+ ```
112
+
113
+ `Button` also has a real `loading` prop — it renders a `Spinner` and blocks interaction automatically. Don't hand-compose a spinner.
114
+
115
+ **Incorrect:**
116
+
117
+ ```tsx
118
+ <Button disabled>
119
+ <Spinner /> Saving…
120
+ </Button>
121
+ ```
122
+
123
+ **Correct:**
124
+
125
+ ```tsx
126
+ <Button loading>Saving…</Button>
127
+ ```
128
+
129
+ ---
130
+
131
+ ## className for layout only
132
+
133
+ Use `className` for layout (e.g. `max-w-md`, `mx-auto`, `mt-4`), **not** for overriding component colors or typography. To change appearance, prefer these in order:
134
+
135
+ 1. **Built-in props** — `appearance="outline"`, `variant="danger"`, `size="sm"`, etc.
136
+ 2. **Semantic tokens** — `bg-static`, `text-placeholder`, `bg-primary-base`.
137
+ 3. **CSS variables** — define or override `--color-*` in the project's global CSS file (see [customization.md](../customization.md)).
138
+
139
+ **Incorrect:**
140
+
141
+ ```tsx
142
+ <Card className="bg-sky-100 text-sky-900 font-bold">
143
+ <CardContent>Dashboard</CardContent>
144
+ </Card>
145
+ ```
146
+
147
+ **Correct:**
148
+
149
+ ```tsx
150
+ <Card className="mx-auto max-w-md">
151
+ <CardContent>Dashboard</CardContent>
152
+ </Card>
153
+ ```
154
+
155
+ ---
156
+
157
+ ## Semantic spacing tokens
158
+
159
+ Create UI mirrors Figma's spacing variables as Tailwind utilities: `gap-component-sm` (8px), `p-component-md` (12px), `gap-component-lg` (16px), `gap-layout-md` (64px), `p-layout-sm` (48px), and so on.
160
+
161
+ Use a semantic spacing class **only when Figma references that semantic token** (e.g. `var(--component/sm,8px)` → `gap-component-sm`). When Figma shows a static value (e.g. `space-space-4`), use the standard Tailwind class (`gap-4`). These tokens rescale across themes/breakpoints, so don't apply them where a fixed gap is intended, and never add `md:` / `xl:` prefixes to them — they auto-scale.
162
+
163
+ Prefer `px-component-none` over `px-0` when it is an intentional "no horizontal padding" override of a token, to keep the intent explicit.
164
+
165
+ ---
166
+
167
+ ## No space-x-* / space-y-*
168
+
169
+ Use `gap-*` instead. `space-y-4` → `flex flex-col gap-4`; `space-x-2` → `flex gap-2`.
170
+
171
+ ```tsx
172
+ <div className="flex flex-col gap-4">
173
+ <Input />
174
+ <Input />
175
+ <Button>Submit</Button>
176
+ </div>
177
+ ```
178
+
179
+ ---
180
+
181
+ ## Prefer size-* over w-* h-* when equal
182
+
183
+ `size-10` not `w-10 h-10`. Applies to icons, avatars, skeletons, etc.
184
+
185
+ ---
186
+
187
+ ## Prefer truncate shorthand
188
+
189
+ `truncate` not `overflow-hidden text-ellipsis whitespace-nowrap`.
190
+
191
+ ---
192
+
193
+ ## No manual dark: color overrides
194
+
195
+ Semantic tokens already swap with the `.dark` class — don't write parallel `dark:` color utilities.
196
+
197
+ **Incorrect:**
198
+
199
+ ```tsx
200
+ <div className="bg-white text-gray-900 dark:bg-zinc-950 dark:text-zinc-50">
201
+ ```
202
+
203
+ **Correct:**
204
+
205
+ ```tsx
206
+ <div className="bg-static text-body">
207
+ ```
208
+
209
+ ---
210
+
211
+ ## Use cn() for conditional classes
212
+
213
+ Use `cn()` for conditional or merged class names instead of template-string ternaries. Import it from `@/lib/utils` in a user project (in this monorepo, components import from `@/registry/lib/utils`).
214
+
215
+ **Incorrect:**
216
+
217
+ ```tsx
218
+ <div className={`flex items-center ${isActive ? "bg-primary-alpha-16 text-primary-base" : "bg-weak"}`}>
219
+ ```
220
+
221
+ **Correct:**
222
+
223
+ ```tsx
224
+ import { cn } from "@/lib/utils"
225
+
226
+ <div className={cn("flex items-center", isActive ? "bg-primary-alpha-16 text-primary-base" : "bg-weak")}>
227
+ ```
228
+
229
+ ---
230
+
231
+ ## Focus uses outline-*, never ring-*
232
+
233
+ Create UI focus styling is built on `outline`, not `ring`. The base is `outline-2 outline-transparent`, and the visible focus state is an `outline` color.
234
+
235
+ **Incorrect:**
236
+
237
+ ```tsx
238
+ <button className="focus-visible:ring-2 focus-visible:ring-primary-500">
239
+ ```
240
+
241
+ **Correct:**
242
+
243
+ ```tsx
244
+ <button className="outline-2 outline-transparent focus-visible:outline-primary-700">
245
+ ```
246
+
247
+ Use `outline-primary-700` (or `outline-primary-500`) for primary controls and `outline-strong` / `outline-strongest` for neutral ones. Primitives already wire this up — you rarely need to set it yourself.
248
+
249
+ ---
250
+
251
+ ## No manual z-index on overlay components
252
+
253
+ `Dialog`, `Sheet`, `Drawer`, `AlertDialog`, `DropdownMenu`, `Popover`, `Tooltip`, and `HoverCard` manage their own stacking. Never add `z-50` or `z-[999]`.
@@ -1,7 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { SourceFile } from 'ts-morph';
3
- import { registryBaseColorSchema } from '../schema/index.js';
4
3
  import { C as Config } from '../get-config-D6gTsP_D.js';
4
+ import '../schema/index.js';
5
5
 
6
6
  declare const styleMapSchema: z.ZodRecord<z.ZodString, z.ZodString>;
7
7
  type StyleMap = z.infer<typeof styleMapSchema>;
@@ -20,7 +20,6 @@ type TransformOpts = {
20
20
  filename: string;
21
21
  raw: string;
22
22
  config: Config;
23
- baseColor?: z.infer<typeof registryBaseColorSchema>;
24
23
  transformJsx?: boolean;
25
24
  isRemote?: boolean;
26
25
  };
@@ -30,8 +29,6 @@ type Transformer<Output = SourceFile> = (opts: TransformOpts & {
30
29
 
31
30
  declare const transformMenu: Transformer;
32
31
 
33
- declare const transformRender: Transformer;
34
-
35
32
  declare const transformLegacyIcons: Transformer;
36
33
 
37
- export { createStyleMap, transformLegacyIcons as transformIcons, transformMenu, transformRender, transformStyle };
34
+ export { createStyleMap, transformLegacyIcons as transformIcons, transformMenu, transformStyle };
@@ -1,2 +1,2 @@
1
- import {a}from'../chunk-VQCXAURP.js';import {ga}from'../chunk-BVZRYLRW.js';export{P as transformMenu}from'../chunk-BVZRYLRW.js';import'../chunk-TIYHWTW7.js';import W from'postcss';import D from'postcss-selector-parser';import {z}from'zod';import {Project,ScriptKind,SyntaxKind,Node}from'ts-morph';var b="cn-",F=z.record(z.string().startsWith(b),z.string());function B(t){let e=W.parse(t),r={};return e.walkRules(n=>{let s=n.selectors??[];if(s.length===0)return;let i=k(n);if(i)for(let a of s){let c=_(a);D(o=>{o.each(l=>{let f=Y(l);if(!f)return;let u=f.value;u.startsWith(b)&&(r[u]=r[u]?`${i} ${r[u]}`:i);});}).processSync(c);}}),F.parse(r)}function _(t){return t.replace(/\s*&\s*/g,"").trim()}function k(t){let e=[];for(let r of t.nodes||[])if(r.type==="atrule"&&r.name==="apply"){let n=r.params.trim();n&&e.push(n);}return e.length===0?null:e.join(" ")}function Y(t){let e=[];return t.walkClasses(r=>{r.value.startsWith(b)&&e.push(r);}),e.length===0?null:e[e.length-1]}var G=new Set(["cn-menu-target"]);function m(t){return Node.isStringLiteral(t)||Node.isNoSubstitutionTemplateLiteral(t)}var M=async({sourceFile:t,styleMap:e})=>{let r=new Set;return X(t,e,r),U(t,e,r),Q(t,e,r),t};function $(t,e,r){let n=t.getLiteralText(),s=y(n);if(s.length===0)return;let i=s.filter(c=>!r.has(c));if(i.length===0){let c=p(n);t.setLiteralValue(c);return}let a=i.map(c=>e[c]).filter(c=>!!c);if(a.length>0){let c=a.join(" "),o=p(E(c,n));t.setLiteralValue(o),i.forEach(l=>r.add(l));}else {let c=p(n);t.setLiteralValue(c);}}function X(t,e,r){t.forEachDescendant(n=>{if(!Node.isCallExpression(n))return;let s=n.getExpression();if(!Node.isIdentifier(s)||s.getText()!=="cva")return;let i=n.getArguments()[0];Node.isStringLiteral(i)&&$(i,e,r);let a=n.getArguments()[1];if(!a||!Node.isObjectLiteralExpression(a))return;let c=a.getProperties().find(l=>Node.isPropertyAssignment(l)&&Node.isIdentifier(l.getNameNode())&&l.getNameNode().getText()==="variants");if(!c||!Node.isPropertyAssignment(c))return;let o=c.getInitializer();!o||!Node.isObjectLiteralExpression(o)||o.getProperties().forEach(l=>{if(!Node.isPropertyAssignment(l))return;let f=l.getInitializer();!f||!Node.isObjectLiteralExpression(f)||f.getProperties().forEach(u=>{if(!Node.isPropertyAssignment(u))return;let x=u.getInitializer();x&&Node.isStringLiteral(x)&&$(x,e,r);});});});}function U(t,e,r){t.forEachDescendant(n=>{if(!Node.isJsxAttribute(n)||n.getNameNode().getText()!=="className")return;let s=n.getInitializer();if(!s)return;let i=q(s);if(i.length===0)return;let a=n.getParent()?.getParent();if(!a||!Node.isJsxOpeningElement(a)&&!Node.isJsxSelfClosingElement(a))return;let c=i.filter(l=>!r.has(l));if(c.length===0){P(s);return}let o=c.map(l=>e[l]).filter(l=>!!l);if(o.length>0){let l=o.join(" ");H(a,l);}else P(s);});}function q(t){let e=[];if(m(t))return y(t.getLiteralText());if(!Node.isJsxExpression(t))return e;let r=t.getExpression();if(!r)return e;if(m(r))return y(r.getLiteralText());if(Node.isCallExpression(r)&&h(r))for(let n of r.getArguments())m(n)&&e.push(...y(n.getLiteralText()));return e}function P(t){if(m(t)){let r=p(t.getLiteralText());t.setLiteralValue(r);return}if(!Node.isJsxExpression(t))return;let e=t.getExpression();if(e){if(m(e)){let r=p(e.getLiteralText());e.setLiteralValue(r);return}if(Node.isCallExpression(e)&&h(e)){for(let r of e.getArguments())if(m(r)){let n=p(r.getLiteralText());r.setLiteralValue(n);}N(e);}}}function y(t){let e=t.matchAll(/\bcn-[\w-]+\b/g);return Array.from(e,r=>r[0])}function p(t){return t.replace(/\bcn-[\w-]+\b/g,e=>G.has(e)?e:"").replace(/\s+/g," ").trim()}function N(t){if(!h(t))return;let e=t.getArguments(),r=e.filter(n=>m(n)?n.getLiteralText().trim()!=="":true);if(r.length!==e.length){let n=r.map(i=>i.getText()),s=t.getParent();s&&Node.isJsxExpression(s)?s.replaceWithText(`{cn(${n.join(", ")})}`):t.replaceWithText(`cn(${n.join(", ")})`);}}function H(t,e){if(!Node.isJsxOpeningElement(t)&&!Node.isJsxSelfClosingElement(t))return;let r=t.getAttributes().find(i=>Node.isJsxAttribute(i)&&i.getNameNode().getText()==="className");if(!r||!Node.isJsxAttribute(r)){t.addAttribute({name:"className",initializer:`{cn(${JSON.stringify(e)})}`});return}let n=r.getInitializer();if(!n){r.setInitializer(`{cn(${JSON.stringify(e)})}`);return}if(m(n)){let i=n.getLiteralText(),a=p(E(e,i));n.setLiteralValue(a);return}if(!Node.isJsxExpression(n))return;let s=n.getExpression();if(!s){r.setInitializer(`{cn(${JSON.stringify(e)})}`);return}if(m(s)){let i=s.getLiteralText(),a=p(E(e,i));s.setLiteralValue(a);return}if(Node.isCallExpression(s)&&h(s)){let i=s.getArguments()[0];if(m(i)){let o=i.getLiteralText(),l=p(E(e,o));i.setLiteralValue(l);for(let f=1;f<s.getArguments().length;f++){let u=s.getArguments()[f];if(m(u)){let x=u.getLiteralText(),T=p(x);T!==x&&u.setLiteralValue(T);}}N(s);return}let a=s.getArguments().map(o=>{if(m(o)){let l=p(o.getLiteralText());return l?JSON.stringify(l):null}return o.getText()}).filter(o=>o!==null),c=[JSON.stringify(e),...a];r.setInitializer(`{cn(${c.join(", ")})}`);return}r.setInitializer(`{cn(${JSON.stringify(e)}, ${s.getText()})}`);}function E(t,e){let r=e.split(/\s+/).filter(Boolean);return [...t.split(/\s+/).filter(Boolean),...r].join(" ").trim()}function h(t){let e=t.getExpression();return Node.isIdentifier(e)&&e.getText()==="cn"}function Q(t,e,r){t.forEachDescendant(n=>{if(!Node.isCallExpression(n))return;let s=n.getExpression();if(!(!Node.isIdentifier(s)||s.getText()!=="mergeProps"))for(let i of n.getArguments()){if(!Node.isObjectLiteralExpression(i))continue;let a=i.getProperties().find(o=>Node.isPropertyAssignment(o)&&Node.isIdentifier(o.getNameNode())&&o.getNameNode().getText()==="className");if(!a||!Node.isPropertyAssignment(a))continue;let c=a.getInitializer();if(c&&Node.isCallExpression(c)&&h(c)){let o=Z(c);if(o.length===0)continue;let l=o.filter(u=>!r.has(u));if(l.length===0){w(c);continue}let f=l.map(u=>e[u]).filter(u=>!!u);if(f.length>0){let u=f.join(" ");tt(c,u,r,l);}else w(c);}}});}function Z(t){let e=[];for(let r of t.getArguments())m(r)&&e.push(...y(r.getLiteralText()));return e}function w(t){for(let e of t.getArguments())if(m(e)){let r=p(e.getLiteralText());e.setLiteralValue(r);}N(t);}function tt(t,e,r,n){let s=t.getArguments()[0];if(m(s)){let o=s.getLiteralText(),l=p(E(e,o));s.setLiteralValue(l),n.forEach(f=>r.add(f));for(let f=1;f<t.getArguments().length;f++){let u=t.getArguments()[f];if(m(u)){let x=u.getLiteralText(),T=p(x);T!==x&&u.setLiteralValue(T);}}N(t);return}let i=t.getArguments().map(o=>{if(m(o)){let l=p(o.getLiteralText());return l?JSON.stringify(l):null}return o.getText()}).filter(o=>o!==null),a=[JSON.stringify(e),...i];n.forEach(o=>r.add(o)),t.getParent()&&t.replaceWithText(`cn(${a.join(", ")})`);}async function nt(t,{styleMap:e,transformers:r=[M]}){let s=new Project({useInMemoryFileSystem:true}).createSourceFile("component.tsx",t,{scriptKind:ScriptKind.TSX,overwrite:true});for(let i of r)await i({sourceFile:s,styleMap:e});return s.getText()}var st=async({sourceFile:t,config:e})=>{if(!e.style?.startsWith("base-"))return t;let r=[],n=t.getDescendantsOfKind(SyntaxKind.JsxElement);for(let s of n){let i=s.getOpeningElement(),a=i.getAttribute("render");if(!a)continue;let o=s.getJsxChildren().map(S=>S.getText()).join("").trim();if(!o||a.getKind()!==SyntaxKind.JsxAttribute)continue;let f=a.asKindOrThrow(SyntaxKind.JsxAttribute).getInitializer();if(!f||f.getKind()!==SyntaxKind.JsxExpression)continue;let x=f.asKindOrThrow(SyntaxKind.JsxExpression).getExpression();if(!x||x.getKind()!==SyntaxKind.JsxSelfClosingElement)continue;let T=x.asKindOrThrow(SyntaxKind.JsxSelfClosingElement),A=T.getTagNameNode().getText(),I=T.getAttributes().map(S=>S.getText()).join(" "),J=I?`{<${A} ${I}>${o}</${A}>}`:`{<${A}>${o}</${A}>}`,V=i.getTagNameNode().getText(),j=i.getAttributes().filter(S=>S.getKind()===SyntaxKind.JsxAttribute?S.asKindOrThrow(SyntaxKind.JsxAttribute).getNameNode().getText()!=="render":true).map(S=>S.getText()).join(" "),v=j?`${j} render=${J}`:`render=${J}`,K=`<${V} ${v} />`;r.push({elementStart:s.getStart(),elementEnd:s.getEnd(),newText:K});}for(let s of r.reverse()){let i=t.getFullText(),a=i.substring(0,s.elementStart)+s.newText+i.substring(s.elementEnd);t.replaceWithText(a);}return t};var R="lucide",ot=async({sourceFile:t,config:e})=>{if(!e.iconLibrary||!(e.iconLibrary in a))return t;let r=R,n=e.iconLibrary;if(r===n)return t;let s=await ga(),i=[];for(let a$1 of t.getImportDeclarations()??[])if(a$1.getModuleSpecifier()?.getText()===`"${a[R].import}"`){for(let c of a$1.getNamedImports()??[]){let o=c.getName(),l=s[o]?.[n];!l||i.includes(l)||(i.push(l),c.remove(),t.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(f=>f.getTagNameNode()?.getText()===o).forEach(f=>f.getTagNameNode()?.replaceWithText(l)));}a$1.getNamedImports()?.length===0&&a$1.remove();}if(i.length>0){let a$1=t.addImportDeclaration({moduleSpecifier:a[n]?.import,namedImports:i.map(c=>({name:c}))});at(t)||a$1.replaceWithText(a$1.getText().replace(";",""));}return t};function at(t){return t.getImportDeclarations()?.[0]?.getText().endsWith(";")??false}export{B as createStyleMap,ot as transformIcons,st as transformRender,nt as transformStyle};//# sourceMappingURL=index.js.map
1
+ import {a}from'../chunk-VQCXAURP.js';import {W as W$1}from'../chunk-EWAP55CF.js';export{B as transformMenu}from'../chunk-EWAP55CF.js';import'../chunk-Y7WZRQWW.js';import J from'postcss';import M from'postcss-selector-parser';import {z as z$1}from'zod';import {Project,ScriptKind,SyntaxKind,Node}from'ts-morph';var A="cn-",V=z$1.record(z$1.string().startsWith(A),z$1.string());function v(t){let e=J.parse(t),r={};return e.walkRules(n=>{let s=n.selectors??[];if(s.length===0)return;let i=F(n);if(i)for(let g of s){let l=R(g);M(o=>{o.each(a=>{let f=$(a);if(!f)return;let u=f.value;u.startsWith(A)&&(r[u]=r[u]?`${i} ${r[u]}`:i);});}).processSync(l);}}),V.parse(r)}function R(t){return t.replace(/\s*&\s*/g,"").trim()}function F(t){let e=[];for(let r of t.nodes||[])if(r.type==="atrule"&&r.name==="apply"){let n=r.params.trim();n&&e.push(n);}return e.length===0?null:e.join(" ")}function $(t){let e=[];return t.walkClasses(r=>{r.value.startsWith(A)&&e.push(r);}),e.length===0?null:e[e.length-1]}var z=new Set(["cn-menu-target"]);function p(t){return Node.isStringLiteral(t)||Node.isNoSubstitutionTemplateLiteral(t)}var O=async({sourceFile:t,styleMap:e})=>{let r=new Set;return W(t,e,r),w(t,e,r),_(t,e,r),t};function E(t,e,r){let n=t.getLiteralText(),s=y(n);if(s.length===0)return;let i=s.filter(l=>!r.has(l));if(i.length===0){let l=m(n);t.setLiteralValue(l);return}let g=i.map(l=>e[l]).filter(l=>!!l);if(g.length>0){let l=g.join(" "),o=m(d(l,n));t.setLiteralValue(o),i.forEach(a=>r.add(a));}else {let l=m(n);t.setLiteralValue(l);}}function W(t,e,r){t.forEachDescendant(n=>{if(!Node.isCallExpression(n))return;let s=n.getExpression();if(!Node.isIdentifier(s)||s.getText()!=="cva")return;let i=n.getArguments()[0];Node.isStringLiteral(i)&&E(i,e,r);let g=n.getArguments()[1];if(!g||!Node.isObjectLiteralExpression(g))return;let l=g.getProperties().find(a=>Node.isPropertyAssignment(a)&&Node.isIdentifier(a.getNameNode())&&a.getNameNode().getText()==="variants");if(!l||!Node.isPropertyAssignment(l))return;let o=l.getInitializer();!o||!Node.isObjectLiteralExpression(o)||o.getProperties().forEach(a=>{if(!Node.isPropertyAssignment(a))return;let f=a.getInitializer();!f||!Node.isObjectLiteralExpression(f)||f.getProperties().forEach(u=>{if(!Node.isPropertyAssignment(u))return;let x=u.getInitializer();x&&Node.isStringLiteral(x)&&E(x,e,r);});});});}function w(t,e,r){t.forEachDescendant(n=>{if(!Node.isJsxAttribute(n)||n.getNameNode().getText()!=="className")return;let s=n.getInitializer();if(!s)return;let i=D(s);if(i.length===0)return;let g=n.getParent()?.getParent();if(!g||!Node.isJsxOpeningElement(g)&&!Node.isJsxSelfClosingElement(g))return;let l=i.filter(a=>!r.has(a));if(l.length===0){I(s);return}let o=l.map(a=>e[a]).filter(a=>!!a);if(o.length>0){let a=o.join(" ");B(g,a);}else I(s);});}function D(t){let e=[];if(p(t))return y(t.getLiteralText());if(!Node.isJsxExpression(t))return e;let r=t.getExpression();if(!r)return e;if(p(r))return y(r.getLiteralText());if(Node.isCallExpression(r)&&T(r))for(let n of r.getArguments())p(n)&&e.push(...y(n.getLiteralText()));return e}function I(t){if(p(t)){let r=m(t.getLiteralText());t.setLiteralValue(r);return}if(!Node.isJsxExpression(t))return;let e=t.getExpression();if(e){if(p(e)){let r=m(e.getLiteralText());e.setLiteralValue(r);return}if(Node.isCallExpression(e)&&T(e)){for(let r of e.getArguments())if(p(r)){let n=m(r.getLiteralText());r.setLiteralValue(n);}C(e);}}}function y(t){let e=t.matchAll(/\bcn-[\w-]+\b/g);return Array.from(e,r=>r[0])}function m(t){return t.replace(/\bcn-[\w-]+\b/g,e=>z.has(e)?e:"").replace(/\s+/g," ").trim()}function C(t){if(!T(t))return;let e=t.getArguments(),r=e.filter(n=>p(n)?n.getLiteralText().trim()!=="":true);if(r.length!==e.length){let n=r.map(i=>i.getText()),s=t.getParent();s&&Node.isJsxExpression(s)?s.replaceWithText(`{cn(${n.join(", ")})}`):t.replaceWithText(`cn(${n.join(", ")})`);}}function B(t,e){if(!Node.isJsxOpeningElement(t)&&!Node.isJsxSelfClosingElement(t))return;let r=t.getAttributes().find(i=>Node.isJsxAttribute(i)&&i.getNameNode().getText()==="className");if(!r||!Node.isJsxAttribute(r)){t.addAttribute({name:"className",initializer:`{cn(${JSON.stringify(e)})}`});return}let n=r.getInitializer();if(!n){r.setInitializer(`{cn(${JSON.stringify(e)})}`);return}if(p(n)){let i=n.getLiteralText(),g=m(d(e,i));n.setLiteralValue(g);return}if(!Node.isJsxExpression(n))return;let s=n.getExpression();if(!s){r.setInitializer(`{cn(${JSON.stringify(e)})}`);return}if(p(s)){let i=s.getLiteralText(),g=m(d(e,i));s.setLiteralValue(g);return}if(Node.isCallExpression(s)&&T(s)){let i=s.getArguments()[0];if(p(i)){let o=i.getLiteralText(),a=m(d(e,o));i.setLiteralValue(a);for(let f=1;f<s.getArguments().length;f++){let u=s.getArguments()[f];if(p(u)){let x=u.getLiteralText(),S=m(x);S!==x&&u.setLiteralValue(S);}}C(s);return}let g=s.getArguments().map(o=>{if(p(o)){let a=m(o.getLiteralText());return a?JSON.stringify(a):null}return o.getText()}).filter(o=>o!==null),l=[JSON.stringify(e),...g];r.setInitializer(`{cn(${l.join(", ")})}`);return}r.setInitializer(`{cn(${JSON.stringify(e)}, ${s.getText()})}`);}function d(t,e){let r=e.split(/\s+/).filter(Boolean);return [...t.split(/\s+/).filter(Boolean),...r].join(" ").trim()}function T(t){let e=t.getExpression();return Node.isIdentifier(e)&&e.getText()==="cn"}function _(t,e,r){t.forEachDescendant(n=>{if(!Node.isCallExpression(n))return;let s=n.getExpression();if(!(!Node.isIdentifier(s)||s.getText()!=="mergeProps"))for(let i of n.getArguments()){if(!Node.isObjectLiteralExpression(i))continue;let g=i.getProperties().find(o=>Node.isPropertyAssignment(o)&&Node.isIdentifier(o.getNameNode())&&o.getNameNode().getText()==="className");if(!g||!Node.isPropertyAssignment(g))continue;let l=g.getInitializer();if(l&&Node.isCallExpression(l)&&T(l)){let o=k(l);if(o.length===0)continue;let a=o.filter(u=>!r.has(u));if(a.length===0){b(l);continue}let f=a.map(u=>e[u]).filter(u=>!!u);if(f.length>0){let u=f.join(" ");K(l,u,r,a);}else b(l);}}});}function k(t){let e=[];for(let r of t.getArguments())p(r)&&e.push(...y(r.getLiteralText()));return e}function b(t){for(let e of t.getArguments())if(p(e)){let r=m(e.getLiteralText());e.setLiteralValue(r);}C(t);}function K(t,e,r,n){let s=t.getArguments()[0];if(p(s)){let o=s.getLiteralText(),a=m(d(e,o));s.setLiteralValue(a),n.forEach(f=>r.add(f));for(let f=1;f<t.getArguments().length;f++){let u=t.getArguments()[f];if(p(u)){let x=u.getLiteralText(),S=m(x);S!==x&&u.setLiteralValue(S);}}C(t);return}let i=t.getArguments().map(o=>{if(p(o)){let a=m(o.getLiteralText());return a?JSON.stringify(a):null}return o.getText()}).filter(o=>o!==null),g=[JSON.stringify(e),...i];n.forEach(o=>r.add(o)),t.getParent()&&t.replaceWithText(`cn(${g.join(", ")})`);}async function X(t,{styleMap:e,transformers:r=[O]}){let s=new Project({useInMemoryFileSystem:true}).createSourceFile("component.tsx",t,{scriptKind:ScriptKind.TSX,overwrite:true});for(let i of r)await i({sourceFile:s,styleMap:e});return s.getText()}var P="lucide",q=async({sourceFile:t,config:e})=>{if(!e.iconLibrary||!(e.iconLibrary in a))return t;let r=P,n=e.iconLibrary;if(r===n)return t;let s=await W$1(),i=[];for(let g of t.getImportDeclarations()??[])if(g.getModuleSpecifier()?.getText()===`"${a[P].import}"`){for(let l of g.getNamedImports()??[]){let o=l.getName(),a=s[o]?.[n];!a||i.includes(a)||(i.push(a),l.remove(),t.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).filter(f=>f.getTagNameNode()?.getText()===o).forEach(f=>f.getTagNameNode()?.replaceWithText(a)));}g.getNamedImports()?.length===0&&g.remove();}if(i.length>0){let g=t.addImportDeclaration({moduleSpecifier:a[n]?.import,namedImports:i.map(l=>({name:l}))});H(t)||g.replaceWithText(g.getText().replace(";",""));}return t};function H(t){return t.getImportDeclarations()?.[0]?.getText().endsWith(";")??false}export{v as createStyleMap,q as transformIcons,X as transformStyle};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/styles/create-style-map.ts","../../src/styles/transform-style-map.ts","../../src/styles/transform.ts","../../src/utils/transformers/transform-render.ts","../../src/utils/transformers/transform-legacy-icons.ts"],"names":["CN_PREFIX","styleMapSchema","z","createStyleMap","input","root","postcss","result","rule","selectors","tailwindClasses","extractTailwindClasses","selector","normalizedSelector","normalizeSelector","selectorParser","selectorsRoot","sel","targetClass","findSubjectClass","className","classes","node","value","classNodes","classNode","ALLOWLIST","isStringLiteralLike","Node","transformStyleMap","sourceFile","styleMap","matchedClasses","applyToCvaCalls","applyToClassNameAttributes","applyToMergePropsCalls","applyStyleToCvaString","stringNode","stringValue","cnClasses","extractCnClasses","unmatchedClasses","cnClass","updated","removeCnClasses","tailwindClassesToApply","mergedClasses","mergeClasses","expression","baseArg","configArg","variantsProp","prop","variantsObj","typeProp","typeObj","variantProp","variantValue","initializer","extractCnClassesFromAttribute","jsxElement","cleanCnClassesFromAttribute","applyClassesToElement","isCnCall","argument","cleaned","removeEmptyArgumentsFromCnCall","str","matches","match","callExpression","args","nonEmptyArgs","arg","argTexts","parent","element","attribute","attr","existing","firstArg","i","argText","argumentTexts","updatedArguments","newClasses","existingParts","call","classNameProp","classNameInitializer","extractCnClassesFromCnCall","cleanCnClassesFromCnCall","applyClassesToCnCall","cnCall","transformStyle","source","transformers","Project","ScriptKind","transformer","transformRender","config","transformations","jsxElements","SyntaxKind","openingElement","renderAttr","childrenText","c","selfClosingElement","tagName","attributes","newRenderValue","parentTagName","otherAttrs","newAttrs","newElementText","info","fullText","newFullText","SOURCE_LIBRARY","transformLegacyIcons","LEGACY_ICON_LIBRARIES","sourceLibrary","targetLibrary","registryIcons","getRegistryIcons","targetedIcons","importDeclaration","specifier","iconName","targetedIcon","iconImportDeclaration","icon","_useSemicolon"],"mappings":"ySAOA,IAAMA,CAAAA,CAAY,KAAA,CAELC,EAAiBC,CAAAA,CAAE,MAAA,CAC9BA,CAAAA,CAAE,MAAA,EAAO,CAAE,UAAA,CAAWF,CAAS,CAAA,CAC/BE,CAAAA,CAAE,MAAA,EACJ,CAAA,CAIO,SAASC,CAAAA,CAAeC,CAAAA,CAAe,CAC5C,IAAMC,CAAAA,CAAOC,CAAAA,CAAQ,KAAA,CAAMF,CAAK,CAAA,CAE1BG,CAAAA,CAAiC,EAAC,CAExC,OAAAF,CAAAA,CAAK,SAAA,CAAWG,CAAAA,EAAS,CACvB,IAAMC,CAAAA,CAAYD,CAAAA,CAAK,WAAa,EAAC,CAErC,GAAIC,CAAAA,CAAU,MAAA,GAAW,CAAA,CACvB,OAGF,IAAMC,CAAAA,CAAkBC,CAAAA,CAAuBH,CAAI,CAAA,CAEnD,GAAKE,CAAAA,CAIL,IAAA,IAAWE,CAAAA,IAAYH,EAAW,CAChC,IAAMI,CAAAA,CAAqBC,CAAAA,CAAkBF,CAAQ,CAAA,CAErDG,CAAAA,CAAgBC,CAAAA,EAAkB,CAChCA,CAAAA,CAAc,IAAA,CAAMC,CAAAA,EAAQ,CAC1B,IAAMC,CAAAA,CAAcC,CAAAA,CAAiBF,CAAG,CAAA,CAExC,GAAI,CAACC,CAAAA,CACH,OAGF,IAAME,CAAAA,CAAYF,CAAAA,CAAY,KAAA,CAEzBE,CAAAA,CAAU,UAAA,CAAWpB,CAAS,CAAA,GAInCO,CAAAA,CAAOa,CAAS,CAAA,CAAIb,EAAOa,CAAS,CAAA,CAChC,CAAA,EAAGV,CAAe,CAAA,CAAA,EAAIH,CAAAA,CAAOa,CAAS,CAAC,CAAA,CAAA,CACvCV,CAAAA,EACN,CAAC,EACH,CAAC,CAAA,CAAE,WAAA,CAAYG,CAAkB,EACnC,CACF,CAAC,CAAA,CAEMZ,CAAAA,CAAe,KAAA,CAAMM,CAAM,CACpC,CAEA,SAASO,CAAAA,CAAkBF,CAAAA,CAAkB,CAC3C,OAAOA,CAAAA,CAAS,OAAA,CAAQ,UAAA,CAAY,EAAE,CAAA,CAAE,IAAA,EAC1C,CAEA,SAASD,CAAAA,CAAuBH,CAAAA,CAAoB,CAClD,IAAMa,CAAAA,CAAoB,EAAC,CAE3B,IAAA,IAAWC,CAAAA,IAAQd,CAAAA,CAAK,KAAA,EAAS,EAAC,CAChC,GAAIc,CAAAA,CAAK,IAAA,GAAS,QAAA,EAAYA,CAAAA,CAAK,IAAA,GAAS,OAAA,CAAS,CACnD,IAAMC,CAAAA,CAAQD,CAAAA,CAAK,MAAA,CAAO,IAAA,EAAK,CAC3BC,CAAAA,EACFF,EAAQ,IAAA,CAAKE,CAAK,EAEtB,CAGF,OAAIF,CAAAA,CAAQ,MAAA,GAAW,CAAA,CACd,IAAA,CAGFA,CAAAA,CAAQ,IAAA,CAAK,GAAG,CACzB,CAEA,SAASF,CAAAA,CAAiBP,EAA4B,CACpD,IAAMY,CAAAA,CAA0B,EAAC,CAQjC,OANAZ,CAAAA,CAAS,WAAA,CAAaa,CAAAA,EAAc,CAC9BA,CAAAA,CAAU,KAAA,CAAM,UAAA,CAAWzB,CAAS,CAAA,EACtCwB,CAAAA,CAAW,KAAKC,CAAS,EAE7B,CAAC,CAAA,CAEGD,CAAAA,CAAW,MAAA,GAAW,CAAA,CACjB,IAAA,CAGFA,CAAAA,CAAWA,CAAAA,CAAW,MAAA,CAAS,CAAC,CACzC,CCnFA,IAAME,CAAAA,CAAY,IAAI,GAAA,CAAI,CAAC,gBAAgB,CAAC,CAAA,CAE5C,SAASC,EACPL,CAAAA,CACuD,CACvD,OACEM,IAAAA,CAAK,eAAA,CAAgBN,CAAI,CAAA,EAAKM,IAAAA,CAAK,+BAAA,CAAgCN,CAAI,CAE3E,CAEO,IAAMO,CAAAA,CAAkD,MAAO,CACpE,WAAAC,CAAAA,CACA,QAAA,CAAAC,CACF,CAAA,GAAM,CACJ,IAAMC,CAAAA,CAAiB,IAAI,IAE3B,OAAAC,CAAAA,CAAgBH,CAAAA,CAAYC,CAAAA,CAAUC,CAAc,CAAA,CACpDE,CAAAA,CAA2BJ,CAAAA,CAAYC,EAAUC,CAAc,CAAA,CAC/DG,CAAAA,CAAuBL,CAAAA,CAAYC,CAAAA,CAAUC,CAAc,CAAA,CAEpDF,CACT,CAAA,CAEA,SAASM,CAAAA,CACPC,CAAAA,CACAN,CAAAA,CACAC,CAAAA,CACA,CACA,IAAMM,EAAcD,CAAAA,CAAW,cAAA,EAAe,CACxCE,CAAAA,CAAYC,CAAAA,CAAiBF,CAAW,CAAA,CAE9C,GAAIC,CAAAA,CAAU,MAAA,GAAW,CAAA,CACvB,OAIF,IAAME,CAAAA,CAAmBF,CAAAA,CAAU,MAAA,CAChCG,GAAY,CAACV,CAAAA,CAAe,GAAA,CAAIU,CAAO,CAC1C,CAAA,CAEA,GAAID,CAAAA,CAAiB,MAAA,GAAW,CAAA,CAAG,CAEjC,IAAME,CAAAA,CAAUC,CAAAA,CAAgBN,CAAW,CAAA,CAC3CD,EAAW,eAAA,CAAgBM,CAAO,CAAA,CAClC,MACF,CAEA,IAAME,CAAAA,CAAyBJ,CAAAA,CAC5B,GAAA,CAAKC,CAAAA,EAAYX,CAAAA,CAASW,CAAO,CAAC,CAAA,CAClC,MAAA,CAAQrB,CAAAA,EAA+B,EAAQA,CAAQ,CAAA,CAE1D,GAAIwB,CAAAA,CAAuB,MAAA,CAAS,CAAA,CAAG,CACrC,IAAMC,CAAAA,CAAgBD,CAAAA,CAAuB,IAAA,CAAK,GAAG,CAAA,CAC/CF,CAAAA,CAAUC,CAAAA,CAAgBG,CAAAA,CAAaD,EAAeR,CAAW,CAAC,CAAA,CACxED,CAAAA,CAAW,eAAA,CAAgBM,CAAO,CAAA,CAClCF,CAAAA,CAAiB,OAAA,CAASC,CAAAA,EAAYV,CAAAA,CAAe,GAAA,CAAIU,CAAO,CAAC,EACnE,CAAA,KAAO,CAEL,IAAMC,CAAAA,CAAUC,CAAAA,CAAgBN,CAAW,CAAA,CAC3CD,CAAAA,CAAW,eAAA,CAAgBM,CAAO,EACpC,CACF,CAEA,SAASV,CAAAA,CACPH,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACA,CACAF,CAAAA,CAAW,iBAAA,CAAmBR,CAAAA,EAAS,CACrC,GAAI,CAACM,IAAAA,CAAK,gBAAA,CAAiBN,CAAI,CAAA,CAC7B,OAGF,IAAM0B,CAAAA,CAAa1B,CAAAA,CAAK,aAAA,EAAc,CACtC,GAAI,CAACM,IAAAA,CAAK,YAAA,CAAaoB,CAAU,CAAA,EAAKA,CAAAA,CAAW,OAAA,EAAQ,GAAM,KAAA,CAC7D,OAGF,IAAMC,CAAAA,CAAU3B,CAAAA,CAAK,YAAA,EAAa,CAAE,CAAC,CAAA,CACjCM,KAAK,eAAA,CAAgBqB,CAAO,CAAA,EAC9Bb,CAAAA,CAAsBa,CAAAA,CAASlB,CAAAA,CAAUC,CAAc,CAAA,CAGzD,IAAMkB,CAAAA,CAAY5B,CAAAA,CAAK,YAAA,EAAa,CAAE,CAAC,CAAA,CACvC,GAAI,CAAC4B,CAAAA,EAAa,CAACtB,IAAAA,CAAK,yBAAA,CAA0BsB,CAAS,CAAA,CACzD,OAGF,IAAMC,CAAAA,CAAeD,CAAAA,CAClB,aAAA,EAAc,CACd,IAAA,CACEE,CAAAA,EACCxB,IAAAA,CAAK,oBAAA,CAAqBwB,CAAI,CAAA,EAC9BxB,IAAAA,CAAK,YAAA,CAAawB,CAAAA,CAAK,WAAA,EAAa,CAAA,EACpCA,CAAAA,CAAK,WAAA,EAAY,CAAE,OAAA,EAAQ,GAAM,UACrC,CAAA,CAEF,GAAI,CAACD,GAAgB,CAACvB,IAAAA,CAAK,oBAAA,CAAqBuB,CAAY,CAAA,CAC1D,OAGF,IAAME,CAAAA,CAAcF,CAAAA,CAAa,cAAA,EAAe,CAC5C,CAACE,CAAAA,EAAe,CAACzB,IAAAA,CAAK,yBAAA,CAA0ByB,CAAW,CAAA,EAI/DA,CAAAA,CAAY,aAAA,EAAc,CAAE,OAAA,CAASC,CAAAA,EAAa,CAChD,GAAI,CAAC1B,IAAAA,CAAK,oBAAA,CAAqB0B,CAAQ,CAAA,CACrC,OAGF,IAAMC,CAAAA,CAAUD,EAAS,cAAA,EAAe,CACpC,CAACC,CAAAA,EAAW,CAAC3B,IAAAA,CAAK,yBAAA,CAA0B2B,CAAO,CAAA,EAIvDA,CAAAA,CAAQ,aAAA,EAAc,CAAE,OAAA,CAASC,CAAAA,EAAgB,CAC/C,GAAI,CAAC5B,IAAAA,CAAK,oBAAA,CAAqB4B,CAAW,CAAA,CACxC,OAGF,IAAMC,CAAAA,CAAeD,CAAAA,CAAY,gBAAe,CAC5CC,CAAAA,EAAgB7B,IAAAA,CAAK,eAAA,CAAgB6B,CAAY,CAAA,EACnDrB,CAAAA,CAAsBqB,CAAAA,CAAc1B,EAAUC,CAAc,EAEhE,CAAC,EACH,CAAC,EACH,CAAC,EACH,CAEA,SAASE,CAAAA,CACPJ,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACA,CACAF,CAAAA,CAAW,kBAAmBR,CAAAA,EAAS,CACrC,GACE,CAACM,IAAAA,CAAK,cAAA,CAAeN,CAAI,CAAA,EACzBA,CAAAA,CAAK,WAAA,EAAY,CAAE,OAAA,EAAQ,GAAM,WAAA,CAEjC,OAGF,IAAMoC,EAAcpC,CAAAA,CAAK,cAAA,EAAe,CACxC,GAAI,CAACoC,CAAAA,CACH,OAGF,IAAMnB,CAAAA,CAAYoB,CAAAA,CAA8BD,CAAW,CAAA,CAE3D,GAAInB,CAAAA,CAAU,MAAA,GAAW,CAAA,CACvB,OAGF,IAAMqB,CAAAA,CAAatC,CAAAA,CAAK,SAAA,EAAU,EAAG,SAAA,EAAU,CAC/C,GACE,CAACsC,CAAAA,EACA,CAAChC,IAAAA,CAAK,mBAAA,CAAoBgC,CAAU,CAAA,EACnC,CAAChC,KAAK,uBAAA,CAAwBgC,CAAU,CAAA,CAE1C,OAGF,IAAMnB,CAAAA,CAAmBF,CAAAA,CAAU,MAAA,CAChCG,CAAAA,EAAY,CAACV,CAAAA,CAAe,GAAA,CAAIU,CAAO,CAC1C,CAAA,CAEA,GAAID,EAAiB,MAAA,GAAW,CAAA,CAAG,CAEjCoB,CAAAA,CAA4BH,CAAW,CAAA,CACvC,MACF,CAEA,IAAMb,CAAAA,CAAyBJ,CAAAA,CAC5B,GAAA,CAAKC,CAAAA,EAAYX,CAAAA,CAASW,CAAO,CAAC,EAClC,MAAA,CAAQrB,CAAAA,EAA+B,CAAA,CAAQA,CAAQ,CAAA,CAE1D,GAAIwB,CAAAA,CAAuB,MAAA,CAAS,CAAA,CAAG,CACrC,IAAMC,CAAAA,CAAgBD,CAAAA,CAAuB,IAAA,CAAK,GAAG,CAAA,CACrDiB,EAAsBF,CAAAA,CAAYd,CAAa,EACjD,CAAA,KACEe,CAAAA,CAA4BH,CAAW,EAE3C,CAAC,EACH,CAEA,SAASC,CAAAA,CAA8BD,CAAAA,CAAmB,CACxD,IAAMrC,CAAAA,CAAoB,EAAC,CAE3B,GAAIM,CAAAA,CAAoB+B,CAAW,CAAA,CACjC,OAAOlB,CAAAA,CAAiBkB,CAAAA,CAAY,cAAA,EAAgB,CAAA,CAGtD,GAAI,CAAC9B,IAAAA,CAAK,eAAA,CAAgB8B,CAAW,EACnC,OAAOrC,CAAAA,CAGT,IAAM2B,CAAAA,CAAaU,CAAAA,CAAY,aAAA,EAAc,CAC7C,GAAI,CAACV,CAAAA,CACH,OAAO3B,CAAAA,CAGT,GAAIM,CAAAA,CAAoBqB,CAAU,CAAA,CAChC,OAAOR,CAAAA,CAAiBQ,CAAAA,CAAW,cAAA,EAAgB,CAAA,CAGrD,GAAIpB,IAAAA,CAAK,gBAAA,CAAiBoB,CAAU,CAAA,EAAKe,CAAAA,CAASf,CAAU,CAAA,CAC1D,IAAA,IAAWgB,CAAAA,IAAYhB,CAAAA,CAAW,cAAa,CACzCrB,CAAAA,CAAoBqC,CAAQ,CAAA,EAC9B3C,CAAAA,CAAQ,IAAA,CAAK,GAAGmB,CAAAA,CAAiBwB,CAAAA,CAAS,cAAA,EAAgB,CAAC,CAAA,CAKjE,OAAO3C,CACT,CAEA,SAASwC,CAAAA,CAA4BH,CAAAA,CAAmB,CACtD,GAAI/B,CAAAA,CAAoB+B,CAAW,CAAA,CAAG,CACpC,IAAMO,CAAAA,CAAUrB,CAAAA,CAAgBc,CAAAA,CAAY,cAAA,EAAgB,CAAA,CAC5DA,CAAAA,CAAY,gBAAgBO,CAAO,CAAA,CACnC,MACF,CAEA,GAAI,CAACrC,IAAAA,CAAK,eAAA,CAAgB8B,CAAW,CAAA,CACnC,OAGF,IAAMV,CAAAA,CAAaU,CAAAA,CAAY,aAAA,EAAc,CAC7C,GAAKV,CAAAA,CAIL,CAAA,GAAIrB,CAAAA,CAAoBqB,CAAU,CAAA,CAAG,CACnC,IAAMiB,CAAAA,CAAUrB,CAAAA,CAAgBI,CAAAA,CAAW,cAAA,EAAgB,CAAA,CAC3DA,CAAAA,CAAW,eAAA,CAAgBiB,CAAO,EAClC,MACF,CAEA,GAAIrC,IAAAA,CAAK,gBAAA,CAAiBoB,CAAU,CAAA,EAAKe,CAAAA,CAASf,CAAU,CAAA,CAAG,CAC7D,IAAA,IAAWgB,CAAAA,IAAYhB,CAAAA,CAAW,YAAA,EAAa,CAC7C,GAAIrB,EAAoBqC,CAAQ,CAAA,CAAG,CACjC,IAAMC,CAAAA,CAAUrB,CAAAA,CAAgBoB,CAAAA,CAAS,cAAA,EAAgB,CAAA,CACzDA,CAAAA,CAAS,eAAA,CAAgBC,CAAO,EAClC,CAGFC,CAAAA,CAA+BlB,CAAU,EAC3C,CAAA,CACF,CAEA,SAASR,CAAAA,CAAiB2B,CAAAA,CAAa,CACrC,IAAMC,CAAAA,CAAUD,CAAAA,CAAI,QAAA,CAAS,gBAAgB,CAAA,CAC7C,OAAO,KAAA,CAAM,IAAA,CAAKC,EAAUC,CAAAA,EAAUA,CAAAA,CAAM,CAAC,CAAC,CAChD,CAOA,SAASzB,CAAAA,CAAgBuB,CAAAA,CAAa,CACpC,OAAOA,CAAAA,CACJ,OAAA,CAAQ,gBAAA,CAAmBE,CAAAA,EAEtB3C,CAAAA,CAAU,IAAI2C,CAAK,CAAA,CACdA,CAAAA,CAEF,EACR,CAAA,CACA,OAAA,CAAQ,MAAA,CAAQ,GAAG,CAAA,CACnB,IAAA,EACL,CAEA,SAASH,CAAAA,CAA+BI,CAAAA,CAAgC,CACtE,GAAI,CAACP,CAAAA,CAASO,CAAc,CAAA,CAC1B,OAGF,IAAMC,CAAAA,CAAOD,CAAAA,CAAe,YAAA,EAAa,CACnCE,CAAAA,CAAeD,CAAAA,CAAK,MAAA,CAAQE,CAAAA,EAC5B9C,CAAAA,CAAoB8C,CAAG,EACZA,CAAAA,CAAI,cAAA,EAAe,CAAE,IAAA,EAAK,GACvB,EAAA,CAEX,IACR,CAAA,CAED,GAAID,CAAAA,CAAa,MAAA,GAAWD,CAAAA,CAAK,MAAA,CAAQ,CACvC,IAAMG,CAAAA,CAAWF,EAAa,GAAA,CAAKC,CAAAA,EAAQA,CAAAA,CAAI,OAAA,EAAS,CAAA,CAClDE,CAAAA,CAASL,CAAAA,CAAe,SAAA,EAAU,CACpCK,CAAAA,EAAU/C,IAAAA,CAAK,eAAA,CAAgB+C,CAAM,CAAA,CACvCA,CAAAA,CAAO,gBAAgB,CAAA,IAAA,EAAOD,CAAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,CAAI,CAAA,CAErDJ,CAAAA,CAAe,gBAAgB,CAAA,GAAA,EAAMI,CAAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,EAE/D,CACF,CAEA,SAASZ,CAAAA,CAAsBc,CAAAA,CAAelE,CAAAA,CAAyB,CACrE,GACE,CAACkB,IAAAA,CAAK,mBAAA,CAAoBgD,CAAO,CAAA,EACjC,CAAChD,IAAAA,CAAK,uBAAA,CAAwBgD,CAAO,CAAA,CAErC,OAGF,IAAMC,CAAAA,CAAYD,CAAAA,CACf,aAAA,EAAc,CACd,IAAA,CACEE,CAAAA,EACClD,IAAAA,CAAK,cAAA,CAAekD,CAAI,CAAA,EACxBA,CAAAA,CAAK,WAAA,EAAY,CAAE,OAAA,EAAQ,GAAM,WACrC,CAAA,CAEF,GAAI,CAACD,CAAAA,EAAa,CAACjD,IAAAA,CAAK,cAAA,CAAeiD,CAAS,CAAA,CAAG,CACjDD,CAAAA,CAAQ,YAAA,CAAa,CACnB,IAAA,CAAM,WAAA,CACN,WAAA,CAAa,OAAO,IAAA,CAAK,SAAA,CAAUlE,CAAe,CAAC,CAAA,EAAA,CACrD,CAAC,CAAA,CACD,MACF,CAEA,IAAMgD,CAAAA,CAAcmB,CAAAA,CAAU,cAAA,EAAe,CAE7C,GAAI,CAACnB,EAAa,CAChBmB,CAAAA,CAAU,cAAA,CAAe,CAAA,IAAA,EAAO,IAAA,CAAK,SAAA,CAAUnE,CAAe,CAAC,CAAA,EAAA,CAAI,CAAA,CACnE,MACF,CAEA,GAAIiB,CAAAA,CAAoB+B,CAAW,CAAA,CAAG,CACpC,IAAMqB,CAAAA,CAAWrB,CAAAA,CAAY,cAAA,EAAe,CACtCf,CAAAA,CAAUC,CAAAA,CAAgBG,CAAAA,CAAarC,CAAAA,CAAiBqE,CAAQ,CAAC,CAAA,CACvErB,CAAAA,CAAY,eAAA,CAAgBf,CAAO,CAAA,CACnC,MACF,CAEA,GAAI,CAACf,IAAAA,CAAK,eAAA,CAAgB8B,CAAW,CAAA,CACnC,OAGF,IAAMV,CAAAA,CAAaU,CAAAA,CAAY,aAAA,EAAc,CAE7C,GAAI,CAACV,CAAAA,CAAY,CACf6B,CAAAA,CAAU,cAAA,CAAe,CAAA,IAAA,EAAO,IAAA,CAAK,SAAA,CAAUnE,CAAe,CAAC,CAAA,EAAA,CAAI,EACnE,MACF,CAEA,GAAIiB,CAAAA,CAAoBqB,CAAU,CAAA,CAAG,CACnC,IAAM+B,EAAW/B,CAAAA,CAAW,cAAA,EAAe,CACrCL,CAAAA,CAAUC,CAAAA,CAAgBG,CAAAA,CAAarC,CAAAA,CAAiBqE,CAAQ,CAAC,CAAA,CACvE/B,CAAAA,CAAW,eAAA,CAAgBL,CAAO,CAAA,CAClC,MACF,CAEA,GAAIf,IAAAA,CAAK,gBAAA,CAAiBoB,CAAU,CAAA,EAAKe,CAAAA,CAASf,CAAU,CAAA,CAAG,CAC7D,IAAMgC,CAAAA,CAAWhC,CAAAA,CAAW,YAAA,EAAa,CAAE,CAAC,CAAA,CAC5C,GAAIrB,EAAoBqD,CAAQ,CAAA,CAAG,CACjC,IAAMD,CAAAA,CAAWC,CAAAA,CAAS,cAAA,EAAe,CACnCrC,CAAAA,CAAUC,CAAAA,CAAgBG,CAAAA,CAAarC,CAAAA,CAAiBqE,CAAQ,CAAC,CAAA,CACvEC,CAAAA,CAAS,gBAAgBrC,CAAO,CAAA,CAEhC,IAAA,IAASsC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIjC,CAAAA,CAAW,YAAA,EAAa,CAAE,MAAA,CAAQiC,CAAAA,EAAAA,CAAK,CACzD,IAAMR,CAAAA,CAAMzB,CAAAA,CAAW,YAAA,GAAeiC,CAAC,CAAA,CACvC,GAAItD,CAAAA,CAAoB8C,CAAG,CAAA,CAAG,CAC5B,IAAMS,CAAAA,CAAUT,CAAAA,CAAI,cAAA,EAAe,CAC7BR,CAAAA,CAAUrB,CAAAA,CAAgBsC,CAAO,CAAA,CACnCjB,IAAYiB,CAAAA,EACdT,CAAAA,CAAI,eAAA,CAAgBR,CAAO,EAE/B,CACF,CAEAC,CAAAA,CAA+BlB,CAAU,CAAA,CACzC,MACF,CAEA,IAAMmC,CAAAA,CAAgBnC,CAAAA,CACnB,YAAA,GACA,GAAA,CAAKgB,CAAAA,EAAa,CACjB,GAAIrC,CAAAA,CAAoBqC,CAAQ,CAAA,CAAG,CACjC,IAAMC,CAAAA,CAAUrB,CAAAA,CAAgBoB,CAAAA,CAAS,cAAA,EAAgB,CAAA,CACzD,OAAOC,EAAU,IAAA,CAAK,SAAA,CAAUA,CAAO,CAAA,CAAI,IAC7C,CACA,OAAOD,CAAAA,CAAS,OAAA,EAClB,CAAC,CAAA,CACA,MAAA,CAAQS,CAAAA,EAAuBA,CAAAA,GAAQ,IAAI,EAExCW,CAAAA,CAAmB,CAAC,IAAA,CAAK,SAAA,CAAU1E,CAAe,CAAA,CAAG,GAAGyE,CAAa,CAAA,CAE3EN,CAAAA,CAAU,cAAA,CAAe,CAAA,IAAA,EAAOO,CAAAA,CAAiB,IAAA,CAAK,IAAI,CAAC,IAAI,CAAA,CAC/D,MACF,CAEAP,CAAAA,CAAU,cAAA,CACR,CAAA,IAAA,EAAO,IAAA,CAAK,SAAA,CAAUnE,CAAe,CAAC,CAAA,EAAA,EAAKsC,CAAAA,CAAW,OAAA,EAAS,CAAA,EAAA,CACjE,EACF,CAEA,SAASD,CAAAA,CAAasC,CAAAA,CAAoBN,CAAAA,CAAkB,CAC1D,IAAMO,CAAAA,CAAgBP,CAAAA,CAAS,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAG1D,OADiB,CAAC,GADDM,CAAAA,CAAW,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CACxB,GAAGC,CAAa,CAAA,CAC/B,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,EAC5B,CAEA,SAASvB,CAAAA,CAASwB,CAAAA,CAAsB,CACtC,IAAMvC,CAAAA,CAAauC,CAAAA,CAAK,aAAA,EAAc,CACtC,OAAO3D,IAAAA,CAAK,YAAA,CAAaoB,CAAU,CAAA,EAAKA,CAAAA,CAAW,OAAA,EAAQ,GAAM,IACnE,CAEA,SAASb,CAAAA,CACPL,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACA,CACAF,CAAAA,CAAW,iBAAA,CAAmBR,CAAAA,EAAS,CACrC,GAAI,CAACM,IAAAA,CAAK,gBAAA,CAAiBN,CAAI,EAC7B,OAGF,IAAM0B,CAAAA,CAAa1B,CAAAA,CAAK,aAAA,EAAc,CACtC,GACE,EAAA,CAACM,IAAAA,CAAK,YAAA,CAAaoB,CAAU,CAAA,EAC7BA,CAAAA,CAAW,OAAA,EAAQ,GAAM,YAAA,CAAA,CAM3B,QAAWyB,CAAAA,IAAOnD,CAAAA,CAAK,YAAA,EAAa,CAAG,CACrC,GAAI,CAACM,IAAAA,CAAK,0BAA0B6C,CAAG,CAAA,CACrC,SAIF,IAAMe,CAAAA,CAAgBf,CAAAA,CACnB,aAAA,EAAc,CACd,KACErB,CAAAA,EACCxB,IAAAA,CAAK,oBAAA,CAAqBwB,CAAI,CAAA,EAC9BxB,IAAAA,CAAK,YAAA,CAAawB,CAAAA,CAAK,WAAA,EAAa,CAAA,EACpCA,CAAAA,CAAK,WAAA,EAAY,CAAE,OAAA,EAAQ,GAAM,WACrC,CAAA,CAEF,GAAI,CAACoC,CAAAA,EAAiB,CAAC5D,IAAAA,CAAK,oBAAA,CAAqB4D,CAAa,CAAA,CAC5D,SAGF,IAAMC,CAAAA,CAAuBD,CAAAA,CAAc,cAAA,EAAe,CAC1D,GAAKC,GAMH7D,IAAAA,CAAK,gBAAA,CAAiB6D,CAAoB,CAAA,EAC1C1B,CAAAA,CAAS0B,CAAoB,CAAA,CAC7B,CACA,IAAMlD,CAAAA,CAAYmD,CAAAA,CAA2BD,CAAoB,CAAA,CAEjE,GAAIlD,CAAAA,CAAU,MAAA,GAAW,EACvB,SAGF,IAAME,CAAAA,CAAmBF,CAAAA,CAAU,MAAA,CAChCG,CAAAA,EAAY,CAACV,CAAAA,CAAe,GAAA,CAAIU,CAAO,CAC1C,CAAA,CAEA,GAAID,CAAAA,CAAiB,MAAA,GAAW,CAAA,CAAG,CAEjCkD,CAAAA,CAAyBF,CAAoB,CAAA,CAC7C,QACF,CAEA,IAAM5C,CAAAA,CAAyBJ,CAAAA,CAC5B,GAAA,CAAKC,CAAAA,EAAYX,CAAAA,CAASW,CAAO,CAAC,CAAA,CAClC,MAAA,CAAQrB,CAAAA,EAA+B,EAAQA,CAAQ,CAAA,CAE1D,GAAIwB,CAAAA,CAAuB,MAAA,CAAS,CAAA,CAAG,CACrC,IAAMC,CAAAA,CAAgBD,CAAAA,CAAuB,IAAA,CAAK,GAAG,CAAA,CACrD+C,EAAAA,CACEH,CAAAA,CACA3C,CAAAA,CACAd,EACAS,CACF,EACF,CAAA,KACEkD,CAAAA,CAAyBF,CAAoB,EAEjD,CACF,CACF,CAAC,EACH,CAEA,SAASC,CAAAA,CAA2BG,CAAAA,CAAkC,CACpE,IAAMxE,EAAoB,EAAC,CAE3B,IAAA,IAAW2C,CAAAA,IAAY6B,CAAAA,CAAO,YAAA,EAAa,CACrClE,CAAAA,CAAoBqC,CAAQ,CAAA,EAC9B3C,CAAAA,CAAQ,IAAA,CAAK,GAAGmB,CAAAA,CAAiBwB,CAAAA,CAAS,cAAA,EAAgB,CAAC,CAAA,CAI/D,OAAO3C,CACT,CAEA,SAASsE,CAAAA,CAAyBE,CAAAA,CAAwB,CACxD,IAAA,IAAW7B,CAAAA,IAAY6B,CAAAA,CAAO,YAAA,EAAa,CACzC,GAAIlE,CAAAA,CAAoBqC,CAAQ,EAAG,CACjC,IAAMC,CAAAA,CAAUrB,CAAAA,CAAgBoB,CAAAA,CAAS,cAAA,EAAgB,CAAA,CACzDA,CAAAA,CAAS,eAAA,CAAgBC,CAAO,EAClC,CAGFC,CAAAA,CAA+B2B,CAAM,EACvC,CAEA,SAASD,EAAAA,CACPC,CAAAA,CACAnF,CAAAA,CACAsB,CAAAA,CACAS,CAAAA,CACA,CACA,IAAMuC,CAAAA,CAAWa,CAAAA,CAAO,YAAA,EAAa,CAAE,CAAC,CAAA,CAExC,GAAIlE,CAAAA,CAAoBqD,CAAQ,CAAA,CAAG,CACjC,IAAMD,CAAAA,CAAWC,CAAAA,CAAS,cAAA,EAAe,CACnCrC,CAAAA,CAAUC,CAAAA,CAAgBG,CAAAA,CAAarC,CAAAA,CAAiBqE,CAAQ,CAAC,CAAA,CACvEC,CAAAA,CAAS,eAAA,CAAgBrC,CAAO,CAAA,CAGhCF,CAAAA,CAAiB,OAAA,CAASC,CAAAA,EAAYV,CAAAA,CAAe,GAAA,CAAIU,CAAO,CAAC,CAAA,CAGjE,IAAA,IAASuC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIY,CAAAA,CAAO,YAAA,EAAa,CAAE,OAAQZ,CAAAA,EAAAA,CAAK,CACrD,IAAMR,CAAAA,CAAMoB,CAAAA,CAAO,YAAA,EAAa,CAAEZ,CAAC,CAAA,CACnC,GAAItD,CAAAA,CAAoB8C,CAAG,CAAA,CAAG,CAC5B,IAAMS,CAAAA,CAAUT,EAAI,cAAA,EAAe,CAC7BR,CAAAA,CAAUrB,CAAAA,CAAgBsC,CAAO,CAAA,CACnCjB,CAAAA,GAAYiB,CAAAA,EACdT,CAAAA,CAAI,eAAA,CAAgBR,CAAO,EAE/B,CACF,CAEAC,CAAAA,CAA+B2B,CAAM,EACrC,MACF,CAGA,IAAMV,CAAAA,CAAgBU,CAAAA,CACnB,YAAA,EAAa,CACb,GAAA,CAAK7B,GAAa,CACjB,GAAIrC,CAAAA,CAAoBqC,CAAQ,CAAA,CAAG,CACjC,IAAMC,CAAAA,CAAUrB,EAAgBoB,CAAAA,CAAS,cAAA,EAAgB,CAAA,CACzD,OAAOC,CAAAA,CAAU,IAAA,CAAK,SAAA,CAAUA,CAAO,CAAA,CAAI,IAC7C,CACA,OAAOD,CAAAA,CAAS,OAAA,EAClB,CAAC,CAAA,CACA,MAAA,CAAQS,CAAAA,EAAuBA,CAAAA,GAAQ,IAAI,CAAA,CAExCW,CAAAA,CAAmB,CAAC,IAAA,CAAK,SAAA,CAAU1E,CAAe,CAAA,CAAG,GAAGyE,CAAa,CAAA,CAG3E1C,CAAAA,CAAiB,QAASC,CAAAA,EAAYV,CAAAA,CAAe,GAAA,CAAIU,CAAO,CAAC,CAAA,CAElDmD,CAAAA,CAAO,SAAA,EAAU,EAE9BA,CAAAA,CAAO,eAAA,CAAgB,CAAA,GAAA,EAAMT,CAAAA,CAAiB,IAAA,CAAK,IAAI,CAAC,GAAG,EAE/D,CCjkBA,eAAsBU,EAAAA,CACpBC,CAAAA,CACA,CACE,QAAA,CAAAhE,CAAAA,CACA,YAAA,CAAAiE,CAAAA,CAAe,CAACnE,CAAiB,CACnC,CAAA,CAIA,CAKA,IAAMC,EAJU,IAAImE,OAAAA,CAAQ,CAC1B,qBAAA,CAAuB,IACzB,CAAC,CAAA,CAE0B,gBAAA,CAAiB,eAAA,CAAiBF,CAAAA,CAAQ,CACnE,UAAA,CAAYG,UAAAA,CAAW,GAAA,CACvB,SAAA,CAAW,IACb,CAAC,CAAA,CAED,IAAA,IAAWC,CAAAA,IAAeH,CAAAA,CACxB,MAAMG,CAAAA,CAAY,CAAE,UAAA,CAAArE,CAAAA,CAAY,QAAA,CAAAC,CAAS,CAAC,CAAA,CAG5C,OAAOD,CAAAA,CAAW,OAAA,EACpB,CCzBO,IAAMsE,EAAAA,CAA+B,MAAO,CAAE,UAAA,CAAAtE,CAAAA,CAAY,MAAA,CAAAuE,CAAO,CAAA,GAAM,CAE5E,GAAI,CAACA,CAAAA,CAAO,KAAA,EAAO,UAAA,CAAW,OAAO,CAAA,CACnC,OAAOvE,CAAAA,CAKT,IAAMwE,EAAmC,EAAC,CAGpCC,CAAAA,CAAczE,CAAAA,CAAW,oBAAA,CAAqB0E,UAAAA,CAAW,UAAU,CAAA,CAEzE,QAAW5C,CAAAA,IAAc2C,CAAAA,CAAa,CACpC,IAAME,CAAAA,CAAiB7C,CAAAA,CAAW,iBAAA,EAAkB,CAC9C8C,CAAAA,CAAaD,CAAAA,CAAe,YAAA,CAAa,QAAQ,CAAA,CAEvD,GAAI,CAACC,CAAAA,CACH,SAKF,IAAMC,CAAAA,CADW/C,CAAAA,CAAW,cAAA,EAAe,CAExC,GAAA,CAAKgD,CAAAA,EAAMA,CAAAA,CAAE,OAAA,EAAS,CAAA,CACtB,IAAA,CAAK,EAAE,CAAA,CACP,IAAA,EAAK,CAQR,GALI,CAACD,CAAAA,EAKDD,CAAAA,CAAW,OAAA,EAAQ,GAAMF,UAAAA,CAAW,YAAA,CACtC,SAIF,IAAM9C,CAAAA,CADUgD,CAAAA,CAAW,aAAA,CAAcF,UAAAA,CAAW,YAAY,CAAA,CACpC,cAAA,GAO5B,GALI,CAAC9C,CAAAA,EAKDA,CAAAA,CAAY,OAAA,EAAQ,GAAM8C,UAAAA,CAAW,aAAA,CACvC,SAIF,IAAMxD,CAAAA,CADgBU,CAAAA,CAAY,aAAA,CAAc8C,UAAAA,CAAW,aAAa,CAAA,CACvC,eAAc,CAO/C,GALI,CAACxD,CAAAA,EAKDA,CAAAA,CAAW,OAAA,EAAQ,GAAMwD,UAAAA,CAAW,qBAAA,CAEtC,SAGF,IAAMK,CAAAA,CAAqB7D,CAAAA,CAAW,aAAA,CACpCwD,UAAAA,CAAW,qBACb,EACMM,CAAAA,CAAUD,CAAAA,CAAmB,cAAA,EAAe,CAAE,OAAA,EAAQ,CACtDE,CAAAA,CAAaF,CAAAA,CAChB,aAAA,EAAc,CACd,GAAA,CAAK/B,CAAAA,EAASA,CAAAA,CAAK,OAAA,EAAS,CAAA,CAC5B,KAAK,GAAG,CAAA,CAGLkC,CAAAA,CAAiBD,CAAAA,CACnB,CAAA,EAAA,EAAKD,CAAO,CAAA,CAAA,EAAIC,CAAU,CAAA,CAAA,EAAIJ,CAAY,CAAA,EAAA,EAAKG,CAAO,CAAA,EAAA,CAAA,CACtD,CAAA,EAAA,EAAKA,CAAO,CAAA,CAAA,EAAIH,CAAY,CAAA,EAAA,EAAKG,CAAO,CAAA,EAAA,CAAA,CAGtCG,CAAAA,CAAgBR,CAAAA,CAAe,cAAA,EAAe,CAAE,OAAA,GAChDS,CAAAA,CAAaT,CAAAA,CAChB,aAAA,EAAc,CACd,MAAA,CAAQ3B,CAAAA,EACHA,CAAAA,CAAK,OAAA,KAAc0B,UAAAA,CAAW,YAAA,CACf1B,CAAAA,CACd,aAAA,CAAc0B,UAAAA,CAAW,YAAY,CAAA,CACrC,WAAA,EAAY,CACZ,OAAA,EAAQ,GACS,QAAA,CAEf,IACR,CAAA,CACA,GAAA,CAAK1B,CAAAA,EAASA,EAAK,OAAA,EAAS,CAAA,CAC5B,IAAA,CAAK,GAAG,CAAA,CAGLqC,CAAAA,CAAWD,CAAAA,CACb,CAAA,EAAGA,CAAU,CAAA,QAAA,EAAWF,CAAc,CAAA,CAAA,CACtC,CAAA,OAAA,EAAUA,CAAc,CAAA,CAAA,CAEtBI,EAAiB,CAAA,CAAA,EAAIH,CAAa,CAAA,CAAA,EAAIE,CAAQ,CAAA,GAAA,CAAA,CAEpDb,CAAAA,CAAgB,IAAA,CAAK,CACnB,YAAA,CAAc1C,CAAAA,CAAW,QAAA,EAAS,CAClC,UAAA,CAAYA,CAAAA,CAAW,MAAA,EAAO,CAC9B,QAASwD,CACX,CAAC,EACH,CAGA,IAAA,IAAWC,CAAAA,IAAQf,CAAAA,CAAgB,OAAA,EAAQ,CAAG,CAC5C,IAAMgB,CAAAA,CAAWxF,CAAAA,CAAW,WAAA,EAAY,CAClCyF,CAAAA,CACJD,EAAS,SAAA,CAAU,CAAA,CAAGD,CAAAA,CAAK,YAAY,CAAA,CACvCA,CAAAA,CAAK,OAAA,CACLC,CAAAA,CAAS,SAAA,CAAUD,CAAAA,CAAK,UAAU,CAAA,CACpCvF,CAAAA,CAAW,eAAA,CAAgByF,CAAW,EACxC,CAEA,OAAOzF,CACT,EC1HA,IAAM0F,CAAAA,CAAiB,QAAA,CAEVC,EAAAA,CAAoC,MAAO,CACtD,UAAA,CAAA3F,CAAAA,CACA,MAAA,CAAAuE,CACF,CAAA,GAAM,CAEJ,GAAI,CAACA,CAAAA,CAAO,WAAA,EAAe,EAAEA,CAAAA,CAAO,WAAA,IAAeqB,CAAAA,CAAAA,CACjD,OAAO5F,CAAAA,CAGT,IAAM6F,CAAAA,CAAgBH,CAAAA,CAChBI,CAAAA,CAAgBvB,EAAO,WAAA,CAE7B,GAAIsB,CAAAA,GAAkBC,CAAAA,CACpB,OAAO9F,CAAAA,CAGT,IAAM+F,CAAAA,CAAgB,MAAMC,EAAAA,EAAiB,CAEzCC,CAAAA,CAA0B,EAAC,CAC/B,IAAA,IAAWC,GAAAA,IAAqBlG,CAAAA,CAAW,uBAAsB,EAAK,EAAC,CACrE,GACEkG,GAAAA,CAAkB,kBAAA,EAAmB,EAAG,OAAA,EAAQ,GAChD,CAAA,CAAA,EAAIN,CAAAA,CAAsBF,CAAc,CAAA,CAAE,MAAM,CAAA,CAAA,CAAA,CAKlD,CAAA,IAAA,IAAWS,KAAaD,GAAAA,CAAkB,eAAA,EAAgB,EAAK,EAAC,CAAG,CACjE,IAAME,CAAAA,CAAWD,CAAAA,CAAU,OAAA,EAAQ,CAE7BE,CAAAA,CAAeN,CAAAA,CAAcK,CAAQ,CAAA,GAAIN,CAAa,EAExD,CAACO,CAAAA,EAAgBJ,CAAAA,CAAc,QAAA,CAASI,CAAY,CAAA,GAIxDJ,CAAAA,CAAc,IAAA,CAAKI,CAAY,CAAA,CAG/BF,CAAAA,CAAU,MAAA,EAAO,CAGjBnG,CAAAA,CACG,oBAAA,CAAqB0E,UAAAA,CAAW,qBAAqB,CAAA,CACrD,MAAA,CAAQlF,CAAAA,EAASA,CAAAA,CAAK,cAAA,EAAe,EAAG,OAAA,EAAQ,GAAM4G,CAAQ,CAAA,CAC9D,OAAA,CAAS5G,CAAAA,EAASA,CAAAA,CAAK,cAAA,EAAe,EAAG,eAAA,CAAgB6G,CAAY,CAAC,CAAA,EAC3E,CAGIH,GAAAA,CAAkB,eAAA,EAAgB,EAAG,MAAA,GAAW,CAAA,EAClDA,GAAAA,CAAkB,MAAA,GAAO,CAI7B,GAAID,CAAAA,CAAc,MAAA,CAAS,CAAA,CAAG,CAC5B,IAAMK,GAAAA,CAAwBtG,CAAAA,CAAW,oBAAA,CAAqB,CAC5D,eAAA,CACE4F,CAAAA,CACEE,CACF,CAAA,EAAG,MAAA,CACL,YAAA,CAAcG,CAAAA,CAAc,GAAA,CAAKM,CAAAA,GAAU,CACzC,IAAA,CAAMA,CACR,EAAE,CACJ,CAAC,CAAA,CAEIC,EAAAA,CAAcxG,CAAU,CAAA,EAC3BsG,GAAAA,CAAsB,eAAA,CACpBA,GAAAA,CAAsB,OAAA,EAAQ,CAAE,OAAA,CAAQ,GAAA,CAAK,EAAE,CACjD,EAEJ,CAEA,OAAOtG,CACT,EAEA,SAASwG,EAAAA,CAAcxG,CAAAA,CAAwB,CAC7C,OACEA,EAAW,qBAAA,EAAsB,GAAI,CAAC,CAAA,EAAG,OAAA,EAAQ,CAAE,QAAA,CAAS,GAAG,GAAK,KAExE","file":"index.js","sourcesContent":["import postcss from \"postcss\"\nimport selectorParser, {\n type ClassName,\n type Selector as SelectorNodeRoot,\n} from \"postcss-selector-parser\"\nimport { z } from \"zod\"\n\nconst CN_PREFIX = \"cn-\"\n\nexport const styleMapSchema = z.record(\n z.string().startsWith(CN_PREFIX),\n z.string()\n)\n\nexport type StyleMap = z.infer<typeof styleMapSchema>\n\nexport function createStyleMap(input: string) {\n const root = postcss.parse(input)\n\n const result: Record<string, string> = {}\n\n root.walkRules((rule) => {\n const selectors = rule.selectors ?? []\n\n if (selectors.length === 0) {\n return\n }\n\n const tailwindClasses = extractTailwindClasses(rule)\n\n if (!tailwindClasses) {\n return\n }\n\n for (const selector of selectors) {\n const normalizedSelector = normalizeSelector(selector)\n\n selectorParser((selectorsRoot) => {\n selectorsRoot.each((sel) => {\n const targetClass = findSubjectClass(sel)\n\n if (!targetClass) {\n return\n }\n\n const className = targetClass.value\n\n if (!className.startsWith(CN_PREFIX)) {\n return\n }\n\n result[className] = result[className]\n ? `${tailwindClasses} ${result[className]}`\n : tailwindClasses\n })\n }).processSync(normalizedSelector)\n }\n })\n\n return styleMapSchema.parse(result)\n}\n\nfunction normalizeSelector(selector: string) {\n return selector.replace(/\\s*&\\s*/g, \"\").trim()\n}\n\nfunction extractTailwindClasses(rule: postcss.Rule) {\n const classes: string[] = []\n\n for (const node of rule.nodes || []) {\n if (node.type === \"atrule\" && node.name === \"apply\") {\n const value = node.params.trim()\n if (value) {\n classes.push(value)\n }\n }\n }\n\n if (classes.length === 0) {\n return null\n }\n\n return classes.join(\" \")\n}\n\nfunction findSubjectClass(selector: SelectorNodeRoot) {\n const classNodes: ClassName[] = []\n\n selector.walkClasses((classNode) => {\n if (classNode.value.startsWith(CN_PREFIX)) {\n classNodes.push(classNode)\n }\n })\n\n if (classNodes.length === 0) {\n return null\n }\n\n return classNodes[classNodes.length - 1]\n}\n","import { TransformerStyle } from \"@/src/styles/transform\"\nimport {\n Node,\n type CallExpression,\n type NoSubstitutionTemplateLiteral,\n type SourceFile,\n type StringLiteral,\n} from \"ts-morph\"\n\nimport { type StyleMap } from \"./create-style-map\"\n\n/**\n * Classes that should never be removed during transformation.\n * These are typically used as CSS selectors or for other purposes\n * that require the class name to remain in the code.\n */\nconst ALLOWLIST = new Set([\"cn-menu-target\"])\n\nfunction isStringLiteralLike(\n node: Node\n): node is StringLiteral | NoSubstitutionTemplateLiteral {\n return (\n Node.isStringLiteral(node) || Node.isNoSubstitutionTemplateLiteral(node)\n )\n}\n\nexport const transformStyleMap: TransformerStyle<SourceFile> = async ({\n sourceFile,\n styleMap,\n}) => {\n const matchedClasses = new Set<string>()\n\n applyToCvaCalls(sourceFile, styleMap, matchedClasses)\n applyToClassNameAttributes(sourceFile, styleMap, matchedClasses)\n applyToMergePropsCalls(sourceFile, styleMap, matchedClasses)\n\n return sourceFile\n}\n\nfunction applyStyleToCvaString(\n stringNode: StringLiteral,\n styleMap: StyleMap,\n matchedClasses: Set<string>\n) {\n const stringValue = stringNode.getLiteralText()\n const cnClasses = extractCnClasses(stringValue)\n\n if (cnClasses.length === 0) {\n return\n }\n\n // Process all cn-* classes, not just the first one\n const unmatchedClasses = cnClasses.filter(\n (cnClass) => !matchedClasses.has(cnClass)\n )\n\n if (unmatchedClasses.length === 0) {\n // All classes already matched, just clean up non-allowlisted ones\n const updated = removeCnClasses(stringValue)\n stringNode.setLiteralValue(updated)\n return\n }\n\n const tailwindClassesToApply = unmatchedClasses\n .map((cnClass) => styleMap[cnClass])\n .filter((classes): classes is string => Boolean(classes))\n\n if (tailwindClassesToApply.length > 0) {\n const mergedClasses = tailwindClassesToApply.join(\" \")\n const updated = removeCnClasses(mergeClasses(mergedClasses, stringValue))\n stringNode.setLiteralValue(updated)\n unmatchedClasses.forEach((cnClass) => matchedClasses.add(cnClass))\n } else {\n // No styles to apply, but still need to clean up non-allowlisted classes\n const updated = removeCnClasses(stringValue)\n stringNode.setLiteralValue(updated)\n }\n}\n\nfunction applyToCvaCalls(\n sourceFile: SourceFile,\n styleMap: StyleMap,\n matchedClasses: Set<string>\n) {\n sourceFile.forEachDescendant((node) => {\n if (!Node.isCallExpression(node)) {\n return\n }\n\n const expression = node.getExpression()\n if (!Node.isIdentifier(expression) || expression.getText() !== \"cva\") {\n return\n }\n\n const baseArg = node.getArguments()[0]\n if (Node.isStringLiteral(baseArg)) {\n applyStyleToCvaString(baseArg, styleMap, matchedClasses)\n }\n\n const configArg = node.getArguments()[1]\n if (!configArg || !Node.isObjectLiteralExpression(configArg)) {\n return\n }\n\n const variantsProp = configArg\n .getProperties()\n .find(\n (prop) =>\n Node.isPropertyAssignment(prop) &&\n Node.isIdentifier(prop.getNameNode()) &&\n prop.getNameNode().getText() === \"variants\"\n )\n\n if (!variantsProp || !Node.isPropertyAssignment(variantsProp)) {\n return\n }\n\n const variantsObj = variantsProp.getInitializer()\n if (!variantsObj || !Node.isObjectLiteralExpression(variantsObj)) {\n return\n }\n\n variantsObj.getProperties().forEach((typeProp) => {\n if (!Node.isPropertyAssignment(typeProp)) {\n return\n }\n\n const typeObj = typeProp.getInitializer()\n if (!typeObj || !Node.isObjectLiteralExpression(typeObj)) {\n return\n }\n\n typeObj.getProperties().forEach((variantProp) => {\n if (!Node.isPropertyAssignment(variantProp)) {\n return\n }\n\n const variantValue = variantProp.getInitializer()\n if (variantValue && Node.isStringLiteral(variantValue)) {\n applyStyleToCvaString(variantValue, styleMap, matchedClasses)\n }\n })\n })\n })\n}\n\nfunction applyToClassNameAttributes(\n sourceFile: SourceFile,\n styleMap: StyleMap,\n matchedClasses: Set<string>\n) {\n sourceFile.forEachDescendant((node) => {\n if (\n !Node.isJsxAttribute(node) ||\n node.getNameNode().getText() !== \"className\"\n ) {\n return\n }\n\n const initializer = node.getInitializer()\n if (!initializer) {\n return\n }\n\n const cnClasses = extractCnClassesFromAttribute(initializer)\n\n if (cnClasses.length === 0) {\n return\n }\n\n const jsxElement = node.getParent()?.getParent()\n if (\n !jsxElement ||\n (!Node.isJsxOpeningElement(jsxElement) &&\n !Node.isJsxSelfClosingElement(jsxElement))\n ) {\n return\n }\n\n const unmatchedClasses = cnClasses.filter(\n (cnClass) => !matchedClasses.has(cnClass)\n )\n\n if (unmatchedClasses.length === 0) {\n // Even if all classes are already matched, we still need to clean them up\n cleanCnClassesFromAttribute(initializer)\n return\n }\n\n const tailwindClassesToApply = unmatchedClasses\n .map((cnClass) => styleMap[cnClass])\n .filter((classes): classes is string => Boolean(classes))\n\n if (tailwindClassesToApply.length > 0) {\n const mergedClasses = tailwindClassesToApply.join(\" \")\n applyClassesToElement(jsxElement, mergedClasses)\n } else {\n cleanCnClassesFromAttribute(initializer)\n }\n })\n}\n\nfunction extractCnClassesFromAttribute(initializer: Node) {\n const classes: string[] = []\n\n if (isStringLiteralLike(initializer)) {\n return extractCnClasses(initializer.getLiteralText())\n }\n\n if (!Node.isJsxExpression(initializer)) {\n return classes\n }\n\n const expression = initializer.getExpression()\n if (!expression) {\n return classes\n }\n\n if (isStringLiteralLike(expression)) {\n return extractCnClasses(expression.getLiteralText())\n }\n\n if (Node.isCallExpression(expression) && isCnCall(expression)) {\n for (const argument of expression.getArguments()) {\n if (isStringLiteralLike(argument)) {\n classes.push(...extractCnClasses(argument.getLiteralText()))\n }\n }\n }\n\n return classes\n}\n\nfunction cleanCnClassesFromAttribute(initializer: Node) {\n if (isStringLiteralLike(initializer)) {\n const cleaned = removeCnClasses(initializer.getLiteralText())\n initializer.setLiteralValue(cleaned)\n return\n }\n\n if (!Node.isJsxExpression(initializer)) {\n return\n }\n\n const expression = initializer.getExpression()\n if (!expression) {\n return\n }\n\n if (isStringLiteralLike(expression)) {\n const cleaned = removeCnClasses(expression.getLiteralText())\n expression.setLiteralValue(cleaned)\n return\n }\n\n if (Node.isCallExpression(expression) && isCnCall(expression)) {\n for (const argument of expression.getArguments()) {\n if (isStringLiteralLike(argument)) {\n const cleaned = removeCnClasses(argument.getLiteralText())\n argument.setLiteralValue(cleaned)\n }\n }\n\n removeEmptyArgumentsFromCnCall(expression)\n }\n}\n\nfunction extractCnClasses(str: string) {\n const matches = str.matchAll(/\\bcn-[\\w-]+\\b/g)\n return Array.from(matches, (match) => match[0])\n}\n\nfunction extractCnClass(str: string) {\n const classes = extractCnClasses(str)\n return classes[0] ?? null\n}\n\nfunction removeCnClasses(str: string) {\n return str\n .replace(/\\bcn-[\\w-]+\\b/g, (match) => {\n // Preserve allowlisted classes\n if (ALLOWLIST.has(match)) {\n return match\n }\n return \"\"\n })\n .replace(/\\s+/g, \" \")\n .trim()\n}\n\nfunction removeEmptyArgumentsFromCnCall(callExpression: CallExpression) {\n if (!isCnCall(callExpression)) {\n return\n }\n\n const args = callExpression.getArguments()\n const nonEmptyArgs = args.filter((arg) => {\n if (isStringLiteralLike(arg)) {\n const text = arg.getLiteralText().trim()\n return text !== \"\"\n }\n return true\n })\n\n if (nonEmptyArgs.length !== args.length) {\n const argTexts = nonEmptyArgs.map((arg) => arg.getText())\n const parent = callExpression.getParent()\n if (parent && Node.isJsxExpression(parent)) {\n parent.replaceWithText(`{cn(${argTexts.join(\", \")})}`)\n } else {\n callExpression.replaceWithText(`cn(${argTexts.join(\", \")})`)\n }\n }\n}\n\nfunction applyClassesToElement(element: Node, tailwindClasses: string) {\n if (\n !Node.isJsxOpeningElement(element) &&\n !Node.isJsxSelfClosingElement(element)\n ) {\n return\n }\n\n const attribute = element\n .getAttributes()\n .find(\n (attr) =>\n Node.isJsxAttribute(attr) &&\n attr.getNameNode().getText() === \"className\"\n )\n\n if (!attribute || !Node.isJsxAttribute(attribute)) {\n element.addAttribute({\n name: \"className\",\n initializer: `{cn(${JSON.stringify(tailwindClasses)})}`,\n })\n return\n }\n\n const initializer = attribute.getInitializer()\n\n if (!initializer) {\n attribute.setInitializer(`{cn(${JSON.stringify(tailwindClasses)})}`)\n return\n }\n\n if (isStringLiteralLike(initializer)) {\n const existing = initializer.getLiteralText()\n const updated = removeCnClasses(mergeClasses(tailwindClasses, existing))\n initializer.setLiteralValue(updated)\n return\n }\n\n if (!Node.isJsxExpression(initializer)) {\n return\n }\n\n const expression = initializer.getExpression()\n\n if (!expression) {\n attribute.setInitializer(`{cn(${JSON.stringify(tailwindClasses)})}`)\n return\n }\n\n if (isStringLiteralLike(expression)) {\n const existing = expression.getLiteralText()\n const updated = removeCnClasses(mergeClasses(tailwindClasses, existing))\n expression.setLiteralValue(updated)\n return\n }\n\n if (Node.isCallExpression(expression) && isCnCall(expression)) {\n const firstArg = expression.getArguments()[0]\n if (isStringLiteralLike(firstArg)) {\n const existing = firstArg.getLiteralText()\n const updated = removeCnClasses(mergeClasses(tailwindClasses, existing))\n firstArg.setLiteralValue(updated)\n\n for (let i = 1; i < expression.getArguments().length; i++) {\n const arg = expression.getArguments()[i]\n if (isStringLiteralLike(arg)) {\n const argText = arg.getLiteralText()\n const cleaned = removeCnClasses(argText)\n if (cleaned !== argText) {\n arg.setLiteralValue(cleaned)\n }\n }\n }\n\n removeEmptyArgumentsFromCnCall(expression)\n return\n }\n\n const argumentTexts = expression\n .getArguments()\n .map((argument) => {\n if (isStringLiteralLike(argument)) {\n const cleaned = removeCnClasses(argument.getLiteralText())\n return cleaned ? JSON.stringify(cleaned) : null\n }\n return argument.getText()\n })\n .filter((arg): arg is string => arg !== null)\n\n const updatedArguments = [JSON.stringify(tailwindClasses), ...argumentTexts]\n\n attribute.setInitializer(`{cn(${updatedArguments.join(\", \")})}`)\n return\n }\n\n attribute.setInitializer(\n `{cn(${JSON.stringify(tailwindClasses)}, ${expression.getText()})}`\n )\n}\n\nfunction mergeClasses(newClasses: string, existing: string) {\n const existingParts = existing.split(/\\s+/).filter(Boolean)\n const newParts = newClasses.split(/\\s+/).filter(Boolean)\n const combined = [...newParts, ...existingParts]\n return combined.join(\" \").trim()\n}\n\nfunction isCnCall(call: CallExpression) {\n const expression = call.getExpression()\n return Node.isIdentifier(expression) && expression.getText() === \"cn\"\n}\n\nfunction applyToMergePropsCalls(\n sourceFile: SourceFile,\n styleMap: StyleMap,\n matchedClasses: Set<string>\n) {\n sourceFile.forEachDescendant((node) => {\n if (!Node.isCallExpression(node)) {\n return\n }\n\n const expression = node.getExpression()\n if (\n !Node.isIdentifier(expression) ||\n expression.getText() !== \"mergeProps\"\n ) {\n return\n }\n\n // Look for object literals in mergeProps arguments\n for (const arg of node.getArguments()) {\n if (!Node.isObjectLiteralExpression(arg)) {\n continue\n }\n\n // Find className property in the object literal\n const classNameProp = arg\n .getProperties()\n .find(\n (prop) =>\n Node.isPropertyAssignment(prop) &&\n Node.isIdentifier(prop.getNameNode()) &&\n prop.getNameNode().getText() === \"className\"\n )\n\n if (!classNameProp || !Node.isPropertyAssignment(classNameProp)) {\n continue\n }\n\n const classNameInitializer = classNameProp.getInitializer()\n if (!classNameInitializer) {\n continue\n }\n\n // Handle cn() calls in className\n if (\n Node.isCallExpression(classNameInitializer) &&\n isCnCall(classNameInitializer)\n ) {\n const cnClasses = extractCnClassesFromCnCall(classNameInitializer)\n\n if (cnClasses.length === 0) {\n continue\n }\n\n const unmatchedClasses = cnClasses.filter(\n (cnClass) => !matchedClasses.has(cnClass)\n )\n\n if (unmatchedClasses.length === 0) {\n // Clean up cn-* classes even if already matched\n cleanCnClassesFromCnCall(classNameInitializer)\n continue\n }\n\n const tailwindClassesToApply = unmatchedClasses\n .map((cnClass) => styleMap[cnClass])\n .filter((classes): classes is string => Boolean(classes))\n\n if (tailwindClassesToApply.length > 0) {\n const mergedClasses = tailwindClassesToApply.join(\" \")\n applyClassesToCnCall(\n classNameInitializer,\n mergedClasses,\n matchedClasses,\n unmatchedClasses\n )\n } else {\n cleanCnClassesFromCnCall(classNameInitializer)\n }\n }\n }\n })\n}\n\nfunction extractCnClassesFromCnCall(cnCall: CallExpression): string[] {\n const classes: string[] = []\n\n for (const argument of cnCall.getArguments()) {\n if (isStringLiteralLike(argument)) {\n classes.push(...extractCnClasses(argument.getLiteralText()))\n }\n }\n\n return classes\n}\n\nfunction cleanCnClassesFromCnCall(cnCall: CallExpression) {\n for (const argument of cnCall.getArguments()) {\n if (isStringLiteralLike(argument)) {\n const cleaned = removeCnClasses(argument.getLiteralText())\n argument.setLiteralValue(cleaned)\n }\n }\n\n removeEmptyArgumentsFromCnCall(cnCall)\n}\n\nfunction applyClassesToCnCall(\n cnCall: CallExpression,\n tailwindClasses: string,\n matchedClasses: Set<string>,\n unmatchedClasses: string[]\n) {\n const firstArg = cnCall.getArguments()[0]\n\n if (isStringLiteralLike(firstArg)) {\n const existing = firstArg.getLiteralText()\n const updated = removeCnClasses(mergeClasses(tailwindClasses, existing))\n firstArg.setLiteralValue(updated)\n\n // Mark classes as matched\n unmatchedClasses.forEach((cnClass) => matchedClasses.add(cnClass))\n\n // Clean up cn-* classes from remaining arguments\n for (let i = 1; i < cnCall.getArguments().length; i++) {\n const arg = cnCall.getArguments()[i]\n if (isStringLiteralLike(arg)) {\n const argText = arg.getLiteralText()\n const cleaned = removeCnClasses(argText)\n if (cleaned !== argText) {\n arg.setLiteralValue(cleaned)\n }\n }\n }\n\n removeEmptyArgumentsFromCnCall(cnCall)\n return\n }\n\n // If first arg is not a string literal, prepend tailwind classes\n const argumentTexts = cnCall\n .getArguments()\n .map((argument) => {\n if (isStringLiteralLike(argument)) {\n const cleaned = removeCnClasses(argument.getLiteralText())\n return cleaned ? JSON.stringify(cleaned) : null\n }\n return argument.getText()\n })\n .filter((arg): arg is string => arg !== null)\n\n const updatedArguments = [JSON.stringify(tailwindClasses), ...argumentTexts]\n\n // Mark classes as matched\n unmatchedClasses.forEach((cnClass) => matchedClasses.add(cnClass))\n\n const parent = cnCall.getParent()\n if (parent) {\n cnCall.replaceWithText(`cn(${updatedArguments.join(\", \")})`)\n }\n}\n","import { Project, ScriptKind, type SourceFile } from \"ts-morph\"\n\nimport { type StyleMap } from \"./create-style-map\"\nimport { transformStyleMap } from \"./transform-style-map\"\n\nexport type TransformerStyle<Output = SourceFile> = (opts: {\n sourceFile: SourceFile\n styleMap: StyleMap\n}) => Promise<Output>\n\nexport async function transformStyle(\n source: string,\n {\n styleMap,\n transformers = [transformStyleMap],\n }: {\n styleMap: StyleMap\n transformers?: TransformerStyle<SourceFile>[]\n }\n) {\n const project = new Project({\n useInMemoryFileSystem: true,\n })\n\n const sourceFile = project.createSourceFile(\"component.tsx\", source, {\n scriptKind: ScriptKind.TSX,\n overwrite: true,\n })\n\n for (const transformer of transformers) {\n await transformer({ sourceFile, styleMap })\n }\n\n return sourceFile.getText()\n}\n","import { Transformer } from \"@/src/utils/transformers\"\nimport { SyntaxKind } from \"ts-morph\"\n\ninterface TransformInfo {\n elementStart: number\n elementEnd: number\n newText: string\n}\n\nexport const transformRender: Transformer = async ({ sourceFile, config }) => {\n // Only run for base- styles.\n if (!config.style?.startsWith(\"base-\")) {\n return sourceFile\n }\n\n // Collect all transformations first, then apply them in reverse order.\n // This prevents issues with invalidated nodes when modifying the tree.\n const transformations: TransformInfo[] = []\n\n // Find all JSX elements with render attribute.\n const jsxElements = sourceFile.getDescendantsOfKind(SyntaxKind.JsxElement)\n\n for (const jsxElement of jsxElements) {\n const openingElement = jsxElement.getOpeningElement()\n const renderAttr = openingElement.getAttribute(\"render\")\n\n if (!renderAttr) {\n continue\n }\n\n // Get the children of the parent element.\n const children = jsxElement.getJsxChildren()\n const childrenText = children\n .map((c) => c.getText())\n .join(\"\")\n .trim()\n\n // If there are no children, nothing to transform.\n if (!childrenText) {\n continue\n }\n\n // Get the render attribute value.\n if (renderAttr.getKind() !== SyntaxKind.JsxAttribute) {\n continue\n }\n\n const jsxAttr = renderAttr.asKindOrThrow(SyntaxKind.JsxAttribute)\n const initializer = jsxAttr.getInitializer()\n\n if (!initializer) {\n continue\n }\n\n // The render value should be a JSX expression like {<Button />}.\n if (initializer.getKind() !== SyntaxKind.JsxExpression) {\n continue\n }\n\n const jsxExpression = initializer.asKindOrThrow(SyntaxKind.JsxExpression)\n const expression = jsxExpression.getExpression()\n\n if (!expression) {\n continue\n }\n\n // Check if the expression is a self-closing JSX element.\n if (expression.getKind() !== SyntaxKind.JsxSelfClosingElement) {\n // If it's already a full JSX element with children, skip it.\n continue\n }\n\n const selfClosingElement = expression.asKindOrThrow(\n SyntaxKind.JsxSelfClosingElement\n )\n const tagName = selfClosingElement.getTagNameNode().getText()\n const attributes = selfClosingElement\n .getAttributes()\n .map((attr) => attr.getText())\n .join(\" \")\n\n // Build new render prop value with children moved inside.\n const newRenderValue = attributes\n ? `{<${tagName} ${attributes}>${childrenText}</${tagName}>}`\n : `{<${tagName}>${childrenText}</${tagName}>}`\n\n // Get the parent tag name and other attributes.\n const parentTagName = openingElement.getTagNameNode().getText()\n const otherAttrs = openingElement\n .getAttributes()\n .filter((attr) => {\n if (attr.getKind() === SyntaxKind.JsxAttribute) {\n const attrName = attr\n .asKindOrThrow(SyntaxKind.JsxAttribute)\n .getNameNode()\n .getText()\n return attrName !== \"render\"\n }\n return true\n })\n .map((attr) => attr.getText())\n .join(\" \")\n\n // Build new element text as self-closing since children are now in render.\n const newAttrs = otherAttrs\n ? `${otherAttrs} render=${newRenderValue}`\n : `render=${newRenderValue}`\n\n const newElementText = `<${parentTagName} ${newAttrs} />`\n\n transformations.push({\n elementStart: jsxElement.getStart(),\n elementEnd: jsxElement.getEnd(),\n newText: newElementText,\n })\n }\n\n // Apply transformations in reverse order to preserve positions.\n for (const info of transformations.reverse()) {\n const fullText = sourceFile.getFullText()\n const newFullText =\n fullText.substring(0, info.elementStart) +\n info.newText +\n fullText.substring(info.elementEnd)\n sourceFile.replaceWithText(newFullText)\n }\n\n return sourceFile\n}\n","import { getRegistryIcons } from \"@/src/registry/api\"\nimport { LEGACY_ICON_LIBRARIES } from \"@/src/utils/legacy-icon-libraries\"\nimport { Transformer } from \"@/src/utils/transformers\"\nimport { SourceFile, SyntaxKind } from \"ts-morph\"\n\n// Lucide is the default icon library in the registry.\nconst SOURCE_LIBRARY = \"lucide\"\n\nexport const transformLegacyIcons: Transformer = async ({\n sourceFile,\n config,\n}) => {\n // No transform if we cannot read the icon library.\n if (!config.iconLibrary || !(config.iconLibrary in LEGACY_ICON_LIBRARIES)) {\n return sourceFile\n }\n\n const sourceLibrary = SOURCE_LIBRARY\n const targetLibrary = config.iconLibrary\n\n if (sourceLibrary === targetLibrary) {\n return sourceFile\n }\n\n const registryIcons = await getRegistryIcons()\n\n let targetedIcons: string[] = []\n for (const importDeclaration of sourceFile.getImportDeclarations() ?? []) {\n if (\n importDeclaration.getModuleSpecifier()?.getText() !==\n `\"${LEGACY_ICON_LIBRARIES[SOURCE_LIBRARY].import}\"`\n ) {\n continue\n }\n\n for (const specifier of importDeclaration.getNamedImports() ?? []) {\n const iconName = specifier.getName()\n\n const targetedIcon = registryIcons[iconName]?.[targetLibrary]\n\n if (!targetedIcon || targetedIcons.includes(targetedIcon)) {\n continue\n }\n\n targetedIcons.push(targetedIcon)\n\n // Remove the named import.\n specifier.remove()\n\n // Replace with the targeted icon.\n sourceFile\n .getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement)\n .filter((node) => node.getTagNameNode()?.getText() === iconName)\n .forEach((node) => node.getTagNameNode()?.replaceWithText(targetedIcon))\n }\n\n // If the named import is empty, remove the import declaration.\n if (importDeclaration.getNamedImports()?.length === 0) {\n importDeclaration.remove()\n }\n }\n\n if (targetedIcons.length > 0) {\n const iconImportDeclaration = sourceFile.addImportDeclaration({\n moduleSpecifier:\n LEGACY_ICON_LIBRARIES[\n targetLibrary as keyof typeof LEGACY_ICON_LIBRARIES\n ]?.import,\n namedImports: targetedIcons.map((icon) => ({\n name: icon,\n })),\n })\n\n if (!_useSemicolon(sourceFile)) {\n iconImportDeclaration.replaceWithText(\n iconImportDeclaration.getText().replace(\";\", \"\")\n )\n }\n }\n\n return sourceFile\n}\n\nfunction _useSemicolon(sourceFile: SourceFile) {\n return (\n sourceFile.getImportDeclarations()?.[0]?.getText().endsWith(\";\") ?? false\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/styles/create-style-map.ts","../../src/styles/transform-style-map.ts","../../src/styles/transform.ts","../../src/utils/transformers/transform-legacy-icons.ts"],"names":["CN_PREFIX","styleMapSchema","z","createStyleMap","input","root","postcss","result","rule","selectors","tailwindClasses","extractTailwindClasses","selector","normalizedSelector","normalizeSelector","selectorParser","selectorsRoot","sel","targetClass","findSubjectClass","className","classes","node","value","classNodes","classNode","ALLOWLIST","isStringLiteralLike","Node","transformStyleMap","sourceFile","styleMap","matchedClasses","applyToCvaCalls","applyToClassNameAttributes","applyToMergePropsCalls","applyStyleToCvaString","stringNode","stringValue","cnClasses","extractCnClasses","unmatchedClasses","cnClass","updated","removeCnClasses","tailwindClassesToApply","mergedClasses","mergeClasses","expression","baseArg","configArg","variantsProp","prop","variantsObj","typeProp","typeObj","variantProp","variantValue","initializer","extractCnClassesFromAttribute","jsxElement","cleanCnClassesFromAttribute","applyClassesToElement","isCnCall","argument","cleaned","removeEmptyArgumentsFromCnCall","str","matches","match","callExpression","args","nonEmptyArgs","arg","argTexts","parent","element","attribute","attr","existing","firstArg","i","argText","argumentTexts","updatedArguments","newClasses","existingParts","call","classNameProp","classNameInitializer","extractCnClassesFromCnCall","cleanCnClassesFromCnCall","applyClassesToCnCall","cnCall","transformStyle","source","transformers","Project","ScriptKind","transformer","SOURCE_LIBRARY","transformLegacyIcons","config","LEGACY_ICON_LIBRARIES","sourceLibrary","targetLibrary","registryIcons","getRegistryIcons","targetedIcons","importDeclaration","specifier","iconName","targetedIcon","SyntaxKind","iconImportDeclaration","icon","_useSemicolon"],"mappings":"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","file":"index.js","sourcesContent":["import postcss from \"postcss\"\nimport selectorParser, {\n type ClassName,\n type Selector as SelectorNodeRoot,\n} from \"postcss-selector-parser\"\nimport { z } from \"zod\"\n\nconst CN_PREFIX = \"cn-\"\n\nexport const styleMapSchema = z.record(\n z.string().startsWith(CN_PREFIX),\n z.string()\n)\n\nexport type StyleMap = z.infer<typeof styleMapSchema>\n\nexport function createStyleMap(input: string) {\n const root = postcss.parse(input)\n\n const result: Record<string, string> = {}\n\n root.walkRules((rule) => {\n const selectors = rule.selectors ?? []\n\n if (selectors.length === 0) {\n return\n }\n\n const tailwindClasses = extractTailwindClasses(rule)\n\n if (!tailwindClasses) {\n return\n }\n\n for (const selector of selectors) {\n const normalizedSelector = normalizeSelector(selector)\n\n selectorParser((selectorsRoot) => {\n selectorsRoot.each((sel) => {\n const targetClass = findSubjectClass(sel)\n\n if (!targetClass) {\n return\n }\n\n const className = targetClass.value\n\n if (!className.startsWith(CN_PREFIX)) {\n return\n }\n\n result[className] = result[className]\n ? `${tailwindClasses} ${result[className]}`\n : tailwindClasses\n })\n }).processSync(normalizedSelector)\n }\n })\n\n return styleMapSchema.parse(result)\n}\n\nfunction normalizeSelector(selector: string) {\n return selector.replace(/\\s*&\\s*/g, \"\").trim()\n}\n\nfunction extractTailwindClasses(rule: postcss.Rule) {\n const classes: string[] = []\n\n for (const node of rule.nodes || []) {\n if (node.type === \"atrule\" && node.name === \"apply\") {\n const value = node.params.trim()\n if (value) {\n classes.push(value)\n }\n }\n }\n\n if (classes.length === 0) {\n return null\n }\n\n return classes.join(\" \")\n}\n\nfunction findSubjectClass(selector: SelectorNodeRoot) {\n const classNodes: ClassName[] = []\n\n selector.walkClasses((classNode) => {\n if (classNode.value.startsWith(CN_PREFIX)) {\n classNodes.push(classNode)\n }\n })\n\n if (classNodes.length === 0) {\n return null\n }\n\n return classNodes[classNodes.length - 1]\n}\n","import { TransformerStyle } from \"@/src/styles/transform\"\nimport {\n Node,\n type CallExpression,\n type NoSubstitutionTemplateLiteral,\n type SourceFile,\n type StringLiteral,\n} from \"ts-morph\"\n\nimport { type StyleMap } from \"./create-style-map\"\n\n/**\n * Classes that should never be removed during transformation.\n * These are typically used as CSS selectors or for other purposes\n * that require the class name to remain in the code.\n */\nconst ALLOWLIST = new Set([\"cn-menu-target\"])\n\nfunction isStringLiteralLike(\n node: Node\n): node is StringLiteral | NoSubstitutionTemplateLiteral {\n return (\n Node.isStringLiteral(node) || Node.isNoSubstitutionTemplateLiteral(node)\n )\n}\n\nexport const transformStyleMap: TransformerStyle<SourceFile> = async ({\n sourceFile,\n styleMap,\n}) => {\n const matchedClasses = new Set<string>()\n\n applyToCvaCalls(sourceFile, styleMap, matchedClasses)\n applyToClassNameAttributes(sourceFile, styleMap, matchedClasses)\n applyToMergePropsCalls(sourceFile, styleMap, matchedClasses)\n\n return sourceFile\n}\n\nfunction applyStyleToCvaString(\n stringNode: StringLiteral,\n styleMap: StyleMap,\n matchedClasses: Set<string>\n) {\n const stringValue = stringNode.getLiteralText()\n const cnClasses = extractCnClasses(stringValue)\n\n if (cnClasses.length === 0) {\n return\n }\n\n // Process all cn-* classes, not just the first one\n const unmatchedClasses = cnClasses.filter(\n (cnClass) => !matchedClasses.has(cnClass)\n )\n\n if (unmatchedClasses.length === 0) {\n // All classes already matched, just clean up non-allowlisted ones\n const updated = removeCnClasses(stringValue)\n stringNode.setLiteralValue(updated)\n return\n }\n\n const tailwindClassesToApply = unmatchedClasses\n .map((cnClass) => styleMap[cnClass])\n .filter((classes): classes is string => Boolean(classes))\n\n if (tailwindClassesToApply.length > 0) {\n const mergedClasses = tailwindClassesToApply.join(\" \")\n const updated = removeCnClasses(mergeClasses(mergedClasses, stringValue))\n stringNode.setLiteralValue(updated)\n unmatchedClasses.forEach((cnClass) => matchedClasses.add(cnClass))\n } else {\n // No styles to apply, but still need to clean up non-allowlisted classes\n const updated = removeCnClasses(stringValue)\n stringNode.setLiteralValue(updated)\n }\n}\n\nfunction applyToCvaCalls(\n sourceFile: SourceFile,\n styleMap: StyleMap,\n matchedClasses: Set<string>\n) {\n sourceFile.forEachDescendant((node) => {\n if (!Node.isCallExpression(node)) {\n return\n }\n\n const expression = node.getExpression()\n if (!Node.isIdentifier(expression) || expression.getText() !== \"cva\") {\n return\n }\n\n const baseArg = node.getArguments()[0]\n if (Node.isStringLiteral(baseArg)) {\n applyStyleToCvaString(baseArg, styleMap, matchedClasses)\n }\n\n const configArg = node.getArguments()[1]\n if (!configArg || !Node.isObjectLiteralExpression(configArg)) {\n return\n }\n\n const variantsProp = configArg\n .getProperties()\n .find(\n (prop) =>\n Node.isPropertyAssignment(prop) &&\n Node.isIdentifier(prop.getNameNode()) &&\n prop.getNameNode().getText() === \"variants\"\n )\n\n if (!variantsProp || !Node.isPropertyAssignment(variantsProp)) {\n return\n }\n\n const variantsObj = variantsProp.getInitializer()\n if (!variantsObj || !Node.isObjectLiteralExpression(variantsObj)) {\n return\n }\n\n variantsObj.getProperties().forEach((typeProp) => {\n if (!Node.isPropertyAssignment(typeProp)) {\n return\n }\n\n const typeObj = typeProp.getInitializer()\n if (!typeObj || !Node.isObjectLiteralExpression(typeObj)) {\n return\n }\n\n typeObj.getProperties().forEach((variantProp) => {\n if (!Node.isPropertyAssignment(variantProp)) {\n return\n }\n\n const variantValue = variantProp.getInitializer()\n if (variantValue && Node.isStringLiteral(variantValue)) {\n applyStyleToCvaString(variantValue, styleMap, matchedClasses)\n }\n })\n })\n })\n}\n\nfunction applyToClassNameAttributes(\n sourceFile: SourceFile,\n styleMap: StyleMap,\n matchedClasses: Set<string>\n) {\n sourceFile.forEachDescendant((node) => {\n if (\n !Node.isJsxAttribute(node) ||\n node.getNameNode().getText() !== \"className\"\n ) {\n return\n }\n\n const initializer = node.getInitializer()\n if (!initializer) {\n return\n }\n\n const cnClasses = extractCnClassesFromAttribute(initializer)\n\n if (cnClasses.length === 0) {\n return\n }\n\n const jsxElement = node.getParent()?.getParent()\n if (\n !jsxElement ||\n (!Node.isJsxOpeningElement(jsxElement) &&\n !Node.isJsxSelfClosingElement(jsxElement))\n ) {\n return\n }\n\n const unmatchedClasses = cnClasses.filter(\n (cnClass) => !matchedClasses.has(cnClass)\n )\n\n if (unmatchedClasses.length === 0) {\n // Even if all classes are already matched, we still need to clean them up\n cleanCnClassesFromAttribute(initializer)\n return\n }\n\n const tailwindClassesToApply = unmatchedClasses\n .map((cnClass) => styleMap[cnClass])\n .filter((classes): classes is string => Boolean(classes))\n\n if (tailwindClassesToApply.length > 0) {\n const mergedClasses = tailwindClassesToApply.join(\" \")\n applyClassesToElement(jsxElement, mergedClasses)\n } else {\n cleanCnClassesFromAttribute(initializer)\n }\n })\n}\n\nfunction extractCnClassesFromAttribute(initializer: Node) {\n const classes: string[] = []\n\n if (isStringLiteralLike(initializer)) {\n return extractCnClasses(initializer.getLiteralText())\n }\n\n if (!Node.isJsxExpression(initializer)) {\n return classes\n }\n\n const expression = initializer.getExpression()\n if (!expression) {\n return classes\n }\n\n if (isStringLiteralLike(expression)) {\n return extractCnClasses(expression.getLiteralText())\n }\n\n if (Node.isCallExpression(expression) && isCnCall(expression)) {\n for (const argument of expression.getArguments()) {\n if (isStringLiteralLike(argument)) {\n classes.push(...extractCnClasses(argument.getLiteralText()))\n }\n }\n }\n\n return classes\n}\n\nfunction cleanCnClassesFromAttribute(initializer: Node) {\n if (isStringLiteralLike(initializer)) {\n const cleaned = removeCnClasses(initializer.getLiteralText())\n initializer.setLiteralValue(cleaned)\n return\n }\n\n if (!Node.isJsxExpression(initializer)) {\n return\n }\n\n const expression = initializer.getExpression()\n if (!expression) {\n return\n }\n\n if (isStringLiteralLike(expression)) {\n const cleaned = removeCnClasses(expression.getLiteralText())\n expression.setLiteralValue(cleaned)\n return\n }\n\n if (Node.isCallExpression(expression) && isCnCall(expression)) {\n for (const argument of expression.getArguments()) {\n if (isStringLiteralLike(argument)) {\n const cleaned = removeCnClasses(argument.getLiteralText())\n argument.setLiteralValue(cleaned)\n }\n }\n\n removeEmptyArgumentsFromCnCall(expression)\n }\n}\n\nfunction extractCnClasses(str: string) {\n const matches = str.matchAll(/\\bcn-[\\w-]+\\b/g)\n return Array.from(matches, (match) => match[0])\n}\n\nfunction extractCnClass(str: string) {\n const classes = extractCnClasses(str)\n return classes[0] ?? null\n}\n\nfunction removeCnClasses(str: string) {\n return str\n .replace(/\\bcn-[\\w-]+\\b/g, (match) => {\n // Preserve allowlisted classes\n if (ALLOWLIST.has(match)) {\n return match\n }\n return \"\"\n })\n .replace(/\\s+/g, \" \")\n .trim()\n}\n\nfunction removeEmptyArgumentsFromCnCall(callExpression: CallExpression) {\n if (!isCnCall(callExpression)) {\n return\n }\n\n const args = callExpression.getArguments()\n const nonEmptyArgs = args.filter((arg) => {\n if (isStringLiteralLike(arg)) {\n const text = arg.getLiteralText().trim()\n return text !== \"\"\n }\n return true\n })\n\n if (nonEmptyArgs.length !== args.length) {\n const argTexts = nonEmptyArgs.map((arg) => arg.getText())\n const parent = callExpression.getParent()\n if (parent && Node.isJsxExpression(parent)) {\n parent.replaceWithText(`{cn(${argTexts.join(\", \")})}`)\n } else {\n callExpression.replaceWithText(`cn(${argTexts.join(\", \")})`)\n }\n }\n}\n\nfunction applyClassesToElement(element: Node, tailwindClasses: string) {\n if (\n !Node.isJsxOpeningElement(element) &&\n !Node.isJsxSelfClosingElement(element)\n ) {\n return\n }\n\n const attribute = element\n .getAttributes()\n .find(\n (attr) =>\n Node.isJsxAttribute(attr) &&\n attr.getNameNode().getText() === \"className\"\n )\n\n if (!attribute || !Node.isJsxAttribute(attribute)) {\n element.addAttribute({\n name: \"className\",\n initializer: `{cn(${JSON.stringify(tailwindClasses)})}`,\n })\n return\n }\n\n const initializer = attribute.getInitializer()\n\n if (!initializer) {\n attribute.setInitializer(`{cn(${JSON.stringify(tailwindClasses)})}`)\n return\n }\n\n if (isStringLiteralLike(initializer)) {\n const existing = initializer.getLiteralText()\n const updated = removeCnClasses(mergeClasses(tailwindClasses, existing))\n initializer.setLiteralValue(updated)\n return\n }\n\n if (!Node.isJsxExpression(initializer)) {\n return\n }\n\n const expression = initializer.getExpression()\n\n if (!expression) {\n attribute.setInitializer(`{cn(${JSON.stringify(tailwindClasses)})}`)\n return\n }\n\n if (isStringLiteralLike(expression)) {\n const existing = expression.getLiteralText()\n const updated = removeCnClasses(mergeClasses(tailwindClasses, existing))\n expression.setLiteralValue(updated)\n return\n }\n\n if (Node.isCallExpression(expression) && isCnCall(expression)) {\n const firstArg = expression.getArguments()[0]\n if (isStringLiteralLike(firstArg)) {\n const existing = firstArg.getLiteralText()\n const updated = removeCnClasses(mergeClasses(tailwindClasses, existing))\n firstArg.setLiteralValue(updated)\n\n for (let i = 1; i < expression.getArguments().length; i++) {\n const arg = expression.getArguments()[i]\n if (isStringLiteralLike(arg)) {\n const argText = arg.getLiteralText()\n const cleaned = removeCnClasses(argText)\n if (cleaned !== argText) {\n arg.setLiteralValue(cleaned)\n }\n }\n }\n\n removeEmptyArgumentsFromCnCall(expression)\n return\n }\n\n const argumentTexts = expression\n .getArguments()\n .map((argument) => {\n if (isStringLiteralLike(argument)) {\n const cleaned = removeCnClasses(argument.getLiteralText())\n return cleaned ? JSON.stringify(cleaned) : null\n }\n return argument.getText()\n })\n .filter((arg): arg is string => arg !== null)\n\n const updatedArguments = [JSON.stringify(tailwindClasses), ...argumentTexts]\n\n attribute.setInitializer(`{cn(${updatedArguments.join(\", \")})}`)\n return\n }\n\n attribute.setInitializer(\n `{cn(${JSON.stringify(tailwindClasses)}, ${expression.getText()})}`\n )\n}\n\nfunction mergeClasses(newClasses: string, existing: string) {\n const existingParts = existing.split(/\\s+/).filter(Boolean)\n const newParts = newClasses.split(/\\s+/).filter(Boolean)\n const combined = [...newParts, ...existingParts]\n return combined.join(\" \").trim()\n}\n\nfunction isCnCall(call: CallExpression) {\n const expression = call.getExpression()\n return Node.isIdentifier(expression) && expression.getText() === \"cn\"\n}\n\nfunction applyToMergePropsCalls(\n sourceFile: SourceFile,\n styleMap: StyleMap,\n matchedClasses: Set<string>\n) {\n sourceFile.forEachDescendant((node) => {\n if (!Node.isCallExpression(node)) {\n return\n }\n\n const expression = node.getExpression()\n if (\n !Node.isIdentifier(expression) ||\n expression.getText() !== \"mergeProps\"\n ) {\n return\n }\n\n // Look for object literals in mergeProps arguments\n for (const arg of node.getArguments()) {\n if (!Node.isObjectLiteralExpression(arg)) {\n continue\n }\n\n // Find className property in the object literal\n const classNameProp = arg\n .getProperties()\n .find(\n (prop) =>\n Node.isPropertyAssignment(prop) &&\n Node.isIdentifier(prop.getNameNode()) &&\n prop.getNameNode().getText() === \"className\"\n )\n\n if (!classNameProp || !Node.isPropertyAssignment(classNameProp)) {\n continue\n }\n\n const classNameInitializer = classNameProp.getInitializer()\n if (!classNameInitializer) {\n continue\n }\n\n // Handle cn() calls in className\n if (\n Node.isCallExpression(classNameInitializer) &&\n isCnCall(classNameInitializer)\n ) {\n const cnClasses = extractCnClassesFromCnCall(classNameInitializer)\n\n if (cnClasses.length === 0) {\n continue\n }\n\n const unmatchedClasses = cnClasses.filter(\n (cnClass) => !matchedClasses.has(cnClass)\n )\n\n if (unmatchedClasses.length === 0) {\n // Clean up cn-* classes even if already matched\n cleanCnClassesFromCnCall(classNameInitializer)\n continue\n }\n\n const tailwindClassesToApply = unmatchedClasses\n .map((cnClass) => styleMap[cnClass])\n .filter((classes): classes is string => Boolean(classes))\n\n if (tailwindClassesToApply.length > 0) {\n const mergedClasses = tailwindClassesToApply.join(\" \")\n applyClassesToCnCall(\n classNameInitializer,\n mergedClasses,\n matchedClasses,\n unmatchedClasses\n )\n } else {\n cleanCnClassesFromCnCall(classNameInitializer)\n }\n }\n }\n })\n}\n\nfunction extractCnClassesFromCnCall(cnCall: CallExpression): string[] {\n const classes: string[] = []\n\n for (const argument of cnCall.getArguments()) {\n if (isStringLiteralLike(argument)) {\n classes.push(...extractCnClasses(argument.getLiteralText()))\n }\n }\n\n return classes\n}\n\nfunction cleanCnClassesFromCnCall(cnCall: CallExpression) {\n for (const argument of cnCall.getArguments()) {\n if (isStringLiteralLike(argument)) {\n const cleaned = removeCnClasses(argument.getLiteralText())\n argument.setLiteralValue(cleaned)\n }\n }\n\n removeEmptyArgumentsFromCnCall(cnCall)\n}\n\nfunction applyClassesToCnCall(\n cnCall: CallExpression,\n tailwindClasses: string,\n matchedClasses: Set<string>,\n unmatchedClasses: string[]\n) {\n const firstArg = cnCall.getArguments()[0]\n\n if (isStringLiteralLike(firstArg)) {\n const existing = firstArg.getLiteralText()\n const updated = removeCnClasses(mergeClasses(tailwindClasses, existing))\n firstArg.setLiteralValue(updated)\n\n // Mark classes as matched\n unmatchedClasses.forEach((cnClass) => matchedClasses.add(cnClass))\n\n // Clean up cn-* classes from remaining arguments\n for (let i = 1; i < cnCall.getArguments().length; i++) {\n const arg = cnCall.getArguments()[i]\n if (isStringLiteralLike(arg)) {\n const argText = arg.getLiteralText()\n const cleaned = removeCnClasses(argText)\n if (cleaned !== argText) {\n arg.setLiteralValue(cleaned)\n }\n }\n }\n\n removeEmptyArgumentsFromCnCall(cnCall)\n return\n }\n\n // If first arg is not a string literal, prepend tailwind classes\n const argumentTexts = cnCall\n .getArguments()\n .map((argument) => {\n if (isStringLiteralLike(argument)) {\n const cleaned = removeCnClasses(argument.getLiteralText())\n return cleaned ? JSON.stringify(cleaned) : null\n }\n return argument.getText()\n })\n .filter((arg): arg is string => arg !== null)\n\n const updatedArguments = [JSON.stringify(tailwindClasses), ...argumentTexts]\n\n // Mark classes as matched\n unmatchedClasses.forEach((cnClass) => matchedClasses.add(cnClass))\n\n const parent = cnCall.getParent()\n if (parent) {\n cnCall.replaceWithText(`cn(${updatedArguments.join(\", \")})`)\n }\n}\n","import { Project, ScriptKind, type SourceFile } from \"ts-morph\"\n\nimport { type StyleMap } from \"./create-style-map\"\nimport { transformStyleMap } from \"./transform-style-map\"\n\nexport type TransformerStyle<Output = SourceFile> = (opts: {\n sourceFile: SourceFile\n styleMap: StyleMap\n}) => Promise<Output>\n\nexport async function transformStyle(\n source: string,\n {\n styleMap,\n transformers = [transformStyleMap],\n }: {\n styleMap: StyleMap\n transformers?: TransformerStyle<SourceFile>[]\n }\n) {\n const project = new Project({\n useInMemoryFileSystem: true,\n })\n\n const sourceFile = project.createSourceFile(\"component.tsx\", source, {\n scriptKind: ScriptKind.TSX,\n overwrite: true,\n })\n\n for (const transformer of transformers) {\n await transformer({ sourceFile, styleMap })\n }\n\n return sourceFile.getText()\n}\n","import { getRegistryIcons } from \"@/src/registry/api\"\nimport { LEGACY_ICON_LIBRARIES } from \"@/src/utils/legacy-icon-libraries\"\nimport { Transformer } from \"@/src/utils/transformers\"\nimport { SourceFile, SyntaxKind } from \"ts-morph\"\n\n// Lucide is the default icon library in the registry.\nconst SOURCE_LIBRARY = \"lucide\"\n\nexport const transformLegacyIcons: Transformer = async ({\n sourceFile,\n config,\n}) => {\n // No transform if we cannot read the icon library.\n if (!config.iconLibrary || !(config.iconLibrary in LEGACY_ICON_LIBRARIES)) {\n return sourceFile\n }\n\n const sourceLibrary = SOURCE_LIBRARY\n const targetLibrary = config.iconLibrary\n\n if (sourceLibrary === targetLibrary) {\n return sourceFile\n }\n\n const registryIcons = await getRegistryIcons()\n\n let targetedIcons: string[] = []\n for (const importDeclaration of sourceFile.getImportDeclarations() ?? []) {\n if (\n importDeclaration.getModuleSpecifier()?.getText() !==\n `\"${LEGACY_ICON_LIBRARIES[SOURCE_LIBRARY].import}\"`\n ) {\n continue\n }\n\n for (const specifier of importDeclaration.getNamedImports() ?? []) {\n const iconName = specifier.getName()\n\n const targetedIcon = registryIcons[iconName]?.[targetLibrary]\n\n if (!targetedIcon || targetedIcons.includes(targetedIcon)) {\n continue\n }\n\n targetedIcons.push(targetedIcon)\n\n // Remove the named import.\n specifier.remove()\n\n // Replace with the targeted icon.\n sourceFile\n .getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement)\n .filter((node) => node.getTagNameNode()?.getText() === iconName)\n .forEach((node) => node.getTagNameNode()?.replaceWithText(targetedIcon))\n }\n\n // If the named import is empty, remove the import declaration.\n if (importDeclaration.getNamedImports()?.length === 0) {\n importDeclaration.remove()\n }\n }\n\n if (targetedIcons.length > 0) {\n const iconImportDeclaration = sourceFile.addImportDeclaration({\n moduleSpecifier:\n LEGACY_ICON_LIBRARIES[\n targetLibrary as keyof typeof LEGACY_ICON_LIBRARIES\n ]?.import,\n namedImports: targetedIcons.map((icon) => ({\n name: icon,\n })),\n })\n\n if (!_useSemicolon(sourceFile)) {\n iconImportDeclaration.replaceWithText(\n iconImportDeclaration.getText().replace(\";\", \"\")\n )\n }\n }\n\n return sourceFile\n}\n\nfunction _useSemicolon(sourceFile: SourceFile) {\n return (\n sourceFile.getImportDeclarations()?.[0]?.getText().endsWith(\";\") ?? false\n )\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@create-ui/cli",
3
- "version": "0.1.0-beta.0",
3
+ "version": "0.5.0",
4
4
  "description": "Add components to your apps.",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -10,7 +10,7 @@
10
10
  "name": "createui",
11
11
  "url": "https://twitter.com/createui"
12
12
  },
13
- "homepage": "https://dev.createui.co",
13
+ "homepage": "https://createui.co",
14
14
  "files": [
15
15
  "dist"
16
16
  ],
@@ -74,6 +74,7 @@
74
74
  "fs-extra": "^11.3.1",
75
75
  "fuzzysort": "^3.1.0",
76
76
  "https-proxy-agent": "^7.0.6",
77
+ "jsonc-parser": "^3.3.1",
77
78
  "kleur": "^4.1.5",
78
79
  "msw": "^2.10.4",
79
80
  "node-fetch": "^3.3.2",
@@ -106,7 +107,7 @@
106
107
  "typecheck": "tsc --noEmit",
107
108
  "clean": "rimraf dist && rimraf components",
108
109
  "start:dev": "cross-env REGISTRY_URL=http://localhost:4000/r node dist/index.js",
109
- "start:prod": "cross-env REGISTRY_URL=https://dev.createui.co/r node dist/index.js",
110
+ "start:prod": "cross-env REGISTRY_URL=https://createui.co/r node dist/index.js",
110
111
  "start": "node dist/index.js",
111
112
  "format:write": "prettier --write \"**/*.{ts,tsx,mdx}\" --cache",
112
113
  "format:check": "prettier --check \"**/*.{ts,tsx,mdx}\" --cache",