@salty-css/core 0.0.1-alpha.13 → 0.0.1-alpha.131

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 (48) hide show
  1. package/.saltyrc.schema.json +40 -0
  2. package/README.md +143 -26
  3. package/bin/bin-util.d.ts +2 -0
  4. package/bin/index.cjs +2 -0
  5. package/bin/index.d.ts +2 -0
  6. package/bin/index.js +3 -0
  7. package/bin/logger.d.ts +2 -0
  8. package/bin/main.cjs +11 -0
  9. package/bin/main.d.ts +1 -0
  10. package/bin/main.js +260 -0
  11. package/bin/prettier.d.ts +1 -0
  12. package/compiler/get-files.d.ts +3 -0
  13. package/compiler/index.cjs +1 -11
  14. package/compiler/index.d.ts +4 -6
  15. package/compiler/index.js +16 -180
  16. package/config/config-types.d.ts +15 -5
  17. package/dash-case-BJEkFEGQ.cjs +1 -0
  18. package/dash-case-DBThphLm.js +19 -0
  19. package/generator/index.cjs +1 -1
  20. package/generator/index.js +40 -17
  21. package/generator/parse-templates.d.ts +2 -0
  22. package/generator/style-generator.d.ts +14 -4
  23. package/index-84Wroia-.cjs +1 -0
  24. package/index-AXVHdDqw.js +305 -0
  25. package/index-D2QOtfTb.cjs +21 -0
  26. package/index-D_732b92.js +4 -0
  27. package/package.json +20 -2
  28. package/parse-templates-DdYSw-iq.cjs +8 -0
  29. package/parse-templates-DnLWJ7Hc.js +100 -0
  30. package/pascal-case-BQpR5PdN.js +6 -0
  31. package/pascal-case-iWoaJWwT.cjs +1 -0
  32. package/react-styled-file-CGVf5n1B.js +11 -0
  33. package/react-styled-file-Dkubsz-U.cjs +8 -0
  34. package/react-vanilla-file-CCXbsjIb.js +18 -0
  35. package/react-vanilla-file-CG_WJLam.cjs +15 -0
  36. package/salty.config-BhBY_oOk.js +10 -0
  37. package/salty.config-Dk6ZcCxI.cjs +7 -0
  38. package/templates/salty-reset.d.ts +2 -0
  39. package/types/index.d.ts +48 -21
  40. package/util/camel-case.d.ts +1 -0
  41. package/util/dot-case.d.ts +1 -0
  42. package/util/index.cjs +1 -1
  43. package/util/index.d.ts +2 -0
  44. package/util/index.js +7 -15
  45. package/util/module-type.d.ts +1 -0
  46. package/util/pascal-case.d.ts +1 -0
  47. package/parse-templates-BOSK0Tb6.js +0 -90
  48. package/parse-templates-BY1Xai-_.cjs +0 -8
