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

Sign up to get free protection for your applications and to get access to all the features.
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  ### Initial requirements
6
6
 
7
7
  1. Add `saltyPlugin` to vite or webpack config from `@salty-css/vite` or `@salty-css/webpack`
8
- 2. Create `salty-config.ts` to the root of your project
8
+ 2. Create `salty.config.ts` to the root of your project
9
9
  3. Import global styles to any regular .css file from `saltygen/index.css` (does not exist during first run, cli command coming later)
10
10
  4. Create salty components with styled only inside files that end with `.css.ts`, `.salty.ts` `.styled.ts` or `.styles.ts`
11
11
 
@@ -0,0 +1 @@
1
+ export declare const execAsync: (command: string) => Promise<void>;
package/bin/index.cjs ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ "use strict";const _=require("commander"),n=require("fs/promises"),t=require("path"),$=require("ejs"),D=require("../compiler/index.cjs"),N=require("../pascal-case-iWoaJWwT.cjs"),h=require("winston"),O=require("fs"),z=require("child_process"),o=h.createLogger({level:"debug",format:h.format.combine(h.format.colorize(),h.format.cli()),transports:[new h.transports.Console({})]}),I=a=>new Promise((g,m)=>{z.exec(a,j=>{if(j)return m(j);g()})}),J=()=>O.existsSync(t.join(process.cwd(),"node_modules",".bin","prettier"));async function v(a){try{if(!J())return;await I(`./node_modules/.bin/prettier --write "${a}"`),o.info(`Formatted ${a} with Prettier`)}catch(g){o.error(`Error formatting ${a} with Prettier:`,g)}}async function k(){const a=new _.Command;a.name("salty-css").description("Salty-CSS CLI tool to help with annoying configuration tasks.");const g={"salty.config.ts":Promise.resolve().then(()=>require("../salty.config-BupieCfE.cjs")),"saltygen/index.css":Promise.resolve().then(()=>require("../index-84Wroia-.cjs")),"react/react-styled-file.ts":Promise.resolve().then(()=>require("../react-styled-file-Dkubsz-U.cjs"))},m=async(s,l)=>{const{default:f}=await g[s],c=$.render(f,l);return{fileName:s,content:c}},j=async()=>{const s=t.join(process.cwd(),".saltyrc");return await n.readFile(s,"utf-8").then(JSON.parse).catch(()=>({}))},b=await(async()=>(await j()).defaultProject)();a.command("init").description("Initialize a new Salty-CSS project.").requiredOption("-d, --dir <dir>","Project directory to initialize the project in.").option("--css-file <css-file>","Existing CSS file where to import the generated CSS. Path must be relative to the given project directory.").action(async function(){o.info("Initializing a new Salty-CSS project...");const{dir:s,cssFile:l}=this.opts(),f=process.cwd(),c=t.join(f,s),C=await Promise.all([m("salty.config.ts"),m("saltygen/index.css")]);await n.mkdir(c,{recursive:!0});const F=C.map(async({fileName:e,content:r})=>{const d=t.join(c,e);if(await n.readFile(d,"utf-8").catch(()=>{})!==void 0){o.debug("File already exists: "+d);return}const q=e.split("/").slice(0,-1).join("/");q&&await n.mkdir(t.join(c,q),{recursive:!0}),o.info("Writing file: "+d),await n.writeFile(d,r),await v(d)});await Promise.all(F);const y=t.relative(f,c),i=t.join(f,".saltyrc"),p=await n.readFile(i,"utf-8").catch(()=>{});if(p===void 0){o.info("Creating file: "+i);const r=JSON.stringify({defaultProject:y,projects:[y]},null,2);await n.writeFile(i,r)}else{o.info("Edit file: "+i);const e=JSON.parse(p),r=new Set((e==null?void 0:e.projects)||[]);r.add(y),e.projects=[...r];const d=JSON.stringify(e,null,2);await n.writeFile(i,d)}const S=t.join(f,".gitignore"),w=await n.readFile(S,"utf-8").catch(()=>{});if(w!==void 0&&(w.includes("saltygen")||(o.info("Edit file: "+S),await n.writeFile(S,w+`
3
+
4
+ # Salty-CSS
5
+ saltygen
6
+ `))),l){const e=t.join(c,l),r=await n.readFile(e,"utf-8").catch(()=>{});if(r!==void 0&&!r.includes("saltygen")){const P=t.join(e,".."),E=`@import '${t.relative(P,t.join(c,"saltygen/index.css"))}';`;o.info("Edit file: "+e),await n.writeFile(e,E+`
7
+ `+r),await v(e)}}const u=t.join(c,"vite.config.ts"),x=await n.readFile(u,"utf-8").catch(()=>{});if(x!==void 0&&!x.includes("saltyPlugin")){o.info("Edit file: "+u);const r=`import { saltyPlugin } from '@salty-css/vite';
8
+ `,P=x.replace(/(plugins: \[)/,`$1
9
+ saltyPlugin(__dirname),`);o.info("Installing @salty-css/vite..."),await I("npm install @salty-css/vite"),o.info("Adding Salty-CSS plugin to Vite config..."),await n.writeFile(u,r+P),await v(u)}}),a.command("build").alias("b").description("Build the Salty-CSS project.").option("-d, --dir <dir>","Project directory to build the project in.",b).action(async function(){o.info("Building the Salty-CSS project...");const{dir:s}=this.opts(),l=t.join(process.cwd(),s);await D.generateCss(l)}),a.command("generate <file>").alias("g").description("Generate a new component file.").option("-d, --dir <dir>","Project directory to generate the file in.",b).option("-t, --tag <tag>","HTML tag of the component.","div").option("-n, --name <name>","Name of the component.").option("-c, --className <className>","CSS class of the component.").action(async function(s){const{dir:l,tag:f,name:c,className:C}=this.opts(),F=t.join(process.cwd(),l),y=t.join(F,s),i=t.parse(y);i.ext||(i.ext=".ts"),i.name.endsWith(".css")||(i.name=i.name+".css"),i.base=i.name+i.ext;const p=t.format(i);if(await n.readFile(p,"utf-8").catch(()=>{})!==void 0){o.error("File already exists:",p);return}o.info("Generating a new file: "+p);const w=N.pascalCase(c||i.base.replace(/\.css\.\w+$/,"")),{content:u}=await m("react/react-styled-file.ts",{tag:f,name:w,className:C});await n.writeFile(p,u),await v(p)}),a.parseAsync(process.argv)}k().catch(a=>console.error(a));
package/bin/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/bin/index.js ADDED
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/env node
2
+ import { Command as _ } from "commander";
3
+ import { mkdir as $, readFile as p, writeFile as m } from "fs/promises";
4
+ import { join as n, relative as D, parse as z, format as J } from "path";
5
+ import { render as A } from "ejs";
6
+ import { generateCss as H } from "../compiler/index.js";
7
+ import { p as L } from "../pascal-case-BQpR5PdN.js";
8
+ import { createLogger as W, format as I, transports as k } from "winston";
9
+ import { existsSync as B } from "fs";
10
+ import { exec as G } from "child_process";
11
+ const i = W({
12
+ level: "debug",
13
+ format: I.combine(I.colorize(), I.cli()),
14
+ transports: [new k.Console({})]
15
+ }), N = (o) => new Promise((g, u) => {
16
+ G(o, (S) => {
17
+ if (S) return u(S);
18
+ g();
19
+ });
20
+ }), T = () => B(n(process.cwd(), "node_modules", ".bin", "prettier"));
21
+ async function v(o) {
22
+ try {
23
+ if (!T()) return;
24
+ await N(`./node_modules/.bin/prettier --write "${o}"`), i.info(`Formatted ${o} with Prettier`);
25
+ } catch (g) {
26
+ i.error(`Error formatting ${o} with Prettier:`, g);
27
+ }
28
+ }
29
+ async function q() {
30
+ const o = new _();
31
+ o.name("salty-css").description("Salty-CSS CLI tool to help with annoying configuration tasks.");
32
+ const g = {
33
+ // Core files
34
+ "salty.config.ts": import("../salty.config-D9ANEDiH.js"),
35
+ "saltygen/index.css": import("../index-D_732b92.js"),
36
+ // React
37
+ "react/react-styled-file.ts": import("../react-styled-file-CGVf5n1B.js")
38
+ }, u = async (s, c) => {
39
+ const { default: d } = await g[s], r = A(d, c);
40
+ return { fileName: s, content: r };
41
+ }, S = async () => {
42
+ const s = n(process.cwd(), ".saltyrc");
43
+ return await p(s, "utf-8").then(JSON.parse).catch(() => ({}));
44
+ }, E = await (async () => (await S()).defaultProject)();
45
+ o.command("init").description("Initialize a new Salty-CSS project.").requiredOption("-d, --dir <dir>", "Project directory to initialize the project in.").option("--css-file <css-file>", "Existing CSS file where to import the generated CSS. Path must be relative to the given project directory.").action(async function() {
46
+ i.info("Initializing a new Salty-CSS project...");
47
+ const { dir: s, cssFile: c } = this.opts(), d = process.cwd(), r = n(d, s), j = await Promise.all([u("salty.config.ts"), u("saltygen/index.css")]);
48
+ await $(r, { recursive: !0 });
49
+ const x = j.map(async ({ fileName: t, content: a }) => {
50
+ const l = n(r, t);
51
+ if (await p(l, "utf-8").catch(() => {
52
+ }) !== void 0) {
53
+ i.debug("File already exists: " + l);
54
+ return;
55
+ }
56
+ const b = t.split("/").slice(0, -1).join("/");
57
+ b && await $(n(r, b), { recursive: !0 }), i.info("Writing file: " + l), await m(l, a), await v(l);
58
+ });
59
+ await Promise.all(x);
60
+ const w = D(d, r), e = n(d, ".saltyrc"), f = await p(e, "utf-8").catch(() => {
61
+ });
62
+ if (f === void 0) {
63
+ i.info("Creating file: " + e);
64
+ const a = JSON.stringify({
65
+ defaultProject: w,
66
+ projects: [w]
67
+ }, null, 2);
68
+ await m(e, a);
69
+ } else {
70
+ i.info("Edit file: " + e);
71
+ const t = JSON.parse(f), a = new Set((t == null ? void 0 : t.projects) || []);
72
+ a.add(w), t.projects = [...a];
73
+ const l = JSON.stringify(t, null, 2);
74
+ await m(e, l);
75
+ }
76
+ const P = n(d, ".gitignore"), h = await p(P, "utf-8").catch(() => {
77
+ });
78
+ if (h !== void 0 && (h.includes("saltygen") || (i.info("Edit file: " + P), await m(P, h + `
79
+
80
+ # Salty-CSS
81
+ saltygen
82
+ `))), c) {
83
+ const t = n(r, c), a = await p(t, "utf-8").catch(() => {
84
+ });
85
+ if (a !== void 0 && !a.includes("saltygen")) {
86
+ const C = n(t, ".."), O = `@import '${D(C, n(r, "saltygen/index.css"))}';`;
87
+ i.info("Edit file: " + t), await m(t, O + `
88
+ ` + a), await v(t);
89
+ }
90
+ }
91
+ const y = n(r, "vite.config.ts"), F = await p(y, "utf-8").catch(() => {
92
+ });
93
+ if (F !== void 0 && !F.includes("saltyPlugin")) {
94
+ i.info("Edit file: " + y);
95
+ const a = `import { saltyPlugin } from '@salty-css/vite';
96
+ `, C = F.replace(/(plugins: \[)/, `$1
97
+ saltyPlugin(__dirname),`);
98
+ i.info("Installing @salty-css/vite..."), await N("npm install @salty-css/vite"), i.info("Adding Salty-CSS plugin to Vite config..."), await m(y, a + C), await v(y);
99
+ }
100
+ }), o.command("build").alias("b").description("Build the Salty-CSS project.").option("-d, --dir <dir>", "Project directory to build the project in.", E).action(async function() {
101
+ i.info("Building the Salty-CSS project...");
102
+ const { dir: s } = this.opts(), c = n(process.cwd(), s);
103
+ await H(c);
104
+ }), o.command("generate <file>").alias("g").description("Generate a new component file.").option("-d, --dir <dir>", "Project directory to generate the file in.", E).option("-t, --tag <tag>", "HTML tag of the component.", "div").option("-n, --name <name>", "Name of the component.").option("-c, --className <className>", "CSS class of the component.").action(async function(s) {
105
+ const { dir: c, tag: d, name: r, className: j } = this.opts(), x = n(process.cwd(), c), w = n(x, s), e = z(w);
106
+ e.ext || (e.ext = ".ts"), e.name.endsWith(".css") || (e.name = e.name + ".css"), e.base = e.name + e.ext;
107
+ const f = J(e);
108
+ if (await p(f, "utf-8").catch(() => {
109
+ }) !== void 0) {
110
+ i.error("File already exists:", f);
111
+ return;
112
+ }
113
+ i.info("Generating a new file: " + f);
114
+ const h = L(r || e.base.replace(/\.css\.\w+$/, "")), { content: y } = await u("react/react-styled-file.ts", { tag: d, name: h, className: j });
115
+ await m(f, y), await v(f);
116
+ }), o.parseAsync(process.argv);
117
+ }
118
+ q().catch((o) => console.error(o));
@@ -0,0 +1 @@
1
+ export declare const logger: import('winston').Logger;
@@ -0,0 +1 @@
1
+ export declare function formatWithPrettier(filePath: string): Promise<void>;
@@ -1,11 +1,11 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const K=require("esbuild"),J=require("winston"),G=require("child_process"),N=require("../util/index.cjs"),o=require("path"),r=require("fs"),L=require("fs/promises"),_=require("../parse-templates-BY1Xai-_.cjs");function q(t){const s=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const n in t)if(n!=="default"){const e=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(s,n,e.get?e:{enumerable:!0,get:()=>t[n]})}}return s.default=t,Object.freeze(s)}const R=q(K),k=q(J),A=k.createLogger({level:"info",format:k.format.combine(k.format.colorize(),k.format.cli()),transports:[new k.transports.Console({})]}),v=t=>o.join(t,"./saltygen"),M=["salty","css","styles","styled"],z=(t=[])=>new RegExp(`\\.(${[...M,...t].join("|")})\\.`),T=(t,s=[])=>z(s).test(t),U=async t=>{const s=v(t),n=o.join(t,"salty-config.ts"),e=o.join(s,"salty-config.js");await R.build({entryPoints:[n],minify:!0,treeShaking:!0,bundle:!0,outfile:e,format:"esm",external:["react"]});const a=Date.now(),{config:h}=await import(`${e}?t=${a}`);return h},H=async t=>{const s=await U(t),n=new Set,e=(f,p=[])=>f?Object.entries(f).flatMap(([y,c])=>{if(!c)return;if(typeof c=="object")return e(c,[...p,y]);const x=[...p,y].join(".");n.add(`"${x}"`);const D=[...p.map(N.dashCase),N.dashCase(y)].join("-"),{result:P}=_.parseValueTokens(c);return`--${D}: ${P};`}):[],a=f=>f?Object.entries(f).flatMap(([p,y])=>{const c=e(y);return p==="base"?c.join(""):`${p} { ${c.join("")} }`}):[],h=f=>f?Object.entries(f).flatMap(([p,y])=>Object.entries(y).flatMap(([c,x])=>{const D=e(x,[p]),P=`.${p}-${c}, [data-${p}="${c}"]`,O=D.join("");return`${P} { ${O} }`})):[],b=e(s.variables),w=a(s.responsiveVariables),l=h(s.conditionalVariables),j=v(t),u=o.join(j,"css/variables.css"),i=`:root { ${b.join("")} ${w.join("")} } ${l.join("")}`;r.writeFileSync(u,i);const g=o.join(j,"types/css-tokens.d.ts"),d=`type VariableTokens = ${[...n].join("|")}; type PropertyValueToken = \`{\${VariableTokens}}\``;r.writeFileSync(g,d);const m=o.join(j,"css/global.css"),S=_.parseStyles(s.global,"");r.writeFileSync(m,S);const F=o.join(j,"css/templates.css"),C=_.parseTemplates(s.templates);r.writeFileSync(F,C)},V=async(t,s)=>{const n=N.toHash(t),e=o.join(s,"js",n+".js");await R.build({entryPoints:[t],minify:!0,treeShaking:!0,bundle:!0,outfile:e,format:"esm",target:["es2022"],keepNames:!0,external:["react"]});const a=Date.now();return await import(`${e}?t=${a}`)},E=async t=>{const s=v(t),n=o.join(s,"salty-config.js"),{config:e}=await import(n);return e},W=async t=>{try{const s=[],n=[],e=v(t),a=o.join(e,"index.css");(()=>{r.existsSync(e)&&G.execSync("rm -rf "+e),r.mkdirSync(e),r.mkdirSync(o.join(e,"css")),r.mkdirSync(o.join(e,"types"))})(),await H(t);const b=await E(t);async function w(i,g){const $=r.statSync(i);if($.isDirectory()){const d=r.readdirSync(i);await Promise.all(d.map(m=>w(o.join(i,m),o.join(g,m))))}else if($.isFile()&&T(i)){const m=await V(i,e),S=[];Object.entries(m).forEach(([p,y])=>{if(y.isKeyframes&&y.css){const O=`${y.animationName}.css`,I=`css/${O}`,B=o.join(e,I);s.push(O),r.writeFileSync(B,y.css);return}if(!y.generator)return;const c=y.generator._withBuildContext({name:p,config:b}),x=`${c.hash}-${c.priority}.css`;n[c.priority]||(n[c.priority]=[]),n[c.priority].push(x),S.push(x);const D=`css/${x}`,P=o.join(e,D);r.writeFileSync(P,c.css)});const F=S.map(p=>`@import url('./${p}');`).join(`
2
- `),C=N.toHash(i,6),f=o.join(e,`css/${C}.css`);r.writeFileSync(f,F)}}await w(t,e);const l=s.map(i=>`@import url('./css/${i}');`).join(`
3
- `);let u=`@layer l0, l1, l2, l3, l4, l5, l6, l7, l8;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const z=require("esbuild"),B=require("child_process"),P=require("../dash-case-DKzpenwY.cjs"),o=require("path"),r=require("fs"),K=require("fs/promises"),V=require("../parse-templates-W0YfTmOT.cjs");function G(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const n in t)if(n!=="default"){const s=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(e,n,s.get?s:{enumerable:!0,get:()=>t[n]})}}return e.default=t,Object.freeze(e)}const R=G(z),N=t=>o.join(t,"./saltygen"),_=["salty","css","styles","styled"],q=(t=[])=>new RegExp(`\\.(${[..._,...t].join("|")})\\.`),O=(t,e=[])=>q(e).test(t),J=async t=>{const e=N(t),n=o.join(t,"salty.config.ts"),s=o.join(e,"salty.config.js");await R.build({entryPoints:[n],minify:!0,treeShaking:!0,bundle:!0,outfile:s,format:"esm",external:["react"]});const a=Date.now(),{config:w}=await import(`${s}?t=${a}`);return w},M=async t=>{const e=await J(t),n=new Set,s=(d,y=[])=>d?Object.entries(d).flatMap(([p,c])=>{if(!c)return;if(typeof c=="object")return s(c,[...y,p]);const C=[...y,p].join(".");n.add(`"${C}"`);const x=[...y.map(P.dashCase),P.dashCase(p)].join("-"),{result:D}=V.parseValueTokens(c);return`--${x}: ${D};`}):[],a=d=>d?Object.entries(d).flatMap(([y,p])=>{const c=s(p);return y==="base"?c.join(""):`${y} { ${c.join("")} }`}):[],w=d=>d?Object.entries(d).flatMap(([y,p])=>Object.entries(p).flatMap(([c,C])=>{const x=s(C,[y]),D=`.${y}-${c}, [data-${y}="${c}"]`,k=x.join("");return`${D} { ${k} }`})):[],j=s(e.variables),S=a(e.responsiveVariables),l=w(e.conditionalVariables),b=N(t),f=o.join(b,"css/variables.css"),i=`:root { ${j.join("")} ${S.join("")} } ${l.join("")}`;r.writeFileSync(f,i);const g=o.join(b,"types/css-tokens.d.ts"),m=`type VariableTokens = ${[...n].join("|")}; type PropertyValueToken = \`{\${VariableTokens}}\``;r.writeFileSync(g,m);const u=o.join(b,"css/global.css"),h=V.parseStyles(e.global,"");r.writeFileSync(u,h);const F=o.join(b,"css/templates.css"),v=V.parseTemplates(e.templates);r.writeFileSync(F,v)},T=async(t,e)=>{const n=P.toHash(t),s=o.join(e,"js",n+".js");await R.build({entryPoints:[t],minify:!0,treeShaking:!0,bundle:!0,outfile:s,format:"esm",target:["es2022"],keepNames:!0,external:["react"]});const a=Date.now();return await import(`${s}?t=${a}`)},E=async t=>{const e=N(t),n=o.join(e,"salty.config.js"),{config:s}=await import(n);return s},A=async t=>{try{const e=[],n=[],s=N(t),a=o.join(s,"index.css");(()=>{r.existsSync(s)&&B.execSync("rm -rf "+s),r.mkdirSync(s),r.mkdirSync(o.join(s,"css")),r.mkdirSync(o.join(s,"types"))})(),await M(t);const j=await E(t);async function S(i,g){const $=r.statSync(i);if($.isDirectory()){const m=r.readdirSync(i);await Promise.all(m.map(u=>S(o.join(i,u),o.join(g,u))))}else if($.isFile()&&O(i)){const u=await T(i,s),h=[];Object.entries(u).forEach(([y,p])=>{if(p.isKeyframes&&p.css){const k=`${p.animationName}.css`,H=`css/${k}`,I=o.join(s,H);e.push(k),r.writeFileSync(I,p.css);return}if(!p.generator)return;const c=p.generator._withBuildContext({name:y,config:j}),C=`${c.hash}-${c.priority}.css`;n[c.priority]||(n[c.priority]=[]),n[c.priority].push(C),h.push(C);const x=`css/${C}`,D=o.join(s,x);r.writeFileSync(D,c.css)});const F=h.map(y=>`@import url('./${y}');`).join(`
2
+ `),v=P.toHash(i,6),d=o.join(s,`css/${v}.css`);r.writeFileSync(d,F)}}await S(t,s);const l=e.map(i=>`@import url('./css/${i}');`).join(`
3
+ `);let f=`@layer l0, l1, l2, l3, l4, l5, l6, l7, l8;
4
4
 
5
5
  ${["@import url('./css/variables.css');","@import url('./css/global.css');","@import url('./css/templates.css');"].join(`
6
6
  `)}
7
- ${l}`;if(b.importStrategy!=="component"){const i=n.flat().map(g=>`@import url('./css/${g}');`).join(`
8
- `);u+=i}r.writeFileSync(a,u)}catch(s){console.error(s)}},X=async(t,s)=>{try{const n=[],e=o.join(t,"./saltygen"),a=o.join(e,"index.css");if(T(s)){const b=await E(t),w=await V(s,e);Object.entries(w).forEach(([g,$])=>{if(!$.generator)return;const d=$.generator._withBuildContext({name:g,config:b}),m=`${d.hash}-${d.priority}.css`,S=`css/${m}`,F=o.join(e,S);n.push(m),r.writeFileSync(F,d.css)});const l=r.readFileSync(a,"utf8").split(`
9
- `),j=n.map(g=>`@import url('../saltygen/css/${g}');`),i=[...new Set([...l,...j])].join(`
10
- `);r.writeFileSync(a,i)}}catch(n){console.error(n)}},Y=async(t,s)=>{try{const n=o.join(t,"./saltygen");if(T(s)){let a=r.readFileSync(s,"utf8");a.replace(/^(?!export\s)const\s.*/gm,u=>`export ${u}`)!==a&&await L.writeFile(s,a);const b=await E(t),w=await V(s,n);let l=a;Object.entries(w).forEach(([u,i])=>{var f;if(i.isKeyframes){console.log("value",i);return}if(!i.generator)return;const g=i.generator._withBuildContext({name:u,config:b}),$=new RegExp(`${u}[=\\s]+[^()]+styled\\(([^,]+),`,"g").exec(a);if(!$)return console.error("Could not find the original declaration");const d=(f=$.at(1))==null?void 0:f.trim(),{element:m,variantKeys:S}=g.props,F=`${u} = styled(${d}, "${g.classNames}", "${g._callerName}", ${JSON.stringify(m)}, ${JSON.stringify(S)});`,C=new RegExp(`${u}[=\\s]+[^()]+styled\\(([^,]+),[^;]+;`,"g");l=l.replace(C,F)});const j=N.toHash(s,6);return b.importStrategy==="component"&&(l=`import '../../saltygen/css/${j}.css';
11
- ${l}`),l=l.replace("{ styled }","{ styledClient as styled }"),l=l.replace("@salty-css/react/styled","@salty-css/react/styled-client"),l}}catch(n){console.error(n)}};exports.compileSaltyFile=V;exports.generateCss=W;exports.generateFile=X;exports.generateVariables=H;exports.isSaltyFile=T;exports.logger=A;exports.minimizeFile=Y;exports.saltyFileExtensions=M;exports.saltyFileRegExp=z;
7
+ ${l}`;if(j.importStrategy!=="component"){const i=n.flat().map(g=>`@import url('./css/${g}');`).join(`
8
+ `);f+=i}r.writeFileSync(a,f)}catch(e){console.error(e)}},L=async(t,e)=>{try{const n=[],s=o.join(t,"./saltygen"),a=o.join(s,"index.css");if(O(e)){const j=await E(t),S=await T(e,s);Object.entries(S).forEach(([g,$])=>{if(!$.generator)return;const m=$.generator._withBuildContext({name:g,config:j}),u=`${m.hash}-${m.priority}.css`,h=`css/${u}`,F=o.join(s,h);n.push(u),r.writeFileSync(F,m.css)});const l=r.readFileSync(a,"utf8").split(`
9
+ `),b=n.map(g=>`@import url('../saltygen/css/${g}');`),i=[...new Set([...l,...b])].join(`
10
+ `);r.writeFileSync(a,i)}}catch(n){console.error(n)}},U=async(t,e)=>{try{const n=o.join(t,"./saltygen");if(O(e)){const a=r.readFileSync(e,"utf8");a.replace(/^(?!export\s)const\s.*/gm,f=>`export ${f}`)!==a&&await K.writeFile(e,a);const j=await E(t),S=await T(e,n);let l=a;Object.entries(S).forEach(([f,i])=>{var F;if(i.isKeyframes){console.log("value",i);return}if(!i.generator)return;const g=i.generator._withBuildContext({name:f,config:j}),$=new RegExp(`${f}[=\\s]+[^()]+styled\\(([^,]+),`,"g").exec(a);if(!$)return console.error("Could not find the original declaration");const m=(F=$.at(1))==null?void 0:F.trim(),u=`${f} = styled(${m}, "${g.classNames}", "${g._callerName}", ${JSON.stringify(g.props)});`,h=new RegExp(`${f}[=\\s]+[^()]+styled\\(([^,]+),[^;]+;`,"g");l=l.replace(h,u)});const b=P.toHash(e,6);return j.importStrategy==="component"&&(l=`import '../../saltygen/css/${b}.css';
11
+ ${l}`),l=l.replace("{ styled }","{ styledClient as styled }"),l=l.replace("@salty-css/react/styled","@salty-css/react/styled-client"),l}}catch(n){console.error(n)}};exports.compileSaltyFile=T;exports.generateConfigStyles=M;exports.generateCss=A;exports.generateFile=L;exports.isSaltyFile=O;exports.minimizeFile=U;exports.saltyFileExtensions=_;exports.saltyFileRegExp=q;
@@ -1,10 +1,8 @@
1
1
  import { StyleComponentGenerator } from '../generator/style-generator';
2
- import * as winston from 'winston';
3
- export declare const logger: winston.Logger;
4
2
  export declare const saltyFileExtensions: string[];
5
3
  export declare const saltyFileRegExp: (additional?: string[]) => RegExp;
6
4
  export declare const isSaltyFile: (file: string, additional?: string[]) => boolean;
7
- export declare const generateVariables: (dirname: string) => Promise<void>;
5
+ export declare const generateConfigStyles: (dirname: string) => Promise<void>;
8
6
  export declare const compileSaltyFile: (sourceFilePath: string, outputDirectory: string) => Promise<{
9
7
  [key: string]: {
10
8
  generator: StyleComponentGenerator;
package/compiler/index.js CHANGED
@@ -1,18 +1,13 @@
1
- import * as M from "esbuild";
2
- import * as N from "winston";
3
- import { execSync as z } from "child_process";
4
- import { toHash as T, dashCase as I } from "../util/index.js";
1
+ import * as I from "esbuild";
2
+ import { execSync as H } from "child_process";
3
+ import { t as T, d as R } from "../dash-case-DMQMcCO6.js";
5
4
  import { join as o } from "path";
6
- import { writeFileSync as $, existsSync as H, mkdirSync as v, statSync as J, readdirSync as G, readFileSync as _ } from "fs";
7
- import { writeFile as L } from "fs/promises";
8
- import { p as q, a as A, b as U } from "../parse-templates-BOSK0Tb6.js";
9
- const rt = N.createLogger({
10
- level: "info",
11
- format: N.format.combine(N.format.colorize(), N.format.cli()),
12
- transports: [new N.transports.Console({})]
13
- }), k = (s) => o(s, "./saltygen"), W = ["salty", "css", "styles", "styled"], X = (s = []) => new RegExp(`\\.(${[...W, ...s].join("|")})\\.`), O = (s, e = []) => X(e).test(s), Y = async (s) => {
14
- const e = k(s), n = o(s, "salty-config.ts"), t = o(e, "salty-config.js");
15
- await M.build({
5
+ import { writeFileSync as $, existsSync as K, mkdirSync as V, statSync as z, readdirSync as G, readFileSync as M } from "fs";
6
+ import { writeFile as J } from "fs/promises";
7
+ import { p as q, a as A, b as L } from "../parse-templates-D4p3pgQR.js";
8
+ const N = (s) => o(s, "./saltygen"), U = ["salty", "css", "styles", "styled"], W = (s = []) => new RegExp(`\\.(${[...U, ...s].join("|")})\\.`), v = (s, e = []) => W(e).test(s), X = async (s) => {
9
+ const e = N(s), n = o(s, "salty.config.ts"), t = o(e, "salty.config.js");
10
+ await I.build({
16
11
  entryPoints: [n],
17
12
  minify: !0,
18
13
  treeShaking: !0,
@@ -21,33 +16,33 @@ const rt = N.createLogger({
21
16
  format: "esm",
22
17
  external: ["react"]
23
18
  });
24
- const c = Date.now(), { config: j } = await import(`${t}?t=${c}`);
25
- return j;
26
- }, Z = async (s) => {
27
- const e = await Y(s), n = /* @__PURE__ */ new Set(), t = (m, l = []) => m ? Object.entries(m).flatMap(([p, i]) => {
28
- if (!i) return;
29
- if (typeof i == "object") return t(i, [...l, p]);
19
+ const c = Date.now(), { config: S } = await import(`${t}?t=${c}`);
20
+ return S;
21
+ }, Y = async (s) => {
22
+ const e = await X(s), n = /* @__PURE__ */ new Set(), t = (u, l = []) => u ? Object.entries(u).flatMap(([p, r]) => {
23
+ if (!r) return;
24
+ if (typeof r == "object") return t(r, [...l, p]);
30
25
  const x = [...l, p].join(".");
31
26
  n.add(`"${x}"`);
32
- const D = [...l.map(I), I(p)].join("-"), { result: P } = U(i);
33
- return `--${D}: ${P};`;
34
- }) : [], c = (m) => m ? Object.entries(m).flatMap(([l, p]) => {
35
- const i = t(p);
36
- return l === "base" ? i.join("") : `${l} { ${i.join("")} }`;
37
- }) : [], j = (m) => m ? Object.entries(m).flatMap(([l, p]) => Object.entries(p).flatMap(([i, x]) => {
38
- const D = t(x, [l]), P = `.${l}-${i}, [data-${l}="${i}"]`, V = D.join("");
39
- return `${P} { ${V} }`;
40
- })) : [], d = t(e.variables), w = c(e.responsiveVariables), a = j(e.conditionalVariables), b = k(s), y = o(b, "css/variables.css"), r = `:root { ${d.join("")} ${w.join("")} } ${a.join("")}`;
41
- $(y, r);
42
- const f = o(b, "types/css-tokens.d.ts"), u = `type VariableTokens = ${[...n].join("|")}; type PropertyValueToken = \`{\${VariableTokens}}\``;
43
- $(f, u);
27
+ const C = [...l.map(R), R(p)].join("-"), { result: D } = L(r);
28
+ return `--${C}: ${D};`;
29
+ }) : [], c = (u) => u ? Object.entries(u).flatMap(([l, p]) => {
30
+ const r = t(p);
31
+ return l === "base" ? r.join("") : `${l} { ${r.join("")} }`;
32
+ }) : [], S = (u) => u ? Object.entries(u).flatMap(([l, p]) => Object.entries(p).flatMap(([r, x]) => {
33
+ const C = t(x, [l]), D = `.${l}-${r}, [data-${l}="${r}"]`, P = C.join("");
34
+ return `${D} { ${P} }`;
35
+ })) : [], d = t(e.variables), w = c(e.responsiveVariables), a = S(e.conditionalVariables), b = N(s), f = o(b, "css/variables.css"), i = `:root { ${d.join("")} ${w.join("")} } ${a.join("")}`;
36
+ $(f, i);
37
+ const y = o(b, "types/css-tokens.d.ts"), m = `type VariableTokens = ${[...n].join("|")}; type PropertyValueToken = \`{\${VariableTokens}}\``;
38
+ $(y, m);
44
39
  const g = o(b, "css/global.css"), F = q(e.global, "");
45
40
  $(g, F);
46
- const S = o(b, "css/templates.css"), C = A(e.templates);
47
- $(S, C);
41
+ const j = o(b, "css/templates.css"), k = A(e.templates);
42
+ $(j, k);
48
43
  }, E = async (s, e) => {
49
44
  const n = T(s), t = o(e, "js", n + ".js");
50
- await M.build({
45
+ await I.build({
51
46
  entryPoints: [s],
52
47
  minify: !0,
53
48
  treeShaking: !0,
@@ -60,106 +55,104 @@ const rt = N.createLogger({
60
55
  });
61
56
  const c = Date.now();
62
57
  return await import(`${t}?t=${c}`);
63
- }, R = async (s) => {
64
- const e = k(s), n = o(e, "salty-config.js"), { config: t } = await import(n);
58
+ }, O = async (s) => {
59
+ const e = N(s), n = o(e, "salty.config.js"), { config: t } = await import(n);
65
60
  return t;
66
- }, it = async (s) => {
61
+ }, ot = async (s) => {
67
62
  try {
68
- const e = [], n = [], t = k(s), c = o(t, "index.css");
63
+ const e = [], n = [], t = N(s), c = o(t, "index.css");
69
64
  (() => {
70
- H(t) && z("rm -rf " + t), v(t), v(o(t, "css")), v(o(t, "types"));
71
- })(), await Z(s);
72
- const d = await R(s);
73
- async function w(r, f) {
74
- const h = J(r);
65
+ K(t) && H("rm -rf " + t), V(t), V(o(t, "css")), V(o(t, "types"));
66
+ })(), await Y(s);
67
+ const d = await O(s);
68
+ async function w(i, y) {
69
+ const h = z(i);
75
70
  if (h.isDirectory()) {
76
- const u = G(r);
77
- await Promise.all(u.map((g) => w(o(r, g), o(f, g))));
78
- } else if (h.isFile() && O(r)) {
79
- const g = await E(r, t), F = [];
71
+ const m = G(i);
72
+ await Promise.all(m.map((g) => w(o(i, g), o(y, g))));
73
+ } else if (h.isFile() && v(i)) {
74
+ const g = await E(i, t), F = [];
80
75
  Object.entries(g).forEach(([l, p]) => {
81
76
  if (p.isKeyframes && p.css) {
82
- const V = `${p.animationName}.css`, B = `css/${V}`, K = o(t, B);
83
- e.push(V), $(K, p.css);
77
+ const P = `${p.animationName}.css`, _ = `css/${P}`, B = o(t, _);
78
+ e.push(P), $(B, p.css);
84
79
  return;
85
80
  }
86
81
  if (!p.generator) return;
87
- const i = p.generator._withBuildContext({
82
+ const r = p.generator._withBuildContext({
88
83
  name: l,
89
84
  config: d
90
- }), x = `${i.hash}-${i.priority}.css`;
91
- n[i.priority] || (n[i.priority] = []), n[i.priority].push(x), F.push(x);
92
- const D = `css/${x}`, P = o(t, D);
93
- $(P, i.css);
85
+ }), x = `${r.hash}-${r.priority}.css`;
86
+ n[r.priority] || (n[r.priority] = []), n[r.priority].push(x), F.push(x);
87
+ const C = `css/${x}`, D = o(t, C);
88
+ $(D, r.css);
94
89
  });
95
- const S = F.map((l) => `@import url('./${l}');`).join(`
96
- `), C = T(r, 6), m = o(t, `css/${C}.css`);
97
- $(m, S);
90
+ const j = F.map((l) => `@import url('./${l}');`).join(`
91
+ `), k = T(i, 6), u = o(t, `css/${k}.css`);
92
+ $(u, j);
98
93
  }
99
94
  }
100
95
  await w(s, t);
101
- const a = e.map((r) => `@import url('./css/${r}');`).join(`
96
+ const a = e.map((i) => `@import url('./css/${i}');`).join(`
102
97
  `);
103
- let y = `@layer l0, l1, l2, l3, l4, l5, l6, l7, l8;
98
+ let f = `@layer l0, l1, l2, l3, l4, l5, l6, l7, l8;
104
99
 
105
100
  ${["@import url('./css/variables.css');", "@import url('./css/global.css');", "@import url('./css/templates.css');"].join(`
106
101
  `)}
107
102
  ${a}`;
108
103
  if (d.importStrategy !== "component") {
109
- const r = n.flat().map((f) => `@import url('./css/${f}');`).join(`
104
+ const i = n.flat().map((y) => `@import url('./css/${y}');`).join(`
110
105
  `);
111
- y += r;
106
+ f += i;
112
107
  }
113
- $(c, y);
108
+ $(c, f);
114
109
  } catch (e) {
115
110
  console.error(e);
116
111
  }
117
- }, ct = async (s, e) => {
112
+ }, it = async (s, e) => {
118
113
  try {
119
114
  const n = [], t = o(s, "./saltygen"), c = o(t, "index.css");
120
- if (O(e)) {
121
- const d = await R(s), w = await E(e, t);
122
- Object.entries(w).forEach(([f, h]) => {
115
+ if (v(e)) {
116
+ const d = await O(s), w = await E(e, t);
117
+ Object.entries(w).forEach(([y, h]) => {
123
118
  if (!h.generator) return;
124
- const u = h.generator._withBuildContext({
125
- name: f,
119
+ const m = h.generator._withBuildContext({
120
+ name: y,
126
121
  config: d
127
- }), g = `${u.hash}-${u.priority}.css`, F = `css/${g}`, S = o(t, F);
128
- n.push(g), $(S, u.css);
122
+ }), g = `${m.hash}-${m.priority}.css`, F = `css/${g}`, j = o(t, F);
123
+ n.push(g), $(j, m.css);
129
124
  });
130
- const a = _(c, "utf8").split(`
131
- `), b = n.map((f) => `@import url('../saltygen/css/${f}');`), r = [.../* @__PURE__ */ new Set([...a, ...b])].join(`
125
+ const a = M(c, "utf8").split(`
126
+ `), b = n.map((y) => `@import url('../saltygen/css/${y}');`), i = [.../* @__PURE__ */ new Set([...a, ...b])].join(`
132
127
  `);
133
- $(c, r);
128
+ $(c, i);
134
129
  }
135
130
  } catch (n) {
136
131
  console.error(n);
137
132
  }
138
- }, at = async (s, e) => {
133
+ }, rt = async (s, e) => {
139
134
  try {
140
135
  const n = o(s, "./saltygen");
141
- if (O(e)) {
142
- let c = _(e, "utf8");
143
- c.replace(/^(?!export\s)const\s.*/gm, (y) => `export ${y}`) !== c && await L(e, c);
144
- const d = await R(s), w = await E(e, n);
136
+ if (v(e)) {
137
+ const c = M(e, "utf8");
138
+ c.replace(/^(?!export\s)const\s.*/gm, (f) => `export ${f}`) !== c && await J(e, c);
139
+ const d = await O(s), w = await E(e, n);
145
140
  let a = c;
146
- Object.entries(w).forEach(([y, r]) => {
147
- var m;
148
- if (r.isKeyframes) {
149
- console.log("value", r);
141
+ Object.entries(w).forEach(([f, i]) => {
142
+ var j;
143
+ if (i.isKeyframes) {
144
+ console.log("value", i);
150
145
  return;
151
146
  }
152
- if (!r.generator) return;
153
- const f = r.generator._withBuildContext({
154
- name: y,
147
+ if (!i.generator) return;
148
+ const y = i.generator._withBuildContext({
149
+ name: f,
155
150
  config: d
156
- }), h = new RegExp(`${y}[=\\s]+[^()]+styled\\(([^,]+),`, "g").exec(c);
151
+ }), h = new RegExp(`${f}[=\\s]+[^()]+styled\\(([^,]+),`, "g").exec(c);
157
152
  if (!h)
158
153
  return console.error("Could not find the original declaration");
159
- const u = (m = h.at(1)) == null ? void 0 : m.trim(), { element: g, variantKeys: F } = f.props, S = `${y} = styled(${u}, "${f.classNames}", "${f._callerName}", ${JSON.stringify(g)}, ${JSON.stringify(
160
- F
161
- )});`, C = new RegExp(`${y}[=\\s]+[^()]+styled\\(([^,]+),[^;]+;`, "g");
162
- a = a.replace(C, S);
154
+ const m = (j = h.at(1)) == null ? void 0 : j.trim(), g = `${f} = styled(${m}, "${y.classNames}", "${y._callerName}", ${JSON.stringify(y.props)});`, F = new RegExp(`${f}[=\\s]+[^()]+styled\\(([^,]+),[^;]+;`, "g");
155
+ a = a.replace(F, g);
163
156
  });
164
157
  const b = T(e, 6);
165
158
  return d.importStrategy === "component" && (a = `import '../../saltygen/css/${b}.css';
@@ -171,12 +164,11 @@ ${a}`), a = a.replace("{ styled }", "{ styledClient as styled }"), a = a.replace
171
164
  };
172
165
  export {
173
166
  E as compileSaltyFile,
174
- it as generateCss,
175
- ct as generateFile,
176
- Z as generateVariables,
177
- O as isSaltyFile,
178
- rt as logger,
179
- at as minimizeFile,
180
- W as saltyFileExtensions,
181
- X as saltyFileRegExp
167
+ Y as generateConfigStyles,
168
+ ot as generateCss,
169
+ it as generateFile,
170
+ v as isSaltyFile,
171
+ rt as minimizeFile,
172
+ U as saltyFileExtensions,
173
+ W as saltyFileRegExp
182
174
  };
@@ -0,0 +1 @@
1
+ "use strict";const n=e=>String.fromCharCode(e+(e>25?39:97)),i=(e,r)=>{let t="",a;for(a=Math.abs(e);a>52;a=a/52|0)t=n(a%52)+t;return t=n(a%52)+t,t.length<r?t=t.padStart(r,"a"):t.length>r&&(t=t.slice(-r)),t},o=(e,r)=>{let t=r.length;for(;t;)e=e*33^r.charCodeAt(--t);return e},c=(e,r=3)=>{const t=o(5381,JSON.stringify(e))>>>0;return i(t,r)};function s(e){return e?typeof e!="string"?s(String(e)):e.replace(/\s/g,"-").replace(/[A-Z](?:(?=[^A-Z])|[A-Z]*(?=[A-Z][^A-Z]|$))/g,(r,t)=>(t>0?"-":"")+r.toLowerCase()):""}exports.dashCase=s;exports.toHash=c;
@@ -0,0 +1,19 @@
1
+ const n = (e) => String.fromCharCode(e + (e > 25 ? 39 : 97)), o = (e, r) => {
2
+ let t = "", a;
3
+ for (a = Math.abs(e); a > 52; a = a / 52 | 0) t = n(a % 52) + t;
4
+ return t = n(a % 52) + t, t.length < r ? t = t.padStart(r, "a") : t.length > r && (t = t.slice(-r)), t;
5
+ }, i = (e, r) => {
6
+ let t = r.length;
7
+ for (; t; ) e = e * 33 ^ r.charCodeAt(--t);
8
+ return e;
9
+ }, c = (e, r = 3) => {
10
+ const t = i(5381, JSON.stringify(e)) >>> 0;
11
+ return o(t, r);
12
+ };
13
+ function s(e) {
14
+ return e ? typeof e != "string" ? s(String(e)) : e.replace(/\s/g, "-").replace(/[A-Z](?:(?=[^A-Z])|[A-Z]*(?=[A-Z][^A-Z]|$))/g, (r, t) => (t > 0 ? "-" : "") + r.toLowerCase()) : "";
15
+ }
16
+ export {
17
+ s as d,
18
+ c as t
19
+ };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("../util/index.cjs"),i=require("../parse-templates-BY1Xai-_.cjs");class o{constructor(t,s){this.tagName=t,this.params=s}get hash(){return n.toHash(this.params.base||this.params)}get priority(){var t;return typeof this.tagName=="function"||typeof this.tagName=="object"?(((t=this.tagName.generator)==null?void 0:t.priority)||0)+1:0}get classNames(){const t=[this.hash],{className:s}=this.params;return s&&t.push(s),t.join(" ")}get cssClassName(){return this.hash}get cssDisplayNameVar(){return`--${this.hash}-display-name: ${this._callerName};`}get templateKeys(){var t;return(t=this._context)!=null&&t.config.templates?i.getTemplateKeys(this._context.config.templates):[]}get css(){var a;const{base:t={},variants:s={},compoundVariants:e=[]}=this.params,r={...t,variants:s,compoundVariants:e};return i.parseStyles(r,`.${this.cssClassName}`,this.priority,(a=this._context)==null?void 0:a.config)}get props(){const{element:t}=this.params,s=this.params.variants?Object.keys(this.params.variants).map(e=>{var a;const r=(a=this.params.defaultVariants)==null?void 0:a[e];return r!==void 0?`${e}=${String(r)}`:e}):void 0;return{element:t,variantKeys:s}}_withBuildContext(t){this._context=t;const{name:s,config:e}=t;return this._callerName=s,this}}exports.StyleComponentGenerator=o;
1
+ "use strict";var m=Object.defineProperty;var l=(a,t,s)=>t in a?m(a,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):a[t]=s;var c=(a,t,s)=>l(a,typeof t!="symbol"?t+"":t,s);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("../dash-case-DKzpenwY.cjs"),p=require("../parse-templates-W0YfTmOT.cjs");class g{constructor(t,s){c(this,"_callerName");c(this,"_context");this.tagName=t,this.params=s}get hash(){return u.toHash(this.params.base||this.params)}get priority(){var t;return typeof this.tagName=="function"||typeof this.tagName=="object"?(((t=this.tagName.generator)==null?void 0:t.priority)||0)+1:0}get classNames(){const t=[this.hash],{className:s}=this.params;return s&&t.push(s),t.join(" ")}get cssClassName(){return this.hash}get cssDisplayNameVar(){return`--${this.hash}-display-name: ${this._callerName};`}get templateKeys(){var t;return(t=this._context)!=null&&t.config.templates?p.getTemplateKeys(this._context.config.templates):[]}get css(){var e;const{base:t={},variants:s={},compoundVariants:r=[]}=this.params,i={...t,variants:s,compoundVariants:r};return p.parseStyles(i,`.${this.cssClassName}`,this.priority,(e=this._context)==null?void 0:e.config)}get props(){const{element:t}=this.params,s=this.params.variants?Object.keys(this.params.variants).map(e=>{var n;const o=(n=this.params.defaultVariants)==null?void 0:n[e];return o!==void 0?`${e}=${String(o)}`:e}):void 0,r=new Set([]),i=/\{props\.([\w\d]+)\}/gi.exec(JSON.stringify(this.params.base));return i&&i.forEach((e,o,n)=>{const h=n.at(1);h&&r.add(h)}),{element:t,variantKeys:s,propValueKeys:[...r]}}_withBuildContext(t){this._context=t;const{name:s,config:r}=t;return this._callerName=s,this}}exports.StyleComponentGenerator=g;
@@ -1,11 +1,16 @@
1
- import { toHash as i } from "../util/index.js";
2
- import { g as n, p as o } from "../parse-templates-BOSK0Tb6.js";
3
- class p {
1
+ var h = Object.defineProperty;
2
+ var m = (e, t, s) => t in e ? h(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s;
3
+ var c = (e, t, s) => m(e, typeof t != "symbol" ? t + "" : t, s);
4
+ import { t as l } from "../dash-case-DMQMcCO6.js";
5
+ import { g, p as u } from "../parse-templates-D4p3pgQR.js";
6
+ class d {
4
7
  constructor(t, s) {
8
+ c(this, "_callerName");
9
+ c(this, "_context");
5
10
  this.tagName = t, this.params = s;
6
11
  }
7
12
  get hash() {
8
- return i(this.params.base || this.params);
13
+ return l(this.params.base || this.params);
9
14
  }
10
15
  get priority() {
11
16
  var t;
@@ -23,30 +28,34 @@ class p {
23
28
  }
24
29
  get templateKeys() {
25
30
  var t;
26
- return (t = this._context) != null && t.config.templates ? n(this._context.config.templates) : [];
31
+ return (t = this._context) != null && t.config.templates ? g(this._context.config.templates) : [];
27
32
  }
28
33
  get css() {
29
- var e;
30
- const { base: t = {}, variants: s = {}, compoundVariants: a = [] } = this.params, r = { ...t, variants: s, compoundVariants: a };
31
- return o(r, `.${this.cssClassName}`, this.priority, (e = this._context) == null ? void 0 : e.config);
34
+ var a;
35
+ const { base: t = {}, variants: s = {}, compoundVariants: r = [] } = this.params, i = { ...t, variants: s, compoundVariants: r };
36
+ return u(i, `.${this.cssClassName}`, this.priority, (a = this._context) == null ? void 0 : a.config);
32
37
  }
33
38
  get props() {
34
39
  const { element: t } = this.params, s = this.params.variants ? Object.keys(this.params.variants).map((a) => {
35
- var e;
36
- const r = (e = this.params.defaultVariants) == null ? void 0 : e[a];
37
- return r !== void 0 ? `${a}=${String(r)}` : a;
38
- }) : void 0;
39
- return {
40
+ var n;
41
+ const o = (n = this.params.defaultVariants) == null ? void 0 : n[a];
42
+ return o !== void 0 ? `${a}=${String(o)}` : a;
43
+ }) : void 0, r = /* @__PURE__ */ new Set([]), i = /\{props\.([\w\d]+)\}/gi.exec(JSON.stringify(this.params.base));
44
+ return i && i.forEach((a, o, n) => {
45
+ const p = n.at(1);
46
+ p && r.add(p);
47
+ }), {
40
48
  element: t,
41
- variantKeys: s
49
+ variantKeys: s,
50
+ propValueKeys: [...r]
42
51
  };
43
52
  }
44
53
  _withBuildContext(t) {
45
54
  this._context = t;
46
- const { name: s, config: a } = t;
55
+ const { name: s, config: r } = t;
47
56
  return this._callerName = s, this;
48
57
  }
49
58
  }
50
59
  export {
51
- p as StyleComponentGenerator
60
+ d as StyleComponentGenerator
52
61
  };
@@ -1,4 +1,9 @@
1
1
  import { StyledParams, Tag } from '../types';
2
+ export interface GeneratorProps {
3
+ element?: string;
4
+ variantKeys?: string[];
5
+ propValueKeys?: string[];
6
+ }
2
7
  export declare class StyleComponentGenerator {
3
8
  tagName: Tag<any>;
4
9
  params: StyledParams;
@@ -15,10 +20,7 @@ export declare class StyleComponentGenerator {
15
20
  get cssDisplayNameVar(): string;
16
21
  get templateKeys(): string[];
17
22
  get css(): string;
18
- get props(): {
19
- element: string | undefined;
20
- variantKeys: string[] | undefined;
21
- };
23
+ get props(): GeneratorProps;
22
24
  _withBuildContext(context: {
23
25
  name: string;
24
26
  config: any;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e="/* Empty */";exports.default=e;
@@ -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.15",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "typings": "./dist/index.d.ts",
@@ -23,6 +23,8 @@
23
23
  "name": "core"
24
24
  },
25
25
  "peerDependencies": {
26
+ "commander": ">=12.x",
27
+ "ejs": ">=3.x",
26
28
  "esbuild": ">=0.21.x",
27
29
  "react": ">=18.x || >=19.x",
28
30
  "winston": ">=3.x"
@@ -52,5 +54,9 @@
52
54
  "import": "./util/index.js",
53
55
  "require": "./util/index.cjs"
54
56
  }
57
+ },
58
+ "bin": {
59
+ "salty-css": "./bin/index.js",
60
+ "salty-css-cjs": "./bin/index.cjs"
55
61
  }
56
62
  }
@@ -1,22 +1,23 @@
1
- import { dashCase as O } from "./util/index.js";
2
- const N = (s, r) => {
3
- if (typeof s != "string") return { result: s };
4
- if (!r) return { result: s };
1
+ import { d as O } from "./dash-case-DMQMcCO6.js";
2
+ const N = (t, r) => {
3
+ if (typeof t != "string") return { result: t };
4
+ if (!r) return { result: t };
5
5
  const e = [];
6
6
  return Object.values(r).forEach((n) => {
7
7
  const { pattern: o, transform: c } = n;
8
- s = s.replace(o, (h) => {
8
+ t = t.replace(o, (h) => {
9
9
  const { value: i, css: m } = c(h);
10
10
  return m && e.push(m), i;
11
11
  });
12
- }), { result: s, additionalCss: e };
13
- }, P = (s) => typeof s != "string" ? { result: s } : /\{[^{}]+\}/g.test(s) ? { result: s.replace(/\{([^{}]+)\}/g, (...n) => `var(--${O(n[1].replaceAll(".", "-"))})`) } : { result: s }, d = (s, r, e, n) => {
14
- const o = [], c = Object.entries(s).reduce((i, [m, t]) => {
12
+ }), { result: t, additionalCss: e };
13
+ }, P = (t) => typeof t != "string" ? { result: t } : /\{[^{}]+\}/g.test(t) ? { result: t.replace(/\{([^{}]+)\}/g, (...n) => `var(--${O(n[1].replaceAll(".", "-"))})`) } : { result: t }, d = (t, r, e, n) => {
14
+ if (!t) return "";
15
+ const o = [], c = Object.entries(t).reduce((i, [m, s]) => {
15
16
  const p = m.trim();
16
- if (typeof t == "function" && (t = t()), typeof t == "object") {
17
- if (!t) return i;
17
+ if (typeof s == "function" && (s = s()), typeof s == "object") {
18
+ if (!s) return i;
18
19
  if (p === "variants")
19
- return Object.entries(t).forEach(([u, f]) => {
20
+ return Object.entries(s).forEach(([u, f]) => {
20
21
  f && Object.entries(f).forEach(([b, j]) => {
21
22
  if (!j) return;
22
23
  const l = `${r}.${u}-${b}`, y = d(j, l, e);
@@ -26,39 +27,39 @@ const N = (s, r) => {
26
27
  if (p === "defaultVariants")
27
28
  return i;
28
29
  if (p === "compoundVariants")
29
- return t.forEach((u) => {
30
+ return s.forEach((u) => {
30
31
  const { css: f, ...b } = u, j = Object.entries(b).reduce((y, [V, W]) => `${y}.${V}-${W}`, r), l = d(f, j, e);
31
32
  o.push(l);
32
33
  }), i;
33
34
  if (p.startsWith("@")) {
34
- const u = d(t, r, e), f = `${p} {
35
+ const u = d(s, r, e), f = `${p} {
35
36
  ${u.replace(`
36
37
  `, `
37
38
  `)}
38
39
  }`;
39
40
  return o.push(f), i;
40
41
  }
41
- const $ = m.includes("&") ? p.replace("&", r) : p.startsWith(":") ? `${r}${p}` : `${r} ${p}`, a = d(t, $, e);
42
+ const $ = m.includes("&") ? p.replace("&", r) : p.startsWith(":") ? `${r}${p}` : `${r} ${p}`, a = d(s, $, e);
42
43
  return o.push(a), i;
43
44
  }
44
45
  if (n != null && n.templates && n.templates[p]) {
45
- const a = t.split(".").reduce((f, b) => f[b], n.templates[p]), u = d(a, "");
46
+ const a = s.split(".").reduce((f, b) => f[b], n.templates[p]), u = d(a, "");
46
47
  return `${i}${u}`;
47
48
  }
48
49
  const g = p.startsWith("-") ? p : O(p), E = ($, a = ";") => i = `${i}${$}${a}`, S = ($) => E(`${g}:${$}`);
49
- if (typeof t == "number") return S(t);
50
- if (typeof t != "string")
51
- if ("toString" in t) t = t.toString();
50
+ if (typeof s == "number") return S(s);
51
+ if (typeof s != "string")
52
+ if ("toString" in s) s = s.toString();
52
53
  else return i;
53
54
  const { modifiers: k } = n || {}, T = function* () {
54
- yield P(t), yield N(t, k);
55
+ yield P(s), yield N(s, k);
55
56
  }();
56
57
  for (const { result: $, additionalCss: a = [] } of T)
57
- t = $, a.forEach((u) => {
58
+ s = $, a.forEach((u) => {
58
59
  const f = d(u, "");
59
60
  E(f, "");
60
61
  });
61
- return S(t);
62
+ return S(s);
62
63
  }, "");
63
64
  if (!c) return o.join(`
64
65
  `);
@@ -66,9 +67,10 @@ const N = (s, r) => {
66
67
  let h = "";
67
68
  return e !== void 0 ? h = `@layer l${e} { ${r} { ${c} } }` : h = `${r} { ${c} }`, [h, ...o].join(`
68
69
  `);
69
- }, _ = (s, r = []) => {
70
+ }, _ = (t, r = []) => {
71
+ if (!t) return "";
70
72
  const e = [], n = {};
71
- if (Object.entries(s).forEach(([o, c]) => {
73
+ if (Object.entries(t).forEach(([o, c]) => {
72
74
  if (typeof c == "object") {
73
75
  if (!c) return;
74
76
  const h = o.trim(), i = _(c, [...r, h]);
@@ -81,7 +83,7 @@ const N = (s, r) => {
81
83
  }
82
84
  return e.join(`
83
85
  `);
84
- }, A = (s) => Object.keys(s);
86
+ }, A = (t) => Object.keys(t);
85
87
  export {
86
88
  _ as a,
87
89
  P as b,
@@ -0,0 +1,8 @@
1
+ "use strict";const O=require("./dash-case-DKzpenwY.cjs"),N=(t,e)=>{if(typeof t!="string")return{result:t};if(!e)return{result:t};const r=[];return Object.values(e).forEach(n=>{const{pattern:o,transform:c}=n;t=t.replace(o,a=>{const{value:i,css:l}=c(a);return l&&r.push(l),i})}),{result:t,additionalCss:r}},k=t=>typeof t!="string"?{result:t}:/\{[^{}]+\}/g.test(t)?{result:t.replace(/\{([^{}]+)\}/g,(...n)=>`var(--${O.dashCase(n[1].replaceAll(".","-"))})`)}:{result:t},h=(t,e,r,n)=>{if(!t)return"";const o=[],c=Object.entries(t).reduce((i,[l,s])=>{const p=l.trim();if(typeof s=="function"&&(s=s()),typeof s=="object"){if(!s)return i;if(p==="variants")return Object.entries(s).forEach(([u,f])=>{f&&Object.entries(f).forEach(([m,j])=>{if(!j)return;const y=`${e}.${u}-${m}`,b=h(j,y,r);o.push(b)})}),i;if(p==="defaultVariants")return i;if(p==="compoundVariants")return s.forEach(u=>{const{css:f,...m}=u,j=Object.entries(m).reduce((b,[q,K])=>`${b}.${q}-${K}`,e),y=h(f,j,r);o.push(y)}),i;if(p.startsWith("@")){const u=h(s,e,r),f=`${p} {
2
+ ${u.replace(`
3
+ `,`
4
+ `)}
5
+ }`;return o.push(f),i}const $=l.includes("&")?p.replace("&",e):p.startsWith(":")?`${e}${p}`:`${e} ${p}`,d=h(s,$,r);return o.push(d),i}if(n!=null&&n.templates&&n.templates[p]){const d=s.split(".").reduce((f,m)=>f[m],n.templates[p]),u=h(d,"");return`${i}${u}`}const V=p.startsWith("-")?p:O.dashCase(p),T=($,d=";")=>i=`${i}${$}${d}`,S=$=>T(`${V}:${$}`);if(typeof s=="number")return S(s);if(typeof s!="string")if("toString"in s)s=s.toString();else return i;const{modifiers:g}=n||{},W=function*(){yield k(s),yield N(s,g)}();for(const{result:$,additionalCss:d=[]}of W)s=$,d.forEach(u=>{const f=h(u,"");T(f,"")});return S(s)},"");if(!c)return o.join(`
6
+ `);if(!e)return c;let a="";return r!==void 0?a=`@layer l${r} { ${e} { ${c} } }`:a=`${e} { ${c} }`,[a,...o].join(`
7
+ `)},E=(t,e=[])=>{if(!t)return"";const r=[],n={};if(Object.entries(t).forEach(([o,c])=>{if(typeof c=="object"){if(!c)return;const a=o.trim(),i=E(c,[...e,a]);r.push(i)}else n[o]=c}),Object.keys(n).length){const o=e.map(O.dashCase).join("-"),c=h(n,`.${o}`);r.push(c)}return r.join(`
8
+ `)},P=t=>Object.keys(t);exports.getTemplateKeys=P;exports.parseStyles=h;exports.parseTemplates=E;exports.parseValueTokens=k;
@@ -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,6 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=`import { defineConfig } from '@salty-css/core/config';
2
+
3
+ export const config = defineConfig({
4
+ // Add your custom config here
5
+ });
6
+ `;exports.default=o;
@@ -0,0 +1,9 @@
1
+ const n = `import { defineConfig } from '@salty-css/core/config';
2
+
3
+ export const config = defineConfig({
4
+ // Add your custom config here
5
+ });
6
+ `;
7
+ export {
8
+ n as default
9
+ };
package/types/index.d.ts CHANGED
@@ -11,7 +11,7 @@ export type CreateElementProps = {
11
11
  /** vks = Variant key set */
12
12
  _vks?: Set<string>;
13
13
  };
14
- export type StyledComponentProps = Record<string, unknown> & CreateElementProps & CssRuntimeValues;
14
+ export type StyledComponentProps = Record<string, unknown> & CreateElementProps;
15
15
  type FnComponent<PROPS extends StyledComponentProps> = {
16
16
  (props: PROPS): ReactNode;
17
17
  generator?: StyleComponentGenerator;
@@ -39,13 +39,14 @@ type Variants = {
39
39
  compoundVariants?: CompoundVariant[];
40
40
  };
41
41
  type VariantPropValue<T> = T extends 'true' ? 'true' | true : T;
42
- export type VariantProps<STYLES extends StyledParams> = STYLES['variants'] extends undefined ? {} : {
42
+ export type VariantProps<STYLES extends StyledParams> = STYLES['variants'] extends undefined ? object : {
43
43
  [K in keyof STYLES['variants']]?: VariantPropValue<keyof STYLES['variants'][K]> | '';
44
44
  };
45
- export type ParentComponentProps<TAG extends Tag<any>> = TAG extends (props: infer P) => ReactNode ? P : unknown;
46
- export type CssRuntimeValues = {
47
- cssValues?: Record<string, unknown>;
45
+ type CssValuePropKey = `props-${string}`;
46
+ export type ValueProps = {
47
+ [key: CssValuePropKey]: string;
48
48
  };
49
+ export type ParentComponentProps<TAG extends Tag<any>> = TAG extends (props: infer P) => ReactNode ? P : unknown;
49
50
  type StylePropertyValue = Record<never, never> & unknown;
50
51
  export type CssStyles = {
51
52
  [key in StyleKeys | OrString]?: StyleValue<key> | StylePropertyValue | PropertyValueToken | CssStyles;
@@ -0,0 +1 @@
1
+ export declare function camelCase(str: PropertyKey): string;
package/util/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=t=>String.fromCharCode(t+(t>25?39:97)),o=(t,r)=>{let e="",a;for(a=Math.abs(t);a>52;a=a/52|0)e=n(a%52)+e;return e=n(a%52)+e,e.length<r?e=e.padStart(r,"a"):e.length>r&&(e=e.slice(-r)),e},i=(t,r)=>{let e=r.length;for(;e;)t=t*33^r.charCodeAt(--e);return t},s=(t,r=3)=>{const e=i(5381,JSON.stringify(t))>>>0;return o(e,r)};function c(t){return t?typeof t!="string"?String(t):t.replace(/\s/g,"-").replace(/[A-Z](?:(?=[^A-Z])|[A-Z]*(?=[A-Z][^A-Z]|$))/g,(r,e)=>(e>0?"-":"")+r.toLowerCase()):""}exports.dashCase=c;exports.toHash=s;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("../dash-case-DKzpenwY.cjs"),t=require("../pascal-case-iWoaJWwT.cjs");function s(e){return e?typeof e!="string"?s(String(e)):e.replace(/\s/g,"-").replace(/-([a-z])/g,r=>r[1].toUpperCase()):""}exports.dashCase=a.dashCase;exports.toHash=a.toHash;exports.pascalCase=t.pascalCase;exports.camelCase=s;
package/util/index.d.ts CHANGED
@@ -1,2 +1,4 @@
1
+ export * from './camel-case';
1
2
  export * from './dash-case';
3
+ export * from './pascal-case';
2
4
  export * from './to-hash';
package/util/index.js CHANGED
@@ -1,19 +1,11 @@
1
- const n = (e) => String.fromCharCode(e + (e > 25 ? 39 : 97)), o = (e, r) => {
2
- let t = "", a;
3
- for (a = Math.abs(e); a > 52; a = a / 52 | 0) t = n(a % 52) + t;
4
- return t = n(a % 52) + t, t.length < r ? t = t.padStart(r, "a") : t.length > r && (t = t.slice(-r)), t;
5
- }, i = (e, r) => {
6
- let t = r.length;
7
- for (; t; ) e = e * 33 ^ r.charCodeAt(--t);
8
- return e;
9
- }, s = (e, r = 3) => {
10
- const t = i(5381, JSON.stringify(e)) >>> 0;
11
- return o(t, r);
12
- };
13
- function c(e) {
14
- return e ? typeof e != "string" ? String(e) : e.replace(/\s/g, "-").replace(/[A-Z](?:(?=[^A-Z])|[A-Z]*(?=[A-Z][^A-Z]|$))/g, (r, t) => (t > 0 ? "-" : "") + r.toLowerCase()) : "";
1
+ import { d as o, t as s } from "../dash-case-DMQMcCO6.js";
2
+ import { p as f } from "../pascal-case-BQpR5PdN.js";
3
+ function r(e) {
4
+ return e ? typeof e != "string" ? r(String(e)) : e.replace(/\s/g, "-").replace(/-([a-z])/g, (a) => a[1].toUpperCase()) : "";
15
5
  }
16
6
  export {
17
- c as dashCase,
7
+ r as camelCase,
8
+ o as dashCase,
9
+ f as pascalCase,
18
10
  s as toHash
19
11
  };
@@ -0,0 +1 @@
1
+ export declare function pascalCase(str: PropertyKey): string;
@@ -1,8 +0,0 @@
1
- "use strict";const O=require("./util/index.cjs"),K=(s,e)=>{if(typeof s!="string")return{result:s};if(!e)return{result:s};const r=[];return Object.values(e).forEach(n=>{const{pattern:o,transform:c}=n;s=s.replace(o,a=>{const{value:i,css:l}=c(a);return l&&r.push(l),i})}),{result:s,additionalCss:r}},k=s=>typeof s!="string"?{result:s}:/\{[^{}]+\}/g.test(s)?{result:s.replace(/\{([^{}]+)\}/g,(...n)=>`var(--${O.dashCase(n[1].replaceAll(".","-"))})`)}:{result:s},h=(s,e,r,n)=>{const o=[],c=Object.entries(s).reduce((i,[l,t])=>{const p=l.trim();if(typeof t=="function"&&(t=t()),typeof t=="object"){if(!t)return i;if(p==="variants")return Object.entries(t).forEach(([u,f])=>{f&&Object.entries(f).forEach(([m,j])=>{if(!j)return;const y=`${e}.${u}-${m}`,b=h(j,y,r);o.push(b)})}),i;if(p==="defaultVariants")return i;if(p==="compoundVariants")return t.forEach(u=>{const{css:f,...m}=u,j=Object.entries(m).reduce((b,[_,q])=>`${b}.${_}-${q}`,e),y=h(f,j,r);o.push(y)}),i;if(p.startsWith("@")){const u=h(t,e,r),f=`${p} {
2
- ${u.replace(`
3
- `,`
4
- `)}
5
- }`;return o.push(f),i}const $=l.includes("&")?p.replace("&",e):p.startsWith(":")?`${e}${p}`:`${e} ${p}`,d=h(t,$,r);return o.push(d),i}if(n!=null&&n.templates&&n.templates[p]){const d=t.split(".").reduce((f,m)=>f[m],n.templates[p]),u=h(d,"");return`${i}${u}`}const V=p.startsWith("-")?p:O.dashCase(p),T=($,d=";")=>i=`${i}${$}${d}`,S=$=>T(`${V}:${$}`);if(typeof t=="number")return S(t);if(typeof t!="string")if("toString"in t)t=t.toString();else return i;const{modifiers:g}=n||{},W=function*(){yield k(t),yield K(t,g)}();for(const{result:$,additionalCss:d=[]}of W)t=$,d.forEach(u=>{const f=h(u,"");T(f,"")});return S(t)},"");if(!c)return o.join(`
6
- `);if(!e)return c;let a="";return r!==void 0?a=`@layer l${r} { ${e} { ${c} } }`:a=`${e} { ${c} }`,[a,...o].join(`
7
- `)},E=(s,e=[])=>{const r=[],n={};if(Object.entries(s).forEach(([o,c])=>{if(typeof c=="object"){if(!c)return;const a=o.trim(),i=E(c,[...e,a]);r.push(i)}else n[o]=c}),Object.keys(n).length){const o=e.map(O.dashCase).join("-"),c=h(n,`.${o}`);r.push(c)}return r.join(`
8
- `)},N=s=>Object.keys(s);exports.getTemplateKeys=N;exports.parseStyles=h;exports.parseTemplates=E;exports.parseValueTokens=k;