@salty-css/vite 0.0.1-alpha.131 → 0.0.1-alpha.133

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