@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.
- package/.saltyrc.schema.json +40 -0
- package/README.md +143 -26
- package/bin/bin-util.d.ts +2 -0
- package/bin/index.cjs +2 -0
- package/bin/index.d.ts +2 -0
- package/bin/index.js +3 -0
- package/bin/logger.d.ts +2 -0
- package/bin/main.cjs +11 -0
- package/bin/main.d.ts +1 -0
- package/bin/main.js +260 -0
- package/bin/prettier.d.ts +1 -0
- package/compiler/get-files.d.ts +3 -0
- package/compiler/index.cjs +1 -11
- package/compiler/index.d.ts +4 -6
- package/compiler/index.js +16 -180
- package/config/config-types.d.ts +15 -5
- package/dash-case-BJEkFEGQ.cjs +1 -0
- package/dash-case-DBThphLm.js +19 -0
- package/generator/index.cjs +1 -1
- package/generator/index.js +40 -17
- package/generator/parse-templates.d.ts +2 -0
- package/generator/style-generator.d.ts +14 -4
- package/index-84Wroia-.cjs +1 -0
- package/index-AXVHdDqw.js +305 -0
- package/index-D2QOtfTb.cjs +21 -0
- package/index-D_732b92.js +4 -0
- package/package.json +20 -2
- package/parse-templates-DdYSw-iq.cjs +8 -0
- package/parse-templates-DnLWJ7Hc.js +100 -0
- package/pascal-case-BQpR5PdN.js +6 -0
- package/pascal-case-iWoaJWwT.cjs +1 -0
- package/react-styled-file-CGVf5n1B.js +11 -0
- package/react-styled-file-Dkubsz-U.cjs +8 -0
- package/react-vanilla-file-CCXbsjIb.js +18 -0
- package/react-vanilla-file-CG_WJLam.cjs +15 -0
- package/salty.config-BhBY_oOk.js +10 -0
- package/salty.config-Dk6ZcCxI.cjs +7 -0
- package/templates/salty-reset.d.ts +2 -0
- package/types/index.d.ts +48 -21
- package/util/camel-case.d.ts +1 -0
- package/util/dot-case.d.ts +1 -0
- package/util/index.cjs +1 -1
- package/util/index.d.ts +2 -0
- package/util/index.js +7 -15
- package/util/module-type.d.ts +1 -0
- package/util/pascal-case.d.ts +1 -0
- package/parse-templates-BOSK0Tb6.js +0 -90
- 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;
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@salty-css/core",
|
3
|
-
"version": "0.0.1-alpha.
|
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
|
-
"
|
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 @@
|
|
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,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,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;
|