@salty-css/core 0.4.5-alpha.0 → 0.4.5-fix-cli-astro-salty-config-dir.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkFpC,eAAO,MAAM,mBAAmB,GAAI,SAAS,OAAO,KAAG,IAgEtD,CAAC"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0EpC,eAAO,MAAM,mBAAmB,GAAI,SAAS,OAAO,KAAG,IA+DtD,CAAC"}
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- require("../main-BoqRA5gm.cjs").t().catch(e=>console.error(e));
2
+ require("../main-SbsZvhBP.cjs").t().catch(e=>console.error(e));
package/dist/bin/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as e } from "../main-v3rdDsFh.js";
2
+ import { t as e } from "../main-CfM-Yxwu.js";
3
3
  //#region src/bin/index.ts
4
4
  e().catch((e) => console.error(e));
5
5
  //#endregion
package/dist/bin/main.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../main-BoqRA5gm.cjs");exports.main=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../main-SbsZvhBP.cjs");exports.main=e.t;
package/dist/bin/main.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as e } from "../main-v3rdDsFh.js";
1
+ import { t as e } from "../main-CfM-Yxwu.js";
2
2
  export { e as main };
@@ -1,6 +1,5 @@
1
1
  declare const templateLoaders: {
2
2
  readonly 'salty.config.ts': () => Promise<typeof import("*__template")>;
3
- readonly 'styles/index.css': () => Promise<typeof import("*__template")>;
4
3
  readonly 'saltygen/index.css': () => Promise<typeof import("*__template")>;
5
4
  readonly 'react/styled-file.ts': () => Promise<typeof import("*__template")>;
6
5
  readonly 'react/vanilla-file.ts': () => Promise<typeof import("*__template")>;
@@ -9,7 +8,7 @@ declare const templateLoaders: {
9
8
  };
10
9
  export type TemplateKey = keyof typeof templateLoaders;
11
10
  export declare const readTemplate: <T extends object>(key: TemplateKey, options?: T) => Promise<{
12
- fileName: "salty.config.ts" | "styles/index.css" | "saltygen/index.css" | "react/styled-file.ts" | "react/vanilla-file.ts" | "astro/styled-file.ts" | "astro/component.astro";
11
+ fileName: "salty.config.ts" | "saltygen/index.css" | "react/styled-file.ts" | "react/vanilla-file.ts" | "astro/styled-file.ts" | "astro/component.astro";
13
12
  content: string;
14
13
  }>;
15
14
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/bin/templates.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,eAAe;;;;;;;;CAQX,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,eAAe,CAAC;AAEvD,eAAO,MAAM,YAAY,GAAU,CAAC,SAAS,MAAM,EAAE,KAAK,WAAW,EAAE,UAAU,CAAC;;;EAIjF,CAAC"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/bin/templates.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,eAAe;;;;;;;CAOX,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,eAAe,CAAC;AAEvD,eAAO,MAAM,YAAY,GAAU,CAAC,SAAS,MAAM,EAAE,KAAK,WAAW,EAAE,UAAU,CAAC;;;EAIjF,CAAC"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../salty-compiler-1LbXg6lw.cjs");exports.SaltyCompiler=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../salty-compiler-DSSJqdvl.cjs");exports.SaltyCompiler=e.t;
@@ -1,2 +1,2 @@
1
- import { t as e } from "../salty-compiler-u42y07vy.js";
1
+ import { t as e } from "../salty-compiler-COVGLJhR.js";
2
2
  export { e as SaltyCompiler };
@@ -1,4 +1,4 @@
1
- import { n as e, r as t, t as n } from "./salty-compiler-u42y07vy.js";
1
+ import { n as e, r as t, t as n } from "./salty-compiler-COVGLJhR.js";
2
2
  import { isSaltyFile as r } from "./compiler/helpers.js";
3
3
  import { pascalCase as i } from "./util/index.js";
4
4
  import { checkShouldRestart as a } from "./server/index.js";
@@ -51,7 +51,7 @@ async function O(e) {
51
51
  t.error(`Error formatting ${e} with Prettier:`, n);
52
52
  }
53
53
  }
54
- var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd()) => await m(k(e), "utf-8").then(JSON.parse).catch(() => ({})), j = async (e = process.cwd()) => m(k(e), "utf-8").catch(() => void 0), M = async (e = process.cwd()) => (await A(e)).defaultProject, te = (e, t, n, r = {}) => {
54
+ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd()) => await m(k(e), "utf-8").then(JSON.parse).catch(() => ({})), j = async (e = process.cwd()) => m(k(e), "utf-8").catch(() => void 0), M = async (e = process.cwd()) => (await A(e)).defaultProject, N = (e, t, n, r = {}) => {
55
55
  let i = u(t, n.srcDirectory), a = {
56
56
  dir: i,
57
57
  framework: n.name,
@@ -80,11 +80,11 @@ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd
80
80
  changed: c !== e,
81
81
  created: !1
82
82
  };
83
- }, N = async (e, n, r, i = {}) => {
84
- let a = k(e), { content: o, changed: s, created: c } = te(await j(e), n, r, i);
83
+ }, P = async (e, n, r, i = {}) => {
84
+ let a = k(e), { content: o, changed: s, created: c } = N(await j(e), n, r, i);
85
85
  return s ? (c ? t.info("Creating file: " + a) : t.info("Edit file: " + a), await h(a, o), await O(a), !0) : !1;
86
- }, P = (e, t) => (e.projects || []).find((e) => e.dir === t)?.framework, F = (e, t = process.cwd()) => u(t, e === "." ? "" : e), I = async (e) => {
87
- let t = process.cwd(), n = F(e.dir, t), r = f(t, n) || ".", i = await x().catch(() => void 0);
86
+ }, F = (e, t) => (e.projects || []).find((e) => e.dir === t)?.framework, I = (e, t = process.cwd()) => u(t, e === "." ? "" : e), L = async (e) => {
87
+ let t = process.cwd(), n = I(e.dir, t), r = f(t, n) || ".", i = await x().catch(() => void 0);
88
88
  if (e.requirePackageJson !== !1 && !i) throw Error("Salty CSS project must be initialized in a directory with a package.json file.");
89
89
  return {
90
90
  cwd: t,
@@ -96,31 +96,31 @@ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd
96
96
  skipInstall: !!e.skipInstall,
97
97
  yes: !!e.yes
98
98
  };
99
- }, ne = (i, o) => {
99
+ }, te = (i, o) => {
100
100
  i.command("build [directory]").alias("b").description("Build the Salty-CSS project.").option("-d, --dir <dir>", "Project directory to build the project in.").option("--watch", "Watch for changes and rebuild the project.").option("--mode <mode>", "Build mode: \"production\" or \"development\". Defaults to NODE_ENV-based detection.").action(async function(i = o) {
101
101
  t.info("Building the Salty-CSS project...");
102
102
  let { dir: s = i, watch: l, mode: u } = this.opts();
103
103
  if (u !== void 0 && u !== "production" && u !== "development") return e(`Invalid --mode "${u}". Expected "production" or "development".`);
104
104
  let d = s ?? await M();
105
105
  if (!d) return e("Project directory must be provided. Add it as the first argument after build command or use the --dir option.");
106
- let f = F(d), p = new n(f, { mode: u });
106
+ let f = I(d), p = new n(f, { mode: u });
107
107
  await p.generateCss(), l && (t.info("Watching for changes in the project directory..."), c(f, { recursive: !0 }, async (e, t) => {
108
108
  if (!t) return console.warn("File path not provided for change event");
109
109
  await a(t) ? await p.generateCss(!1) : r(t) && await p.generateFile(t);
110
110
  }));
111
111
  });
112
- }, re = [
112
+ }, ne = [
113
113
  "astro.config.mjs",
114
114
  "astro.config.ts",
115
115
  "astro.config.js",
116
116
  "astro.config.cjs"
117
- ], L = (e) => {
118
- for (let t of re) {
117
+ ], R = (e) => {
118
+ for (let t of ne) {
119
119
  let n = u(e, t);
120
120
  if (s(n)) return n;
121
121
  }
122
122
  return null;
123
- }, ie = (e) => {
123
+ }, z = (e) => {
124
124
  let t = e.packageJson;
125
125
  if (!t) return !1;
126
126
  let n = {
@@ -128,10 +128,10 @@ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd
128
128
  ...t.devDependencies
129
129
  };
130
130
  return Object.prototype.hasOwnProperty.call(n, "astro");
131
- }, R = {
131
+ }, B = {
132
132
  name: "astro",
133
133
  srcDirectory: "src",
134
- detect: (e) => !!L(e.projectDir) || ie(e),
134
+ detect: (e) => !!R(e.projectDir) || z(e),
135
135
  runtimePackage: (e) => `@salty-css/astro@${e}`,
136
136
  templates: {
137
137
  styled: "astro/styled-file.ts",
@@ -141,7 +141,7 @@ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd
141
141
  wrapperExt: ".astro"
142
142
  }
143
143
  }
144
- }, z = {
144
+ }, V = {
145
145
  name: "react",
146
146
  srcDirectory: "",
147
147
  detect: () => !0,
@@ -154,43 +154,42 @@ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd
154
154
  wrapperExt: ".tsx"
155
155
  }
156
156
  }
