@frontfriend/tailwind 4.0.17 → 4.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1,16 +1,7 @@
1
1
  #!/usr/bin/env node
2
- var $=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports);var re=$((jo,Ie)=>{var En="https://app.dev.frontfriend.dev",Mn="https://registry-legacy.frontfriend.dev",Ln=".cache/frontfriend",Pn={JS:["tokens.js","variables.js","semanticVariables.js","semanticDarkVariables.js","safelist.js","custom.js"],JSON:["fonts.json","icons.json","components-config.json","version.json","metadata.json"]},Dn={FF_ID:"FF_ID",FF_API_URL:"FF_API_URL",FF_USE_LOCAL:"FF_USE_LOCAL",FF_AUTH_TOKEN:"FF_AUTH_TOKEN"};Ie.exports={DEFAULT_API_URL:En,LEGACY_API_URL:Mn,CACHE_DIR_NAME:Ln,CACHE_TTL_DAYS:7,CACHE_TTL_MS:6048e5,CACHE_FILES:Pn,ENV_VARS:Dn}});var qe=$((Ao,Ue)=>{var L=require("fs"),Oe=require("path"),Nn=require("os"),Rn=require("https"),Un=require("http"),{URL:qn}=require("url"),{DEFAULT_API_URL:Ee}=re(),Me=Oe.join(Nn.homedir(),".frontfriend"),P=Oe.join(Me,"credentials");function zn(){return P}function Le(){try{return L.existsSync(P)?JSON.parse(L.readFileSync(P,"utf8")):null}catch{return null}}function Pe(e){L.mkdirSync(Me,{recursive:!0,mode:448}),L.writeFileSync(P,`${JSON.stringify(e,null,2)}
3
- `,{mode:384});try{L.chmodSync(P,384)}catch{}}function Vn(){return L.existsSync(P)?(L.unlinkSync(P),!0):!1}function De(e,n=60*1e3){return!(e!=null&&e.accessToken)||!e.expiresAt||Date.now()+n>=e.expiresAt}function K(e){let n=new Error(`${e}. Run \`frontfriend login\` to re-authenticate.`);return n.code="FF_AUTH_REFRESH_FAILED",n}function Ne(e,n,t){return new Promise((o,s)=>{let i=new qn(e),r=i.protocol==="https:"?Rn:Un,c=JSON.stringify(n||{}),a=r.request({hostname:i.hostname,port:i.port,path:`${i.pathname}${i.search}`,method:"POST",headers:{"content-type":"application/json","content-length":Buffer.byteLength(c),...t?{authorization:`Bearer ${t}`}:{}}},l=>{let u="";l.on("data",f=>{u+=f}),l.on("end",()=>{if(l.statusCode>=300&&l.statusCode<400){let g=l.headers.location?` to ${l.headers.location}`:"",p=new Error(`HTTP ${l.statusCode}: redirected${g}`);p.statusCode=l.statusCode,p.body=u,s(p);return}let f=null;try{f=u?JSON.parse(u):null}catch{let p=l.headers["content-type"]||"unknown content-type",b=new Error(`Expected JSON from FrontFriend API at ${e}, but received ${p} (HTTP ${l.statusCode}). Check FF_API_URL or pass --api-url with the FrontFriend app URL.`);if(b.statusCode=l.statusCode,b.body=u,l.statusCode>=400){s(b);return}s(b);return}if(l.statusCode>=400){let g=new Error((f==null?void 0:f.error_description)||(f==null?void 0:f.error)||`HTTP ${l.statusCode}`);g.statusCode=l.statusCode,g.body=f,s(g);return}o(f)})});a.on("error",s),a.write(c),a.end()})}async function Re(e,n=Ee){if(!(e!=null&&e.refreshToken)||!(e!=null&&e.deviceId))throw K("FrontFriend session expired");let t;try{t=await Ne(`${n}/api/plugin/token`,{grant_type:"refresh_token",refresh_token:e.refreshToken,device_id:e.deviceId})}catch(s){throw K((s==null?void 0:s.message)||"Could not refresh FrontFriend session")}if(!(t!=null&&t.access_token)||!(t!=null&&t.refresh_token))throw K("Could not refresh FrontFriend session");let o={accessToken:t.access_token,refreshToken:t.refresh_token,deviceId:t.device_id||e.deviceId,expiresAt:Date.now()+(t.expires_in||900)*1e3,refreshExpiresAt:Date.now()+(t.refresh_expires_in||604800)*1e3,ffApiUrl:n};return Pe(o),o}async function Bn(e={}){if(!e.skipCredentials){let n=Le();if(n!=null&&n.accessToken||n!=null&&n.refreshToken){let t=e.baseURL||n.ffApiUrl||Ee;return n.accessToken&&!De(n)?n.accessToken:(await Re(n,t)).accessToken}}return e.envToken?e.envToken:e.legacyToken?(e.silent||console.warn("\u26A0\uFE0F auth-token in frontfriend.config.js is deprecated. Run `frontfriend login` to store credentials outside the repo."),e.legacyToken):null}Ue.exports={getCredentialsPath:zn,readCredentials:Le,writeCredentials:Pe,deleteCredentials:Vn,isExpired:De,postJson:Ne,refreshCredentials:Re,resolveAuthToken:Bn,createAuthRefreshError:K}});var ie=$((To,ze)=>{"use strict";ze.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var Be=$((_o,Ve)=>{Ve.exports=function(n){return!n||typeof n=="string"?!1:n instanceof Array||Array.isArray(n)||n.length>=0&&(n.splice instanceof Function||Object.getOwnPropertyDescriptor(n,n.length-1)&&n.constructor.name!=="String")}});var Ge=$((Io,He)=>{"use strict";var Jn=Be(),Hn=Array.prototype.concat,Gn=Array.prototype.slice,Je=He.exports=function(n){for(var t=[],o=0,s=n.length;o<s;o++){var i=n[o];Jn(i)?t=Hn.call(t,Gn.call(i)):t.push(i)}return t};Je.wrap=function(e){return function(){return e(Je(arguments))}}});var Ze=$((Oo,Ye)=>{var z=ie(),V=Ge(),Ke=Object.hasOwnProperty,We=Object.create(null);for(W in z)Ke.call(z,W)&&(We[z[W]]=W);var W,j=Ye.exports={to:{},get:{}};j.get=function(e){var n=e.substring(0,3).toLowerCase(),t,o;switch(n){case"hsl":t=j.get.hsl(e),o="hsl";break;case"hwb":t=j.get.hwb(e),o="hwb";break;default:t=j.get.rgb(e),o="rgb";break}return t?{model:o,value:t}:null};j.get.rgb=function(e){if(!e)return null;var n=/^#([a-f0-9]{3,4})$/i,t=/^#([a-f0-9]{6})([a-f0-9]{2})?$/i,o=/^rgba?\(\s*([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/,s=/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/,i=/^(\w+)$/,r=[0,0,0,1],c,a,l;if(c=e.match(t)){for(l=c[2],c=c[1],a=0;a<3;a++){var u=a*2;r[a]=parseInt(c.slice(u,u+2),16)}l&&(r[3]=parseInt(l,16)/255)}else if(c=e.match(n)){for(c=c[1],l=c[3],a=0;a<3;a++)r[a]=parseInt(c[a]+c[a],16);l&&(r[3]=parseInt(l+l,16)/255)}else if(c=e.match(o)){for(a=0;a<3;a++)r[a]=parseInt(c[a+1],0);c[4]&&(c[5]?r[3]=parseFloat(c[4])*.01:r[3]=parseFloat(c[4]))}else if(c=e.match(s)){for(a=0;a<3;a++)r[a]=Math.round(parseFloat(c[a+1])*2.55);c[4]&&(c[5]?r[3]=parseFloat(c[4])*.01:r[3]=parseFloat(c[4]))}else return(c=e.match(i))?c[1]==="transparent"?[0,0,0,0]:Ke.call(z,c[1])?(r=z[c[1]],r[3]=1,r):null:null;for(a=0;a<3;a++)r[a]=O(r[a],0,255);return r[3]=O(r[3],0,1),r};j.get.hsl=function(e){if(!e)return null;var n=/^hsla?\(\s*([+-]?(?:\d{0,3}\.)?\d+)(?:deg)?\s*,?\s*([+-]?[\d\.]+)%\s*,?\s*([+-]?[\d\.]+)%\s*(?:[,|\/]\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/,t=e.match(n);if(t){var o=parseFloat(t[4]),s=(parseFloat(t[1])%360+360)%360,i=O(parseFloat(t[2]),0,100),r=O(parseFloat(t[3]),0,100),c=O(isNaN(o)?1:o,0,1);return[s,i,r,c]}return null};j.get.hwb=function(e){if(!e)return null;var n=/^hwb\(\s*([+-]?\d{0,3}(?:\.\d+)?)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/,t=e.match(n);if(t){var o=parseFloat(t[4]),s=(parseFloat(t[1])%360+360)%360,i=O(parseFloat(t[2]),0,100),r=O(parseFloat(t[3]),0,100),c=O(isNaN(o)?1:o,0,1);return[s,i,r,c]}return null};j.to.hex=function(){var e=V(arguments);return"#"+Y(e[0])+Y(e[1])+Y(e[2])+(e[3]<1?Y(Math.round(e[3]*255)):"")};j.to.rgb=function(){var e=V(arguments);return e.length<4||e[3]===1?"rgb("+Math.round(e[0])+", "+Math.round(e[1])+", "+Math.round(e[2])+")":"rgba("+Math.round(e[0])+", "+Math.round(e[1])+", "+Math.round(e[2])+", "+e[3]+")"};j.to.rgb.percent=function(){var e=V(arguments),n=Math.round(e[0]/255*100),t=Math.round(e[1]/255*100),o=Math.round(e[2]/255*100);return e.length<4||e[3]===1?"rgb("+n+"%, "+t+"%, "+o+"%)":"rgba("+n+"%, "+t+"%, "+o+"%, "+e[3]+")"};j.to.hsl=function(){var e=V(arguments);return e.length<4||e[3]===1?"hsl("+e[0]+", "+e[1]+"%, "+e[2]+"%)":"hsla("+e[0]+", "+e[1]+"%, "+e[2]+"%, "+e[3]+")"};j.to.hwb=function(){var e=V(arguments),n="";return e.length>=4&&e[3]!==1&&(n=", "+e[3]),"hwb("+e[0]+", "+e[1]+"%, "+e[2]+"%"+n+")"};j.to.keyword=function(e){return We[e.slice(0,3)]};function O(e,n,t){return Math.min(Math.max(n,e),t)}function Y(e){var n=Math.round(e).toString(16).toUpperCase();return n.length<2?"0"+n:n}});var ce=$((Eo,Xe)=>{var B=ie(),Qe={};for(let e of Object.keys(B))Qe[B[e]]=e;var d={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};Xe.exports=d;for(let e of Object.keys(d)){if(!("channels"in d[e]))throw new Error("missing channels property: "+e);if(!("labels"in d[e]))throw new Error("missing channel labels property: "+e);if(d[e].labels.length!==d[e].channels)throw new Error("channel and label counts mismatch: "+e);let{channels:n,labels:t}=d[e];delete d[e].channels,delete d[e].labels,Object.defineProperty(d[e],"channels",{value:n}),Object.defineProperty(d[e],"labels",{value:t})}d.rgb.hsl=function(e){let n=e[0]/255,t=e[1]/255,o=e[2]/255,s=Math.min(n,t,o),i=Math.max(n,t,o),r=i-s,c,a;i===s?c=0:n===i?c=(t-o)/r:t===i?c=2+(o-n)/r:o===i&&(c=4+(n-t)/r),c=Math.min(c*60,360),c<0&&(c+=360);let l=(s+i)/2;return i===s?a=0:l<=.5?a=r/(i+s):a=r/(2-i-s),[c,a*100,l*100]};d.rgb.hsv=function(e){let n,t,o,s,i,r=e[0]/255,c=e[1]/255,a=e[2]/255,l=Math.max(r,c,a),u=l-Math.min(r,c,a),f=function(g){return(l-g)/6/u+1/2};return u===0?(s=0,i=0):(i=u/l,n=f(r),t=f(c),o=f(a),r===l?s=o-t:c===l?s=1/3+n-o:a===l&&(s=2/3+t-n),s<0?s+=1:s>1&&(s-=1)),[s*360,i*100,l*100]};d.rgb.hwb=function(e){let n=e[0],t=e[1],o=e[2],s=d.rgb.hsl(e)[0],i=1/255*Math.min(n,Math.min(t,o));return o=1-1/255*Math.max(n,Math.max(t,o)),[s,i*100,o*100]};d.rgb.cmyk=function(e){let n=e[0]/255,t=e[1]/255,o=e[2]/255,s=Math.min(1-n,1-t,1-o),i=(1-n-s)/(1-s)||0,r=(1-t-s)/(1-s)||0,c=(1-o-s)/(1-s)||0;return[i*100,r*100,c*100,s*100]};function Kn(e,n){return(e[0]-n[0])**2+(e[1]-n[1])**2+(e[2]-n[2])**2}d.rgb.keyword=function(e){let n=Qe[e];if(n)return n;let t=1/0,o;for(let s of Object.keys(B)){let i=B[s],r=Kn(e,i);r<t&&(t=r,o=s)}return o};d.keyword.rgb=function(e){return B[e]};d.rgb.xyz=function(e){let n=e[0]/255,t=e[1]/255,o=e[2]/255;n=n>.04045?((n+.055)/1.055)**2.4:n/12.92,t=t>.04045?((t+.055)/1.055)**2.4:t/12.92,o=o>.04045?((o+.055)/1.055)**2.4:o/12.92;let s=n*.4124+t*.3576+o*.1805,i=n*.2126+t*.7152+o*.0722,r=n*.0193+t*.1192+o*.9505;return[s*100,i*100,r*100]};d.rgb.lab=function(e){let n=d.rgb.xyz(e),t=n[0],o=n[1],s=n[2];t/=95.047,o/=100,s/=108.883,t=t>.008856?t**(1/3):7.787*t+16/116,o=o>.008856?o**(1/3):7.787*o+16/116,s=s>.008856?s**(1/3):7.787*s+16/116;let i=116*o-16,r=500*(t-o),c=200*(o-s);return[i,r,c]};d.hsl.rgb=function(e){let n=e[0]/360,t=e[1]/100,o=e[2]/100,s,i,r;if(t===0)return r=o*255,[r,r,r];o<.5?s=o*(1+t):s=o+t-o*t;let c=2*o-s,a=[0,0,0];for(let l=0;l<3;l++)i=n+1/3*-(l-1),i<0&&i++,i>1&&i--,6*i<1?r=c+(s-c)*6*i:2*i<1?r=s:3*i<2?r=c+(s-c)*(2/3-i)*6:r=c,a[l]=r*255;return a};d.hsl.hsv=function(e){let n=e[0],t=e[1]/100,o=e[2]/100,s=t,i=Math.max(o,.01);o*=2,t*=o<=1?o:2-o,s*=i<=1?i:2-i;let r=(o+t)/2,c=o===0?2*s/(i+s):2*t/(o+t);return[n,c*100,r*100]};d.hsv.rgb=function(e){let n=e[0]/60,t=e[1]/100,o=e[2]/100,s=Math.floor(n)%6,i=n-Math.floor(n),r=255*o*(1-t),c=255*o*(1-t*i),a=255*o*(1-t*(1-i));switch(o*=255,s){case 0:return[o,a,r];case 1:return[c,o,r];case 2:return[r,o,a];case 3:return[r,c,o];case 4:return[a,r,o];case 5:return[o,r,c]}};d.hsv.hsl=function(e){let n=e[0],t=e[1]/100,o=e[2]/100,s=Math.max(o,.01),i,r;r=(2-t)*o;let c=(2-t)*s;return i=t*s,i/=c<=1?c:2-c,i=i||0,r/=2,[n,i*100,r*100]};d.hwb.rgb=function(e){let n=e[0]/360,t=e[1]/100,o=e[2]/100,s=t+o,i;s>1&&(t/=s,o/=s);let r=Math.floor(6*n),c=1-o;i=6*n-r,r&1&&(i=1-i);let a=t+i*(c-t),l,u,f;switch(r){default:case 6:case 0:l=c,u=a,f=t;break;case 1:l=a,u=c,f=t;break;case 2:l=t,u=c,f=a;break;case 3:l=t,u=a,f=c;break;case 4:l=a,u=t,f=c;break;case 5:l=c,u=t,f=a;break}return[l*255,u*255,f*255]};d.cmyk.rgb=function(e){let n=e[0]/100,t=e[1]/100,o=e[2]/100,s=e[3]/100,i=1-Math.min(1,n*(1-s)+s),r=1-Math.min(1,t*(1-s)+s),c=1-Math.min(1,o*(1-s)+s);return[i*255,r*255,c*255]};d.xyz.rgb=function(e){let n=e[0]/100,t=e[1]/100,o=e[2]/100,s,i,r;return s=n*3.2406+t*-1.5372+o*-.4986,i=n*-.9689+t*1.8758+o*.0415,r=n*.0557+t*-.204+o*1.057,s=s>.0031308?1.055*s**(1/2.4)-.055:s*12.92,i=i>.0031308?1.055*i**(1/2.4)-.055:i*12.92,r=r>.0031308?1.055*r**(1/2.4)-.055:r*12.92,s=Math.min(Math.max(0,s),1),i=Math.min(Math.max(0,i),1),r=Math.min(Math.max(0,r),1),[s*255,i*255,r*255]};d.xyz.lab=function(e){let n=e[0],t=e[1],o=e[2];n/=95.047,t/=100,o/=108.883,n=n>.008856?n**(1/3):7.787*n+16/116,t=t>.008856?t**(1/3):7.787*t+16/116,o=o>.008856?o**(1/3):7.787*o+16/116;let s=116*t-16,i=500*(n-t),r=200*(t-o);return[s,i,r]};d.lab.xyz=function(e){let n=e[0],t=e[1],o=e[2],s,i,r;i=(n+16)/116,s=t/500+i,r=i-o/200;let c=i**3,a=s**3,l=r**3;return i=c>.008856?c:(i-16/116)/7.787,s=a>.008856?a:(s-16/116)/7.787,r=l>.008856?l:(r-16/116)/7.787,s*=95.047,i*=100,r*=108.883,[s,i,r]};d.lab.lch=function(e){let n=e[0],t=e[1],o=e[2],s;s=Math.atan2(o,t)*360/2/Math.PI,s<0&&(s+=360);let r=Math.sqrt(t*t+o*o);return[n,r,s]};d.lch.lab=function(e){let n=e[0],t=e[1],s=e[2]/360*2*Math.PI,i=t*Math.cos(s),r=t*Math.sin(s);return[n,i,r]};d.rgb.ansi16=function(e,n=null){let[t,o,s]=e,i=n===null?d.rgb.hsv(e)[2]:n;if(i=Math.round(i/50),i===0)return 30;let r=30+(Math.round(s/255)<<2|Math.round(o/255)<<1|Math.round(t/255));return i===2&&(r+=60),r};d.hsv.ansi16=function(e){return d.rgb.ansi16(d.hsv.rgb(e),e[2])};d.rgb.ansi256=function(e){let n=e[0],t=e[1],o=e[2];return n===t&&t===o?n<8?16:n>248?231:Math.round((n-8)/247*24)+232:16+36*Math.round(n/255*5)+6*Math.round(t/255*5)+Math.round(o/255*5)};d.ansi16.rgb=function(e){let n=e%10;if(n===0||n===7)return e>50&&(n+=3.5),n=n/10.5*255,[n,n,n];let t=(~~(e>50)+1)*.5,o=(n&1)*t*255,s=(n>>1&1)*t*255,i=(n>>2&1)*t*255;return[o,s,i]};d.ansi256.rgb=function(e){if(e>=232){let i=(e-232)*10+8;return[i,i,i]}e-=16;let n,t=Math.floor(e/36)/5*255,o=Math.floor((n=e%36)/6)/5*255,s=n%6/5*255;return[t,o,s]};d.rgb.hex=function(e){let t=(((Math.round(e[0])&255)<<16)+((Math.round(e[1])&255)<<8)+(Math.round(e[2])&255)).toString(16).toUpperCase();return"000000".substring(t.length)+t};d.hex.rgb=function(e){let n=e.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!n)return[0,0,0];let t=n[0];n[0].length===3&&(t=t.split("").map(c=>c+c).join(""));let o=parseInt(t,16),s=o>>16&255,i=o>>8&255,r=o&255;return[s,i,r]};d.rgb.hcg=function(e){let n=e[0]/255,t=e[1]/255,o=e[2]/255,s=Math.max(Math.max(n,t),o),i=Math.min(Math.min(n,t),o),r=s-i,c,a;return r<1?c=i/(1-r):c=0,r<=0?a=0:s===n?a=(t-o)/r%6:s===t?a=2+(o-n)/r:a=4+(n-t)/r,a/=6,a%=1,[a*360,r*100,c*100]};d.hsl.hcg=function(e){let n=e[1]/100,t=e[2]/100,o=t<.5?2*n*t:2*n*(1-t),s=0;return o<1&&(s=(t-.5*o)/(1-o)),[e[0],o*100,s*100]};d.hsv.hcg=function(e){let n=e[1]/100,t=e[2]/100,o=n*t,s=0;return o<1&&(s=(t-o)/(1-o)),[e[0],o*100,s*100]};d.hcg.rgb=function(e){let n=e[0]/360,t=e[1]/100,o=e[2]/100;if(t===0)return[o*255,o*255,o*255];let s=[0,0,0],i=n%1*6,r=i%1,c=1-r,a=0;switch(Math.floor(i)){case 0:s[0]=1,s[1]=r,s[2]=0;break;case 1:s[0]=c,s[1]=1,s[2]=0;break;case 2:s[0]=0,s[1]=1,s[2]=r;break;case 3:s[0]=0,s[1]=c,s[2]=1;break;case 4:s[0]=r,s[1]=0,s[2]=1;break;default:s[0]=1,s[1]=0,s[2]=c}return a=(1-t)*o,[(t*s[0]+a)*255,(t*s[1]+a)*255,(t*s[2]+a)*255]};d.hcg.hsv=function(e){let n=e[1]/100,t=e[2]/100,o=n+t*(1-n),s=0;return o>0&&(s=n/o),[e[0],s*100,o*100]};d.hcg.hsl=function(e){let n=e[1]/100,o=e[2]/100*(1-n)+.5*n,s=0;return o>0&&o<.5?s=n/(2*o):o>=.5&&o<1&&(s=n/(2*(1-o))),[e[0],s*100,o*100]};d.hcg.hwb=function(e){let n=e[1]/100,t=e[2]/100,o=n+t*(1-n);return[e[0],(o-n)*100,(1-o)*100]};d.hwb.hcg=function(e){let n=e[1]/100,o=1-e[2]/100,s=o-n,i=0;return s<1&&(i=(o-s)/(1-s)),[e[0],s*100,i*100]};d.apple.rgb=function(e){return[e[0]/65535*255,e[1]/65535*255,e[2]/65535*255]};d.rgb.apple=function(e){return[e[0]/255*65535,e[1]/255*65535,e[2]/255*65535]};d.gray.rgb=function(e){return[e[0]/100*255,e[0]/100*255,e[0]/100*255]};d.gray.hsl=function(e){return[0,0,e[0]]};d.gray.hsv=d.gray.hsl;d.gray.hwb=function(e){return[0,100,e[0]]};d.gray.cmyk=function(e){return[0,0,0,e[0]]};d.gray.lab=function(e){return[e[0],0,0]};d.gray.hex=function(e){let n=Math.round(e[0]/100*255)&255,o=((n<<16)+(n<<8)+n).toString(16).toUpperCase();return"000000".substring(o.length)+o};d.rgb.gray=function(e){return[(e[0]+e[1]+e[2])/3/255*100]}});var nn=$((Mo,en)=>{var Z=ce();function Wn(){let e={},n=Object.keys(Z);for(let t=n.length,o=0;o<t;o++)e[n[o]]={distance:-1,parent:null};return e}function Yn(e){let n=Wn(),t=[e];for(n[e].distance=0;t.length;){let o=t.pop(),s=Object.keys(Z[o]);for(let i=s.length,r=0;r<i;r++){let c=s[r],a=n[c];a.distance===-1&&(a.distance=n[o].distance+1,a.parent=o,t.unshift(c))}}return n}function Zn(e,n){return function(t){return n(e(t))}}function Qn(e,n){let t=[n[e].parent,e],o=Z[n[e].parent][e],s=n[e].parent;for(;n[s].parent;)t.unshift(n[s].parent),o=Zn(Z[n[s].parent][s],o),s=n[s].parent;return o.conversion=t,o}en.exports=function(e){let n=Yn(e),t={},o=Object.keys(n);for(let s=o.length,i=0;i<s;i++){let r=o[i];n[r].parent!==null&&(t[r]=Qn(r,n))}return t}});var on=$((Lo,tn)=>{var ae=ce(),Xn=nn(),R={},et=Object.keys(ae);function nt(e){let n=function(...t){let o=t[0];return o==null?o:(o.length>1&&(t=o),e(t))};return"conversion"in e&&(n.conversion=e.conversion),n}function tt(e){let n=function(...t){let o=t[0];if(o==null)return o;o.length>1&&(t=o);let s=e(t);if(typeof s=="object")for(let i=s.length,r=0;r<i;r++)s[r]=Math.round(s[r]);return s};return"conversion"in e&&(n.conversion=e.conversion),n}et.forEach(e=>{R[e]={},Object.defineProperty(R[e],"channels",{value:ae[e].channels}),Object.defineProperty(R[e],"labels",{value:ae[e].labels});let n=Xn(e);Object.keys(n).forEach(o=>{let s=n[o];R[e][o]=tt(s),R[e][o].raw=nt(s)})});tn.exports=R});var cn=$((Po,rn)=>{var U=Ze(),A=on(),sn=["keyword","gray","hex"],le={};for(let e of Object.keys(A))le[[...A[e].labels].sort().join("")]=e;var Q={};function S(e,n){if(!(this instanceof S))return new S(e,n);if(n&&n in sn&&(n=null),n&&!(n in A))throw new Error("Unknown model: "+n);let t,o;if(e==null)this.model="rgb",this.color=[0,0,0],this.valpha=1;else if(e instanceof S)this.model=e.model,this.color=[...e.color],this.valpha=e.valpha;else if(typeof e=="string"){let s=U.get(e);if(s===null)throw new Error("Unable to parse color from string: "+e);this.model=s.model,o=A[this.model].channels,this.color=s.value.slice(0,o),this.valpha=typeof s.value[o]=="number"?s.value[o]:1}else if(e.length>0){this.model=n||"rgb",o=A[this.model].channels;let s=Array.prototype.slice.call(e,0,o);this.color=ue(s,o),this.valpha=typeof e[o]=="number"?e[o]:1}else if(typeof e=="number")this.model="rgb",this.color=[e>>16&255,e>>8&255,e&255],this.valpha=1;else{this.valpha=1;let s=Object.keys(e);"alpha"in e&&(s.splice(s.indexOf("alpha"),1),this.valpha=typeof e.alpha=="number"?e.alpha:0);let i=s.sort().join("");if(!(i in le))throw new Error("Unable to parse color from object: "+JSON.stringify(e));this.model=le[i];let{labels:r}=A[this.model],c=[];for(t=0;t<r.length;t++)c.push(e[r[t]]);this.color=ue(c)}if(Q[this.model])for(o=A[this.model].channels,t=0;t<o;t++){let s=Q[this.model][t];s&&(this.color[t]=s(this.color[t]))}this.valpha=Math.max(0,Math.min(1,this.valpha)),Object.freeze&&Object.freeze(this)}S.prototype={toString(){return this.string()},toJSON(){return this[this.model]()},string(e){let n=this.model in U.to?this:this.rgb();n=n.round(typeof e=="number"?e:1);let t=n.valpha===1?n.color:[...n.color,this.valpha];return U.to[n.model](t)},percentString(e){let n=this.rgb().round(typeof e=="number"?e:1),t=n.valpha===1?n.color:[...n.color,this.valpha];return U.to.rgb.percent(t)},array(){return this.valpha===1?[...this.color]:[...this.color,this.valpha]},object(){let e={},{channels:n}=A[this.model],{labels:t}=A[this.model];for(let o=0;o<n;o++)e[t[o]]=this.color[o];return this.valpha!==1&&(e.alpha=this.valpha),e},unitArray(){let e=this.rgb().color;return e[0]/=255,e[1]/=255,e[2]/=255,this.valpha!==1&&e.push(this.valpha),e},unitObject(){let e=this.rgb().object();return e.r/=255,e.g/=255,e.b/=255,this.valpha!==1&&(e.alpha=this.valpha),e},round(e){return e=Math.max(e||0,0),new S([...this.color.map(st(e)),this.valpha],this.model)},alpha(e){return e!==void 0?new S([...this.color,Math.max(0,Math.min(1,e))],this.model):this.valpha},red:v("rgb",0,C(255)),green:v("rgb",1,C(255)),blue:v("rgb",2,C(255)),hue:v(["hsl","hsv","hsl","hwb","hcg"],0,e=>(e%360+360)%360),saturationl:v("hsl",1,C(100)),lightness:v("hsl",2,C(100)),saturationv:v("hsv",1,C(100)),value:v("hsv",2,C(100)),chroma:v("hcg",1,C(100)),gray:v("hcg",2,C(100)),white:v("hwb",1,C(100)),wblack:v("hwb",2,C(100)),cyan:v("cmyk",0,C(100)),magenta:v("cmyk",1,C(100)),yellow:v("cmyk",2,C(100)),black:v("cmyk",3,C(100)),x:v("xyz",0,C(95.047)),y:v("xyz",1,C(100)),z:v("xyz",2,C(108.833)),l:v("lab",0,C(100)),a:v("lab",1),b:v("lab",2),keyword(e){return e!==void 0?new S(e):A[this.model].keyword(this.color)},hex(e){return e!==void 0?new S(e):U.to.hex(this.rgb().round().color)},hexa(e){if(e!==void 0)return new S(e);let n=this.rgb().round().color,t=Math.round(this.valpha*255).toString(16).toUpperCase();return t.length===1&&(t="0"+t),U.to.hex(n)+t},rgbNumber(){let e=this.rgb().color;return(e[0]&255)<<16|(e[1]&255)<<8|e[2]&255},luminosity(){let e=this.rgb().color,n=[];for(let[t,o]of e.entries()){let s=o/255;n[t]=s<=.04045?s/12.92:((s+.055)/1.055)**2.4}return .2126*n[0]+.7152*n[1]+.0722*n[2]},contrast(e){let n=this.luminosity(),t=e.luminosity();return n>t?(n+.05)/(t+.05):(t+.05)/(n+.05)},level(e){let n=this.contrast(e);return n>=7?"AAA":n>=4.5?"AA":""},isDark(){let e=this.rgb().color;return(e[0]*2126+e[1]*7152+e[2]*722)/1e4<128},isLight(){return!this.isDark()},negate(){let e=this.rgb();for(let n=0;n<3;n++)e.color[n]=255-e.color[n];return e},lighten(e){let n=this.hsl();return n.color[2]+=n.color[2]*e,n},darken(e){let n=this.hsl();return n.color[2]-=n.color[2]*e,n},saturate(e){let n=this.hsl();return n.color[1]+=n.color[1]*e,n},desaturate(e){let n=this.hsl();return n.color[1]-=n.color[1]*e,n},whiten(e){let n=this.hwb();return n.color[1]+=n.color[1]*e,n},blacken(e){let n=this.hwb();return n.color[2]+=n.color[2]*e,n},grayscale(){let e=this.rgb().color,n=e[0]*.3+e[1]*.59+e[2]*.11;return S.rgb(n,n,n)},fade(e){return this.alpha(this.valpha-this.valpha*e)},opaquer(e){return this.alpha(this.valpha+this.valpha*e)},rotate(e){let n=this.hsl(),t=n.color[0];return t=(t+e)%360,t=t<0?360+t:t,n.color[0]=t,n},mix(e,n){if(!e||!e.rgb)throw new Error('Argument to "mix" was not a Color instance, but rather an instance of '+typeof e);let t=e.rgb(),o=this.rgb(),s=n===void 0?.5:n,i=2*s-1,r=t.alpha()-o.alpha(),c=((i*r===-1?i:(i+r)/(1+i*r))+1)/2,a=1-c;return S.rgb(c*t.red()+a*o.red(),c*t.green()+a*o.green(),c*t.blue()+a*o.blue(),t.alpha()*s+o.alpha()*(1-s))}};for(let e of Object.keys(A)){if(sn.includes(e))continue;let{channels:n}=A[e];S.prototype[e]=function(...t){return this.model===e?new S(this):t.length>0?new S(t,e):new S([...rt(A[this.model][e].raw(this.color)),this.valpha],e)},S[e]=function(...t){let o=t[0];return typeof o=="number"&&(o=ue(t,n)),new S(o,e)}}function ot(e,n){return Number(e.toFixed(n))}function st(e){return function(n){return ot(n,e)}}function v(e,n,t){e=Array.isArray(e)?e:[e];for(let o of e)(Q[o]||(Q[o]=[]))[n]=t;return e=e[0],function(o){let s;return o!==void 0?(t&&(o=t(o)),s=this[e](),s.color[n]=o,s):(s=this[e]().color[n],t&&(s=t(s)),s)}}function C(e){return function(n){return Math.max(0,Math.min(e,n))}}function rt(e){return Array.isArray(e)?e:[e]}function ue(e,n){for(let t=0;t<n;t++)typeof e[t]!="number"&&(e[t]=0);return e}rn.exports=S});var hn=$((Do,dn)=>{var an=cn(),ne={primary:"brand-mid","primary-foreground":"onbrand-mid",secondary:"neutral-subtle","secondary-foreground":"neutral-strong",destructive:"negative-mid","destructive-foreground":"onnegative-mid",background:"layer-below",foreground:"neutral-strong",card:"layer-raised","card-foreground":"neutral-strong",popover:"layer-popover","popover-foreground":"neutral-strong",muted:"neutral-subtle","muted-foreground":"neutral-mid",accent:"neutral-subtle","accent-foreground":"neutral-strong",border:"neutral-subtle",ring:"brand-mid","sidebar-foreground":"neutral-strong","sidebar-primary":"brand-mid","sidebar-primary-foreground":"onbrand-mid","sidebar-accent":"neutral-subtle","sidebar-accent-foreground":"neutral-strong","sidebar-border":"neutral-subtle","sidebar-ring":"brand-mid",success:"positive-mid","success-foreground":"onpositive-mid",info:"info-mid","info-foreground":"oninfo-mid",warning:"warning-mid","warning-foreground":"onwarning-mid",invert:"inverse-mid","invert-foreground":"neutral-low"},it={brand:"#00858a",neutral:"#71717a",radius:"md"},ct=[...Object.keys(ne),"input"].sort((e,n)=>n.length-e.length);function at(e){return e.split(/\s+/).filter(Boolean).map(ln).join(" ")}function lt(e){let n=0,t=-1;for(let o=0;o<e.length;o+=1){let s=e[o];s==="["&&(n+=1),s==="]"&&(n=Math.max(0,n-1)),s===":"&&n===0&&(t=o)}return t===-1?{prefix:"",base:e}:{prefix:e.slice(0,t+1),base:e.slice(t+1)}}function ln(e){if(!e)return e;let{prefix:n,base:t}=lt(e),o=t.match(/^(.*?)(\/\d{1,3})$/),s=o?o[1]:t,i=o?o[2]:"";if(s==="bg-black")return`${n}bg-overlay`;for(let r of ct){if(!s.endsWith(r))continue;let c=s.slice(0,s.length-r.length);if(!c.endsWith("-"))continue;let a=c.slice(0,-1);if(a)return r==="input"?`${n}${a}-${a==="bg"?"layer-control":"neutral-subtle"}${i}`:`${n}${a}-${ne[r]}${i}`}return e}var ut=new Set(["chart-1","chart-2","chart-3","chart-4","chart-5","sidebar","radius"]),un=/--(?:chart-\d+|sidebar(?:-[a-z-]+)?|radius)\s*:[^;{}]+;/gi;function ft(e){if(!e)return"";let n=new Set,t=[],o=e.match(un)||[];for(let s of o){let i=s.replace(/\s+/g," ").trim(),r=i.slice(0,i.indexOf(":")).trim();n.has(r)||(n.add(r),t.push(` ${i}`))}return t.length===0?"":`:root {
4
- ${t.join(`
5
- `)}
6
- }
7
- `}function dt(e){if(!e)return{scaffold:"",custom:""};let n=s=>/^\s*@(?:import|plugin|source|config|reference)\b/.test(s),t=[],o=[];for(let s of e.split(`
8
- `))(n(s)?t:o).push(s);return{scaffold:t.join(`
9
- `).trim(),custom:o.join(`
10
- `).replace(/\n{3,}/g,`
11
-
12
- `).trim()}}function X(e){let n={},t=/--([a-z0-9-]+)\s*:\s*([^;{}]+);/gi,o;for(;o=t.exec(e||"");)n[o[1].toLowerCase()]=o[2].trim();return n}function fe(e,n){let t=n.exec(e||"");if(!t)return"";let o=(e||"").indexOf("{",t.index);if(o===-1)return"";let s=0;for(let i=o;i<e.length;i+=1){let r=e[i];if(r==="{"&&(s+=1),r==="}"&&(s-=1),s===0)return e.slice(o+1,i)}return""}function fn(e){let n=e||"",t=fe(n,/:root\s*(?:,\s*:host\s*)?/i),o=fe(n,/(?:\.dark|:root\.dark|\[data-theme=["']?dark["']?\])\s*/i)||fe(n,/@media\s*\(\s*prefers-color-scheme\s*:\s*dark\s*\)\s*/i);return{light:Object.keys(X(t)).length?X(t):X(n),dark:X(o)}}function ee(e){if(!e)return null;let n=String(e).trim(),t=n.match(/^#([0-9a-f]{3,8})$/i);if(t){let s=t[1];return s.length===3||s.length===4?`#${s[0]}${s[0]}${s[1]}${s[1]}${s[2]}${s[2]}`.toLowerCase():`#${s.slice(0,6)}`.toLowerCase()}try{if(/^hsl(a)?\(/i.test(n)||/^rgb(a)?\(/i.test(n))return an(n).hex().toLowerCase();if(/^-?\d+(\.\d+)?\s+[\d.]+%\s+[\d.]+%(?:\s*\/\s*[\d.]+%?)?$/.test(n))return an(`hsl(${n})`).hex().toLowerCase()}catch{return null}let o=n.match(/^oklch\(\s*([.\d]+%?)\s+([.\d]+)\s+([.\d]+)(?:deg)?(?:\s*\/\s*[\d.]+%?)?\s*\)$/i);if(o){let s=o[1].endsWith("%")?Number(o[1].slice(0,-1))/100:Number(o[1]),i=Number(o[2]),r=Number(o[3]);if([s,i,r].every(Number.isFinite))return gt({l:s,c:i,h:r})}return null}function ht(e){return e<0?0:e>1?1:e}function de(e){return e<=.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055}function he(e){return Math.round(ht(e)*255).toString(16).padStart(2,"0")}function gt({l:e,c:n,h:t}){let o=t*Math.PI/180,s=n*Math.cos(o),i=n*Math.sin(o),r=e+.3963377774*s+.2158037573*i,c=e-.1055613458*s-.0638541728*i,a=e-.0894841775*s-1.291485548*i,l=r*r*r,u=c*c*c,f=a*a*a,g=1.2270138511*l-.5577999807*u+.281256149*f,p=-.0405801784*l+1.1122568696*u-.0716766787*f,b=-.0763812845*l-.4214819784*u+1.5861632204*f,y=g*3.2404542-p*1.5371385-b*.4985314,x=-g*.969266+p*1.8760108+b*.041556,k=g*.0556434-p*.2040259+b*1.0572252;return`#${he(de(y))}${he(de(x))}${he(de(k))}`}function pt(e){let n=String(e||"").trim();if(!n||n.includes("var("))return;let t=parseFloat(n);if(!Number.isFinite(t))return;let o=n.endsWith("px")?t/16:t;return o===0?"none":o<=.25?"sm":o<=.5?"md":o<=.75?"lg":o<=1?"xl":o<=1.5?"2xl":"3xl"}function mt(e){let{light:n}=fn(e),t=0,o={...it},s={};for(let[c,a]of Object.entries(n)){let l=ne[c],u=ee(a);!l||!u||(t+=1,l==="brand-mid"&&(o.brand=u),l==="neutral-mid"&&(o.neutral=u),l==="negative-mid"&&(s.negative=u),l==="positive-mid"&&(s.positive=u),l==="warning-mid"&&(s.warning=u),l==="info-mid"&&(s.info=u))}let i=ee(n["muted-foreground"])||ee(n.foreground);i&&(o.neutral=i,t+=1);let r=pt(n.radius);return r&&(o.radius=r,t+=1),Object.keys(s).length>0&&(o.status=s),t>0?o:null}dn.exports={SHADCN_FF_TOKEN_MAP:ne,CSSVAR_TOKENS:ut,SHADCN_CSSVAR_PATTERN:un,shadcnToFf:at,shadcnTokenToFf:ln,extractShadcnCssVars:ft,liftHostCustomCss:dt,parseShadcnThemeVars:fn,shadcnCssVarsToThemeStudioRecipe:mt,normalizeHex:ee}});var pn=$((No,gn)=>{var ge={lucide:["lucide-react"],tabler:["@tabler/icons-react"],hugeicons:["@hugeicons/react","@hugeicons/core-free-icons"],phosphor:["@phosphor-icons/react"],remixicon:["@remixicon/react"]};function yt(e,n){let t=e&&e.iconLibrary||n||"lucide";return ge[t]?t:"lucide"}function bt(e,n){return typeof e!="string"?e:e.replace(/(from\s+["']\.\/adapters\/)[a-z]+(["'])/,`$1${n}$2`)}function vt(e,n){return(e||[]).filter(t=>{let o=String(t).replace(/\.(tsx|ts|jsx|js)$/,"");return!!ge[o]&&o!==n})}gn.exports={ICON_LIBRARY_DEPS:ge,resolveIconLibraryName:yt,swapIconAdapterImport:bt,adapterFilesToPrune:vt}});var mn=$((Ro,wt)=>{wt.exports={name:"@frontfriend/tailwind",version:"4.0.17",description:"Design token management for Tailwind CSS",main:"./dist/index.js",types:"./dist/types/index.d.ts",bin:{frontfriend:"dist/cli.js"},exports:{".":{types:"./dist/types/index.d.ts",browser:"./dist/browser.mjs",import:"./dist/index.mjs",require:"./dist/index.js",default:"./dist/index.js"},"./runtime":{types:"./dist/runtime.d.ts",default:"./dist/runtime.js"},"./next":{types:"./dist/next.d.ts",default:"./dist/next.js"},"./vite":{types:"./dist/vite.d.ts",default:"./dist/vite.mjs"},"./lib/react/utils":{types:"./dist/lib/react/utils.d.ts",default:"./dist/lib/react/utils.mjs"},"./lib/vue/utils":{types:"./dist/lib/vue/utils.d.ts",default:"./dist/lib/vue/utils.mjs"},"./ffdc":{types:"./dist/ffdc.d.ts",default:"./dist/ffdc.js"},"./theme":"./src/theme.css","./theme.css":"./src/theme.css","./components-config-schema":{types:"./dist/components-config-schema.d.ts",require:"./dist/components-config-schema.js",import:"./dist/components-config-schema.js",default:"./dist/components-config-schema.js"}},scripts:{test:"jest",build:"node scripts/build.js",prepublishOnly:"npm run build"},keywords:["tailwindcss","design-tokens","frontfriend"],author:"Donux",license:"SEE LICENSE IN LICENSE",files:["dist/","src/theme.css","scripts/","README.md","LICENSE"],dependencies:{commander:"^11.0.0",dotenv:"^16.0.0",color:"^4.2.3",clsx:"^2.0.0","tailwind-merge":"^2.0.0","tw-animate-css":"^1.3.4"},peerDependencies:{tailwindcss:"^3.0.0 || ^4.0.0","tw-animate-css":"^1.3.0",react:"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",vue:">=3.0.0"},devDependencies:{jest:"^29.0.0",esbuild:"^0.19.0",glob:"^10.0.0"}}});var me=$((Uo,pe)=>{var E=require("fs"),J=require("path");function yn(e={}){let n=e.projectRoot||process.cwd(),t=J.join(n,"node_modules",".cache","frontfriend","icons.json"),o=e.outputPath||J.join(n,"types","frontfriend.d.ts");E.existsSync(t)||(console.error('[FrontFriend] Error: icons.json not found. Please run "npx frontfriend init" first.'),process.exit(1));try{let a=function(b){for(let y of Object.values(b))typeof y=="string"?c.add(y):typeof y=="object"&&y!==null&&a(y)},l=function(b,y=" "){let x=[];for(let[k,_]of Object.entries(b))typeof _=="string"?x.push(`${y}${k}: '${_}';`):typeof _=="object"&&_!==null&&(x.push(`${y}${k}: {`),x.push(l(_,y+" ")),x.push(`${y}};`));return x.join(`
13
- `)};var s=a,i=l;let r=JSON.parse(E.readFileSync(t,"utf-8")),c=new Set;a(r);let u=Array.from(c).map(b=>`'${b}'`).join(" | "),f=`// Generated by @frontfriend/tailwind
2
+ var L=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports);var O=L((jn,ee)=>{var Ee="https://app.dev.frontfriend.dev",Le="https://registry-legacy.frontfriend.dev",Ae=".cache/frontfriend",Pe={JS:["tokens.js","variables.js","semanticVariables.js","semanticDarkVariables.js","safelist.js","custom.js"],JSON:["fonts.json","icons.json","components-config.json","version.json","metadata.json"]},De={FF_ID:"FF_ID",FF_API_URL:"FF_API_URL",FF_USE_LOCAL:"FF_USE_LOCAL",FF_AUTH_TOKEN:"FF_AUTH_TOKEN"};ee.exports={DEFAULT_API_URL:Ee,LEGACY_API_URL:Le,CACHE_DIR_NAME:Ae,CACHE_TTL_DAYS:7,CACHE_TTL_MS:6048e5,CACHE_FILES:Pe,ENV_VARS:De}});var fe=L((kn,le)=>{var b=require("fs"),ne=require("path"),Re=require("os"),Ue=require("https"),Oe=require("http"),{URL:Ne}=require("url"),{DEFAULT_API_URL:oe}=O(),te=ne.join(Re.homedir(),".frontfriend"),T=ne.join(te,"credentials");function qe(){return T}function se(){try{return b.existsSync(T)?JSON.parse(b.readFileSync(T,"utf8")):null}catch{return null}}function re(e){b.mkdirSync(te,{recursive:!0,mode:448}),b.writeFileSync(T,`${JSON.stringify(e,null,2)}
3
+ `,{mode:384});try{b.chmodSync(T,384)}catch{}}function Me(){return b.existsSync(T)?(b.unlinkSync(T),!0):!1}function ie(e,n=60*1e3){return!(e!=null&&e.accessToken)||!e.expiresAt||Date.now()+n>=e.expiresAt}function D(e){let n=new Error(`${e}. Run \`frontfriend login\` to re-authenticate.`);return n.code="FF_AUTH_REFRESH_FAILED",n}function ce(e,n,o){return new Promise((t,s)=>{let r=new Ne(e),i=r.protocol==="https:"?Ue:Oe,f=JSON.stringify(n||{}),c=i.request({hostname:r.hostname,port:r.port,path:`${r.pathname}${r.search}`,method:"POST",headers:{"content-type":"application/json","content-length":Buffer.byteLength(f),...o?{authorization:`Bearer ${o}`}:{}}},l=>{let u="";l.on("data",g=>{u+=g}),l.on("end",()=>{if(l.statusCode>=300&&l.statusCode<400){let p=l.headers.location?` to ${l.headers.location}`:"",m=new Error(`HTTP ${l.statusCode}: redirected${p}`);m.statusCode=l.statusCode,m.body=u,s(m);return}let g=null;try{g=u?JSON.parse(u):null}catch{let m=l.headers["content-type"]||"unknown content-type",y=new Error(`Expected JSON from FrontFriend API at ${e}, but received ${m} (HTTP ${l.statusCode}). Check FF_API_URL or pass --api-url with the FrontFriend app URL.`);if(y.statusCode=l.statusCode,y.body=u,l.statusCode>=400){s(y);return}s(y);return}if(l.statusCode>=400){let p=new Error((g==null?void 0:g.error_description)||(g==null?void 0:g.error)||`HTTP ${l.statusCode}`);p.statusCode=l.statusCode,p.body=g,s(p);return}t(g)})});c.on("error",s),c.write(f),c.end()})}async function ae(e,n=oe){if(!(e!=null&&e.refreshToken)||!(e!=null&&e.deviceId))throw D("FrontFriend session expired");let o;try{o=await ce(`${n}/api/plugin/token`,{grant_type:"refresh_token",refresh_token:e.refreshToken,device_id:e.deviceId})}catch(s){throw D((s==null?void 0:s.message)||"Could not refresh FrontFriend session")}if(!(o!=null&&o.access_token)||!(o!=null&&o.refresh_token))throw D("Could not refresh FrontFriend session");let t={accessToken:o.access_token,refreshToken:o.refresh_token,deviceId:o.device_id||e.deviceId,expiresAt:Date.now()+(o.expires_in||900)*1e3,refreshExpiresAt:Date.now()+(o.refresh_expires_in||604800)*1e3,ffApiUrl:n};return re(t),t}async function Ve(e={}){if(!e.skipCredentials){let n=se();if(n!=null&&n.accessToken||n!=null&&n.refreshToken){let o=e.baseURL||n.ffApiUrl||oe;return n.accessToken&&!ie(n)?n.accessToken:(await ae(n,o)).accessToken}}return e.envToken?e.envToken:e.legacyToken?(e.silent||console.warn("\u26A0\uFE0F auth-token in frontfriend.config.js is deprecated. Run `frontfriend login` to store credentials outside the repo."),e.legacyToken):null}le.exports={getCredentialsPath:qe,readCredentials:se,writeCredentials:re,deleteCredentials:Me,isExpired:ie,postJson:ce,refreshCredentials:ae,resolveAuthToken:Ve,createAuthRefreshError:D}});var ue=L(($n,de)=>{var N={lucide:["lucide-react"],tabler:["@tabler/icons-react"],hugeicons:["@hugeicons/react","@hugeicons/core-free-icons"],phosphor:["@phosphor-icons/react"],remixicon:["@remixicon/react"]};function Je(e,n){let o=e&&e.iconLibrary||n||"lucide";return N[o]?o:"lucide"}function Ge(e,n){return typeof e!="string"?e:e.replace(/(from\s+["']\.\/adapters\/)[a-z]+(["'])/,`$1${n}$2`)}function He(e,n){return(e||[]).filter(o=>{let t=String(o).replace(/\.(tsx|ts|jsx|js)$/,"");return!!N[t]&&t!==n})}de.exports={ICON_LIBRARY_DEPS:N,resolveIconLibraryName:Je,swapIconAdapterImport:Ge,adapterFilesToPrune:He}});var ge=L((bn,Be)=>{Be.exports={name:"@frontfriend/tailwind",version:"4.0.18",description:"Design token management for Tailwind CSS",main:"./dist/index.js",types:"./dist/types/index.d.ts",bin:{frontfriend:"dist/cli.js"},exports:{".":{types:"./dist/types/index.d.ts",browser:"./dist/browser.mjs",import:"./dist/index.mjs",require:"./dist/index.js",default:"./dist/index.js"},"./runtime":{types:"./dist/runtime.d.ts",default:"./dist/runtime.js"},"./next":{types:"./dist/next.d.ts",default:"./dist/next.js"},"./vite":{types:"./dist/vite.d.ts",default:"./dist/vite.mjs"},"./lib/react/utils":{types:"./dist/lib/react/utils.d.ts",default:"./dist/lib/react/utils.mjs"},"./lib/vue/utils":{types:"./dist/lib/vue/utils.d.ts",default:"./dist/lib/vue/utils.mjs"},"./ffdc":{types:"./dist/ffdc.d.ts",default:"./dist/ffdc.js"},"./theme":"./src/theme.css","./theme.css":"./src/theme.css","./components-config-schema":{types:"./dist/components-config-schema.d.ts",require:"./dist/components-config-schema.js",import:"./dist/components-config-schema.js",default:"./dist/components-config-schema.js"}},scripts:{test:"jest",build:"node scripts/build.js",prepublishOnly:"npm run build"},keywords:["tailwindcss","design-tokens","frontfriend"],author:"Donux",license:"SEE LICENSE IN LICENSE",files:["dist/","src/theme.css","scripts/","README.md","LICENSE"],dependencies:{commander:"^11.0.0",dotenv:"^16.0.0",color:"^4.2.3",clsx:"^2.0.0","tailwind-merge":"^2.0.0","tw-animate-css":"^1.3.4"},peerDependencies:{tailwindcss:"^3.0.0 || ^4.0.0","tw-animate-css":"^1.3.0",react:"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",vue:">=3.0.0"},devDependencies:{jest:"^29.0.0",esbuild:"^0.19.0",glob:"^10.0.0"}}});var M=L((Tn,q)=>{var x=require("fs"),A=require("path");function pe(e={}){let n=e.projectRoot||process.cwd(),o=A.join(n,"node_modules",".cache","frontfriend","icons.json"),t=e.outputPath||A.join(n,"types","frontfriend.d.ts");x.existsSync(o)||(console.error('[FrontFriend] Error: icons.json not found. Please run "npx frontfriend init" first.'),process.exit(1));try{let c=function(y){for(let w of Object.values(y))typeof w=="string"?f.add(w):typeof w=="object"&&w!==null&&c(w)},l=function(y,w=" "){let j=[];for(let[k,$]of Object.entries(y))typeof $=="string"?j.push(`${w}${k}: '${$}';`):typeof $=="object"&&$!==null&&(j.push(`${w}${k}: {`),j.push(l($,w+" ")),j.push(`${w}};`));return j.join(`
4
+ `)};var s=c,r=l;let i=JSON.parse(x.readFileSync(o,"utf-8")),f=new Set;c(i);let u=Array.from(f).map(y=>`'${y}'`).join(" | "),g=`// Generated by @frontfriend/tailwind
14
5
  // DO NOT EDIT THIS FILE MANUALLY
15
6
 
16
7
  import type { IconSetStructure } from '@frontfriend/tailwind';
@@ -21,7 +12,7 @@ declare module '@frontfriend/tailwind' {
21
12
 
22
13
  // Typed iconSet structure with exact icon names
23
14
  export interface TypedIconSet extends IconSetStructure {
24
- ${l(r)}
15
+ ${l(i)}
25
16
  }
26
17
  }
27
18
 
@@ -45,48 +36,48 @@ declare module '@/src/components/ui/icon' {
45
36
  declare module '@/src/components/ui/icon/Icon.vue' {
46
37
  export type IconName = ${u||"string"};
47
38
  }
48
- `,g=J.dirname(o);E.existsSync(g)||E.mkdirSync(g,{recursive:!0}),E.writeFileSync(o,f),console.log("[FrontFriend] \u2713 Generated types at",J.relative(n,o));let p=J.join(n,"tsconfig.json");if(E.existsSync(p)){let b=JSON.parse(E.readFileSync(p,"utf-8"));b.include||(b.include=[]);let y="types/**/*.d.ts";b.include.includes(y)||(b.include.push(y),E.writeFileSync(p,JSON.stringify(b,null,2)),console.log("[FrontFriend] \u2713 Updated tsconfig.json to include generated types"))}}catch(r){console.error("[FrontFriend] Error generating icon types:",r.message),process.exit(1)}}require.main===pe&&yn();pe.exports={generateIconTypes:yn}});var{loadEnvLocal:xt}=require("./lib/core/env-utils");xt();var{Command:Ct}=require("commander"),G=require("./lib/core/config-loader"),D=require("./lib/core/cache-manager"),{APIClient:wn}=require("./lib/core/api-client"),{getCredentialsPath:kt,writeCredentials:St,readCredentials:Ft,deleteCredentials:$t,postJson:ye}=qe(),{ComponentDownloader:jt}=require("./lib/core/component-downloader"),At=require("./lib/core/token-processor"),{shadcnToFf:Tt,liftHostCustomCss:_t,shadcnCssVarsToThemeStudioRecipe:It}=hn(),{ICON_LIBRARY_DEPS:Ce,resolveIconLibraryName:Ot,swapIconAdapterImport:Et,adapterFilesToPrune:Mt}=pn(),{DEFAULT_API_URL:be}=re(),{ConfigError:M,APIError:Lt,CacheError:ke}=require("./lib/core/errors"),h=require("path"),m=require("fs"),{spawn:Pt}=require("child_process"),T=new Ct,{version:xn}=mn(),Dt="https://registry.frontfriend.dev/r/v4",bn='@import "@frontfriend/tailwind/theme.css";',Cn=["app/globals.css","src/app/globals.css","styles/globals.css","src/styles/globals.css","src/styles.css","src/index.css","src/style.css"];function Nt(e){let n=(e||process.env.FF_REGISTRY_URL||Dt).replace(/\/+$/,"");return/\/r\/(legacy|v4)$/i.test(n)?n:`${n}/r/v4`}function I(e){try{return JSON.parse(m.readFileSync(e,"utf8"))}catch{return null}}function H(e,n){m.mkdirSync(h.dirname(e),{recursive:!0}),m.writeFileSync(e,`${JSON.stringify(n,null,2)}
49
- `)}var kn=h.join("node_modules",".cache","frontfriend","migrated-components.json");function Sn(e){let n=I(h.join(e,"package.json"))||{},t={...n.dependencies||{},...n.devDependencies||{}};return t.vue||t["@vitejs/plugin-vue"]||t.nuxt?"vue":"react"}function Rt(e){let n=I(h.join(e,"package.json"))||{},t={...n.dependencies||{},...n.devDependencies||{}};return t.next||m.existsSync(h.join(e,"next.config.js"))||m.existsSync(h.join(e,"next.config.mjs"))?"next":t.vite||m.existsSync(h.join(e,"vite.config.ts"))||m.existsSync(h.join(e,"vite.config.js"))?"vite":null}function Ut(e,n,t){let o=h.join(e,"components.json");if(!m.existsSync(o))return!1;let s=I(o)||{};s.registries=s.registries||{};let i=`${Nt(t)}/${n}/{name}.json`,r=Ce[s.iconLibrary]?s.iconLibrary:void 0,c=r&&r!=="lucide"?{url:i,params:{iconLibrary:r}}:i;return JSON.stringify(s.registries["@frontfriend"])===JSON.stringify(c)?!1:(s.registries["@frontfriend"]=c,H(o,s),!0)}function qt(e){let n=h.join(e,"package.json"),t=I(n);return t?(t.dependencies=t.dependencies||{},t.dependencies["@frontfriend/tailwind"]?!1:(t.dependencies["@frontfriend/tailwind"]="^4.0.0",H(n,t),!0)):!1}function zt(e){let n=["next.config.js","next.config.mjs","next.config.ts"].map(t=>h.join(e,t)).find(t=>m.existsSync(t));return n?m.readFileSync(n,"utf8").includes("@frontfriend/tailwind/next")?"present":"manual":(m.writeFileSync(h.join(e,"next.config.js"),`const frontfriend = require('@frontfriend/tailwind/next');
39
+ `,p=A.dirname(t);x.existsSync(p)||x.mkdirSync(p,{recursive:!0}),x.writeFileSync(t,g),console.log("[FrontFriend] \u2713 Generated types at",A.relative(n,t));let m=A.join(n,"tsconfig.json");if(x.existsSync(m)){let y=JSON.parse(x.readFileSync(m,"utf-8"));y.include||(y.include=[]);let w="types/**/*.d.ts";y.include.includes(w)||(y.include.push(w),x.writeFileSync(m,JSON.stringify(y,null,2)),console.log("[FrontFriend] \u2713 Updated tsconfig.json to include generated types"))}}catch(i){console.error("[FrontFriend] Error generating icon types:",i.message),process.exit(1)}}require.main===q&&pe();q.exports={generateIconTypes:pe}});var{loadEnvLocal:Ye}=require("./lib/core/env-utils");Ye();var{Command:We}=require("commander"),_=require("./lib/core/config-loader"),R=require("./lib/core/cache-manager"),{APIClient:G}=require("./lib/core/api-client"),{getCredentialsPath:Ke,writeCredentials:ze,readCredentials:Xe,deleteCredentials:Ze,postJson:V}=fe(),{ComponentDownloader:Qe}=require("./lib/core/component-downloader"),en=require("./lib/core/token-processor"),{ICON_LIBRARY_DEPS:ye,resolveIconLibraryName:nn,swapIconAdapterImport:on,adapterFilesToPrune:tn}=ue(),{DEFAULT_API_URL:J}=O(),{ConfigError:C,APIError:H,CacheError:B}=require("./lib/core/errors"),a=require("path"),d=require("fs"),{spawn:sn}=require("child_process"),v=new We,{version:we}=ge(),rn="https://registry.frontfriend.dev/r/v4",me='@import "@frontfriend/tailwind/theme.css";',Se=["app/globals.css","src/app/globals.css","styles/globals.css","src/styles/globals.css","src/styles.css","src/index.css","src/style.css"];function cn(e){let n=(e||process.env.FF_REGISTRY_URL||rn).replace(/\/+$/,"");return/\/r\/(legacy|v4)$/i.test(n)?n:`${n}/r/v4`}function F(e){try{return JSON.parse(d.readFileSync(e,"utf8"))}catch{return null}}function U(e,n){d.mkdirSync(a.dirname(e),{recursive:!0}),d.writeFileSync(e,`${JSON.stringify(n,null,2)}
40
+ `)}var ve=a.join("node_modules",".cache","frontfriend","migrated-components.json");function Y(e){let n=F(a.join(e,"package.json"))||{},o={...n.dependencies||{},...n.devDependencies||{}};return o.vue||o["@vitejs/plugin-vue"]||o.nuxt?"vue":"react"}function an(e){let n=F(a.join(e,"package.json"))||{},o={...n.dependencies||{},...n.devDependencies||{}};return o.next||d.existsSync(a.join(e,"next.config.js"))||d.existsSync(a.join(e,"next.config.mjs"))?"next":o.vite||d.existsSync(a.join(e,"vite.config.ts"))||d.existsSync(a.join(e,"vite.config.js"))?"vite":null}function ln(e,n,o){let t=a.join(e,"components.json");if(!d.existsSync(t))return!1;let s=F(t)||{};s.registries=s.registries||{};let r=`${cn(o)}/${n}/{name}.json`,i=ye[s.iconLibrary]?s.iconLibrary:void 0,f=i&&i!=="lucide"?{url:r,params:{iconLibrary:i}}:r;return JSON.stringify(s.registries["@frontfriend"])===JSON.stringify(f)?!1:(s.registries["@frontfriend"]=f,U(t,s),!0)}function fn(e){let n=a.join(e,"package.json"),o=F(n);return o?(o.dependencies=o.dependencies||{},o.dependencies["@frontfriend/tailwind"]?!1:(o.dependencies["@frontfriend/tailwind"]="^4.0.0",U(n,o),!0)):!1}function dn(e){let n=["next.config.js","next.config.mjs","next.config.ts"].map(o=>a.join(e,o)).find(o=>d.existsSync(o));return n?d.readFileSync(n,"utf8").includes("@frontfriend/tailwind/next")?"present":"manual":(d.writeFileSync(a.join(e,"next.config.js"),`const frontfriend = require('@frontfriend/tailwind/next');
50
41
 
51
42
  module.exports = frontfriend({});
52
- `),"created")}function Vt(e){let n=["vite.config.ts","vite.config.js","vite.config.mjs"].map(t=>h.join(e,t)).find(t=>m.existsSync(t));return n?m.readFileSync(n,"utf8").includes("@frontfriend/tailwind/vite")?"present":"manual":(m.writeFileSync(h.join(e,"vite.config.ts"),`import { defineConfig } from 'vite';
43
+ `),"created")}function un(e){let n=["vite.config.ts","vite.config.js","vite.config.mjs"].map(o=>a.join(e,o)).find(o=>d.existsSync(o));return n?d.readFileSync(n,"utf8").includes("@frontfriend/tailwind/vite")?"present":"manual":(d.writeFileSync(a.join(e,"vite.config.ts"),`import { defineConfig } from 'vite';
53
44
  import frontfriend from '@frontfriend/tailwind/vite';
54
45
 
55
46
  export default defineConfig({
56
47
  plugins: [frontfriend()],
57
48
  });
58
- `),"created")}function Bt(e){let n=Cn.find(t=>m.existsSync(h.join(e,t)));return n?h.join(e,n):null}function Jt(e){let t=Cn.find(s=>m.existsSync(h.join(e,s)))||"app/globals.css",o=h.join(e,t);return m.mkdirSync(h.dirname(o),{recursive:!0}),m.existsSync(o)||m.writeFileSync(o,""),{fullPath:o,relativePath:t}}function Ht(e){let{fullPath:n,relativePath:t}=Jt(e),o=m.readFileSync(n,"utf8");return o.includes(bn)?{changed:!1,relativePath:t}:(m.writeFileSync(n,`${bn}
59
- ${o}`),{changed:!0,relativePath:t})}function Gt(e,n={}){let t=h.join(e,"components.json");if(!m.existsSync(t))return{isShadcnProject:!1,changes:[]};let o=Sn(e),s=Rt(e),i=[],r=[];if(Ut(e,o,n.registryUrl)&&i.push(`registered @frontfriend registry for ${o}`),qt(e)&&i.push("added @frontfriend/tailwind dependency"),s==="next"){let a=zt(e);a==="created"&&i.push("created next.config.js with the FrontFriend plugin"),a==="manual"&&r.push('wrap your existing next.config with `require("@frontfriend/tailwind/next")(...)`')}if(s==="vite"){let a=Vt(e);a==="created"&&i.push("created vite.config.ts with the FrontFriend plugin"),a==="manual"&&r.push("add `frontfriend()` from `@frontfriend/tailwind/vite` to your existing vite.config plugins array")}let c=Ht(e);return c.changed&&i.push(`imported bundled theme in ${c.relativePath}`),{isShadcnProject:!0,changes:i,manualSteps:r,framework:o,buildTool:s}}function Kt(e){return new Promise(n=>setTimeout(n,e))}function Wt(e){let n=process.platform==="darwin"?"open":process.platform==="win32"?"cmd":"xdg-open",t=process.platform==="win32"?["/c","start","",e]:[e];try{return Pt(n,t,{detached:!0,stdio:"ignore"}).unref(),!0}catch{return!1}}function Yt(e){e.isShadcnProject&&(console.log("\u{1F9E9} shadcn project wiring"),e.changes.length===0?console.log(" \u2713 Already configured"):e.changes.forEach(n=>console.log(` \u2713 ${n}`)),e.manualSteps&&e.manualSteps.length>0&&(console.log(" \u26A0 Manual steps required (existing config left untouched):"),e.manualSteps.forEach(n=>console.log(` \u2022 ${n}`))),console.log(` Next: npx shadcn add @frontfriend/button
60
- `))}function Zt(e,n){let t=e.indexOf(`${n}:`);if(t===-1)return null;let o=e.indexOf("{",t);if(o===-1)return null;let s=0;for(let i=o;i<e.length;i+=1){let r=e[i];if(r==="{"&&(s+=1),r==="}"&&(s-=1),s===0)return e.slice(o+1,i)}return null}function Qt(e){let n={},t=/([A-Za-z0-9_-]+):\s*(['"`])([\s\S]*?)\2/g,o;for(;o=t.exec(e||"");)n[o[1]]=o[3].replace(/\s+/g," ").trim();return n}function Xt(e,n){let t=n;for(;/\s|,/.test(e[t]||"");)t+=1;let o=e[t];if(o==='"'||o==="'"||o==="`"){let i=e.indexOf(o,t+1);return i===-1?null:{name:e.slice(t+1,i),end:i+1}}let s=e.slice(t).match(/^([A-Za-z0-9_-]+)/);return s?{name:s[1],end:t+s[1].length}:null}function eo(e){let n={},t=0;for(;t<(e||"").length;){let o=Xt(e,t);if(!o){t+=1;continue}for(t=o.end;/\s/.test(e[t]||"");)t+=1;if(e[t]!==":")continue;for(t+=1;/\s/.test(e[t]||"");)t+=1;if(e[t]!=="{")continue;let s=0,i=t;for(;t<e.length;t+=1)if(e[t]==="{"&&(s+=1),e[t]==="}"&&(s-=1),s===0){n[o.name]=Qt(e.slice(i+1,t)),t+=1;break}}return n}function te(e){return String(e||"").replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/[_\s]+/g,"-").toLowerCase()}function no(e){return String(e||"").replace(/-([a-z0-9])/g,(n,t)=>t.toUpperCase())}function to(e){return String(e||"").replace(/(^|[-_\s]+)([a-z0-9])/g,(n,t,o)=>o.toUpperCase())}function ve(e,n,t,o){let s=0,i=null,r=!1;for(let c=n;c<e.length;c+=1){let a=e[c];if(i){r?r=!1:a==="\\"?r=!0:a===i&&(i=null);continue}if(a==='"'||a==="'"||a==="`"){i=a;continue}if(a===t&&(s+=1),a===o&&(s-=1),s===0)return c}return-1}function oo(e){let n=[],t=/(?:export\s+)?function\s+([A-Z][A-Za-z0-9_]*)\s*\(/g,o;for(;o=t.exec(e);){let i=o[1],r=e.indexOf("(",o.index),c=r===-1?-1:ve(e,r,"(",")"),a=c===-1?-1:e.indexOf("{",c);if(a===-1)continue;let l=ve(e,a,"{","}");l!==-1&&(n.push({name:i,body:e.slice(a,l+1)}),t.lastIndex=l+1)}let s=/(?:export\s+)?const\s+([A-Z][A-Za-z0-9_]*)\s*=/g;for(;o=s.exec(e);){let i=o[1],r=o.index,c=e.slice(r+1).search(/\n(?:export\s+)?(?:const|function)\s+[A-Z][A-Za-z0-9_]*\b|\nexport\s*\{/),a=c===-1?e.length:r+1+c;n.push({name:i,body:e.slice(r,a)})}return n}function Se(e,n){let t=e[n],o="",s=!1;for(let i=n+1;i<e.length;i+=1){let r=e[i];if(s){o+=r,s=!1;continue}if(r==="\\"){s=!0;continue}if(r===t)return{value:o,end:i+1};o+=r}return null}function Fn(e){let n=[];for(let t=0;t<e.length;t+=1){let o=e[t];if(o!=='"'&&o!=="'"&&o!=="`")continue;let s=Se(e,t);s&&((o!=="`"||!s.value.includes("${"))&&n.push(s.value.replace(/\s+/g," ").trim()),t=s.end-1)}return n.filter(Boolean)}function so(e,n){let t=n;for(;/\s/.test(e[t]||"");)t+=1;if(e[t]!=="=")return null;for(t+=1;/\s/.test(e[t]||"");)t+=1;if(e[t]==='"'||e[t]==="'"){let o=Se(e,t);return o?{value:o.value,end:o.end}:null}if(e[t]==="{"){let o=ve(e,t,"{","}");return o===-1?null:{expression:e.slice(t+1,o),end:o+1}}return null}function ro(e){let n=e.indexOf("cva(");if(n===-1)return null;let t=n+4;for(;/\s/.test(e[t]||"");)t+=1;if(e[t]!=='"'&&e[t]!=="'"&&e[t]!=="`")return null;let o=Se(e,t);if(!o)return null;let s=o.end;for(;/\s/.test(e[s]||"");)s+=1;return e[s]!==","&&e[s]!==")"?null:o.value.replace(/\s+/g," ").trim()}function io(e){let n=e.match(/\bdata-slot\s*=\s*(?:"([^"]+)"|'([^']+)'|\{\s*["'`]([^"'`]+)["'`]\s*\})/);return n?n[1]||n[2]||n[3]:null}function $n(e,n,t){let o=te(t),s=te(e||n);if(s===o)return"root";if(s.startsWith(`${o}-`))s=s.slice(o.length+1);else{let r=to(t);!e&&n.startsWith(r)&&(s=te(n.slice(r.length)))}let i=s?no(s):"root";return t==="switch"&&i==="thumb"?"trigger":t==="checkbox"&&i==="indicator"?"icon":i}function co(e,n){let t={},o=[];for(let s of oo(e)){let i=/\bclassName\s*=/g,r,c=!1;for(;r=i.exec(s.body);){let a=so(s.body,r.index+9);if(!a){o.push(`${s.name}: unreadable className`);continue}let u=(a.value!==void 0?[a.value]:Fn(a.expression||"")).join(" ").replace(/\s+/g," ").trim();if(!u){o.push(`${s.name}: dynamic className without literal classes`);continue}let f=s.body.lastIndexOf("<",r.index),g=a.end?s.body.indexOf(">",a.end):-1,p=f===-1?"":s.body.slice(f,g===-1?Math.min(s.body.length,a.end+300):g+1),b=io(p);if(!b){o.push(`${s.name}: className on a non-slot element (no data-slot) skipped`);continue}let y=$n(b,s.name,n);t[y]=t[y]?`${t[y]} ${u}`.replace(/\s+/g," ").trim():u,c=!0}!c&&/\bclassName\b/.test(s.body)&&o.push(`${s.name}: className present but no literal classes captured`)}return{slots:t,missed:o}}function ao(e){let n=[],t=/<template(?:\s[^>]*)?>/gi,o;for(;o=t.exec(e);){let s=o.index+o[0].length,i=/<template(?:\s[^>]*)?>|<\/template\s*>/gi;i.lastIndex=s;let r=1,c=e.length,a;for(;a=i.exec(e);)if(a[0][1]==="/"){if(r-=1,r===0){c=a.index;break}}else r+=1;n.push(e.slice(s,c)),t.lastIndex=c}return n}function lo(e,n){let t=null;for(let o=n;o<e.length;o+=1){let s=e[o];if(t){s===t&&(t=null);continue}if(s==='"'||s==="'"){t=s;continue}if(s===">")return o}return-1}function uo(e){let n=[],t=/(?:^|\s)class\s*=\s*(?:"([^"]*)"|'([^']*)')/g,o;for(;o=t.exec(e);)n.push((o[1]||o[2]||"").replace(/\s+/g," ").trim());let s=/(?::|v-bind:)class\s*=\s*(?:"([^"]*)"|'([^']*)')/g;for(;o=s.exec(e);)n.push(...Fn(o[1]||o[2]||""));return n.join(" ").replace(/\s+/g," ").trim()}function fo(e,n){let t={},o=[];for(let s of ao(e)){let i=/\bdata-slot\s*=\s*(?:"([^"]+)"|'([^']+)')/g,r;for(;r=i.exec(s);){let c=r[1]||r[2],a=s.lastIndexOf("<",r.index);if(a===-1)continue;let l=lo(s,a),u=s.slice(a,l===-1?s.length:l+1),f=uo(u);if(!f){o.push(`${n}: data-slot "${c}" has no literal classes`);continue}let g=$n(c,"",n);t[g]=t[g]?`${t[g]} ${f}`.replace(/\s+/g," ").trim():f}}return{slots:t,missed:o}}function se(e,n){if(typeof e=="string")return n(e);if(Array.isArray(e))return e.map(t=>se(t,n));if(e&&typeof e=="object"){let t={};for(let[o,s]of Object.entries(e))t[o]=se(s,n);return t}return e}function ho(e){if(!e||e==="("||e===")"||e==="{"||e==="}"||e==="}:"||e.startsWith("<")||e.startsWith('"')||e.startsWith("...")||e.includes("React.ComponentProps"))return null;let n=e.match(/^\*:([a-z-]+):(.+)$/);if(n)return`[&>*:${n[1]}]:${n[2]}`;let t=e.match(/^\*:(.+)$/);if(t)return`[&>*]:${t[1]}`;let o=e;return o=o.replace(/gap-\[--spacing\(var\(--gap\)\)\]/g,"gap-[calc(var(--gap)*0.25rem)]"),o=o.replace(/(^|:)(-?[a-z][a-z0-9-]*)-\(--([A-Za-z0-9_-]+)\)/g,"$1$2-[var(--$3)]"),o=o.replace(/\[--([A-Za-z0-9_-]+):--spacing\(([-+]?\d*\.?\d+)\)\]/g,(s,i,r)=>{let c=Number(r)*.25,a=Number.isInteger(c)?String(c):String(Number(c.toFixed(4)));return`[--${i}:${a}rem]`}),o=o.replace(/(^|:)data-checked:/g,"$1data-[state=checked]:").replace(/(^|:)data-unchecked:/g,"$1data-[state=unchecked]:"),o}function go(e){return e.split(/\s+/).map(ho).filter(Boolean).join(" ").replace(/\s+/g," ").trim()}var po={button:{variant:{default:"main",outline:"tertiary"}},badge:{variant:{default:"main",outline:"tertiary"}}},mo=new Set(["variant","size","sizes","iconPosition"]);function yo(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var oe=null;function bo(e){if(!oe){let{mergeComponentsConfig:t}=require("./lib/core/default-config");oe=t(null)||{}}let{normalizeComponentKey:n}=require("./lib/core/default-config");return oe[e]||oe[n(e)]||null}function we(e,n,t={}){let o=e.includes("cva(")&&e.includes("variants:"),s=ro(e),i=Zt(e,"variants"),r=eo(i),c=Object.values(r).some(p=>Object.keys(p).length>0),a=t.framework==="vue"?fo(e,n):co(e,n),l=po[n]||{},u={},f=p=>{p&&(u.root=u.root?`${u.root} ${p}`.replace(/\s+/g," ").trim():p)};if(s&&c&&f(s),c)for(let[p,b]of Object.entries(r)){if(Object.keys(b).length===0)continue;let y;mo.has(p)?(u[p]=u[p]||{},y=u[p]):(u.variants=u.variants||{},u.variants[p]=u.variants[p]||{},y=u.variants[p]);let x=l[p]||{};for(let[k,_]of Object.entries(b))y[x[k]||k]=_}for(let[p,b]of Object.entries(a.slots))p==="root"?f(b):(u.slots=u.slots||{},u.slots[p]=b);if(!o&&Object.keys(a.slots).length===0)return{skipped:!0,reason:a.missed.length>0?a.missed.join("; "):`${n} has no cva variants or literal className slots`};if(o&&!c&&Object.keys(a.slots).length===0)return{skipped:!0,reason:"cva component has no variant class maps or literal className slots"};let g=bo(n);return g&&yo(g.root)&&typeof u.root=="string"?{skipped:!0,reason:`${n} uses a nested root object in the canonical schema; migrate's flat extraction can't reproduce it and the runtime would discard it \u2014 skipped to preserve the design system config`}:{skipped:!1,config:{[n]:u},warnings:a.missed}}function vo(...e){let{deepMerge:n}=require("./lib/core/default-config");return e.reduce((t,o)=>n(t,o||{}),{})}function wo(e){let n=require("./lib/core/token-processor"),{mergeComponentsConfig:t}=require("./lib/core/default-config"),o=new n,s=t(e),i=o.extractClassesFromComponentsConfig(s);return{componentsConfig:s,icons:{},safelist:i,classesContent:o.generateClassesContent(i),themeCSS:o.generateThemeCSS({}),metadata:{version:"local-components"}}}function xo(e,n){let t=new D(e),o=t.exists()?t.load()||{}:{},s=vo(o.componentsConfig,n),i=wo(s);return t.save({...o,...i,icons:o.icons||{}}),i.componentsConfig}function xe(e){return h.basename(e).replace(/\.(tsx|ts|jsx|js|vue)$/,"").replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/[_\s]+/g,"-").toLowerCase()}var jn=["tsx","ts","jsx","js","vue"],Fe=/\.(tsx|ts|jsx|js|vue)$/;function Co(e){let n={};for(let t of["tsconfig.json","tsconfig.app.json","jsconfig.json"]){let o=I(h.join(e,t)),s=o&&o.compilerOptions&&o.compilerOptions.paths;s&&Object.assign(n,s)}return n}function ko(e,n){if(!n)return null;let t=Co(e);for(let[o,s]of Object.entries(t))if(!(!Array.isArray(s)||s.length===0)){if(o.endsWith("/*")){let i=o.slice(0,-1);if(n.startsWith(i)){let r=n.slice(i.length),c=s[0].replace(/\*+$/,"");return h.resolve(e,c,r)}}else if(o===n)return h.resolve(e,s[0])}return n.startsWith("@/")?h.resolve(e,"src",n.slice(2)):h.resolve(e,n)}function An(e){let n=I(h.join(e,"components.json")),t=n&&n.aliases&&n.aliases.ui,o=[t?ko(e,t):null,h.join(e,"src","components","ui"),h.join(e,"components","ui")].filter(Boolean);return[...new Set(o)].filter(s=>m.existsSync(s))}function Tn(e,n){let t=I(h.join(e,"components.json")),o=Ot(t,n),s=An(e).flatMap(f=>[h.join(f,"icon","index.tsx"),h.join(f,"icon","Icon.vue")]).find(f=>m.existsSync(f));if(!s)return{changed:!1,iconLibrary:o};let i=m.readFileSync(s,"utf8"),r=Et(i,o),c=r!==i;c&&m.writeFileSync(s,r);let a=h.join(h.dirname(s),"adapters");if(m.existsSync(a))for(let f of Mt(m.readdirSync(a),o))m.rmSync(h.join(a,f),{force:!0}),c=!0;let l=h.join(e,"package.json"),u=I(l);if(u){u.dependencies=u.dependencies||{};let f=!1;for(let g of Ce[o])u.dependencies[g]||(u.dependencies[g]="latest",f=!0);f&&H(l,u)}return{changed:c,iconLibrary:o}}function So(e,n){for(let o of jn){let s=h.join(e,`${n}.${o}`);if(m.existsSync(s))return s}let t=h.join(e,n);if(m.existsSync(t)&&m.statSync(t).isDirectory()){let o=m.readdirSync(t).filter(r=>Fe.test(r)),s=o.filter(r=>!/^index\./i.test(r)),i=s.find(r=>r.toLowerCase().startsWith(`${n.toLowerCase()}.`))||s[0]||o.find(r=>/^index\./i.test(r));if(i)return h.join(t,i)}return null}function vn(e,n,t){for(let i of jn){let r=h.join(e,`${n}.${i}`);if(m.existsSync(r))return{inputPath:r,source:m.readFileSync(r,"utf8")}}let o=h.join(e,n);if(!m.existsSync(o)||!m.statSync(o).isDirectory())return null;if(t==="vue"){let i=m.readdirSync(o).filter(l=>Fe.test(l)).sort(),r=i.filter(l=>/^index\.(tsx?|jsx?)$/i.test(l)),c=i.filter(l=>/\.vue$/i.test(l)),a=[...r,...c];if(a.length>0){let l=a.map(f=>m.readFileSync(h.join(o,f),"utf8")).join(`
61
- `),u=c.find(f=>f.toLowerCase().startsWith(`${n.toLowerCase()}.`))||c[0]||r[0];return{inputPath:h.join(o,u),source:l}}}let s=So(e,n);return s?{inputPath:s,source:m.readFileSync(s,"utf8")}:null}function _n(e,n,t){let o=An(e);if(n&&n!=="all"){for(let r of o){let c=vn(r,n,t);if(c)return[{component:n,...c}]}return[]}let s=new Set,i=[];for(let r of o)for(let c of m.readdirSync(r,{withFileTypes:!0})){let a=null;if((c.isFile()&&Fe.test(c.name)&&!/^index\./i.test(c.name)||c.isDirectory())&&(a=xe(c.name)),!a)continue;let l=a.toLowerCase();if(s.has(l))continue;let u=vn(r,a,t);u&&(s.add(l),i.push({component:a,...u}))}return i}function Fo(e,n){let t={},o=[],s=_n(e,"all",n);for(let{component:i,source:r}of s){let c=we(r,i,{framework:n});if(c.skipped){o.push({component:i,reason:c.reason});continue}Object.assign(t,c.config)}return{config:t,skipped:o}}T.name("frontfriend").description("FrontFriend Tailwind CLI - Manage design tokens and cache").version(xn);T.command("login").description("Authenticate FrontFriend CLI with an 8-digit device code").option("--api-url <url>","FrontFriend API URL",process.env.FF_API_URL||be).option("--no-open","Do not open the browser automatically").action(async e=>{try{let n=e.apiUrl.replace(/\/$/,""),t=await ye(`${n}/api/auth/device/start`,{}),o=t.interval||5,s=Date.now()+(t.expires_in||600)*1e3;for(console.log("\u{1F510} FrontFriend Login"),console.log(`====================
62
- `),console.log(`Go to ${t.verification_uri} and enter the code:`),console.log(`
63
- ${t.user_code}
64
- `),e.open!==!1&&Wt(t.verification_uri)&&console.log("Opened the browser for you."),console.log(`Waiting for approval...
65
- `);Date.now()<s;){await Kt(o*1e3);let i=await ye(`${n}/api/auth/device/poll`,{device_code:t.device_code});if(i.error!=="authorization_pending"){if(i.error==="slow_down"){o=i.interval||o+5;continue}if(i.error)throw new Error(`${i.error}: ${i.error_description||"Authentication failed"}`);if(!i.access_token||!i.refresh_token||!i.device_id)throw new Error("Invalid login response from FrontFriend. Run `frontfriend login` again.");St({accessToken:i.access_token,refreshToken:i.refresh_token,deviceId:i.device_id,expiresAt:Date.now()+(i.expires_in||900)*1e3,refreshExpiresAt:Date.now()+(i.refresh_expires_in||604800)*1e3,ffApiUrl:n}),console.log("\u2705 Login complete!"),console.log(` Credentials saved to ${kt()}`),process.exit(0)}}throw new Error("expired_token: the code has expired, run `frontfriend login` again.")}catch(n){console.error("\u274C Login failed:",n.message),process.exit(1)}});T.command("logout").description("Remove FrontFriend CLI credentials").option("--api-url <url>","FrontFriend API URL",process.env.FF_API_URL||be).action(async e=>{let n=Ft(),t=(e.apiUrl||(n==null?void 0:n.ffApiUrl)||be).replace(/\/$/,"");if(n!=null&&n.accessToken&&(n!=null&&n.deviceId))try{await ye(`${t}/api/plugin/logout`,{device_id:n.deviceId},n.accessToken)}catch{}let o=$t();console.log(o?"\u2705 Logged out. Credentials removed.":"\u2139\uFE0F No stored credentials found."),process.exit(0)});T.command("init").description("Initialize FrontFriend configuration and fetch from API").option("--force","Force refresh even if cache is valid").option("--verbose","Show detailed output including safelist size and token counts").option("--tag <tag>","Fetch specific tag (e.g., dev, next, latest)").option("--version <version>","Fetch specific version (e.g., v1.0.0)").option("--registry-url <url>","Registry base URL for components.json (overrides FF_REGISTRY_URL)").action(async e=>{var n;try{console.log("\u{1F527} FrontFriend Setup"),console.log(`==================
66
- `);let o=await new G().load(),s=m.existsSync(h.join(o.appRoot,"components.json")),i=h.join(o.appRoot,kn);s&&!m.existsSync(i)&&!e.force&&(console.log("\u{1F6D1} shadcn project detected (components.json) that has not been migrated yet."),console.log(""),console.log(" Run `npx frontfriend migrate` first: it reads your components' classes and"),console.log(" pushes them to your design system, so FrontFriend components keep your app's look."),console.log(""),console.log(" Or run `npx frontfriend init --force` to skip this and use the design system's styling."),process.exit(1));let r=Gt(o.appRoot,{registryUrl:e.registryUrl});if(Yt(r),!o.ffId)throw r.isShadcnProject&&(console.log("\u2705 Local FrontFriend wiring complete!"),console.log(' Add frontfriend.config.js with "ff-id" later to fetch cloud design tokens.'),process.exit(0)),new M(`ff-id not found in frontfriend.config.js
67
- Please add "ff-id" to your frontfriend.config.js file`,"ff-id");let c=e.tag||o.tag,a=e.version||o.version;console.log("\u{1F4CB} Configuration loaded"),console.log(` FF_ID: ${o.ffId}`),console.log(` App Root: ${o.appRoot}`),c&&console.log(` Tag: ${c}`),a&&console.log(` Version: ${a}`),console.log("");let l=new D(o.appRoot);!e.force&&l.exists()&&l.isValid()&&!l.isLocalOnly()&&(console.log("\u2705 Cache is valid and up to date"),console.log(" Use --force to refresh anyway"),process.exit(0)),console.log("\u{1F50D} Checking cache..."),e.force?console.log(` Force refresh requested
49
+ `),"created")}function Ce(e){let n=Se.find(o=>d.existsSync(a.join(e,o)));return n?a.join(e,n):null}function gn(e){let o=Se.find(s=>d.existsSync(a.join(e,s)))||"app/globals.css",t=a.join(e,o);return d.mkdirSync(a.dirname(t),{recursive:!0}),d.existsSync(t)||d.writeFileSync(t,""),{fullPath:t,relativePath:o}}function pn(e){let{fullPath:n,relativePath:o}=gn(e),t=d.readFileSync(n,"utf8");return t.includes(me)?{changed:!1,relativePath:o}:(d.writeFileSync(n,`${me}
50
+ ${t}`),{changed:!0,relativePath:o})}function mn(e,n={}){let o=a.join(e,"components.json");if(!d.existsSync(o))return{isShadcnProject:!1,changes:[]};let t=Y(e),s=an(e),r=[],i=[];if(ln(e,t,n.registryUrl)&&r.push(`registered @frontfriend registry for ${t}`),fn(e)&&r.push("added @frontfriend/tailwind dependency"),s==="next"){let c=dn(e);c==="created"&&r.push("created next.config.js with the FrontFriend plugin"),c==="manual"&&i.push('wrap your existing next.config with `require("@frontfriend/tailwind/next")(...)`')}if(s==="vite"){let c=un(e);c==="created"&&r.push("created vite.config.ts with the FrontFriend plugin"),c==="manual"&&i.push("add `frontfriend()` from `@frontfriend/tailwind/vite` to your existing vite.config plugins array")}let f=pn(e);return f.changed&&r.push(`imported bundled theme in ${f.relativePath}`),{isShadcnProject:!0,changes:r,manualSteps:i,framework:t,buildTool:s}}function hn(e){return new Promise(n=>setTimeout(n,e))}function yn(e){let n=process.platform==="darwin"?"open":process.platform==="win32"?"cmd":"xdg-open",o=process.platform==="win32"?["/c","start","",e]:[e];try{return sn(n,o,{detached:!0,stdio:"ignore"}).unref(),!0}catch{return!1}}function wn(e){e.isShadcnProject&&(console.log("\u{1F9E9} shadcn project wiring"),e.changes.length===0?console.log(" \u2713 Already configured"):e.changes.forEach(n=>console.log(` \u2713 ${n}`)),e.manualSteps&&e.manualSteps.length>0&&(console.log(" \u26A0 Manual steps required (existing config left untouched):"),e.manualSteps.forEach(n=>console.log(` \u2022 ${n}`))),console.log(` Next: npx shadcn add @frontfriend/button
51
+ `))}function P(e){return a.basename(e).replace(/\.(tsx|ts|jsx|js|vue)$/,"").replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/[_\s]+/g,"-").toLowerCase()}var Fe=["tsx","ts","jsx","js","vue"],W=/\.(tsx|ts|jsx|js|vue)$/;function Sn(e){let n={};for(let o of["tsconfig.json","tsconfig.app.json","jsconfig.json"]){let t=F(a.join(e,o)),s=t&&t.compilerOptions&&t.compilerOptions.paths;s&&Object.assign(n,s)}return n}function vn(e,n){if(!n)return null;let o=Sn(e);for(let[t,s]of Object.entries(o))if(!(!Array.isArray(s)||s.length===0)){if(t.endsWith("/*")){let r=t.slice(0,-1);if(n.startsWith(r)){let i=n.slice(r.length),f=s[0].replace(/\*+$/,"");return a.resolve(e,f,i)}}else if(t===n)return a.resolve(e,s[0])}return n.startsWith("@/")?a.resolve(e,"src",n.slice(2)):a.resolve(e,n)}function xe(e){let n=F(a.join(e,"components.json")),o=n&&n.aliases&&n.aliases.ui,t=[o?vn(e,o):null,a.join(e,"src","components","ui"),a.join(e,"components","ui")].filter(Boolean);return[...new Set(t)].filter(s=>d.existsSync(s))}function je(e,n){let o=F(a.join(e,"components.json")),t=nn(o,n),s=xe(e).flatMap(g=>[a.join(g,"icon","index.tsx"),a.join(g,"icon","Icon.vue")]).find(g=>d.existsSync(g));if(!s)return{changed:!1,iconLibrary:t};let r=d.readFileSync(s,"utf8"),i=on(r,t),f=i!==r;f&&d.writeFileSync(s,i);let c=a.join(a.dirname(s),"adapters");if(d.existsSync(c))for(let g of tn(d.readdirSync(c),t))d.rmSync(a.join(c,g),{force:!0}),f=!0;let l=a.join(e,"package.json"),u=F(l);if(u){u.dependencies=u.dependencies||{};let g=!1;for(let p of ye[t])u.dependencies[p]||(u.dependencies[p]="latest",g=!0);g&&U(l,u)}return{changed:f,iconLibrary:t}}function Cn(e,n){for(let t of Fe){let s=a.join(e,`${n}.${t}`);if(d.existsSync(s))return s}let o=a.join(e,n);if(d.existsSync(o)&&d.statSync(o).isDirectory()){let t=d.readdirSync(o).filter(i=>W.test(i)),s=t.filter(i=>!/^index\./i.test(i)),r=s.find(i=>i.toLowerCase().startsWith(`${n.toLowerCase()}.`))||s[0]||t.find(i=>/^index\./i.test(i));if(r)return a.join(o,r)}return null}function he(e,n,o){for(let r of Fe){let i=a.join(e,`${n}.${r}`);if(d.existsSync(i))return{inputPath:i,source:d.readFileSync(i,"utf8")}}let t=a.join(e,n);if(!d.existsSync(t)||!d.statSync(t).isDirectory())return null;if(o==="vue"){let r=d.readdirSync(t).filter(l=>W.test(l)).sort(),i=r.filter(l=>/^index\.(tsx?|jsx?)$/i.test(l)),f=r.filter(l=>/\.vue$/i.test(l)),c=[...i,...f];if(c.length>0){let l=c.map(g=>d.readFileSync(a.join(t,g),"utf8")).join(`
52
+ `),u=f.find(g=>g.toLowerCase().startsWith(`${n.toLowerCase()}.`))||f[0]||i[0];return{inputPath:a.join(t,u),source:l}}}let s=Cn(e,n);return s?{inputPath:s,source:d.readFileSync(s,"utf8")}:null}function ke(e,n,o){let t=xe(e);if(n&&n!=="all"){for(let i of t){let f=he(i,n,o);if(f)return[{component:n,...f}]}return[]}let s=new Set,r=[];for(let i of t)for(let f of d.readdirSync(i,{withFileTypes:!0})){let c=null;if((f.isFile()&&W.test(f.name)&&!/^index\./i.test(f.name)||f.isDirectory())&&(c=P(f.name)),!c)continue;let l=c.toLowerCase();if(s.has(l))continue;let u=he(i,c,o);u&&(s.add(l),r.push({component:c,...u}))}return r}v.name("frontfriend").description("FrontFriend Tailwind CLI - Manage design tokens and cache").version(we);v.command("login").description("Authenticate FrontFriend CLI with an 8-digit device code").option("--api-url <url>","FrontFriend API URL",process.env.FF_API_URL||J).option("--no-open","Do not open the browser automatically").action(async e=>{try{let n=e.apiUrl.replace(/\/$/,""),o=await V(`${n}/api/auth/device/start`,{}),t=o.interval||5,s=Date.now()+(o.expires_in||600)*1e3;for(console.log("\u{1F510} FrontFriend Login"),console.log(`====================
53
+ `),console.log(`Go to ${o.verification_uri} and enter the code:`),console.log(`
54
+ ${o.user_code}
55
+ `),e.open!==!1&&yn(o.verification_uri)&&console.log("Opened the browser for you."),console.log(`Waiting for approval...
56
+ `);Date.now()<s;){await hn(t*1e3);let r=await V(`${n}/api/auth/device/poll`,{device_code:o.device_code});if(r.error!=="authorization_pending"){if(r.error==="slow_down"){t=r.interval||t+5;continue}if(r.error)throw new Error(`${r.error}: ${r.error_description||"Authentication failed"}`);if(!r.access_token||!r.refresh_token||!r.device_id)throw new Error("Invalid login response from FrontFriend. Run `frontfriend login` again.");ze({accessToken:r.access_token,refreshToken:r.refresh_token,deviceId:r.device_id,expiresAt:Date.now()+(r.expires_in||900)*1e3,refreshExpiresAt:Date.now()+(r.refresh_expires_in||604800)*1e3,ffApiUrl:n}),console.log("\u2705 Login complete!"),console.log(` Credentials saved to ${Ke()}`),process.exit(0)}}throw new Error("expired_token: the code has expired, run `frontfriend login` again.")}catch(n){console.error("\u274C Login failed:",n.message),process.exit(1)}});v.command("logout").description("Remove FrontFriend CLI credentials").option("--api-url <url>","FrontFriend API URL",process.env.FF_API_URL||J).action(async e=>{let n=Xe(),o=(e.apiUrl||(n==null?void 0:n.ffApiUrl)||J).replace(/\/$/,"");if(n!=null&&n.accessToken&&(n!=null&&n.deviceId))try{await V(`${o}/api/plugin/logout`,{device_id:n.deviceId},n.accessToken)}catch{}let t=Ze();console.log(t?"\u2705 Logged out. Credentials removed.":"\u2139\uFE0F No stored credentials found."),process.exit(0)});v.command("init").description("Initialize FrontFriend configuration and fetch from API").option("--force","Force refresh even if cache is valid").option("--verbose","Show detailed output including safelist size and token counts").option("--tag <tag>","Fetch specific tag (e.g., dev, next, latest)").option("--version <version>","Fetch specific version (e.g., v1.0.0)").option("--registry-url <url>","Registry base URL for components.json (overrides FF_REGISTRY_URL)").action(async e=>{var n;try{console.log("\u{1F527} FrontFriend Setup"),console.log(`==================
57
+ `);let t=await new _().load(),s=d.existsSync(a.join(t.appRoot,"components.json")),r=a.join(t.appRoot,ve);s&&!d.existsSync(r)&&!e.force&&(console.log("\u{1F6D1} shadcn project detected (components.json) that has not been migrated yet."),console.log(""),console.log(" Run `npx frontfriend migrate` first: it reads your components' classes and"),console.log(" pushes them to your design system, so FrontFriend components keep your app's look."),console.log(""),console.log(" Or run `npx frontfriend init --force` to skip this and use the design system's styling."),process.exit(1));let i=mn(t.appRoot,{registryUrl:e.registryUrl});if(wn(i),!t.ffId)throw i.isShadcnProject&&(console.log("\u2705 Local FrontFriend wiring complete!"),console.log(' Add frontfriend.config.js with "ff-id" later to fetch cloud design tokens.'),process.exit(0)),new C(`ff-id not found in frontfriend.config.js
58
+ Please add "ff-id" to your frontfriend.config.js file`,"ff-id");let f=e.tag||t.tag,c=e.version||t.version;console.log("\u{1F4CB} Configuration loaded"),console.log(` FF_ID: ${t.ffId}`),console.log(` App Root: ${t.appRoot}`),f&&console.log(` Tag: ${f}`),c&&console.log(` Version: ${c}`),console.log("");let l=new R(t.appRoot);!e.force&&l.exists()&&l.isValid()&&!l.isLocalOnly()&&(console.log("\u2705 Cache is valid and up to date"),console.log(" Use --force to refresh anyway"),process.exit(0)),console.log("\u{1F50D} Checking cache..."),e.force?console.log(` Force refresh requested
68
59
  `):l.exists()?l.isLocalOnly()?console.log(` Local migrate cache found \u2014 fetching the design system
69
60
  `):console.log(` Cache expired
70
61
  `):console.log(` No cache found
71
- `),console.log("\u{1F310} Fetching configuration...");let u=new wn(o.ffId,{baseURL:o["api-url"]||o.apiUrl,authToken:o["auth-token"]||o.authToken});(o["api-url"]||o.apiUrl)&&console.log(` Using API URL: ${o["api-url"]||o.apiUrl}`);let f=new At,g=null;try{g=await u.fetchProcessedTokens({tag:c,version:a,tailwindV4:f.useTailwindV4})}catch(w){console.log(` \u26A0\uFE0F Failed to fetch pre-processed tokens: ${w.message}`)}if(g){if(console.log(" \u2713 Pre-processed tokens fetched from server"),console.log(" \u2713 Skipping local processing"),g.versionMetadata){let w=g.versionMetadata;console.log(" \u2139\uFE0F Version Information:"),w.version&&console.log(` Version: ${w.version}`),w.tag&&console.log(` Tag: ${w.tag}`),w.cached!==void 0&&console.log(` From Cache: ${w.cached?"Yes":"No"}`)}if(console.log(""),(!((n=g.tokens)!=null&&n.fontFamily)||Object.keys(g.tokens.fontFamily).length===0)&&(console.log("\u26A0\uFE0F Warning: No font family utilities found"),console.log(" Font classes like font-primary and font-secondary will not be available"),g.globalTokens?console.log(` Global tokens are present - font processor may need to be updated
62
+ `),console.log("\u{1F310} Fetching configuration...");let u=new G(t.ffId,{baseURL:t["api-url"]||t.apiUrl,authToken:t["auth-token"]||t.authToken});(t["api-url"]||t.apiUrl)&&console.log(` Using API URL: ${t["api-url"]||t.apiUrl}`);let g=new en,p=null;try{p=await u.fetchProcessedTokens({tag:f,version:c,tailwindV4:g.useTailwindV4})}catch(h){console.log(` \u26A0\uFE0F Failed to fetch pre-processed tokens: ${h.message}`)}if(p){if(console.log(" \u2713 Pre-processed tokens fetched from server"),console.log(" \u2713 Skipping local processing"),p.versionMetadata){let h=p.versionMetadata;console.log(" \u2139\uFE0F Version Information:"),h.version&&console.log(` Version: ${h.version}`),h.tag&&console.log(` Tag: ${h.tag}`),h.cached!==void 0&&console.log(` From Cache: ${h.cached?"Yes":"No"}`)}if(console.log(""),(!((n=p.tokens)!=null&&n.fontFamily)||Object.keys(p.tokens.fontFamily).length===0)&&(console.log("\u26A0\uFE0F Warning: No font family utilities found"),console.log(" Font classes like font-primary and font-secondary will not be available"),p.globalTokens?console.log(` Global tokens are present - font processor may need to be updated
72
63
  `):console.log(` Consider adding font family tokens to your design system
73
- `)),f.useTailwindV4){let w=f.extractClassesFromComponentsConfig(g.componentsConfig),q=[...g.safelist||[],...w||[]];g.safelist=[...new Set(q)].sort(),g.themeCSS||(g.themeCSS=f.generateThemeCSS({variables:g.variables||{},semanticVariables:g.semanticVariables||{},semanticDarkVariables:g.semanticDarkVariables||{},fontFaces:g.fonts||[],keyframes:g.keyframes||{},animations:g.animations||{},custom:g.custom||{}})),g.classesContent||(g.classesContent=f.generateClassesContent(g.safelist))}if(console.log("\u{1F4BE} Saving cache..."),(process.env.FF_VERBOSE==="true"||e.verbose)&&console.log(` Safelist has ${g.safelist?g.safelist.length:0} items`),l.save(g),console.log(` \u2713 Cache saved successfully
74
- `),console.log("\u2705 Setup complete!"),console.log(" Your FrontFriend configuration has been cached."),console.log(" The Tailwind plugin will now use this cached data."),o.types){console.log(`
75
- \u{1F524} Generating TypeScript types...`);try{let{generateIconTypes:w}=me(),q=o.aliases&&o.aliases.types?h.join(o.appRoot,o.aliases.types,"frontfriend.d.ts"):void 0;w({projectRoot:o.appRoot,outputPath:q})}catch(w){console.log(" \u26A0\uFE0F Type generation failed:",w.message),console.log(' Enable type generation in frontfriend.config.js with "types": true')}}process.exit(0)}console.log(` \u2139\uFE0F Pre-processed tokens not available, falling back to local processing
76
- `);let[p,b,y,x,k,_]=await Promise.all([u.fetchTokens(),u.fetchComponentsConfig(),u.fetchFonts(),u.fetchIcons(),u.fetchVersion(),u.fetchCustomCss()]),$e=b;if(console.log(" \u2713 Tokens fetched"),p.global||p.colors||p.semantic||p.semanticDark){let w=[p.global?"global":null,p.colors?"colors":null,p.semantic?"semantic":null,p.semanticDark?"semanticDark":null].filter(Boolean).join(", ");console.log(` (Found: ${w})`)}console.log(" \u2713 Components config fetched"),console.log(" \u2713 Fonts fetched"),console.log(" \u2713 Icons fetched"),console.log(" \u2713 Version fetched"),console.log(` \u2713 Custom CSS fetched
77
- `),console.log("\u2699\uFE0F Processing tokens..."),console.log(" Processing raw token data...");let F=await f.process({colors:p.colors||p.global,semantic:p.semantic,semanticDark:p.semanticDark,fonts:y,globalTokens:p.global,animations:p.animations,version:k==null?void 0:k.version,ffId:o.ffId,customCss:_});console.log(" \u2713 Colors processed"),console.log(" \u2713 Semantic tokens processed"),F.fontFaces.length>0&&console.log(` \u2713 ${F.fontFaces.length} font faces processed`),Object.keys(F.animations).length>0&&console.log(` \u2713 ${Object.keys(F.animations).length} animations processed`),console.log(`
78
- `);let In=f.extractClassesFromComponentsConfig($e),On=[...F.safelist||[],...In||[]],je=[...new Set(On)].sort(),Ae,Te;f.useTailwindV4&&(console.log("\u{1F3A8} Generating Tailwind v4 CSS artifacts..."),Ae=f.generateThemeCSS(F),Te=f.generateClassesContent(je),console.log(" \u2713 theme.css generated"),console.log(` \u2713 classes.css generated for @source scanning
79
- `));let N={tokens:F.utilities,variables:F.variables,semanticVariables:F.semanticVariables,semanticDarkVariables:F.semanticDarkVariables,fonts:F.fontFaces,icons:x,componentsConfig:$e,keyframes:F.keyframes,animations:F.animations,safelist:je,version:k,metadata:F.metadata,custom:F.custom,themeCSS:Ae,classesContent:Te};console.log("\u{1F4BE} Saving cache..."),(process.env.FF_VERBOSE==="true"||e.verbose)&&(console.log(" Cache data summary:"),console.log(` - Tokens: ${Object.keys(N.tokens||{}).length} utilities`),console.log(` - Variables: ${Object.keys(N.variables||{}).length} CSS variables`),console.log(` - Semantic variables: ${Object.keys(N.semanticVariables||{}).length} semantic variables`),console.log(` - Font faces: ${(N.fonts||[]).length} fonts`),console.log(` - Safelist: ${(N.safelist||[]).length} safelist classes`)),l.save(N),console.log(` \u2713 Cache saved successfully
80
- `);let _e=Tn(o.appRoot,l.getIconLibrary());if(_e.changed&&console.log(` \u2713 Icon library: ${_e.iconLibrary} (adapter + dependency wired)
81
- `),console.log("\u2705 Setup complete!"),console.log(" Your FrontFriend configuration has been cached."),console.log(" The Tailwind plugin will now use this cached data."),o.types){console.log(`
82
- \u{1F524} Generating TypeScript types...`);try{let{generateIconTypes:w}=me(),q=o.aliases&&o.aliases.types?h.join(o.appRoot,o.aliases.types,"frontfriend.d.ts"):void 0;w({projectRoot:o.appRoot,outputPath:q})}catch(w){console.log(" \u26A0\uFE0F Type generation failed:",w.message),console.log(' Enable type generation in frontfriend.config.js with "types": true')}}process.exit(0)}catch(t){t instanceof M?console.error("\u274C Configuration Error:",t.message):t instanceof Lt?(console.error("\u274C API Error:",t.message),console.error(` Status: ${t.statusCode}`),console.error(` URL: ${t.url}`)):t instanceof ke?(console.error("\u274C Cache Error:",t.message),console.error(` Operation: ${t.operation}`)):console.error("\u274C Setup failed:",t.message),process.exit(1)}});T.command("clean").description("Remove cached configuration").action(async()=>{try{console.log(`\u{1F9F9} Cleaning FrontFriend cache...
83
- `);let n=new G().load(),t=new D(n.appRoot);t.exists()?(t.clear(),console.log("\u2705 Cache cleared successfully")):console.log("\u2139\uFE0F No cache found"),process.exit(0)}catch(e){e instanceof ke?(console.error("\u274C Cache Error:",e.message),console.error(` Operation: ${e.operation}`)):console.error("\u274C Clean failed:",e.message),process.exit(1)}});T.command("status").description("Show cache status and configuration").action(async()=>{try{console.log("\u{1F4CA} FrontFriend Status"),console.log(`===================
84
- `),console.log("Package:"),console.log(` Version: ${xn}`),console.log("");let n=await new G().load();console.log("Configuration:"),console.log(` FF_ID: ${n.ffId||"Not set"}`),console.log(` App Root: ${n.appRoot}`),n.tag&&console.log(` Tag: ${n.tag}`),n.version&&console.log(` Version: ${n.version}`),console.log("");let t=new D(n.appRoot),o=t.getCacheDir();if(console.log("Cache:"),console.log(` Directory: ${h.relative(process.cwd(),o)}`),t.exists()){console.log(` Status: ${t.isValid()?"\u2705 Valid":"\u26A0\uFE0F Expired"}`);let s=t.load();if(s&&s.metadata){let i=new Date(s.metadata.timestamp);console.log(` Created: ${i.toLocaleString()}`),console.log(` Format Version: ${s.metadata.version||"Unknown"}`)}s&&s.versionMetadata&&(console.log(" Cached Version Info:"),s.versionMetadata.version&&console.log(` Version: ${s.versionMetadata.version}`),s.versionMetadata.tag&&console.log(` Tag: ${s.versionMetadata.tag}`))}else console.log(" Status: \u274C Not found");process.exit(0)}catch(e){e instanceof M?console.error("\u274C Configuration Error:",e.message):e instanceof ke?(console.error("\u274C Cache Error:",e.message),console.error(` Operation: ${e.operation}`)):console.error("\u274C Status check failed:",e.message),process.exit(1)}});T.command("migrate").description("Migrate shadcn components (cva + non-cva) into FrontFriend config, rewriting classes to FF tokens by default").option("--component <name>",'Component to migrate, or "all" to scan the UI dir',"all").option("--input <path>","Path to the shadcn component source").option("--output <path>","Output JSON path for migrated config",kn).option("--no-push","Do not push migrated config to the configured FrontFriend cloud").option("--keep-shadcn-classes","Keep raw shadcn classes instead of rewriting them to FrontFriend tokens (default: rewrite)").action(async e=>{try{let t=await new G().load(),o=t.appRoot,s=Sn(o),i=e.input&&e.component==="all"?xe(e.input):e.component,r;if(e.input){let y=h.resolve(o,e.input);if(!m.existsSync(y))throw new M(`Component source not found: ${h.relative(o,y)}`);let x=m.readFileSync(y,"utf8");r=we(x,i,{framework:s})}else if(i==="all")r=Fo(o,s);else{let y=_n(o,i,s);if(y.length===0)throw new M(`Component source "${i}" not found under components/ui or src/components/ui`,"component");r=we(y[0].source,i,{framework:s})}if(r.skipped===!0||Object.keys(r.config||{}).length===0){let y=r.reason||(Array.isArray(r.skipped)&&r.skipped.length>0?r.skipped.map(x=>`${x.component} (${x.reason})`).join(", "):"no cva-structured components or literal className slots found");console.log(`\u23ED\uFE0F Skipped ${i}: ${y}`),process.exit(0)}e.keepShadcnClasses||(r.config=se(r.config,Tt)),r.config=se(r.config,go);let c=Bt(o),a="",l="",u=null;if(c){let y=m.readFileSync(c,"utf8"),x=_t(y);if(a=x.custom,l=x.scaffold,u=It(y),a){let k=h.join(new D(o).getCacheDir(),"migrated-customcss.css");m.mkdirSync(h.dirname(k),{recursive:!0}),m.writeFileSync(k,`${a}
85
- `)}if(u){let k=h.join(new D(o).getCacheDir(),"migrated-theme-recipe.json");m.mkdirSync(h.dirname(k),{recursive:!0}),H(k,u)}}let f=h.resolve(o,e.output);H(f,r.config),xo(o,r.config);let g=I(h.join(o,"components.json"))||{},p=Ce[g.iconLibrary]?g.iconLibrary:void 0,b=!1;e.push&&t.ffId&&(await new wn(t.ffId,{baseURL:t["api-url"]||t.apiUrl,authToken:t["auth-token"]||t.authToken}).pushComponentsConfig(r.config,a||void 0,p,{themeStudioRecipe:u}),b=!0,p&&console.log(` Icon library: ${p} (pushed to the design system)`),c&&a&&(m.writeFileSync(`${c}.bak`,m.readFileSync(c)),m.writeFileSync(c,l?`${l}
86
- `:""),console.log(` Centralised host CSS \u2192 DS customCss (backup: ${h.relative(o,c)}.bak)`))),console.log("\u2705 Migration complete!"),console.log(` Component: ${i==="all"?Object.keys(r.config).join(", "):i}`),console.log(` Output: ${h.relative(o,f)}`),console.log(" Local config: cached for the FrontFriend plugin"),r.skipped&&r.skipped.length>0&&console.log(` Skipped: ${r.skipped.map(y=>`${y.component} (${y.reason})`).join(", ")}`),console.log(b?" Cloud config: pushed user override":" Cloud config: not pushed (missing ff-id or --no-push)"),process.exit(0)}catch(n){n instanceof M?console.error("\u274C Migration Error:",n.message):console.error("\u274C Migration failed:",n.message),process.exit(1)}});T.command("download").description("Download components from registry").argument("<components...>",'component names to download (or "all" to download all components)').option("-f, --framework <framework>","Framework to download components for (react/vue)").option("-o, --output <path>","Output directory for components").option("--registry <generation>","Registry generation to use (legacy/v4)").option("--overwrite","Overwrite existing files").action(async(e,n)=>{try{console.log(`\u{1F4E6} Downloading components...
87
- `);let o=await new G().load();if(!o.ffId)throw new M(`ff-id not found in frontfriend.config.js
88
- Please add "ff-id" to your frontfriend.config.js file`,"ff-id");let s=new jt({appRoot:o.appRoot,config:o,framework:n.framework,registryGeneration:n.registry,outputPath:n.output,overwrite:n.overwrite}),i=e;if(e.length===1&&e[0].toLowerCase()==="all"){let c=await s.getAllComponents(),a=await s.getCustomComponents();process.env.FF_DEBUG&&console.log(`Debug: Found ${a.length} custom components: ${a.join(", ")}`),c.length===0&&(console.error("\u274C Failed to fetch component list"),process.exit(1));let l=new Set(a),u=c.filter(f=>!l.has(f));i=[...a,...u],console.log("\u{1F4CB} Configuration"),console.log(` Framework: ${s.framework}`),console.log(` Registry: ${s.registryGeneration}`),console.log(` Output: ${s.outputPath}`),console.log(` Components: All ${i.length} components`),process.env.FF_DEBUG&&a.length>0&&console.log(` Debug: ${a.length} custom components will override standard ones`),console.log("")}else console.log("\u{1F4CB} Configuration"),console.log(` Framework: ${s.framework}`),console.log(` Registry: ${s.registryGeneration}`),console.log(` Output: ${s.outputPath}`),console.log(` Components: ${e.join(", ")}
89
- `);let r=await s.downloadComponents(i);if(r.successful.length>0){console.log(`
90
- \u2705 Download complete!`),console.log(` Downloaded: ${r.successful.length} components`);let c=new D(o.appRoot).getIconLibrary()||o.iconLibrary,a=Tn(o.appRoot,c);a.changed&&console.log(` Icon library: ${a.iconLibrary} (adapter + dependency wired)`)}r.failed.length>0&&(console.log(""),r.failed.forEach(c=>{c.error.includes("not found")?console.log(`\u274C ${c.error}`):console.log(`\u274C Failed to download ${c.component}: ${c.error}`)})),r.successful.length>0&&r.dependencies.length>0&&(console.log(`
91
- \u{1F4E6} Install dependencies:`),console.log(` npm install ${r.dependencies.join(" ")}`)),r.successful.length===0&&r.failed.length>0&&process.exit(1),process.exit(0)}catch(t){t instanceof M?(console.error("\u274C Configuration Error:",t.message),t.missingKey&&console.error(` Missing key: ${t.missingKey}`)):console.error("\u274C Download failed:",t.message),process.exit(1)}});T.parse(process.argv);process.argv.slice(2).length||(T.outputHelp(),process.exit(0));
64
+ `)),g.useTailwindV4){let h=g.extractClassesFromComponentsConfig(p.componentsConfig),E=[...p.safelist||[],...h||[]];p.safelist=[...new Set(E)].sort(),p.themeCSS||(p.themeCSS=g.generateThemeCSS({variables:p.variables||{},semanticVariables:p.semanticVariables||{},semanticDarkVariables:p.semanticDarkVariables||{},fontFaces:p.fonts||[],keyframes:p.keyframes||{},animations:p.animations||{},custom:p.custom||{}})),p.classesContent||(p.classesContent=g.generateClassesContent(p.safelist))}if(console.log("\u{1F4BE} Saving cache..."),(process.env.FF_VERBOSE==="true"||e.verbose)&&console.log(` Safelist has ${p.safelist?p.safelist.length:0} items`),l.save(p),console.log(` \u2713 Cache saved successfully
65
+ `),console.log("\u2705 Setup complete!"),console.log(" Your FrontFriend configuration has been cached."),console.log(" The Tailwind plugin will now use this cached data."),t.types){console.log(`
66
+ \u{1F524} Generating TypeScript types...`);try{let{generateIconTypes:h}=M(),E=t.aliases&&t.aliases.types?a.join(t.appRoot,t.aliases.types,"frontfriend.d.ts"):void 0;h({projectRoot:t.appRoot,outputPath:E})}catch(h){console.log(" \u26A0\uFE0F Type generation failed:",h.message),console.log(' Enable type generation in frontfriend.config.js with "types": true')}}process.exit(0)}console.log(` \u2139\uFE0F Pre-processed tokens not available, falling back to local processing
67
+ `);let[m,y,w,j,k,$]=await Promise.all([u.fetchTokens(),u.fetchComponentsConfig(),u.fetchFonts(),u.fetchIcons(),u.fetchVersion(),u.fetchCustomCss()]),K=y;if(console.log(" \u2713 Tokens fetched"),m.global||m.colors||m.semantic||m.semanticDark){let h=[m.global?"global":null,m.colors?"colors":null,m.semantic?"semantic":null,m.semanticDark?"semanticDark":null].filter(Boolean).join(", ");console.log(` (Found: ${h})`)}console.log(" \u2713 Components config fetched"),console.log(" \u2713 Fonts fetched"),console.log(" \u2713 Icons fetched"),console.log(" \u2713 Version fetched"),console.log(` \u2713 Custom CSS fetched
68
+ `),console.log("\u2699\uFE0F Processing tokens..."),console.log(" Processing raw token data...");let S=await g.process({colors:m.colors||m.global,semantic:m.semantic,semanticDark:m.semanticDark,fonts:w,globalTokens:m.global,animations:m.animations,version:k==null?void 0:k.version,ffId:t.ffId,customCss:$});console.log(" \u2713 Colors processed"),console.log(" \u2713 Semantic tokens processed"),S.fontFaces.length>0&&console.log(` \u2713 ${S.fontFaces.length} font faces processed`),Object.keys(S.animations).length>0&&console.log(` \u2713 ${Object.keys(S.animations).length} animations processed`),console.log(`
69
+ `);let Ie=g.extractClassesFromComponentsConfig(K),_e=[...S.safelist||[],...Ie||[]],z=[...new Set(_e)].sort(),X,Z;g.useTailwindV4&&(console.log("\u{1F3A8} Generating Tailwind v4 CSS artifacts..."),X=g.generateThemeCSS(S),Z=g.generateClassesContent(z),console.log(" \u2713 theme.css generated"),console.log(` \u2713 classes.css generated for @source scanning
70
+ `));let I={tokens:S.utilities,variables:S.variables,semanticVariables:S.semanticVariables,semanticDarkVariables:S.semanticDarkVariables,fonts:S.fontFaces,icons:j,componentsConfig:K,keyframes:S.keyframes,animations:S.animations,safelist:z,version:k,metadata:S.metadata,custom:S.custom,themeCSS:X,classesContent:Z};console.log("\u{1F4BE} Saving cache..."),(process.env.FF_VERBOSE==="true"||e.verbose)&&(console.log(" Cache data summary:"),console.log(` - Tokens: ${Object.keys(I.tokens||{}).length} utilities`),console.log(` - Variables: ${Object.keys(I.variables||{}).length} CSS variables`),console.log(` - Semantic variables: ${Object.keys(I.semanticVariables||{}).length} semantic variables`),console.log(` - Font faces: ${(I.fonts||[]).length} fonts`),console.log(` - Safelist: ${(I.safelist||[]).length} safelist classes`)),l.save(I),console.log(` \u2713 Cache saved successfully
71
+ `);let Q=je(t.appRoot,l.getIconLibrary());if(Q.changed&&console.log(` \u2713 Icon library: ${Q.iconLibrary} (adapter + dependency wired)
72
+ `),console.log("\u2705 Setup complete!"),console.log(" Your FrontFriend configuration has been cached."),console.log(" The Tailwind plugin will now use this cached data."),t.types){console.log(`
73
+ \u{1F524} Generating TypeScript types...`);try{let{generateIconTypes:h}=M(),E=t.aliases&&t.aliases.types?a.join(t.appRoot,t.aliases.types,"frontfriend.d.ts"):void 0;h({projectRoot:t.appRoot,outputPath:E})}catch(h){console.log(" \u26A0\uFE0F Type generation failed:",h.message),console.log(' Enable type generation in frontfriend.config.js with "types": true')}}process.exit(0)}catch(o){o instanceof C?console.error("\u274C Configuration Error:",o.message):o instanceof H?(console.error("\u274C API Error:",o.message),console.error(` Status: ${o.statusCode}`),console.error(` URL: ${o.url}`)):o instanceof B?(console.error("\u274C Cache Error:",o.message),console.error(` Operation: ${o.operation}`)):console.error("\u274C Setup failed:",o.message),process.exit(1)}});v.command("clean").description("Remove cached configuration").action(async()=>{try{console.log(`\u{1F9F9} Cleaning FrontFriend cache...
74
+ `);let n=new _().load(),o=new R(n.appRoot);o.exists()?(o.clear(),console.log("\u2705 Cache cleared successfully")):console.log("\u2139\uFE0F No cache found"),process.exit(0)}catch(e){e instanceof B?(console.error("\u274C Cache Error:",e.message),console.error(` Operation: ${e.operation}`)):console.error("\u274C Clean failed:",e.message),process.exit(1)}});v.command("status").description("Show cache status and configuration").action(async()=>{try{console.log("\u{1F4CA} FrontFriend Status"),console.log(`===================
75
+ `),console.log("Package:"),console.log(` Version: ${we}`),console.log("");let n=await new _().load();console.log("Configuration:"),console.log(` FF_ID: ${n.ffId||"Not set"}`),console.log(` App Root: ${n.appRoot}`),n.tag&&console.log(` Tag: ${n.tag}`),n.version&&console.log(` Version: ${n.version}`),console.log("");let o=new R(n.appRoot),t=o.getCacheDir();if(console.log("Cache:"),console.log(` Directory: ${a.relative(process.cwd(),t)}`),o.exists()){console.log(` Status: ${o.isValid()?"\u2705 Valid":"\u26A0\uFE0F Expired"}`);let s=o.load();if(s&&s.metadata){let r=new Date(s.metadata.timestamp);console.log(` Created: ${r.toLocaleString()}`),console.log(` Format Version: ${s.metadata.version||"Unknown"}`)}s&&s.versionMetadata&&(console.log(" Cached Version Info:"),s.versionMetadata.version&&console.log(` Version: ${s.versionMetadata.version}`),s.versionMetadata.tag&&console.log(` Tag: ${s.versionMetadata.tag}`))}else console.log(" Status: \u274C Not found");process.exit(0)}catch(e){e instanceof C?console.error("\u274C Configuration Error:",e.message):e instanceof B?(console.error("\u274C Cache Error:",e.message),console.error(` Operation: ${e.operation}`)):console.error("\u274C Status check failed:",e.message),process.exit(1)}});function $e(e,n,o={}){let{component:t="all",input:s,keepShadcnClasses:r=!1}=o,i=[];if(s){let u=a.resolve(e,s);d.existsSync(u)&&i.push({path:a.relative(e,u),content:d.readFileSync(u,"utf8"),component:P(u)})}else for(let u of ke(e,t,n))i.push({path:a.relative(e,u.inputPath),content:u.source,component:u.component});let f=Ce(e),c=f?d.readFileSync(f,"utf8"):"",l=F(a.join(e,"components.json"))||{};return{framework:n,keepShadcnClasses:r,componentsJson:l,themeCss:c,files:i}}function be(e,n,o){let t=a.join(e,ve);d.mkdirSync(a.dirname(t),{recursive:!0}),U(t,{migratedAt:new Date().toISOString(),ffId:n,snapshotId:o.snapshotId||null,summary:o.summary||null});let s=!1,r=null,i=o.localActions&&o.localActions.themeCss;return i&&typeof i.scaffoldToKeep=="string"&&(r=Ce(e),r&&(d.writeFileSync(`${r}.bak`,d.readFileSync(r)),d.writeFileSync(r,i.scaffoldToKeep?`${i.scaffoldToKeep}
76
+ `:""),s=!0)),{themeCssRewritten:s,themeCssPath:r}}v.command("migrate").description("Migrate shadcn components on the FrontFriend platform: upload sources, which are transformed, snapshotted (Restore) and persisted server-side").option("--component <name>",'Component to migrate, or "all" to scan the UI dir',"all").option("--input <path>","Path to the shadcn component source").option("--keep-shadcn-classes","Keep raw shadcn classes instead of rewriting them to FrontFriend tokens (default: rewrite)").action(async e=>{try{let o=await new _().load(),t=o.appRoot,s=Y(t);if(!o.ffId)throw new C("ff-id not found in frontfriend.config.js \u2014 migrate now runs on the FrontFriend platform and needs an ff-id","ff-id");let r=e.input&&e.component==="all"?P(e.input):e.component,i=$e(t,s,{component:r,input:e.input,keepShadcnClasses:!!e.keepShadcnClasses});if(i.files.length===0)throw new C(e.input?`Component source not found: ${e.input}`:"No shadcn components found under components/ui or src/components/ui","component");console.log(`\u{1F680} Migrating ${i.files.length} file(s) on the FrontFriend platform...`);let c=await new G(o.ffId,{baseURL:o["api-url"]||o.apiUrl,authToken:o["auth-token"]||o.authToken}).migrateComponents(i);if(!c||c.ok!==!0)throw new H("Migrate failed on the server",0,"migrate");let l=be(t,o.ffId,c),u=c.summary&&c.summary.migrated||[],g=c.summary&&c.summary.skipped||[];if(console.log("\u2705 Migration complete!"),console.log(` Migrated: ${u.length?u.join(", "):"(none)"}`),g.length>0&&console.log(` Skipped: ${g.map(p=>`${p.component} (${p.reason})`).join(", ")}`),c.snapshotId&&console.log(` Snapshot: ${c.snapshotId} (Restore point)`),c.version&&c.version.versionLabel){let p=c.version.changed===!1?" (no change)":"";console.log(` Design system: version ${c.version.versionLabel}${p}`)}l.themeCssRewritten&&console.log(` Centralised host CSS \u2192 design system (backup: ${a.relative(t,l.themeCssPath)}.bak)`),process.exit(0)}catch(n){n instanceof C?console.error("\u274C Migration Error:",n.message):console.error("\u274C Migration failed:",n.message),process.exit(1)}});function Te(e,n){let o=a.resolve(e),t=[];for(let s of n||[]){if(!s||typeof s.path!="string"||typeof s.content!="string")continue;let r=a.resolve(o,s.path);r!==o&&!r.startsWith(o+a.sep)||(d.mkdirSync(a.dirname(r),{recursive:!0}),d.writeFileSync(r,s.content),t.push(s.path))}return t}function Fn(e){return new Promise((n,o)=>{(e.startsWith("https")?require("https"):require("http")).get(e,s=>{if(s.statusCode>=300){s.resume(),o(new Error(`Download failed: HTTP ${s.statusCode}`));return}let r=[];s.on("data",i=>r.push(i)),s.on("end",()=>n(Buffer.concat(r))),s.on("error",o)}).on("error",o)})}v.command("restore [snapshotId]").description("Restore the original shadcn sources from a migrate snapshot (no id lists the snapshots)").action(async e=>{try{let o=await new _().load();if(!o.ffId)throw new C("ff-id not found in frontfriend.config.js","ff-id");let t=new G(o.ffId,{baseURL:o["api-url"]||o.apiUrl,authToken:o["auth-token"]||o.authToken});if(!e){let{snapshots:c=[]}=await t.listMigrationSnapshots()||{};c.length===0&&(console.log("No migrate snapshots found for this design system."),process.exit(0)),console.log(`\u{1F4F8} Migrate snapshots (newest first):
77
+ `);for(let l of c){let u=(l.files||[]).length,g=l.createdAt?new Date(l.createdAt).toISOString().slice(0,19).replace("T"," "):"",p=l.restorable?"":" (no bundle)";console.log(` ${l.id} ${g} ${l.status} ${u} file(s)${p}`)}console.log("\n Run `npx frontfriend restore <id>` to restore one."),process.exit(0)}console.log(`\u23EC Restoring snapshot ${e}...`);let s=await t.getMigrationSnapshot(e);if(!s||!s.url)throw new H("Snapshot has no downloadable bundle",0,"restore");let r=await Fn(s.url),i=JSON.parse(require("zlib").gunzipSync(r).toString("utf8")),f=Te(o.appRoot,i.files||[]);console.log("\u2705 Restore complete!"),console.log(` Restored ${f.length} file(s):`);for(let c of f)console.log(` \u2022 ${c}`);process.exit(0)}catch(n){n instanceof C?console.error("\u274C Restore Error:",n.message):console.error("\u274C Restore failed:",n.message),process.exit(1)}});v.command("download").description("Download components from registry").argument("<components...>",'component names to download (or "all" to download all components)').option("-f, --framework <framework>","Framework to download components for (react/vue)").option("-o, --output <path>","Output directory for components").option("--registry <generation>","Registry generation to use (legacy/v4)").option("--overwrite","Overwrite existing files").action(async(e,n)=>{try{console.log(`\u{1F4E6} Downloading components...
78
+ `);let t=await new _().load();if(!t.ffId)throw new C(`ff-id not found in frontfriend.config.js
79
+ Please add "ff-id" to your frontfriend.config.js file`,"ff-id");let s=new Qe({appRoot:t.appRoot,config:t,framework:n.framework,registryGeneration:n.registry,outputPath:n.output,overwrite:n.overwrite}),r=e;if(e.length===1&&e[0].toLowerCase()==="all"){let f=await s.getAllComponents(),c=await s.getCustomComponents();process.env.FF_DEBUG&&console.log(`Debug: Found ${c.length} custom components: ${c.join(", ")}`),f.length===0&&(console.error("\u274C Failed to fetch component list"),process.exit(1));let l=new Set(c),u=f.filter(g=>!l.has(g));r=[...c,...u],console.log("\u{1F4CB} Configuration"),console.log(` Framework: ${s.framework}`),console.log(` Registry: ${s.registryGeneration}`),console.log(` Output: ${s.outputPath}`),console.log(` Components: All ${r.length} components`),process.env.FF_DEBUG&&c.length>0&&console.log(` Debug: ${c.length} custom components will override standard ones`),console.log("")}else console.log("\u{1F4CB} Configuration"),console.log(` Framework: ${s.framework}`),console.log(` Registry: ${s.registryGeneration}`),console.log(` Output: ${s.outputPath}`),console.log(` Components: ${e.join(", ")}
80
+ `);let i=await s.downloadComponents(r);if(i.successful.length>0){console.log(`
81
+ \u2705 Download complete!`),console.log(` Downloaded: ${i.successful.length} components`);let f=new R(t.appRoot).getIconLibrary()||t.iconLibrary,c=je(t.appRoot,f);c.changed&&console.log(` Icon library: ${c.iconLibrary} (adapter + dependency wired)`)}i.failed.length>0&&(console.log(""),i.failed.forEach(f=>{f.error.includes("not found")?console.log(`\u274C ${f.error}`):console.log(`\u274C Failed to download ${f.component}: ${f.error}`)})),i.successful.length>0&&i.dependencies.length>0&&(console.log(`
82
+ \u{1F4E6} Install dependencies:`),console.log(` npm install ${i.dependencies.join(" ")}`)),i.successful.length===0&&i.failed.length>0&&process.exit(1),process.exit(0)}catch(o){o instanceof C?(console.error("\u274C Configuration Error:",o.message),o.missingKey&&console.error(` Missing key: ${o.missingKey}`)):console.error("\u274C Download failed:",o.message),process.exit(1)}});require.main===module&&(v.parse(process.argv),process.argv.slice(2).length||(v.outputHelp(),process.exit(0)));module.exports={buildMigratePayload:$e,applyMigrateResult:be,applyRestore:Te,findComponentSources:ke,inferComponentNameFromInput:P,detectProjectFramework:Y};
92
83
  //# sourceMappingURL=cli-temp.js.map
@@ -1,3 +1,3 @@
1
- var j=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports);var R=j((Ie,q)=>{var le="https://app.dev.frontfriend.dev",he="https://registry-legacy.frontfriend.dev",ue=".cache/frontfriend",fe={JS:["tokens.js","variables.js","semanticVariables.js","semanticDarkVariables.js","safelist.js","custom.js"],JSON:["fonts.json","icons.json","components-config.json","version.json","metadata.json"]},de={FF_ID:"FF_ID",FF_API_URL:"FF_API_URL",FF_USE_LOCAL:"FF_USE_LOCAL",FF_AUTH_TOKEN:"FF_AUTH_TOKEN"};q.exports={DEFAULT_API_URL:le,LEGACY_API_URL:he,CACHE_DIR_NAME:ue,CACHE_TTL_DAYS:7,CACHE_TTL_MS:6048e5,CACHE_FILES:fe,ENV_VARS:de}});var H=j((Ne,M)=>{var $=class extends Error{constructor(e,t,o){super(e),this.name="APIError",this.statusCode=t,this.url=o,this.code=`API_${t}`}},A=class extends Error{constructor(e,t){super(e),this.name="CacheError",this.operation=t,this.code=`CACHE_${t.toUpperCase()}`}},P=class extends Error{constructor(e,t){super(e),this.name="ConfigError",this.field=t,this.code=t?`CONFIG_${String(t).toUpperCase()}`:"CONFIG_ERROR"}},S=class extends Error{constructor(e,t){super(e),this.name="ProcessingError",this.token=t,this.code="PROCESSING_ERROR"}};M.exports={APIError:$,CacheError:A,ConfigError:P,ProcessingError:S}});var U=j((xe,G)=>{var y=require("fs");function pe(s){try{let e=y.readFileSync(s,"utf8");return JSON.parse(e)}catch(e){if(e.code==="ENOENT")return null;throw e}}function me(s){try{return y.readFileSync(s,"utf8").replace(/^\uFEFF/,"")}catch(e){if(e.code==="ENOENT")return null;throw e}}function ye(s,e,t=2){let o=JSON.stringify(e,null,t);y.writeFileSync(s,o,"utf8")}function ge(s,e){y.writeFileSync(s,e,"utf8")}function we(s,e){if(e==null||typeof e=="object"&&Object.keys(e).length===0||Array.isArray(e)&&e.length===0){let o=`module.exports = ${Array.isArray(e)?"[]":"{}"};`;y.writeFileSync(s,o,"utf8")}else{let t=`module.exports = ${JSON.stringify(e,null,2)};`;y.writeFileSync(s,t,"utf8")}}function Ce(s){return y.existsSync(s)}function ke(s){y.mkdirSync(s,{recursive:!0})}function Fe(s){y.rmSync(s,{recursive:!0,force:!0})}G.exports={readJsonFileSafe:pe,readFileSafe:me,writeJsonFile:ye,writeTextFile:ge,writeModuleExportsFile:we,fileExists:Ce,ensureDirectoryExists:ke,removeDirectory:Fe}});var V=j((Je,B)=>{var g=require("path"),{fileExists:D}=U();function je(s,e=process.cwd()){let t=e;for(;t!==g.parse(t).root;){let o=g.join(t,s);if(D(o))return o;t=g.dirname(t)}return null}function Te(s,e=process.cwd(),t=null){let o=[],n=e,a=10;for(let r=0;r<a;r++){o.push(g.join(n,s)),r<3&&o.push(g.join(n,"../".repeat(r+1)+s));let i=g.dirname(n);if(i===n)break;n=i}o.push(g.join(__dirname,"../../../",s));for(let r of o)if(D(r)&&(!t||t(r)))return r;return null}function Ee(s,e=process.cwd()){let t=s.map(o=>g.isAbsolute(o)?o:g.join(e,o));for(let o of t)if(D(o))return o;return null}B.exports={findFileUpward:je,findDirectoryUpward:Te,findDirectoryWithPaths:Ee}});var K=j((Oe,z)=>{var h=require("path"),{findDirectoryUpward:W}=V(),{readJsonFileSafe:w,readFileSafe:Y,fileExists:v}=U(),L=class{constructor(e,t={}){if(this.ffId=e,this.tokensBasePath=t.tokensBasePath||this.findTokensPath(),this.folderMap=this.loadFolderMap(),this.projectFolder=this.folderMap[e],!this.projectFolder)throw new Error(`No folder mapping found for ff-id: ${e}`);this.projectPath=h.join(this.tokensBasePath,this.projectFolder)}findTokensPath(){let e=W("apps/tokens",process.cwd(),t=>v(h.join(t,"folderMap.json")));if(e||(e=W("tokens",process.cwd(),t=>v(h.join(t,"folderMap.json")))),!e)throw new Error("Could not find tokens directory with folderMap.json");return e}loadFolderMap(){let e=h.join(this.tokensBasePath,"folderMap.json"),t=w(e);if(!t)throw new Error("Failed to load folderMap.json: File not found");return t}async fetchTokens(){let e=h.join(this.projectPath,"figma"),t={global:[h.join(e,"Global Tokens","Default.json"),h.join(e,"global.json")],colors:[h.join(e,"Global Colors","Default.json"),h.join(e,"Global Colors","Light.json")],semantic:[h.join(e,"Semantic","Light.json"),h.join(e,"Semantic","Default.json")],semanticDark:[h.join(e,"Semantic","Dark.json")]},o={};for(let[n,a]of Object.entries(t)){for(let r of a){let i=w(r);if(i!==null){o[n]=i;break}}o[n]||(o[n]=null)}return o}async fetchProcessedTokens(){let e=h.join(this.projectPath,"cache");if(!v(e))return null;let t=r=>{if(r===null)return null;let i={},u={exports:i};return new Function("module","exports",r)(u,i),u.exports},o={tokens:{fileName:"hashedTokens.js",type:"module"},variables:{fileName:"hashedVariables.js",type:"module"},semanticVariables:{fileName:"hashedSemanticVariables.js",type:"module"},semanticDarkVariables:{fileName:"hashedSemanticDarkVariables.js",type:"module"},safelist:{fileName:"safelist.js",type:"module"},custom:{fileName:"custom.js",type:"module"},fonts:{fileName:"fonts.json",type:"json"},icons:{fileName:"icons.json",type:"json"},componentsConfig:{fileName:"encoded-config.json",type:"json"},version:{fileName:"version.json",type:"json"}},n={};for(let[r,{fileName:i,type:u}]of Object.entries(o)){let c=h.join(e,i),d=u==="module"?t(Y(c)):w(c);d!==null&&(n[r]=d)}return Object.values(n).some(r=>r!==null)?n:null}async fetchComponentsConfig(){return w(h.join(this.projectPath,"components-config.json"))}async fetchFonts(){return w(h.join(this.projectPath,"font.json"))}async fetchIcons(){return w(h.join(this.projectPath,"icons.json"))}async fetchVersion(){return w(h.join(this.projectPath,"version.json"))}async fetchCustomCss(){return Y(h.join(this.projectPath,"custom.css"))}async fetchPlanMetadata(){return w(h.join(this.projectPath,"metadata.json"))||{planType:"full",allowedComponents:null}}fetchJson(){throw new Error("fetchJson is not implemented in LocalTokenReader. Use specific fetch methods.")}fetchRaw(){throw new Error("fetchRaw is not implemented in LocalTokenReader. Use specific fetch methods.")}};z.exports={LocalTokenReader:L}});var ae=j((qe,re)=>{var C=require("fs"),Q=require("path"),_e=require("os"),Re=require("https"),$e=require("http"),{URL:Ae}=require("url"),{DEFAULT_API_URL:X}=R(),Z=Q.join(_e.homedir(),".frontfriend"),k=Q.join(Z,"credentials");function Pe(){return k}function ee(){try{return C.existsSync(k)?JSON.parse(C.readFileSync(k,"utf8")):null}catch{return null}}function te(s){C.mkdirSync(Z,{recursive:!0,mode:448}),C.writeFileSync(k,`${JSON.stringify(s,null,2)}
2
- `,{mode:384});try{C.chmodSync(k,384)}catch{}}function Se(){return C.existsSync(k)?(C.unlinkSync(k),!0):!1}function ne(s,e=60*1e3){return!(s!=null&&s.accessToken)||!s.expiresAt||Date.now()+e>=s.expiresAt}function E(s){let e=new Error(`${s}. Run \`frontfriend login\` to re-authenticate.`);return e.code="FF_AUTH_REFRESH_FAILED",e}function se(s,e,t){return new Promise((o,n)=>{let a=new Ae(s),r=a.protocol==="https:"?Re:$e,i=JSON.stringify(e||{}),u=r.request({hostname:a.hostname,port:a.port,path:`${a.pathname}${a.search}`,method:"POST",headers:{"content-type":"application/json","content-length":Buffer.byteLength(i),...t?{authorization:`Bearer ${t}`}:{}}},c=>{let d="";c.on("data",l=>{d+=l}),c.on("end",()=>{if(c.statusCode>=300&&c.statusCode<400){let p=c.headers.location?` to ${c.headers.location}`:"",m=new Error(`HTTP ${c.statusCode}: redirected${p}`);m.statusCode=c.statusCode,m.body=d,n(m);return}let l=null;try{l=d?JSON.parse(d):null}catch{let m=c.headers["content-type"]||"unknown content-type",T=new Error(`Expected JSON from FrontFriend API at ${s}, but received ${m} (HTTP ${c.statusCode}). Check FF_API_URL or pass --api-url with the FrontFriend app URL.`);if(T.statusCode=c.statusCode,T.body=d,c.statusCode>=400){n(T);return}n(T);return}if(c.statusCode>=400){let p=new Error((l==null?void 0:l.error_description)||(l==null?void 0:l.error)||`HTTP ${c.statusCode}`);p.statusCode=c.statusCode,p.body=l,n(p);return}o(l)})});u.on("error",n),u.write(i),u.end()})}async function oe(s,e=X){if(!(s!=null&&s.refreshToken)||!(s!=null&&s.deviceId))throw E("FrontFriend session expired");let t;try{t=await se(`${e}/api/plugin/token`,{grant_type:"refresh_token",refresh_token:s.refreshToken,device_id:s.deviceId})}catch(n){throw E((n==null?void 0:n.message)||"Could not refresh FrontFriend session")}if(!(t!=null&&t.access_token)||!(t!=null&&t.refresh_token))throw E("Could not refresh FrontFriend session");let o={accessToken:t.access_token,refreshToken:t.refresh_token,deviceId:t.device_id||s.deviceId,expiresAt:Date.now()+(t.expires_in||900)*1e3,refreshExpiresAt:Date.now()+(t.refresh_expires_in||604800)*1e3,ffApiUrl:e};return te(o),o}async function Ue(s={}){if(!s.skipCredentials){let e=ee();if(e!=null&&e.accessToken||e!=null&&e.refreshToken){let t=s.baseURL||e.ffApiUrl||X;return e.accessToken&&!ne(e)?e.accessToken:(await oe(e,t)).accessToken}}return s.envToken?s.envToken:s.legacyToken?(s.silent||console.warn("\u26A0\uFE0F auth-token in frontfriend.config.js is deprecated. Run `frontfriend login` to store credentials outside the repo."),s.legacyToken):null}re.exports={getCredentialsPath:Pe,readCredentials:ee,writeCredentials:te,deleteCredentials:Se,isExpired:ne,postJson:se,refreshCredentials:oe,resolveAuthToken:Ue,createAuthRefreshError:E}});var b=require("https"),I=require("http"),{URL:x}=require("url"),{DEFAULT_API_URL:De,LEGACY_API_URL:F,ENV_VARS:N}=R(),{APIError:f}=H(),{LocalTokenReader:ve}=K(),{resolveAuthToken:Le}=ae(),_="Authentication required. Run `frontfriend login` to re-authenticate.";function ie(s,e,t,o){return t?s.get(new x(e),{headers:{authorization:`Bearer ${t}`}},o):s.get(e,o)}function J(s,e=""){var o;let t=((o=s.headers)==null?void 0:o.location)||"";return s.statusCode===401||s.statusCode===403||s.statusCode>=300&&s.statusCode<400&&t.includes("/sign-in")||String(e).trim().startsWith("/sign-in")}function ce(s,e,t=""){if(J(s,t))return new f(_,s.statusCode,e);let o=s.statusMessage;try{let n=t?JSON.parse(t):null;n!=null&&n.error&&(o=n.error);let a=[...Array.isArray(n==null?void 0:n.cssErrors)?n.cssErrors.slice(0,5).map(r=>`${r.property}: ${r.className}`):[],...Array.isArray(n==null?void 0:n.schemaErrors)?n.schemaErrors.slice(0,5):[]];a.length>0&&(o=`${o} (${a.join("; ")})`)}catch{}return new f(`HTTP ${s.statusCode}: ${o}`,s.statusCode,e)}var O=class{constructor(e,t={}){this.ffId=e,this.baseURL=t.baseURL||process.env[N.FF_API_URL]||De,this.legacyAuthToken=t.authToken||null,this.authToken=null,this.skipCredentials=t.skipCredentials||!1,process.env[N.FF_USE_LOCAL]==="true"&&(console.log(" \u{1F3E0} Using local token reader"),this.localReader=new ve(e,t))}async getAuthToken(){return this.authToken=await Le({baseURL:this.baseURL,envToken:process.env[N.FF_AUTH_TOKEN],legacyToken:this.legacyAuthToken,skipCredentials:this.skipCredentials}),this.authToken}async fetchJson(e,t={}){let o=await this.getAuthToken();return new Promise((n,a)=>{let r=e.startsWith("https")?b:I;ie(r,e,o,i=>{let u="";if(i.statusCode>=300){a(ce(i,e));return}i.on("data",c=>{u+=c}),i.on("end",()=>{try{let c=JSON.parse(u);t.returnHeaders?n({data:c,headers:i.headers}):n(c)}catch(c){if(J(i,u)){a(new f(_,i.statusCode,e));return}a(new f(`Invalid JSON response: ${c.message}`,i.statusCode,e))}}),i.on("error",c=>{a(new f(`Response error: ${c.message}`,i.statusCode,e))})}).on("error",i=>{a(new f(`Network error: ${i.message}`,0,e))})})}async fetchRaw(e){let t=await this.getAuthToken();return new Promise((o,n)=>{let a=e.startsWith("https")?b:I;ie(a,e,t,r=>{let i="";if(r.statusCode>=400){n(new f(`HTTP ${r.statusCode}: ${r.statusMessage}`,r.statusCode,e));return}r.on("data",u=>{i+=u}),r.on("end",()=>{o(i)}),r.on("error",u=>{n(new f(`Response error: ${u.message}`,r.statusCode,e))})}).on("error",r=>{n(new f(`Network error: ${r.message}`,0,e))})})}async fetchTokens(){if(this.localReader)return this.localReader.fetchTokens();try{let n=`${this.baseURL}/api/design-systems/${this.ffId}/tokens`,a=await this.fetchJson(n);if(a&&a.tokens){let r=a.tokens;return{global:r["Global Tokens/Default"]||r.global||null,colors:r["Global Colors/Default"]||r.colors||null,semantic:r["Semantic/Light"]||r["semantic/light"]||null,semanticDark:r["Semantic/Dark"]||r["semantic/dark"]||null}}}catch(n){if(n.statusCode===400)throw new f("Design system not synced with Figma. Please sync tokens from Figma before using this design system.",400,`${this.baseURL}/api/design-systems/${this.ffId}/tokens`)}let e=F,t={global:`${e}/${this.ffId}/global-tokens/default.json`,colors:`${e}/${this.ffId}/global-colors/default.json`,semantic:`${e}/${this.ffId}/semantic/light.json`,semanticDark:`${e}/${this.ffId}/semantic/dark.json`},o=await Promise.all([this.fetchJson(t.global).catch(n=>n.statusCode===404?null:Promise.reject(n)),this.fetchJson(t.colors).catch(n=>n.statusCode===404?null:Promise.reject(n)),this.fetchJson(t.semantic).catch(n=>n.statusCode===404?null:Promise.reject(n)),this.fetchJson(t.semanticDark).catch(n=>n.statusCode===404?null:Promise.reject(n))]);return{global:o[0],colors:o[1],semantic:o[2],semanticDark:o[3]}}async fetchProcessedTokens(e={}){if(this.localReader)return this.localReader.fetchProcessedTokens();let t=new x(`${this.baseURL}/api/design-systems/${this.ffId}/processed-tokens`);e.tag&&t.searchParams.append("tag",e.tag),e.version&&t.searchParams.append("version",e.version),e.tailwindV4&&t.searchParams.append("tailwind","v4");let o=t.toString();try{let n=await this.fetchJson(o,{returnHeaders:!0});return n.headers&&(n.data.versionMetadata={version:n.headers["x-frontfriend-version"],tag:n.headers["x-frontfriend-tag"],cached:n.headers["x-frontfriend-cached"]==="true"}),n.data}catch(n){if(n.statusCode===404)return null;throw n.statusCode===400?new f("Design system not synced with Figma. Please sync tokens from Figma before using this design system.",400,o):n}}async sendJson(e,t,o){let n=await this.getAuthToken();if(!n)throw new f(_,401,e);return new Promise((a,r)=>{let i=new x(e),u=e.startsWith("https")?b:I,c=JSON.stringify(o||{}),d=u.request({hostname:i.hostname,port:i.port,path:`${i.pathname}${i.search}`,method:t,headers:{"content-type":"application/json","content-length":Buffer.byteLength(c),...n?{authorization:`Bearer ${n}`}:{}}},l=>{let p="";l.on("data",m=>{p+=m}),l.on("end",()=>{if(l.statusCode>=300){r(ce(l,e,p));return}if(!p){a(null);return}try{a(JSON.parse(p))}catch(m){if(J(l,p)){r(new f(_,l.statusCode,e));return}r(new f(`Invalid JSON response: ${m.message}`,l.statusCode,e))}})});d.on("error",l=>{r(new f(`Network error: ${l.message}`,0,e))}),d.write(c),d.end()})}async pushComponentsConfig(e,t,o,n={}){let a=`${this.baseURL}/api/design-systems/${this.ffId}/components-config`,r={componentsConfig:e};return typeof t=="string"&&t.length>0&&(r.customCss=t),typeof o=="string"&&o.length>0&&(r.iconLibrary=o),n.themeStudioRecipe&&typeof n.themeStudioRecipe=="object"&&(r.themeStudioRecipe=n.themeStudioRecipe),this.sendJson(a,"PUT",r)}async fetchComponentsConfig(){if(this.localReader)return this.localReader.fetchComponentsConfig();let e=`${F}/${this.ffId}/components-config.json`;try{return await this.fetchJson(e)}catch(t){if(t.statusCode===404)return null;throw t}}async fetchFonts(){if(this.localReader)return this.localReader.fetchFonts();let e=`${F}/${this.ffId}/font.json`;try{return await this.fetchJson(e)}catch(t){if(t.statusCode===404)return null;throw t}}async fetchIcons(){if(this.localReader)return this.localReader.fetchIcons();let e=`${F}/${this.ffId}/icons.json`;try{return await this.fetchJson(e)}catch(t){if(t.statusCode===404)return null;throw t}}async fetchVersion(){if(this.localReader)return this.localReader.fetchVersion();let e=`${F}/${this.ffId}/version.json`;try{return await this.fetchJson(e)}catch(t){if(t.statusCode===404)return null;throw t}}async fetchCustomCss(){if(this.localReader)return this.localReader.fetchCustomCss();let e=`${F}/${this.ffId}/custom.css`;try{return await this.fetchRaw(e)}catch(t){if(t.statusCode===404)return null;throw t}}async fetchPlanMetadata(){if(this.localReader)return process.env.FF_DEBUG&&console.log(" \u2192 Using local reader for plan metadata"),this.localReader.fetchPlanMetadata();let e=`${this.baseURL}/api/design-systems/${this.ffId}/processed-tokens`;try{process.env.FF_DEBUG&&console.log(` \u2192 Fetching plan metadata from saas app: ${e}`);let t=await this.fetchJson(e);if(t&&t.metadata){let o={planType:t.metadata.planType||"full",allowedComponents:t.metadata.allowedComponents||null};return process.env.FF_DEBUG&&console.log(` \u2192 Found plan metadata in saas app: ${o.planType}, allowed: ${o.allowedComponents?o.allowedComponents.length+" components":"all"}`),o}}catch(t){if(t.statusCode===404){process.env.FF_DEBUG&&console.log(" \u2192 ff-id not found in saas app, trying legacy server");let o=`${F}/${this.ffId}/metadata`;try{process.env.FF_DEBUG&&console.log(` \u2192 Fetching from legacy server: ${o}`);let n=await this.fetchJson(o),a={planType:n.planType||"full",allowedComponents:n.allowedComponents||null};return process.env.FF_DEBUG&&console.log(` \u2192 Found in legacy server: ${a.planType}, allowed: ${a.allowedComponents?a.allowedComponents.length+" components":"all"}`),a}catch(n){if(n.statusCode===404)return process.env.FF_DEBUG&&console.log(" \u2192 ff-id not found in any server - access denied"),{planType:"denied",allowedComponents:[],error:"Design system not found. Please ensure your ff-id is valid."};throw n}}throw t}}};module.exports={APIClient:O};
1
+ var T=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports);var $=T((Ie,M)=>{var le="https://app.dev.frontfriend.dev",he="https://registry-legacy.frontfriend.dev",ue=".cache/frontfriend",fe={JS:["tokens.js","variables.js","semanticVariables.js","semanticDarkVariables.js","safelist.js","custom.js"],JSON:["fonts.json","icons.json","components-config.json","version.json","metadata.json"]},de={FF_ID:"FF_ID",FF_API_URL:"FF_API_URL",FF_USE_LOCAL:"FF_USE_LOCAL",FF_AUTH_TOKEN:"FF_AUTH_TOKEN"};M.exports={DEFAULT_API_URL:le,LEGACY_API_URL:he,CACHE_DIR_NAME:ue,CACHE_TTL_DAYS:7,CACHE_TTL_MS:6048e5,CACHE_FILES:fe,ENV_VARS:de}});var H=T((Ne,q)=>{var R=class extends Error{constructor(e,t,o){super(e),this.name="APIError",this.statusCode=t,this.url=o,this.code=`API_${t}`}},S=class extends Error{constructor(e,t){super(e),this.name="CacheError",this.operation=t,this.code=`CACHE_${t.toUpperCase()}`}},P=class extends Error{constructor(e,t){super(e),this.name="ConfigError",this.field=t,this.code=t?`CONFIG_${String(t).toUpperCase()}`:"CONFIG_ERROR"}},A=class extends Error{constructor(e,t){super(e),this.name="ProcessingError",this.token=t,this.code="PROCESSING_ERROR"}};q.exports={APIError:R,CacheError:S,ConfigError:P,ProcessingError:A}});var U=T((xe,G)=>{var y=require("fs");function pe(n){try{let e=y.readFileSync(n,"utf8");return JSON.parse(e)}catch(e){if(e.code==="ENOENT")return null;throw e}}function me(n){try{return y.readFileSync(n,"utf8").replace(/^\uFEFF/,"")}catch(e){if(e.code==="ENOENT")return null;throw e}}function ye(n,e,t=2){let o=JSON.stringify(e,null,t);y.writeFileSync(n,o,"utf8")}function ge(n,e){y.writeFileSync(n,e,"utf8")}function we(n,e){if(e==null||typeof e=="object"&&Object.keys(e).length===0||Array.isArray(e)&&e.length===0){let o=`module.exports = ${Array.isArray(e)?"[]":"{}"};`;y.writeFileSync(n,o,"utf8")}else{let t=`module.exports = ${JSON.stringify(e,null,2)};`;y.writeFileSync(n,t,"utf8")}}function Ce(n){return y.existsSync(n)}function ke(n){y.mkdirSync(n,{recursive:!0})}function Fe(n){y.rmSync(n,{recursive:!0,force:!0})}G.exports={readJsonFileSafe:pe,readFileSafe:me,writeJsonFile:ye,writeTextFile:ge,writeModuleExportsFile:we,fileExists:Ce,ensureDirectoryExists:ke,removeDirectory:Fe}});var V=T((Je,B)=>{var g=require("path"),{fileExists:D}=U();function Te(n,e=process.cwd()){let t=e;for(;t!==g.parse(t).root;){let o=g.join(t,n);if(D(o))return o;t=g.dirname(t)}return null}function je(n,e=process.cwd(),t=null){let o=[],s=e,a=10;for(let r=0;r<a;r++){o.push(g.join(s,n)),r<3&&o.push(g.join(s,"../".repeat(r+1)+n));let i=g.dirname(s);if(i===s)break;s=i}o.push(g.join(__dirname,"../../../",n));for(let r of o)if(D(r)&&(!t||t(r)))return r;return null}function Ee(n,e=process.cwd()){let t=n.map(o=>g.isAbsolute(o)?o:g.join(e,o));for(let o of t)if(D(o))return o;return null}B.exports={findFileUpward:Te,findDirectoryUpward:je,findDirectoryWithPaths:Ee}});var K=T((Oe,z)=>{var h=require("path"),{findDirectoryUpward:W}=V(),{readJsonFileSafe:w,readFileSafe:Y,fileExists:v}=U(),L=class{constructor(e,t={}){if(this.ffId=e,this.tokensBasePath=t.tokensBasePath||this.findTokensPath(),this.folderMap=this.loadFolderMap(),this.projectFolder=this.folderMap[e],!this.projectFolder)throw new Error(`No folder mapping found for ff-id: ${e}`);this.projectPath=h.join(this.tokensBasePath,this.projectFolder)}findTokensPath(){let e=W("apps/tokens",process.cwd(),t=>v(h.join(t,"folderMap.json")));if(e||(e=W("tokens",process.cwd(),t=>v(h.join(t,"folderMap.json")))),!e)throw new Error("Could not find tokens directory with folderMap.json");return e}loadFolderMap(){let e=h.join(this.tokensBasePath,"folderMap.json"),t=w(e);if(!t)throw new Error("Failed to load folderMap.json: File not found");return t}async fetchTokens(){let e=h.join(this.projectPath,"figma"),t={global:[h.join(e,"Global Tokens","Default.json"),h.join(e,"global.json")],colors:[h.join(e,"Global Colors","Default.json"),h.join(e,"Global Colors","Light.json")],semantic:[h.join(e,"Semantic","Light.json"),h.join(e,"Semantic","Default.json")],semanticDark:[h.join(e,"Semantic","Dark.json")]},o={};for(let[s,a]of Object.entries(t)){for(let r of a){let i=w(r);if(i!==null){o[s]=i;break}}o[s]||(o[s]=null)}return o}async fetchProcessedTokens(){let e=h.join(this.projectPath,"cache");if(!v(e))return null;let t=r=>{if(r===null)return null;let i={},u={exports:i};return new Function("module","exports",r)(u,i),u.exports},o={tokens:{fileName:"hashedTokens.js",type:"module"},variables:{fileName:"hashedVariables.js",type:"module"},semanticVariables:{fileName:"hashedSemanticVariables.js",type:"module"},semanticDarkVariables:{fileName:"hashedSemanticDarkVariables.js",type:"module"},safelist:{fileName:"safelist.js",type:"module"},custom:{fileName:"custom.js",type:"module"},fonts:{fileName:"fonts.json",type:"json"},icons:{fileName:"icons.json",type:"json"},componentsConfig:{fileName:"encoded-config.json",type:"json"},version:{fileName:"version.json",type:"json"}},s={};for(let[r,{fileName:i,type:u}]of Object.entries(o)){let c=h.join(e,i),d=u==="module"?t(Y(c)):w(c);d!==null&&(s[r]=d)}return Object.values(s).some(r=>r!==null)?s:null}async fetchComponentsConfig(){return w(h.join(this.projectPath,"components-config.json"))}async fetchFonts(){return w(h.join(this.projectPath,"font.json"))}async fetchIcons(){return w(h.join(this.projectPath,"icons.json"))}async fetchVersion(){return w(h.join(this.projectPath,"version.json"))}async fetchCustomCss(){return Y(h.join(this.projectPath,"custom.css"))}async fetchPlanMetadata(){return w(h.join(this.projectPath,"metadata.json"))||{planType:"full",allowedComponents:null}}fetchJson(){throw new Error("fetchJson is not implemented in LocalTokenReader. Use specific fetch methods.")}fetchRaw(){throw new Error("fetchRaw is not implemented in LocalTokenReader. Use specific fetch methods.")}};z.exports={LocalTokenReader:L}});var ae=T((Me,re)=>{var C=require("fs"),Q=require("path"),_e=require("os"),$e=require("https"),Re=require("http"),{URL:Se}=require("url"),{DEFAULT_API_URL:X}=$(),Z=Q.join(_e.homedir(),".frontfriend"),k=Q.join(Z,"credentials");function Pe(){return k}function ee(){try{return C.existsSync(k)?JSON.parse(C.readFileSync(k,"utf8")):null}catch{return null}}function te(n){C.mkdirSync(Z,{recursive:!0,mode:448}),C.writeFileSync(k,`${JSON.stringify(n,null,2)}
2
+ `,{mode:384});try{C.chmodSync(k,384)}catch{}}function Ae(){return C.existsSync(k)?(C.unlinkSync(k),!0):!1}function se(n,e=60*1e3){return!(n!=null&&n.accessToken)||!n.expiresAt||Date.now()+e>=n.expiresAt}function E(n){let e=new Error(`${n}. Run \`frontfriend login\` to re-authenticate.`);return e.code="FF_AUTH_REFRESH_FAILED",e}function ne(n,e,t){return new Promise((o,s)=>{let a=new Se(n),r=a.protocol==="https:"?$e:Re,i=JSON.stringify(e||{}),u=r.request({hostname:a.hostname,port:a.port,path:`${a.pathname}${a.search}`,method:"POST",headers:{"content-type":"application/json","content-length":Buffer.byteLength(i),...t?{authorization:`Bearer ${t}`}:{}}},c=>{let d="";c.on("data",l=>{d+=l}),c.on("end",()=>{if(c.statusCode>=300&&c.statusCode<400){let p=c.headers.location?` to ${c.headers.location}`:"",m=new Error(`HTTP ${c.statusCode}: redirected${p}`);m.statusCode=c.statusCode,m.body=d,s(m);return}let l=null;try{l=d?JSON.parse(d):null}catch{let m=c.headers["content-type"]||"unknown content-type",j=new Error(`Expected JSON from FrontFriend API at ${n}, but received ${m} (HTTP ${c.statusCode}). Check FF_API_URL or pass --api-url with the FrontFriend app URL.`);if(j.statusCode=c.statusCode,j.body=d,c.statusCode>=400){s(j);return}s(j);return}if(c.statusCode>=400){let p=new Error((l==null?void 0:l.error_description)||(l==null?void 0:l.error)||`HTTP ${c.statusCode}`);p.statusCode=c.statusCode,p.body=l,s(p);return}o(l)})});u.on("error",s),u.write(i),u.end()})}async function oe(n,e=X){if(!(n!=null&&n.refreshToken)||!(n!=null&&n.deviceId))throw E("FrontFriend session expired");let t;try{t=await ne(`${e}/api/plugin/token`,{grant_type:"refresh_token",refresh_token:n.refreshToken,device_id:n.deviceId})}catch(s){throw E((s==null?void 0:s.message)||"Could not refresh FrontFriend session")}if(!(t!=null&&t.access_token)||!(t!=null&&t.refresh_token))throw E("Could not refresh FrontFriend session");let o={accessToken:t.access_token,refreshToken:t.refresh_token,deviceId:t.device_id||n.deviceId,expiresAt:Date.now()+(t.expires_in||900)*1e3,refreshExpiresAt:Date.now()+(t.refresh_expires_in||604800)*1e3,ffApiUrl:e};return te(o),o}async function Ue(n={}){if(!n.skipCredentials){let e=ee();if(e!=null&&e.accessToken||e!=null&&e.refreshToken){let t=n.baseURL||e.ffApiUrl||X;return e.accessToken&&!se(e)?e.accessToken:(await oe(e,t)).accessToken}}return n.envToken?n.envToken:n.legacyToken?(n.silent||console.warn("\u26A0\uFE0F auth-token in frontfriend.config.js is deprecated. Run `frontfriend login` to store credentials outside the repo."),n.legacyToken):null}re.exports={getCredentialsPath:Pe,readCredentials:ee,writeCredentials:te,deleteCredentials:Ae,isExpired:se,postJson:ne,refreshCredentials:oe,resolveAuthToken:Ue,createAuthRefreshError:E}});var b=require("https"),I=require("http"),{URL:x}=require("url"),{DEFAULT_API_URL:De,LEGACY_API_URL:F,ENV_VARS:N}=$(),{APIError:f}=H(),{LocalTokenReader:ve}=K(),{resolveAuthToken:Le}=ae(),_="Authentication required. Run `frontfriend login` to re-authenticate.";function ie(n,e,t,o){return t?n.get(new x(e),{headers:{authorization:`Bearer ${t}`}},o):n.get(e,o)}function J(n,e=""){var o;let t=((o=n.headers)==null?void 0:o.location)||"";return n.statusCode===401||n.statusCode===403||n.statusCode>=300&&n.statusCode<400&&t.includes("/sign-in")||String(e).trim().startsWith("/sign-in")}function ce(n,e,t=""){if(J(n,t))return new f(_,n.statusCode,e);let o=n.statusMessage;try{let s=t?JSON.parse(t):null;s!=null&&s.error&&(o=s.error);let a=[...Array.isArray(s==null?void 0:s.cssErrors)?s.cssErrors.slice(0,5).map(r=>`${r.property}: ${r.className}`):[],...Array.isArray(s==null?void 0:s.schemaErrors)?s.schemaErrors.slice(0,5):[]];a.length>0&&(o=`${o} (${a.join("; ")})`)}catch{}return new f(`HTTP ${n.statusCode}: ${o}`,n.statusCode,e)}var O=class{constructor(e,t={}){this.ffId=e,this.baseURL=t.baseURL||process.env[N.FF_API_URL]||De,this.legacyAuthToken=t.authToken||null,this.authToken=null,this.skipCredentials=t.skipCredentials||!1,process.env[N.FF_USE_LOCAL]==="true"&&(console.log(" \u{1F3E0} Using local token reader"),this.localReader=new ve(e,t))}async getAuthToken(){return this.authToken=await Le({baseURL:this.baseURL,envToken:process.env[N.FF_AUTH_TOKEN],legacyToken:this.legacyAuthToken,skipCredentials:this.skipCredentials}),this.authToken}async fetchJson(e,t={}){let o=await this.getAuthToken();return new Promise((s,a)=>{let r=e.startsWith("https")?b:I;ie(r,e,o,i=>{let u="";if(i.statusCode>=300){a(ce(i,e));return}i.on("data",c=>{u+=c}),i.on("end",()=>{try{let c=JSON.parse(u);t.returnHeaders?s({data:c,headers:i.headers}):s(c)}catch(c){if(J(i,u)){a(new f(_,i.statusCode,e));return}a(new f(`Invalid JSON response: ${c.message}`,i.statusCode,e))}}),i.on("error",c=>{a(new f(`Response error: ${c.message}`,i.statusCode,e))})}).on("error",i=>{a(new f(`Network error: ${i.message}`,0,e))})})}async fetchRaw(e){let t=await this.getAuthToken();return new Promise((o,s)=>{let a=e.startsWith("https")?b:I;ie(a,e,t,r=>{let i="";if(r.statusCode>=400){s(new f(`HTTP ${r.statusCode}: ${r.statusMessage}`,r.statusCode,e));return}r.on("data",u=>{i+=u}),r.on("end",()=>{o(i)}),r.on("error",u=>{s(new f(`Response error: ${u.message}`,r.statusCode,e))})}).on("error",r=>{s(new f(`Network error: ${r.message}`,0,e))})})}async fetchTokens(){if(this.localReader)return this.localReader.fetchTokens();try{let s=`${this.baseURL}/api/design-systems/${this.ffId}/tokens`,a=await this.fetchJson(s);if(a&&a.tokens){let r=a.tokens;return{global:r["Global Tokens/Default"]||r.global||null,colors:r["Global Colors/Default"]||r.colors||null,semantic:r["Semantic/Light"]||r["semantic/light"]||null,semanticDark:r["Semantic/Dark"]||r["semantic/dark"]||null}}}catch(s){if(s.statusCode===400)throw new f("Design system not synced with Figma. Please sync tokens from Figma before using this design system.",400,`${this.baseURL}/api/design-systems/${this.ffId}/tokens`)}let e=F,t={global:`${e}/${this.ffId}/global-tokens/default.json`,colors:`${e}/${this.ffId}/global-colors/default.json`,semantic:`${e}/${this.ffId}/semantic/light.json`,semanticDark:`${e}/${this.ffId}/semantic/dark.json`},o=await Promise.all([this.fetchJson(t.global).catch(s=>s.statusCode===404?null:Promise.reject(s)),this.fetchJson(t.colors).catch(s=>s.statusCode===404?null:Promise.reject(s)),this.fetchJson(t.semantic).catch(s=>s.statusCode===404?null:Promise.reject(s)),this.fetchJson(t.semanticDark).catch(s=>s.statusCode===404?null:Promise.reject(s))]);return{global:o[0],colors:o[1],semantic:o[2],semanticDark:o[3]}}async fetchProcessedTokens(e={}){if(this.localReader)return this.localReader.fetchProcessedTokens();let t=new x(`${this.baseURL}/api/design-systems/${this.ffId}/processed-tokens`);e.tag&&t.searchParams.append("tag",e.tag),e.version&&t.searchParams.append("version",e.version),e.tailwindV4&&t.searchParams.append("tailwind","v4");let o=t.toString();try{let s=await this.fetchJson(o,{returnHeaders:!0});return s.headers&&(s.data.versionMetadata={version:s.headers["x-frontfriend-version"],tag:s.headers["x-frontfriend-tag"],cached:s.headers["x-frontfriend-cached"]==="true"}),s.data}catch(s){if(s.statusCode===404)return null;throw s.statusCode===400?new f("Design system not synced with Figma. Please sync tokens from Figma before using this design system.",400,o):s}}async sendJson(e,t,o){let s=await this.getAuthToken();if(!s)throw new f(_,401,e);return new Promise((a,r)=>{let i=new x(e),u=e.startsWith("https")?b:I,c=JSON.stringify(o||{}),d=u.request({hostname:i.hostname,port:i.port,path:`${i.pathname}${i.search}`,method:t,headers:{"content-type":"application/json","content-length":Buffer.byteLength(c),...s?{authorization:`Bearer ${s}`}:{}}},l=>{let p="";l.on("data",m=>{p+=m}),l.on("end",()=>{if(l.statusCode>=300){r(ce(l,e,p));return}if(!p){a(null);return}try{a(JSON.parse(p))}catch(m){if(J(l,p)){r(new f(_,l.statusCode,e));return}r(new f(`Invalid JSON response: ${m.message}`,l.statusCode,e))}})});d.on("error",l=>{r(new f(`Network error: ${l.message}`,0,e))}),d.write(c),d.end()})}async pushComponentsConfig(e,t,o,s={}){let a=`${this.baseURL}/api/design-systems/${this.ffId}/components-config`,r={componentsConfig:e};return typeof t=="string"&&t.length>0&&(r.customCss=t),typeof o=="string"&&o.length>0&&(r.iconLibrary=o),s.themeStudioRecipe&&typeof s.themeStudioRecipe=="object"&&(r.themeStudioRecipe=s.themeStudioRecipe),this.sendJson(a,"PUT",r)}async migrateComponents(e){let t=`${this.baseURL}/api/design-systems/${this.ffId}/migrate`;return this.sendJson(t,"POST",e)}async listMigrationSnapshots(){let e=`${this.baseURL}/api/design-systems/${this.ffId}/migrate/snapshots`;return this.fetchJson(e)}async getMigrationSnapshot(e){let t=`${this.baseURL}/api/design-systems/${this.ffId}/migrate/snapshots/${e}`;return this.fetchJson(t)}async fetchComponentsConfig(){if(this.localReader)return this.localReader.fetchComponentsConfig();let e=`${F}/${this.ffId}/components-config.json`;try{return await this.fetchJson(e)}catch(t){if(t.statusCode===404)return null;throw t}}async fetchFonts(){if(this.localReader)return this.localReader.fetchFonts();let e=`${F}/${this.ffId}/font.json`;try{return await this.fetchJson(e)}catch(t){if(t.statusCode===404)return null;throw t}}async fetchIcons(){if(this.localReader)return this.localReader.fetchIcons();let e=`${F}/${this.ffId}/icons.json`;try{return await this.fetchJson(e)}catch(t){if(t.statusCode===404)return null;throw t}}async fetchVersion(){if(this.localReader)return this.localReader.fetchVersion();let e=`${F}/${this.ffId}/version.json`;try{return await this.fetchJson(e)}catch(t){if(t.statusCode===404)return null;throw t}}async fetchCustomCss(){if(this.localReader)return this.localReader.fetchCustomCss();let e=`${F}/${this.ffId}/custom.css`;try{return await this.fetchRaw(e)}catch(t){if(t.statusCode===404)return null;throw t}}async fetchPlanMetadata(){if(this.localReader)return process.env.FF_DEBUG&&console.log(" \u2192 Using local reader for plan metadata"),this.localReader.fetchPlanMetadata();let e=`${this.baseURL}/api/design-systems/${this.ffId}/processed-tokens`;try{process.env.FF_DEBUG&&console.log(` \u2192 Fetching plan metadata from saas app: ${e}`);let t=await this.fetchJson(e);if(t&&t.metadata){let o={planType:t.metadata.planType||"full",allowedComponents:t.metadata.allowedComponents||null};return process.env.FF_DEBUG&&console.log(` \u2192 Found plan metadata in saas app: ${o.planType}, allowed: ${o.allowedComponents?o.allowedComponents.length+" components":"all"}`),o}}catch(t){if(t.statusCode===404){process.env.FF_DEBUG&&console.log(" \u2192 ff-id not found in saas app, trying legacy server");let o=`${F}/${this.ffId}/metadata`;try{process.env.FF_DEBUG&&console.log(` \u2192 Fetching from legacy server: ${o}`);let s=await this.fetchJson(o),a={planType:s.planType||"full",allowedComponents:s.allowedComponents||null};return process.env.FF_DEBUG&&console.log(` \u2192 Found in legacy server: ${a.planType}, allowed: ${a.allowedComponents?a.allowedComponents.length+" components":"all"}`),a}catch(s){if(s.statusCode===404)return process.env.FF_DEBUG&&console.log(" \u2192 ff-id not found in any server - access denied"),{planType:"denied",allowedComponents:[],error:"Design system not found. Please ensure your ff-id is valid."};throw s}}throw t}}};module.exports={APIClient:O};
3
3
  //# sourceMappingURL=api-client.js.map