@salty-css/vite 0.0.1-alpha.141 → 0.0.1-alpha.143

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 +24 -16
  2. package/index.js +216 -204
  3. package/package.json +2 -2
package/index.cjs CHANGED
@@ -1,29 +1,37 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const pe=require("esbuild"),de=require("child_process"),a=require("path"),u=require("fs"),X=require("fs/promises"),J=require("winston");var Z=typeof document<"u"?document.currentScript:null;function ye(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 Y=ye(pe),U=e=>String.fromCharCode(e+(e>25?39:97)),ge=(e,t)=>{let s="",n;for(n=Math.abs(e);n>52;n=n/52|0)s=U(n%52)+s;return s=U(n%52)+s,s.length<t?s=s.padStart(t,"a"):s.length>t&&(s=s.slice(-t)),s},me=(e,t)=>{let s=t.length;for(;s;)e=e*33^t.charCodeAt(--s);return e},L=(e,t=5)=>{const s=me(5381,JSON.stringify(e))>>>0;return ge(s,t)};function E(e){return e?typeof e!="string"?E(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 he=(e,t)=>{if(typeof e!="string")return{result:e};if(!t)return{result:e};const s=[];return Object.values(t).forEach(n=>{const{pattern:i,transform:o}=n;e=e.replace(i,l=>{const{value:d,css:c}=o(l);return c&&s.push(c),d})}),{result:e,additionalCss:s}},Q=e=>typeof e!="string"?{result:e}:/\{[^{}]+\}/g.test(e)?{result:e.replace(/\{([^{}]+)\}/g,(...n)=>`var(--${E(n[1].replaceAll(".","-"))})`)}:{result:e},D=(e,t,s)=>{if(!e)return"";const n=[],i=Object.entries(e).reduce((l,[d,c])=>{const r=d.trim();if(typeof c=="function"&&(c=c()),typeof c=="object"){if(!c)return l;if(r==="variants")return Object.entries(c).forEach(([f,g])=>{g&&Object.entries(g).forEach(([N,b])=>{if(!b)return;const T=`${t}.${f}-${N}`,k=D(b,T);n.push(k)})}),l;if(r==="defaultVariants")return l;if(r==="compoundVariants")return c.forEach(f=>{const{css:g,...N}=f,b=Object.entries(N).reduce((k,[p,m])=>`${k}.${p}-${m}`,t),T=D(g,b);n.push(T)}),l;if(r.startsWith("@")){const f=D(c,t),g=`${r} {
2
- ${f.replace(`
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const pt=require("esbuild"),dt=require("child_process"),c=require("path"),l=require("fs"),X=require("fs/promises"),W=require("winston");var I=typeof document<"u"?document.currentScript:null;function yt(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const s in t)if(s!=="default"){const n=Object.getOwnPropertyDescriptor(t,s);Object.defineProperty(e,s,n.get?n:{enumerable:!0,get:()=>t[s]})}}return e.default=t,Object.freeze(e)}const Y=yt(pt),U=t=>String.fromCharCode(t+(t>25?39:97)),gt=(t,e)=>{let s="",n;for(n=Math.abs(t);n>52;n=n/52|0)s=U(n%52)+s;return s=U(n%52)+s,s.length<e?s=s.padStart(e,"a"):s.length>e&&(s=s.slice(-e)),s},mt=(t,e)=>{let s=e.length;for(;s;)t=t*33^e.charCodeAt(--s);return t},J=(t,e=5)=>{const s=mt(5381,JSON.stringify(t))>>>0;return gt(s,e)};function V(t){return t?typeof t!="string"?V(String(t)):t.replace(/[\s.]/g,"-").replace(/[A-Z](?:(?=[^A-Z])|[A-Z]*(?=[A-Z][^A-Z]|$))/g,(e,s)=>(s>0?"-":"")+e.toLowerCase()):""}const ht=(t,e)=>{if(typeof t!="string")return{result:t};if(!e)return{result:t};const s=[];return Object.values(e).forEach(n=>{const{pattern:i,transform:o}=n;t=t.replace(i,f=>{const{value:g,css:a}=o(f);return a&&s.push(a),g})}),{result:t,additionalCss:s}},Q=t=>typeof t!="string"?{result:t}:/\{[^{}]+\}/g.test(t)?{result:t.replace(/\{([^{}]+)\}/g,(...n)=>`var(--${V(n[1].replaceAll(".","-"))})`)}:{result:t},M=(t,e,s)=>{if(!t)return"";const n=[],i=Object.entries(t).reduce((f,[g,a])=>{const r=g.trim();if(typeof a=="function"&&(a=a()),typeof a=="object"){if(!a)return f;if(r==="variants")return Object.entries(a).forEach(([u,m])=>{m&&Object.entries(m).forEach(([x,F])=>{if(!F)return;const T=`${e}.${u}-${x}`,N=M(F,T);n.push(N)})}),f;if(r==="defaultVariants")return f;if(r==="compoundVariants")return a.forEach(u=>{const{css:m,...x}=u,F=Object.entries(x).reduce((N,[y,$])=>`${N}.${y}-${$}`,e),T=M(m,F);n.push(T)}),f;if(r.startsWith("@")){const u=M(a,e),m=`${r} {
2
+ ${u.replace(`
3
3
  `,`
4
4
  `)}
5
- }`;return n.push(g),l}const y=d.includes("&")?r.replace("&",t):r.startsWith(":")?`${t}${r}`:`${t} ${r}`,w=D(c,y);return n.push(w),l}const h=r.startsWith("-")?r:E(r),F=(y,w=";")=>l=`${l}${y}${w}`,j=y=>F(`${h}:${y}`);if(typeof c=="number")return j(c);if(typeof c!="string")if("toString"in c)c=c.toString();else return l;const{modifiers:S}={},_=function*(){yield Q(c),yield he(c,S)}();for(const{result:y,additionalCss:w=[]}of _)c=y,w.forEach(f=>{const g=D(f,"");F(g,"")});return j(c)},"");return i?t?[`${t} { ${i} }`,...n].join(`
5
+ }`;return n.push(m),f}const d=g.includes("&")?r.replace("&",e):r.startsWith(":")?`${e}${r}`:`${e} ${r}`,j=M(a,d);return n.push(j),f}const p=r.startsWith("-")?r:V(r),h=(d,j=";")=>f=`${f}${d}${j}`,w=d=>h(`${p}:${d}`);if(typeof a=="number")return w(a);if(typeof a!="string")if("toString"in a)a=a.toString();else return f;const{modifiers:b}={},C=function*(){yield Q(a),yield ht(a,b)}();for(const{result:d,additionalCss:j=[]}of C)a=d,j.forEach(u=>{const m=M(u,"");h(m,"")});return w(a)},"");return i?e?[`${e} { ${i} }`,...n].join(`
6
6
  `):i:n.join(`
7
- `)},v=(e,t=[])=>{if(!e)return"";const s=[],n={};if(Object.entries(e).forEach(([i,o])=>{if(typeof o=="object"){if(!o)return;const l=i.trim(),d=v(o,[...t,l]);s.push(d)}else n[i]=o}),Object.keys(n).length){const i=t.map(E).join("-"),o=D(n,`.${i}`);s.push(o)}return s.join(`
8
- `)},Se=e=>Object.entries(e).reduce((t,[s,n])=>(typeof n=="object"&&(t[s]=ee(n).map(i=>`"${i}"`).join(" | ")),t),{}),ee=(e,t="",s=new Set)=>e?(Object.entries(e).forEach(([n,i])=>{const o=t?`${t}.${n}`:n;return typeof i=="object"?ee(i,o,s):s.add(t)}),[...s]):[],te=e=>{if(!e||e==="/")throw new Error("Could not find package.json file");const t=a.join(e,"package.json");return u.existsSync(t)?t:te(a.join(e,".."))},$e=async e=>{const t=te(e);return await X.readFile(t,"utf-8").then(JSON.parse).catch(()=>{})},be=async e=>{const t=await $e(e);if(t)return t.type};let R;const se=async e=>{if(R)return R;const t=await be(e);return t==="module"?R="esm":(t==="commonjs"||(typeof document>"u"?require("url").pathToFileURL(__filename).href:Z&&Z.tagName.toUpperCase()==="SCRIPT"&&Z.src||new URL("index.cjs",document.baseURI).href).endsWith(".cjs"))&&(R="cjs"),R||"esm"},I=J.createLogger({level:"debug",format:J.format.combine(J.format.colorize(),J.format.cli()),transports:[new J.transports.Console({})]});function ne(e){return e?typeof e!="string"?ne(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 je={"*, *::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"}},q={externalModules:[]},oe=e=>{if(q.externalModules.length>0)return q.externalModules;const t=a.join(e,"salty.config.ts"),n=u.readFileSync(t,"utf8").match(/externalModules:\s?\[(.*)\]/);if(!n)return[];const i=n[1].split(",").map(o=>o.replace(/['"`]/g,"").trim());return q.externalModules=i,i},z=e=>a.join(e,"./saltygen"),re=["salty","css","styles","styled"],we=(e=[])=>new RegExp(`\\.(${[...re,...e].join("|")})\\.`),W=(e,t=[])=>we(t).test(e),Fe=async e=>{const t=z(e),s=a.join(e,"salty.config.ts"),n=a.join(t,"salty.config.js"),i=await se(e),o=oe(e);await Y.build({entryPoints:[s],minify:!0,treeShaking:!0,bundle:!0,outfile:n,format:i,external:o});const l=Date.now(),{config:d}=await import(`${n}?t=${l}`);return d},xe=async e=>{const t=await Fe(e),s=new Set,n=(p,m=[])=>p?Object.entries(p).flatMap(([C,$])=>{if(!$)return;if(typeof $=="object")return n($,[...m,C]);const M=ne(C),A=E(C),V=[...m,M].join(".");s.add(`"${V}"`);const P=[...m.map(E),A].join("-"),{result:O}=Q($);return`--${P}: ${O};`}):[],i=p=>p?Object.entries(p).flatMap(([m,C])=>{const $=n(C);return m==="base"?$.join(""):`${m} { ${$.join("")} }`}):[],o=p=>p?Object.entries(p).flatMap(([m,C])=>Object.entries(C).flatMap(([$,M])=>{const A=n(M,[m]),V=`.${m}-${$}, [data-${m}="${$}"]`,P=A.join("");return`${V} { ${P} }`})):[],l=n(t.variables),d=i(t.responsiveVariables),c=o(t.conditionalVariables),r=z(e),h=a.join(r,"css/_variables.css"),F=`:root { ${l.join("")} ${d.join("")} } ${c.join("")}`;u.writeFileSync(h,F);const j=a.join(r,"css/_global.css"),S=D(t.global,"");u.writeFileSync(j,`@layer global { ${S} }`);const x=a.join(r,"css/_reset.css"),y=t.reset==="none"?{}:typeof t.reset=="object"?t.reset:je,w=D(y,"");u.writeFileSync(x,`@layer reset { ${w} }`);const f=a.join(r,"css/_templates.css"),g=v(t.templates),N=Se(t.templates);u.writeFileSync(f,g);const b=a.join(r,"types/css-tokens.d.ts"),k=`
7
+ `)},v=(t,e=[])=>{if(!t)return"";const s=[],n={};if(Object.entries(t).forEach(([i,o])=>{if(typeof o=="object"){if(!o)return;const f=i.trim(),g=v(o,[...e,f]);s.push(g)}else n[i]=o}),Object.keys(n).length){const i=e.map(V).join("-"),o=M(n,`.${i}`);s.push(o)}return s.join(`
8
+ `)},$t=t=>Object.entries(t).reduce((e,[s,n])=>(typeof n=="object"&&(e[s]=tt(n).map(i=>`"${i}"`).join(" | ")),e),{}),tt=(t,e="",s=new Set)=>t?(Object.entries(t).forEach(([n,i])=>{const o=e?`${e}.${n}`:n;return typeof i=="object"?tt(i,o,s):s.add(e)}),[...s]):[],et=t=>{if(!t||t==="/")throw new Error("Could not find package.json file");const e=c.join(t,"package.json");return l.existsSync(e)?e:et(c.join(t,".."))},St=async t=>{const e=et(t);return await X.readFile(e,"utf-8").then(JSON.parse).catch(()=>{})},bt=async t=>{const e=await St(t);if(e)return e.type};let A;const st=async t=>{if(A)return A;const e=await bt(t);return e==="module"?A="esm":(e==="commonjs"||(typeof document>"u"?require("url").pathToFileURL(__filename).href:I&&I.tagName.toUpperCase()==="SCRIPT"&&I.src||new URL("index.cjs",document.baseURI).href).endsWith(".cjs"))&&(A="cjs"),A||"esm"},Z=W.createLogger({level:"debug",format:W.format.combine(W.format.colorize(),W.format.cli()),transports:[new W.transports.Console({})]});function nt(t){return t?typeof t!="string"?nt(String(t)):t.replace(/[\s-]/g,".").replace(/[A-Z](?:(?=[^A-Z])|[A-Z]*(?=[A-Z][^A-Z]|$))/g,(e,s)=>(s>0?".":"")+e.toLowerCase()):""}const jt={"*, *::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"}},q={externalModules:[]},ot=t=>{if(q.externalModules.length>0)return q.externalModules;const e=c.join(t,"salty.config.ts"),n=l.readFileSync(e,"utf8").match(/externalModules:\s?\[(.*)\]/);if(!n)return[];const i=n[1].split(",").map(o=>o.replace(/['"`]/g,"").trim());return q.externalModules=i,i},H=t=>c.join(t,"./saltygen"),rt=["salty","css","styles","styled"],wt=(t=[])=>new RegExp(`\\.(${[...rt,...t].join("|")})\\.`),z=(t,e=[])=>wt(e).test(t),Ft=async t=>{const e=H(t),s=c.join(t,"salty.config.ts"),n=c.join(e,"salty.config.js"),i=await st(t),o=ot(t);await Y.build({entryPoints:[s],minify:!0,treeShaking:!0,bundle:!0,outfile:n,format:i,external:o});const f=Date.now(),{config:g}=await import(`${n}?t=${f}`);return g},Ct=async t=>{const e=await Ft(t),s=new Set,n=(y,$=[])=>y?Object.entries(y).flatMap(([k,S])=>{if(!S)return;if(typeof S=="object")return n(S,[...$,k]);const E=nt(k),R=V(k),_=[...$,E].join(".");s.add(`"${_}"`);const O=[...$.map(V),R].join("-"),{result:D}=Q(S);return`--${O}: ${D};`}):[],i=y=>y?Object.entries(y).flatMap(([$,k])=>{const S=n(k);return $==="base"?S.join(""):`${$} { ${S.join("")} }`}):[],o=y=>y?Object.entries(y).flatMap(([$,k])=>Object.entries(k).flatMap(([S,E])=>{const R=n(E,[$]),_=`.${$}-${S}, [data-${$}="${S}"]`,O=R.join("");return`${_} { ${O} }`})):[],f=n(e.variables),g=i(e.responsiveVariables),a=o(e.conditionalVariables),r=H(t),p=c.join(r,"css/_variables.css"),h=`:root { ${f.join("")} ${g.join("")} } ${a.join("")}`;l.writeFileSync(p,h);const w=c.join(r,"css/_global.css"),b=M(e.global,"");l.writeFileSync(w,`@layer global { ${b} }`);const P=c.join(r,"css/_reset.css"),d=e.reset==="none"?{}:typeof e.reset=="object"?e.reset:jt,j=M(d,"");l.writeFileSync(P,`@layer reset { ${j} }`);const u=c.join(r,"css/_templates.css"),m=v(e.templates),x=$t(e.templates);l.writeFileSync(u,m);const F=c.join(r,"types/css-tokens.d.ts"),N=`
9
9
  // Variable types
10
10
  type VariableTokens = ${[...s].join("|")};
11
11
  type PropertyValueToken = \`{\${VariableTokens}}\`;
12
12
 
13
13
  // Template types
14
14
  type TemplateTokens = {
15
- ${Object.entries(N).map(([p,m])=>`${p}?: ${m}`).join(`
15
+ ${Object.entries(x).map(([y,$])=>`${y}?: ${$}`).join(`
16
16
  `)}
17
17
  }
18
- `;u.writeFileSync(b,k)},G=e=>e.replace(/styled\(([^"'`{,]+),/g,(t,s)=>{const n=/^['"`]/.test(s);if(n&&console.log("String tag",s),n)return t;const i=new RegExp(`import[^;]*${s}[,\\s{][^;]*from\\s?([^{};]+);`),o=i.test(e);if(o||console.log("Not imported",s),!o)return t;const l=i.exec(e);if(l){const d=l.at(1),c=re.some(r=>d==null?void 0:d.includes(r));if(c&&console.log("Salty import for",s,`"${l.at(0)}"`),c)return t}return console.log("Replacing",s),"styled('div',"}),H=async(e,t,s)=>{console.log({sourceFilePath:t});const n=L(t),i=a.join(s,"./temp");u.existsSync(i)||u.mkdirSync(i);const o=a.parse(t);let l=u.readFileSync(t,"utf8");l=G(l);const d=a.join(s,"js",n+".js"),c=oe(e),r=await se(e);await Y.build({stdin:{contents:l,sourcefile:o.base,resolveDir:o.dir,loader:"tsx"},minify:!1,treeShaking:!0,bundle:!0,outfile:d,format:r,target:["node20"],keepNames:!0,external:c,packages:"external",plugins:[{name:"test",setup:j=>{j.onLoad({filter:/.*.css.ts/},S=>{console.log("Loading",{sourceFilePath:t,args:S});const x=u.readFileSync(S.path,"utf8");return{contents:G(x),loader:"ts"}})}}]});const h=Date.now();return await import(`${d}?t=${h}`)},B=async e=>{const t=z(e),s=a.join(t,"salty.config.js"),n=Date.now(),{config:i}=await import(`${s}?t=${n}`);return i},ie=()=>{try{return process.env.NODE_ENV==="production"}catch{return!1}},Ce=async(e,t=ie())=>{try{const s=Date.now();t?I.info("Generating CSS in production mode! 🔥"):I.info("Generating CSS in development mode! 🚀");const n=[],i=[],o=z(e),l=a.join(o,"index.css");(()=>{u.existsSync(o)&&de.execSync("rm -rf "+o),u.mkdirSync(o),u.mkdirSync(a.join(o,"css")),u.mkdirSync(a.join(o,"types"))})(),await xe(e);const c=await B(e);async function r(f,g){const N=["node_modules","saltygen"],b=u.statSync(f);if(b.isDirectory()){const T=u.readdirSync(f);if(N.some(p=>f.includes(p)))return;await Promise.all(T.map(p=>r(a.join(f,p),a.join(g,p))))}else if(b.isFile()&&W(f)){const k=await H(e,f,o),p=[];Object.entries(k).forEach(([V,P])=>{if(P.isKeyframes&&P.css){const K=`a_${P.animationName}.css`,fe=`css/${K}`,ue=a.join(o,fe);n.push(K),u.writeFileSync(ue,P.css);return}if(!P.generator)return;const O=P.generator._withBuildContext({name:V,config:c,prod:t});i[O.priority]||(i[O.priority]=[]),i[O.priority].push(O.cssFileName),p.push(O.cssFileName);const ae=`css/${O.cssFileName}`,le=a.join(o,ae);u.writeFileSync(le,O.css)});const m=p.map(V=>`@import url('./${V}');`).join(`
19
- `),C=L(f,6),$=a.parse(f),M=E($.name),A=a.join(o,`css/f_${M}-${C}.css`);u.writeFileSync(A,m)}}await r(e,o);const h=n.map(f=>`@import url('./css/${f}');`).join(`
20
- `);let x=`@layer reset, global, l0, l1, l2, l3, l4, l5, l6, l7, l8;
18
+ `;l.writeFileSync(F,N)},G=t=>t.replace(/styled\(([^"'`{,]+),/g,(e,s)=>{if(/^['"`]/.test(s))return e;const i=new RegExp(`import[^;]*${s}[,\\s{][^;]*from\\s?([^{};]+);`);if(!i.test(t))return e;const f=i.exec(t);if(f){const g=f.at(1);if(rt.some(r=>g==null?void 0:g.includes(r)))return e}return"styled('div',"}),L=async(t,e,s)=>{const n=J(e),i=c.join(s,"./temp");l.existsSync(i)||l.mkdirSync(i);const o=c.parse(e);let f=l.readFileSync(e,"utf8");f=G(f);const g=c.join(s,"js",n+".js"),a=ot(t),r=await st(t);await Y.build({stdin:{contents:f,sourcefile:o.base,resolveDir:o.dir,loader:"tsx"},minify:!1,treeShaking:!0,bundle:!0,outfile:g,format:r,target:["node20"],keepNames:!0,external:a,packages:"external",plugins:[{name:"test",setup:w=>{w.onLoad({filter:/.*\.css|salty|styles|styled\.ts/},b=>{const P=l.readFileSync(b.path,"utf8");return{contents:G(P),loader:"ts"}})}}]});const p=Date.now();return await import(`${g}?t=${p}`)},B=async t=>{const e=H(t),s=c.join(e,"salty.config.js"),n=Date.now(),{config:i}=await import(`${s}?t=${n}`);return i},it=()=>{try{return process.env.NODE_ENV==="production"}catch{return!1}},xt=async(t,e=it())=>{try{const s=Date.now();e?Z.info("Generating CSS in production mode! 🔥"):Z.info("Generating CSS in development mode! 🚀");const n=[],i=[],o=H(t),f=c.join(o,"index.css");(()=>{l.existsSync(o)&&dt.execSync("rm -rf "+o),l.mkdirSync(o),l.mkdirSync(c.join(o,"css")),l.mkdirSync(c.join(o,"types"))})(),await Ct(t);const a=await B(t);async function r(u,m){const x=["node_modules","saltygen"],F=l.statSync(u);if(F.isDirectory()){const T=l.readdirSync(u);if(x.some(y=>u.includes(y)))return;await Promise.all(T.map(y=>r(c.join(u,y),c.join(m,y))))}else if(F.isFile()&&z(u)){const N=await L(t,u,o),y=[];Object.entries(N).forEach(([_,O])=>{if(O.isKeyframes&&O.css){const K=`a_${O.animationName}.css`,ft=`css/${K}`,ut=c.join(o,ft);n.push(K),l.writeFileSync(ut,O.css);return}if(!O.generator)return;const D=O.generator._withBuildContext({name:_,config:a,prod:e});i[D.priority]||(i[D.priority]=[]),i[D.priority].push(D.cssFileName),y.push(D.cssFileName);const at=`css/${D.cssFileName}`,lt=c.join(o,at);l.writeFileSync(lt,D.css)});const $=y.map(_=>`@import url('./${_}');`).join(`
19
+ `),k=J(u,6),S=c.parse(u),E=V(S.name),R=c.join(o,`css/f_${E}-${k}.css`);l.writeFileSync(R,$)}}await r(t,o);const p=n.map(u=>`@import url('./css/${u}');`).join(`
20
+ `);let P=`@layer reset, global, l0, l1, l2, l3, l4, l5, l6, l7, l8;
21
21
 
22
- ${["_variables.css","_reset.css","_global.css","_templates.css"].filter(f=>{try{return u.readFileSync(a.join(o,"css",f),"utf8").length>0}catch{return!1}}).map(f=>`@import url('./css/${f}');`).join(`
22
+ ${["_variables.css","_reset.css","_global.css","_templates.css"].filter(u=>{try{return l.readFileSync(c.join(o,"css",u),"utf8").length>0}catch{return!1}}).map(u=>`@import url('./css/${u}');`).join(`
23
23
  `)}
24
- ${h}`;if(c.importStrategy!=="component"){const f=i.reduce((g,N,b)=>{const T=N.reduce((C,$)=>{const M=u.readFileSync(a.join(o,"css",$),"utf8");return`${C}
25
- ${M}`},""),k=`l_${b}.css`,p=a.join(o,"css",k),m=`@layer l${b} { ${T} }`;return u.writeFileSync(p,m),`${g}
26
- @import url('./css/${k}');`},"");x+=f}u.writeFileSync(l,x);const y=Date.now()-s,w=y<200?"🔥":y<500?"🚀":y<1e3?"🎉":y<2e3?"🚗":y<5e3?"🤔":"🥴";I.info(`Generated CSS in ${y}ms! ${w}`)}catch(s){console.error(s)}},ke=async(e,t)=>{try{const s=[],n=a.join(e,"./saltygen"),i=a.join(n,"index.css");if(W(t)){const l=await B(e),d=await H(e,t,n);Object.entries(d).forEach(([j,S])=>{if(S.isKeyframes&&S.css){const f=`css/${`a_${S.animationName}.css`}`,g=a.join(n,f);u.writeFileSync(g,S.css);return}if(!S.generator)return;const x=S.generator._withBuildContext({name:j,config:l}),_=`css/${x.cssFileName}`,y=a.join(n,_);s.push(x.cssFileName),u.writeFileSync(y,x.css)});const c=u.readFileSync(i,"utf8").split(`
27
- `),r=s.map(j=>`@import url('../saltygen/css/${j}');`),F=[...new Set([...c,...r])].join(`
28
- `);u.writeFileSync(i,F)}}catch(s){console.error(s)}},Ne=async(e,t,s=ie())=>{try{const n=a.join(e,"./saltygen");if(W(t)){const o=u.readFileSync(t,"utf8");o.replace(/^(?!export\s)const\s.*/gm,h=>`export ${h}`)!==o&&await X.writeFile(t,o);const d=await B(e),c=await H(e,t,n);let r=o;if(Object.entries(c).forEach(([h,F])=>{var C;if(F.isKeyframes||!F.generator)return;const j=F.generator._withBuildContext({name:h,config:d,prod:s}),S=new RegExp(`\\s${h}[=\\s]+[^()]+styled\\(([^,]+),`,"g").exec(o);if(!S)return console.error("Could not find the original declaration");const x=(C=S.at(1))==null?void 0:C.trim(),_=new RegExp(`\\s${h}[=\\s]+styled\\(`,"g").exec(r);if(!_)return console.error("Could not find the original declaration");const{index:y}=_;let w=!1;const f=setTimeout(()=>w=!0,5e3);let g=0,N=!1,b=0;for(;!N&&!w;){const $=r[y+g];$==="("&&b++,$===")"&&b--,b===0&&$===")"&&(N=!0),g>r.length&&(w=!0),g++}if(!w)clearTimeout(f);else throw new Error("Failed to find the end of the styled call and timed out");const T=y+g,k=r.slice(y,T),p=r,m=` ${h} = styled(${x}, "${j.classNames}", ${JSON.stringify(j.props)});`;r=r.replace(k,m),p===r&&console.error("Minimize file failed to change content",{name:h,tagName:x})}),d.importStrategy==="component"){const h=L(t,6),F=a.parse(t);r=`import '../../saltygen/css/${`f_${E(F.name)}-${h}.css`}';
29
- ${r}`}return r=r.replace("{ styled }","{ styledClient as styled }"),r=r.replace("@salty-css/react/styled","@salty-css/react/styled-client"),r}}catch(n){console.error("Error in minimizeFile:",n)}},ce=e=>({name:"stylegen",buildStart:()=>Ce(e),load:async t=>{if(W(t))return await Ne(e,t)},handleHotUpdate:async({file:t,server:s})=>{t.includes("salty.config")&&await s.restart()},watchChange:{handler:async t=>{W(t)&&await ke(e,t)}}});exports.default=ce;exports.saltyPlugin=ce;
24
+ ${p}`;if(a.importStrategy!=="component"){const u=i.reduce((m,x,F)=>{const T=x.reduce((k,S)=>{const E=c.join(o,"css",S),R=l.readFileSync(E,"utf8"),_=J(E,6);return`${k}
25
+ /*start:${_}*/
26
+ ${R}
27
+ /*end:${_}*/
28
+ `},""),N=`l_${F}.css`,y=c.join(o,"css",N),$=`@layer l${F} { ${T}
29
+ }`;return l.writeFileSync(y,$),`${m}
30
+ @import url('./css/${N}');`},"");P+=u}l.writeFileSync(f,P);const d=Date.now()-s,j=d<200?"🔥":d<500?"🚀":d<1e3?"🎉":d<2e3?"🚗":d<5e3?"🤔":"🥴";Z.info(`Generated CSS in ${d}ms! ${j}`)}catch(s){console.error(s)}},kt=async(t,e)=>{try{const s=c.join(t,"./saltygen"),n=c.join(s,"index.css");if(z(e)){const o=[],f=await B(t),g=await L(t,e,s);Object.entries(g).forEach(([r,p])=>{if(p.isKeyframes&&p.css){const C=`css/${`a_${p.animationName}.css`}`,d=c.join(s,C);l.writeFileSync(d,p.css);return}if(!p.generator)return;const h=p.generator._withBuildContext({name:r,config:f}),w=`css/${h.cssFileName}`,b=c.join(s,w);l.writeFileSync(b,h.css),o[h.priority]||(o[h.priority]=[]),o[h.priority].push(h.cssFileName)});const a=l.readFileSync(n,"utf8").split(`
31
+ `);f.importStrategy!=="component"&&o.forEach((r,p)=>{const h=`l_${p}.css`,w=c.join(s,"css",h);let b=l.readFileSync(w,"utf8");r.forEach(P=>{const C=c.join(s,"css",P),d=J(C,6),j=b.includes(d);if(console.log({layer:p,filepath:C,filepathHash:d,found:j}),!j){const u=l.readFileSync(C,"utf8"),m=J(C,6),x=`/*start:${m}*/
32
+ ${u}
33
+ /*end:${m}*/
34
+ `;b=`${b.replace(/\}$/,"")}
35
+ ${x}
36
+ }`}}),l.writeFileSync(w,b)})}}catch(s){console.error(s)}},Pt=async(t,e,s=it())=>{try{const n=c.join(t,"./saltygen");if(z(e)){const o=l.readFileSync(e,"utf8");o.replace(/^(?!export\s)const\s.*/gm,p=>`export ${p}`)!==o&&await X.writeFile(e,o);const g=await B(t),a=await L(t,e,n);let r=o;if(Object.entries(a).forEach(([p,h])=>{var k;if(h.isKeyframes||!h.generator)return;const w=h.generator._withBuildContext({name:p,config:g,prod:s}),b=new RegExp(`\\s${p}[=\\s]+[^()]+styled\\(([^,]+),`,"g").exec(o);if(!b)return console.error("Could not find the original declaration");const P=(k=b.at(1))==null?void 0:k.trim(),C=new RegExp(`\\s${p}[=\\s]+styled\\(`,"g").exec(r);if(!C)return console.error("Could not find the original declaration");const{index:d}=C;let j=!1;const u=setTimeout(()=>j=!0,5e3);let m=0,x=!1,F=0;for(;!x&&!j;){const S=r[d+m];S==="("&&F++,S===")"&&F--,F===0&&S===")"&&(x=!0),m>r.length&&(j=!0),m++}if(!j)clearTimeout(u);else throw new Error("Failed to find the end of the styled call and timed out");const T=d+m,N=r.slice(d,T),y=r,$=` ${p} = styled(${P}, "${w.classNames}", ${JSON.stringify(w.props)});`;r=r.replace(N,$),y===r&&console.error("Minimize file failed to change content",{name:p,tagName:P})}),g.importStrategy==="component"){const p=J(e,6),h=c.parse(e);r=`import '../../saltygen/css/${`f_${V(h.name)}-${p}.css`}';
37
+ ${r}`}return r=r.replace("{ styled }","{ styledClient as styled }"),r=r.replace("@salty-css/react/styled","@salty-css/react/styled-client"),r}}catch(n){console.error("Error in minimizeFile:",n)}},ct=t=>({name:"stylegen",buildStart:()=>xt(t),load:async e=>{if(z(e))return await Pt(t,e)},handleHotUpdate:async({file:e,server:s})=>{e.includes("salty.config")&&await s.restart()},watchChange:{handler:async e=>{z(e)&&await kt(t,e)}}});exports.default=ct;exports.saltyPlugin=ct;
package/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import * as v from "esbuild";
2
2
  import { execSync as dt } from "child_process";
3
- import { join as f, parse as B } from "path";
4
- import { existsSync as K, mkdirSync as z, statSync as gt, readdirSync as yt, writeFileSync as k, readFileSync as A } from "fs";
3
+ import { join as a, parse as K } from "path";
4
+ import { existsSync as G, mkdirSync as H, statSync as gt, readdirSync as yt, writeFileSync as P, readFileSync as V } from "fs";
5
5
  import { readFile as mt, writeFile as ht } from "fs/promises";
6
- import { createLogger as $t, format as H, transports as bt } from "winston";
6
+ import { createLogger as $t, format as I, transports as bt } from "winston";
7
7
  const Y = (t) => String.fromCharCode(t + (t > 25 ? 39 : 97)), St = (t, e) => {
8
8
  let s = "", n;
9
9
  for (n = Math.abs(t); n > 52; n = n / 52 | 0) s = Y(n % 52) + s;
@@ -12,12 +12,12 @@ const Y = (t) => String.fromCharCode(t + (t > 25 ? 39 : 97)), St = (t, e) => {
12
12
  let s = e.length;
13
13
  for (; s; ) t = t * 33 ^ e.charCodeAt(--s);
14
14
  return t;
15
- }, G = (t, e = 5) => {
15
+ }, W = (t, e = 5) => {
16
16
  const s = wt(5381, JSON.stringify(t)) >>> 0;
17
17
  return St(s, e);
18
18
  };
19
- function V(t) {
20
- return t ? typeof t != "string" ? V(String(t)) : t.replace(/[\s.]/g, "-").replace(/[A-Z](?:(?=[^A-Z])|[A-Z]*(?=[A-Z][^A-Z]|$))/g, (e, s) => (s > 0 ? "-" : "") + e.toLowerCase()) : "";
19
+ function A(t) {
20
+ return t ? typeof t != "string" ? A(String(t)) : t.replace(/[\s.]/g, "-").replace(/[A-Z](?:(?=[^A-Z])|[A-Z]*(?=[A-Z][^A-Z]|$))/g, (e, s) => (s > 0 ? "-" : "") + e.toLowerCase()) : "";
21
21
  }
22
22
  const jt = (t, e) => {
23
23
  if (typeof t != "string") return { result: t };
@@ -25,57 +25,57 @@ const jt = (t, e) => {
25
25
  const s = [];
26
26
  return Object.values(e).forEach((n) => {
27
27
  const { pattern: i, transform: o } = n;
28
- t = t.replace(i, (a) => {
29
- const { value: u, css: c } = o(a);
30
- return c && s.push(c), u;
28
+ t = t.replace(i, (l) => {
29
+ const { value: g, css: c } = o(l);
30
+ return c && s.push(c), g;
31
31
  });
32
32
  }), { result: t, additionalCss: s };
33
- }, tt = (t) => typeof t != "string" ? { result: t } : /\{[^{}]+\}/g.test(t) ? { result: t.replace(/\{([^{}]+)\}/g, (...n) => `var(--${V(n[1].replaceAll(".", "-"))})`) } : { result: t }, O = (t, e, s) => {
33
+ }, tt = (t) => typeof t != "string" ? { result: t } : /\{[^{}]+\}/g.test(t) ? { result: t.replace(/\{([^{}]+)\}/g, (...n) => `var(--${A(n[1].replaceAll(".", "-"))})`) } : { result: t }, M = (t, e, s) => {
34
34
  if (!t) return "";
35
- const n = [], i = Object.entries(t).reduce((a, [u, c]) => {
36
- const r = u.trim();
35
+ const n = [], i = Object.entries(t).reduce((l, [g, c]) => {
36
+ const r = g.trim();
37
37
  if (typeof c == "function" && (c = c()), typeof c == "object") {
38
- if (!c) return a;
38
+ if (!c) return l;
39
39
  if (r === "variants")
40
- return Object.entries(c).forEach(([l, g]) => {
41
- g && Object.entries(g).forEach(([N, b]) => {
42
- if (!b) return;
43
- const T = `${e}.${l}-${N}`, F = O(b, T);
44
- n.push(F);
40
+ return Object.entries(c).forEach(([f, y]) => {
41
+ y && Object.entries(y).forEach(([C, j]) => {
42
+ if (!j) return;
43
+ const T = `${e}.${f}-${C}`, N = M(j, T);
44
+ n.push(N);
45
45
  });
46
- }), a;
46
+ }), l;
47
47
  if (r === "defaultVariants")
48
- return a;
48
+ return l;
49
49
  if (r === "compoundVariants")
50
- return c.forEach((l) => {
51
- const { css: g, ...N } = l, b = Object.entries(N).reduce((F, [p, y]) => `${F}.${p}-${y}`, e), T = O(g, b);
50
+ return c.forEach((f) => {
51
+ const { css: y, ...C } = f, j = Object.entries(C).reduce((N, [d, h]) => `${N}.${d}-${h}`, e), T = M(y, j);
52
52
  n.push(T);
53
- }), a;
53
+ }), l;
54
54
  if (r.startsWith("@")) {
55
- const l = O(c, e), g = `${r} {
56
- ${l.replace(`
55
+ const f = M(c, e), y = `${r} {
56
+ ${f.replace(`
57
57
  `, `
58
58
  `)}
59
59
  }`;
60
- return n.push(g), a;
60
+ return n.push(y), l;
61
61
  }
62
- const d = u.includes("&") ? r.replace("&", e) : r.startsWith(":") ? `${e}${r}` : `${e} ${r}`, w = O(c, d);
63
- return n.push(w), a;
62
+ const u = g.includes("&") ? r.replace("&", e) : r.startsWith(":") ? `${e}${r}` : `${e} ${r}`, S = M(c, u);
63
+ return n.push(S), l;
64
64
  }
65
- const m = r.startsWith("-") ? r : V(r), j = (d, w = ";") => a = `${a}${d}${w}`, S = (d) => j(`${m}:${d}`);
66
- if (typeof c == "number") return S(c);
65
+ const p = r.startsWith("-") ? r : A(r), m = (u, S = ";") => l = `${l}${u}${S}`, w = (u) => m(`${p}:${u}`);
66
+ if (typeof c == "number") return w(c);
67
67
  if (typeof c != "string")
68
68
  if ("toString" in c) c = c.toString();
69
- else return a;
70
- const { modifiers: h } = {}, D = function* () {
71
- yield tt(c), yield jt(c, h);
69
+ else return l;
70
+ const { modifiers: b } = {}, F = function* () {
71
+ yield tt(c), yield jt(c, b);
72
72
  }();
73
- for (const { result: d, additionalCss: w = [] } of D)
74
- c = d, w.forEach((l) => {
75
- const g = O(l, "");
76
- j(g, "");
73
+ for (const { result: u, additionalCss: S = [] } of F)
74
+ c = u, S.forEach((f) => {
75
+ const y = M(f, "");
76
+ m(y, "");
77
77
  });
78
- return S(c);
78
+ return w(c);
79
79
  }, "");
80
80
  return i ? e ? [`${e} { ${i} }`, ...n].join(`
81
81
  `) : i : n.join(`
@@ -86,40 +86,40 @@ const jt = (t, e) => {
86
86
  if (Object.entries(t).forEach(([i, o]) => {
87
87
  if (typeof o == "object") {
88
88
  if (!o) return;
89
- const a = i.trim(), u = et(o, [...e, a]);
90
- s.push(u);
89
+ const l = i.trim(), g = et(o, [...e, l]);
90
+ s.push(g);
91
91
  } else
92
92
  n[i] = o;
93
93
  }), Object.keys(n).length) {
94
- const i = e.map(V).join("-"), o = O(n, `.${i}`);
94
+ const i = e.map(A).join("-"), o = M(n, `.${i}`);
95
95
  s.push(o);
96
96
  }
97
97
  return s.join(`
98
98
  `);
99
- }, xt = (t) => Object.entries(t).reduce((e, [s, n]) => (typeof n == "object" && (e[s] = st(n).map((i) => `"${i}"`).join(" | ")), e), {}), st = (t, e = "", s = /* @__PURE__ */ new Set()) => t ? (Object.entries(t).forEach(([n, i]) => {
99
+ }, Ft = (t) => Object.entries(t).reduce((e, [s, n]) => (typeof n == "object" && (e[s] = st(n).map((i) => `"${i}"`).join(" | ")), e), {}), st = (t, e = "", s = /* @__PURE__ */ new Set()) => t ? (Object.entries(t).forEach(([n, i]) => {
100
100
  const o = e ? `${e}.${n}` : n;
101
101
  return typeof i == "object" ? st(i, o, s) : s.add(e);
102
102
  }), [...s]) : [], nt = (t) => {
103
103
  if (!t || t === "/") throw new Error("Could not find package.json file");
104
- const e = f(t, "package.json");
105
- return K(e) ? e : nt(f(t, ".."));
104
+ const e = a(t, "package.json");
105
+ return G(e) ? e : nt(a(t, ".."));
106
106
  }, Ct = async (t) => {
107
107
  const e = nt(t);
108
108
  return await mt(e, "utf-8").then(JSON.parse).catch(() => {
109
109
  });
110
- }, Ft = async (t) => {
110
+ }, xt = async (t) => {
111
111
  const e = await Ct(t);
112
112
  if (e)
113
113
  return e.type;
114
114
  };
115
- let R;
115
+ let J;
116
116
  const ot = async (t) => {
117
- if (R) return R;
118
- const e = await Ft(t);
119
- return e === "module" ? R = "esm" : (e === "commonjs" || import.meta.url.endsWith(".cjs")) && (R = "cjs"), R || "esm";
120
- }, I = $t({
117
+ if (J) return J;
118
+ const e = await xt(t);
119
+ return e === "module" ? J = "esm" : (e === "commonjs" || import.meta.url.endsWith(".cjs")) && (J = "cjs"), J || "esm";
120
+ }, L = $t({
121
121
  level: "debug",
122
- format: H.combine(H.colorize(), H.cli()),
122
+ format: I.combine(I.colorize(), I.cli()),
123
123
  transports: [new bt.Console({})]
124
124
  });
125
125
  function rt(t) {
@@ -171,16 +171,16 @@ const kt = {
171
171
  fontSize: "100%",
172
172
  lineHeight: "1.15em"
173
173
  }
174
- }, L = {
174
+ }, B = {
175
175
  externalModules: []
176
176
  }, it = (t) => {
177
- if (L.externalModules.length > 0) return L.externalModules;
178
- const e = f(t, "salty.config.ts"), n = A(e, "utf8").match(/externalModules:\s?\[(.*)\]/);
177
+ if (B.externalModules.length > 0) return B.externalModules;
178
+ const e = a(t, "salty.config.ts"), n = V(e, "utf8").match(/externalModules:\s?\[(.*)\]/);
179
179
  if (!n) return [];
180
180
  const i = n[1].split(",").map((o) => o.replace(/['"`]/g, "").trim());
181
- return L.externalModules = i, i;
182
- }, Z = (t) => f(t, "./saltygen"), ct = ["salty", "css", "styles", "styled"], Nt = (t = []) => new RegExp(`\\.(${[...ct, ...t].join("|")})\\.`), W = (t, e = []) => Nt(e).test(t), Tt = async (t) => {
183
- const e = Z(t), s = f(t, "salty.config.ts"), n = f(e, "salty.config.js"), i = await ot(t), o = it(t);
181
+ return B.externalModules = i, i;
182
+ }, Z = (t) => a(t, "./saltygen"), ct = ["salty", "css", "styles", "styled"], Nt = (t = []) => new RegExp(`\\.(${[...ct, ...t].join("|")})\\.`), z = (t, e = []) => Nt(e).test(t), Pt = async (t) => {
183
+ const e = Z(t), s = a(t, "salty.config.ts"), n = a(e, "salty.config.js"), i = await ot(t), o = it(t);
184
184
  await v.build({
185
185
  entryPoints: [s],
186
186
  minify: !0,
@@ -190,64 +190,62 @@ const kt = {
190
190
  format: i,
191
191
  external: o
192
192
  });
193
- const a = Date.now(), { config: u } = await import(`${n}?t=${a}`);
194
- return u;
195
- }, Pt = async (t) => {
196
- const e = await Tt(t), s = /* @__PURE__ */ new Set(), n = (p, y = []) => p ? Object.entries(p).flatMap(([C, $]) => {
193
+ const l = Date.now(), { config: g } = await import(`${n}?t=${l}`);
194
+ return g;
195
+ }, Tt = async (t) => {
196
+ const e = await Pt(t), s = /* @__PURE__ */ new Set(), n = (d, h = []) => d ? Object.entries(d).flatMap(([x, $]) => {
197
197
  if (!$) return;
198
- if (typeof $ == "object") return n($, [...y, C]);
199
- const M = rt(C), J = V(C), _ = [...y, M].join(".");
200
- s.add(`"${_}"`);
201
- const P = [...y.map(V), J].join("-"), { result: E } = tt($);
202
- return `--${P}: ${E};`;
203
- }) : [], i = (p) => p ? Object.entries(p).flatMap(([y, C]) => {
204
- const $ = n(C);
205
- return y === "base" ? $.join("") : `${y} { ${$.join("")} }`;
206
- }) : [], o = (p) => p ? Object.entries(p).flatMap(([y, C]) => Object.entries(C).flatMap(([$, M]) => {
207
- const J = n(M, [y]), _ = `.${y}-${$}, [data-${y}="${$}"]`, P = J.join("");
208
- return `${_} { ${P} }`;
209
- })) : [], a = n(e.variables), u = i(e.responsiveVariables), c = o(e.conditionalVariables), r = Z(t), m = f(r, "css/_variables.css"), j = `:root { ${a.join("")} ${u.join("")} } ${c.join("")}`;
210
- k(m, j);
211
- const S = f(r, "css/_global.css"), h = O(e.global, "");
212
- k(S, `@layer global { ${h} }`);
213
- const x = f(r, "css/_reset.css"), d = e.reset === "none" ? {} : typeof e.reset == "object" ? e.reset : kt, w = O(d, "");
214
- k(x, `@layer reset { ${w} }`);
215
- const l = f(r, "css/_templates.css"), g = et(e.templates), N = xt(e.templates);
216
- k(l, g);
217
- const b = f(r, "types/css-tokens.d.ts"), F = `
198
+ if (typeof $ == "object") return n($, [...h, x]);
199
+ const _ = rt(x), R = A(x), E = [...h, _].join(".");
200
+ s.add(`"${E}"`);
201
+ const D = [...h.map(A), R].join("-"), { result: O } = tt($);
202
+ return `--${D}: ${O};`;
203
+ }) : [], i = (d) => d ? Object.entries(d).flatMap(([h, x]) => {
204
+ const $ = n(x);
205
+ return h === "base" ? $.join("") : `${h} { ${$.join("")} }`;
206
+ }) : [], o = (d) => d ? Object.entries(d).flatMap(([h, x]) => Object.entries(x).flatMap(([$, _]) => {
207
+ const R = n(_, [h]), E = `.${h}-${$}, [data-${h}="${$}"]`, D = R.join("");
208
+ return `${E} { ${D} }`;
209
+ })) : [], l = n(e.variables), g = i(e.responsiveVariables), c = o(e.conditionalVariables), r = Z(t), p = a(r, "css/_variables.css"), m = `:root { ${l.join("")} ${g.join("")} } ${c.join("")}`;
210
+ P(p, m);
211
+ const w = a(r, "css/_global.css"), b = M(e.global, "");
212
+ P(w, `@layer global { ${b} }`);
213
+ const k = a(r, "css/_reset.css"), u = e.reset === "none" ? {} : typeof e.reset == "object" ? e.reset : kt, S = M(u, "");
214
+ P(k, `@layer reset { ${S} }`);
215
+ const f = a(r, "css/_templates.css"), y = et(e.templates), C = Ft(e.templates);
216
+ P(f, y);
217
+ const j = a(r, "types/css-tokens.d.ts"), N = `
218
218
  // Variable types
219
219
  type VariableTokens = ${[...s].join("|")};
220
220
  type PropertyValueToken = \`{\${VariableTokens}}\`;
221
221
 
222
222
  // Template types
223
223
  type TemplateTokens = {
224
- ${Object.entries(N).map(([p, y]) => `${p}?: ${y}`).join(`
224
+ ${Object.entries(C).map(([d, h]) => `${d}?: ${h}`).join(`
225
225
  `)}
226
226
  }
227
227
  `;
228
- k(b, F);
228
+ P(j, N);
229
229
  }, Q = (t) => t.replace(/styled\(([^"'`{,]+),/g, (e, s) => {
230
- const n = /^['"`]/.test(s);
231
- if (n && console.log("String tag", s), n) return e;
232
- const i = new RegExp(`import[^;]*${s}[,\\s{][^;]*from\\s?([^{};]+);`), o = i.test(t);
233
- if (o || console.log("Not imported", s), !o) return e;
234
- const a = i.exec(t);
235
- if (a) {
236
- const u = a.at(1), c = ct.some((r) => u == null ? void 0 : u.includes(r));
237
- if (c && console.log("Salty import for", s, `"${a.at(0)}"`), c) return e;
230
+ if (/^['"`]/.test(s)) return e;
231
+ const i = new RegExp(`import[^;]*${s}[,\\s{][^;]*from\\s?([^{};]+);`);
232
+ if (!i.test(t)) return e;
233
+ const l = i.exec(t);
234
+ if (l) {
235
+ const g = l.at(1);
236
+ if (ct.some((r) => g == null ? void 0 : g.includes(r))) return e;
238
237
  }
239
- return console.log("Replacing", s), "styled('div',";
238
+ return "styled('div',";
240
239
  }), q = async (t, e, s) => {
241
- console.log({ sourceFilePath: e });
242
- const n = G(e), i = f(s, "./temp");
243
- K(i) || z(i);
244
- const o = B(e);
245
- let a = A(e, "utf8");
246
- a = Q(a);
247
- const u = f(s, "js", n + ".js"), c = it(t), r = await ot(t);
240
+ const n = W(e), i = a(s, "./temp");
241
+ G(i) || H(i);
242
+ const o = K(e);
243
+ let l = V(e, "utf8");
244
+ l = Q(l);
245
+ const g = a(s, "js", n + ".js"), c = it(t), r = await ot(t);
248
246
  await v.build({
249
247
  stdin: {
250
- contents: a,
248
+ contents: l,
251
249
  sourcefile: o.base,
252
250
  resolveDir: o.dir,
253
251
  loader: "tsx"
@@ -255,7 +253,7 @@ const kt = {
255
253
  minify: !1,
256
254
  treeShaking: !0,
257
255
  bundle: !0,
258
- outfile: u,
256
+ outfile: g,
259
257
  format: r,
260
258
  target: ["node20"],
261
259
  keepNames: !0,
@@ -264,23 +262,19 @@ const kt = {
264
262
  plugins: [
265
263
  {
266
264
  name: "test",
267
- setup: (S) => {
268
- S.onLoad({ filter: /.*.css.ts/ }, (h) => {
269
- console.log("Loading", {
270
- sourceFilePath: e,
271
- args: h
272
- });
273
- const x = A(h.path, "utf8");
274
- return { contents: Q(x), loader: "ts" };
265
+ setup: (w) => {
266
+ w.onLoad({ filter: /.*\.css|salty|styles|styled\.ts/ }, (b) => {
267
+ const k = V(b.path, "utf8");
268
+ return { contents: Q(k), loader: "ts" };
275
269
  });
276
270
  }
277
271
  }
278
272
  ]
279
273
  });
280
- const m = Date.now();
281
- return await import(`${u}?t=${m}`);
274
+ const p = Date.now();
275
+ return await import(`${g}?t=${p}`);
282
276
  }, U = async (t) => {
283
- const e = Z(t), s = f(e, "salty.config.js"), n = Date.now(), { config: i } = await import(`${s}?t=${n}`);
277
+ const e = Z(t), s = a(e, "salty.config.js"), n = Date.now(), { config: i } = await import(`${s}?t=${n}`);
284
278
  return i;
285
279
  }, at = () => {
286
280
  try {
@@ -288,136 +282,154 @@ const kt = {
288
282
  } catch {
289
283
  return !1;
290
284
  }
291
- }, Dt = async (t, e = at()) => {
285
+ }, Et = async (t, e = at()) => {
292
286
  try {
293
287
  const s = Date.now();
294
- e ? I.info("Generating CSS in production mode! 🔥") : I.info("Generating CSS in development mode! 🚀");
295
- const n = [], i = [], o = Z(t), a = f(o, "index.css");
288
+ e ? L.info("Generating CSS in production mode! 🔥") : L.info("Generating CSS in development mode! 🚀");
289
+ const n = [], i = [], o = Z(t), l = a(o, "index.css");
296
290
  (() => {
297
- K(o) && dt("rm -rf " + o), z(o), z(f(o, "css")), z(f(o, "types"));
298
- })(), await Pt(t);
291
+ G(o) && dt("rm -rf " + o), H(o), H(a(o, "css")), H(a(o, "types"));
292
+ })(), await Tt(t);
299
293
  const c = await U(t);
300
- async function r(l, g) {
301
- const N = ["node_modules", "saltygen"], b = gt(l);
302
- if (b.isDirectory()) {
303
- const T = yt(l);
304
- if (N.some((p) => l.includes(p))) return;
305
- await Promise.all(T.map((p) => r(f(l, p), f(g, p))));
306
- } else if (b.isFile() && W(l)) {
307
- const F = await q(t, l, o), p = [];
308
- Object.entries(F).forEach(([_, P]) => {
309
- if (P.isKeyframes && P.css) {
310
- const X = `a_${P.animationName}.css`, pt = `css/${X}`, ut = f(o, pt);
311
- n.push(X), k(ut, P.css);
294
+ async function r(f, y) {
295
+ const C = ["node_modules", "saltygen"], j = gt(f);
296
+ if (j.isDirectory()) {
297
+ const T = yt(f);
298
+ if (C.some((d) => f.includes(d))) return;
299
+ await Promise.all(T.map((d) => r(a(f, d), a(y, d))));
300
+ } else if (j.isFile() && z(f)) {
301
+ const N = await q(t, f, o), d = [];
302
+ Object.entries(N).forEach(([E, D]) => {
303
+ if (D.isKeyframes && D.css) {
304
+ const X = `a_${D.animationName}.css`, pt = `css/${X}`, ut = a(o, pt);
305
+ n.push(X), P(ut, D.css);
312
306
  return;
313
307
  }
314
- if (!P.generator) return;
315
- const E = P.generator._withBuildContext({
316
- name: _,
308
+ if (!D.generator) return;
309
+ const O = D.generator._withBuildContext({
310
+ name: E,
317
311
  config: c,
318
312
  prod: e
319
313
  });
320
- i[E.priority] || (i[E.priority] = []), i[E.priority].push(E.cssFileName), p.push(E.cssFileName);
321
- const lt = `css/${E.cssFileName}`, ft = f(o, lt);
322
- k(ft, E.css);
314
+ i[O.priority] || (i[O.priority] = []), i[O.priority].push(O.cssFileName), d.push(O.cssFileName);
315
+ const lt = `css/${O.cssFileName}`, ft = a(o, lt);
316
+ P(ft, O.css);
323
317
  });
324
- const y = p.map((_) => `@import url('./${_}');`).join(`
325
- `), C = G(l, 6), $ = B(l), M = V($.name), J = f(o, `css/f_${M}-${C}.css`);
326
- k(J, y);
318
+ const h = d.map((E) => `@import url('./${E}');`).join(`
319
+ `), x = W(f, 6), $ = K(f), _ = A($.name), R = a(o, `css/f_${_}-${x}.css`);
320
+ P(R, h);
327
321
  }
328
322
  }
329
323
  await r(t, o);
330
- const m = n.map((l) => `@import url('./css/${l}');`).join(`
324
+ const p = n.map((f) => `@import url('./css/${f}');`).join(`
331
325
  `);
332
- let x = `@layer reset, global, l0, l1, l2, l3, l4, l5, l6, l7, l8;
326
+ let k = `@layer reset, global, l0, l1, l2, l3, l4, l5, l6, l7, l8;
333
327
 
334
- ${["_variables.css", "_reset.css", "_global.css", "_templates.css"].filter((l) => {
328
+ ${["_variables.css", "_reset.css", "_global.css", "_templates.css"].filter((f) => {
335
329
  try {
336
- return A(f(o, "css", l), "utf8").length > 0;
330
+ return V(a(o, "css", f), "utf8").length > 0;
337
331
  } catch {
338
332
  return !1;
339
333
  }
340
- }).map((l) => `@import url('./css/${l}');`).join(`
334
+ }).map((f) => `@import url('./css/${f}');`).join(`
341
335
  `)}
342
- ${m}`;
336
+ ${p}`;
343
337
  if (c.importStrategy !== "component") {
344
- const l = i.reduce((g, N, b) => {
345
- const T = N.reduce((C, $) => {
346
- const M = A(f(o, "css", $), "utf8");
347
- return `${C}
348
- ${M}`;
349
- }, ""), F = `l_${b}.css`, p = f(o, "css", F), y = `@layer l${b} { ${T} }`;
350
- return k(p, y), `${g}
351
- @import url('./css/${F}');`;
338
+ const f = i.reduce((y, C, j) => {
339
+ const T = C.reduce((x, $) => {
340
+ const _ = a(o, "css", $), R = V(_, "utf8"), E = W(_, 6);
341
+ return `${x}
342
+ /*start:${E}*/
343
+ ${R}
344
+ /*end:${E}*/
345
+ `;
346
+ }, ""), N = `l_${j}.css`, d = a(o, "css", N), h = `@layer l${j} { ${T}
347
+ }`;
348
+ return P(d, h), `${y}
349
+ @import url('./css/${N}');`;
352
350
  }, "");
353
- x += l;
351
+ k += f;
354
352
  }
355
- k(a, x);
356
- const d = Date.now() - s, w = d < 200 ? "🔥" : d < 500 ? "🚀" : d < 1e3 ? "🎉" : d < 2e3 ? "🚗" : d < 5e3 ? "🤔" : "🥴";
357
- I.info(`Generated CSS in ${d}ms! ${w}`);
353
+ P(l, k);
354
+ const u = Date.now() - s, S = u < 200 ? "🔥" : u < 500 ? "🚀" : u < 1e3 ? "🎉" : u < 2e3 ? "🚗" : u < 5e3 ? "🤔" : "🥴";
355
+ L.info(`Generated CSS in ${u}ms! ${S}`);
358
356
  } catch (s) {
359
357
  console.error(s);
360
358
  }
361
- }, Et = async (t, e) => {
359
+ }, Dt = async (t, e) => {
362
360
  try {
363
- const s = [], n = f(t, "./saltygen"), i = f(n, "index.css");
364
- if (W(e)) {
365
- const a = await U(t), u = await q(t, e, n);
366
- Object.entries(u).forEach(([S, h]) => {
367
- if (h.isKeyframes && h.css) {
368
- const l = `css/${`a_${h.animationName}.css`}`, g = f(n, l);
369
- k(g, h.css);
361
+ const s = a(t, "./saltygen"), n = a(s, "index.css");
362
+ if (z(e)) {
363
+ const o = [], l = await U(t), g = await q(t, e, s);
364
+ Object.entries(g).forEach(([r, p]) => {
365
+ if (p.isKeyframes && p.css) {
366
+ const F = `css/${`a_${p.animationName}.css`}`, u = a(s, F);
367
+ P(u, p.css);
370
368
  return;
371
369
  }
372
- if (!h.generator) return;
373
- const x = h.generator._withBuildContext({
374
- name: S,
375
- config: a
376
- }), D = `css/${x.cssFileName}`, d = f(n, D);
377
- s.push(x.cssFileName), k(d, x.css);
370
+ if (!p.generator) return;
371
+ const m = p.generator._withBuildContext({
372
+ name: r,
373
+ config: l
374
+ }), w = `css/${m.cssFileName}`, b = a(s, w);
375
+ P(b, m.css), o[m.priority] || (o[m.priority] = []), o[m.priority].push(m.cssFileName);
378
376
  });
379
- const c = A(i, "utf8").split(`
380
- `), r = s.map((S) => `@import url('../saltygen/css/${S}');`), j = [.../* @__PURE__ */ new Set([...c, ...r])].join(`
377
+ const c = V(n, "utf8").split(`
381
378
  `);
382
- k(i, j);
379
+ l.importStrategy !== "component" && o.forEach((r, p) => {
380
+ const m = `l_${p}.css`, w = a(s, "css", m);
381
+ let b = V(w, "utf8");
382
+ r.forEach((k) => {
383
+ const F = a(s, "css", k), u = W(F, 6), S = b.includes(u);
384
+ if (console.log({ layer: p, filepath: F, filepathHash: u, found: S }), !S) {
385
+ const f = V(F, "utf8"), y = W(F, 6), C = `/*start:${y}*/
386
+ ${f}
387
+ /*end:${y}*/
388
+ `;
389
+ b = `${b.replace(/\}$/, "")}
390
+ ${C}
391
+ }`;
392
+ }
393
+ }), P(w, b);
394
+ });
383
395
  }
384
396
  } catch (s) {
385
397
  console.error(s);
386
398
  }
387
399
  }, Ot = async (t, e, s = at()) => {
388
400
  try {
389
- const n = f(t, "./saltygen");
390
- if (W(e)) {
391
- const o = A(e, "utf8");
392
- o.replace(/^(?!export\s)const\s.*/gm, (m) => `export ${m}`) !== o && await ht(e, o);
393
- const u = await U(t), c = await q(t, e, n);
401
+ const n = a(t, "./saltygen");
402
+ if (z(e)) {
403
+ const o = V(e, "utf8");
404
+ o.replace(/^(?!export\s)const\s.*/gm, (p) => `export ${p}`) !== o && await ht(e, o);
405
+ const g = await U(t), c = await q(t, e, n);
394
406
  let r = o;
395
- if (Object.entries(c).forEach(([m, j]) => {
396
- var C;
397
- if (j.isKeyframes || !j.generator) return;
398
- const S = j.generator._withBuildContext({
399
- name: m,
400
- config: u,
407
+ if (Object.entries(c).forEach(([p, m]) => {
408
+ var x;
409
+ if (m.isKeyframes || !m.generator) return;
410
+ const w = m.generator._withBuildContext({
411
+ name: p,
412
+ config: g,
401
413
  prod: s
402
- }), h = new RegExp(`\\s${m}[=\\s]+[^()]+styled\\(([^,]+),`, "g").exec(o);
403
- if (!h) return console.error("Could not find the original declaration");
404
- const x = (C = h.at(1)) == null ? void 0 : C.trim(), D = new RegExp(`\\s${m}[=\\s]+styled\\(`, "g").exec(r);
405
- if (!D) return console.error("Could not find the original declaration");
406
- const { index: d } = D;
407
- let w = !1;
408
- const l = setTimeout(() => w = !0, 5e3);
409
- let g = 0, N = !1, b = 0;
410
- for (; !N && !w; ) {
411
- const $ = r[d + g];
412
- $ === "(" && b++, $ === ")" && b--, b === 0 && $ === ")" && (N = !0), g > r.length && (w = !0), g++;
414
+ }), b = new RegExp(`\\s${p}[=\\s]+[^()]+styled\\(([^,]+),`, "g").exec(o);
415
+ if (!b) return console.error("Could not find the original declaration");
416
+ const k = (x = b.at(1)) == null ? void 0 : x.trim(), F = new RegExp(`\\s${p}[=\\s]+styled\\(`, "g").exec(r);
417
+ if (!F) return console.error("Could not find the original declaration");
418
+ const { index: u } = F;
419
+ let S = !1;
420
+ const f = setTimeout(() => S = !0, 5e3);
421
+ let y = 0, C = !1, j = 0;
422
+ for (; !C && !S; ) {
423
+ const $ = r[u + y];
424
+ $ === "(" && j++, $ === ")" && j--, j === 0 && $ === ")" && (C = !0), y > r.length && (S = !0), y++;
413
425
  }
414
- if (!w) clearTimeout(l);
426
+ if (!S) clearTimeout(f);
415
427
  else throw new Error("Failed to find the end of the styled call and timed out");
416
- const T = d + g, F = r.slice(d, T), p = r, y = ` ${m} = styled(${x}, "${S.classNames}", ${JSON.stringify(S.props)});`;
417
- r = r.replace(F, y), p === r && console.error("Minimize file failed to change content", { name: m, tagName: x });
418
- }), u.importStrategy === "component") {
419
- const m = G(e, 6), j = B(e);
420
- r = `import '../../saltygen/css/${`f_${V(j.name)}-${m}.css`}';
428
+ const T = u + y, N = r.slice(u, T), d = r, h = ` ${p} = styled(${k}, "${w.classNames}", ${JSON.stringify(w.props)});`;
429
+ r = r.replace(N, h), d === r && console.error("Minimize file failed to change content", { name: p, tagName: k });
430
+ }), g.importStrategy === "component") {
431
+ const p = W(e, 6), m = K(e);
432
+ r = `import '../../saltygen/css/${`f_${A(m.name)}-${p}.css`}';
421
433
  ${r}`;
422
434
  }
423
435
  return r = r.replace("{ styled }", "{ styledClient as styled }"), r = r.replace("@salty-css/react/styled", "@salty-css/react/styled-client"), r;
@@ -427,9 +439,9 @@ ${r}`;
427
439
  }
428
440
  }, Jt = (t) => ({
429
441
  name: "stylegen",
430
- buildStart: () => Dt(t),
442
+ buildStart: () => Et(t),
431
443
  load: async (e) => {
432
- if (W(e))
444
+ if (z(e))
433
445
  return await Ot(t, e);
434
446
  },
435
447
  handleHotUpdate: async ({ file: e, server: s }) => {
@@ -437,7 +449,7 @@ ${r}`;
437
449
  },
438
450
  watchChange: {
439
451
  handler: async (e) => {
440
- W(e) && await Et(t, e);
452
+ z(e) && await Dt(t, e);
441
453
  }
442
454
  }
443
455
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salty-css/vite",
3
- "version": "0.0.1-alpha.141",
3
+ "version": "0.0.1-alpha.143",
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.141"
37
+ "@salty-css/core": "^0.0.1-alpha.143"
38
38
  }
39
39
  }