157
- }, B = [R, z], V = {
158
- astro: R,
159
- react: z
160
- }, H = async (e) => {
161
- for (let t of B) if (await t.detect(e)) return t;
162
- return z;
163
- }, U = (e) => {
164
- if (e) return V[e];
165
- }, W = {
157
+ }, H = [B, V], U = {
158
+ astro: B,
159
+ react: V
160
+ }, W = async (e) => {
161
+ for (let t of H) if (await t.detect(e)) return t;
162
+ return V;
163
+ }, G = (e) => {
164
+ if (e) return U[e];
165
+ }, K = {
166
166
  "salty.config.ts": () => import("./salty.config-DWF4i7K0.js"),
167
- "styles/index.css": () => import("./styles_index-CYo48NLy.js"),
168
- "saltygen/index.css": () => import("./saltygen_index-BoZSUsyA.js"),
167
+ "saltygen/index.css": () => import("./templates-DWWLjEiU.js"),
169
168
  "react/styled-file.ts": () => import("./styled-file-C_4eLAdV.js"),
170
169
  "react/vanilla-file.ts": () => import("./vanilla-file-BEqMIe-6.js"),
171
170
  "astro/styled-file.ts": () => import("./styled-file-DQHLzmuL.js"),
172
171
  "astro/component.astro": () => import("./astro-component-Ov1RH0CO.js")
173
- }, G = async (e, t) => {
174
- let { default: n } = await W[e]();
172
+ }, q = async (e, t) => {
173
+ let { default: n } = await K[e]();
175
174
  return {
176
175
  fileName: e,
177
176
  content: v.render(n, t)
178
177
  };
179
- }, K = (n, r) => {
178
+ }, J = (n, r) => {
180
179
  n.command("generate [file] [directory]").alias("g").description("Generate a new component file.").option("-f, --file <file>", "File to generate.").option("-d, --dir <dir>", "Project directory to generate the file in.").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.").option("-r, --reactComponent", "Generate a wrapper component file alongside the styled definition.").action(async function(n, a = r) {
181
180
  let { file: o = n, dir: s = a, tag: c, name: f, className: g, reactComponent: _ = !1 } = this.opts();
182
181
  if (!o) return e("File to generate must be provided. Add it as the first argument after generate command or use the --file option.");
183
182
  if (!s) return e("Project directory must be provided. Add it as the second argument after generate command or use the --dir option.");
184
183
  let v;
185
184
  try {
186
- v = await I({
185
+ v = await L({
187
186
  dir: s,
188
187
  requirePackageJson: !1
189
188
  });
190
189
  } catch (t) {
191
190
  return e(t instanceof Error ? t.message : String(t));
192
191
  }
193
- let y = U(P(v.rcFile, v.relativeProjectPath)) ?? await H(v), b = o.split("/").slice(0, -1).join("/");
192
+ let y = G(F(v.rcFile, v.relativeProjectPath)) ?? await W(v), b = o.split("/").slice(0, -1).join("/");
194
193
  b && await p(u(v.projectDir, b), { recursive: !0 });
195
194
  let x = d(u(v.projectDir, o));
196
195
  x.ext ||= ".ts", x.name.endsWith(".css") || (x.name += ".css"), x.base = x.name + x.ext;
@@ -204,7 +203,7 @@ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd
204
203
  if (!y.templates.component) return e(`--reactComponent is not supported for the ${y.name} framework.`);
205
204
  let n = C + "Component";
206
205
  C += "Wrapper";
207
- let r = x.base.replace(/\.css\.\w+$/, ""), { content: i } = await G(y.templates.component.wrapper, {
206
+ let r = x.base.replace(/\.css\.\w+$/, ""), { content: i } = await q(y.templates.component.wrapper, {
208
207
  tag: c,
209
208
  componentName: n,
210
209
  styledComponentName: C,
@@ -215,21 +214,21 @@ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd
215
214
  let a = l(x);
216
215
  t.info("Generating a new file: " + a), await h(a, i), await O(a);
217
216
  }
218
- let { content: w } = await G(_ && y.templates.component ? y.templates.component.styled : y.templates.styled, {
217
+ let { content: w } = await q(_ && y.templates.component ? y.templates.component.styled : y.templates.styled, {
219
218
  tag: c,
220
219
  name: C,
221
220
  className: g
222
221
  });
223
222
  t.info("Generating a new file: " + S), await h(S, w), await O(S);
224
223
  });
225
- }, q = (e) => {
224
+ }, Y = (e) => {
226
225
  let t = e.trim();
227
226
  return t.startsWith("-D ") ? `${t.slice(3).trim()} (dev)` : t;
228
- }, J = (e) => e.map((e) => ` + ${q(e)}`).join("\n"), Y = async (e, t, n = {}) => {
227
+ }, X = (e) => e.map((e) => ` + ${Y(e)}`).join("\n"), Z = async (e, t, n = {}) => {
229
228
  if (t || e.length === 0) return;
230
229
  let r = n.input ?? process.stdin, i = n.output ?? process.stdout;
231
230
  if (!(n.isTTY ?? process.stdin.isTTY ?? !1)) throw Error("Cannot prompt for install confirmation: stdin is not a TTY. Re-run with --yes to install the listed packages without prompting.");
232
- i.write(`The following packages will be installed:\n${J(e)}\n`);
231
+ i.write(`The following packages will be installed:\n${X(e)}\n`);
233
232
  let a = y({
234
233
  input: r,
235
234
  output: i,
@@ -241,7 +240,7 @@ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd
241
240
  } finally {
242
241
  a.close();
243
242
  }
244
- }, X = async (e, t = {}) => {
243
+ }, re = async (e, t = {}) => {
245
244
  if (t.yes) return !0;
246
245
  let n = t.input ?? process.stdin, r = t.output ?? process.stdout;
247
246
  if (!(t.isTTY ?? process.stdin.isTTY ?? !1)) return !1;
@@ -256,67 +255,67 @@ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd
256
255
  } finally {
257
256
  a.close();
258
257
  }
259
- }, ae = [
258
+ }, ie = [
260
259
  "src",
261
260
  "public",
262
261
  "assets",
263
262
  "styles",
264
263
  "css",
265
264
  "app"
266
- ], oe = [
265
+ ], ae = [
267
266
  "styles",
268
267
  "css",
269
268
  "app",
270
269
  "pages"
271
- ], se = [
270
+ ], oe = [
272
271
  "index",
273
272
  "styles",
274
273
  "main",
275
274
  "app",
276
275
  "global",
277
276
  "globals"
278
- ], ce = [
277
+ ], se = [
279
278
  ".css",
280
279
  ".scss",
281
280
  ".sass"
282
- ], le = async (e) => {
283
- for (let t of ae) for (let n of se) for (let r of ce) {
281
+ ], ce = async (e) => {
282
+ for (let t of ie) for (let n of oe) for (let r of se) {
284
283
  let i = u(e, t, n + r);
285
284
  if (await m(i, "utf-8").catch(() => void 0) !== void 0) return f(e, i);
286
- for (let i of oe) {
285
+ for (let i of ae) {
287
286
  let a = u(e, t, i, n + r);
288
287
  if (await m(a, "utf-8").catch(() => void 0) !== void 0) return f(e, a);
289
288
  }
290
289
  }
291
- }, ue = (e) => `@salty-css/astro@${e}`, de = "import saltyIntegration from '@salty-css/astro/integration';\n", fe = (e) => {
290
+ }, le = (e) => `@salty-css/astro@${e}`, ue = "import saltyIntegration from '@salty-css/astro/integration';\n", de = (e) => {
292
291
  if (e.includes("@salty-css/astro")) return { content: null };
293
292
  let t = e, n = !1;
294
- return /integrations\s*:\s*\[/.test(t) ? (t = t.replace(/integrations\s*:\s*\[/, (e) => `${e}saltyIntegration(),`), n = !0) : /defineConfig\s*\(\s*\{/.test(t) && (t = t.replace(/defineConfig\s*\(\s*\{/, (e) => `${e}\n integrations: [saltyIntegration()],`), n = !0), n ? { content: de + t } : {
293
+ return /integrations\s*:\s*\[/.test(t) ? (t = t.replace(/integrations\s*:\s*\[/, (e) => `${e}saltyIntegration(),`), n = !0) : /defineConfig\s*\(\s*\{/.test(t) && (t = t.replace(/defineConfig\s*\(\s*\{/, (e) => `${e}\n integrations: [saltyIntegration()],`), n = !0), n ? { content: ue + t } : {
295
294
  content: null,
296
295
  warning: "Could not find a place to add saltyIntegration() in the Astro config. Please add it manually."
297
296
  };
298
- }, pe = {
297
+ }, fe = {
299
298
  name: "astro",
300
- detect: (e) => L(e.projectDir),
299
+ detect: (e) => R(e.projectDir),
301
300
  plan: async (e, n) => {
302
301
  let r = await m(n, "utf-8").catch(() => void 0);
303
302
  if (r === void 0) return null;
304
- let i = fe(r);
303
+ let i = de(r);
305
304
  if (i.warning && t.warn(i.warning), i.content === null) return null;
306
305
  let a = i.content;
307
306
  return {
308
- packages: [`-D ${ue(e.cliVersion)}`],
307
+ packages: [`-D ${le(e.cliVersion)}`],
309
308
  execute: async () => (t.info("Adding Salty-CSS integration to Astro config: " + n), await h(n, a), await O(n), { changed: !0 })
310
309
  };
311
310
  }
312
- }, me = [
311
+ }, pe = [
313
312
  ["projectJs", "eslint.config.js"],
314
313
  ["rootJs", "eslint.config.js"],
315
314
  ["projectMjs", "eslint.config.mjs"],
316
315
  ["rootMjs", "eslint.config.mjs"],
317
316
  ["projectJson", ".eslintrc.json"],
318
317
  ["rootJson", ".eslintrc.json"]
319
- ], he = (e, t) => me.map(([n, r]) => u(n.startsWith("root") ? t : e, r)), ge = (e, t) => {
318
+ ], me = (e, t) => pe.map(([n, r]) => u(n.startsWith("root") ? t : e, r)), he = (e, t) => {
320
319
  if (e.includes("salty-css")) return { content: null };
321
320
  if (t) {
322
321
  let t = `import saltyCss from "@salty-css/eslint-config-core/flat";\n${e}`;
@@ -335,13 +334,13 @@ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd
335
334
  }
336
335
  let n = JSON.parse(e);
337
336
  return n.extends ||= [], n.extends.includes("@salty-css/core") || n.extends.push("@salty-css/core"), { content: JSON.stringify(n, null, 2) };
338
- }, _e = {
337
+ }, ge = {
339
338
  name: "eslint",
340
- detect: (e) => he(e.projectDir, e.cwd).find((e) => s(e)) ?? null,
339
+ detect: (e) => me(e.projectDir, e.cwd).find((e) => s(e)) ?? null,
341
340
  plan: async (e, n) => {
342
341
  let r = await m(n, "utf-8").catch(() => void 0);
343
342
  if (r === void 0) return t.error("Could not read ESLint config file."), null;
344
- let i = ge(r, n.endsWith("js"));
343
+ let i = he(r, n.endsWith("js"));
345
344
  if (i.warning && t.warn(i.warning), i.content === null) return null;
346
345
  let a = i.content;
347
346
  return {
@@ -349,31 +348,31 @@ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd
349
348
  execute: async () => (t.info("Edit file: " + n), await h(n, a), await O(n), { changed: !0 })
350
349
  };
351
350
  }
352
- }, ve = [
351
+ }, _e = [
353
352
  "next.config.js",
354
353
  "next.config.cjs",
355
354
  "next.config.ts",
356
355
  "next.config.mjs"
357
- ], ye = (e) => `@salty-css/next@${e}`, be = (e) => {
356
+ ], ve = (e) => `@salty-css/next@${e}`, ye = (e) => {
358
357
  if (e.includes("withSaltyCss")) return { content: null };
359
358
  let t = e, n = !1;
360
359
  /\splugins([^=]*)=[^[]\[/.test(t) && (t = t.replace(/\splugins([^=]*)=[^[]\[/, (e, t) => ` plugins${t}= [withSaltyCss,`), n = !0);
361
360
  let r = t.includes("module.exports"), i = r ? "const { withSaltyCss } = require('@salty-css/next');\n" : "import { withSaltyCss } from '@salty-css/next';\n";
362
361
  return r && !n ? (t = t.replace(/module.exports = ([^;]+)/, (e, t) => `module.exports = withSaltyCss(${t})`), n = !0) : n || (t = t.replace(/export default ([^;]+)/, (e, t) => `export default withSaltyCss(${t})`)), { content: i + t };
363
- }, xe = {
362
+ }, be = {
364
363
  name: "next",
365
- detect: (e) => ve.map((t) => u(e.projectDir, t)).find((e) => s(e)) ?? null,
364
+ detect: (e) => _e.map((t) => u(e.projectDir, t)).find((e) => s(e)) ?? null,
366
365
  plan: async (e, n) => {
367
366
  let r = await m(n, "utf-8").catch(() => void 0);
368
367
  if (r === void 0) return null;
369
- let { content: i } = be(r);
368
+ let { content: i } = ye(r);
370
369
  return i === null ? null : {
371
- packages: [`-D ${ye(e.cliVersion)}`],
370
+ packages: [`-D ${ve(e.cliVersion)}`],
372
371
  execute: async () => (t.info("Adding Salty-CSS plugin to Next.js config..."), await h(n, i), await O(n), { changed: !0 })
373
372
  };
374
373
  }
375
- }, Se = (e) => `@salty-css/vite@${e}`, Ce = (e) => e.includes("saltyPlugin") ? { content: null } : { content: "import { saltyPlugin } from '@salty-css/vite';\n" + e.replace(/(plugins: \[)/, "$1\n saltyPlugin(__dirname),") }, we = [
376
- _e,
374
+ }, xe = (e) => `@salty-css/vite@${e}`, Se = (e) => e.includes("saltyPlugin") ? { content: null } : { content: "import { saltyPlugin } from '@salty-css/vite';\n" + e.replace(/(plugins: \[)/, "$1\n saltyPlugin(__dirname),") }, Ce = [
375
+ ge,
377
376
  {
378
377
  name: "vite",
379
378
  detect: (e) => {
@@ -383,18 +382,18 @@ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd
383
382
  plan: async (e, n) => {
384
383
  let r = await m(n, "utf-8").catch(() => void 0);
385
384
  if (r === void 0) return null;
386
- let { content: i } = Ce(r);
385
+ let { content: i } = Se(r);
387
386
  return i === null ? null : {
388
- packages: [`-D ${Se(e.cliVersion)}`],
387
+ packages: [`-D ${xe(e.cliVersion)}`],
389
388
  execute: async () => (t.info("Edit file: " + n), t.info("Adding Salty-CSS plugin to Vite config..."), await h(n, i), await O(n), { changed: !0 })
390
389
  };
391
390
  }
392
391
  },
393
- xe,
394
- pe
395
- ], Te = async (e) => {
392
+ be,
393
+ fe
394
+ ], we = async (e) => {
396
395
  let t = [];
397
- for (let n of we) {
396
+ for (let n of Ce) {
398
397
  let r = await n.detect(e);
399
398
  if (!r) continue;
400
399
  let i = await n.plan(e, r);
@@ -405,7 +404,7 @@ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd
405
404
  });
406
405
  }
407
406
  return t;
408
- }, Ee = async (e) => {
407
+ }, Te = async (e) => {
409
408
  let t = [];
410
409
  for (let { name: n, configPath: r, plan: i } of e) {
411
410
  let e = await i.execute();
@@ -416,14 +415,14 @@ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd
416
415
  });
417
416
  }
418
417
  return t;
419
- }, De = {
418
+ }, Ee = {
420
419
  vite: ["dist/**"],
421
420
  next: [".next/**", "out/**"]
422
- }, Oe = ({ framework: e, integrations: t, hasSrcDir: n }) => {
421
+ }, De = ({ framework: e, integrations: t, hasSrcDir: n }) => {
423
422
  if (e === "astro") return {};
424
- let r = [...new Set(t.flatMap((e) => De[e] ?? []))], i = {};
423
+ let r = [...new Set(t.flatMap((e) => Ee[e] ?? []))], i = {};
425
424
  return n && (i.include = ["src/**"]), r.length && (i.exclude = r), i;
426
- }, Z = async (e, n, r) => {
425
+ }, Oe = async (e, n, r) => {
427
426
  let i = u(e, n);
428
427
  if (s(i)) {
429
428
  t.debug("File already exists: " + i);
@@ -435,14 +434,9 @@ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd
435
434
  let n = u(e, ".gitignore"), r = await m(n, "utf-8").catch(() => void 0);
436
435
  r !== void 0 && (r.includes("saltygen") || (t.info("Edit file: " + n), await h(n, r + "\n\n# Salty-CSS\nsaltygen\n")));
437
436
  }, ke = async (e, n) => {
438
- let r = n ?? await le(e);
437
+ let r = n ?? await ce(e);
439
438
  if (!r) {
440
- if (!await X("Could not find a CSS file to import the generated CSS. Do you want to create a new `styles/index.css` file and import it there? (y/N) ")) {
441
- t.warn("Could not find a CSS file to import the generated CSS. Please add it manually.");
442
- return;
443
- }
444
- let { fileName: n, content: r } = await G("styles/index.css");
445
- await Z(e, n, r);
439
+ t.warn("Could not find a CSS file to import the generated CSS. Please add it manually.");
446
440
  return;
447
441
  }
448
442
  let i = u(e, r), a = await m(i, "utf-8").catch(() => void 0);
@@ -461,31 +455,31 @@ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd
461
455
  try {
462
456
  let i = this.opts(), a = i.dir ?? r;
463
457
  if (!a) return e("Project directory must be provided. Add it as the first argument after init command or use the --dir option.");
464
- let o = await I({
458
+ let o = await L({
465
459
  dir: a,
466
460
  skipInstall: i.skipInstall,
467
461
  yes: i.yes
468
462
  });
469
463
  t.info("Initializing a new Salty-CSS project!");
470
- let c = await H(o);
464
+ let c = await W(o);
471
465
  t.info(`Detected framework: ${c.name}`);
472
- let l = await Te(o);
466
+ let l = await we(o);
473
467
  if (!o.skipInstall) {
474
468
  let e = [
475
469
  w.core(o.cliVersion),
476
470
  c.runtimePackage(o.cliVersion),
477
471
  ...l.flatMap((e) => e.plan.packages)
478
472
  ];
479
- await Y(e, o.yes), await D(...e);
473
+ await Z(e, o.yes), await D(...e);
480
474
  }
481
- let d = await Promise.all([G("salty.config.ts"), G("saltygen/index.css")]), f = u(o.projectDir, c.srcDirectory);
482
- await p(f, { recursive: !0 }), await Promise.all(d.map(({ fileName: e, content: t }) => Z(f, e, t)));
483
- let m = Oe({
475
+ let d = await Promise.all([q("salty.config.ts"), q("saltygen/index.css")]);
476
+ await p(o.projectDir, { recursive: !0 }), await Promise.all(d.map(({ fileName: e, content: t }) => Oe(u(o.projectDir, c.srcDirectory), e, t)));
477
+ let f = De({
484
478
  framework: c.name,
485
479
  integrations: l.map((e) => e.name),
486
480
  hasSrcDir: s(u(o.projectDir, "src"))
487
481
  });
488
- await N(o.cwd, o.relativeProjectPath, c, m), await Q(o.cwd), await ke(f, i.cssFile), await Ee(l), await Ae(), t.info("Running the build to generate initial CSS..."), await new n(f).generateCss(), t.info("🎉 Salty CSS project initialized successfully!"), t.info("Next steps:"), t.info("1. Configure variables and templates in `salty.config.ts`"), t.info("2. Create a new component with `npx salty-css generate [component-name]`"), t.info("3. Run `npx salty-css build` to generate the CSS"), t.info("4. Read about the features in the documentation: https://salty-css.dev"), t.info("5. Star the project on GitHub: https://github.com/margarita-form/salty-css ⭐");
482
+ await P(o.cwd, o.relativeProjectPath, c, f), await Q(o.cwd), await ke(o.projectDir, i.cssFile), await Te(l), await Ae(), t.info("Running the build to generate initial CSS..."), await new n(o.projectDir).generateCss(), t.info("🎉 Salty CSS project initialized successfully!"), t.info("Next steps:"), t.info("1. Configure variables and templates in `salty.config.ts`"), t.info("2. Create a new component with `npx salty-css generate [component-name]`"), t.info("3. Run `npx salty-css build` to generate the CSS"), t.info("4. Read about the features in the documentation: https://salty-css.dev"), t.info("5. Star the project on GitHub: https://github.com/margarita-form/salty-css ⭐");
489
483
  } catch (t) {
490
484
  return e(t instanceof Error ? t.message : String(t));
491
485
  }
@@ -504,7 +498,7 @@ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd
504
498
  if (!c) return e("Could not update Salty-CSS packages as any were found in package.json.");
505
499
  let l = await C(), u = c.map(([e]) => a === "@" ? `${e}@${l.version}` : `${e}@${a.replace(/^@/, "")}`);
506
500
  try {
507
- await Y(u, o);
501
+ await Z(u, o);
508
502
  } catch (t) {
509
503
  return e(t instanceof Error ? t.message : String(t));
510
504
  }
@@ -521,8 +515,8 @@ var k = (e = process.cwd()) => u(e, ".saltyrc.json"), A = async (e = process.cwd
521
515
  t.warn("Skipping rebuild: no project directory configured. Run `salty-css build [dir]` manually.");
522
516
  return;
523
517
  }
524
- if (!await X("Rebuild Salty CSS now?", { yes: o })) return;
525
- let m = F(p);
518
+ if (!await re("Rebuild Salty CSS now?", { yes: o })) return;
519
+ let m = I(p);
526
520
  t.info("Rebuilding Salty-CSS project..."), await new n(m).generateCss(), t.info("Rebuild complete.");
527
521
  });
528
522
  }, Ne = (n) => {
@@ -545,7 +539,7 @@ async function Pe() {
545
539
  let e = new o();
546
540
  e.name("salty-css").description("Salty-CSS CLI tool to help with annoying configuration tasks.");
547
541
  let t = await M();
548
- je(e), Me(e), Ne(e), ne(e, t), K(e, t), e.parseAsync(process.argv);
542
+ je(e), Me(e), Ne(e), te(e, t), J(e, t), e.parseAsync(process.argv);
549
543
  }
550
544
  //#endregion
551
545
  export { Pe as t };
@@ -0,0 +1,11 @@
1
+ const e=require("./chunk-CMqjfN_6.cjs"),t=require("./salty-compiler-DSSJqdvl.cjs"),n=require("./compiler/helpers.cjs"),r=require("./util/index.cjs"),i=require("./server/index.cjs");let a=require("commander"),o=require("fs"),s=require("path"),c=require("fs/promises"),l=require("child_process"),u=require("ora");u=e.t(u,1);let d=require("ejs");d=e.t(d,1);let f=require("readline/promises");var p=(0,s.join)(process.cwd(),`package.json`),m=async(e=p)=>{let t=await(0,c.readFile)(e,`utf-8`).then(JSON.parse).catch(()=>void 0);if(!t)throw`Could not read package.json file!`;return t},h=async(e,t=p)=>{typeof e==`object`&&(e=JSON.stringify(e,null,2)),await(0,c.writeFile)(t,e)},g=async()=>m(new URL(`../package.json`,``+{}.url)),_={core:e=>`@salty-css/core@${e}`,eslintConfigCore:e=>`@salty-css/eslint-config-core@${e}`},v=e=>{e.scripts||={};let t=e.scripts.prepare;if(t){if(t.includes(`salty-css`))return{changed:!1,pkg:e};e.scripts.prepare=t+` && npx salty-css build`}else e.scripts.prepare=`npx salty-css build`;return{changed:!0,pkg:e}},y=e=>new Promise((t,n)=>{(0,l.exec)(e,e=>{if(e)return n(e);t()})}),b=async(...e)=>{let t=e.map(e=>e.replace(`-D`,``).split(`@`).slice(0,-1).join(`@`).trim()).join(`, `),n=(0,u.default)(`Installing packages: ${t}`).start();await y(`npm install ${e.join(` `)}`),n.succeed(`Installed packages: ${t}`)},x=()=>(0,o.existsSync)((0,s.join)(process.cwd(),`node_modules`,`.bin`,`prettier`));async function S(e){try{if(!x())return;await y(`./node_modules/.bin/prettier --write "${e}"`),t.r.info(`Formatted ${e} with Prettier`)}catch(n){t.r.error(`Error formatting ${e} with Prettier:`,n)}}var C=(e=process.cwd())=>(0,s.join)(e,`.saltyrc.json`),w=async(e=process.cwd())=>await(0,c.readFile)(C(e),`utf-8`).then(JSON.parse).catch(()=>({})),T=async(e=process.cwd())=>(0,c.readFile)(C(e),`utf-8`).catch(()=>void 0),E=async(e=process.cwd())=>(await w(e)).defaultProject,D=(e,t,n,r={})=>{let i=(0,s.join)(t,n.srcDirectory),a={dir:i,framework:n.name,...r};if(e===void 0)return{content:JSON.stringify({$schema:`./node_modules/@salty-css/core/.saltyrc.schema.json`,info:`This file is used to define projects and their configurations for Salty CSS cli. Do not delete, modify or add this file to .gitignore.`,defaultProject:i,projects:[a]},null,2),changed:!0,created:!0};let o=JSON.parse(e),c=o.projects||[];if(c.some(e=>e.dir===i))return{content:e,changed:!1,created:!1};c.push(a),o.projects=[...c];let l=JSON.stringify(o,null,2);return{content:l,changed:l!==e,created:!1}},O=async(e,n,r,i={})=>{let a=C(e),{content:o,changed:s,created:l}=D(await T(e),n,r,i);return s?(l?t.r.info(`Creating file: `+a):t.r.info(`Edit file: `+a),await(0,c.writeFile)(a,o),await S(a),!0):!1},ee=(e,t)=>(e.projects||[]).find(e=>e.dir===t)?.framework,k=(e,t=process.cwd())=>(0,s.join)(t,e===`.`?``:e),A=async e=>{let t=process.cwd(),n=k(e.dir,t),r=(0,s.relative)(t,n)||`.`,i=await m().catch(()=>void 0);if(e.requirePackageJson!==!1&&!i)throw Error(`Salty CSS project must be initialized in a directory with a package.json file.`);return{cwd:t,projectDir:n,relativeProjectPath:r,packageJson:i,rcFile:await w(t),cliVersion:(await g()).version||`0.0.0`,skipInstall:!!e.skipInstall,yes:!!e.yes}},j=(e,r)=>{e.command(`build [directory]`).alias(`b`).description(`Build the Salty-CSS project.`).option(`-d, --dir <dir>`,`Project directory to build the project in.`).option(`--watch`,`Watch for changes and rebuild the project.`).option(`--mode <mode>`,`Build mode: "production" or "development". Defaults to NODE_ENV-based detection.`).action(async function(e=r){t.r.info(`Building the Salty-CSS project...`);let{dir:a=e,watch:s,mode:c}=this.opts();if(c!==void 0&&c!==`production`&&c!==`development`)return t.n(`Invalid --mode "${c}". Expected "production" or "development".`);let l=a??await E();if(!l)return t.n(`Project directory must be provided. Add it as the first argument after build command or use the --dir option.`);let u=k(l),d=new t.t(u,{mode:c});await d.generateCss(),s&&(t.r.info(`Watching for changes in the project directory...`),(0,o.watch)(u,{recursive:!0},async(e,t)=>{if(!t)return console.warn(`File path not provided for change event`);await i.checkShouldRestart(t)?await d.generateCss(!1):n.isSaltyFile(t)&&await d.generateFile(t)}))})},M=[`astro.config.mjs`,`astro.config.ts`,`astro.config.js`,`astro.config.cjs`],N=e=>{for(let t of M){let n=(0,s.join)(e,t);if((0,o.existsSync)(n))return n}return null},te=e=>{let t=e.packageJson;if(!t)return!1;let n={...t.dependencies,...t.devDependencies};return Object.prototype.hasOwnProperty.call(n,`astro`)},P={name:`astro`,srcDirectory:`src`,detect:e=>!!N(e.projectDir)||te(e),runtimePackage:e=>`@salty-css/astro@${e}`,templates:{styled:`astro/styled-file.ts`,component:{styled:`astro/styled-file.ts`,wrapper:`astro/component.astro`,wrapperExt:`.astro`}}},F={name:`react`,srcDirectory:``,detect:()=>!0,runtimePackage:e=>`@salty-css/react@${e}`,templates:{styled:`react/styled-file.ts`,component:{styled:`react/styled-file.ts`,wrapper:`react/vanilla-file.ts`,wrapperExt:`.tsx`}}},I=[P,F],L={astro:P,react:F},R=async e=>{for(let t of I)if(await t.detect(e))return t;return F},z=e=>{if(e)return L[e]},B={"salty.config.ts":()=>Promise.resolve().then(()=>require("./salty.config-B0ZiRpHR.cjs")),"saltygen/index.css":()=>Promise.resolve().then(()=>require("./templates-BGHLaAOm.cjs")),"react/styled-file.ts":()=>Promise.resolve().then(()=>require("./styled-file-BCbAEzBB.cjs")),"react/vanilla-file.ts":()=>Promise.resolve().then(()=>require("./vanilla-file-Z3VsOa_U.cjs")),"astro/styled-file.ts":()=>Promise.resolve().then(()=>require("./styled-file-DorArlCk.cjs")),"astro/component.astro":()=>Promise.resolve().then(()=>require("./astro-component-r0qEcF1p.cjs"))},V=async(e,t)=>{let{default:n}=await B[e]();return{fileName:e,content:d.default.render(n,t)}},H=(e,n)=>{e.command(`generate [file] [directory]`).alias(`g`).description(`Generate a new component file.`).option(`-f, --file <file>`,`File to generate.`).option(`-d, --dir <dir>`,`Project directory to generate the file in.`).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.`).option(`-r, --reactComponent`,`Generate a wrapper component file alongside the styled definition.`).action(async function(e,i=n){let{file:a=e,dir:o=i,tag:l,name:u,className:d,reactComponent:f=!1}=this.opts();if(!a)return t.n(`File to generate must be provided. Add it as the first argument after generate command or use the --file option.`);if(!o)return t.n(`Project directory must be provided. Add it as the second argument after generate command or use the --dir option.`);let p;try{p=await A({dir:o,requirePackageJson:!1})}catch(e){return t.n(e instanceof Error?e.message:String(e))}let m=z(ee(p.rcFile,p.relativeProjectPath))??await R(p),h=a.split(`/`).slice(0,-1).join(`/`);h&&await(0,c.mkdir)((0,s.join)(p.projectDir,h),{recursive:!0});let g=(0,s.parse)((0,s.join)(p.projectDir,a));g.ext||=`.ts`,g.name.endsWith(`.css`)||(g.name+=`.css`),g.base=g.name+g.ext;let _=(0,s.format)(g);if(await(0,c.readFile)(_,`utf-8`).catch(()=>void 0)!==void 0){t.r.error(`File already exists: `+_);return}let v=r.pascalCase(u||g.base.replace(/\.css\.\w+$/,``));if(f){if(!m.templates.component)return t.n(`--reactComponent is not supported for the ${m.name} framework.`);let e=v+`Component`;v+=`Wrapper`;let n=g.base.replace(/\.css\.\w+$/,``),{content:r}=await V(m.templates.component.wrapper,{tag:l,componentName:e,styledComponentName:v,className:d,fileName:n});g.name=n.replace(/\.css$/,``),g.ext=m.templates.component.wrapperExt,g.base=g.name+g.ext;let i=(0,s.format)(g);t.r.info(`Generating a new file: `+i),await(0,c.writeFile)(i,r),await S(i)}let{content:y}=await V(f&&m.templates.component?m.templates.component.styled:m.templates.styled,{tag:l,name:v,className:d});t.r.info(`Generating a new file: `+_),await(0,c.writeFile)(_,y),await S(_)})},U=e=>{let t=e.trim();return t.startsWith(`-D `)?`${t.slice(3).trim()} (dev)`:t},W=e=>e.map(e=>` + ${U(e)}`).join(`
2
+ `),G=async(e,t,n={})=>{if(t||e.length===0)return;let r=n.input??process.stdin,i=n.output??process.stdout;if(!(n.isTTY??process.stdin.isTTY??!1))throw Error(`Cannot prompt for install confirmation: stdin is not a TTY. Re-run with --yes to install the listed packages without prompting.`);i.write(`The following packages will be installed:\n${W(e)}\n`);let a=(0,f.createInterface)({input:r,output:i,terminal:!1});try{let e=(await a.question(`Proceed? (y/N) `)).trim().toLowerCase();if(e!==`y`&&e!==`yes`)throw Error(`Install cancelled by user.`)}finally{a.close()}},K=async(e,t={})=>{if(t.yes)return!0;let n=t.input??process.stdin,r=t.output??process.stdout;if(!(t.isTTY??process.stdin.isTTY??!1))return!1;let i=t.defaultYes?`(Y/n)`:`(y/N)`,a=(0,f.createInterface)({input:n,output:r,terminal:!1});try{let n=(await a.question(`${e} ${i} `)).trim().toLowerCase();return n===``?!!t.defaultYes:n===`y`||n===`yes`}finally{a.close()}},q=[`src`,`public`,`assets`,`styles`,`css`,`app`],J=[`styles`,`css`,`app`,`pages`],Y=[`index`,`styles`,`main`,`app`,`global`,`globals`],X=[`.css`,`.scss`,`.sass`],Z=async e=>{for(let t of q)for(let n of Y)for(let r of X){let i=(0,s.join)(e,t,n+r);if(await(0,c.readFile)(i,`utf-8`).catch(()=>void 0)!==void 0)return(0,s.relative)(e,i);for(let i of J){let a=(0,s.join)(e,t,i,n+r);if(await(0,c.readFile)(a,`utf-8`).catch(()=>void 0)!==void 0)return(0,s.relative)(e,a)}}},Q=e=>`@salty-css/astro@${e}`,ne=`import saltyIntegration from '@salty-css/astro/integration';
3
+ `,re=e=>{if(e.includes(`@salty-css/astro`))return{content:null};let t=e,n=!1;return/integrations\s*:\s*\[/.test(t)?(t=t.replace(/integrations\s*:\s*\[/,e=>`${e}saltyIntegration(),`),n=!0):/defineConfig\s*\(\s*\{/.test(t)&&(t=t.replace(/defineConfig\s*\(\s*\{/,e=>`${e}\n integrations: [saltyIntegration()],`),n=!0),n?{content:ne+t}:{content:null,warning:`Could not find a place to add saltyIntegration() in the Astro config. Please add it manually.`}},ie={name:`astro`,detect:e=>N(e.projectDir),plan:async(e,n)=>{let r=await(0,c.readFile)(n,`utf-8`).catch(()=>void 0);if(r===void 0)return null;let i=re(r);if(i.warning&&t.r.warn(i.warning),i.content===null)return null;let a=i.content;return{packages:[`-D ${Q(e.cliVersion)}`],execute:async()=>(t.r.info(`Adding Salty-CSS integration to Astro config: `+n),await(0,c.writeFile)(n,a),await S(n),{changed:!0})}}},ae=[[`projectJs`,`eslint.config.js`],[`rootJs`,`eslint.config.js`],[`projectMjs`,`eslint.config.mjs`],[`rootMjs`,`eslint.config.mjs`],[`projectJson`,`.eslintrc.json`],[`rootJson`,`.eslintrc.json`]],oe=(e,t)=>ae.map(([n,r])=>(0,s.join)(n.startsWith(`root`)?t:e,r)),se=(e,t)=>{if(e.includes(`salty-css`))return{content:null};if(t){let t=`import saltyCss from "@salty-css/eslint-config-core/flat";\n${e}`;if(e.includes(`typescript-eslint`))if(t.includes(`.config(`))t=t.replace(`.config(`,`.config(saltyCss,`);else return{content:null,warning:`Could not find the correct place to add the Salty-CSS config for ESLint. Please add it manually.`};else if(t.includes(`export default [`))t=t.replace(`export default [`,`export default [ saltyCss,`);else if(t.includes(`eslintConfig = [`))t=t.replace(`eslintConfig = [`,`eslintConfig = [ saltyCss,`);else return{content:null,warning:`Could not find the correct place to add the Salty-CSS config for ESLint. Please add it manually.`};return{content:t}}let n=JSON.parse(e);return n.extends||=[],n.extends.includes(`@salty-css/core`)||n.extends.push(`@salty-css/core`),{content:JSON.stringify(n,null,2)}},ce={name:`eslint`,detect:e=>oe(e.projectDir,e.cwd).find(e=>(0,o.existsSync)(e))??null,plan:async(e,n)=>{let r=await(0,c.readFile)(n,`utf-8`).catch(()=>void 0);if(r===void 0)return t.r.error(`Could not read ESLint config file.`),null;let i=se(r,n.endsWith(`js`));if(i.warning&&t.r.warn(i.warning),i.content===null)return null;let a=i.content;return{packages:[_.eslintConfigCore(e.cliVersion)],execute:async()=>(t.r.info(`Edit file: `+n),await(0,c.writeFile)(n,a),await S(n),{changed:!0})}}},le=[`next.config.js`,`next.config.cjs`,`next.config.ts`,`next.config.mjs`],ue=e=>`@salty-css/next@${e}`,de=e=>{if(e.includes(`withSaltyCss`))return{content:null};let t=e,n=!1;/\splugins([^=]*)=[^[]\[/.test(t)&&(t=t.replace(/\splugins([^=]*)=[^[]\[/,(e,t)=>` plugins${t}= [withSaltyCss,`),n=!0);let r=t.includes(`module.exports`),i=r?`const { withSaltyCss } = require('@salty-css/next');
4
+ `:`import { withSaltyCss } from '@salty-css/next';
5
+ `;return r&&!n?(t=t.replace(/module.exports = ([^;]+)/,(e,t)=>`module.exports = withSaltyCss(${t})`),n=!0):n||(t=t.replace(/export default ([^;]+)/,(e,t)=>`export default withSaltyCss(${t})`)),{content:i+t}},fe={name:`next`,detect:e=>le.map(t=>(0,s.join)(e.projectDir,t)).find(e=>(0,o.existsSync)(e))??null,plan:async(e,n)=>{let r=await(0,c.readFile)(n,`utf-8`).catch(()=>void 0);if(r===void 0)return null;let{content:i}=de(r);return i===null?null:{packages:[`-D ${ue(e.cliVersion)}`],execute:async()=>(t.r.info(`Adding Salty-CSS plugin to Next.js config...`),await(0,c.writeFile)(n,i),await S(n),{changed:!0})}}},pe=e=>`@salty-css/vite@${e}`,me=e=>e.includes(`saltyPlugin`)?{content:null}:{content:`import { saltyPlugin } from '@salty-css/vite';
6
+ `+e.replace(/(plugins: \[)/,`$1
7
+ saltyPlugin(__dirname),`)},he=[ce,{name:`vite`,detect:e=>{let t=(0,s.join)(e.projectDir,`vite.config.ts`);return(0,o.existsSync)(t)?t:null},plan:async(e,n)=>{let r=await(0,c.readFile)(n,`utf-8`).catch(()=>void 0);if(r===void 0)return null;let{content:i}=me(r);return i===null?null:{packages:[`-D ${pe(e.cliVersion)}`],execute:async()=>(t.r.info(`Edit file: `+n),t.r.info(`Adding Salty-CSS plugin to Vite config...`),await(0,c.writeFile)(n,i),await S(n),{changed:!0})}}},fe,ie],ge=async e=>{let t=[];for(let n of he){let r=await n.detect(e);if(!r)continue;let i=await n.plan(e,r);i&&t.push({name:n.name,configPath:r,plan:i})}return t},_e=async e=>{let t=[];for(let{name:n,configPath:r,plan:i}of e){let e=await i.execute();t.push({name:n,configPath:r,changed:e.changed})}return t},ve={vite:[`dist/**`],next:[`.next/**`,`out/**`]},ye=({framework:e,integrations:t,hasSrcDir:n})=>{if(e===`astro`)return{};let r=[...new Set(t.flatMap(e=>ve[e]??[]))],i={};return n&&(i.include=[`src/**`]),r.length&&(i.exclude=r),i},be=async(e,n,r)=>{let i=(0,s.join)(e,n);if((0,o.existsSync)(i)){t.r.debug(`File already exists: `+i);return}let a=n.split(`/`).slice(0,-1).join(`/`);a&&await(0,c.mkdir)((0,s.join)(e,a),{recursive:!0}),t.r.info(`Creating file: `+i),await(0,c.writeFile)(i,r),await S(i)},xe=async e=>{let n=(0,s.join)(e,`.gitignore`),r=await(0,c.readFile)(n,`utf-8`).catch(()=>void 0);r!==void 0&&(r.includes(`saltygen`)||(t.r.info(`Edit file: `+n),await(0,c.writeFile)(n,r+`
8
+
9
+ # Salty-CSS
10
+ saltygen
11
+ `)))},Se=async(e,n)=>{let r=n??await Z(e);if(!r){t.r.warn(`Could not find a CSS file to import the generated CSS. Please add it manually.`);return}let i=(0,s.join)(e,r),a=await(0,c.readFile)(i,`utf-8`).catch(()=>void 0);if(a===void 0||a.includes(`saltygen`))return;let o=(0,s.relative)((0,s.join)(i,`..`),(0,s.join)(e,`saltygen/index.css`));t.r.info(`Adding global import statement to CSS file: `+i),await(0,c.writeFile)(i,`@import '${o}';\n`+a),await S(i)},Ce=async()=>{let e=await m().catch(()=>{t.n(`Could not read package.json file.`)});if(!e)return;let{pkg:n}=v(e);await h(n)},we=e=>{e.command(`init [directory]`).description(`Initialize a new Salty-CSS project.`).option(`-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.`).option(`--skip-install`,`Skip installing dependencies.`).option(`-y, --yes`,`Skip the install confirmation prompt.`).action(async function(e=`.`){try{let n=this.opts(),r=n.dir??e;if(!r)return t.n(`Project directory must be provided. Add it as the first argument after init command or use the --dir option.`);let i=await A({dir:r,skipInstall:n.skipInstall,yes:n.yes});t.r.info(`Initializing a new Salty-CSS project!`);let a=await R(i);t.r.info(`Detected framework: ${a.name}`);let l=await ge(i);if(!i.skipInstall){let e=[_.core(i.cliVersion),a.runtimePackage(i.cliVersion),...l.flatMap(e=>e.plan.packages)];await G(e,i.yes),await b(...e)}let u=await Promise.all([V(`salty.config.ts`),V(`saltygen/index.css`)]);await(0,c.mkdir)(i.projectDir,{recursive:!0}),await Promise.all(u.map(({fileName:e,content:t})=>be((0,s.join)(i.projectDir,a.srcDirectory),e,t)));let d=ye({framework:a.name,integrations:l.map(e=>e.name),hasSrcDir:(0,o.existsSync)((0,s.join)(i.projectDir,`src`))});await O(i.cwd,i.relativeProjectPath,a,d),await xe(i.cwd),await Se(i.projectDir,n.cssFile),await _e(l),await Ce(),t.r.info(`Running the build to generate initial CSS...`),await new t.t(i.projectDir).generateCss(),t.r.info(`🎉 Salty CSS project initialized successfully!`),t.r.info(`Next steps:`),t.r.info("1. Configure variables and templates in `salty.config.ts`"),t.r.info("2. Create a new component with `npx salty-css generate [component-name]`"),t.r.info("3. Run `npx salty-css build` to generate the CSS"),t.r.info(`4. Read about the features in the documentation: https://salty-css.dev`),t.r.info(`5. Star the project on GitHub: https://github.com/margarita-form/salty-css ⭐`)}catch(e){return t.n(e instanceof Error?e.message:String(e))}})},$=async()=>{let e=(0,s.join)(process.cwd(),`package.json`),n=await m(e).catch(e=>t.n(e));if(!n)return t.n(`Could not read package.json file.`);let r={...n.dependencies,...n.devDependencies},i=Object.entries(r).filter(([e])=>e===`salty-css`||e.startsWith(`@salty-css/`));return i.length?i:t.n(`No Salty-CSS packages found in package.json. Make sure you are running update command in the same directory! Used package.json path: `+e)},Te=e=>{e.command(`update [version]`).alias(`up`).description(`Update Salty-CSS packages to the latest or specified version.`).option(`-v, --version <version>`,`Version to update to.`).option(`--legacy-peer-deps <legacyPeerDeps>`,`Use legacy peer dependencies (not recommended).`,!1).option(`-y, --yes`,`Skip confirmation prompts (install and rebuild).`).option(`-d, --dir <dir>`,`Project directory to rebuild after updating.`).action(async function(e=`latest`){let{legacyPeerDeps:n,version:r=e,yes:i=!1,dir:a}=this.opts(),o=await $();if(!o)return t.n(`Could not update Salty-CSS packages as any were found in package.json.`);let s=await g(),c=o.map(([e])=>r===`@`?`${e}@${s.version}`:`${e}@${r.replace(/^@/,``)}`);try{await G(c,i)}catch(e){return t.n(e instanceof Error?e.message:String(e))}n?(t.r.warn(`Using legacy peer dependencies to update packages.`),await b(...c,`--legacy-peer-deps`)):await b(...c);let l=await $();if(!l)return t.n(`Something went wrong while reading the updated packages.`);let u=l.reduce((e,[t,n])=>(e[n]||(e[n]=[]),e[n].push(t),e),{});if(Object.keys(u).length===1){let e=Object.keys(u)[0];t.r.info(`Updated to all Salty CSS packages successfully to ${e.replace(/^\^/,``)}`)}else for(let[e,n]of Object.entries(u))t.r.info(`Updated to ${e.replace(/^\^/,``)}: ${n.join(`, `)}`);let d=a??await E();if(!d){t.r.warn("Skipping rebuild: no project directory configured. Run `salty-css build [dir]` manually.");return}if(!await K(`Rebuild Salty CSS now?`,{yes:i}))return;let f=k(d);t.r.info(`Rebuilding Salty-CSS project...`),await new t.t(f).generateCss(),t.r.info(`Rebuild complete.`)})},Ee=e=>{e.option(`-v, --version`,`Show the current version of Salty-CSS.`).action(async function(){let e=await g();t.r.info(`CLI is running: `+e.version);let n=(0,s.join)(process.cwd(),`package.json`),r=await m(n).catch(e=>t.n(e));if(!r)return;let i={...r.dependencies,...r.devDependencies},a=Object.keys(i).filter(e=>e===`salty-css`||e.startsWith(`@salty-css/`));if(!a.length)return t.n(`No Salty-CSS packages found in package.json. Make sure you are running update command in the same directory! Used package.json path: `+n);for(let e of a)t.r.info(`${e}: ${i[e]}`)})};async function De(){let e=new a.Command;e.name(`salty-css`).description(`Salty-CSS CLI tool to help with annoying configuration tasks.`);let t=await E();we(e),Te(e),Ee(e),j(e,t),H(e,t),e.parseAsync(process.argv)}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return De}});
@@ -244,7 +244,7 @@ var X = {
244
244
  let A = c.map((e) => `@import url('./css/${e}');`).join("\n"), j = `/*!
245
245
  * Generated with Salty CSS (https://salty-css.dev)
246
246
  * Do not edit this file directly
247
- * Version 0.4.5-alpha.0
247
+ * Version 0.4.5-fix-cli-astro-salty-config-dir.0
248
248
  */
249
249
  @layer imports, reset, global, templates, fonts, l0, l1, l2, l3, l4, l5, l6, l7, l8;\n\n${[
250
250
  "_imports.css",
@@ -3,7 +3,7 @@ const e=require("./chunk-CMqjfN_6.cjs"),t=require("./compiler/helpers.cjs"),n=re
3
3
  `),S=`/*!
4
4
  * Generated with Salty CSS (https://salty-css.dev)
5
5
  * Do not edit this file directly
6
- * Version 0.4.5-alpha.0
6
+ * Version 0.4.5-fix-cli-astro-salty-config-dir.0
7
7
  */
8
8
  @layer imports, reset, global, templates, fonts, l0, l1, l2, l3, l4, l5, l6, l7, l8;\n\n${[`_imports.css`,`_variables.css`,`_reset.css`,`_global.css`,`_templates.css`,`_fonts.css`].filter(e=>{try{return(0,c.readFileSync)((0,u.join)(o,`css`,e),`utf8`).length>0}catch{return!1}}).map(e=>`@import url('./css/${e}')${e===`_imports.css`?` layer(imports)`:``};`).join(`
9
9
  `)}\n${x}`;if(y.importStrategy!==`component`){let e=a.reduce((e,t,r)=>{let i=t.reduce((e,t)=>{let r=(0,u.join)(o,`css`,t),i=(0,c.readFileSync)(r,`utf8`),a=/.*-([^-]+)-\d+.css/.exec(t)?.at(1)||n.toHash(r,6);return e.includes(a)?e:`${e}\n/*start:${a}-${t}*/\n${i}\n/*end:${a}*/\n`},``),a=`l_${r}.css`;return(0,c.writeFileSync)((0,u.join)(o,`css`,a),`@layer l${r} { ${i}\n }`),`${e}\n@import url('./css/${a}');`},``);S+=e}(0,c.writeFileSync)(s,S);let C=Date.now()-r,w=C<200?`🔥`:C<500?`🚀`:C<1e3?`🎉`:C<2e3?`🚗`:C<5e3?`🤔`:`🥴`;h.info(`Generated CSS in ${C}ms! ${w}`)}catch(e){console.error(e)}};generateConfigStyles=async e=>{let t=await this.getDestDir(),o={mediaQueries:[],globalStyles:[],variables:[],templates:[],imports:[],fonts:[]};await Promise.all([...e].map(async e=>{let{contents:n,outputFilePath:r}=await this.compileSaltyFile(e,t);Object.entries(n).forEach(([t,n])=>{n.isMedia?o.mediaQueries.push([t,n]):n.isGlobalDefine?o.globalStyles.push(n):n.isDefineVariables?o.variables.push(n):n.isDefineTemplates?o.templates.push(n._setPath(`${t};;${r}`)):n.isDefineImport?o.imports.push(n._setPath(e)):n.isDefineFont&&o.fonts.push(n)})}));let{config:l,path:d}=await this.generateConfig(),f={...l},{mediaQueries:p}=o;f.mediaQueries=Object.fromEntries(p.map(([e,t])=>[`@${e}`,t]));let m=p.map(([e])=>`'@${e}'`).join(` | `),g=new Set,_=async(e,t=[])=>{if(!e)return[];let r=Object.entries(e).map(async([e,r])=>{let a=async r=>{if(!r)return;if(r instanceof Promise)return await a(await r);if(typeof r==`function`)return await a(await r());if(typeof r==`object`)return await _(r,[...t,e]);let o=O(e),s=n.dashCase(e),c=[...t,o].join(`.`);g.add(`"${c}"`);let l=[...t.map(n.dashCase),s].join(`-`),u=i.s(r);return u?`--${l}: ${u.transformed};`:`--${l}: ${r};`};return await a(r)});return(await Promise.all(r)).flat()},v=async e=>{if(!e)return[];let t=Object.entries(e).map(async([e,t])=>{let n=await _(t);return e===`base`?n.join(``):f.mediaQueries[e]?`${f.mediaQueries[e]} { ${n.join(``)} }`:`${e} { ${n.join(``)} }`});return(await Promise.all(t)).flat()},y=async e=>{if(!e)return[];let t=Object.entries(e).map(async([e,t])=>{let n=Object.entries(t).map(async([t,n])=>{let r=await _(n,[e]);return`${`.${e}-${t}, [data-${e}="${t}"]`} { ${r.join(``)} }`});return(await Promise.all(n)).flat()});return(await Promise.all(t)).flat()},b=(e={})=>({...e,responsive:void 0,conditional:void 0}),x=e=>o.variables.map(t=>e===`static`?b(t._current):t._current[e]),S=a.mergeObjects(b(l.variables),x(`static`)),C=await _(S),T=await v(a.mergeObjects(l.variables?.responsive,x(`responsive`))),E=await y(a.mergeObjects(l.variables?.conditional,x(`conditional`)));(0,c.writeFileSync)((0,u.join)(t,`css/_variables.css`),`:root { ${C.join(``)} ${T.join(``)} } ${E.join(``)}`),f.staticVariables=S,(0,c.writeFileSync)((0,u.join)(t,`css/_global.css`),`@layer global { ${await i.t(a.mergeObjects(l.global,o.globalStyles),``)} }`);let D=(0,u.join)(t,`css/_reset.css`);(0,c.writeFileSync)(D,`@layer reset { ${await i.t(l.reset===`none`?{}:typeof l.reset==`object`?l.reset:k,``)} }`);let A=(0,u.join)(t,`css/_templates.css`),j=a.mergeObjects(l.templates,o.templates),M=await s.parseTemplates(j),N=s.getTemplateTypes(j),P=s.getTemplateVariantMaps(j);(0,c.writeFileSync)(A,`@layer templates { ${M} }`),f.templates=j;let F=(0,u.join)(t,`css/_imports.css`),I=[];for(let e of o.imports){let n=e._path;if(n)for(let r of e._current)try{let{rule:e}=w(r,n,t);I.push(e)}catch(e){let t=typeof r==`string`?r:r.url;h.error(`Failed to resolve defineImport(${JSON.stringify(t)}) from ${n}: ${e.message}`)}}(0,c.writeFileSync)(F,I.join(`
@@ -1,4 +1,4 @@
1
- //#region src/bin/templates/saltygen_index.css__template
1
+ //#region src/bin/templates/index.css__template
2
2
  var e = "/* Empty */";
3
3
  //#endregion
4
4
  export { e as default };
package/package.json CHANGED
@@ -15,7 +15,7 @@
15
15
  "bugs": {
16
16
  "url": "https://github.com/margarita-form/salty-css/issues"
17
17
  },
18
- "version": "0.4.5-alpha.0",
18
+ "version": "0.4.5-fix-cli-astro-salty-config-dir.0",
19
19
  "type": "module",
20
20
  "scripts": {
21
21
  "build": "vite build",
@@ -1,11 +0,0 @@
1
- const e=require("./chunk-CMqjfN_6.cjs"),t=require("./salty-compiler-1LbXg6lw.cjs"),n=require("./compiler/helpers.cjs"),r=require("./util/index.cjs"),i=require("./server/index.cjs");let a=require("commander"),o=require("fs"),s=require("path"),c=require("fs/promises"),l=require("child_process"),u=require("ora");u=e.t(u,1);let d=require("ejs");d=e.t(d,1);let f=require("readline/promises");var p=(0,s.join)(process.cwd(),`package.json`),m=async(e=p)=>{let t=await(0,c.readFile)(e,`utf-8`).then(JSON.parse).catch(()=>void 0);if(!t)throw`Could not read package.json file!`;return t},h=async(e,t=p)=>{typeof e==`object`&&(e=JSON.stringify(e,null,2)),await(0,c.writeFile)(t,e)},g=async()=>m(new URL(`../package.json`,``+{}.url)),_={core:e=>`@salty-css/core@${e}`,eslintConfigCore:e=>`@salty-css/eslint-config-core@${e}`},v=e=>{e.scripts||={};let t=e.scripts.prepare;if(t){if(t.includes(`salty-css`))return{changed:!1,pkg:e};e.scripts.prepare=t+` && npx salty-css build`}else e.scripts.prepare=`npx salty-css build`;return{changed:!0,pkg:e}},y=e=>new Promise((t,n)=>{(0,l.exec)(e,e=>{if(e)return n(e);t()})}),b=async(...e)=>{let t=e.map(e=>e.replace(`-D`,``).split(`@`).slice(0,-1).join(`@`).trim()).join(`, `),n=(0,u.default)(`Installing packages: ${t}`).start();await y(`npm install ${e.join(` `)}`),n.succeed(`Installed packages: ${t}`)},x=()=>(0,o.existsSync)((0,s.join)(process.cwd(),`node_modules`,`.bin`,`prettier`));async function S(e){try{if(!x())return;await y(`./node_modules/.bin/prettier --write "${e}"`),t.r.info(`Formatted ${e} with Prettier`)}catch(n){t.r.error(`Error formatting ${e} with Prettier:`,n)}}var C=(e=process.cwd())=>(0,s.join)(e,`.saltyrc.json`),w=async(e=process.cwd())=>await(0,c.readFile)(C(e),`utf-8`).then(JSON.parse).catch(()=>({})),ee=async(e=process.cwd())=>(0,c.readFile)(C(e),`utf-8`).catch(()=>void 0),T=async(e=process.cwd())=>(await w(e)).defaultProject,E=(e,t,n,r={})=>{let i=(0,s.join)(t,n.srcDirectory),a={dir:i,framework:n.name,...r};if(e===void 0)return{content:JSON.stringify({$schema:`./node_modules/@salty-css/core/.saltyrc.schema.json`,info:`This file is used to define projects and their configurations for Salty CSS cli. Do not delete, modify or add this file to .gitignore.`,defaultProject:i,projects:[a]},null,2),changed:!0,created:!0};let o=JSON.parse(e),c=o.projects||[];if(c.some(e=>e.dir===i))return{content:e,changed:!1,created:!1};c.push(a),o.projects=[...c];let l=JSON.stringify(o,null,2);return{content:l,changed:l!==e,created:!1}},D=async(e,n,r,i={})=>{let a=C(e),{content:o,changed:s,created:l}=E(await ee(e),n,r,i);return s?(l?t.r.info(`Creating file: `+a):t.r.info(`Edit file: `+a),await(0,c.writeFile)(a,o),await S(a),!0):!1},te=(e,t)=>(e.projects||[]).find(e=>e.dir===t)?.framework,O=(e,t=process.cwd())=>(0,s.join)(t,e===`.`?``:e),k=async e=>{let t=process.cwd(),n=O(e.dir,t),r=(0,s.relative)(t,n)||`.`,i=await m().catch(()=>void 0);if(e.requirePackageJson!==!1&&!i)throw Error(`Salty CSS project must be initialized in a directory with a package.json file.`);return{cwd:t,projectDir:n,relativeProjectPath:r,packageJson:i,rcFile:await w(t),cliVersion:(await g()).version||`0.0.0`,skipInstall:!!e.skipInstall,yes:!!e.yes}},A=(e,r)=>{e.command(`build [directory]`).alias(`b`).description(`Build the Salty-CSS project.`).option(`-d, --dir <dir>`,`Project directory to build the project in.`).option(`--watch`,`Watch for changes and rebuild the project.`).option(`--mode <mode>`,`Build mode: "production" or "development". Defaults to NODE_ENV-based detection.`).action(async function(e=r){t.r.info(`Building the Salty-CSS project...`);let{dir:a=e,watch:s,mode:c}=this.opts();if(c!==void 0&&c!==`production`&&c!==`development`)return t.n(`Invalid --mode "${c}". Expected "production" or "development".`);let l=a??await T();if(!l)return t.n(`Project directory must be provided. Add it as the first argument after build command or use the --dir option.`);let u=O(l),d=new t.t(u,{mode:c});await d.generateCss(),s&&(t.r.info(`Watching for changes in the project directory...`),(0,o.watch)(u,{recursive:!0},async(e,t)=>{if(!t)return console.warn(`File path not provided for change event`);await i.checkShouldRestart(t)?await d.generateCss(!1):n.isSaltyFile(t)&&await d.generateFile(t)}))})},ne=[`astro.config.mjs`,`astro.config.ts`,`astro.config.js`,`astro.config.cjs`],j=e=>{for(let t of ne){let n=(0,s.join)(e,t);if((0,o.existsSync)(n))return n}return null},M=e=>{let t=e.packageJson;if(!t)return!1;let n={...t.dependencies,...t.devDependencies};return Object.prototype.hasOwnProperty.call(n,`astro`)},N={name:`astro`,srcDirectory:`src`,detect:e=>!!j(e.projectDir)||M(e),runtimePackage:e=>`@salty-css/astro@${e}`,templates:{styled:`astro/styled-file.ts`,component:{styled:`astro/styled-file.ts`,wrapper:`astro/component.astro`,wrapperExt:`.astro`}}},P={name:`react`,srcDirectory:``,detect:()=>!0,runtimePackage:e=>`@salty-css/react@${e}`,templates:{styled:`react/styled-file.ts`,component:{styled:`react/styled-file.ts`,wrapper:`react/vanilla-file.ts`,wrapperExt:`.tsx`}}},F=[N,P],I={astro:N,react:P},L=async e=>{for(let t of F)if(await t.detect(e))return t;return P},R=e=>{if(e)return I[e]},z={"salty.config.ts":()=>Promise.resolve().then(()=>require("./salty.config-B0ZiRpHR.cjs")),"styles/index.css":()=>Promise.resolve().then(()=>require("./styles_index-DgmdjfFo.cjs")),"saltygen/index.css":()=>Promise.resolve().then(()=>require("./saltygen_index-BGHLaAOm.cjs")),"react/styled-file.ts":()=>Promise.resolve().then(()=>require("./styled-file-BCbAEzBB.cjs")),"react/vanilla-file.ts":()=>Promise.resolve().then(()=>require("./vanilla-file-Z3VsOa_U.cjs")),"astro/styled-file.ts":()=>Promise.resolve().then(()=>require("./styled-file-DorArlCk.cjs")),"astro/component.astro":()=>Promise.resolve().then(()=>require("./astro-component-r0qEcF1p.cjs"))},B=async(e,t)=>{let{default:n}=await z[e]();return{fileName:e,content:d.default.render(n,t)}},V=(e,n)=>{e.command(`generate [file] [directory]`).alias(`g`).description(`Generate a new component file.`).option(`-f, --file <file>`,`File to generate.`).option(`-d, --dir <dir>`,`Project directory to generate the file in.`).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.`).option(`-r, --reactComponent`,`Generate a wrapper component file alongside the styled definition.`).action(async function(e,i=n){let{file:a=e,dir:o=i,tag:l,name:u,className:d,reactComponent:f=!1}=this.opts();if(!a)return t.n(`File to generate must be provided. Add it as the first argument after generate command or use the --file option.`);if(!o)return t.n(`Project directory must be provided. Add it as the second argument after generate command or use the --dir option.`);let p;try{p=await k({dir:o,requirePackageJson:!1})}catch(e){return t.n(e instanceof Error?e.message:String(e))}let m=R(te(p.rcFile,p.relativeProjectPath))??await L(p),h=a.split(`/`).slice(0,-1).join(`/`);h&&await(0,c.mkdir)((0,s.join)(p.projectDir,h),{recursive:!0});let g=(0,s.parse)((0,s.join)(p.projectDir,a));g.ext||=`.ts`,g.name.endsWith(`.css`)||(g.name+=`.css`),g.base=g.name+g.ext;let _=(0,s.format)(g);if(await(0,c.readFile)(_,`utf-8`).catch(()=>void 0)!==void 0){t.r.error(`File already exists: `+_);return}let v=r.pascalCase(u||g.base.replace(/\.css\.\w+$/,``));if(f){if(!m.templates.component)return t.n(`--reactComponent is not supported for the ${m.name} framework.`);let e=v+`Component`;v+=`Wrapper`;let n=g.base.replace(/\.css\.\w+$/,``),{content:r}=await B(m.templates.component.wrapper,{tag:l,componentName:e,styledComponentName:v,className:d,fileName:n});g.name=n.replace(/\.css$/,``),g.ext=m.templates.component.wrapperExt,g.base=g.name+g.ext;let i=(0,s.format)(g);t.r.info(`Generating a new file: `+i),await(0,c.writeFile)(i,r),await S(i)}let{content:y}=await B(f&&m.templates.component?m.templates.component.styled:m.templates.styled,{tag:l,name:v,className:d});t.r.info(`Generating a new file: `+_),await(0,c.writeFile)(_,y),await S(_)})},H=e=>{let t=e.trim();return t.startsWith(`-D `)?`${t.slice(3).trim()} (dev)`:t},U=e=>e.map(e=>` + ${H(e)}`).join(`
2
- `),W=async(e,t,n={})=>{if(t||e.length===0)return;let r=n.input??process.stdin,i=n.output??process.stdout;if(!(n.isTTY??process.stdin.isTTY??!1))throw Error(`Cannot prompt for install confirmation: stdin is not a TTY. Re-run with --yes to install the listed packages without prompting.`);i.write(`The following packages will be installed:\n${U(e)}\n`);let a=(0,f.createInterface)({input:r,output:i,terminal:!1});try{let e=(await a.question(`Proceed? (y/N) `)).trim().toLowerCase();if(e!==`y`&&e!==`yes`)throw Error(`Install cancelled by user.`)}finally{a.close()}},G=async(e,t={})=>{if(t.yes)return!0;let n=t.input??process.stdin,r=t.output??process.stdout;if(!(t.isTTY??process.stdin.isTTY??!1))return!1;let i=t.defaultYes?`(Y/n)`:`(y/N)`,a=(0,f.createInterface)({input:n,output:r,terminal:!1});try{let n=(await a.question(`${e} ${i} `)).trim().toLowerCase();return n===``?!!t.defaultYes:n===`y`||n===`yes`}finally{a.close()}},K=[`src`,`public`,`assets`,`styles`,`css`,`app`],q=[`styles`,`css`,`app`,`pages`],J=[`index`,`styles`,`main`,`app`,`global`,`globals`],Y=[`.css`,`.scss`,`.sass`],X=async e=>{for(let t of K)for(let n of J)for(let r of Y){let i=(0,s.join)(e,t,n+r);if(await(0,c.readFile)(i,`utf-8`).catch(()=>void 0)!==void 0)return(0,s.relative)(e,i);for(let i of q){let a=(0,s.join)(e,t,i,n+r);if(await(0,c.readFile)(a,`utf-8`).catch(()=>void 0)!==void 0)return(0,s.relative)(e,a)}}},Z=e=>`@salty-css/astro@${e}`,re=`import saltyIntegration from '@salty-css/astro/integration';
3
- `,ie=e=>{if(e.includes(`@salty-css/astro`))return{content:null};let t=e,n=!1;return/integrations\s*:\s*\[/.test(t)?(t=t.replace(/integrations\s*:\s*\[/,e=>`${e}saltyIntegration(),`),n=!0):/defineConfig\s*\(\s*\{/.test(t)&&(t=t.replace(/defineConfig\s*\(\s*\{/,e=>`${e}\n integrations: [saltyIntegration()],`),n=!0),n?{content:re+t}:{content:null,warning:`Could not find a place to add saltyIntegration() in the Astro config. Please add it manually.`}},ae={name:`astro`,detect:e=>j(e.projectDir),plan:async(e,n)=>{let r=await(0,c.readFile)(n,`utf-8`).catch(()=>void 0);if(r===void 0)return null;let i=ie(r);if(i.warning&&t.r.warn(i.warning),i.content===null)return null;let a=i.content;return{packages:[`-D ${Z(e.cliVersion)}`],execute:async()=>(t.r.info(`Adding Salty-CSS integration to Astro config: `+n),await(0,c.writeFile)(n,a),await S(n),{changed:!0})}}},oe=[[`projectJs`,`eslint.config.js`],[`rootJs`,`eslint.config.js`],[`projectMjs`,`eslint.config.mjs`],[`rootMjs`,`eslint.config.mjs`],[`projectJson`,`.eslintrc.json`],[`rootJson`,`.eslintrc.json`]],se=(e,t)=>oe.map(([n,r])=>(0,s.join)(n.startsWith(`root`)?t:e,r)),ce=(e,t)=>{if(e.includes(`salty-css`))return{content:null};if(t){let t=`import saltyCss from "@salty-css/eslint-config-core/flat";\n${e}`;if(e.includes(`typescript-eslint`))if(t.includes(`.config(`))t=t.replace(`.config(`,`.config(saltyCss,`);else return{content:null,warning:`Could not find the correct place to add the Salty-CSS config for ESLint. Please add it manually.`};else if(t.includes(`export default [`))t=t.replace(`export default [`,`export default [ saltyCss,`);else if(t.includes(`eslintConfig = [`))t=t.replace(`eslintConfig = [`,`eslintConfig = [ saltyCss,`);else return{content:null,warning:`Could not find the correct place to add the Salty-CSS config for ESLint. Please add it manually.`};return{content:t}}let n=JSON.parse(e);return n.extends||=[],n.extends.includes(`@salty-css/core`)||n.extends.push(`@salty-css/core`),{content:JSON.stringify(n,null,2)}},le={name:`eslint`,detect:e=>se(e.projectDir,e.cwd).find(e=>(0,o.existsSync)(e))??null,plan:async(e,n)=>{let r=await(0,c.readFile)(n,`utf-8`).catch(()=>void 0);if(r===void 0)return t.r.error(`Could not read ESLint config file.`),null;let i=ce(r,n.endsWith(`js`));if(i.warning&&t.r.warn(i.warning),i.content===null)return null;let a=i.content;return{packages:[_.eslintConfigCore(e.cliVersion)],execute:async()=>(t.r.info(`Edit file: `+n),await(0,c.writeFile)(n,a),await S(n),{changed:!0})}}},ue=[`next.config.js`,`next.config.cjs`,`next.config.ts`,`next.config.mjs`],de=e=>`@salty-css/next@${e}`,fe=e=>{if(e.includes(`withSaltyCss`))return{content:null};let t=e,n=!1;/\splugins([^=]*)=[^[]\[/.test(t)&&(t=t.replace(/\splugins([^=]*)=[^[]\[/,(e,t)=>` plugins${t}= [withSaltyCss,`),n=!0);let r=t.includes(`module.exports`),i=r?`const { withSaltyCss } = require('@salty-css/next');
4
- `:`import { withSaltyCss } from '@salty-css/next';
5
- `;return r&&!n?(t=t.replace(/module.exports = ([^;]+)/,(e,t)=>`module.exports = withSaltyCss(${t})`),n=!0):n||(t=t.replace(/export default ([^;]+)/,(e,t)=>`export default withSaltyCss(${t})`)),{content:i+t}},pe={name:`next`,detect:e=>ue.map(t=>(0,s.join)(e.projectDir,t)).find(e=>(0,o.existsSync)(e))??null,plan:async(e,n)=>{let r=await(0,c.readFile)(n,`utf-8`).catch(()=>void 0);if(r===void 0)return null;let{content:i}=fe(r);return i===null?null:{packages:[`-D ${de(e.cliVersion)}`],execute:async()=>(t.r.info(`Adding Salty-CSS plugin to Next.js config...`),await(0,c.writeFile)(n,i),await S(n),{changed:!0})}}},me=e=>`@salty-css/vite@${e}`,he=e=>e.includes(`saltyPlugin`)?{content:null}:{content:`import { saltyPlugin } from '@salty-css/vite';
6
- `+e.replace(/(plugins: \[)/,`$1
7
- saltyPlugin(__dirname),`)},ge=[le,{name:`vite`,detect:e=>{let t=(0,s.join)(e.projectDir,`vite.config.ts`);return(0,o.existsSync)(t)?t:null},plan:async(e,n)=>{let r=await(0,c.readFile)(n,`utf-8`).catch(()=>void 0);if(r===void 0)return null;let{content:i}=he(r);return i===null?null:{packages:[`-D ${me(e.cliVersion)}`],execute:async()=>(t.r.info(`Edit file: `+n),t.r.info(`Adding Salty-CSS plugin to Vite config...`),await(0,c.writeFile)(n,i),await S(n),{changed:!0})}}},pe,ae],_e=async e=>{let t=[];for(let n of ge){let r=await n.detect(e);if(!r)continue;let i=await n.plan(e,r);i&&t.push({name:n.name,configPath:r,plan:i})}return t},ve=async e=>{let t=[];for(let{name:n,configPath:r,plan:i}of e){let e=await i.execute();t.push({name:n,configPath:r,changed:e.changed})}return t},ye={vite:[`dist/**`],next:[`.next/**`,`out/**`]},be=({framework:e,integrations:t,hasSrcDir:n})=>{if(e===`astro`)return{};let r=[...new Set(t.flatMap(e=>ye[e]??[]))],i={};return n&&(i.include=[`src/**`]),r.length&&(i.exclude=r),i},Q=async(e,n,r)=>{let i=(0,s.join)(e,n);if((0,o.existsSync)(i)){t.r.debug(`File already exists: `+i);return}let a=n.split(`/`).slice(0,-1).join(`/`);a&&await(0,c.mkdir)((0,s.join)(e,a),{recursive:!0}),t.r.info(`Creating file: `+i),await(0,c.writeFile)(i,r),await S(i)},xe=async e=>{let n=(0,s.join)(e,`.gitignore`),r=await(0,c.readFile)(n,`utf-8`).catch(()=>void 0);r!==void 0&&(r.includes(`saltygen`)||(t.r.info(`Edit file: `+n),await(0,c.writeFile)(n,r+`
8
-
9
- # Salty-CSS
10
- saltygen
11
- `)))},Se=async(e,n)=>{let r=n??await X(e);if(!r){if(!await G("Could not find a CSS file to import the generated CSS. Do you want to create a new `styles/index.css` file and import it there? (y/N) ")){t.r.warn(`Could not find a CSS file to import the generated CSS. Please add it manually.`);return}let{fileName:n,content:r}=await B(`styles/index.css`);await Q(e,n,r);return}let i=(0,s.join)(e,r),a=await(0,c.readFile)(i,`utf-8`).catch(()=>void 0);if(a===void 0||a.includes(`saltygen`))return;let o=(0,s.relative)((0,s.join)(i,`..`),(0,s.join)(e,`saltygen/index.css`));t.r.info(`Adding global import statement to CSS file: `+i),await(0,c.writeFile)(i,`@import '${o}';\n`+a),await S(i)},Ce=async()=>{let e=await m().catch(()=>{t.n(`Could not read package.json file.`)});if(!e)return;let{pkg:n}=v(e);await h(n)},we=e=>{e.command(`init [directory]`).description(`Initialize a new Salty-CSS project.`).option(`-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.`).option(`--skip-install`,`Skip installing dependencies.`).option(`-y, --yes`,`Skip the install confirmation prompt.`).action(async function(e=`.`){try{let n=this.opts(),r=n.dir??e;if(!r)return t.n(`Project directory must be provided. Add it as the first argument after init command or use the --dir option.`);let i=await k({dir:r,skipInstall:n.skipInstall,yes:n.yes});t.r.info(`Initializing a new Salty-CSS project!`);let a=await L(i);t.r.info(`Detected framework: ${a.name}`);let l=await _e(i);if(!i.skipInstall){let e=[_.core(i.cliVersion),a.runtimePackage(i.cliVersion),...l.flatMap(e=>e.plan.packages)];await W(e,i.yes),await b(...e)}let u=await Promise.all([B(`salty.config.ts`),B(`saltygen/index.css`)]),d=(0,s.join)(i.projectDir,a.srcDirectory);await(0,c.mkdir)(d,{recursive:!0}),await Promise.all(u.map(({fileName:e,content:t})=>Q(d,e,t)));let f=be({framework:a.name,integrations:l.map(e=>e.name),hasSrcDir:(0,o.existsSync)((0,s.join)(i.projectDir,`src`))});await D(i.cwd,i.relativeProjectPath,a,f),await xe(i.cwd),await Se(d,n.cssFile),await ve(l),await Ce(),t.r.info(`Running the build to generate initial CSS...`),await new t.t(d).generateCss(),t.r.info(`🎉 Salty CSS project initialized successfully!`),t.r.info(`Next steps:`),t.r.info("1. Configure variables and templates in `salty.config.ts`"),t.r.info("2. Create a new component with `npx salty-css generate [component-name]`"),t.r.info("3. Run `npx salty-css build` to generate the CSS"),t.r.info(`4. Read about the features in the documentation: https://salty-css.dev`),t.r.info(`5. Star the project on GitHub: https://github.com/margarita-form/salty-css ⭐`)}catch(e){return t.n(e instanceof Error?e.message:String(e))}})},$=async()=>{let e=(0,s.join)(process.cwd(),`package.json`),n=await m(e).catch(e=>t.n(e));if(!n)return t.n(`Could not read package.json file.`);let r={...n.dependencies,...n.devDependencies},i=Object.entries(r).filter(([e])=>e===`salty-css`||e.startsWith(`@salty-css/`));return i.length?i:t.n(`No Salty-CSS packages found in package.json. Make sure you are running update command in the same directory! Used package.json path: `+e)},Te=e=>{e.command(`update [version]`).alias(`up`).description(`Update Salty-CSS packages to the latest or specified version.`).option(`-v, --version <version>`,`Version to update to.`).option(`--legacy-peer-deps <legacyPeerDeps>`,`Use legacy peer dependencies (not recommended).`,!1).option(`-y, --yes`,`Skip confirmation prompts (install and rebuild).`).option(`-d, --dir <dir>`,`Project directory to rebuild after updating.`).action(async function(e=`latest`){let{legacyPeerDeps:n,version:r=e,yes:i=!1,dir:a}=this.opts(),o=await $();if(!o)return t.n(`Could not update Salty-CSS packages as any were found in package.json.`);let s=await g(),c=o.map(([e])=>r===`@`?`${e}@${s.version}`:`${e}@${r.replace(/^@/,``)}`);try{await W(c,i)}catch(e){return t.n(e instanceof Error?e.message:String(e))}n?(t.r.warn(`Using legacy peer dependencies to update packages.`),await b(...c,`--legacy-peer-deps`)):await b(...c);let l=await $();if(!l)return t.n(`Something went wrong while reading the updated packages.`);let u=l.reduce((e,[t,n])=>(e[n]||(e[n]=[]),e[n].push(t),e),{});if(Object.keys(u).length===1){let e=Object.keys(u)[0];t.r.info(`Updated to all Salty CSS packages successfully to ${e.replace(/^\^/,``)}`)}else for(let[e,n]of Object.entries(u))t.r.info(`Updated to ${e.replace(/^\^/,``)}: ${n.join(`, `)}`);let d=a??await T();if(!d){t.r.warn("Skipping rebuild: no project directory configured. Run `salty-css build [dir]` manually.");return}if(!await G(`Rebuild Salty CSS now?`,{yes:i}))return;let f=O(d);t.r.info(`Rebuilding Salty-CSS project...`),await new t.t(f).generateCss(),t.r.info(`Rebuild complete.`)})},Ee=e=>{e.option(`-v, --version`,`Show the current version of Salty-CSS.`).action(async function(){let e=await g();t.r.info(`CLI is running: `+e.version);let n=(0,s.join)(process.cwd(),`package.json`),r=await m(n).catch(e=>t.n(e));if(!r)return;let i={...r.dependencies,...r.devDependencies},a=Object.keys(i).filter(e=>e===`salty-css`||e.startsWith(`@salty-css/`));if(!a.length)return t.n(`No Salty-CSS packages found in package.json. Make sure you are running update command in the same directory! Used package.json path: `+n);for(let e of a)t.r.info(`${e}: ${i[e]}`)})};async function De(){let e=new a.Command;e.name(`salty-css`).description(`Salty-CSS CLI tool to help with annoying configuration tasks.`);let t=await T();we(e),Te(e),Ee(e),A(e,t),V(e,t),e.parseAsync(process.argv)}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return De}});
@@ -1,4 +0,0 @@
1
- //#region src/bin/templates/styles_index.css__template
2
- var e = "@import url(../saltygen/index.css);";
3
- //#endregion
4
- export { e as default };
@@ -1 +0,0 @@
1
- var e=`@import url(../saltygen/index.css);`;exports.default=e;