@salty-css/vite 0.0.1-alpha.267 → 0.0.1-alpha.269

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/index.cjs +1 -46
  2. package/index.js +12 -714
  3. package/package.json +2 -2
package/index.cjs CHANGED
@@ -1,46 +1 @@
1
- "use strict";var Mt=Object.defineProperty;var Rt=(e,t,s)=>t in e?Mt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var st=(e,t,s)=>Rt(e,typeof t!="symbol"?t+"":t,s);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const zt=require("esbuild"),Wt=require("child_process"),c=require("path"),p=require("fs"),dt=require("fs/promises"),X=require("winston"),ft=require("typescript");var ut=typeof document<"u"?document.currentScript:null;function Jt(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const s in e)if(s!=="default"){const n=Object.getOwnPropertyDescriptor(e,s);Object.defineProperty(t,s,n.get?n:{enumerable:!0,get:()=>e[s]})}}return t.default=e,Object.freeze(t)}const Ft=Jt(zt),St=e=>String.fromCharCode(e+(e>25?39:97)),At=(e,t)=>{let s="",n;for(n=Math.abs(e);n>52;n=n/52|0)s=St(n%52)+s;return s=St(n%52)+s,s.length<t?s=s.padStart(t,"a"):s.length>t&&(s=s.slice(-t)),s},It=(e,t)=>{let s=t.length;for(;s;)e=e*33^t.charCodeAt(--s);return e},I=(e,t=5)=>{const s=It(5381,JSON.stringify(e))>>>0;return At(s,t)};function R(e){return e?typeof e!="string"?R(String(e)):e.replace(/[\s.]/g,"-").replace(/[A-Z](?:(?=[^A-Z])|[A-Z]*(?=[A-Z][^A-Z]|$))/g,(t,s)=>(s>0?"-":"")+t.toLowerCase()):""}const qt=e=>t=>{if(typeof t!="string"||!e)return;let s=t;const n=[];return Object.values(e).forEach(o=>{const{pattern:i,transform:r}=o;s=s.replace(i,m=>{const{value:g,css:y}=r(m);return y&&n.push(y),g})}),{transformed:s,additionalCss:n}},Ct=e=>t=>typeof t!="string"||!/\{[^{}]+\}/g.test(t)?void 0:{transformed:t.replace(/\{([^{}]+)\}/g,(...o)=>{const i=R(o[1].replaceAll(".","-"));return i.startsWith("-")?`-${i}`:`var(--${i})`})},Ht=Ct(),Gt=e=>t=>{const{screenSize:s,axis:n="horizontal",minMultiplier:o=.5,maxMultiplier:i=1.5}=e,r=Math.round(t/s*1e4)/100,m=n==="vertical"?"vh":"vw",g=Math.round(o*t),y=Math.round(i*t);return`clamp(${g}px, ${r}${m}, ${y}px)`},Lt=["top","right","bottom","left","min-width",/.*width.*/,/^[^line]*height.*/,/padding.*/,/margin.*/,/border.*/,/inset.*/,/.*radius.*/,/.*spacing.*/,/.*gap.*/,/.*indent.*/,/.*offset.*/,/.*size.*/,/.*thickness.*/,/.*font-size.*/],Qt=(e,t,s)=>{if(Lt.some(o=>typeof o=="string"?o===e:o.test(e))){const o="px";if(o.startsWith("viewport-clamp:"))try{const r=o.split(":")[1];return Gt({screenSize:parseInt(r)})(Number(t))}catch(r){throw console.error(r),new Error(`Invalid viewport-clamp value: ${o}`)}return`${t}${o}`}return`${t}`},Ut=["Webkit","Moz","ms","O"],Kt=e=>e.startsWith("-")?e:Ut.some(t=>e.startsWith(t))?`-${R(e)}`:R(e),nt=async(e,t="",s,n=!1)=>{if(!e)throw new Error("No styles provided to parseStyles function!");const o=new Set,i=Object.entries(e),r=async([d,u])=>{const $=d.trim().replace(/^\?+/g,""),P=Kt($),v=(k,W=";")=>`${P}:${k}${W}`,E={scope:t,config:s};if(typeof u=="function")return r([d,u(E)]);if(u instanceof Promise)return r([d,await u]);if(typeof u=="object"){if(!u)return;if(u.isColor)return v(u.toString());if($==="defaultVariants")return;if($==="variants"){const N=Object.entries(u);for(const[V,f]of N){if(!f)continue;const S=Object.entries(f);for(const[F,a]of S){if(!a)continue;const C=`${t}.${V}-${F}`;(await nt(a,C,s)).forEach(M=>o.add(M))}}return}if($==="compoundVariants"){for(const N of u){const{css:V,...f}=N,S=Object.entries(f).reduce((a,[C,_])=>`${a}.${C}-${_}`,t);(await nt(V,S,s)).forEach(a=>o.add(a))}return}if($.startsWith("@")){const N=$,V=await Y(u,t,s),f=`${N} { ${V} }`;o.add(f);return}const k=d.includes("&")?$.replaceAll("&",t):$.startsWith(":")?`${t}${$}`:`${t} ${$}`;(await nt(u,k,s)).forEach(N=>o.add(N));return}if(typeof u=="number"){const k=Qt(P,u);return v(k)}if(typeof u!="string")if("toString"in u)u=u.toString();else throw new Error(`Invalid value type for property ${P}`);return v(u)},m=i.map(r),{modifiers:g}={},y=[Ct(),qt(g)],w=(await Promise.all(m).then(d=>Promise.all(d.map(u=>y.reduce(async($,P)=>{const v=await $;if(!v)return v;const E=await P(v);if(!E)return v;const{transformed:k,additionalCss:W}=E;let N="";if(W)for(const V of W)N+=await Y(V,"");return`${N}${k}`},Promise.resolve(u)))))).filter(d=>d!==void 0).join(`
2
- `);if(!w.trim())return Array.from(o);const h=t?`${t} {
3
- ${w}
4
- }`:w;return o.has(h)?Array.from(o):[h,...o]},Y=async(e,t,s,n=!1)=>(await nt(e,t,s,n)).join(`
5
- `),Pt=async(e,t=[])=>{if(!e)return"";const s=[],n={};for(const[o,i]of Object.entries(e))if(typeof i!="function")if(i&&typeof i=="object"){const r=o.trim(),m=await Pt(i,[...t,r]);s.push(m)}else n[o]=i;if(Object.keys(n).length){const o=t.map(R).join("-"),i="t_"+I(o,4),r=await Y(n,`.${o}, .${i}`);s.push(r)}return s.join(`
6
- `)},Zt=e=>e?Object.entries(e).reduce((t,[s,n])=>(typeof n=="function"?t[s]="any":typeof n=="object"&&(t[s]=Nt(n).map(o=>`"${o}"`).join(" | ")),t),{}):{},Nt=(e,t="",s=new Set)=>e?(Object.entries(e).forEach(([n,o])=>{const i=t?`${t}.${n}`:n;return typeof o=="object"?Nt(o,i,s):s.add(t)}),[...s]):[],_t=e=>{if(!e||e==="/")throw new Error("Could not find package.json file");const t=c.join(e,"package.json");return p.existsSync(t)?t:_t(c.join(e,".."))},Bt=async e=>{const t=_t(e);return await dt.readFile(t,"utf-8").then(JSON.parse).catch(()=>{})},Xt=async e=>{const t=await Bt(e);if(t)return t.type};let H;const xt=async e=>{if(H)return H;const t=await Xt(e);return t==="module"?H="esm":(t==="commonjs"||(typeof document>"u"?require("url").pathToFileURL(__filename).href:ut&&ut.tagName.toUpperCase()==="SCRIPT"&&ut.src||new URL("index.cjs",document.baseURI).href).endsWith(".cjs"))&&(H="cjs"),H||"esm"},pt=X.createLogger({level:"debug",format:X.format.combine(X.format.colorize(),X.format.cli()),transports:[new X.transports.Console({})]});function vt(e){return e?typeof e!="string"?vt(String(e)):e.replace(/[^\d\w]/g,"."):""}const Yt={"*, *::before, *::after":{boxSizing:"border-box"},"*":{margin:0},html:{lineHeight:1.15,textSizeAdjust:"100%",WebkitFontSmoothing:"antialiased"},"img, picture, video, canvas, svg":{display:"block",maxWidth:"100%"},"p, h1, h2, h3, h4, h5, h6":{overflowWrap:"break-word"},p:{textWrap:"pretty"},"h1, h2, h3, h4, h5, h6":{textWrap:"balance"},a:{color:"currentColor"},button:{lineHeight:"1em",color:"currentColor"},"input, optgroup, select, textarea":{fontFamily:"inherit",fontSize:"100%",lineHeight:"1.15em"}},G=(...e)=>e.flat().reduce((t,s)=>s!=null&&s._current?{...t,...s._current}:{...t,...s},{}),te=(...e)=>e.flat().reduce((t,s)=>({...t,...s._children}),{});class ee{constructor(t){st(this,"_path");this.params=t}get _current(){return this.params.template}get isDefineTemplate(){return!0}_setPath(t){return this._path=t,this}}class se{constructor(t){st(this,"_path");st(this,"templates",[]);this.params=t,Object.entries(t).forEach(([s,n])=>{this.templates.push(new ee({name:s,template:n}))})}get _current(){return this.params}get _children(){return Object.fromEntries(this.templates.map(t=>[t.params.name,t]))}get isDefineTemplates(){return!0}_setPath(t){return this._path=t,this.templates.forEach(s=>s._setPath(t)),this}}const ne=e=>new se(e),oe=(e,t)=>new Promise((s,n)=>{const o=setTimeout(()=>{n(new Error("Timeout"))},100),i=ft.createSourceFile("temp.ts",e,ft.ScriptTarget.Latest,!0);function r(m){if(ft.isVariableDeclaration(m)&&m.name.getText()===t){const g=m.getStart(),y=m.getEnd();clearTimeout(o),s([g,y])}m.forEachChild(r)}r(i)}),z={externalModules:[],rcFile:void 0,destDir:void 0},Tt=e=>{if(z.externalModules.length>0)return z.externalModules;const s=p.readFileSync(e,"utf8").match(/externalModules:\s?\[(.*)\]/);if(!s)return[];const n=s[1].split(",").map(o=>o.replace(/['"`]/g,"").trim());return z.externalModules=n,n},q=async e=>{if(z.destDir)return z.destDir;const t=await mt(e),s=c.join(e,(t==null?void 0:t.saltygenDir)||"saltygen");return z.destDir=s,s},kt=["salty","css","styles","styled"],re=(e=[])=>new RegExp(`\\.(${[...kt,...e].join("|")})\\.`),L=(e,t=[])=>re(t).test(e),Dt=async e=>{if(z.rcFile)return z.rcFile;if(e==="/")throw new Error("Could not find .saltyrc.json file");const t=c.join(e,".saltyrc.json"),s=await dt.readFile(t,"utf-8").then(JSON.parse).catch(()=>{});return s?(z.rcFile=s,s):Dt(c.join(e,".."))},mt=async e=>{var n,o;const t=await Dt(e),s=(n=t.projects)==null?void 0:n.find(i=>e.endsWith(i.dir||""));return s||((o=t.projects)==null?void 0:o.find(i=>i.dir===t.defaultProject))},ie=async e=>{const t=await mt(e),s=await q(e),n=c.join(e,(t==null?void 0:t.configDir)||"","salty.config.ts"),o=c.join(s,"salty.config.js"),i=await xt(e),r=Tt(n);await Ft.build({entryPoints:[n],minify:!0,treeShaking:!0,bundle:!0,outfile:o,format:i,external:r});const m=Date.now(),{config:g}=await import(`${o}?t=${m}`);return{config:g,path:o}},ae=async(e,t)=>{var gt,wt;const s=await q(e),n={mediaQueries:[],globalStyles:[],variables:[],templates:[]};await Promise.all([...t].map(async j=>{const{contents:x,outputFilePath:Z}=await ot(e,j,s);Object.entries(x).forEach(([D,T])=>{T.isMedia?n.mediaQueries.push([D,T]):T.isGlobalDefine?n.globalStyles.push(T):T.isDefineVariables?n.variables.push(T):T.isDefineTemplates&&n.templates.push(T._setPath(`${D};;${Z}`))})}));const{config:o,path:i}=await ie(e),r={...o},{mediaQueries:m}=n;r.mediaQueries=Object.fromEntries(m.map(([j,x])=>[`@${j}`,x]));const g=m.map(([j])=>`'@${j}'`).join(" | "),y=new Set,l=async(j,x=[])=>{if(!j)return[];const Z=Object.entries(j).map(async([T,A])=>{const B=async O=>{if(!O)return;if(O instanceof Promise)return await B(await O);if(typeof O=="function")return await B(await O());if(typeof O=="object")return await l(O,[...x,T]);const at=vt(T),ct=R(T),lt=[...x,at].join(".");y.add(`"${lt}"`);const et=[...x.map(R),ct].join("-"),$t=Ht(O);return $t?`--${et}: ${$t.transformed};`:`--${et}: ${O};`};return await B(A)});return(await Promise.all(Z)).flat()},w=async j=>{if(!j)return[];const x=Object.entries(j).map(async([D,T])=>{const A=await l(T);return D==="base"?A.join(""):r.mediaQueries[D]?`${r.mediaQueries[D]} { ${A.join("")} }`:`${D} { ${A.join("")} }`});return(await Promise.all(x)).flat()},h=async j=>{if(!j)return[];const x=Object.entries(j).map(async([D,T])=>{const A=Object.entries(T).map(async([O,at])=>{const ct=await l(at,[D]),lt=`.${D}-${O}, [data-${D}="${O}"]`,et=ct.join("");return`${lt} { ${et} }`});return(await Promise.all(A)).flat()});return(await Promise.all(x)).flat()},b=j=>({...j,responsive:void 0,conditional:void 0}),d=j=>n.variables.map(x=>j==="static"?b(x._current):x._current[j]),u=G(b(o.variables),d("static")),$=await l(u),P=G((gt=o.variables)==null?void 0:gt.responsive,d("responsive")),v=await w(P),E=G((wt=o.variables)==null?void 0:wt.conditional,d("conditional")),k=await h(E),W=c.join(s,"css/_variables.css"),N=`:root { ${$.join("")} ${v.join("")} } ${k.join("")}`;p.writeFileSync(W,N),r.staticVariables=u;const V=c.join(s,"css/_global.css"),f=G(o.global,n.globalStyles),S=await Y(f,"");p.writeFileSync(V,`@layer global { ${S} }`);const F=c.join(s,"css/_reset.css"),C=o.reset==="none"?{}:typeof o.reset=="object"?o.reset:Yt,_=await Y(C,"");p.writeFileSync(F,`@layer reset { ${_} }`);const M=c.join(s,"css/_templates.css"),J=G(o.templates,n.templates),Q=await Pt(J),U=Zt(J);p.writeFileSync(M,`@layer templates { ${Q} }`),r.templates=J;const tt=o.templates?[ne(o.templates)._setPath(`config;;${i}`)]:[],rt=te(n.templates,tt);r.templatePaths=Object.fromEntries(Object.entries(rt).map(([j,x])=>[j,x._path]));const K=c.join(s,"types/css-tokens.d.ts"),Et=`
7
- // Variable types
8
- type VariableTokens = ${[...y].join("|")};
9
- type PropertyValueToken = \`{\${VariableTokens}}\`;
10
-
11
- // Template types
12
- type TemplateTokens = {
13
- ${Object.entries(U).map(([j,x])=>`${j}?: ${x}`).join(`
14
- `)}
15
- }
16
-
17
- // Media query types
18
- type MediaQueryKeys = ${g||"''"};
19
- `;p.writeFileSync(K,Et);const Vt=c.join(s,"cache/config-cache.json");p.writeFileSync(Vt,JSON.stringify(r,null,2))},bt=e=>e.replace(/styled\(([^"'`{,]+),/g,(t,s)=>{if(/^['"`]/.test(s))return t;const o=new RegExp(`import[^;]*${s}[,\\s{][^;]*from\\s?([^{};]+);`);if(!o.test(e))return t;const r=o.exec(e);if(r){const m=r.at(1);if(kt.some(y=>m==null?void 0:m.includes(y)))return t}return"styled('div',"}),ce=(e,t)=>{try{const s=p.readFileSync(c.join(t,"saltygen/cache/config-cache.json"),"utf8");return s?`globalThis.saltyConfig = ${s};
20
-
21
- ${e}`:`globalThis.saltyConfig = {};
22
-
23
- ${e}`}catch{return e}},ot=async(e,t,s)=>{const n=I(t),o=c.join(s,"./temp");p.existsSync(o)||p.mkdirSync(o);const i=c.parse(t);let r=p.readFileSync(t,"utf8");r=bt(r),r=ce(r,e);const m=c.join(s,"js",n+".js"),g=await mt(e),y=c.join(e,(g==null?void 0:g.configDir)||"","salty.config.ts"),l=Tt(y),w=await xt(e);await Ft.build({stdin:{contents:r,sourcefile:i.base,resolveDir:i.dir,loader:"tsx"},minify:!1,treeShaking:!0,bundle:!0,outfile:m,format:w,target:["node20"],keepNames:!0,external:l,packages:"external",plugins:[{name:"test",setup:d=>{d.onLoad({filter:/.*\.css|salty|styles|styled\.ts/},u=>{const $=p.readFileSync(u.path,"utf8");return{contents:bt($),loader:"ts"}})}}]});const h=Date.now();return{contents:await import(`${m}?t=${h}`),outputFilePath:m}},le=async e=>{const t=await q(e),s=c.join(t,"cache/config-cache.json"),n=p.readFileSync(s,"utf8");if(!n)throw new Error("Could not find config cache file");return JSON.parse(n)},yt=async e=>{const t=await le(e),s=await q(e),n=c.join(s,"salty.config.js"),o=Date.now(),{config:i}=await import(`${n}?t=${o}`);return G(i,t)},ht=()=>{try{return process.env.NODE_ENV==="production"}catch{return!1}},fe=async(e,t=ht(),s=!0)=>{try{const n=Date.now();t?pt.info("Generating CSS in production mode! 🔥"):pt.info("Generating CSS in development mode! 🚀");const o=[],i=[],r=await q(e),m=c.join(r,"index.css");s&&(()=>{p.existsSync(r)&&Wt.execSync("rm -rf "+r),p.mkdirSync(r,{recursive:!0}),p.mkdirSync(c.join(r,"css")),p.mkdirSync(c.join(r,"types")),p.mkdirSync(c.join(r,"js")),p.mkdirSync(c.join(r,"cache"))})();const y=new Set,l=new Set;async function w(f){const S=["node_modules","saltygen"],F=p.statSync(f);if(F.isDirectory()){const a=p.readdirSync(f);if(S.some(_=>f.includes(_)))return;await Promise.all(a.map(_=>w(c.join(f,_))))}else if(F.isFile()&&L(f)){y.add(f);const C=p.readFileSync(f,"utf8");/define[\w\d]+\(/.test(C)&&l.add(f)}}await w(e),await ae(e,l);const h={keyframes:[],components:[],classNames:[]};await Promise.all([...y].map(async f=>{const{contents:S}=await ot(e,f,r);for(let[F,a]of Object.entries(S))a instanceof Promise&&(a=await a),a.isKeyframes?h.keyframes.push({value:a,src:f,name:F}):a.isClassName?h.classNames.push({...a,src:f,name:F}):a.generator&&h.components.push({...a,src:f,name:F})}));const b=await yt(e);for(const f of h.keyframes){const{value:S}=f,F=`a_${S.animationName}.css`,a=`css/${F}`,C=c.join(r,a);o.push(F),p.writeFileSync(C,S.css)}const d={};for(const f of h.components){const{src:S,name:F}=f;d[S]||(d[S]=[]);const a=f.generator._withBuildContext({callerName:F,isProduction:t,config:b});i[a.priority]||(i[a.priority]=[]);const C=await a.css;if(!C)continue;i[a.priority].push(a.cssFileName);const _=`css/${a.cssFileName}`,M=c.join(r,_);p.writeFileSync(M,C),b.importStrategy==="component"&&d[S].push(a.cssFileName)}for(const f of h.classNames){const{src:S,name:F}=f;d[S]||(d[S]=[]);const a=f.generator._withBuildContext({callerName:F,isProduction:t,config:b}),C=await a.css;if(!C)continue;i[a.priority]||(i[a.priority]=[]),i[a.priority].push(a.cssFileName);const _=`css/${a.cssFileName}`,M=c.join(r,_);p.writeFileSync(M,C),b.importStrategy==="component"&&d[S].push(a.cssFileName)}b.importStrategy==="component"&&Object.entries(d).forEach(([f,S])=>{const F=S.map(J=>`@import url('./${J}');`).join(`
24
- `),a=I(f,6),C=c.parse(f),_=R(C.name),M=c.join(r,`css/f_${_}-${a}.css`);p.writeFileSync(M,F||"/* Empty file */")});const u=o.map(f=>`@import url('./css/${f}');`).join(`
25
- `);let k=`/*!
26
- * Generated with Salty CSS (https://salty-css.dev)
27
- * Do not edit this file directly
28
- */
29
- @layer reset, global, templates, l0, l1, l2, l3, l4, l5, l6, l7, l8;
30
-
31
- ${["_variables.css","_reset.css","_global.css","_templates.css"].filter(f=>{try{return p.readFileSync(c.join(r,"css",f),"utf8").length>0}catch{return!1}}).map(f=>`@import url('./css/${f}');`).join(`
32
- `)}
33
- ${u}`;if(b.importStrategy!=="component"){const f=i.reduce((S,F,a)=>{const C=F.reduce((Q,U)=>{var it;const tt=c.join(r,"css",U),rt=p.readFileSync(tt,"utf8"),K=((it=/.*-([^-]+)-\d+.css/.exec(U))==null?void 0:it.at(1))||I(tt,6);return Q.includes(K)?Q:`${Q}
34
- /*start:${K}-${U}*/
35
- ${rt}
36
- /*end:${K}*/
37
- `},""),_=`l_${a}.css`,M=c.join(r,"css",_),J=`@layer l${a} { ${C}
38
- }`;return p.writeFileSync(M,J),`${S}
39
- @import url('./css/${_}');`},"");k+=f}p.writeFileSync(m,k);const N=Date.now()-n,V=N<200?"🔥":N<500?"🚀":N<1e3?"🎉":N<2e3?"🚗":N<5e3?"🤔":"🥴";pt.info(`Generated CSS in ${N}ms! ${V}`)}catch(n){console.error(n)}},ue=async(e,t,s=ht())=>{try{const n=await q(e);if(L(t)){const i=[],r=await yt(e),{contents:m}=await ot(e,t,n);for(const[g,y]of Object.entries(m)){if(y.isKeyframes&&y.css){const u=`css/${`a_${y.animationName}.css`}`,$=c.join(n,u);p.writeFileSync($,await y.css);continue}if(y.isClassName){const d=y.generator._withBuildContext({callerName:g,isProduction:s,config:r}),u=await d.css;if(!u)continue;i[d.priority]||(i[d.priority]=[]),i[d.priority].push(d.cssFileName);const $=`css/${d.cssFileName}`,P=c.join(n,$);p.writeFileSync(P,u);continue}if(!y.generator)continue;const l=y.generator._withBuildContext({callerName:g,isProduction:s,config:r}),w=await l.css;if(!w)continue;const h=`css/${l.cssFileName}`,b=c.join(n,h);p.writeFileSync(b,w),i[l.priority]||(i[l.priority]=[]),i[l.priority].push(l.cssFileName)}if(r.importStrategy!=="component")i.forEach((g,y)=>{const l=`l_${y}.css`,w=c.join(n,"css",l);let h=p.readFileSync(w,"utf8");g.forEach(b=>{var P;const d=c.join(n,"css",b),u=((P=/.*-([^-]+)-\d+.css/.exec(b))==null?void 0:P.at(1))||I(d,6);if(!h.includes(u)){const v=p.readFileSync(d,"utf8"),E=`/*start:${u}-${b}*/
40
- ${v}
41
- /*end:${u}*/
42
- `;h=`${h.replace(/\}$/,"")}
43
- ${E}
44
- }`}}),p.writeFileSync(w,h)});else{const g=i.flat().map(b=>`@import url('./${b}');`).join(`
45
- `),y=I(t,6),l=c.parse(t),w=R(l.name),h=c.join(n,`css/f_${w}-${y}.css`);p.writeFileSync(h,g||"/* Empty file */")}}}catch(n){console.error(n)}},pe=async(e,t,s=ht())=>{var n,o;try{const i=await q(e);if(L(t)){const m=p.readFileSync(t,"utf8"),g=await yt(e),{contents:y}=await ot(e,t,i);let l=m;for(const[w,h]of Object.entries(y)){if(h.isKeyframes||!h.generator)continue;const b=h.generator._withBuildContext({callerName:w,isProduction:s,config:g}),[d,u]=await oe(l,w),$=l.slice(d,u);if(h.isClassName){const P=l,v=` ${w} = className("${b.classNames}")`;l=l.replace($,v),P===l&&console.error("Minimize file failed to change content",{name:w})}if($.includes("styled")){const P=(o=(n=/styled\(([^,]+),/.exec($))==null?void 0:n.at(1))==null?void 0:o.trim(),v=l,E=` ${w} = styled(${P}, "${b.classNames}", ${JSON.stringify(b.clientProps)})`;l=l.replace($,E),v===l&&console.error("Minimize file failed to change content",{name:w,tagName:P})}}if(g.importStrategy==="component"){const w=I(t,6),h=c.parse(t);l=`import '../../saltygen/css/${`f_${R(h.name)}-${w}.css`}';
46
- ${l}`}return l=l.replace("@salty-css/react/class-name","@salty-css/react/class-name-client"),l=l.replace("{ styled }","{ styledClient as styled }"),l=l.replace("@salty-css/react/styled","@salty-css/react/styled-client"),l}}catch(i){console.error("Error in minimizeFile:",i)}},jt=async e=>{if(!e||e.includes("node_modules")||e.includes("saltygen"))return!1;if(e.includes("salty.config"))return!0;if(!L(e))return!1;const n=await dt.readFile(e,"utf-8");return!!(/.+define[A-Z]\w+/.test(n)||/.+keyframes\(.+/.test(n))},Ot=e=>({name:"stylegen",buildStart:()=>fe(e),load:async t=>{if(L(t))return await pe(e,t)},handleHotUpdate:async({file:t,server:s})=>{await jt(t)&&s.restart()},watchChange:{handler:async(t,s)=>{L(t)&&s.event!=="delete"&&(await jt(t)||await ue(e,t))}}});exports.default=Ot;exports.saltyPlugin=Ot;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("@salty-css/core/compiler"),l=require("@salty-css/core/server"),r=a=>({name:"stylegen",buildStart:()=>t.generateCss(a),load:async e=>{if(t.isSaltyFile(e))return await t.minimizeFile(a,e)},handleHotUpdate:async({file:e,server:s})=>{await l.checkShouldRestart(e)&&s.restart()},watchChange:{handler:async(e,s)=>{t.isSaltyFile(e)&&s.event!=="delete"&&(await l.checkShouldRestart(e)||await t.generateFile(a,e))}}});exports.default=r;exports.saltyPlugin=r;
package/index.js CHANGED
@@ -1,724 +1,22 @@
1
- var zt = Object.defineProperty;
2
- var Wt = (e, t, s) => t in e ? zt(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s;
3
- var nt = (e, t, s) => Wt(e, typeof t != "symbol" ? t + "" : t, s);
4
- import * as Nt from "esbuild";
5
- import { execSync as Jt } from "child_process";
6
- import { join as u, parse as rt } from "path";
7
- import { existsSync as ht, mkdirSync as K, statSync as At, readdirSync as It, readFileSync as R, writeFileSync as _ } from "fs";
8
- import { readFile as yt } from "fs/promises";
9
- import { createLogger as Ht, transports as Gt, format as pt } from "winston";
10
- import mt from "typescript";
11
- const jt = (e) => String.fromCharCode(e + (e > 25 ? 39 : 97)), Qt = (e, t) => {
12
- let s = "", n;
13
- for (n = Math.abs(e); n > 52; n = n / 52 | 0) s = jt(n % 52) + s;
14
- return s = jt(n % 52) + s, s.length < t ? s = s.padStart(t, "a") : s.length > t && (s = s.slice(-t)), s;
15
- }, Kt = (e, t) => {
16
- let s = t.length;
17
- for (; s; ) e = e * 33 ^ t.charCodeAt(--s);
18
- return e;
19
- }, H = (e, t = 5) => {
20
- const s = Kt(5381, JSON.stringify(e)) >>> 0;
21
- return Qt(s, t);
22
- };
23
- function z(e) {
24
- return e ? typeof e != "string" ? z(String(e)) : e.replace(/[\s.]/g, "-").replace(/[A-Z](?:(?=[^A-Z])|[A-Z]*(?=[A-Z][^A-Z]|$))/g, (t, s) => (s > 0 ? "-" : "") + t.toLowerCase()) : "";
25
- }
26
- const Lt = (e) => (t) => {
27
- if (typeof t != "string" || !e) return;
28
- let s = t;
29
- const n = [];
30
- return Object.values(e).forEach((o) => {
31
- const { pattern: i, transform: r } = o;
32
- s = s.replace(i, (m) => {
33
- const { value: y, css: d } = r(m);
34
- return d && n.push(d), y;
35
- });
36
- }), { transformed: s, additionalCss: n };
37
- }, xt = (e) => (t) => typeof t != "string" || !/\{[^{}]+\}/g.test(t) ? void 0 : { transformed: t.replace(/\{([^{}]+)\}/g, (...o) => {
38
- const i = z(o[1].replaceAll(".", "-"));
39
- return i.startsWith("-") ? `-${i}` : `var(--${i})`;
40
- }) }, Zt = xt(), Bt = (e) => (t) => {
41
- const { screenSize: s, axis: n = "horizontal", minMultiplier: o = 0.5, maxMultiplier: i = 1.5 } = e, r = Math.round(t / s * 1e4) / 100, m = n === "vertical" ? "vh" : "vw", y = Math.round(o * t), d = Math.round(i * t);
42
- return `clamp(${y}px, ${r}${m}, ${d}px)`;
43
- }, Ut = [
44
- "top",
45
- "right",
46
- "bottom",
47
- "left",
48
- "min-width",
49
- /.*width.*/,
50
- /^[^line]*height.*/,
51
- // Exclude line-height
52
- /padding.*/,
53
- /margin.*/,
54
- /border.*/,
55
- /inset.*/,
56
- /.*radius.*/,
57
- /.*spacing.*/,
58
- /.*gap.*/,
59
- /.*indent.*/,
60
- /.*offset.*/,
61
- /.*size.*/,
62
- /.*thickness.*/,
63
- /.*font-size.*/
64
- ], qt = (e, t, s) => {
65
- if (Ut.some((o) => typeof o == "string" ? o === e : o.test(e))) {
66
- const o = "px";
67
- if (o.startsWith("viewport-clamp:"))
68
- try {
69
- const r = o.split(":")[1];
70
- return Bt({
71
- screenSize: parseInt(r)
72
- })(Number(t));
73
- } catch (r) {
74
- throw console.error(r), new Error(`Invalid viewport-clamp value: ${o}`);
75
- }
76
- return `${t}${o}`;
77
- }
78
- return `${t}`;
79
- }, Xt = ["Webkit", "Moz", "ms", "O"], Yt = (e) => e.startsWith("-") ? e : Xt.some((t) => e.startsWith(t)) ? `-${z(e)}` : z(e), ot = async (e, t = "", s, n = !1) => {
80
- if (!e) throw new Error("No styles provided to parseStyles function!");
81
- const o = /* @__PURE__ */ new Set(), i = Object.entries(e), r = async ([p, f]) => {
82
- const w = p.trim().replace(/^\?+/g, ""), F = Yt(w), v = (D, J = ";") => `${F}:${D}${J}`, V = { scope: t, config: s };
83
- if (typeof f == "function") return r([p, f(V)]);
84
- if (f instanceof Promise) return r([p, await f]);
85
- if (typeof f == "object") {
86
- if (!f) return;
87
- if (f.isColor) return v(f.toString());
88
- if (w === "defaultVariants") return;
89
- if (w === "variants") {
90
- const P = Object.entries(f);
91
- for (const [O, l] of P) {
92
- if (!l) continue;
93
- const $ = Object.entries(l);
94
- for (const [C, a] of $) {
95
- if (!a) continue;
96
- const j = `${t}.${O}-${C}`;
97
- (await ot(a, j, s)).forEach((M) => o.add(M));
98
- }
99
- }
100
- return;
101
- }
102
- if (w === "compoundVariants") {
103
- for (const P of f) {
104
- const { css: O, ...l } = P, $ = Object.entries(l).reduce((a, [j, N]) => `${a}.${j}-${N}`, t);
105
- (await ot(O, $, s)).forEach((a) => o.add(a));
106
- }
107
- return;
108
- }
109
- if (w.startsWith("@")) {
110
- const P = w, O = await tt(f, t, s), l = `${P} { ${O} }`;
111
- o.add(l);
112
- return;
113
- }
114
- const D = p.includes("&") ? w.replaceAll("&", t) : w.startsWith(":") ? `${t}${w}` : `${t} ${w}`;
115
- (await ot(f, D, s)).forEach((P) => o.add(P));
116
- return;
117
- }
118
- if (typeof f == "number") {
119
- const D = qt(F, f);
120
- return v(D);
121
- }
122
- if (typeof f != "string")
123
- if ("toString" in f) f = f.toString();
124
- else throw new Error(`Invalid value type for property ${F}`);
125
- return v(f);
126
- }, m = i.map(r), { modifiers: y } = {}, d = [xt(), Lt(y)], g = (await Promise.all(m).then((p) => Promise.all(
127
- p.map((f) => d.reduce(async (w, F) => {
128
- const v = await w;
129
- if (!v) return v;
130
- const V = await F(v);
131
- if (!V) return v;
132
- const { transformed: D, additionalCss: J } = V;
133
- let P = "";
134
- if (J)
135
- for (const O of J)
136
- P += await tt(O, "");
137
- return `${P}${D}`;
138
- }, Promise.resolve(f)))
139
- ))).filter((p) => p !== void 0).join(`
140
- `);
141
- if (!g.trim()) return Array.from(o);
142
- const h = t ? `${t} {
143
- ${g}
144
- }` : g;
145
- return o.has(h) ? Array.from(o) : [h, ...o];
146
- }, tt = async (e, t, s, n = !1) => (await ot(e, t, s, n)).join(`
147
- `), vt = async (e, t = []) => {
148
- if (!e) return "";
149
- const s = [], n = {};
150
- for (const [o, i] of Object.entries(e))
151
- if (typeof i != "function") if (i && typeof i == "object") {
152
- const r = o.trim(), m = await vt(i, [...t, r]);
153
- s.push(m);
154
- } else
155
- n[o] = i;
156
- if (Object.keys(n).length) {
157
- const o = t.map(z).join("-"), i = "t_" + H(o, 4), r = await tt(n, `.${o}, .${i}`);
158
- s.push(r);
159
- }
160
- return s.join(`
161
- `);
162
- }, te = (e) => e ? Object.entries(e).reduce((t, [s, n]) => (typeof n == "function" ? t[s] = "any" : typeof n == "object" && (t[s] = _t(n).map((o) => `"${o}"`).join(" | ")), t), {}) : {}, _t = (e, t = "", s = /* @__PURE__ */ new Set()) => e ? (Object.entries(e).forEach(([n, o]) => {
163
- const i = t ? `${t}.${n}` : n;
164
- return typeof o == "object" ? _t(o, i, s) : s.add(t);
165
- }), [...s]) : [], Tt = (e) => {
166
- if (!e || e === "/") throw new Error("Could not find package.json file");
167
- const t = u(e, "package.json");
168
- return ht(t) ? t : Tt(u(e, ".."));
169
- }, ee = async (e) => {
170
- const t = Tt(e);
171
- return await yt(t, "utf-8").then(JSON.parse).catch(() => {
172
- });
173
- }, se = async (e) => {
174
- const t = await ee(e);
175
- if (t)
176
- return t.type;
177
- };
178
- let Q;
179
- const Dt = async (e) => {
180
- if (Q) return Q;
181
- const t = await se(e);
182
- return t === "module" ? Q = "esm" : (t === "commonjs" || import.meta.url.endsWith(".cjs")) && (Q = "cjs"), Q || "esm";
183
- }, dt = Ht({
184
- level: "debug",
185
- format: pt.combine(pt.colorize(), pt.cli()),
186
- transports: [new Gt.Console({})]
187
- });
188
- function kt(e) {
189
- return e ? typeof e != "string" ? kt(String(e)) : e.replace(/[^\d\w]/g, ".") : "";
190
- }
191
- const ne = {
192
- /** Set box model to border-box */
193
- "*, *::before, *::after": {
194
- boxSizing: "border-box"
195
- },
196
- /** Remove default margin and padding */
197
- "*": {
198
- margin: 0
199
- },
200
- /** Remove adjust font properties */
201
- html: {
202
- lineHeight: 1.15,
203
- textSizeAdjust: "100%",
204
- WebkitFontSmoothing: "antialiased"
205
- },
206
- /** Make media elements responsive */
207
- "img, picture, video, canvas, svg": {
208
- display: "block",
209
- maxWidth: "100%"
210
- },
211
- /** Avoid overflow of text */
212
- "p, h1, h2, h3, h4, h5, h6": {
213
- overflowWrap: "break-word"
214
- },
215
- /** Improve text wrapping */
216
- p: {
217
- textWrap: "pretty"
218
- },
219
- "h1, h2, h3, h4, h5, h6": {
220
- textWrap: "balance"
221
- },
222
- /** Improve link color */
223
- a: {
224
- color: "currentColor"
225
- },
226
- /** Improve button line height */
227
- button: {
228
- lineHeight: "1em",
229
- color: "currentColor"
230
- },
231
- /** Improve form elements */
232
- "input, optgroup, select, textarea": {
233
- fontFamily: "inherit",
234
- fontSize: "100%",
235
- lineHeight: "1.15em"
236
- }
237
- }, L = (...e) => e.flat().reduce((t, s) => s != null && s._current ? { ...t, ...s._current } : { ...t, ...s }, {}), oe = (...e) => e.flat().reduce((t, s) => ({ ...t, ...s._children }), {});
238
- class re {
239
- constructor(t) {
240
- nt(this, "_path");
241
- this.params = t;
242
- }
243
- get _current() {
244
- return this.params.template;
245
- }
246
- get isDefineTemplate() {
247
- return !0;
248
- }
249
- _setPath(t) {
250
- return this._path = t, this;
251
- }
252
- }
253
- class ie {
254
- constructor(t) {
255
- nt(this, "_path");
256
- nt(this, "templates", []);
257
- this.params = t, Object.entries(t).forEach(([s, n]) => {
258
- this.templates.push(
259
- new re({
260
- name: s,
261
- template: n
262
- })
263
- );
264
- });
265
- }
266
- get _current() {
267
- return this.params;
268
- }
269
- get _children() {
270
- return Object.fromEntries(
271
- this.templates.map((t) => [t.params.name, t])
272
- );
273
- }
274
- get isDefineTemplates() {
275
- return !0;
276
- }
277
- _setPath(t) {
278
- return this._path = t, this.templates.forEach((s) => s._setPath(t)), this;
279
- }
280
- }
281
- const ae = (e) => new ie(e), ce = (e, t) => new Promise((s, n) => {
282
- const o = setTimeout(() => {
283
- n(new Error("Timeout"));
284
- }, 100), i = mt.createSourceFile("temp.ts", e, mt.ScriptTarget.Latest, !0);
285
- function r(m) {
286
- if (mt.isVariableDeclaration(m) && m.name.getText() === t) {
287
- const y = m.getStart(), d = m.getEnd();
288
- clearTimeout(o), s([y, d]);
289
- }
290
- m.forEachChild(r);
291
- }
292
- r(i);
293
- }), W = {
294
- externalModules: [],
295
- rcFile: void 0,
296
- destDir: void 0
297
- }, Et = (e) => {
298
- if (W.externalModules.length > 0) return W.externalModules;
299
- const s = R(e, "utf8").match(/externalModules:\s?\[(.*)\]/);
300
- if (!s) return [];
301
- const n = s[1].split(",").map((o) => o.replace(/['"`]/g, "").trim());
302
- return W.externalModules = n, n;
303
- }, G = async (e) => {
304
- if (W.destDir) return W.destDir;
305
- const t = await gt(e), s = u(e, (t == null ? void 0 : t.saltygenDir) || "saltygen");
306
- return W.destDir = s, s;
307
- }, Vt = ["salty", "css", "styles", "styled"], le = (e = []) => new RegExp(`\\.(${[...Vt, ...e].join("|")})\\.`), Z = (e, t = []) => le(t).test(e), Ot = async (e) => {
308
- if (W.rcFile) return W.rcFile;
309
- if (e === "/") throw new Error("Could not find .saltyrc.json file");
310
- const t = u(e, ".saltyrc.json"), s = await yt(t, "utf-8").then(JSON.parse).catch(() => {
311
- });
312
- return s ? (W.rcFile = s, s) : Ot(u(e, ".."));
313
- }, gt = async (e) => {
314
- var n, o;
315
- const t = await Ot(e), s = (n = t.projects) == null ? void 0 : n.find((i) => e.endsWith(i.dir || ""));
316
- return s || ((o = t.projects) == null ? void 0 : o.find((i) => i.dir === t.defaultProject));
317
- }, fe = async (e) => {
318
- const t = await gt(e), s = await G(e), n = u(e, (t == null ? void 0 : t.configDir) || "", "salty.config.ts"), o = u(s, "salty.config.js"), i = await Dt(e), r = Et(n);
319
- await Nt.build({
320
- entryPoints: [n],
321
- minify: !0,
322
- treeShaking: !0,
323
- bundle: !0,
324
- outfile: o,
325
- format: i,
326
- external: r
327
- });
328
- const m = Date.now(), { config: y } = await import(`${o}?t=${m}`);
329
- return { config: y, path: o };
330
- }, ue = async (e, t) => {
331
- var bt, St;
332
- const s = await G(e), n = {
333
- mediaQueries: [],
334
- globalStyles: [],
335
- variables: [],
336
- templates: []
337
- };
338
- await Promise.all(
339
- [...t].map(async (S) => {
340
- const { contents: x, outputFilePath: X } = await it(e, S, s);
341
- Object.entries(x).forEach(([k, T]) => {
342
- T.isMedia ? n.mediaQueries.push([k, T]) : T.isGlobalDefine ? n.globalStyles.push(T) : T.isDefineVariables ? n.variables.push(T) : T.isDefineTemplates && n.templates.push(T._setPath(`${k};;${X}`));
343
- });
344
- })
345
- );
346
- const { config: o, path: i } = await fe(e), r = { ...o }, { mediaQueries: m } = n;
347
- r.mediaQueries = Object.fromEntries(m.map(([S, x]) => [`@${S}`, x]));
348
- const y = m.map(([S]) => `'@${S}'`).join(" | "), d = /* @__PURE__ */ new Set(), c = async (S, x = []) => {
349
- if (!S) return [];
350
- const X = Object.entries(S).map(async ([T, I]) => {
351
- const Y = async (E) => {
352
- if (!E) return;
353
- if (E instanceof Promise) return await Y(await E);
354
- if (typeof E == "function") return await Y(await E());
355
- if (typeof E == "object") return await c(E, [...x, T]);
356
- const lt = kt(T), ft = z(T), ut = [...x, lt].join(".");
357
- d.add(`"${ut}"`);
358
- const st = [...x.map(z), ft].join("-"), Ct = Zt(E);
359
- return Ct ? `--${st}: ${Ct.transformed};` : `--${st}: ${E};`;
360
- };
361
- return await Y(I);
362
- });
363
- return (await Promise.all(X)).flat();
364
- }, g = async (S) => {
365
- if (!S) return [];
366
- const x = Object.entries(S).map(async ([k, T]) => {
367
- const I = await c(T);
368
- return k === "base" ? I.join("") : r.mediaQueries[k] ? `${r.mediaQueries[k]} { ${I.join("")} }` : `${k} { ${I.join("")} }`;
369
- });
370
- return (await Promise.all(x)).flat();
371
- }, h = async (S) => {
372
- if (!S) return [];
373
- const x = Object.entries(S).map(async ([k, T]) => {
374
- const I = Object.entries(T).map(async ([E, lt]) => {
375
- const ft = await c(lt, [k]), ut = `.${k}-${E}, [data-${k}="${E}"]`, st = ft.join("");
376
- return `${ut} { ${st} }`;
377
- });
378
- return (await Promise.all(I)).flat();
379
- });
380
- return (await Promise.all(x)).flat();
381
- }, b = (S) => ({ ...S, responsive: void 0, conditional: void 0 }), p = (S) => n.variables.map((x) => S === "static" ? b(x._current) : x._current[S]), f = L(b(o.variables), p("static")), w = await c(f), F = L((bt = o.variables) == null ? void 0 : bt.responsive, p("responsive")), v = await g(F), V = L((St = o.variables) == null ? void 0 : St.conditional, p("conditional")), D = await h(V), J = u(s, "css/_variables.css"), P = `:root { ${w.join("")} ${v.join("")} } ${D.join("")}`;
382
- _(J, P), r.staticVariables = f;
383
- const O = u(s, "css/_global.css"), l = L(o.global, n.globalStyles), $ = await tt(l, "");
384
- _(O, `@layer global { ${$} }`);
385
- const C = u(s, "css/_reset.css"), j = o.reset === "none" ? {} : typeof o.reset == "object" ? o.reset : ne, N = await tt(j, "");
386
- _(C, `@layer reset { ${N} }`);
387
- const M = u(s, "css/_templates.css"), A = L(o.templates, n.templates), B = await vt(A), U = te(A);
388
- _(M, `@layer templates { ${B} }`), r.templates = A;
389
- const et = o.templates ? [ae(o.templates)._setPath(`config;;${i}`)] : [], at = oe(n.templates, et);
390
- r.templatePaths = Object.fromEntries(Object.entries(at).map(([S, x]) => [S, x._path]));
391
- const q = u(s, "types/css-tokens.d.ts"), Mt = `
392
- // Variable types
393
- type VariableTokens = ${[...d].join("|")};
394
- type PropertyValueToken = \`{\${VariableTokens}}\`;
395
-
396
- // Template types
397
- type TemplateTokens = {
398
- ${Object.entries(U).map(([S, x]) => `${S}?: ${x}`).join(`
399
- `)}
400
- }
401
-
402
- // Media query types
403
- type MediaQueryKeys = ${y || "''"};
404
- `;
405
- _(q, Mt);
406
- const Rt = u(s, "cache/config-cache.json");
407
- _(Rt, JSON.stringify(r, null, 2));
408
- }, Ft = (e) => e.replace(/styled\(([^"'`{,]+),/g, (t, s) => {
409
- if (/^['"`]/.test(s)) return t;
410
- const o = new RegExp(`import[^;]*${s}[,\\s{][^;]*from\\s?([^{};]+);`);
411
- if (!o.test(e)) return t;
412
- const r = o.exec(e);
413
- if (r) {
414
- const m = r.at(1);
415
- if (Vt.some((d) => m == null ? void 0 : m.includes(d))) return t;
416
- }
417
- return "styled('div',";
418
- }), pe = (e, t) => {
419
- try {
420
- const s = R(u(t, "saltygen/cache/config-cache.json"), "utf8");
421
- return s ? `globalThis.saltyConfig = ${s};
422
-
423
- ${e}` : `globalThis.saltyConfig = {};
424
-
425
- ${e}`;
426
- } catch {
427
- return e;
428
- }
429
- }, it = async (e, t, s) => {
430
- const n = H(t), o = u(s, "./temp");
431
- ht(o) || K(o);
432
- const i = rt(t);
433
- let r = R(t, "utf8");
434
- r = Ft(r), r = pe(r, e);
435
- const m = u(s, "js", n + ".js"), y = await gt(e), d = u(e, (y == null ? void 0 : y.configDir) || "", "salty.config.ts"), c = Et(d), g = await Dt(e);
436
- await Nt.build({
437
- stdin: {
438
- contents: r,
439
- sourcefile: i.base,
440
- resolveDir: i.dir,
441
- loader: "tsx"
442
- },
443
- minify: !1,
444
- treeShaking: !0,
445
- bundle: !0,
446
- outfile: m,
447
- format: g,
448
- target: ["node20"],
449
- keepNames: !0,
450
- external: c,
451
- packages: "external",
452
- plugins: [
453
- {
454
- name: "test",
455
- setup: (p) => {
456
- p.onLoad({ filter: /.*\.css|salty|styles|styled\.ts/ }, (f) => {
457
- const w = R(f.path, "utf8");
458
- return { contents: Ft(w), loader: "ts" };
459
- });
460
- }
461
- }
462
- ]
463
- });
464
- const h = Date.now();
465
- return { contents: await import(`${m}?t=${h}`), outputFilePath: m };
466
- }, me = async (e) => {
467
- const t = await G(e), s = u(t, "cache/config-cache.json"), n = R(s, "utf8");
468
- if (!n) throw new Error("Could not find config cache file");
469
- return JSON.parse(n);
470
- }, wt = async (e) => {
471
- const t = await me(e), s = await G(e), n = u(s, "salty.config.js"), o = Date.now(), { config: i } = await import(`${n}?t=${o}`);
472
- return L(i, t);
473
- }, $t = () => {
474
- try {
475
- return process.env.NODE_ENV === "production";
476
- } catch {
477
- return !1;
478
- }
479
- }, de = async (e, t = $t(), s = !0) => {
480
- try {
481
- const n = Date.now();
482
- t ? dt.info("Generating CSS in production mode! 🔥") : dt.info("Generating CSS in development mode! 🚀");
483
- const o = [], i = [], r = await G(e), m = u(r, "index.css");
484
- s && (() => {
485
- ht(r) && Jt("rm -rf " + r), K(r, { recursive: !0 }), K(u(r, "css")), K(u(r, "types")), K(u(r, "js")), K(u(r, "cache"));
486
- })();
487
- const d = /* @__PURE__ */ new Set(), c = /* @__PURE__ */ new Set();
488
- async function g(l) {
489
- const $ = ["node_modules", "saltygen"], C = At(l);
490
- if (C.isDirectory()) {
491
- const a = It(l);
492
- if ($.some((N) => l.includes(N))) return;
493
- await Promise.all(a.map((N) => g(u(l, N))));
494
- } else if (C.isFile() && Z(l)) {
495
- d.add(l);
496
- const j = R(l, "utf8");
497
- /define[\w\d]+\(/.test(j) && c.add(l);
498
- }
499
- }
500
- await g(e), await ue(e, c);
501
- const h = {
502
- keyframes: [],
503
- components: [],
504
- classNames: []
505
- };
506
- await Promise.all(
507
- [...d].map(async (l) => {
508
- const { contents: $ } = await it(e, l, r);
509
- for (let [C, a] of Object.entries($))
510
- a instanceof Promise && (a = await a), a.isKeyframes ? h.keyframes.push({
511
- value: a,
512
- src: l,
513
- name: C
514
- }) : a.isClassName ? h.classNames.push({
515
- ...a,
516
- src: l,
517
- name: C
518
- }) : a.generator && h.components.push({
519
- ...a,
520
- src: l,
521
- name: C
522
- });
523
- })
524
- );
525
- const b = await wt(e);
526
- for (const l of h.keyframes) {
527
- const { value: $ } = l, C = `a_${$.animationName}.css`, a = `css/${C}`, j = u(r, a);
528
- o.push(C), _(j, $.css);
529
- }
530
- const p = {};
531
- for (const l of h.components) {
532
- const { src: $, name: C } = l;
533
- p[$] || (p[$] = []);
534
- const a = l.generator._withBuildContext({
535
- callerName: C,
536
- isProduction: t,
537
- config: b
538
- });
539
- i[a.priority] || (i[a.priority] = []);
540
- const j = await a.css;
541
- if (!j) continue;
542
- i[a.priority].push(a.cssFileName);
543
- const N = `css/${a.cssFileName}`, M = u(r, N);
544
- _(M, j), b.importStrategy === "component" && p[$].push(a.cssFileName);
545
- }
546
- for (const l of h.classNames) {
547
- const { src: $, name: C } = l;
548
- p[$] || (p[$] = []);
549
- const a = l.generator._withBuildContext({
550
- callerName: C,
551
- isProduction: t,
552
- config: b
553
- }), j = await a.css;
554
- if (!j) continue;
555
- i[a.priority] || (i[a.priority] = []), i[a.priority].push(a.cssFileName);
556
- const N = `css/${a.cssFileName}`, M = u(r, N);
557
- _(M, j), b.importStrategy === "component" && p[$].push(a.cssFileName);
558
- }
559
- b.importStrategy === "component" && Object.entries(p).forEach(([l, $]) => {
560
- const C = $.map((A) => `@import url('./${A}');`).join(`
561
- `), a = H(l, 6), j = rt(l), N = z(j.name), M = u(r, `css/f_${N}-${a}.css`);
562
- _(M, C || "/* Empty file */");
563
- });
564
- const f = o.map((l) => `@import url('./css/${l}');`).join(`
565
- `);
566
- let D = `/*!
567
- * Generated with Salty CSS (https://salty-css.dev)
568
- * Do not edit this file directly
569
- */
570
- @layer reset, global, templates, l0, l1, l2, l3, l4, l5, l6, l7, l8;
571
-
572
- ${["_variables.css", "_reset.css", "_global.css", "_templates.css"].filter((l) => {
573
- try {
574
- return R(u(r, "css", l), "utf8").length > 0;
575
- } catch {
576
- return !1;
577
- }
578
- }).map((l) => `@import url('./css/${l}');`).join(
579
- `
580
- `
581
- )}
582
- ${f}`;
583
- if (b.importStrategy !== "component") {
584
- const l = i.reduce(($, C, a) => {
585
- const j = C.reduce((B, U) => {
586
- var ct;
587
- const et = u(r, "css", U), at = R(et, "utf8"), q = ((ct = /.*-([^-]+)-\d+.css/.exec(U)) == null ? void 0 : ct.at(1)) || H(et, 6);
588
- return B.includes(q) ? B : `${B}
589
- /*start:${q}-${U}*/
590
- ${at}
591
- /*end:${q}*/
592
- `;
593
- }, ""), N = `l_${a}.css`, M = u(r, "css", N), A = `@layer l${a} { ${j}
594
- }`;
595
- return _(M, A), `${$}
596
- @import url('./css/${N}');`;
597
- }, "");
598
- D += l;
599
- }
600
- _(m, D);
601
- const P = Date.now() - n, O = P < 200 ? "🔥" : P < 500 ? "🚀" : P < 1e3 ? "🎉" : P < 2e3 ? "🚗" : P < 5e3 ? "🤔" : "🥴";
602
- dt.info(`Generated CSS in ${P}ms! ${O}`);
603
- } catch (n) {
604
- console.error(n);
605
- }
606
- }, he = async (e, t, s = $t()) => {
607
- try {
608
- const n = await G(e);
609
- if (Z(t)) {
610
- const i = [], r = await wt(e), { contents: m } = await it(e, t, n);
611
- for (const [y, d] of Object.entries(m)) {
612
- if (d.isKeyframes && d.css) {
613
- const f = `css/${`a_${d.animationName}.css`}`, w = u(n, f);
614
- _(w, await d.css);
615
- continue;
616
- }
617
- if (d.isClassName) {
618
- const p = d.generator._withBuildContext({
619
- callerName: y,
620
- isProduction: s,
621
- config: r
622
- }), f = await p.css;
623
- if (!f) continue;
624
- i[p.priority] || (i[p.priority] = []), i[p.priority].push(p.cssFileName);
625
- const w = `css/${p.cssFileName}`, F = u(n, w);
626
- _(F, f);
627
- continue;
628
- }
629
- if (!d.generator) continue;
630
- const c = d.generator._withBuildContext({
631
- callerName: y,
632
- isProduction: s,
633
- config: r
634
- }), g = await c.css;
635
- if (!g) continue;
636
- const h = `css/${c.cssFileName}`, b = u(n, h);
637
- _(b, g), i[c.priority] || (i[c.priority] = []), i[c.priority].push(c.cssFileName);
638
- }
639
- if (r.importStrategy !== "component")
640
- i.forEach((y, d) => {
641
- const c = `l_${d}.css`, g = u(n, "css", c);
642
- let h = R(g, "utf8");
643
- y.forEach((b) => {
644
- var F;
645
- const p = u(n, "css", b), f = ((F = /.*-([^-]+)-\d+.css/.exec(b)) == null ? void 0 : F.at(1)) || H(p, 6);
646
- if (!h.includes(f)) {
647
- const v = R(p, "utf8"), V = `/*start:${f}-${b}*/
648
- ${v}
649
- /*end:${f}*/
650
- `;
651
- h = `${h.replace(/\}$/, "")}
652
- ${V}
653
- }`;
654
- }
655
- }), _(g, h);
656
- });
657
- else {
658
- const y = i.flat().map((b) => `@import url('./${b}');`).join(`
659
- `), d = H(t, 6), c = rt(t), g = z(c.name), h = u(n, `css/f_${g}-${d}.css`);
660
- _(h, y || "/* Empty file */");
661
- }
662
- }
663
- } catch (n) {
664
- console.error(n);
665
- }
666
- }, ye = async (e, t, s = $t()) => {
667
- var n, o;
668
- try {
669
- const i = await G(e);
670
- if (Z(t)) {
671
- const m = R(t, "utf8"), y = await wt(e), { contents: d } = await it(e, t, i);
672
- let c = m;
673
- for (const [g, h] of Object.entries(d)) {
674
- if (h.isKeyframes || !h.generator) continue;
675
- const b = h.generator._withBuildContext({
676
- callerName: g,
677
- isProduction: s,
678
- config: y
679
- }), [p, f] = await ce(c, g), w = c.slice(p, f);
680
- if (h.isClassName) {
681
- const F = c, v = ` ${g} = className("${b.classNames}")`;
682
- c = c.replace(w, v), F === c && console.error("Minimize file failed to change content", { name: g });
683
- }
684
- if (w.includes("styled")) {
685
- const F = (o = (n = /styled\(([^,]+),/.exec(w)) == null ? void 0 : n.at(1)) == null ? void 0 : o.trim(), v = c, V = ` ${g} = styled(${F}, "${b.classNames}", ${JSON.stringify(b.clientProps)})`;
686
- c = c.replace(w, V), v === c && console.error("Minimize file failed to change content", { name: g, tagName: F });
687
- }
688
- }
689
- if (y.importStrategy === "component") {
690
- const g = H(t, 6), h = rt(t);
691
- c = `import '../../saltygen/css/${`f_${z(h.name)}-${g}.css`}';
692
- ${c}`;
693
- }
694
- return c = c.replace("@salty-css/react/class-name", "@salty-css/react/class-name-client"), c = c.replace("{ styled }", "{ styledClient as styled }"), c = c.replace("@salty-css/react/styled", "@salty-css/react/styled-client"), c;
695
- }
696
- } catch (i) {
697
- console.error("Error in minimizeFile:", i);
698
- }
699
- }, Pt = async (e) => {
700
- if (!e || e.includes("node_modules") || e.includes("saltygen")) return !1;
701
- if (e.includes("salty.config")) return !0;
702
- if (!Z(e)) return !1;
703
- const n = await yt(e, "utf-8");
704
- return !!(/.+define[A-Z]\w+/.test(n) || /.+keyframes\(.+/.test(n));
705
- }, Fe = (e) => ({
1
+ import { generateCss as i, isSaltyFile as s, generateFile as o, minimizeFile as r } from "@salty-css/core/compiler";
2
+ import { checkShouldRestart as l } from "@salty-css/core/server";
3
+ const y = (a) => ({
706
4
  name: "stylegen",
707
- buildStart: () => de(e),
5
+ buildStart: () => i(a),
708
6
  load: async (t) => {
709
- if (Z(t))
710
- return await ye(e, t);
7
+ if (s(t))
8
+ return await r(a, t);
711
9
  },
712
- handleHotUpdate: async ({ file: t, server: s }) => {
713
- await Pt(t) && s.restart();
10
+ handleHotUpdate: async ({ file: t, server: e }) => {
11
+ await l(t) && e.restart();
714
12
  },
715
13
  watchChange: {
716
- handler: async (t, s) => {
717
- Z(t) && s.event !== "delete" && (await Pt(t) || await he(e, t));
14
+ handler: async (t, e) => {
15
+ s(t) && e.event !== "delete" && (await l(t) || await o(a, t));
718
16
  }
719
17
  }
720
18
  });
721
19
  export {
722
- Fe as default,
723
- Fe as saltyPlugin
20
+ y as default,
21
+ y as saltyPlugin
724
22
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salty-css/vite",
3
- "version": "0.0.1-alpha.267",
3
+ "version": "0.0.1-alpha.269",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "typings": "./dist/index.d.ts",
@@ -34,6 +34,6 @@
34
34
  }
35
35
  },
36
36
  "dependencies": {
37
- "@salty-css/core": "^0.0.1-alpha.267"
37
+ "@salty-css/core": "^0.0.1-alpha.269"
38
38
  }
39
39
  }