@@ -0,0 +1,305 @@
1
+ import * as X from "esbuild";
2
+ import { execSync as ce } from "child_process";
3
+ import { t as H, d as R } from "./dash-case-DBThphLm.js";
4
+ import { join as o, parse as I } from "path";
5
+ import { existsSync as Z, writeFileSync as S, mkdirSync as O, readFileSync as J, statSync as ie, readdirSync as le } from "fs";
6
+ import { readFile as pe, writeFile as fe } from "fs/promises";
7
+ import { p as U, a as de, b as ue, c as ge } from "./parse-templates-DnLWJ7Hc.js";
8
+ import { createLogger as me, format as A, transports as ye } from "winston";
9
+ const Y = (e) => {
10
+ if (!e || e === "/") throw new Error("Could not find package.json file");
11
+ const t = o(e, "package.json");
12
+ return Z(t) ? t : Y(o(e, ".."));
13
+ }, he = async (e) => {
14
+ const t = Y(e);
15
+ return await pe(t, "utf-8").then(JSON.parse).catch(() => {
16
+ });
17
+ }, be = async (e) => {
18
+ const t = await he(e);
19
+ if (t)
20
+ return t.type;
21
+ };
22
+ let v;
23
+ const Q = async (e) => {
24
+ if (v) return v;
25
+ const t = await be(e);
26
+ return t === "module" ? v = "esm" : (t === "commonjs" || import.meta.url.endsWith(".cjs")) && (v = "cjs"), v || "esm";
27
+ }, z = me({
28
+ level: "debug",
29
+ format: A.combine(A.colorize(), A.cli()),
30
+ transports: [new ye.Console({})]
31
+ }), Me = (e) => {
32
+ z.error(e);
33
+ };
34
+ function ee(e) {
35
+ return e ? typeof e != "string" ? ee(String(e)) : e.replace(/[\s-]/g, ".").replace(/[A-Z](?:(?=[^A-Z])|[A-Z]*(?=[A-Z][^A-Z]|$))/g, (t, a) => (a > 0 ? "." : "") + t.toLowerCase()) : "";
36
+ }
37
+ const $e = {
38
+ /** Set box model to border-box */
39
+ "*, *::before, *::after": {
40
+ boxSizing: "border-box"
41
+ },
42
+ /** Remove default margin and padding */
43
+ "*": {
44
+ margin: 0
45
+ },
46
+ /** Remove adjust font properties */
47
+ html: {
48
+ lineHeight: 1.15,
49
+ textSizeAdjust: "100%",
50
+ WebkitFontSmoothing: "antialiased"
51
+ },
52
+ /** Make media elements responsive */
53
+ "img, picture, video, canvas, svg": {
54
+ display: "block",
55
+ maxWidth: "100%"
56
+ },
57
+ /** Avoid overflow of text */
58
+ "p, h1, h2, h3, h4, h5, h6": {
59
+ overflowWrap: "break-word"
60
+ },
61
+ /** Improve text wrapping */
62
+ p: {
63
+ textWrap: "pretty"
64
+ },
65
+ "h1, h2, h3, h4, h5, h6": {
66
+ textWrap: "balance"
67
+ },
68
+ /** Improve button line height */
69
+ button: {
70
+ lineHeight: "1em"
71
+ },
72
+ /** Improve form elements */
73
+ "input, optgroup, select, textarea": {
74
+ fontFamily: "inherit",
75
+ fontSize: "100%",
76
+ lineHeight: "1.15em"
77
+ }
78
+ }, B = {
79
+ externalModules: []
80
+ }, te = (e) => {
81
+ if (B.externalModules.length > 0) return B.externalModules;
82
+ const t = o(e, "salty.config.ts"), r = J(t, "utf8").match(/externalModules:\s?\[(.*)\]/);
83
+ if (!r) return [];
84
+ const l = r[1].split(",").map((s) => s.replace(/['"`]/g, "").trim());
85
+ return B.externalModules = l, l;
86
+ }, W = (e) => o(e, "./saltygen"), Se = ["salty", "css", "styles", "styled"], we = (e = []) => new RegExp(`\\.(${[...Se, ...e].join("|")})\\.`), G = (e, t = []) => we(t).test(e), Fe = async (e) => {
87
+ const t = W(e), a = o(e, "salty.config.ts"), r = o(t, "salty.config.js"), l = await Q(e), s = te(e);
88
+ await X.build({
89
+ entryPoints: [a],
90
+ minify: !0,
91
+ treeShaking: !0,
92
+ bundle: !0,
93
+ outfile: r,
94
+ format: l,
95
+ external: s
96
+ });
97
+ const g = Date.now(), { config: m } = await import(`${r}?t=${g}`);
98
+ return m;
99
+ }, xe = async (e) => {
100
+ const t = await Fe(e), a = /* @__PURE__ */ new Set(), r = (i, f = []) => i ? Object.entries(i).flatMap(([y, d]) => {
101
+ if (!d) return;
102
+ if (typeof d == "object") return r(d, [...f, y]);
103
+ const V = ee(y), _ = R(y), D = [...f, V].join(".");
104
+ a.add(`"${D}"`);
105
+ const x = [...f.map(R), _].join("-"), { result: C } = ge(d);
106
+ return `--${x}: ${C};`;
107
+ }) : [], l = (i) => i ? Object.entries(i).flatMap(([f, y]) => {
108
+ const d = r(y);
109
+ return f === "base" ? d.join("") : `${f} { ${d.join("")} }`;
110
+ }) : [], s = (i) => i ? Object.entries(i).flatMap(([f, y]) => Object.entries(y).flatMap(([d, V]) => {
111
+ const _ = r(V, [f]), D = `.${f}-${d}, [data-${f}="${d}"]`, x = _.join("");
112
+ return `${D} { ${x} }`;
113
+ })) : [], g = r(t.variables), m = l(t.responsiveVariables), w = s(t.conditionalVariables), n = W(e), p = o(n, "css/_variables.css"), h = `:root { ${g.join("")} ${m.join("")} } ${w.join("")}`;
114
+ S(p, h);
115
+ const F = o(n, "css/_global.css"), j = U(t.global, "");
116
+ S(F, `@layer global { ${j} }`);
117
+ const b = o(n, "css/_reset.css"), u = t.reset === "none" ? {} : typeof t.reset == "object" ? t.reset : $e, k = U(u, "");
118
+ S(b, `@layer reset { ${k} }`);
119
+ const c = o(n, "css/_templates.css"), $ = de(t.templates), N = ue(t.templates);
120
+ S(c, $);
121
+ const T = o(n, "types/css-tokens.d.ts"), M = `
122
+ // Variable types
123
+ type VariableTokens = ${[...a].join("|")};
124
+ type PropertyValueToken = \`{\${VariableTokens}}\`;
125
+
126
+ // Template types
127
+ type TemplateTokens = {
128
+ ${Object.entries(N).map(([i, f]) => `${i}?: ${f}`).join(`
129
+ `)}
130
+ }
131
+ `;
132
+ S(T, M);
133
+ }, K = async (e, t, a) => {
134
+ const r = H(t), l = o(a, "./temp");
135
+ Z(l) || O(l);
136
+ const s = I(t);
137
+ let g = J(t, "utf8");
138
+ g = g.replace(/styled\([^"'`{,]+,/g, "styled('div',");
139
+ const m = o(a, "js", r + ".js"), w = te(e), n = await Q(e);
140
+ await X.build({
141
+ stdin: {
142
+ contents: g,
143
+ sourcefile: s.base,
144
+ resolveDir: s.dir,
145
+ loader: "tsx"
146
+ },
147
+ minify: !1,
148
+ treeShaking: !0,
149
+ bundle: !0,
150
+ outfile: m,
151
+ format: n,
152
+ target: ["node20"],
153
+ keepNames: !0,
154
+ external: w,
155
+ packages: "external"
156
+ });
157
+ const p = Date.now();
158
+ return await import(`${m}?t=${p}`);
159
+ }, L = async (e) => {
160
+ const t = W(e), a = o(t, "salty.config.js"), { config: r } = await import(a);
161
+ return r;
162
+ }, se = () => {
163
+ try {
164
+ return process.env.NODE_ENV === "production";
165
+ } catch {
166
+ return !1;
167
+ }
168
+ }, ve = async (e, t = se()) => {
169
+ try {
170
+ const a = Date.now();
171
+ t ? z.info("Generating CSS in production mode! 🔥") : z.info("Generating CSS in development mode! 🚀");
172
+ const r = [], l = [], s = W(e), g = o(s, "index.css");
173
+ (() => {
174
+ Z(s) && ce("rm -rf " + s), O(s), O(o(s, "css")), O(o(s, "types"));
175
+ })(), await xe(e);
176
+ const w = await L(e);
177
+ async function n(c, $) {
178
+ const N = ["node_modules", "saltygen"], T = ie(c);
179
+ if (T.isDirectory()) {
180
+ const E = le(c);
181
+ if (N.some((i) => c.includes(i))) return;
182
+ await Promise.all(E.map((i) => n(o(c, i), o($, i))));
183
+ } else if (T.isFile() && G(c)) {
184
+ const M = await K(e, c, s), i = [];
185
+ Object.entries(M).forEach(([D, x]) => {
186
+ if (x.isKeyframes && x.css) {
187
+ const q = `a_${x.animationName}.css`, re = `css/${q}`, ae = o(s, re);
188
+ r.push(q), S(ae, x.css);
189
+ return;
190
+ }
191
+ if (!x.generator) return;
192
+ const C = x.generator._withBuildContext({
193
+ name: D,
194
+ config: w,
195
+ prod: t
196
+ });
197
+ l[C.priority] || (l[C.priority] = []), l[C.priority].push(C.cssFileName), i.push(C.cssFileName);
198
+ const ne = `css/${C.cssFileName}`, oe = o(s, ne);
199
+ S(oe, C.css);
200
+ });
201
+ const f = i.map((D) => `@import url('./${D}');`).join(`
202
+ `), y = H(c, 6), d = I(c), V = R(d.name), _ = o(s, `css/f_${V}-${y}.css`);
203
+ S(_, f);
204
+ }
205
+ }
206
+ await n(e, s);
207
+ const p = r.map((c) => `@import url('./css/${c}');`).join(`
208
+ `);
209
+ let b = `@layer reset, global, l0, l1, l2, l3, l4, l5, l6, l7, l8;
210
+
211
+ ${["_variables.css", "_reset.css", "_global.css", "_templates.css"].filter((c) => {
212
+ try {
213
+ return J(o(s, "css", c), "utf8").length > 0;
214
+ } catch {
215
+ return !1;
216
+ }
217
+ }).map((c) => `@import url('./css/${c}');`).join(`
218
+ `)}
219
+ ${p}`;
220
+ if (w.importStrategy !== "component") {
221
+ const c = l.flat().map(($) => `@import url('./css/${$}');`).join(`
222
+ `);
223
+ b += c;
224
+ }
225
+ S(g, b);
226
+ const u = Date.now() - a, k = u < 200 ? "🔥" : u < 500 ? "🚀" : u < 1e3 ? "🎉" : u < 2e3 ? "🚗" : u < 5e3 ? "🤔" : "🥴";
227
+ z.info(`Generated CSS in ${u}ms! ${k}`);
228
+ } catch (a) {
229
+ console.error(a);
230
+ }
231
+ }, Ee = async (e, t) => {
232
+ try {
233
+ const a = [], r = o(e, "./saltygen"), l = o(r, "index.css");
234
+ if (G(t)) {
235
+ const g = await L(e), m = await K(e, t, r);
236
+ Object.entries(m).forEach(([F, j]) => {
237
+ if (!j.generator) return;
238
+ const b = j.generator._withBuildContext({
239
+ name: F,
240
+ config: g
241
+ }), P = `css/${b.cssFileName}`, u = o(r, P);
242
+ a.push(b.cssFileName), S(u, b.css);
243
+ });
244
+ const w = J(l, "utf8").split(`
245
+ `), n = a.map((F) => `@import url('../saltygen/css/${F}');`), h = [.../* @__PURE__ */ new Set([...w, ...n])].join(`
246
+ `);
247
+ S(l, h);
248
+ }
249
+ } catch (a) {
250
+ console.error(a);
251
+ }
252
+ }, Ve = async (e, t, a = se()) => {
253
+ try {
254
+ const r = o(e, "./saltygen");
255
+ if (G(t)) {
256
+ const s = J(t, "utf8");
257
+ s.replace(/^(?!export\s)const\s.*/gm, (p) => `export ${p}`) !== s && await fe(t, s);
258
+ const m = await L(e), w = await K(e, t, r);
259
+ let n = s;
260
+ if (Object.entries(w).forEach(([p, h]) => {
261
+ var y;
262
+ if (h.isKeyframes || !h.generator) return;
263
+ const F = h.generator._withBuildContext({
264
+ name: p,
265
+ config: m,
266
+ prod: a
267
+ }), j = new RegExp(`\\s${p}[=\\s]+[^()]+styled\\(([^,]+),`, "g").exec(s);
268
+ if (!j) return console.error("Could not find the original declaration");
269
+ const b = (y = j.at(1)) == null ? void 0 : y.trim(), P = new RegExp(`\\s${p}[=\\s]+styled\\(`, "g").exec(n);
270
+ if (!P) return console.error("Could not find the original declaration");
271
+ const { index: u } = P;
272
+ let k = !1;
273
+ const c = setTimeout(() => k = !0, 5e3);
274
+ let $ = 0, N = !1, T = 0;
275
+ for (; !N && !k; ) {
276
+ const d = n[u + $];
277
+ d === "(" && T++, d === ")" && T--, T === 0 && d === ")" && (N = !0), $ > n.length && (k = !0), $++;
278
+ }
279
+ if (!k) clearTimeout(c);
280
+ else throw new Error("Failed to find the end of the styled call and timed out");
281
+ const E = u + $, M = n.slice(u, E), i = n, f = ` ${p} = styled(${b}, "${F.classNames}", ${JSON.stringify(F.props)});`;
282
+ n = n.replace(M, f), i === n && console.error("Minimize file failed to change content", { name: p, tagName: b });
283
+ }), m.importStrategy === "component") {
284
+ const p = H(t, 6), h = I(t);
285
+ n = `import '../../saltygen/css/${`f_${R(h.name)}-${p}.css`}';
286
+ ${n}`;
287
+ }
288
+ return n = n.replace("{ styled }", "{ styledClient as styled }"), n = n.replace("@salty-css/react/styled", "@salty-css/react/styled-client"), n;
289
+ }
290
+ } catch (r) {
291
+ console.error("Error in minimizeFile:", r);
292
+ }
293
+ };
294
+ export {
295
+ Me as a,
296
+ we as b,
297
+ xe as c,
298
+ K as d,
299
+ Ee as e,
300
+ ve as g,
301
+ G as i,
302
+ z as l,
303
+ Ve as m,
304
+ Se as s
305
+ };
@@ -0,0 +1,21 @@
1
+ "use strict";const ae=require("esbuild"),ce=require("child_process"),D=require("./dash-case-BJEkFEGQ.cjs"),s=require("path"),a=require("fs"),G=require("fs/promises"),R=require("./parse-templates-DdYSw-iq.cjs"),z=require("winston");var I=typeof document<"u"?document.currentScript:null;function le(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,o.get?o:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const K=le(ae),L=e=>{if(!e||e==="/")throw new Error("Could not find package.json file");const t=s.join(e,"package.json");return a.existsSync(t)?t:L(s.join(e,".."))},pe=async e=>{const t=L(e);return await G.readFile(t,"utf-8").then(JSON.parse).catch(()=>{})},ue=async e=>{const t=await pe(e);if(t)return t.type};let E;const U=async e=>{if(E)return E;const t=await ue(e);return t==="module"?E="esm":(t==="commonjs"||(typeof document>"u"?require("url").pathToFileURL(__filename).href:I&&I.tagName.toUpperCase()==="SCRIPT"&&I.src||new URL("index-D2QOtfTb.cjs",document.baseURI).href).endsWith(".cjs"))&&(E="cjs"),E||"esm"},J=z.createLogger({level:"debug",format:z.format.combine(z.format.colorize(),z.format.cli()),transports:[new z.transports.Console({})]}),de=e=>{J.error(e)};function X(e){return e?typeof e!="string"?X(String(e)):e.replace(/[\s-]/g,".").replace(/[A-Z](?:(?=[^A-Z])|[A-Z]*(?=[A-Z][^A-Z]|$))/g,(t,n)=>(n>0?".":"")+t.toLowerCase()):""}const fe={"*, *::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"}},A={externalModules:[]},Y=e=>{if(A.externalModules.length>0)return A.externalModules;const t=s.join(e,"salty.config.ts"),o=a.readFileSync(t,"utf8").match(/externalModules:\s?\[(.*)\]/);if(!o)return[];const p=o[1].split(",").map(r=>r.replace(/['"`]/g,"").trim());return A.externalModules=p,p},q=e=>s.join(e,"./saltygen"),Q=["salty","css","styles","styled"],ee=(e=[])=>new RegExp(`\\.(${[...Q,...e].join("|")})\\.`),W=(e,t=[])=>ee(t).test(e),ge=async e=>{const t=q(e),n=s.join(e,"salty.config.ts"),o=s.join(t,"salty.config.js"),p=await U(e),r=Y(e);await K.build({entryPoints:[n],minify:!0,treeShaking:!0,bundle:!0,outfile:o,format:p,external:r});const y=Date.now(),{config:m}=await import(`${o}?t=${y}`);return m},te=async e=>{const t=await ge(e),n=new Set,o=(l,d=[])=>l?Object.entries(l).flatMap(([h,f])=>{if(!f)return;if(typeof f=="object")return o(f,[...d,h]);const O=X(h),V=D.dashCase(h),P=[...d,O].join(".");n.add(`"${P}"`);const $=[...d.map(D.dashCase),V].join("-"),{result:x}=R.parseValueTokens(f);return`--${$}: ${x};`}):[],p=l=>l?Object.entries(l).flatMap(([d,h])=>{const f=o(h);return d==="base"?f.join(""):`${d} { ${f.join("")} }`}):[],r=l=>l?Object.entries(l).flatMap(([d,h])=>Object.entries(h).flatMap(([f,O])=>{const V=o(O,[d]),P=`.${d}-${f}, [data-${d}="${f}"]`,$=V.join("");return`${P} { ${$} }`})):[],y=o(t.variables),m=p(t.responsiveVariables),F=r(t.conditionalVariables),i=q(e),u=s.join(i,"css/_variables.css"),S=`:root { ${y.join("")} ${m.join("")} } ${F.join("")}`;a.writeFileSync(u,S);const w=s.join(i,"css/_global.css"),C=R.parseStyles(t.global,"");a.writeFileSync(w,`@layer global { ${C} }`);const b=s.join(i,"css/_reset.css"),g=t.reset==="none"?{}:typeof t.reset=="object"?t.reset:fe,k=R.parseStyles(g,"");a.writeFileSync(b,`@layer reset { ${k} }`);const c=s.join(i,"css/_templates.css"),j=R.parseTemplates(t.templates),N=R.getTemplateTypes(t.templates);a.writeFileSync(c,j);const T=s.join(i,"types/css-tokens.d.ts"),v=`
2
+ // Variable types
3
+ type VariableTokens = ${[...n].join("|")};
4
+ type PropertyValueToken = \`{\${VariableTokens}}\`;
5
+
6
+ // Template types
7
+ type TemplateTokens = {
8
+ ${Object.entries(N).map(([l,d])=>`${l}?: ${d}`).join(`
9
+ `)}
10
+ }
11
+ `;a.writeFileSync(T,v)},H=async(e,t,n)=>{const o=D.toHash(t),p=s.join(n,"./temp");a.existsSync(p)||a.mkdirSync(p);const r=s.parse(t);let y=a.readFileSync(t,"utf8");y=y.replace(/styled\([^"'`{,]+,/g,"styled('div',");const m=s.join(n,"js",o+".js"),F=Y(e),i=await U(e);await K.build({stdin:{contents:y,sourcefile:r.base,resolveDir:r.dir,loader:"tsx"},minify:!1,treeShaking:!0,bundle:!0,outfile:m,format:i,target:["node20"],keepNames:!0,external:F,packages:"external"});const u=Date.now();return await import(`${m}?t=${u}`)},B=async e=>{const t=q(e),n=s.join(t,"salty.config.js"),{config:o}=await import(n);return o},se=()=>{try{return process.env.NODE_ENV==="production"}catch{return!1}},ye=async(e,t=se())=>{try{const n=Date.now();t?J.info("Generating CSS in production mode! 🔥"):J.info("Generating CSS in development mode! 🚀");const o=[],p=[],r=q(e),y=s.join(r,"index.css");(()=>{a.existsSync(r)&&ce.execSync("rm -rf "+r),a.mkdirSync(r),a.mkdirSync(s.join(r,"css")),a.mkdirSync(s.join(r,"types"))})(),await te(e);const F=await B(e);async function i(c,j){const N=["node_modules","saltygen"],T=a.statSync(c);if(T.isDirectory()){const M=a.readdirSync(c);if(N.some(l=>c.includes(l)))return;await Promise.all(M.map(l=>i(s.join(c,l),s.join(j,l))))}else if(T.isFile()&&W(c)){const v=await H(e,c,r),l=[];Object.entries(v).forEach(([P,$])=>{if($.isKeyframes&&$.css){const Z=`a_${$.animationName}.css`,re=`css/${Z}`,ie=s.join(r,re);o.push(Z),a.writeFileSync(ie,$.css);return}if(!$.generator)return;const x=$.generator._withBuildContext({name:P,config:F,prod:t});p[x.priority]||(p[x.priority]=[]),p[x.priority].push(x.cssFileName),l.push(x.cssFileName);const ne=`css/${x.cssFileName}`,oe=s.join(r,ne);a.writeFileSync(oe,x.css)});const d=l.map(P=>`@import url('./${P}');`).join(`
12
+ `),h=D.toHash(c,6),f=s.parse(c),O=D.dashCase(f.name),V=s.join(r,`css/f_${O}-${h}.css`);a.writeFileSync(V,d)}}await i(e,r);const u=o.map(c=>`@import url('./css/${c}');`).join(`
13
+ `);let b=`@layer reset, global, l0, l1, l2, l3, l4, l5, l6, l7, l8;
14
+
15
+ ${["_variables.css","_reset.css","_global.css","_templates.css"].filter(c=>{try{return a.readFileSync(s.join(r,"css",c),"utf8").length>0}catch{return!1}}).map(c=>`@import url('./css/${c}');`).join(`
16
+ `)}
17
+ ${u}`;if(F.importStrategy!=="component"){const c=p.flat().map(j=>`@import url('./css/${j}');`).join(`
18
+ `);b+=c}a.writeFileSync(y,b);const g=Date.now()-n,k=g<200?"🔥":g<500?"🚀":g<1e3?"🎉":g<2e3?"🚗":g<5e3?"🤔":"🥴";J.info(`Generated CSS in ${g}ms! ${k}`)}catch(n){console.error(n)}},me=async(e,t)=>{try{const n=[],o=s.join(e,"./saltygen"),p=s.join(o,"index.css");if(W(t)){const y=await B(e),m=await H(e,t,o);Object.entries(m).forEach(([w,C])=>{if(!C.generator)return;const b=C.generator._withBuildContext({name:w,config:y}),_=`css/${b.cssFileName}`,g=s.join(o,_);n.push(b.cssFileName),a.writeFileSync(g,b.css)});const F=a.readFileSync(p,"utf8").split(`
19
+ `),i=n.map(w=>`@import url('../saltygen/css/${w}');`),S=[...new Set([...F,...i])].join(`
20
+ `);a.writeFileSync(p,S)}}catch(n){console.error(n)}},he=async(e,t,n=se())=>{try{const o=s.join(e,"./saltygen");if(W(t)){const r=a.readFileSync(t,"utf8");r.replace(/^(?!export\s)const\s.*/gm,u=>`export ${u}`)!==r&&await G.writeFile(t,r);const m=await B(e),F=await H(e,t,o);let i=r;if(Object.entries(F).forEach(([u,S])=>{var h;if(S.isKeyframes||!S.generator)return;const w=S.generator._withBuildContext({name:u,config:m,prod:n}),C=new RegExp(`\\s${u}[=\\s]+[^()]+styled\\(([^,]+),`,"g").exec(r);if(!C)return console.error("Could not find the original declaration");const b=(h=C.at(1))==null?void 0:h.trim(),_=new RegExp(`\\s${u}[=\\s]+styled\\(`,"g").exec(i);if(!_)return console.error("Could not find the original declaration");const{index:g}=_;let k=!1;const c=setTimeout(()=>k=!0,5e3);let j=0,N=!1,T=0;for(;!N&&!k;){const f=i[g+j];f==="("&&T++,f===")"&&T--,T===0&&f===")"&&(N=!0),j>i.length&&(k=!0),j++}if(!k)clearTimeout(c);else throw new Error("Failed to find the end of the styled call and timed out");const M=g+j,v=i.slice(g,M),l=i,d=` ${u} = styled(${b}, "${w.classNames}", ${JSON.stringify(w.props)});`;i=i.replace(v,d),l===i&&console.error("Minimize file failed to change content",{name:u,tagName:b})}),m.importStrategy==="component"){const u=D.toHash(t,6),S=s.parse(t);i=`import '../../saltygen/css/${`f_${D.dashCase(S.name)}-${u}.css`}';
21
+ ${i}`}return i=i.replace("{ styled }","{ styledClient as styled }"),i=i.replace("@salty-css/react/styled","@salty-css/react/styled-client"),i}}catch(o){console.error("Error in minimizeFile:",o)}};exports.compileSaltyFile=H;exports.generateConfigStyles=te;exports.generateCss=ye;exports.generateFile=me;exports.isSaltyFile=W;exports.logError=de;exports.logger=J;exports.minimizeFile=he;exports.saltyFileExtensions=Q;exports.saltyFileRegExp=ee;
@@ -0,0 +1,4 @@
1
+ const t = "/* Empty */";
2
+ export {
3
+ t as default
4
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salty-css/core",
3
- "version": "0.0.1-alpha.13",
3
+ "version": "0.0.1-alpha.131",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "typings": "./dist/index.d.ts",
@@ -10,7 +10,12 @@
10
10
  "publishConfig": {
11
11
  "access": "public"
12
12
  },
13
- "homepage": "https://github.com/margarita-form/salty-css",
13
+ "description": "Core library for Salty CSS. Will be used by other Salty CSS libraries and plugins.",
14
+ "homepage": "https://salty-css.dev/",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/margarita-form/salty-css.git"
18
+ },
14
19
  "bugs": {
15
20
  "url": "https://github.com/margarita-form/salty-css/issues"
16
21
  },
@@ -23,11 +28,18 @@
23
28
  "name": "core"
24
29
  },
25
30
  "peerDependencies": {
31
+ "commander": ">=12.x",
32
+ "ejs": ">=3.x",
26
33
  "esbuild": ">=0.21.x",
34
+ "ora": ">=8.x",
27
35
  "react": ">=18.x || >=19.x",
28
36
  "winston": ">=3.x"
29
37
  },
30
38
  "exports": {
39
+ "./bin/main": {
40
+ "import": "./bin/main.js",
41
+ "require": "./bin/main.cjs"
42
+ },
31
43
  "./compiler": {
32
44
  "import": "./compiler/index.js",
33
45
  "require": "./compiler/index.cjs"
@@ -52,5 +64,11 @@
52
64
  "import": "./util/index.js",
53
65
  "require": "./util/index.cjs"
54
66
  }
67
+ },
68
+ "bin": {
69
+ "salty": "./bin/index.js",
70
+ "salty-css": "./bin/index.js",
71
+ "salty-css-cjs": "./bin/index.cjs",
72
+ "@salty-css/core": "./bin/index.js"
55
73
  }
56
74
  }
@@ -0,0 +1,8 @@
1
+ "use strict";const T=require("./dash-case-BJEkFEGQ.cjs"),N=(t,s)=>{if(typeof t!="string")return{result:t};if(!s)return{result:t};const n=[];return Object.values(s).forEach(e=>{const{pattern:o,transform:i}=e;t=t.replace(o,d=>{const{value:p,css:j}=i(d);return j&&n.push(j),p})}),{result:t,additionalCss:n}},E=t=>typeof t!="string"?{result:t}:/\{[^{}]+\}/g.test(t)?{result:t.replace(/\{([^{}]+)\}/g,(...e)=>`var(--${T.dashCase(e[1].replaceAll(".","-"))})`)}:{result:t},a=(t,s,n,e)=>{if(!t)return"";const o=[],i=Object.entries(t).reduce((p,[j,r])=>{const c=j.trim();if(typeof r=="function"&&(r=r()),typeof r=="object"){if(!r)return p;if(c==="variants")return Object.entries(r).forEach(([f,u])=>{u&&Object.entries(u).forEach(([l,m])=>{if(!m)return;const y=`${s}.${f}-${l}`,b=a(m,y,n,e);o.push(b)})}),p;if(c==="defaultVariants")return p;if(c==="compoundVariants")return r.forEach(f=>{const{css:u,...l}=f,m=Object.entries(l).reduce((b,[q,K])=>`${b}.${q}-${K}`,s),y=a(u,m,n,e);o.push(y)}),p;if(c.startsWith("@")){const f=a(r,s,n,e),u=`${c} {
2
+ ${f.replace(`
3
+ `,`
4
+ `)}
5
+ }`;return o.push(u),p}const $=j.includes("&")?c.replace("&",s):c.startsWith(":")?`${s}${c}`:`${s} ${c}`,h=a(r,$,n,e);return o.push(h),p}if(e!=null&&e.templates&&e.templates[c]){const h=r.split(".").reduce((f,u)=>f[u],e.templates[c]);if(h){const f=a(h,"");return`${p}${f}`}return console.warn(`Template "${c}" with path of "${r}" was not found in config!`),p}const k=c.startsWith("-")?c:T.dashCase(c),O=($,h=";")=>p=`${p}${$}${h}`,S=$=>O(`${k}:${$}`);if(typeof r=="number")return S(r);if(typeof r!="string")if("toString"in r)r=r.toString();else return p;const{modifiers:w}=e||{},W=function*(){yield E(r),yield N(r,w)}();for(const{result:$,additionalCss:h=[]}of W)r=$,h.forEach(f=>{const u=a(f,"");O(u,"")});return S(r)},"");if(!i)return o.join(`
6
+ `);if(!s)return i;let d="";return n!==void 0?d=`@layer l${n} { ${s} { ${i} } }`:d=`${s} { ${i} }`,[d,...o].join(`
7
+ `)},V=(t,s=[])=>{if(!t)return"";const n=[],e={};if(Object.entries(t).forEach(([o,i])=>{if(typeof i=="object"){if(!i)return;const d=o.trim(),p=V(i,[...s,d]);n.push(p)}else e[o]=i}),Object.keys(e).length){const o=s.map(T.dashCase).join("-"),i=a(e,`.${o}`);n.push(i)}return n.join(`
8
+ `)},P=t=>Object.keys(t),_=t=>Object.entries(t).reduce((s,[n,e])=>(typeof e=="object"&&(s[n]=g(e).map(o=>`"${o}"`).join(" | ")),s),{}),g=(t,s="",n=new Set)=>t?(Object.entries(t).forEach(([e,o])=>{const i=s?`${s}.${e}`:e;return typeof o=="object"?g(o,i,n):n.add(s)}),[...n]):[];exports.getTemplateKeys=P;exports.getTemplateTypes=_;exports.parseStyles=a;exports.parseTemplates=V;exports.parseValueTokens=E;
@@ -0,0 +1,100 @@
1
+ import { d as O } from "./dash-case-DBThphLm.js";
2
+ const N = (t, r) => {
3
+ if (typeof t != "string") return { result: t };
4
+ if (!r) return { result: t };
5
+ const n = [];
6
+ return Object.values(r).forEach((e) => {
7
+ const { pattern: o, transform: i } = e;
8
+ t = t.replace(o, (d) => {
9
+ const { value: c, css: j } = i(d);
10
+ return j && n.push(j), c;
11
+ });
12
+ }), { result: t, additionalCss: n };
13
+ }, P = (t) => typeof t != "string" ? { result: t } : /\{[^{}]+\}/g.test(t) ? { result: t.replace(/\{([^{}]+)\}/g, (...e) => `var(--${O(e[1].replaceAll(".", "-"))})`) } : { result: t }, a = (t, r, n, e) => {
14
+ if (!t) return "";
15
+ const o = [], i = Object.entries(t).reduce((c, [j, s]) => {
16
+ const p = j.trim();
17
+ if (typeof s == "function" && (s = s()), typeof s == "object") {
18
+ if (!s) return c;
19
+ if (p === "variants")
20
+ return Object.entries(s).forEach(([f, u]) => {
21
+ u && Object.entries(u).forEach(([m, b]) => {
22
+ if (!b) return;
23
+ const y = `${r}.${f}-${m}`, l = a(b, y, n, e);
24
+ o.push(l);
25
+ });
26
+ }), c;
27
+ if (p === "defaultVariants")
28
+ return c;
29
+ if (p === "compoundVariants")
30
+ return s.forEach((f) => {
31
+ const { css: u, ...m } = f, b = Object.entries(m).reduce((l, [w, W]) => `${l}.${w}-${W}`, r), y = a(u, b, n, e);
32
+ o.push(y);
33
+ }), c;
34
+ if (p.startsWith("@")) {
35
+ const f = a(s, r, n, e), u = `${p} {
36
+ ${f.replace(`
37
+ `, `
38
+ `)}
39
+ }`;
40
+ return o.push(u), c;
41
+ }
42
+ const $ = j.includes("&") ? p.replace("&", r) : p.startsWith(":") ? `${r}${p}` : `${r} ${p}`, h = a(s, $, n, e);
43
+ return o.push(h), c;
44
+ }
45
+ if (e != null && e.templates && e.templates[p]) {
46
+ const h = s.split(".").reduce((f, u) => f[u], e.templates[p]);
47
+ if (h) {
48
+ const f = a(h, "");
49
+ return `${c}${f}`;
50
+ }
51
+ return console.warn(`Template "${p}" with path of "${s}" was not found in config!`), c;
52
+ }
53
+ const V = p.startsWith("-") ? p : O(p), T = ($, h = ";") => c = `${c}${$}${h}`, E = ($) => T(`${V}:${$}`);
54
+ if (typeof s == "number") return E(s);
55
+ if (typeof s != "string")
56
+ if ("toString" in s) s = s.toString();
57
+ else return c;
58
+ const { modifiers: g } = e || {}, k = function* () {
59
+ yield P(s), yield N(s, g);
60
+ }();
61
+ for (const { result: $, additionalCss: h = [] } of k)
62
+ s = $, h.forEach((f) => {
63
+ const u = a(f, "");
64
+ T(u, "");
65
+ });
66
+ return E(s);
67
+ }, "");
68
+ if (!i) return o.join(`
69
+ `);
70
+ if (!r) return i;
71
+ let d = "";
72
+ return n !== void 0 ? d = `@layer l${n} { ${r} { ${i} } }` : d = `${r} { ${i} }`, [d, ...o].join(`
73
+ `);
74
+ }, _ = (t, r = []) => {
75
+ if (!t) return "";
76
+ const n = [], e = {};
77
+ if (Object.entries(t).forEach(([o, i]) => {
78
+ if (typeof i == "object") {
79
+ if (!i) return;
80
+ const d = o.trim(), c = _(i, [...r, d]);
81
+ n.push(c);
82
+ } else
83
+ e[o] = i;
84
+ }), Object.keys(e).length) {
85
+ const o = r.map(O).join("-"), i = a(e, `.${o}`);
86
+ n.push(i);
87
+ }
88
+ return n.join(`
89
+ `);
90
+ }, A = (t) => Object.keys(t), K = (t) => Object.entries(t).reduce((r, [n, e]) => (typeof e == "object" && (r[n] = S(e).map((o) => `"${o}"`).join(" | ")), r), {}), S = (t, r = "", n = /* @__PURE__ */ new Set()) => t ? (Object.entries(t).forEach(([e, o]) => {
91
+ const i = r ? `${r}.${e}` : e;
92
+ return typeof o == "object" ? S(o, i, n) : n.add(r);
93
+ }), [...n]) : [];
94
+ export {
95
+ _ as a,
96
+ K as b,
97
+ P as c,
98
+ A as g,
99
+ a as p
100
+ };
@@ -0,0 +1,6 @@
1
+ function p(e) {
2
+ return e ? typeof e != "string" ? p(String(e)) : e.replace(/\s/g, "-").replace(/[-_]([a-z0-9])/g, (a) => a[1].toUpperCase()).replace(/^[a-z]/, (a) => a.toUpperCase()) : "";
3
+ }
4
+ export {
5
+ p
6
+ };
@@ -0,0 +1 @@
1
+ "use strict";function r(e){return e?typeof e!="string"?r(String(e)):e.replace(/\s/g,"-").replace(/[-_]([a-z0-9])/g,a=>a[1].toUpperCase()).replace(/^[a-z]/,a=>a.toUpperCase()):""}exports.pascalCase=r;
@@ -0,0 +1,11 @@
1
+ const e = `import { styled } from "@salty-css/react/styled";
2
+
3
+ export const <%- name %> = styled('<%- tag %>', {
4
+ <% if(className) { %>className: '<%- className %>',<% } %>
5
+ base: {
6
+ // Add your styles here
7
+ }
8
+ })`;
9
+ export {
10
+ e as default
11
+ };
@@ -0,0 +1,8 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=`import { styled } from "@salty-css/react/styled";
2
+
3
+ export const <%- name %> = styled('<%- tag %>', {
4
+ <% if(className) { %>className: '<%- className %>',<% } %>
5
+ base: {
6
+ // Add your styles here
7
+ }
8
+ })`;exports.default=e;
@@ -0,0 +1,18 @@
1
+ const n = `import { <%- styledComponentName %> } from "./<%- fileName %>.css";
2
+
3
+ interface <%- componentName %>Props {
4
+ text?: string;
5
+ }
6
+
7
+ export const <%- componentName %> = ({ text = 'Lorem ipsum' }: <%- componentName %>Props) => {
8
+ return (
9
+ <<%- styledComponentName %>>
10
+ {text}
11
+ </<%- styledComponentName %>>
12
+ );
13
+ };
14
+
15
+ export default <%- componentName %>;`;
16
+ export {
17
+ n as default
18
+ };
@@ -0,0 +1,15 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=`import { <%- styledComponentName %> } from "./<%- fileName %>.css";
2
+
3
+ interface <%- componentName %>Props {
4
+ text?: string;
5
+ }
6
+
7
+ export const <%- componentName %> = ({ text = 'Lorem ipsum' }: <%- componentName %>Props) => {
8
+ return (
9
+ <<%- styledComponentName %>>
10
+ {text}
11
+ </<%- styledComponentName %>>
12
+ );
13
+ };
14
+
15
+ export default <%- componentName %>;`;exports.default=e;
@@ -0,0 +1,10 @@
1
+ const n = `import { defineConfig } from '@salty-css/core/config';
2
+
3
+ export const config = defineConfig({
4
+ // Add your custom config here
5
+ externalModules: ['react', 'react-dom']
6
+ });
7
+ `;
8
+ export {
9
+ n as default
10
+ };
@@ -0,0 +1,7 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=`import { defineConfig } from '@salty-css/core/config';
2
+
3
+ export const config = defineConfig({
4
+ // Add your custom config here
5
+ externalModules: ['react', 'react-dom']
6
+ });
7
+ `;exports.default=e;
@@ -0,0 +1,2 @@
1
+ import { GlobalStyles } from '../config/config-types';
2
+ export declare const saltyReset: GlobalStyles;