@aerogel/cli 0.1.1 → 0.1.2-next.faf07b8323db56fdfa807f3b9ffa8af276fdf288
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aerogel-cli.js +95 -78
- package/dist/aerogel-cli.js.map +1 -1
- package/package.json +8 -2
- package/src/commands/create.ts +6 -0
- package/src/lib/App.ts +49 -19
- package/src/lib/utils/paths.ts +1 -1
- package/src/plugins/Solid.ts +2 -2
- package/templates/model/[model.name].ts +5 -1
- package/src/commands/generate-service.test.ts +0 -21
package/dist/aerogel-cli.js
CHANGED
|
@@ -3,10 +3,10 @@ var Q = (r, e, t) => e in r ? Y(r, e, { enumerable: !0, configurable: !0, writab
|
|
|
3
3
|
var a = (r, e, t) => Q(r, typeof e != "symbol" ? e + "" : e, t);
|
|
4
4
|
import { Command as X } from "commander";
|
|
5
5
|
import { existsSync as T, rmSync as Z, unlinkSync as ee, lstatSync as C, readFileSync as J, readdirSync as te, mkdirSync as W, writeFileSync as ie } from "node:fs";
|
|
6
|
-
import { facade as L, stringMatchAll as se, toString as ne, stringMatch as re, arrayFrom as
|
|
7
|
-
import { fileURLToPath as
|
|
8
|
-
import { resolve as
|
|
9
|
-
import
|
|
6
|
+
import { facade as L, stringMatchAll as se, toString as ne, stringMatch as re, arrayFrom as O, stringToTitleCase as ae, stringToSlug as oe, stringToStudlyCase as ce, formatCodeBlock as B, stringToCamelCase as M, arraySorted as le, fail as pe } from "@noeldemartin/utils";
|
|
7
|
+
import { fileURLToPath as x, URL as S } from "node:url";
|
|
8
|
+
import { resolve as h, dirname as K, basename as de } from "node:path";
|
|
9
|
+
import b from "chalk";
|
|
10
10
|
import { cursorTo as ue, clearLine as ge } from "node:readline";
|
|
11
11
|
import me from "mustache";
|
|
12
12
|
import { Project as fe, SyntaxKind as D, Node as p } from "ts-morph";
|
|
@@ -40,7 +40,7 @@ class ve {
|
|
|
40
40
|
getFiles(e) {
|
|
41
41
|
const t = te(e, { withFileTypes: !0 }), i = [];
|
|
42
42
|
for (const s of t) {
|
|
43
|
-
const n =
|
|
43
|
+
const n = h(e, s.name);
|
|
44
44
|
s.isDirectory() ? i.push(...this.getFiles(n)) : i.push(n);
|
|
45
45
|
}
|
|
46
46
|
return i;
|
|
@@ -64,9 +64,9 @@ class ve {
|
|
|
64
64
|
const o = L(ve);
|
|
65
65
|
class we {
|
|
66
66
|
constructor() {
|
|
67
|
-
a(this, "renderInfo",
|
|
68
|
-
a(this, "renderSuccess",
|
|
69
|
-
a(this, "renderError",
|
|
67
|
+
a(this, "renderInfo", b.hex("#00ffff"));
|
|
68
|
+
a(this, "renderSuccess", b.hex("#00ff00"));
|
|
69
|
+
a(this, "renderError", b.hex("#ff0000"));
|
|
70
70
|
}
|
|
71
71
|
async animate(e, t) {
|
|
72
72
|
const i = (d = "", k = !1) => {
|
|
@@ -95,7 +95,7 @@ class we {
|
|
|
95
95
|
renderMarkdown(e) {
|
|
96
96
|
const t = se(e, /\*\*(.*)\*\*/g);
|
|
97
97
|
for (const i of t)
|
|
98
|
-
e = e.replace(i[0],
|
|
98
|
+
e = e.replace(i[0], b.bold(i[1]));
|
|
99
99
|
return e;
|
|
100
100
|
}
|
|
101
101
|
log(e, t) {
|
|
@@ -153,46 +153,46 @@ class $ {
|
|
|
153
153
|
}
|
|
154
154
|
function ke(r = "") {
|
|
155
155
|
if (process.env.AEROGEL_BASE_PATH)
|
|
156
|
-
return
|
|
156
|
+
return h(process.env.AEROGEL_BASE_PATH, r);
|
|
157
157
|
if (o.contains(
|
|
158
|
-
|
|
158
|
+
x(new S(
|
|
159
159
|
/* @vite-ignore */
|
|
160
160
|
"../../../package.json",
|
|
161
161
|
import.meta.url
|
|
162
162
|
)),
|
|
163
|
-
'"
|
|
163
|
+
'"name": "aerogel"'
|
|
164
164
|
))
|
|
165
|
-
return
|
|
165
|
+
return h(x(new S(
|
|
166
166
|
/* @vite-ignore */
|
|
167
167
|
"../",
|
|
168
168
|
import.meta.url
|
|
169
169
|
)), r);
|
|
170
170
|
const e = o.read(
|
|
171
|
-
|
|
171
|
+
x(new S(
|
|
172
172
|
/* @vite-ignore */
|
|
173
173
|
"../../../../package.json",
|
|
174
174
|
import.meta.url
|
|
175
175
|
))
|
|
176
176
|
), t = re(e ?? "", /"@aerogel\/core": "file:(.*)\/aerogel-core-[\d.]*\.tgz"/), i = (t == null ? void 0 : t[1]) ?? c.fail("Could not determine base path");
|
|
177
|
-
return
|
|
177
|
+
return h(i, r);
|
|
178
178
|
}
|
|
179
|
-
function
|
|
179
|
+
function g(r) {
|
|
180
180
|
return c.fail(`Could not find ${r} pack file, did you run 'npm pack'?`);
|
|
181
181
|
}
|
|
182
|
-
function
|
|
183
|
-
return o.getFiles(
|
|
182
|
+
function m(r) {
|
|
183
|
+
return o.getFiles(u(r)).find((e) => e.endsWith(".tgz")) ?? null;
|
|
184
184
|
}
|
|
185
|
-
function
|
|
185
|
+
function u(r) {
|
|
186
186
|
return ke(`../${r}`);
|
|
187
187
|
}
|
|
188
|
-
function
|
|
189
|
-
return
|
|
188
|
+
function N(r) {
|
|
189
|
+
return x(new S(
|
|
190
190
|
/* @vite-ignore */
|
|
191
191
|
`../templates/${r}`,
|
|
192
192
|
import.meta.url
|
|
193
193
|
));
|
|
194
194
|
}
|
|
195
|
-
class
|
|
195
|
+
class xe {
|
|
196
196
|
constructor() {
|
|
197
197
|
a(this, "cwd", null);
|
|
198
198
|
}
|
|
@@ -211,8 +211,8 @@ class Se {
|
|
|
211
211
|
});
|
|
212
212
|
}
|
|
213
213
|
}
|
|
214
|
-
const
|
|
215
|
-
class
|
|
214
|
+
const y = L(xe);
|
|
215
|
+
class Se {
|
|
216
216
|
constructor() {
|
|
217
217
|
a(this, "project");
|
|
218
218
|
a(this, "modifiedFiles");
|
|
@@ -226,10 +226,10 @@ class xe {
|
|
|
226
226
|
}
|
|
227
227
|
async format() {
|
|
228
228
|
await c.animate("Formatting modified files", async () => {
|
|
229
|
-
const e = o.exists("prettier.config.js") || o.contains("package.json", '"prettier": {'), t = o.exists(".eslintrc.js") || o.contains("package.json", '"eslintConfig"'), s = o.contains("package.json", '"prettier-eslint-cli"') ? (n) =>
|
|
230
|
-
e && await
|
|
229
|
+
const e = o.exists("prettier.config.js") || o.contains("package.json", '"prettier": {'), t = o.exists(".eslintrc.js") || o.contains("package.json", '"eslintConfig"'), s = o.contains("package.json", '"prettier-eslint-cli"') ? (n) => y.run(`npx prettier-eslint ${n} --write`) : async (n) => {
|
|
230
|
+
e && await y.run(`npx prettier ${n} --write`), n.match(/\.(ts|js|vue)$/) && t && await y.run(`npx eslint ${n} --fix`);
|
|
231
231
|
};
|
|
232
|
-
await Promise.all(
|
|
232
|
+
await Promise.all(O(this.modifiedFiles).map(async (n) => s(n)));
|
|
233
233
|
});
|
|
234
234
|
}
|
|
235
235
|
async save(e) {
|
|
@@ -246,43 +246,55 @@ class G {
|
|
|
246
246
|
async create(e) {
|
|
247
247
|
o.exists(e) && (!o.isDirectory(e) || !o.isEmptyDirectory(e)) && c.fail(`Folder at '${e}' already exists!`), await ye().clone("https://github.com/NoelDeMartin/aerogel-template.git", e, {
|
|
248
248
|
"--depth": 1
|
|
249
|
-
}), o.delete(
|
|
249
|
+
}), o.delete(h(e, ".git"));
|
|
250
250
|
const t = this.getDependencies();
|
|
251
251
|
o.replace(
|
|
252
|
-
|
|
252
|
+
h(e, "vite.config.ts"),
|
|
253
253
|
"Aerogel({ name: 'Aerogel' })",
|
|
254
254
|
`Aerogel({ name: '${this.name}' })`
|
|
255
|
-
), o.replace(
|
|
255
|
+
), o.replace(h(e, "src/lang/en.yaml"), "title: 'App'", `title: '${this.name}'`);
|
|
256
256
|
for (const [i, s] of Object.entries(t))
|
|
257
|
-
o.replace(
|
|
258
|
-
$.instantiate(
|
|
257
|
+
o.replace(h(e, "package.json"), new RegExp(`"${i}": ".*?"`, "g"), `"${i}": "${s}"`);
|
|
258
|
+
$.instantiate(N("app"), e, { app: { name: this.name } });
|
|
259
259
|
}
|
|
260
260
|
edit() {
|
|
261
|
-
return new
|
|
261
|
+
return new Se();
|
|
262
262
|
}
|
|
263
263
|
getDependencies() {
|
|
264
|
-
const e = (
|
|
265
|
-
(
|
|
264
|
+
const e = (i) => Object.entries(i).reduce(
|
|
265
|
+
(s, [n, l]) => Object.assign(s, { [n]: `file:${l}` }),
|
|
266
266
|
{}
|
|
267
|
-
);
|
|
268
|
-
return this.options.linkedLocal ?
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
267
|
+
), t = {};
|
|
268
|
+
return this.options.next && (t["@aerogel/cli"] = "next", t["@aerogel/core"] = "next", t["@aerogel/cypress"] = "next", t["@aerogel/plugin-i18n"] = "next", t["@aerogel/plugin-local-first"] = "next", t["@aerogel/plugin-routing"] = "next", t["@aerogel/plugin-solid"] = "next", t["@aerogel/plugin-soukai"] = "next", t["@aerogel/vite"] = "next", t["@noeldemartin/solid-utils"] = "next", t["@noeldemartin/utils"] = "next", t["soukai-solid"] = "next", t.soukai = "next"), this.options.linkedLocal ? Object.assign(
|
|
269
|
+
t,
|
|
270
|
+
e({
|
|
271
|
+
"@aerogel/cli": u("cli"),
|
|
272
|
+
"@aerogel/core": u("core"),
|
|
273
|
+
"@aerogel/cypress": u("cypress"),
|
|
274
|
+
"@aerogel/plugin-i18n": u("plugin-i18n"),
|
|
275
|
+
"@aerogel/plugin-routing": u("plugin-routing"),
|
|
276
|
+
"@aerogel/plugin-soukai": u("plugin-soukai"),
|
|
277
|
+
"@aerogel/plugin-solid": u("plugin-solid"),
|
|
278
|
+
"@aerogel/plugin-local-first": u("plugin-local-first"),
|
|
279
|
+
"@aerogel/vite": u("vite")
|
|
280
|
+
})
|
|
281
|
+
) : this.options.local && Object.assign(
|
|
282
|
+
t,
|
|
283
|
+
e({
|
|
284
|
+
"@aerogel/cli": m("cli") ?? g("cli"),
|
|
285
|
+
"@aerogel/core": m("core") ?? g("core"),
|
|
286
|
+
"@aerogel/cypress": m("cypress") ?? g("cypress"),
|
|
287
|
+
"@aerogel/plugin-i18n": m("plugin-i18n") ?? g("plugin-i18n"),
|
|
288
|
+
"@aerogel/plugin-routing": m("plugin-routing") ?? g("plugin-routing"),
|
|
289
|
+
"@aerogel/plugin-soukai": m("plugin-soukai") ?? g("plugin-soukai"),
|
|
290
|
+
"@aerogel/plugin-solid": m("plugin-solid") ?? g("plugin-solid"),
|
|
291
|
+
"@aerogel/plugin-local-first": m("plugin-local-first") ?? g("plugin-local-first"),
|
|
292
|
+
"@aerogel/vite": m("vite") ?? g("vite")
|
|
293
|
+
})
|
|
294
|
+
), t;
|
|
283
295
|
}
|
|
284
296
|
}
|
|
285
|
-
class
|
|
297
|
+
class f {
|
|
286
298
|
static define(e) {
|
|
287
299
|
e = e.command(this.command).description(this.description);
|
|
288
300
|
for (const [t, i] of this.parameters)
|
|
@@ -309,8 +321,8 @@ class u {
|
|
|
309
321
|
c.fail(`${i} Are you sure this is an Aerogel app?`);
|
|
310
322
|
}
|
|
311
323
|
}
|
|
312
|
-
a(
|
|
313
|
-
class j extends
|
|
324
|
+
a(f, "command", ""), a(f, "description", ""), a(f, "parameters", []), a(f, "options", {});
|
|
325
|
+
class j extends f {
|
|
314
326
|
constructor(t, i = {}) {
|
|
315
327
|
super();
|
|
316
328
|
a(this, "path");
|
|
@@ -319,7 +331,7 @@ class j extends u {
|
|
|
319
331
|
}
|
|
320
332
|
async run() {
|
|
321
333
|
const t = this.path, i = this.options.name ?? ae(de(t));
|
|
322
|
-
|
|
334
|
+
y.setWorkingDirectory(t), await this.createApp(i, t), await this.initializeGit(), c.success(`
|
|
323
335
|
|
|
324
336
|
That's it! You can start working on **${i}** doing the following:
|
|
325
337
|
|
|
@@ -332,13 +344,14 @@ class j extends u {
|
|
|
332
344
|
}
|
|
333
345
|
async createApp(t, i) {
|
|
334
346
|
c.info(`Creating **${t}**...`), await new G(t, {
|
|
347
|
+
next: this.options.next,
|
|
335
348
|
local: this.options.local,
|
|
336
349
|
linkedLocal: this.options.local && !this.options.copy
|
|
337
350
|
}).create(i);
|
|
338
351
|
}
|
|
339
352
|
async initializeGit() {
|
|
340
353
|
await c.animate("Initializing git", async () => {
|
|
341
|
-
await
|
|
354
|
+
await y.run("git init"), await y.run("git add ."), await y.run('git commit -m "Start"');
|
|
342
355
|
});
|
|
343
356
|
}
|
|
344
357
|
}
|
|
@@ -348,6 +361,10 @@ a(j, "command", "create"), a(j, "description", "Create AerogelJS app"), a(j, "pa
|
|
|
348
361
|
type: "boolean",
|
|
349
362
|
description: "Whether to create an app using local Aerogel packages (used for core development)"
|
|
350
363
|
},
|
|
364
|
+
next: {
|
|
365
|
+
type: "boolean",
|
|
366
|
+
description: "Whether to use the bleeding edge version for dependencies"
|
|
367
|
+
},
|
|
351
368
|
copy: {
|
|
352
369
|
type: "boolean",
|
|
353
370
|
description: "Whether to create an app linked to local Aerogel packages (used in CI)"
|
|
@@ -365,7 +382,7 @@ function je() {
|
|
|
365
382
|
function v(r, e = {}) {
|
|
366
383
|
if (!r)
|
|
367
384
|
return;
|
|
368
|
-
const t = e.guard ?? (() => !0), i = e.validate ?? (() => !0), s =
|
|
385
|
+
const t = e.guard ?? (() => !0), i = e.validate ?? (() => !0), s = O(e.skip ?? []);
|
|
369
386
|
return r.forEachDescendant((n, l) => {
|
|
370
387
|
if (t(n) && i(n))
|
|
371
388
|
return n;
|
|
@@ -377,7 +394,7 @@ function U(r, e) {
|
|
|
377
394
|
if (!(!r || !e(r)))
|
|
378
395
|
return r;
|
|
379
396
|
}
|
|
380
|
-
class
|
|
397
|
+
class P extends f {
|
|
381
398
|
constructor(t) {
|
|
382
399
|
super();
|
|
383
400
|
a(this, "path");
|
|
@@ -387,7 +404,7 @@ class b extends u {
|
|
|
387
404
|
this.assertAerogelOrDirectory("src/components");
|
|
388
405
|
const t = /* @__PURE__ */ new Set(), [i, s] = this.parsePathComponents();
|
|
389
406
|
await this.createComponent(i, s, t), await this.declareComponents();
|
|
390
|
-
const n =
|
|
407
|
+
const n = O(t).map((l) => `- ${l}`).join(`
|
|
391
408
|
`);
|
|
392
409
|
c.info(`${s} component created successfully! The following files were created:
|
|
393
410
|
|
|
@@ -395,7 +412,7 @@ ${n}`);
|
|
|
395
412
|
}
|
|
396
413
|
async createComponent(t, i, s) {
|
|
397
414
|
await c.animate("Creating component", async () => {
|
|
398
|
-
o.exists(`src/components/${this.path}.vue`) && c.fail(`${this.path} component already exists!`), $.instantiate(
|
|
415
|
+
o.exists(`src/components/${this.path}.vue`) && c.fail(`${this.path} component already exists!`), $.instantiate(N("component"), `src/components/${t}`, {
|
|
399
416
|
component: {
|
|
400
417
|
name: i,
|
|
401
418
|
slug: oe(i)
|
|
@@ -437,10 +454,10 @@ ${n}`);
|
|
|
437
454
|
return t === -1 ? ["", this.path] : [this.path.substring(0, t), this.path.substring(t + 1)];
|
|
438
455
|
}
|
|
439
456
|
}
|
|
440
|
-
a(
|
|
457
|
+
a(P, "command", "generate:component"), a(P, "description", "Generate an AerogelJS Component"), a(P, "parameters", [
|
|
441
458
|
["path", "Component path (relative to components folder; extension not necessary)"]
|
|
442
459
|
]);
|
|
443
|
-
class F extends
|
|
460
|
+
class F extends f {
|
|
444
461
|
constructor(t, i = {}) {
|
|
445
462
|
super();
|
|
446
463
|
a(this, "name");
|
|
@@ -449,7 +466,7 @@ class F extends u {
|
|
|
449
466
|
}
|
|
450
467
|
async run() {
|
|
451
468
|
this.assertAerogelOrDirectory("src/models"), o.exists(`src/models/${this.name}.ts`) && c.fail(`${this.name} model already exists!`), this.assertSoukaiInstalled();
|
|
452
|
-
const t = await c.animate("Creating model", async () => $.instantiate(
|
|
469
|
+
const t = await c.animate("Creating model", async () => $.instantiate(N("model"), "src/models", {
|
|
453
470
|
model: {
|
|
454
471
|
name: this.name,
|
|
455
472
|
fieldsDefinition: this.getFieldsDefinition()
|
|
@@ -492,7 +509,7 @@ ${n},`;
|
|
|
492
509
|
a(F, "command", "generate:model"), a(F, "description", "Generate an AerogelJS Model"), a(F, "parameters", [["name", "Model name"]]), a(F, "options", {
|
|
493
510
|
fields: "Create model with the given fields"
|
|
494
511
|
});
|
|
495
|
-
class I extends
|
|
512
|
+
class I extends f {
|
|
496
513
|
constructor(t) {
|
|
497
514
|
super();
|
|
498
515
|
a(this, "name");
|
|
@@ -502,7 +519,7 @@ class I extends u {
|
|
|
502
519
|
this.assertAerogelOrDirectory("src/services");
|
|
503
520
|
const t = /* @__PURE__ */ new Set(), i = q().edit();
|
|
504
521
|
await this.createService(t), await this.registerService(i), await i.format();
|
|
505
|
-
const s =
|
|
522
|
+
const s = O(t).map((n) => `- ${n}`).join(`
|
|
506
523
|
`);
|
|
507
524
|
c.info(`${this.name} service created successfully! The following files were created:
|
|
508
525
|
|
|
@@ -510,7 +527,7 @@ ${s}`);
|
|
|
510
527
|
}
|
|
511
528
|
async createService(t) {
|
|
512
529
|
await c.animate("Creating service", async () => {
|
|
513
|
-
o.exists(`src/services/${this.name}.ts`) && c.fail(`${this.name} service already exists!`), $.instantiate(
|
|
530
|
+
o.exists(`src/services/${this.name}.ts`) && c.fail(`${this.name} service already exists!`), $.instantiate(N("service"), "src/services", {
|
|
514
531
|
service: {
|
|
515
532
|
name: this.name
|
|
516
533
|
}
|
|
@@ -570,9 +587,9 @@ ${s}`);
|
|
|
570
587
|
}
|
|
571
588
|
}
|
|
572
589
|
a(I, "command", "generate:service"), a(I, "description", "Generate an AerogelJS Service"), a(I, "parameters", [["name", "Service name"]]);
|
|
573
|
-
class z extends
|
|
590
|
+
class z extends f {
|
|
574
591
|
async run() {
|
|
575
|
-
c.info("[AerogelJS CLI info]"), c.info("Installation directory: " +
|
|
592
|
+
c.info("[AerogelJS CLI info]"), c.info("Installation directory: " + x(new S(
|
|
576
593
|
/* @vite-ignore */
|
|
577
594
|
"./",
|
|
578
595
|
import.meta.url
|
|
@@ -616,7 +633,7 @@ class R {
|
|
|
616
633
|
}
|
|
617
634
|
async installDependencies() {
|
|
618
635
|
await c.animate("Installing plugin dependencies", async () => {
|
|
619
|
-
await
|
|
636
|
+
await y.run("pnpm install --no-save");
|
|
620
637
|
});
|
|
621
638
|
}
|
|
622
639
|
async updateFiles(e) {
|
|
@@ -626,13 +643,13 @@ class R {
|
|
|
626
643
|
if (je()) {
|
|
627
644
|
w(
|
|
628
645
|
this.getNpmPackageName(),
|
|
629
|
-
`file:${
|
|
646
|
+
`file:${u(this.getLocalPackageName())}`,
|
|
630
647
|
this.isForDevelopment()
|
|
631
648
|
);
|
|
632
649
|
return;
|
|
633
650
|
}
|
|
634
651
|
if ($e()) {
|
|
635
|
-
const e =
|
|
652
|
+
const e = m(this.getLocalPackageName()) ?? g(this.getLocalPackageName());
|
|
636
653
|
w(this.getNpmPackageName(), `file:${e}`, this.isForDevelopment());
|
|
637
654
|
return;
|
|
638
655
|
}
|
|
@@ -709,8 +726,8 @@ class Ae extends R {
|
|
|
709
726
|
o.write(
|
|
710
727
|
"package.json",
|
|
711
728
|
t.replace(
|
|
712
|
-
'"cy:dev": "concurrently --kill-others \\"
|
|
713
|
-
'"cy:dev": "concurrently --kill-others \\"
|
|
729
|
+
'"cy:dev": "concurrently --kill-others \\"pnpm test:serve-app\\" \\"pnpm cy:open\\"",',
|
|
730
|
+
'"cy:dev": "concurrently --kill-others \\"pnpm test:serve-app\\" \\"pnpm test:serve-pod\\" \\"pnpm cy:open\\"",'
|
|
714
731
|
).replace(
|
|
715
732
|
'"cy:test": "start-server-and-test test:serve-app http-get://localhost:5001 cy:run",',
|
|
716
733
|
'"cy:test": "start-server-and-test test:serve-app http-get://localhost:5001 test:serve-pod http-get://localhost:3000 cy:run",'
|
|
@@ -747,7 +764,7 @@ const _ = [new De(), new Ae(), new Fe()].reduce(
|
|
|
747
764
|
(r, e) => Object.assign(r, { [e.name]: e }),
|
|
748
765
|
{}
|
|
749
766
|
);
|
|
750
|
-
class A extends
|
|
767
|
+
class A extends f {
|
|
751
768
|
constructor(t, i = {}) {
|
|
752
769
|
super();
|
|
753
770
|
a(this, "options");
|
|
@@ -766,13 +783,13 @@ a(A, "command", "install"), a(A, "description", "Install an AerogelJS plugin"),
|
|
|
766
783
|
description: "Skip installing dependencies, just add them to package.json"
|
|
767
784
|
}
|
|
768
785
|
});
|
|
769
|
-
class
|
|
786
|
+
class be {
|
|
770
787
|
run(e) {
|
|
771
788
|
const t = new X();
|
|
772
|
-
t.name("gel").description("AerogelJS CLI").version(this.getVersion()), j.define(t),
|
|
789
|
+
t.name("gel").description("AerogelJS CLI").version(this.getVersion()), j.define(t), P.define(t), F.define(t), I.define(t), z.define(t), A.define(t), t.parse(e);
|
|
773
790
|
}
|
|
774
791
|
getVersion() {
|
|
775
|
-
const e = "Could not find CLI's version, please report this bug.", t =
|
|
792
|
+
const e = "Could not find CLI's version, please report this bug.", t = x(new S(
|
|
776
793
|
/* @vite-ignore */
|
|
777
794
|
"../package.json",
|
|
778
795
|
import.meta.url
|
|
@@ -782,7 +799,7 @@ class Pe {
|
|
|
782
799
|
return JSON.parse(J(t).toString()).version ?? pe(e);
|
|
783
800
|
}
|
|
784
801
|
}
|
|
785
|
-
const qe = L(
|
|
802
|
+
const qe = L(be);
|
|
786
803
|
export {
|
|
787
804
|
qe as CLI
|
|
788
805
|
};
|
package/dist/aerogel-cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aerogel-cli.js","sources":["../src/lib/File.ts","../src/lib/Log.ts","../src/lib/Template.ts","../src/lib/utils/paths.ts","../src/lib/Shell.ts","../src/lib/Editor.ts","../src/lib/App.ts","../src/commands/Command.ts","../src/commands/create.ts","../src/lib/utils/app.ts","../src/lib/utils/edit.ts","../src/commands/generate-component.ts","../src/commands/generate-model.ts","../src/commands/generate-service.ts","../src/commands/info.ts","../src/utils/package.ts","../src/plugins/Plugin.ts","../src/plugins/LocalFirst.ts","../src/plugins/Solid.ts","../src/plugins/Soukai.ts","../src/commands/install.ts","../src/cli.ts"],"sourcesContent":["import {\n existsSync,\n lstatSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n rmSync,\n unlinkSync,\n writeFileSync,\n} from 'node:fs';\nimport { dirname, resolve } from 'node:path';\n\nimport { facade } from '@noeldemartin/utils';\n\nexport class FileService {\n\n public contains(path: string, contents: string): boolean {\n return !!this.read(path)?.includes(contents);\n }\n\n public exists(path: string): boolean {\n return existsSync(path);\n }\n\n public delete(path: string): void {\n if (this.isDirectory(path)) {\n rmSync(path, { recursive: true });\n\n return;\n }\n\n unlinkSync(path);\n }\n\n public isSymlink(path: string): boolean {\n const stats = lstatSync(path);\n\n return stats.isSymbolicLink();\n }\n\n public read(path: string): string | null {\n if (!this.isFile(path)) {\n return null;\n }\n\n return readFileSync(path).toString();\n }\n\n public replace(path: string, search: string | RegExp, replacement: string): void {\n const contents = this.read(path);\n\n if (!contents) {\n return;\n }\n\n this.write(path, contents.replaceAll(search, replacement));\n }\n\n public getFiles(directoryPath: string): string[] {\n const children = readdirSync(directoryPath, { withFileTypes: true });\n const files: string[] = [];\n\n for (const child of children) {\n const path = resolve(directoryPath, child.name);\n\n if (child.isDirectory()) {\n files.push(...this.getFiles(path));\n } else {\n files.push(path);\n }\n }\n\n return files;\n }\n\n public isDirectory(path: string): boolean {\n return this.exists(path) && lstatSync(path).isDirectory();\n }\n\n public isFile(path: string): boolean {\n return this.exists(path) && lstatSync(path).isFile();\n }\n\n public isEmptyDirectory(path: string): boolean {\n if (!this.isDirectory(path)) {\n return false;\n }\n\n return this.getFiles(path).length === 0;\n }\n\n public makeDirectory(path: string): void {\n mkdirSync(path, { recursive: true });\n }\n\n public write(path: string, contents: string): void {\n if (!existsSync(dirname(path))) {\n mkdirSync(dirname(path), { recursive: true });\n }\n\n writeFileSync(path, contents);\n }\n\n}\n\nexport default facade(FileService);\n","import chalk from 'chalk';\nimport { clearLine, cursorTo } from 'node:readline';\nimport { facade, stringMatchAll } from '@noeldemartin/utils';\n\nexport class LogService {\n\n protected renderInfo = chalk.hex('#00ffff');\n protected renderSuccess = chalk.hex('#00ff00');\n protected renderError = chalk.hex('#ff0000');\n\n public async animate<T>(message: string, operation: () => Promise<T>): Promise<T> {\n const updateStdout = (end: string = '', done: boolean = false) => {\n const progress =\n this.renderInfo(this.renderMarkdown(message) + (done ? '...' : '.'.repeat(frame % 4))) + end;\n\n this.stdout(progress);\n };\n\n let frame = 0;\n\n updateStdout();\n\n const interval = setInterval(() => (frame++, updateStdout()), 1000);\n const result = await operation();\n\n clearInterval(interval);\n updateStdout('\\n', true);\n\n return result;\n }\n\n public info(message: string): void {\n this.log(this.renderMarkdown(message), this.renderInfo);\n }\n\n public error(message: string): void {\n this.log(this.renderMarkdown(message), this.renderError);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public fail<T = any>(message: string): T {\n this.error(message);\n\n process.exit(1);\n }\n\n public success(message: string): void {\n this.log(this.renderMarkdown(message), this.renderSuccess);\n }\n\n protected renderMarkdown(message: string): string {\n const matches = stringMatchAll<2>(message, /\\*\\*(.*)\\*\\*/g);\n\n for (const match of matches) {\n message = message.replace(match[0], chalk.bold(match[1]));\n }\n\n return message;\n }\n\n protected log(message: string, formatMessage?: (message: string) => string): void {\n this.formatMessage(message).forEach((line) => {\n this.logLine(formatMessage ? formatMessage(line) : line);\n });\n }\n\n protected formatMessage(message: string): string[] {\n if (message[0] === '\\n') {\n message = message.slice(1).trimEnd();\n\n const lines = message.split('\\n');\n const firstLetter = message.trim()[0] ?? '';\n const indentation = lines.find((line) => line.trim().length > 0)?.indexOf(firstLetter) ?? 0;\n\n return lines.map((line) => line.slice(indentation));\n }\n\n return [message];\n }\n\n protected logLine(line: string): void {\n // eslint-disable-next-line no-console\n console.log(line);\n }\n\n protected stdout(message: string): void {\n cursorTo(process.stdout, 0);\n clearLine(process.stdout, 0);\n\n process.stdout.write(message);\n }\n\n}\n\nexport default facade(LogService);\n","import Mustache from 'mustache';\nimport { readFileSync } from 'node:fs';\nimport { toString } from '@noeldemartin/utils';\n\nimport File from '@aerogel/cli/lib/File';\n\nexport default class Template {\n\n public static instantiate(\n path: string,\n destination: string = './',\n replacements: Record<string, unknown> = {},\n ): string[] {\n const template = new Template(path);\n\n return template.instantiate(destination, replacements);\n }\n\n constructor(public path: string) {}\n\n public instantiate(destination: string, replacements: Record<string, unknown> = {}): string[] {\n const filenameReplacements = this.getFilenameReplacements(replacements);\n const files: string[] = [];\n destination = `${destination}/`.replace(/\\/\\//, '/');\n\n for (const file of File.getFiles(this.path)) {\n const relativePath = Object.entries(filenameReplacements).reduce(\n (path, [match, replacement]) => path.replaceAll(match, replacement),\n file.substring(this.path.length + 1),\n );\n const fileContents = readFileSync(file).toString();\n const filePath =\n destination + (relativePath.endsWith('.template') ? relativePath.slice(0, -9) : relativePath);\n\n File.write(filePath, Mustache.render(fileContents, replacements, undefined, ['<%', '%>']));\n files.push(filePath);\n }\n\n return files;\n }\n\n protected getFilenameReplacements(\n replacements: Record<string, unknown>,\n prefix: string = '',\n ): Record<string, string> {\n return Object.entries(replacements).reduce(\n (filenameReplacements, [key, value]) => {\n if (typeof value === 'object') {\n Object.assign(\n filenameReplacements,\n this.getFilenameReplacements(value as Record<string, unknown>, `${key}.`),\n );\n } else {\n filenameReplacements[`[${prefix}${key}]`] = toString(value);\n }\n\n return filenameReplacements;\n },\n {} as Record<string, string>,\n );\n }\n\n}\n","import { URL, fileURLToPath } from 'node:url';\nimport { stringMatch } from '@noeldemartin/utils';\nimport { resolve } from 'node:path';\n\nimport File from '@aerogel/cli/lib/File';\nimport Log from '@aerogel/cli/lib/Log';\n\nexport function basePath(path: string = ''): string {\n if (process.env.AEROGEL_BASE_PATH) {\n return resolve(process.env.AEROGEL_BASE_PATH, path);\n }\n\n if (\n File.contains(\n fileURLToPath(new URL(/* @vite-ignore */ '../../../package.json', import.meta.url)),\n '\"packages/create-aerogel\"',\n )\n ) {\n return resolve(fileURLToPath(new URL(/* @vite-ignore */ '../', import.meta.url)), path);\n }\n\n const packageJson = File.read(\n fileURLToPath(new URL(/* @vite-ignore */ '../../../../package.json', import.meta.url)),\n );\n const matches = stringMatch<2>(packageJson ?? '', /\"@aerogel\\/core\": \"file:(.*)\\/aerogel-core-[\\d.]*\\.tgz\"/);\n const cliPath = matches?.[1] ?? Log.fail<string>('Could not determine base path');\n\n return resolve(cliPath, path);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function packNotFound(packageName: string): any {\n return Log.fail(`Could not find ${packageName} pack file, did you run 'npm pack'?`);\n}\n\nexport function packagePackPath(packageName: string): string | null {\n return File.getFiles(packagePath(packageName)).find((file) => file.endsWith('.tgz')) ?? null;\n}\n\nexport function packagePath(packageName: string): string {\n return basePath(`../${packageName}`);\n}\n\nexport function templatePath(name: string): string {\n return fileURLToPath(new URL(/* @vite-ignore */ `../templates/${name}`, import.meta.url));\n}\n","import { exec } from 'node:child_process';\nimport { facade } from '@noeldemartin/utils';\n\nexport class ShellService {\n\n private cwd: string | null = null;\n\n public setWorkingDirectory(cwd: string): void {\n this.cwd = cwd;\n }\n\n public async run(command: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n exec(command, { cwd: this.cwd ?? undefined }, (error) => {\n if (error) {\n reject(error);\n\n return;\n }\n\n resolve();\n });\n });\n }\n\n}\n\nexport default facade(ShellService);\n","import { arrayFrom } from '@noeldemartin/utils';\nimport { Project } from 'ts-morph';\nimport type { SourceFile } from 'ts-morph';\n\nimport File from '@aerogel/cli/lib/File';\nimport Log from '@aerogel/cli/lib/Log';\nimport Shell from '@aerogel/cli/lib/Shell';\n\nexport class Editor {\n\n private project: Project;\n private modifiedFiles: Set<string>;\n\n constructor() {\n this.project = new Project({ tsConfigFilePath: 'tsconfig.json' });\n this.modifiedFiles = new Set();\n\n this.project.addSourceFilesAtPaths('src/**/*.ts');\n this.project.addSourceFilesAtPaths('vite.config.ts');\n this.project.addSourceFilesAtPaths('package.json');\n }\n\n public addSourceFile(path: string): void {\n this.project.addSourceFilesAtPaths(path);\n }\n\n public requireSourceFile(path: string): SourceFile {\n return this.project.getSourceFileOrThrow(path);\n }\n\n public async format(): Promise<void> {\n await Log.animate('Formatting modified files', async () => {\n const usingPrettier = File.exists('prettier.config.js') || File.contains('package.json', '\"prettier\": {');\n const usingESLint = File.exists('.eslintrc.js') || File.contains('package.json', '\"eslintConfig\"');\n const usingPrettierESLint = File.contains('package.json', '\"prettier-eslint-cli\"');\n const formatFile = usingPrettierESLint\n ? (file: string) => Shell.run(`npx prettier-eslint ${file} --write`)\n : async (file: string) => {\n usingPrettier && (await Shell.run(`npx prettier ${file} --write`));\n file.match(/\\.(ts|js|vue)$/) && usingESLint && (await Shell.run(`npx eslint ${file} --fix`));\n };\n\n await Promise.all(arrayFrom(this.modifiedFiles).map(async (file) => formatFile(file)));\n });\n }\n\n public async save(file: SourceFile): Promise<void> {\n await file.save();\n\n this.addModifiedFile(file.getFilePath());\n }\n\n public addModifiedFile(path: string): void {\n this.modifiedFiles.add(path);\n }\n\n}\n","import { resolve } from 'node:path';\n\nimport File from '@aerogel/cli/lib/File';\nimport Log from '@aerogel/cli/lib/Log';\nimport Template from '@aerogel/cli/lib/Template';\nimport { packNotFound, packagePackPath, packagePath, templatePath } from '@aerogel/cli/lib/utils/paths';\nimport { Editor } from '@aerogel/cli/lib/Editor';\nimport { simpleGit } from 'simple-git';\n\nexport interface Options {\n local?: boolean;\n linkedLocal?: boolean;\n}\n\nexport default class App {\n\n constructor(\n protected name: string,\n protected options: Options = {},\n ) {}\n\n public async create(path: string): Promise<void> {\n if (File.exists(path) && (!File.isDirectory(path) || !File.isEmptyDirectory(path))) {\n Log.fail(`Folder at '${path}' already exists!`);\n }\n\n // Clone repository\n await simpleGit().clone('https://github.com/NoelDeMartin/aerogel-template.git', path, {\n '--depth': 1,\n });\n\n File.delete(resolve(path, '.git'));\n\n // Apply replacements\n const dependencies = this.getDependencies();\n\n File.replace(\n resolve(path, 'vite.config.ts'),\n 'Aerogel({ name: \\'Aerogel\\' })',\n `Aerogel({ name: '${this.name}' })`,\n );\n\n File.replace(resolve(path, 'src/lang/en.yaml'), 'title: \\'App\\'', `title: '${this.name}'`);\n\n for (const [name, version] of Object.entries(dependencies)) {\n File.replace(resolve(path, 'package.json'), new RegExp(`\"${name}\": \".*?\"`, 'g'), `\"${name}\": \"${version}\"`);\n }\n\n // Copy template\n Template.instantiate(templatePath('app'), path, { app: { name: this.name } });\n }\n\n public edit(): Editor {\n return new Editor();\n }\n\n protected getDependencies(): Record<string, string> {\n const withFilePrefix = <T extends Record<string, string>>(paths: T) =>\n Object.entries(paths).reduce(\n (pathsWithFile, [name, path]) => Object.assign(pathsWithFile, { [name]: `file:${path}` }) as T,\n {} as T,\n );\n\n if (this.options.linkedLocal) {\n return withFilePrefix({\n '@aerogel/cli': packagePath('cli'),\n '@aerogel/core': packagePath('core'),\n '@aerogel/cypress': packagePath('cypress'),\n '@aerogel/plugin-i18n': packagePath('plugin-i18n'),\n '@aerogel/plugin-soukai': packagePath('plugin-soukai'),\n '@aerogel/vite': packagePath('vite'),\n });\n }\n\n if (this.options.local) {\n return withFilePrefix({\n '@aerogel/cli': packagePackPath('cli') ?? packNotFound('cli'),\n '@aerogel/core': packagePackPath('core') ?? packNotFound('core'),\n '@aerogel/cypress': packagePackPath('cypress') ?? packNotFound('cypress'),\n '@aerogel/plugin-i18n': packagePackPath('plugin-i18n') ?? packNotFound('plugin-i18n'),\n '@aerogel/plugin-soukai': packagePackPath('plugin-soukai') ?? packNotFound('plugin-soukai'),\n '@aerogel/vite': packagePackPath('vite') ?? packNotFound('vite'),\n });\n }\n\n return {};\n }\n\n}\n","import File from '@aerogel/cli/lib/File';\nimport Log from '@aerogel/cli/lib/Log';\nimport type { Constructor } from '@noeldemartin/utils';\nimport type { Command as CommanderCommand } from 'commander';\n\nexport type CommandConstructor<T extends Command = Command> = Constructor<T>;\nexport type CommandOptions = Record<string, string | { description: string; type?: string }>;\n\nexport default class Command {\n\n protected static command: string = '';\n protected static description: string = '';\n protected static parameters: [string, string][] = [];\n protected static options: CommandOptions = {};\n\n public static define(program: CommanderCommand): void {\n program = program.command(this.command).description(this.description);\n\n for (const [name, description] of this.parameters) {\n program = program.argument(`<${name}>`, description);\n }\n\n for (const [name, definition] of Object.entries(this.options)) {\n const description = typeof definition === 'string' ? definition : definition.description;\n const type = typeof definition === 'string' ? 'string' : (definition.type ?? 'string');\n\n program = program.option(type === 'boolean' ? `--${name}` : `--${name} <${type}>`, description);\n }\n\n program = program.action((...args) => this.run.call(this, ...args));\n }\n\n public static async run<T extends CommandConstructor>(this: T, ...args: ConstructorParameters<T>): Promise<void> {\n const instance = new this(...args);\n\n await instance.validate();\n await instance.run();\n }\n\n protected async validate(): Promise<void> {\n // Placeholder for overrides, don't place any functionality here.\n }\n\n protected async run(): Promise<void> {\n // Placeholder for overrides, don't place any functionality here.\n }\n\n protected assertAerogelOrDirectory(path?: string): void {\n const packageJson = File.read('package.json');\n\n if (packageJson?.includes('@aerogel/core')) {\n return;\n }\n\n if (path && File.isDirectory(path)) {\n return;\n }\n\n const message = path ? `${path} folder does not exist.` : 'package.json does not contain @aerogel/core.';\n\n Log.fail(`${message} Are you sure this is an Aerogel app?`);\n }\n\n}\n","import { basename } from 'node:path';\nimport { stringToTitleCase } from '@noeldemartin/utils';\n\nimport App from '@aerogel/cli/lib/App';\nimport Command from '@aerogel/cli/commands/Command';\nimport Log from '@aerogel/cli/lib/Log';\nimport Shell from '@aerogel/cli/lib/Shell';\nimport type { CommandOptions } from '@aerogel/cli/commands/Command';\n\nexport interface Options {\n name?: string;\n local?: boolean;\n copy?: boolean;\n}\n\nexport class CreateCommand extends Command {\n\n protected static override command: string = 'create';\n protected static override description: string = 'Create AerogelJS app';\n protected static override parameters: [string, string][] = [['path', 'Application path']];\n protected static override options: CommandOptions = {\n name: 'Application name',\n local: {\n type: 'boolean',\n description: 'Whether to create an app using local Aerogel packages (used for core development)',\n },\n copy: {\n type: 'boolean',\n description: 'Whether to create an app linked to local Aerogel packages (used in CI)',\n },\n };\n\n private path: string;\n private options: Options;\n\n constructor(path: string, options: Options = {}) {\n super();\n\n this.path = path;\n this.options = options;\n }\n\n protected override async run(): Promise<void> {\n const path = this.path;\n const name = this.options.name ?? stringToTitleCase(basename(path));\n\n Shell.setWorkingDirectory(path);\n\n await this.createApp(name, path);\n await this.initializeGit();\n\n Log.success(`\n\n That's it! You can start working on **${name}** doing the following:\n\n cd ${path}\n pnpm install\n pnpm dev\n\n Have fun!\n `);\n }\n\n protected async createApp(name: string, path: string): Promise<void> {\n Log.info(`Creating **${name}**...`);\n\n const app = new App(name, {\n local: this.options.local,\n linkedLocal: this.options.local && !this.options.copy,\n });\n\n await app.create(path);\n }\n\n protected async initializeGit(): Promise<void> {\n await Log.animate('Initializing git', async () => {\n await Shell.run('git init');\n await Shell.run('git add .');\n await Shell.run('git commit -m \"Start\"');\n });\n }\n\n}\n","import App from '@aerogel/cli/lib/App';\nimport File from '@aerogel/cli/lib/File';\n\nexport function app(): App {\n // TODO parse app name\n return new App('');\n}\n\nexport function isLocalApp(): boolean {\n return File.contains('package.json', '\"@aerogel/core\": \"file:');\n}\n\nexport function isLinkedLocalApp(): boolean {\n return File.isSymlink('node_modules/@aerogel/core');\n}\n","import { arrayFrom } from '@noeldemartin/utils';\nimport type { Node, SyntaxKind } from 'ts-morph';\n\nexport function editFiles(): boolean {\n // TODO mock editor instead of relying on this for unit tests\n return true;\n}\n\nexport function findDescendant<T extends Node>(\n node: Node | undefined,\n options: {\n guard?: (node: Node | undefined) => node is T;\n validate?: (node: T) => boolean;\n skip?: SyntaxKind | SyntaxKind[];\n } = {},\n): T | undefined {\n if (!node) {\n return;\n }\n\n const guard = options.guard ?? (() => true);\n const validate = options.validate ?? (() => true);\n const skipKinds = arrayFrom(options.skip ?? []);\n\n return node.forEachDescendant((descendant, traversal) => {\n if (guard(descendant) && validate(descendant as T)) {\n return descendant as T;\n }\n\n const descendantKind = descendant.getKind();\n\n if (skipKinds.includes(descendantKind)) {\n traversal.skip();\n }\n });\n}\n\nexport function when<T extends Node>(node: Node | undefined, assertion: (node: Node) => node is T): T | undefined {\n if (!node || !assertion(node)) {\n return;\n }\n\n return node as T;\n}\n","import { arrayFrom, stringToSlug } from '@noeldemartin/utils';\nimport { Node, SyntaxKind } from 'ts-morph';\nimport type { ArrayLiteralExpression, CallExpression, SourceFile } from 'ts-morph';\n\nimport Command from '@aerogel/cli/commands/Command';\nimport File from '@aerogel/cli/lib/File';\nimport Log from '@aerogel/cli/lib/Log';\nimport Template from '@aerogel/cli/lib/Template';\nimport { app } from '@aerogel/cli/lib/utils/app';\nimport { editFiles, findDescendant } from '@aerogel/cli/lib/utils/edit';\nimport { templatePath } from '@aerogel/cli/lib/utils/paths';\n\nexport interface Options {\n button?: boolean;\n checkbox?: boolean;\n input?: boolean;\n story?: boolean;\n}\n\nexport class GenerateComponentCommand extends Command {\n\n protected static override command: string = 'generate:component';\n protected static override description: string = 'Generate an AerogelJS Component';\n protected static override parameters: [string, string][] = [\n ['path', 'Component path (relative to components folder; extension not necessary)'],\n ];\n\n private path: string;\n\n constructor(path: string) {\n super();\n\n this.path = path;\n }\n\n protected override async run(): Promise<void> {\n this.assertAerogelOrDirectory('src/components');\n\n const files = new Set<string>();\n const [directoryName, componentName] = this.parsePathComponents();\n\n await this.createComponent(directoryName, componentName, files);\n await this.declareComponents();\n\n const filesList = arrayFrom(files)\n .map((file) => `- ${file}`)\n .join('\\n');\n\n Log.info(`${componentName} component created successfully! The following files were created:\\n\\n${filesList}`);\n }\n\n protected async createComponent(directoryName: string, componentName: string, files: Set<string>): Promise<void> {\n await Log.animate('Creating component', async () => {\n if (File.exists(`src/components/${this.path}.vue`)) {\n Log.fail(`${this.path} component already exists!`);\n }\n\n const componentFiles = Template.instantiate(templatePath('component'), `src/components/${directoryName}`, {\n component: {\n name: componentName,\n slug: stringToSlug(componentName),\n },\n });\n\n componentFiles.forEach((file) => files.add(file));\n });\n }\n\n protected async declareComponents(): Promise<void> {\n if (!editFiles()) {\n return;\n }\n\n const editor = app().edit();\n const viteConfig = editor.requireSourceFile('vite.config.ts');\n const componentDirsArray = this.getComponentDirsArray(viteConfig);\n\n if (!componentDirsArray) {\n return Log.fail('Could not find component dirs declaration in vite config!');\n }\n\n if (\n componentDirsArray\n .getDescendantsOfKind(SyntaxKind.StringLiteral)\n .some((literal) => literal.getText() === '\\'src/components\\'')\n ) {\n return;\n }\n\n await Log.animate('Updating vite config', async () => {\n componentDirsArray.addElement('\\'src/components\\'');\n\n await editor.save(viteConfig);\n });\n\n await editor.format();\n }\n\n protected getComponentDirsArray(viteConfig: SourceFile): ArrayLiteralExpression | null {\n const pluginCall = findDescendant(viteConfig, {\n guard: Node.isCallExpression,\n validate: (callExpression) => callExpression.getText().startsWith('Components('),\n skip: SyntaxKind.ImportDeclaration,\n });\n\n if (!pluginCall) {\n return null;\n }\n\n const dirsAssignment = findDescendant(pluginCall, {\n guard: Node.isPropertyAssignment,\n validate: (propertyAssignment) => propertyAssignment.getName() === 'dirs',\n });\n\n const dirsArray = dirsAssignment?.getInitializer();\n\n if (!Node.isArrayLiteralExpression(dirsArray)) {\n return this.declareComponentDirsArray(pluginCall);\n }\n\n return dirsArray;\n }\n\n protected declareComponentDirsArray(pluginCall: CallExpression): ArrayLiteralExpression | null {\n const pluginOptions = findDescendant(pluginCall, { guard: Node.isObjectLiteralExpression });\n const dirsAssignment = pluginOptions?.addPropertyAssignment({\n name: 'dirs',\n initializer: '[]',\n });\n\n return (dirsAssignment?.getInitializer() as ArrayLiteralExpression) ?? null;\n }\n\n protected parsePathComponents(): [string, string] {\n const lastSlashIndex = this.path.lastIndexOf('/');\n\n return lastSlashIndex === -1\n ? ['', this.path]\n : [this.path.substring(0, lastSlashIndex), this.path.substring(lastSlashIndex + 1)];\n }\n\n}\n","import { formatCodeBlock, stringToStudlyCase } from '@noeldemartin/utils';\n\nimport Command from '@aerogel/cli/commands/Command';\nimport File from '@aerogel/cli/lib/File';\nimport Log from '@aerogel/cli/lib/Log';\nimport Template from '@aerogel/cli/lib/Template';\nimport { templatePath } from '@aerogel/cli/lib/utils/paths';\nimport type { CommandOptions } from '@aerogel/cli/commands/Command';\n\ninterface Options {\n fields?: string;\n}\n\nexport class GenerateModelCommand extends Command {\n\n protected static override command: string = 'generate:model';\n protected static override description: string = 'Generate an AerogelJS Model';\n protected static override parameters: [string, string][] = [['name', 'Model name']];\n protected static override options: CommandOptions = {\n fields: 'Create model with the given fields',\n };\n\n private name: string;\n private options: Options;\n\n constructor(name: string, options: Options = {}) {\n super();\n\n this.name = name;\n this.options = options;\n }\n\n protected override async run(): Promise<void> {\n this.assertAerogelOrDirectory('src/models');\n\n if (File.exists(`src/models/${this.name}.ts`)) {\n Log.fail(`${this.name} model already exists!`);\n }\n\n this.assertSoukaiInstalled();\n\n const filesList = await Log.animate('Creating model', async () => {\n const files = Template.instantiate(templatePath('model'), 'src/models', {\n model: {\n name: this.name,\n fieldsDefinition: this.getFieldsDefinition(),\n },\n });\n\n return files.map((file) => `- ${file}`).join('\\n');\n });\n\n Log.info(`${this.name} model created successfully! The following files were created:\\n\\n${filesList}`);\n }\n\n protected getFieldsDefinition(): string {\n if (!this.options.fields) {\n return ' //';\n }\n\n const code = this.options.fields\n .split(',')\n .map((field) => {\n const [name, type, rules] = field.split(':');\n\n return {\n name,\n type: stringToStudlyCase(type ?? 'string'),\n required: rules === 'required',\n };\n })\n .reduce((definition, field) => {\n const fieldDefinition = field.required\n ? formatCodeBlock(`\n ${field.name}: {\n type: FieldType.${field.type},\n required: true,\n }\n `)\n : `${field.name}: FieldType.${field.type}`;\n\n return definition + `\\n${fieldDefinition},`;\n }, '');\n\n return formatCodeBlock(code, { indent: 8 });\n }\n\n protected assertSoukaiInstalled(): void {\n if (!File.contains('package.json', '\"soukai\"') && !File.contains('package.json', '\"@aerogel/plugin-soukai\"')) {\n Log.fail(`\n Soukai is not installed yet! You can install it running:\n npx gel install soukai\n `);\n }\n }\n\n}\n","import { arrayFrom, formatCodeBlock, stringToCamelCase } from '@noeldemartin/utils';\nimport { Node, SyntaxKind } from 'ts-morph';\nimport type { ObjectLiteralExpression, SourceFile } from 'ts-morph';\n\nimport Command from '@aerogel/cli/commands/Command';\nimport File from '@aerogel/cli/lib/File';\nimport Log from '@aerogel/cli/lib/Log';\nimport Template from '@aerogel/cli/lib/Template';\nimport { app } from '@aerogel/cli/lib/utils/app';\nimport { templatePath } from '@aerogel/cli/lib/utils/paths';\nimport { editFiles, findDescendant } from '@aerogel/cli/lib/utils/edit';\nimport type { Editor } from '@aerogel/cli/lib/Editor';\n\nexport class GenerateServiceCommand extends Command {\n\n protected static override command: string = 'generate:service';\n protected static override description: string = 'Generate an AerogelJS Service';\n protected static override parameters: [string, string][] = [['name', 'Service name']];\n\n private name: string;\n\n constructor(name: string) {\n super();\n\n this.name = name;\n }\n\n protected override async run(): Promise<void> {\n this.assertAerogelOrDirectory('src/services');\n\n const files = new Set<string>();\n const editor = app().edit();\n\n await this.createService(files);\n\n if (editFiles()) {\n await this.registerService(editor);\n await editor.format();\n }\n\n const filesList = arrayFrom(files)\n .map((file) => `- ${file}`)\n .join('\\n');\n\n Log.info(`${this.name} service created successfully! The following files were created:\\n\\n${filesList}`);\n }\n\n protected async createService(files: Set<string>): Promise<void> {\n await Log.animate('Creating service', async () => {\n if (File.exists(`src/services/${this.name}.ts`)) {\n Log.fail(`${this.name} service already exists!`);\n }\n\n const serviceFiles = Template.instantiate(templatePath('service'), 'src/services', {\n service: {\n name: this.name,\n },\n });\n\n serviceFiles.forEach((file) => files.add(file));\n });\n }\n\n protected async registerService(editor: Editor): Promise<void> {\n await Log.animate('Registering service', async () => {\n if (!File.exists('src/services/index.ts')) {\n await this.createServicesIndex(editor);\n }\n\n const servicesIndex = editor.requireSourceFile('src/services/index.ts');\n const servicesObject = this.getServicesObject(servicesIndex);\n\n if (!servicesObject) {\n return Log.fail('Could not find services object in services config, please add it manually.');\n }\n\n servicesIndex.addImportDeclaration({\n defaultImport: this.name,\n moduleSpecifier: `./${this.name}`,\n });\n servicesObject.addPropertyAssignment({\n name: `$${stringToCamelCase(this.name)}`,\n initializer: this.name,\n });\n\n await editor.save(servicesIndex);\n });\n }\n\n protected async createServicesIndex(editor: Editor): Promise<void> {\n File.write(\n 'src/services/index.ts',\n formatCodeBlock(`\n export const services = {};\n\n export type AppServices = typeof services;\n\n declare module '@aerogel/core' {\n interface Services extends AppServices {}\n }\n `),\n );\n\n editor.addSourceFile('src/services/index.ts');\n\n const mainConfig = editor.requireSourceFile('src/main.ts');\n const bootstrapOptions = this.getBootstrapOptions(mainConfig);\n\n if (!bootstrapOptions) {\n return Log.fail('Could not find options object in bootstrap config, please add the services manually.');\n }\n\n bootstrapOptions.insertShorthandPropertyAssignment(0, { name: 'services' });\n mainConfig.addImportDeclaration({\n namedImports: ['services'],\n moduleSpecifier: './services',\n });\n\n await editor.save(mainConfig);\n }\n\n protected getBootstrapOptions(mainConfig: SourceFile): ObjectLiteralExpression | null {\n const bootstrapAppCall = findDescendant(mainConfig, {\n guard: Node.isCallExpression,\n validate: (callExpression) => callExpression.getExpression().getText() === 'bootstrap',\n skip: SyntaxKind.ImportDeclaration,\n });\n const bootstrapOptions = bootstrapAppCall?.getArguments()[1];\n\n if (!Node.isObjectLiteralExpression(bootstrapOptions)) {\n return null;\n }\n\n return bootstrapOptions;\n }\n\n protected getServicesObject(servicesIndex: SourceFile): ObjectLiteralExpression | null {\n const servicesDeclaration = findDescendant(servicesIndex, {\n guard: Node.isVariableDeclaration,\n validate: (variableDeclaration) => variableDeclaration.getName() === 'services',\n });\n const servicesObject = servicesDeclaration?.getInitializer();\n\n if (!Node.isObjectLiteralExpression(servicesObject)) {\n return null;\n }\n\n return servicesObject;\n }\n\n}\n","import { URL, fileURLToPath } from 'node:url';\n\nimport Command from '@aerogel/cli/commands/Command';\nimport Log from '@aerogel/cli/lib/Log';\nexport class InfoCommand extends Command {\n\n protected static override command: string = 'info';\n protected static override description: string = 'Show debugging information about the CLI';\n\n protected override async run(): Promise<void> {\n Log.info('[AerogelJS CLI info]');\n Log.info('Installation directory: ' + fileURLToPath(new URL(/* @vite-ignore */ './', import.meta.url)));\n }\n\n}\n","import { arraySorted } from '@noeldemartin/utils';\n\nimport File from '@aerogel/cli/lib/File';\n\nexport function addNpmDependency(name: string, version: string, development: boolean = false): void {\n const packageJson = (JSON.parse(File.read('package.json') ?? '{}') ?? {}) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const dependencies = (development ? packageJson?.devDependencies : packageJson?.dependencies) ?? {};\n const dependencyNames = arraySorted(Object.keys(dependencies).concat(name));\n const index = dependencyNames.indexOf(name);\n const previousDependency = dependencyNames[index - 1] ?? '';\n\n File.replace(\n 'package.json',\n `\"${previousDependency}\": \"${dependencies[previousDependency]}\",`,\n `\n \"${previousDependency}\": \"${dependencies[previousDependency]}\",\n \"${name}\": \"${version}\",\n `,\n );\n}\n","import { Node, SyntaxKind } from 'ts-morph';\nimport { stringToCamelCase } from '@noeldemartin/utils';\nimport type { ArrayLiteralExpression, ImportDeclarationStructure, OptionalKind, SourceFile } from 'ts-morph';\n\nimport Log from '@aerogel/cli/lib/Log';\nimport Shell from '@aerogel/cli/lib/Shell';\nimport File from '@aerogel/cli/lib/File';\nimport { app, isLinkedLocalApp, isLocalApp } from '@aerogel/cli/lib/utils/app';\nimport { addNpmDependency } from '@aerogel/cli/utils/package';\nimport { editFiles, findDescendant, when } from '@aerogel/cli/lib/utils/edit';\nimport { packNotFound, packagePackPath, packagePath } from '@aerogel/cli/lib/utils/paths';\nimport type { Editor } from '@aerogel/cli/lib/Editor';\n\nexport default abstract class Plugin {\n\n public readonly name: string;\n\n constructor(name: string) {\n this.name = name;\n }\n\n public async install(options: { skipInstall?: boolean } = {}): Promise<void> {\n this.assertNotInstalled();\n\n await this.beforeInstall();\n await this.addDependencies();\n\n if (!options.skipInstall) {\n await this.installDependencies();\n }\n\n if (editFiles()) {\n const editor = app().edit();\n\n editor.addSourceFile('package.json');\n\n await this.updateFiles(editor);\n await editor.format();\n }\n\n await this.afterInstall();\n\n Log.info(`Plugin ${this.name} installed!`);\n }\n\n protected assertNotInstalled(): void {\n if (File.contains('package.json', `\"${this.getNpmPackageName()}\"`)) {\n Log.fail(`${this.name} is already installed!`);\n }\n }\n\n protected async beforeInstall(): Promise<void> {\n // Placeholder for overrides, don't place any functionality here.\n }\n\n protected async afterInstall(): Promise<void> {\n // Placeholder for overrides, don't place any functionality here.\n }\n\n protected async addDependencies(): Promise<void> {\n Log.info('Adding plugin dependencies');\n this.addNpmDependencies();\n }\n\n protected async installDependencies(): Promise<void> {\n await Log.animate('Installing plugin dependencies', async () => {\n await Shell.run('pnpm install --no-save');\n });\n }\n\n protected async updateFiles(editor: Editor): Promise<void> {\n if (this.isForDevelopment()) {\n return;\n }\n\n await this.updateBootstrapConfig(editor);\n }\n\n protected addNpmDependencies(): void {\n if (isLinkedLocalApp()) {\n addNpmDependency(\n this.getNpmPackageName(),\n `file:${packagePath(this.getLocalPackageName())}`,\n this.isForDevelopment(),\n );\n\n return;\n }\n\n if (isLocalApp()) {\n const packPath = packagePackPath(this.getLocalPackageName()) ?? packNotFound(this.getLocalPackageName());\n\n addNpmDependency(this.getNpmPackageName(), `file:${packPath}`, this.isForDevelopment());\n\n return;\n }\n\n addNpmDependency(this.getNpmPackageName(), 'next', this.isForDevelopment());\n }\n\n protected async updateBootstrapConfig(editor: Editor): Promise<void> {\n await Log.animate('Injecting plugin in bootstrap configuration', async () => {\n const mainConfig = editor.requireSourceFile('src/main.ts');\n const pluginsArray = this.getBootstrapPluginsDeclaration(mainConfig);\n\n if (!pluginsArray) {\n return Log.fail(`\n Could not find plugins array in bootstrap config, please add the following manually:\n\n ${this.getBootstrapConfig()}\n `);\n }\n\n mainConfig.addImportDeclaration(this.getBootstrapImport());\n pluginsArray.addElement(this.getBootstrapConfig());\n\n await editor.save(mainConfig);\n });\n }\n\n protected getBootstrapPluginsDeclaration(mainConfig: SourceFile): ArrayLiteralExpression | null {\n const bootstrapAppCall = findDescendant(mainConfig, {\n guard: Node.isCallExpression,\n validate: (callExpression) => callExpression.getExpression().getText() === 'bootstrap',\n skip: SyntaxKind.ImportDeclaration,\n });\n const bootstrapOptions = bootstrapAppCall?.getArguments()[1];\n const pluginsOption = when(bootstrapOptions, Node.isObjectLiteralExpression)?.getProperty('plugins');\n const pluginsArray = when(pluginsOption, Node.isPropertyAssignment)?.getInitializer();\n\n if (!Node.isArrayLiteralExpression(pluginsArray)) {\n return null;\n }\n\n return pluginsArray;\n }\n\n protected getTailwindContentArray(tailwindConfig: SourceFile): ArrayLiteralExpression | null {\n const contentAssignment = findDescendant(tailwindConfig, {\n guard: Node.isPropertyAssignment,\n validate: (propertyAssignment) => propertyAssignment.getName() === 'content',\n skip: SyntaxKind.JSDoc,\n });\n const contentArray = contentAssignment?.getInitializer();\n\n if (!Node.isArrayLiteralExpression(contentArray)) {\n return null;\n }\n\n return contentArray;\n }\n\n protected getBootstrapImport(): OptionalKind<ImportDeclarationStructure> {\n return {\n defaultImport: stringToCamelCase(this.name),\n moduleSpecifier: `@aerogel/plugin-${this.name}`,\n };\n }\n\n protected getNpmPackageName(): string {\n return `@aerogel/${this.getLocalPackageName()}`;\n }\n\n protected getLocalPackageName(): string {\n return `plugin-${this.name}`;\n }\n\n protected isForDevelopment(): boolean {\n return false;\n }\n\n protected getBootstrapConfig(): string {\n return `${stringToCamelCase(this.name)}()`;\n }\n\n}\n","import Plugin from '@aerogel/cli/plugins/Plugin';\n\nexport default class LocalFirst extends Plugin {\n\n constructor() {\n super('local-first');\n }\n\n}\n","import File from '@aerogel/cli/lib/File';\nimport Log from '@aerogel/cli/lib/Log';\nimport Plugin from '@aerogel/cli/plugins/Plugin';\nimport { addNpmDependency } from '@aerogel/cli/utils/package';\nimport type { Editor } from '@aerogel/cli/lib/Editor';\n\nexport default class Solid extends Plugin {\n\n constructor() {\n super('solid');\n }\n\n protected override async updateFiles(editor: Editor): Promise<void> {\n await this.updateNpmScripts(editor);\n await this.updateGitIgnore();\n await super.updateFiles(editor);\n }\n\n protected override addNpmDependencies(): void {\n addNpmDependency('soukai-solid', 'next');\n addNpmDependency('@noeldemartin/solid-utils', 'next');\n addNpmDependency('@solid/community-server', '7.1.6', true);\n\n super.addNpmDependencies();\n }\n\n protected async updateNpmScripts(editor: Editor): Promise<void> {\n Log.info('Updating npm scripts...');\n\n const packageJson = File.read('package.json');\n\n if (!packageJson) {\n return Log.fail('Could not find package.json file');\n }\n\n File.write(\n 'package.json',\n packageJson\n .replace(\n '\"cy:dev\": \"concurrently --kill-others \\\\\"npm run test:serve-app\\\\\" \\\\\"npm run cy:open\\\\\"\",',\n '\"cy:dev\": \"concurrently --kill-others ' +\n '\\\\\"npm run test:serve-app\\\\\" \\\\\"npm run test:serve-pod\\\\\" \\\\\"npm run cy:open\\\\\"\",',\n )\n .replace(\n '\"cy:test\": \"start-server-and-test test:serve-app http-get://localhost:5001 cy:run\",',\n '\"cy:test\": \"start-server-and-test ' +\n 'test:serve-app http-get://localhost:5001 test:serve-pod http-get://localhost:3000 cy:run\",',\n )\n .replace(\n '\"dev\": \"vite\",',\n '\"dev\": \"vite\",\\n' +\n '\"dev:serve-pod\": \"community-solid-server -c @css:config/file.json -f ./solid\",',\n )\n .replace(\n '\"test:serve-app\": \"vite --port 5001 --mode testing\"',\n '\"test:serve-app\": \"vite --port 5001 --mode testing\",\\n' +\n '\"test:serve-pod\": \"community-solid-server -l warn\"',\n ),\n );\n\n editor.addModifiedFile('package.json');\n }\n\n protected async updateGitIgnore(): Promise<void> {\n Log.info('Updating .gitignore');\n\n const gitignore = File.read('.gitignore') ?? '';\n\n File.write('.gitignore', `${gitignore}/solid\\n`);\n }\n\n}\n","import Plugin from '@aerogel/cli/plugins/Plugin';\nimport { addNpmDependency } from '@aerogel/cli/utils/package';\n\nexport default class Soukai extends Plugin {\n\n constructor() {\n super('soukai');\n }\n\n protected override addNpmDependencies(): void {\n addNpmDependency('soukai', 'next');\n\n super.addNpmDependencies();\n }\n\n protected override getBootstrapConfig(): string {\n return 'soukai({ models: import.meta.glob(\\'@/models/*\\', { eager: true }) })';\n }\n\n}\n","import Command from '@aerogel/cli/commands/Command';\nimport LocalFirst from '@aerogel/cli/plugins/LocalFirst';\nimport Log from '@aerogel/cli/lib/Log';\nimport Solid from '@aerogel/cli/plugins/Solid';\nimport Soukai from '@aerogel/cli/plugins/Soukai';\nimport type Plugin from '@aerogel/cli/plugins/Plugin';\nimport type { CommandOptions } from '@aerogel/cli/commands/Command';\n\nconst plugins = [new Soukai(), new Solid(), new LocalFirst()].reduce(\n (pluginsObject, plugin) => Object.assign(pluginsObject, { [plugin.name]: plugin }),\n {} as Record<string, Plugin>,\n);\nexport interface Options {\n skipInstall?: boolean;\n}\n\nexport class InstallCommand extends Command {\n\n protected static override command: string = 'install';\n protected static override description: string = 'Install an AerogelJS plugin';\n protected static override parameters: [string, string][] = [['plugin', 'Plugin to install']];\n protected static override options: CommandOptions = {\n skipInstall: {\n type: 'boolean',\n description: 'Skip installing dependencies, just add them to package.json',\n },\n };\n\n private options: Options;\n private plugin: Plugin;\n\n constructor(plugin: string, options: Options = {}) {\n super();\n\n this.options = options;\n this.plugin =\n plugins[plugin] ??\n Log.fail(`Plugin '${plugin}' doesn't exist. Available plugins: ${Object.keys(plugins).join(', ')}`);\n }\n\n protected override async run(): Promise<void> {\n await this.plugin.install({\n skipInstall: this.options.skipInstall,\n });\n }\n\n}\n","import { Command } from 'commander';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { facade, fail } from '@noeldemartin/utils';\nimport { URL, fileURLToPath } from 'node:url';\n\nimport { CreateCommand } from '@aerogel/cli/commands/create';\nimport { GenerateComponentCommand } from '@aerogel/cli/commands/generate-component';\nimport { GenerateModelCommand } from '@aerogel/cli/commands/generate-model';\nimport { GenerateServiceCommand } from '@aerogel/cli/commands/generate-service';\nimport { InfoCommand } from '@aerogel/cli/commands/info';\nimport { InstallCommand } from '@aerogel/cli/commands/install';\n\nexport class CLIService {\n\n public run(argv?: string[]): void {\n const program = new Command();\n\n program.name('gel').description('AerogelJS CLI').version(this.getVersion());\n\n CreateCommand.define(program);\n GenerateComponentCommand.define(program);\n GenerateModelCommand.define(program);\n GenerateServiceCommand.define(program);\n InfoCommand.define(program);\n InstallCommand.define(program);\n\n program.parse(argv);\n }\n\n public getVersion(): string {\n const errorMessage = 'Could not find CLI\\'s version, please report this bug.';\n const packageJsonPath = fileURLToPath(new URL(/* @vite-ignore */ '../package.json', import.meta.url));\n\n if (!existsSync(packageJsonPath)) {\n throw new Error(errorMessage);\n }\n\n const packageJson = JSON.parse(readFileSync(packageJsonPath).toString()) as { version?: string };\n\n return packageJson.version ?? fail(errorMessage);\n }\n\n}\n\nexport default facade(CLIService);\n"],"names":["FileService","path","contents","_a","existsSync","rmSync","unlinkSync","lstatSync","readFileSync","search","replacement","directoryPath","children","readdirSync","files","child","resolve","mkdirSync","dirname","writeFileSync","File","facade","LogService","__publicField","chalk","message","operation","updateStdout","end","done","progress","frame","interval","result","matches","stringMatchAll","match","formatMessage","line","lines","firstLetter","indentation","cursorTo","clearLine","Log","Template","destination","replacements","filenameReplacements","file","relativePath","fileContents","filePath","Mustache","prefix","key","value","toString","basePath","fileURLToPath","URL","packageJson","stringMatch","cliPath","packNotFound","packageName","packagePackPath","packagePath","templatePath","name","ShellService","cwd","command","reject","exec","error","Shell","Editor","Project","usingPrettier","usingESLint","formatFile","arrayFrom","App","options","simpleGit","dependencies","version","withFilePrefix","paths","pathsWithFile","Command","program","description","definition","type","args","instance","CreateCommand","stringToTitleCase","basename","app","isLocalApp","isLinkedLocalApp","findDescendant","node","guard","validate","skipKinds","descendant","traversal","descendantKind","when","assertion","GenerateComponentCommand","directoryName","componentName","filesList","stringToSlug","editor","viteConfig","componentDirsArray","SyntaxKind","literal","pluginCall","Node","callExpression","dirsAssignment","propertyAssignment","dirsArray","pluginOptions","lastSlashIndex","GenerateModelCommand","code","field","rules","stringToStudlyCase","fieldDefinition","formatCodeBlock","GenerateServiceCommand","servicesIndex","servicesObject","stringToCamelCase","mainConfig","bootstrapOptions","bootstrapAppCall","servicesDeclaration","variableDeclaration","InfoCommand","addNpmDependency","development","dependencyNames","arraySorted","index","previousDependency","Plugin","packPath","pluginsArray","pluginsOption","_b","tailwindConfig","contentAssignment","contentArray","LocalFirst","Solid","gitignore","Soukai","plugins","pluginsObject","plugin","InstallCommand","CLIService","argv","errorMessage","packageJsonPath","fail","cli"],"mappings":";;;;;;;;;;;;;;AAcO,MAAMA,GAAY;AAAA,EAEd,SAASC,GAAcC,GAA2B;;AACrD,WAAO,CAAC,GAACC,IAAA,KAAK,KAAKF,CAAI,MAAd,QAAAE,EAAiB,SAASD;AAAA,EAAQ;AAAA,EAGxC,OAAOD,GAAuB;AACjC,WAAOG,EAAWH,CAAI;AAAA,EAAA;AAAA,EAGnB,OAAOA,GAAoB;AAC1B,QAAA,KAAK,YAAYA,CAAI,GAAG;AACxB,MAAAI,EAAOJ,GAAM,EAAE,WAAW,GAAA,CAAM;AAEhC;AAAA,IAAA;AAGJ,IAAAK,GAAWL,CAAI;AAAA,EAAA;AAAA,EAGZ,UAAUA,GAAuB;AAGpC,WAFcM,EAAUN,CAAI,EAEf,eAAe;AAAA,EAAA;AAAA,EAGzB,KAAKA,GAA6B;AACrC,WAAK,KAAK,OAAOA,CAAI,IAIdO,EAAaP,CAAI,EAAE,SAAS,IAHxB;AAAA,EAGwB;AAAA,EAGhC,QAAQA,GAAcQ,GAAyBC,GAA2B;AACvE,UAAAR,IAAW,KAAK,KAAKD,CAAI;AAE/B,IAAKC,KAIL,KAAK,MAAMD,GAAMC,EAAS,WAAWO,GAAQC,CAAW,CAAC;AAAA,EAAA;AAAA,EAGtD,SAASC,GAAiC;AAC7C,UAAMC,IAAWC,GAAYF,GAAe,EAAE,eAAe,IAAM,GAC7DG,IAAkB,CAAC;AAEzB,eAAWC,KAASH,GAAU;AAC1B,YAAMX,IAAOe,EAAQL,GAAeI,EAAM,IAAI;AAE1C,MAAAA,EAAM,gBACND,EAAM,KAAK,GAAG,KAAK,SAASb,CAAI,CAAC,IAEjCa,EAAM,KAAKb,CAAI;AAAA,IACnB;AAGG,WAAAa;AAAA,EAAA;AAAA,EAGJ,YAAYb,GAAuB;AACtC,WAAO,KAAK,OAAOA,CAAI,KAAKM,EAAUN,CAAI,EAAE,YAAY;AAAA,EAAA;AAAA,EAGrD,OAAOA,GAAuB;AACjC,WAAO,KAAK,OAAOA,CAAI,KAAKM,EAAUN,CAAI,EAAE,OAAO;AAAA,EAAA;AAAA,EAGhD,iBAAiBA,GAAuB;AAC3C,WAAK,KAAK,YAAYA,CAAI,IAInB,KAAK,SAASA,CAAI,EAAE,WAAW,IAH3B;AAAA,EAG2B;AAAA,EAGnC,cAAcA,GAAoB;AACrC,IAAAgB,EAAUhB,GAAM,EAAE,WAAW,GAAA,CAAM;AAAA,EAAA;AAAA,EAGhC,MAAMA,GAAcC,GAAwB;AAC/C,IAAKE,EAAWc,EAAQjB,CAAI,CAAC,KACzBgB,EAAUC,EAAQjB,CAAI,GAAG,EAAE,WAAW,IAAM,GAGhDkB,GAAclB,GAAMC,CAAQ;AAAA,EAAA;AAGpC;AAEA,MAAekB,IAAAC,EAAOrB,EAAW;ACrG1B,MAAMsB,GAAW;AAAA,EAAjB;AAEO,IAAAC,EAAA,oBAAaC,EAAM,IAAI,SAAS;AAChC,IAAAD,EAAA,uBAAgBC,EAAM,IAAI,SAAS;AACnC,IAAAD,EAAA,qBAAcC,EAAM,IAAI,SAAS;AAAA;AAAA,EAE3C,MAAa,QAAWC,GAAiBC,GAAyC;AAC9E,UAAMC,IAAe,CAACC,IAAc,IAAIC,IAAgB,OAAU;AAC9D,YAAMC,IACF,KAAK,WAAW,KAAK,eAAeL,CAAO,KAAKI,IAAO,QAAQ,IAAI,OAAOE,IAAQ,CAAC,EAAE,IAAIH;AAE7F,WAAK,OAAOE,CAAQ;AAAA,IACxB;AAEA,QAAIC,IAAQ;AAEC,IAAAJ,EAAA;AAEb,UAAMK,IAAW,YAAY,OAAOD,KAASJ,EAAA,IAAiB,GAAI,GAC5DM,IAAS,MAAMP,EAAU;AAE/B,yBAAcM,CAAQ,GACtBL,EAAa;AAAA,GAAM,EAAI,GAEhBM;AAAA,EAAA;AAAA,EAGJ,KAAKR,GAAuB;AAC/B,SAAK,IAAI,KAAK,eAAeA,CAAO,GAAG,KAAK,UAAU;AAAA,EAAA;AAAA,EAGnD,MAAMA,GAAuB;AAChC,SAAK,IAAI,KAAK,eAAeA,CAAO,GAAG,KAAK,WAAW;AAAA,EAAA;AAAA;AAAA,EAIpD,KAAcA,GAAoB;AACrC,SAAK,MAAMA,CAAO,GAElB,QAAQ,KAAK,CAAC;AAAA,EAAA;AAAA,EAGX,QAAQA,GAAuB;AAClC,SAAK,IAAI,KAAK,eAAeA,CAAO,GAAG,KAAK,aAAa;AAAA,EAAA;AAAA,EAGnD,eAAeA,GAAyB;AACxC,UAAAS,IAAUC,GAAkBV,GAAS,eAAe;AAE1D,eAAWW,KAASF;AACN,MAAAT,IAAAA,EAAQ,QAAQW,EAAM,CAAC,GAAGZ,EAAM,KAAKY,EAAM,CAAC,CAAC,CAAC;AAGrD,WAAAX;AAAA,EAAA;AAAA,EAGD,IAAIA,GAAiBY,GAAmD;AAC9E,SAAK,cAAcZ,CAAO,EAAE,QAAQ,CAACa,MAAS;AAC1C,WAAK,QAAQD,IAAgBA,EAAcC,CAAI,IAAIA,CAAI;AAAA,IAAA,CAC1D;AAAA,EAAA;AAAA,EAGK,cAAcb,GAA2B;;AAC3C,QAAAA,EAAQ,CAAC,MAAM;AAAA,GAAM;AACrB,MAAAA,IAAUA,EAAQ,MAAM,CAAC,EAAE,QAAQ;AAE7B,YAAAc,IAAQd,EAAQ,MAAM;AAAA,CAAI,GAC1Be,IAAcf,EAAQ,KAAK,EAAE,CAAC,KAAK,IACnCgB,MAActC,IAAAoC,EAAM,KAAK,CAACD,MAASA,EAAK,KAAK,EAAE,SAAS,CAAC,MAA3C,gBAAAnC,EAA8C,QAAQqC,OAAgB;AAE1F,aAAOD,EAAM,IAAI,CAACD,MAASA,EAAK,MAAMG,CAAW,CAAC;AAAA,IAAA;AAGtD,WAAO,CAAChB,CAAO;AAAA,EAAA;AAAA,EAGT,QAAQa,GAAoB;AAElC,YAAQ,IAAIA,CAAI;AAAA,EAAA;AAAA,EAGV,OAAOb,GAAuB;AAC3B,IAAAiB,GAAA,QAAQ,QAAQ,CAAC,GAChBC,GAAA,QAAQ,QAAQ,CAAC,GAEnB,QAAA,OAAO,MAAMlB,CAAO;AAAA,EAAA;AAGpC;AAEA,MAAemB,IAAAvB,EAAOC,EAAU;ACxFhC,MAAqBuB,EAAS;AAAA,EAY1B,YAAmB5C,GAAc;AAAd,SAAA,OAAAA;AAAA,EAAA;AAAA,EAVnB,OAAc,YACVA,GACA6C,IAAsB,MACtBC,IAAwC,CAAA,GAChC;AAGD,WAFU,IAAIF,EAAS5C,CAAI,EAElB,YAAY6C,GAAaC,CAAY;AAAA,EAAA;AAAA,EAKlD,YAAYD,GAAqBC,IAAwC,IAAc;AACpF,UAAAC,IAAuB,KAAK,wBAAwBD,CAAY,GAChEjC,IAAkB,CAAC;AACzB,IAAAgC,IAAc,GAAGA,CAAW,IAAI,QAAQ,QAAQ,GAAG;AAEnD,eAAWG,KAAQ7B,EAAK,SAAS,KAAK,IAAI,GAAG;AACzC,YAAM8B,IAAe,OAAO,QAAQF,CAAoB,EAAE;AAAA,QACtD,CAAC/C,GAAM,CAACmC,GAAO1B,CAAW,MAAMT,EAAK,WAAWmC,GAAO1B,CAAW;AAAA,QAClEuC,EAAK,UAAU,KAAK,KAAK,SAAS,CAAC;AAAA,MACvC,GACME,IAAe3C,EAAayC,CAAI,EAAE,SAAS,GAC3CG,IACFN,KAAeI,EAAa,SAAS,WAAW,IAAIA,EAAa,MAAM,GAAG,EAAE,IAAIA;AAE/E,MAAA9B,EAAA,MAAMgC,GAAUC,GAAS,OAAOF,GAAcJ,GAAc,QAAW,CAAC,MAAM,IAAI,CAAC,CAAC,GACzFjC,EAAM,KAAKsC,CAAQ;AAAA,IAAA;AAGhB,WAAAtC;AAAA,EAAA;AAAA,EAGD,wBACNiC,GACAO,IAAiB,IACK;AACf,WAAA,OAAO,QAAQP,CAAY,EAAE;AAAA,MAChC,CAACC,GAAsB,CAACO,GAAKC,CAAK,OAC1B,OAAOA,KAAU,WACV,OAAA;AAAA,QACHR;AAAA,QACA,KAAK,wBAAwBQ,GAAkC,GAAGD,CAAG,GAAG;AAAA,MAC5E,IAEAP,EAAqB,IAAIM,CAAM,GAAGC,CAAG,GAAG,IAAIE,GAASD,CAAK,GAGvDR;AAAA,MAEX,CAAA;AAAA,IACJ;AAAA,EAAA;AAGR;ACvDgB,SAAAU,GAASzD,IAAe,IAAY;AAC5C,MAAA,QAAQ,IAAI;AACZ,WAAOe,EAAQ,QAAQ,IAAI,mBAAmBf,CAAI;AAGtD,MACImB,EAAK;AAAA,IACDuC,EAAc,IAAIC;AAAA;AAAA,MAAuB;AAAA,MAAyB,YAAY;AAAA,IAAA,CAAI;AAAA,IAClF;AAAA,EAAA;AAGG,WAAA5C,EAAQ2C,EAAc,IAAIC;AAAA;AAAA,MAAuB;AAAA,MAAO,YAAY;AAAA,IAAI,CAAA,GAAG3D,CAAI;AAG1F,QAAM4D,IAAczC,EAAK;AAAA,IACrBuC,EAAc,IAAIC;AAAA;AAAA,MAAuB;AAAA,MAA4B,YAAY;AAAA,IAAI,CAAA;AAAA,EACzF,GACM1B,IAAU4B,GAAeD,KAAe,IAAI,yDAAyD,GACrGE,KAAU7B,KAAA,gBAAAA,EAAU,OAAMU,EAAI,KAAa,+BAA+B;AAEzE,SAAA5B,EAAQ+C,GAAS9D,CAAI;AAChC;AAGO,SAAS+D,EAAaC,GAA0B;AACnD,SAAOrB,EAAI,KAAK,kBAAkBqB,CAAW,qCAAqC;AACtF;AAEO,SAASC,EAAgBD,GAAoC;AAChE,SAAO7C,EAAK,SAAS+C,EAAYF,CAAW,CAAC,EAAE,KAAK,CAAChB,MAASA,EAAK,SAAS,MAAM,CAAC,KAAK;AAC5F;AAEO,SAASkB,EAAYF,GAA6B;AAC9C,SAAAP,GAAS,MAAMO,CAAW,EAAE;AACvC;AAEO,SAASG,EAAaC,GAAsB;AAC/C,SAAOV,EAAc,IAAIC;AAAA;AAAA,IAAuB,gBAAgBS,CAAI;AAAA,IAAI,YAAY;AAAA,EAAA,CAAI;AAC5F;AC1CO,MAAMC,GAAa;AAAA,EAAnB;AAEK,IAAA/C,EAAA,aAAqB;AAAA;AAAA,EAEtB,oBAAoBgD,GAAmB;AAC1C,SAAK,MAAMA;AAAA,EAAA;AAAA,EAGf,MAAa,IAAIC,GAAgC;AAC7C,UAAM,IAAI,QAAc,CAACxD,GAASyD,MAAW;AACpC,MAAAC,GAAAF,GAAS,EAAE,KAAK,KAAK,OAAO,OAAU,GAAG,CAACG,MAAU;AACrD,YAAIA,GAAO;AACP,UAAAF,EAAOE,CAAK;AAEZ;AAAA,QAAA;AAGI,QAAA3D,EAAA;AAAA,MAAA,CACX;AAAA,IAAA,CACJ;AAAA,EAAA;AAGT;AAEA,MAAe4D,IAAAvD,EAAOiD,EAAY;ACnB3B,MAAMO,GAAO;AAAA,EAKhB,cAAc;AAHN,IAAAtD,EAAA;AACA,IAAAA,EAAA;AAGJ,SAAK,UAAU,IAAIuD,GAAQ,EAAE,kBAAkB,iBAAiB,GAC3D,KAAA,oCAAoB,IAAI,GAExB,KAAA,QAAQ,sBAAsB,aAAa,GAC3C,KAAA,QAAQ,sBAAsB,gBAAgB,GAC9C,KAAA,QAAQ,sBAAsB,cAAc;AAAA,EAAA;AAAA,EAG9C,cAAc7E,GAAoB;AAChC,SAAA,QAAQ,sBAAsBA,CAAI;AAAA,EAAA;AAAA,EAGpC,kBAAkBA,GAA0B;AACxC,WAAA,KAAK,QAAQ,qBAAqBA,CAAI;AAAA,EAAA;AAAA,EAGjD,MAAa,SAAwB;AAC3B,UAAA2C,EAAI,QAAQ,6BAA6B,YAAY;AACjD,YAAAmC,IAAgB3D,EAAK,OAAO,oBAAoB,KAAKA,EAAK,SAAS,gBAAgB,eAAe,GAClG4D,IAAc5D,EAAK,OAAO,cAAc,KAAKA,EAAK,SAAS,gBAAgB,gBAAgB,GAE3F6D,IADsB7D,EAAK,SAAS,gBAAgB,uBAAuB,IAE3E,CAAC6B,MAAiB2B,EAAM,IAAI,uBAAuB3B,CAAI,UAAU,IACjE,OAAOA,MAAiB;AACtB,QAAA8B,KAAkB,MAAMH,EAAM,IAAI,gBAAgB3B,CAAI,UAAU,GAC3DA,EAAA,MAAM,gBAAgB,KAAK+B,KAAgB,MAAMJ,EAAM,IAAI,cAAc3B,CAAI,QAAQ;AAAA,MAC9F;AAEJ,YAAM,QAAQ,IAAIiC,EAAU,KAAK,aAAa,EAAE,IAAI,OAAOjC,MAASgC,EAAWhC,CAAI,CAAC,CAAC;AAAA,IAAA,CACxF;AAAA,EAAA;AAAA,EAGL,MAAa,KAAKA,GAAiC;AAC/C,UAAMA,EAAK,KAAK,GAEX,KAAA,gBAAgBA,EAAK,aAAa;AAAA,EAAA;AAAA,EAGpC,gBAAgBhD,GAAoB;AAClC,SAAA,cAAc,IAAIA,CAAI;AAAA,EAAA;AAGnC;AC1CA,MAAqBkF,EAAI;AAAA,EAErB,YACcd,GACAe,IAAmB,IAC/B;AAFY,SAAA,OAAAf,GACA,KAAA,UAAAe;AAAA,EAAA;AAAA,EAGd,MAAa,OAAOnF,GAA6B;AAC7C,IAAImB,EAAK,OAAOnB,CAAI,MAAM,CAACmB,EAAK,YAAYnB,CAAI,KAAK,CAACmB,EAAK,iBAAiBnB,CAAI,MACxE2C,EAAA,KAAK,cAAc3C,CAAI,mBAAmB,GAIlD,MAAMoF,GAAU,EAAE,MAAM,wDAAwDpF,GAAM;AAAA,MAClF,WAAW;AAAA,IAAA,CACd,GAEDmB,EAAK,OAAOJ,EAAQf,GAAM,MAAM,CAAC;AAG3B,UAAAqF,IAAe,KAAK,gBAAgB;AAErC,IAAAlE,EAAA;AAAA,MACDJ,EAAQf,GAAM,gBAAgB;AAAA,MAC9B;AAAA,MACA,oBAAoB,KAAK,IAAI;AAAA,IACjC,GAEKmB,EAAA,QAAQJ,EAAQf,GAAM,kBAAkB,GAAG,gBAAkB,WAAW,KAAK,IAAI,GAAG;AAEzF,eAAW,CAACoE,GAAMkB,CAAO,KAAK,OAAO,QAAQD,CAAY;AACrD,MAAAlE,EAAK,QAAQJ,EAAQf,GAAM,cAAc,GAAG,IAAI,OAAO,IAAIoE,CAAI,YAAY,GAAG,GAAG,IAAIA,CAAI,OAAOkB,CAAO,GAAG;AAI9G,IAAA1C,EAAS,YAAYuB,EAAa,KAAK,GAAGnE,GAAM,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,EAAA,CAAG;AAAA,EAAA;AAAA,EAGzE,OAAe;AAClB,WAAO,IAAI4E,GAAO;AAAA,EAAA;AAAA,EAGZ,kBAA0C;AAChD,UAAMW,IAAiB,CAAmCC,MACtD,OAAO,QAAQA,CAAK,EAAE;AAAA,MAClB,CAACC,GAAe,CAACrB,GAAMpE,CAAI,MAAM,OAAO,OAAOyF,GAAe,EAAE,CAACrB,CAAI,GAAG,QAAQpE,CAAI,IAAI;AAAA,MACxF,CAAA;AAAA,IACJ;AAEA,WAAA,KAAK,QAAQ,cACNuF,EAAe;AAAA,MAClB,gBAAgBrB,EAAY,KAAK;AAAA,MACjC,iBAAiBA,EAAY,MAAM;AAAA,MACnC,oBAAoBA,EAAY,SAAS;AAAA,MACzC,wBAAwBA,EAAY,aAAa;AAAA,MACjD,0BAA0BA,EAAY,eAAe;AAAA,MACrD,iBAAiBA,EAAY,MAAM;AAAA,IAAA,CACtC,IAGD,KAAK,QAAQ,QACNqB,EAAe;AAAA,MAClB,gBAAgBtB,EAAgB,KAAK,KAAKF,EAAa,KAAK;AAAA,MAC5D,iBAAiBE,EAAgB,MAAM,KAAKF,EAAa,MAAM;AAAA,MAC/D,oBAAoBE,EAAgB,SAAS,KAAKF,EAAa,SAAS;AAAA,MACxE,wBAAwBE,EAAgB,aAAa,KAAKF,EAAa,aAAa;AAAA,MACpF,0BAA0BE,EAAgB,eAAe,KAAKF,EAAa,eAAe;AAAA,MAC1F,iBAAiBE,EAAgB,MAAM,KAAKF,EAAa,MAAM;AAAA,IAAA,CAClE,IAGE,CAAC;AAAA,EAAA;AAGhB;AChFA,MAAqB2B,EAAQ;AAAA,EAOzB,OAAc,OAAOC,GAAiC;AAClD,IAAAA,IAAUA,EAAQ,QAAQ,KAAK,OAAO,EAAE,YAAY,KAAK,WAAW;AAEpE,eAAW,CAACvB,GAAMwB,CAAW,KAAK,KAAK;AACnC,MAAAD,IAAUA,EAAQ,SAAS,IAAIvB,CAAI,KAAKwB,CAAW;AAG5C,eAAA,CAACxB,GAAMyB,CAAU,KAAK,OAAO,QAAQ,KAAK,OAAO,GAAG;AAC3D,YAAMD,IAAc,OAAOC,KAAe,WAAWA,IAAaA,EAAW,aACvEC,IAAO,OAAOD,KAAe,WAAW,WAAYA,EAAW,QAAQ;AAE7E,MAAAF,IAAUA,EAAQ,OAAOG,MAAS,YAAY,KAAK1B,CAAI,KAAK,KAAKA,CAAI,KAAK0B,CAAI,KAAKF,CAAW;AAAA,IAAA;AAGxF,IAAAD,IAAAA,EAAQ,OAAO,IAAII,MAAS,KAAK,IAAI,KAAK,MAAM,GAAGA,CAAI,CAAC;AAAA,EAAA;AAAA,EAGtE,aAAoB,OAA8CA,GAA+C;AAC7G,UAAMC,IAAW,IAAI,KAAK,GAAGD,CAAI;AAEjC,UAAMC,EAAS,SAAS,GACxB,MAAMA,EAAS,IAAI;AAAA,EAAA;AAAA,EAGvB,MAAgB,WAA0B;AAAA,EAAA;AAAA,EAI1C,MAAgB,MAAqB;AAAA,EAAA;AAAA,EAI3B,yBAAyBhG,GAAqB;AAC9C,UAAA4D,IAAczC,EAAK,KAAK,cAAc;AAM5C,QAJIyC,KAAA,QAAAA,EAAa,SAAS,oBAItB5D,KAAQmB,EAAK,YAAYnB,CAAI;AAC7B;AAGJ,UAAMwB,IAAUxB,IAAO,GAAGA,CAAI,4BAA4B;AAEtD,IAAA2C,EAAA,KAAK,GAAGnB,CAAO,uCAAuC;AAAA,EAAA;AAGlE;AArDIF,EAFiBoE,GAEA,WAAkB,KACnCpE,EAHiBoE,GAGA,eAAsB,KACvCpE,EAJiBoE,GAIA,cAAiC,CAAC,IACnDpE,EALiBoE,GAKA,WAA0B,CAAC;ACEzC,MAAMO,UAAsBP,EAAQ;AAAA,EAoBvC,YAAY1F,GAAcmF,IAAmB,IAAI;AACvC,UAAA;AAJF,IAAA7D,EAAA;AACA,IAAAA,EAAA;AAKJ,SAAK,OAAOtB,GACZ,KAAK,UAAUmF;AAAA,EAAA;AAAA,EAGnB,MAAyB,MAAqB;AAC1C,UAAMnF,IAAO,KAAK,MACZoE,IAAO,KAAK,QAAQ,QAAQ8B,GAAkBC,GAASnG,CAAI,CAAC;AAElE,IAAA2E,EAAM,oBAAoB3E,CAAI,GAExB,MAAA,KAAK,UAAUoE,GAAMpE,CAAI,GAC/B,MAAM,KAAK,cAAc,GAEzB2C,EAAI,QAAQ;AAAA;AAAA,oDAEgCyB,CAAI;AAAA;AAAA,qBAEnCpE,CAAI;AAAA;AAAA;AAAA;AAAA;AAAA,SAKhB;AAAA,EAAA;AAAA,EAGL,MAAgB,UAAUoE,GAAcpE,GAA6B;AAC7D,IAAA2C,EAAA,KAAK,cAAcyB,CAAI,OAAO,GAO5B,MALM,IAAIc,EAAId,GAAM;AAAA,MACtB,OAAO,KAAK,QAAQ;AAAA,MACpB,aAAa,KAAK,QAAQ,SAAS,CAAC,KAAK,QAAQ;AAAA,IAAA,CACpD,EAES,OAAOpE,CAAI;AAAA,EAAA;AAAA,EAGzB,MAAgB,gBAA+B;AACrC,UAAA2C,EAAI,QAAQ,oBAAoB,YAAY;AACxC,YAAAgC,EAAM,IAAI,UAAU,GACpB,MAAAA,EAAM,IAAI,WAAW,GACrB,MAAAA,EAAM,IAAI,uBAAuB;AAAA,IAAA,CAC1C;AAAA,EAAA;AAGT;AAjEIrD,EAFS2E,GAEiB,WAAkB,WAC5C3E,EAHS2E,GAGiB,eAAsB,yBAChD3E,EAJS2E,GAIiB,cAAiC,CAAC,CAAC,QAAQ,kBAAkB,CAAC,IACxF3E,EALS2E,GAKiB,WAA0B;AAAA,EAChD,MAAM;AAAA,EACN,OAAO;AAAA,IACH,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA,MAAM;AAAA,IACF,MAAM;AAAA,IACN,aAAa;AAAA,EAAA;AAErB;AC3BG,SAASG,IAAW;AAEhB,SAAA,IAAIlB,EAAI,EAAE;AACrB;AAEO,SAASmB,KAAsB;AAC3B,SAAAlF,EAAK,SAAS,gBAAgB,yBAAyB;AAClE;AAEO,SAASmF,KAA4B;AACjC,SAAAnF,EAAK,UAAU,4BAA4B;AACtD;ACNO,SAASoF,EACZC,GACArB,IAII,IACS;AACb,MAAI,CAACqB;AACD;AAGE,QAAAC,IAAQtB,EAAQ,UAAU,MAAM,KAChCuB,IAAWvB,EAAQ,aAAa,MAAM,KACtCwB,IAAY1B,EAAUE,EAAQ,QAAQ,CAAA,CAAE;AAE9C,SAAOqB,EAAK,kBAAkB,CAACI,GAAYC,MAAc;AACrD,QAAIJ,EAAMG,CAAU,KAAKF,EAASE,CAAe;AACtC,aAAAA;AAGL,UAAAE,IAAiBF,EAAW,QAAQ;AAEtC,IAAAD,EAAU,SAASG,CAAc,KACjCD,EAAU,KAAK;AAAA,EACnB,CACH;AACL;AAEgB,SAAAE,EAAqBP,GAAwBQ,GAAqD;AAC9G,MAAI,GAACR,KAAQ,CAACQ,EAAUR,CAAI;AAIrB,WAAAA;AACX;ACxBO,MAAMS,UAAiCvB,EAAQ;AAAA,EAUlD,YAAY1F,GAAc;AAChB,UAAA;AAHF,IAAAsB,EAAA;AAKJ,SAAK,OAAOtB;AAAA,EAAA;AAAA,EAGhB,MAAyB,MAAqB;AAC1C,SAAK,yBAAyB,gBAAgB;AAExC,UAAAa,wBAAY,IAAY,GACxB,CAACqG,GAAeC,CAAa,IAAI,KAAK,oBAAoB;AAEhE,UAAM,KAAK,gBAAgBD,GAAeC,GAAetG,CAAK,GAC9D,MAAM,KAAK,kBAAkB;AAE7B,UAAMuG,IAAYnC,EAAUpE,CAAK,EAC5B,IAAI,CAACmC,MAAS,KAAKA,CAAI,EAAE,EACzB,KAAK;AAAA,CAAI;AAEV,IAAAL,EAAA,KAAK,GAAGwE,CAAa;AAAA;AAAA,EAAyEC,CAAS,EAAE;AAAA,EAAA;AAAA,EAGjH,MAAgB,gBAAgBF,GAAuBC,GAAuBtG,GAAmC;AACvG,UAAA8B,EAAI,QAAQ,sBAAsB,YAAY;AAChD,MAAIxB,EAAK,OAAO,kBAAkB,KAAK,IAAI,MAAM,KAC7CwB,EAAI,KAAK,GAAG,KAAK,IAAI,4BAA4B,GAG9BC,EAAS,YAAYuB,EAAa,WAAW,GAAG,kBAAkB+C,CAAa,IAAI;AAAA,QACtG,WAAW;AAAA,UACP,MAAMC;AAAA,UACN,MAAME,GAAaF,CAAa;AAAA,QAAA;AAAA,MACpC,CACH,EAEc,QAAQ,CAACnE,MAASnC,EAAM,IAAImC,CAAI,CAAC;AAAA,IAAA,CACnD;AAAA,EAAA;AAAA,EAGL,MAAgB,oBAAmC;AAKzC,UAAAsE,IAASlB,EAAI,EAAE,KAAK,GACpBmB,IAAaD,EAAO,kBAAkB,gBAAgB,GACtDE,IAAqB,KAAK,sBAAsBD,CAAU;AAEhE,QAAI,CAACC;AACM,aAAA7E,EAAI,KAAK,2DAA2D;AAG/E,IACI6E,EACK,qBAAqBC,EAAW,aAAa,EAC7C,KAAK,CAACC,MAAYA,EAAQ,QAAc,MAAA,kBAAoB,MAK/D,MAAA/E,EAAI,QAAQ,wBAAwB,YAAY;AAClD,MAAA6E,EAAmB,WAAW,kBAAoB,GAE5C,MAAAF,EAAO,KAAKC,CAAU;AAAA,IAAA,CAC/B,GAED,MAAMD,EAAO,OAAO;AAAA,EAAA;AAAA,EAGd,sBAAsBC,GAAuD;AAC7E,UAAAI,IAAapB,EAAegB,GAAY;AAAA,MAC1C,OAAOK,EAAK;AAAA,MACZ,UAAU,CAACC,MAAmBA,EAAe,QAAQ,EAAE,WAAW,aAAa;AAAA,MAC/E,MAAMJ,EAAW;AAAA,IAAA,CACpB;AAED,QAAI,CAACE;AACM,aAAA;AAGL,UAAAG,IAAiBvB,EAAeoB,GAAY;AAAA,MAC9C,OAAOC,EAAK;AAAA,MACZ,UAAU,CAACG,MAAuBA,EAAmB,cAAc;AAAA,IAAA,CACtE,GAEKC,IAAYF,KAAA,gBAAAA,EAAgB;AAElC,WAAKF,EAAK,yBAAyBI,CAAS,IAIrCA,IAHI,KAAK,0BAA0BL,CAAU;AAAA,EAG7C;AAAA,EAGD,0BAA0BA,GAA2D;AAC3F,UAAMM,IAAgB1B,EAAeoB,GAAY,EAAE,OAAOC,EAAK,2BAA2B,GACpFE,IAAiBG,KAAA,gBAAAA,EAAe,sBAAsB;AAAA,MACxD,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAGT,YAAAH,KAAA,gBAAAA,EAAgB,qBAA+C;AAAA,EAAA;AAAA,EAGjE,sBAAwC;AAC9C,UAAMI,IAAiB,KAAK,KAAK,YAAY,GAAG;AAEhD,WAAOA,MAAmB,KACpB,CAAC,IAAI,KAAK,IAAI,IACd,CAAC,KAAK,KAAK,UAAU,GAAGA,CAAc,GAAG,KAAK,KAAK,UAAUA,IAAiB,CAAC,CAAC;AAAA,EAAA;AAG9F;AAxHI5G,EAFS2F,GAEiB,WAAkB,uBAC5C3F,EAHS2F,GAGiB,eAAsB,oCAChD3F,EAJS2F,GAIiB,cAAiC;AAAA,EACvD,CAAC,QAAQ,yEAAyE;AACtF;ACZG,MAAMkB,UAA6BzC,EAAQ;AAAA,EAY9C,YAAYtB,GAAce,IAAmB,IAAI;AACvC,UAAA;AAJF,IAAA7D,EAAA;AACA,IAAAA,EAAA;AAKJ,SAAK,OAAO8C,GACZ,KAAK,UAAUe;AAAA,EAAA;AAAA,EAGnB,MAAyB,MAAqB;AAC1C,SAAK,yBAAyB,YAAY,GAEtChE,EAAK,OAAO,cAAc,KAAK,IAAI,KAAK,KACxCwB,EAAI,KAAK,GAAG,KAAK,IAAI,wBAAwB,GAGjD,KAAK,sBAAsB;AAE3B,UAAMyE,IAAY,MAAMzE,EAAI,QAAQ,kBAAkB,YACpCC,EAAS,YAAYuB,EAAa,OAAO,GAAG,cAAc;AAAA,MACpE,OAAO;AAAA,QACH,MAAM,KAAK;AAAA,QACX,kBAAkB,KAAK,oBAAoB;AAAA,MAAA;AAAA,IAC/C,CACH,EAEY,IAAI,CAACnB,MAAS,KAAKA,CAAI,EAAE,EAAE,KAAK;AAAA,CAAI,CACpD;AAEG,IAAAL,EAAA,KAAK,GAAG,KAAK,IAAI;AAAA;AAAA,EAAqEyE,CAAS,EAAE;AAAA,EAAA;AAAA,EAG/F,sBAA8B;AAChC,QAAA,CAAC,KAAK,QAAQ;AACP,aAAA;AAGL,UAAAgB,IAAO,KAAK,QAAQ,OACrB,MAAM,GAAG,EACT,IAAI,CAACC,MAAU;AACZ,YAAM,CAACjE,GAAM0B,GAAMwC,CAAK,IAAID,EAAM,MAAM,GAAG;AAEpC,aAAA;AAAA,QACH,MAAAjE;AAAA,QACA,MAAMmE,GAAmBzC,KAAQ,QAAQ;AAAA,QACzC,UAAUwC,MAAU;AAAA,MACxB;AAAA,IACH,CAAA,EACA,OAAO,CAACzC,GAAYwC,MAAU;AACrB,YAAAG,IAAkBH,EAAM,WACxBI,EAAgB;AAAA,0BACZJ,EAAM,IAAI;AAAA,8CACUA,EAAM,IAAI;AAAA;AAAA;AAAA,qBAGnC,IACC,GAAGA,EAAM,IAAI,eAAeA,EAAM,IAAI;AAE5C,aAAOxC,IAAa;AAAA,EAAK2C,CAAe;AAAA,OACzC,EAAE;AAET,WAAOC,EAAgBL,GAAM,EAAE,QAAQ,GAAG;AAAA,EAAA;AAAA,EAGpC,wBAA8B;AAChC,IAAA,CAACjH,EAAK,SAAS,gBAAgB,UAAU,KAAK,CAACA,EAAK,SAAS,gBAAgB,0BAA0B,KACvGwB,EAAI,KAAK;AAAA;AAAA;AAAA,aAGR;AAAA,EACL;AAGR;AAjFIrB,EAFS6G,GAEiB,WAAkB,mBAC5C7G,EAHS6G,GAGiB,eAAsB,gCAChD7G,EAJS6G,GAIiB,cAAiC,CAAC,CAAC,QAAQ,YAAY,CAAC,IAClF7G,EALS6G,GAKiB,WAA0B;AAAA,EAChD,QAAQ;AACZ;ACPG,MAAMO,UAA+BhD,EAAQ;AAAA,EAQhD,YAAYtB,GAAc;AAChB,UAAA;AAHF,IAAA9C,EAAA;AAKJ,SAAK,OAAO8C;AAAA,EAAA;AAAA,EAGhB,MAAyB,MAAqB;AAC1C,SAAK,yBAAyB,cAAc;AAEtC,UAAAvD,wBAAY,IAAY,GACxByG,IAASlB,EAAI,EAAE,KAAK;AAEpB,UAAA,KAAK,cAAcvF,CAAK,GAGpB,MAAA,KAAK,gBAAgByG,CAAM,GACjC,MAAMA,EAAO,OAAO;AAGxB,UAAMF,IAAYnC,EAAUpE,CAAK,EAC5B,IAAI,CAACmC,MAAS,KAAKA,CAAI,EAAE,EACzB,KAAK;AAAA,CAAI;AAEV,IAAAL,EAAA,KAAK,GAAG,KAAK,IAAI;AAAA;AAAA,EAAuEyE,CAAS,EAAE;AAAA,EAAA;AAAA,EAG3G,MAAgB,cAAcvG,GAAmC;AACvD,UAAA8B,EAAI,QAAQ,oBAAoB,YAAY;AAC9C,MAAIxB,EAAK,OAAO,gBAAgB,KAAK,IAAI,KAAK,KAC1CwB,EAAI,KAAK,GAAG,KAAK,IAAI,0BAA0B,GAG9BC,EAAS,YAAYuB,EAAa,SAAS,GAAG,gBAAgB;AAAA,QAC/E,SAAS;AAAA,UACL,MAAM,KAAK;AAAA,QAAA;AAAA,MACf,CACH,EAEY,QAAQ,CAACnB,MAASnC,EAAM,IAAImC,CAAI,CAAC;AAAA,IAAA,CACjD;AAAA,EAAA;AAAA,EAGL,MAAgB,gBAAgBsE,GAA+B;AACrD,UAAA3E,EAAI,QAAQ,uBAAuB,YAAY;AACjD,MAAKxB,EAAK,OAAO,uBAAuB,KAC9B,MAAA,KAAK,oBAAoBmG,CAAM;AAGnC,YAAAqB,IAAgBrB,EAAO,kBAAkB,uBAAuB,GAChEsB,IAAiB,KAAK,kBAAkBD,CAAa;AAE3D,UAAI,CAACC;AACM,eAAAjG,EAAI,KAAK,4EAA4E;AAGhG,MAAAgG,EAAc,qBAAqB;AAAA,QAC/B,eAAe,KAAK;AAAA,QACpB,iBAAiB,KAAK,KAAK,IAAI;AAAA,MAAA,CAClC,GACDC,EAAe,sBAAsB;AAAA,QACjC,MAAM,IAAIC,EAAkB,KAAK,IAAI,CAAC;AAAA,QACtC,aAAa,KAAK;AAAA,MAAA,CACrB,GAEK,MAAAvB,EAAO,KAAKqB,CAAa;AAAA,IAAA,CAClC;AAAA,EAAA;AAAA,EAGL,MAAgB,oBAAoBrB,GAA+B;AAC1D,IAAAnG,EAAA;AAAA,MACD;AAAA,MACAsH,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAQf;AAAA,IACL,GAEAnB,EAAO,cAAc,uBAAuB;AAEtC,UAAAwB,IAAaxB,EAAO,kBAAkB,aAAa,GACnDyB,IAAmB,KAAK,oBAAoBD,CAAU;AAE5D,QAAI,CAACC;AACM,aAAApG,EAAI,KAAK,sFAAsF;AAG1G,IAAAoG,EAAiB,kCAAkC,GAAG,EAAE,MAAM,YAAY,GAC1ED,EAAW,qBAAqB;AAAA,MAC5B,cAAc,CAAC,UAAU;AAAA,MACzB,iBAAiB;AAAA,IAAA,CACpB,GAEK,MAAAxB,EAAO,KAAKwB,CAAU;AAAA,EAAA;AAAA,EAGtB,oBAAoBA,GAAwD;AAC5E,UAAAE,IAAmBzC,EAAeuC,GAAY;AAAA,MAChD,OAAOlB,EAAK;AAAA,MACZ,UAAU,CAACC,MAAmBA,EAAe,cAAc,EAAE,cAAc;AAAA,MAC3E,MAAMJ,EAAW;AAAA,IAAA,CACpB,GACKsB,IAAmBC,KAAA,gBAAAA,EAAkB,eAAe;AAE1D,WAAKpB,EAAK,0BAA0BmB,CAAgB,IAI7CA,IAHI;AAAA,EAGJ;AAAA,EAGD,kBAAkBJ,GAA2D;AAC7E,UAAAM,IAAsB1C,EAAeoC,GAAe;AAAA,MACtD,OAAOf,EAAK;AAAA,MACZ,UAAU,CAACsB,MAAwBA,EAAoB,cAAc;AAAA,IAAA,CACxE,GACKN,IAAiBK,KAAA,gBAAAA,EAAqB;AAE5C,WAAKrB,EAAK,0BAA0BgB,CAAc,IAI3CA,IAHI;AAAA,EAGJ;AAGf;AAvIItH,EAFSoH,GAEiB,WAAkB,qBAC5CpH,EAHSoH,GAGiB,eAAsB,kCAChDpH,EAJSoH,GAIiB,cAAiC,CAAC,CAAC,QAAQ,cAAc,CAAC;ACbjF,MAAMS,UAAoBzD,EAAQ;AAAA,EAKrC,MAAyB,MAAqB;AAC1C,IAAA/C,EAAI,KAAK,sBAAsB,GAC3BA,EAAA,KAAK,6BAA6Be,EAAc,IAAIC;AAAA;AAAA,MAAuB;AAAA,MAAM,YAAY;AAAA,IAAA,CAAI,CAAC;AAAA,EAAA;AAG9G;AARIrC,EAFS6H,GAEiB,WAAkB,SAC5C7H,EAHS6H,GAGiB,eAAsB;ACH7C,SAASC,EAAiBhF,GAAckB,GAAiB+D,IAAuB,IAAa;AAC1F,QAAAzF,IAAe,KAAK,MAAMzC,EAAK,KAAK,cAAc,KAAK,IAAI,KAAK,CAAC,GAIjEkE,KAAgBgE,IAAczF,KAAA,gBAAAA,EAAa,kBAAkBA,KAAA,gBAAAA,EAAa,iBAAiB,CAAC,GAC5F0F,IAAkBC,GAAY,OAAO,KAAKlE,CAAY,EAAE,OAAOjB,CAAI,CAAC,GACpEoF,IAAQF,EAAgB,QAAQlF,CAAI,GACpCqF,IAAqBH,EAAgBE,IAAQ,CAAC,KAAK;AAEpD,EAAArI,EAAA;AAAA,IACD;AAAA,IACA,IAAIsI,CAAkB,OAAOpE,EAAaoE,CAAkB,CAAC;AAAA,IAC7D;AAAA,eACOA,CAAkB,OAAOpE,EAAaoE,CAAkB,CAAC;AAAA,eACzDrF,CAAI,OAAOkB,CAAO;AAAA;AAAA,EAE7B;AACJ;ACTA,MAA8BoE,EAAO;AAAA,EAIjC,YAAYtF,GAAc;AAFV,IAAA9C,EAAA;AAGZ,SAAK,OAAO8C;AAAA,EAAA;AAAA,EAGhB,MAAa,QAAQe,IAAqC,IAAmB;AACzE,SAAK,mBAAmB,GAExB,MAAM,KAAK,cAAc,GACzB,MAAM,KAAK,gBAAgB,GAEtBA,EAAQ,eACT,MAAM,KAAK,oBAAoB;AAGlB;AACP,YAAAmC,IAASlB,EAAI,EAAE,KAAK;AAE1B,MAAAkB,EAAO,cAAc,cAAc,GAE7B,MAAA,KAAK,YAAYA,CAAM,GAC7B,MAAMA,EAAO,OAAO;AAAA,IAAA;AAGxB,UAAM,KAAK,aAAa,GAExB3E,EAAI,KAAK,UAAU,KAAK,IAAI,aAAa;AAAA,EAAA;AAAA,EAGnC,qBAA2B;AAC7B,IAAAxB,EAAK,SAAS,gBAAgB,IAAI,KAAK,kBAAkB,CAAC,GAAG,KAC7DwB,EAAI,KAAK,GAAG,KAAK,IAAI,wBAAwB;AAAA,EACjD;AAAA,EAGJ,MAAgB,gBAA+B;AAAA,EAAA;AAAA,EAI/C,MAAgB,eAA8B;AAAA,EAAA;AAAA,EAI9C,MAAgB,kBAAiC;AAC7C,IAAAA,EAAI,KAAK,4BAA4B,GACrC,KAAK,mBAAmB;AAAA,EAAA;AAAA,EAG5B,MAAgB,sBAAqC;AAC3C,UAAAA,EAAI,QAAQ,kCAAkC,YAAY;AACtD,YAAAgC,EAAM,IAAI,wBAAwB;AAAA,IAAA,CAC3C;AAAA,EAAA;AAAA,EAGL,MAAgB,YAAY2C,GAA+B;AACnD,IAAA,KAAK,sBAIH,MAAA,KAAK,sBAAsBA,CAAM;AAAA,EAAA;AAAA,EAGjC,qBAA2B;AACjC,QAAIhB,MAAoB;AACpB,MAAA8C;AAAA,QACI,KAAK,kBAAkB;AAAA,QACvB,QAAQlF,EAAY,KAAK,oBAAA,CAAqB,CAAC;AAAA,QAC/C,KAAK,iBAAiB;AAAA,MAC1B;AAEA;AAAA,IAAA;AAGJ,QAAImC,MAAc;AACR,YAAAsD,IAAW1F,EAAgB,KAAK,oBAAqB,CAAA,KAAKF,EAAa,KAAK,qBAAqB;AAEtF,MAAAqF,EAAA,KAAK,qBAAqB,QAAQO,CAAQ,IAAI,KAAK,kBAAkB;AAEtF;AAAA,IAAA;AAGJ,IAAAP,EAAiB,KAAK,kBAAkB,GAAG,QAAQ,KAAK,kBAAkB;AAAA,EAAA;AAAA,EAG9E,MAAgB,sBAAsB9B,GAA+B;AAC3D,UAAA3E,EAAI,QAAQ,+CAA+C,YAAY;AACnE,YAAAmG,IAAaxB,EAAO,kBAAkB,aAAa,GACnDsC,IAAe,KAAK,+BAA+Bd,CAAU;AAEnE,UAAI,CAACc;AACD,eAAOjH,EAAI,KAAK;AAAA;AAAA;AAAA,sBAGV,KAAK,mBAAoB,CAAA;AAAA,iBAC9B;AAGM,MAAAmG,EAAA,qBAAqB,KAAK,oBAAoB,GAC5Cc,EAAA,WAAW,KAAK,oBAAoB,GAE3C,MAAAtC,EAAO,KAAKwB,CAAU;AAAA,IAAA,CAC/B;AAAA,EAAA;AAAA,EAGK,+BAA+BA,GAAuD;;AACtF,UAAAE,IAAmBzC,EAAeuC,GAAY;AAAA,MAChD,OAAOlB,EAAK;AAAA,MACZ,UAAU,CAACC,MAAmBA,EAAe,cAAc,EAAE,cAAc;AAAA,MAC3E,MAAMJ,EAAW;AAAA,IAAA,CACpB,GACKsB,IAAmBC,KAAA,gBAAAA,EAAkB,eAAe,IACpDa,KAAgB3J,IAAA6G,EAAKgC,GAAkBnB,EAAK,yBAAyB,MAArD,gBAAA1H,EAAwD,YAAY,YACpF0J,KAAeE,IAAA/C,EAAK8C,GAAejC,EAAK,oBAAoB,MAA7C,gBAAAkC,EAAgD;AAErE,WAAKlC,EAAK,yBAAyBgC,CAAY,IAIxCA,IAHI;AAAA,EAGJ;AAAA,EAGD,wBAAwBG,GAA2D;AACnF,UAAAC,IAAoBzD,EAAewD,GAAgB;AAAA,MACrD,OAAOnC,EAAK;AAAA,MACZ,UAAU,CAACG,MAAuBA,EAAmB,QAAc,MAAA;AAAA,MACnE,MAAMN,EAAW;AAAA,IAAA,CACpB,GACKwC,IAAeD,KAAA,gBAAAA,EAAmB;AAExC,WAAKpC,EAAK,yBAAyBqC,CAAY,IAIxCA,IAHI;AAAA,EAGJ;AAAA,EAGD,qBAA+D;AAC9D,WAAA;AAAA,MACH,eAAepB,EAAkB,KAAK,IAAI;AAAA,MAC1C,iBAAiB,mBAAmB,KAAK,IAAI;AAAA,IACjD;AAAA,EAAA;AAAA,EAGM,oBAA4B;AAC3B,WAAA,YAAY,KAAK,oBAAqB,CAAA;AAAA,EAAA;AAAA,EAGvC,sBAA8B;AAC7B,WAAA,UAAU,KAAK,IAAI;AAAA,EAAA;AAAA,EAGpB,mBAA4B;AAC3B,WAAA;AAAA,EAAA;AAAA,EAGD,qBAA6B;AACnC,WAAO,GAAGA,EAAkB,KAAK,IAAI,CAAC;AAAA,EAAA;AAG9C;AC7KA,MAAqBqB,WAAmBR,EAAO;AAAA,EAE3C,cAAc;AACV,UAAM,aAAa;AAAA,EAAA;AAG3B;ACFA,MAAqBS,WAAcT,EAAO;AAAA,EAEtC,cAAc;AACV,UAAM,OAAO;AAAA,EAAA;AAAA,EAGjB,MAAyB,YAAYpC,GAA+B;AAC1D,UAAA,KAAK,iBAAiBA,CAAM,GAClC,MAAM,KAAK,gBAAgB,GACrB,MAAA,MAAM,YAAYA,CAAM;AAAA,EAAA;AAAA,EAGf,qBAA2B;AAC1C,IAAA8B,EAAiB,gBAAgB,MAAM,GACvCA,EAAiB,6BAA6B,MAAM,GACnCA,EAAA,2BAA2B,SAAS,EAAI,GAEzD,MAAM,mBAAmB;AAAA,EAAA;AAAA,EAG7B,MAAgB,iBAAiB9B,GAA+B;AAC5D,IAAA3E,EAAI,KAAK,yBAAyB;AAE5B,UAAAiB,IAAczC,EAAK,KAAK,cAAc;AAE5C,QAAI,CAACyC;AACM,aAAAjB,EAAI,KAAK,kCAAkC;AAGjD,IAAAxB,EAAA;AAAA,MACD;AAAA,MACAyC,EACK;AAAA,QACG;AAAA,QACA;AAAA,MAAA,EAGH;AAAA,QACG;AAAA,QACA;AAAA,MAAA,EAGH;AAAA,QACG;AAAA,QACA;AAAA;AAAA,MAAA,EAGH;AAAA,QACG;AAAA,QACA;AAAA;AAAA,MAAA;AAAA,IAGZ,GAEA0D,EAAO,gBAAgB,cAAc;AAAA,EAAA;AAAA,EAGzC,MAAgB,kBAAiC;AAC7C,IAAA3E,EAAI,KAAK,qBAAqB;AAE9B,UAAMyH,IAAYjJ,EAAK,KAAK,YAAY,KAAK;AAExC,IAAAA,EAAA,MAAM,cAAc,GAAGiJ,CAAS;AAAA,CAAU;AAAA,EAAA;AAGvD;ACpEA,MAAqBC,WAAeX,EAAO;AAAA,EAEvC,cAAc;AACV,UAAM,QAAQ;AAAA,EAAA;AAAA,EAGC,qBAA2B;AAC1C,IAAAN,EAAiB,UAAU,MAAM,GAEjC,MAAM,mBAAmB;AAAA,EAAA;AAAA,EAGV,qBAA6B;AACrC,WAAA;AAAA,EAAA;AAGf;ACXA,MAAMkB,IAAU,CAAC,IAAID,MAAU,IAAIF,GAAA,GAAS,IAAID,GAAY,CAAA,EAAE;AAAA,EAC1D,CAACK,GAAeC,MAAW,OAAO,OAAOD,GAAe,EAAE,CAACC,EAAO,IAAI,GAAGA,GAAQ;AAAA,EACjF,CAAA;AACJ;AAKO,MAAMC,UAAuB/E,EAAQ;AAAA,EAexC,YAAY8E,GAAgBrF,IAAmB,IAAI;AACzC,UAAA;AAJF,IAAA7D,EAAA;AACA,IAAAA,EAAA;AAKJ,SAAK,UAAU6D,GACf,KAAK,SACDmF,EAAQE,CAAM,KACd7H,EAAI,KAAK,WAAW6H,CAAM,uCAAuC,OAAO,KAAKF,CAAO,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EAAA;AAAA,EAG1G,MAAyB,MAAqB;AACpC,UAAA,KAAK,OAAO,QAAQ;AAAA,MACtB,aAAa,KAAK,QAAQ;AAAA,IAAA,CAC7B;AAAA,EAAA;AAGT;AA5BIhJ,EAFSmJ,GAEiB,WAAkB,YAC5CnJ,EAHSmJ,GAGiB,eAAsB,gCAChDnJ,EAJSmJ,GAIiB,cAAiC,CAAC,CAAC,UAAU,mBAAmB,CAAC,IAC3FnJ,EALSmJ,GAKiB,WAA0B;AAAA,EAChD,aAAa;AAAA,IACT,MAAM;AAAA,IACN,aAAa;AAAA,EAAA;AAErB;ACdG,MAAMC,GAAW;AAAA,EAEb,IAAIC,GAAuB;AACxB,UAAAhF,IAAU,IAAID,EAAQ;AAEpB,IAAAC,EAAA,KAAK,KAAK,EAAE,YAAY,eAAe,EAAE,QAAQ,KAAK,YAAY,GAE1EM,EAAc,OAAON,CAAO,GAC5BsB,EAAyB,OAAOtB,CAAO,GACvCwC,EAAqB,OAAOxC,CAAO,GACnC+C,EAAuB,OAAO/C,CAAO,GACrCwD,EAAY,OAAOxD,CAAO,GAC1B8E,EAAe,OAAO9E,CAAO,GAE7BA,EAAQ,MAAMgF,CAAI;AAAA,EAAA;AAAA,EAGf,aAAqB;AACxB,UAAMC,IAAe,yDACfC,IAAkBnH,EAAc,IAAIC;AAAA;AAAA,MAAuB;AAAA,MAAmB,YAAY;AAAA,IAAA,CAAI;AAEhG,QAAA,CAACxD,EAAW0K,CAAe;AACrB,YAAA,IAAI,MAAMD,CAAY;AAKzB,WAFa,KAAK,MAAMrK,EAAasK,CAAe,EAAE,UAAU,EAEpD,WAAWC,GAAKF,CAAY;AAAA,EAAA;AAGvD;AAEA,MAAeG,KAAA3J,EAAOsJ,EAAU;"}
|
|
1
|
+
{"version":3,"file":"aerogel-cli.js","sources":["../src/lib/File.ts","../src/lib/Log.ts","../src/lib/Template.ts","../src/lib/utils/paths.ts","../src/lib/Shell.ts","../src/lib/Editor.ts","../src/lib/App.ts","../src/commands/Command.ts","../src/commands/create.ts","../src/lib/utils/app.ts","../src/lib/utils/edit.ts","../src/commands/generate-component.ts","../src/commands/generate-model.ts","../src/commands/generate-service.ts","../src/commands/info.ts","../src/utils/package.ts","../src/plugins/Plugin.ts","../src/plugins/LocalFirst.ts","../src/plugins/Solid.ts","../src/plugins/Soukai.ts","../src/commands/install.ts","../src/cli.ts"],"sourcesContent":["import {\n existsSync,\n lstatSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n rmSync,\n unlinkSync,\n writeFileSync,\n} from 'node:fs';\nimport { dirname, resolve } from 'node:path';\n\nimport { facade } from '@noeldemartin/utils';\n\nexport class FileService {\n\n public contains(path: string, contents: string): boolean {\n return !!this.read(path)?.includes(contents);\n }\n\n public exists(path: string): boolean {\n return existsSync(path);\n }\n\n public delete(path: string): void {\n if (this.isDirectory(path)) {\n rmSync(path, { recursive: true });\n\n return;\n }\n\n unlinkSync(path);\n }\n\n public isSymlink(path: string): boolean {\n const stats = lstatSync(path);\n\n return stats.isSymbolicLink();\n }\n\n public read(path: string): string | null {\n if (!this.isFile(path)) {\n return null;\n }\n\n return readFileSync(path).toString();\n }\n\n public replace(path: string, search: string | RegExp, replacement: string): void {\n const contents = this.read(path);\n\n if (!contents) {\n return;\n }\n\n this.write(path, contents.replaceAll(search, replacement));\n }\n\n public getFiles(directoryPath: string): string[] {\n const children = readdirSync(directoryPath, { withFileTypes: true });\n const files: string[] = [];\n\n for (const child of children) {\n const path = resolve(directoryPath, child.name);\n\n if (child.isDirectory()) {\n files.push(...this.getFiles(path));\n } else {\n files.push(path);\n }\n }\n\n return files;\n }\n\n public isDirectory(path: string): boolean {\n return this.exists(path) && lstatSync(path).isDirectory();\n }\n\n public isFile(path: string): boolean {\n return this.exists(path) && lstatSync(path).isFile();\n }\n\n public isEmptyDirectory(path: string): boolean {\n if (!this.isDirectory(path)) {\n return false;\n }\n\n return this.getFiles(path).length === 0;\n }\n\n public makeDirectory(path: string): void {\n mkdirSync(path, { recursive: true });\n }\n\n public write(path: string, contents: string): void {\n if (!existsSync(dirname(path))) {\n mkdirSync(dirname(path), { recursive: true });\n }\n\n writeFileSync(path, contents);\n }\n\n}\n\nexport default facade(FileService);\n","import chalk from 'chalk';\nimport { clearLine, cursorTo } from 'node:readline';\nimport { facade, stringMatchAll } from '@noeldemartin/utils';\n\nexport class LogService {\n\n protected renderInfo = chalk.hex('#00ffff');\n protected renderSuccess = chalk.hex('#00ff00');\n protected renderError = chalk.hex('#ff0000');\n\n public async animate<T>(message: string, operation: () => Promise<T>): Promise<T> {\n const updateStdout = (end: string = '', done: boolean = false) => {\n const progress =\n this.renderInfo(this.renderMarkdown(message) + (done ? '...' : '.'.repeat(frame % 4))) + end;\n\n this.stdout(progress);\n };\n\n let frame = 0;\n\n updateStdout();\n\n const interval = setInterval(() => (frame++, updateStdout()), 1000);\n const result = await operation();\n\n clearInterval(interval);\n updateStdout('\\n', true);\n\n return result;\n }\n\n public info(message: string): void {\n this.log(this.renderMarkdown(message), this.renderInfo);\n }\n\n public error(message: string): void {\n this.log(this.renderMarkdown(message), this.renderError);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public fail<T = any>(message: string): T {\n this.error(message);\n\n process.exit(1);\n }\n\n public success(message: string): void {\n this.log(this.renderMarkdown(message), this.renderSuccess);\n }\n\n protected renderMarkdown(message: string): string {\n const matches = stringMatchAll<2>(message, /\\*\\*(.*)\\*\\*/g);\n\n for (const match of matches) {\n message = message.replace(match[0], chalk.bold(match[1]));\n }\n\n return message;\n }\n\n protected log(message: string, formatMessage?: (message: string) => string): void {\n this.formatMessage(message).forEach((line) => {\n this.logLine(formatMessage ? formatMessage(line) : line);\n });\n }\n\n protected formatMessage(message: string): string[] {\n if (message[0] === '\\n') {\n message = message.slice(1).trimEnd();\n\n const lines = message.split('\\n');\n const firstLetter = message.trim()[0] ?? '';\n const indentation = lines.find((line) => line.trim().length > 0)?.indexOf(firstLetter) ?? 0;\n\n return lines.map((line) => line.slice(indentation));\n }\n\n return [message];\n }\n\n protected logLine(line: string): void {\n // eslint-disable-next-line no-console\n console.log(line);\n }\n\n protected stdout(message: string): void {\n cursorTo(process.stdout, 0);\n clearLine(process.stdout, 0);\n\n process.stdout.write(message);\n }\n\n}\n\nexport default facade(LogService);\n","import Mustache from 'mustache';\nimport { readFileSync } from 'node:fs';\nimport { toString } from '@noeldemartin/utils';\n\nimport File from '@aerogel/cli/lib/File';\n\nexport default class Template {\n\n public static instantiate(\n path: string,\n destination: string = './',\n replacements: Record<string, unknown> = {},\n ): string[] {\n const template = new Template(path);\n\n return template.instantiate(destination, replacements);\n }\n\n constructor(public path: string) {}\n\n public instantiate(destination: string, replacements: Record<string, unknown> = {}): string[] {\n const filenameReplacements = this.getFilenameReplacements(replacements);\n const files: string[] = [];\n destination = `${destination}/`.replace(/\\/\\//, '/');\n\n for (const file of File.getFiles(this.path)) {\n const relativePath = Object.entries(filenameReplacements).reduce(\n (path, [match, replacement]) => path.replaceAll(match, replacement),\n file.substring(this.path.length + 1),\n );\n const fileContents = readFileSync(file).toString();\n const filePath =\n destination + (relativePath.endsWith('.template') ? relativePath.slice(0, -9) : relativePath);\n\n File.write(filePath, Mustache.render(fileContents, replacements, undefined, ['<%', '%>']));\n files.push(filePath);\n }\n\n return files;\n }\n\n protected getFilenameReplacements(\n replacements: Record<string, unknown>,\n prefix: string = '',\n ): Record<string, string> {\n return Object.entries(replacements).reduce(\n (filenameReplacements, [key, value]) => {\n if (typeof value === 'object') {\n Object.assign(\n filenameReplacements,\n this.getFilenameReplacements(value as Record<string, unknown>, `${key}.`),\n );\n } else {\n filenameReplacements[`[${prefix}${key}]`] = toString(value);\n }\n\n return filenameReplacements;\n },\n {} as Record<string, string>,\n );\n }\n\n}\n","import { URL, fileURLToPath } from 'node:url';\nimport { stringMatch } from '@noeldemartin/utils';\nimport { resolve } from 'node:path';\n\nimport File from '@aerogel/cli/lib/File';\nimport Log from '@aerogel/cli/lib/Log';\n\nexport function basePath(path: string = ''): string {\n if (process.env.AEROGEL_BASE_PATH) {\n return resolve(process.env.AEROGEL_BASE_PATH, path);\n }\n\n if (\n File.contains(\n fileURLToPath(new URL(/* @vite-ignore */ '../../../package.json', import.meta.url)),\n '\"name\": \"aerogel\"',\n )\n ) {\n return resolve(fileURLToPath(new URL(/* @vite-ignore */ '../', import.meta.url)), path);\n }\n\n const packageJson = File.read(\n fileURLToPath(new URL(/* @vite-ignore */ '../../../../package.json', import.meta.url)),\n );\n const matches = stringMatch<2>(packageJson ?? '', /\"@aerogel\\/core\": \"file:(.*)\\/aerogel-core-[\\d.]*\\.tgz\"/);\n const cliPath = matches?.[1] ?? Log.fail<string>('Could not determine base path');\n\n return resolve(cliPath, path);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function packNotFound(packageName: string): any {\n return Log.fail(`Could not find ${packageName} pack file, did you run 'npm pack'?`);\n}\n\nexport function packagePackPath(packageName: string): string | null {\n return File.getFiles(packagePath(packageName)).find((file) => file.endsWith('.tgz')) ?? null;\n}\n\nexport function packagePath(packageName: string): string {\n return basePath(`../${packageName}`);\n}\n\nexport function templatePath(name: string): string {\n return fileURLToPath(new URL(/* @vite-ignore */ `../templates/${name}`, import.meta.url));\n}\n","import { exec } from 'node:child_process';\nimport { facade } from '@noeldemartin/utils';\n\nexport class ShellService {\n\n private cwd: string | null = null;\n\n public setWorkingDirectory(cwd: string): void {\n this.cwd = cwd;\n }\n\n public async run(command: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n exec(command, { cwd: this.cwd ?? undefined }, (error) => {\n if (error) {\n reject(error);\n\n return;\n }\n\n resolve();\n });\n });\n }\n\n}\n\nexport default facade(ShellService);\n","import { arrayFrom } from '@noeldemartin/utils';\nimport { Project } from 'ts-morph';\nimport type { SourceFile } from 'ts-morph';\n\nimport File from '@aerogel/cli/lib/File';\nimport Log from '@aerogel/cli/lib/Log';\nimport Shell from '@aerogel/cli/lib/Shell';\n\nexport class Editor {\n\n private project: Project;\n private modifiedFiles: Set<string>;\n\n constructor() {\n this.project = new Project({ tsConfigFilePath: 'tsconfig.json' });\n this.modifiedFiles = new Set();\n\n this.project.addSourceFilesAtPaths('src/**/*.ts');\n this.project.addSourceFilesAtPaths('vite.config.ts');\n this.project.addSourceFilesAtPaths('package.json');\n }\n\n public addSourceFile(path: string): void {\n this.project.addSourceFilesAtPaths(path);\n }\n\n public requireSourceFile(path: string): SourceFile {\n return this.project.getSourceFileOrThrow(path);\n }\n\n public async format(): Promise<void> {\n await Log.animate('Formatting modified files', async () => {\n const usingPrettier = File.exists('prettier.config.js') || File.contains('package.json', '\"prettier\": {');\n const usingESLint = File.exists('.eslintrc.js') || File.contains('package.json', '\"eslintConfig\"');\n const usingPrettierESLint = File.contains('package.json', '\"prettier-eslint-cli\"');\n const formatFile = usingPrettierESLint\n ? (file: string) => Shell.run(`npx prettier-eslint ${file} --write`)\n : async (file: string) => {\n usingPrettier && (await Shell.run(`npx prettier ${file} --write`));\n file.match(/\\.(ts|js|vue)$/) && usingESLint && (await Shell.run(`npx eslint ${file} --fix`));\n };\n\n await Promise.all(arrayFrom(this.modifiedFiles).map(async (file) => formatFile(file)));\n });\n }\n\n public async save(file: SourceFile): Promise<void> {\n await file.save();\n\n this.addModifiedFile(file.getFilePath());\n }\n\n public addModifiedFile(path: string): void {\n this.modifiedFiles.add(path);\n }\n\n}\n","import { resolve } from 'node:path';\n\nimport File from '@aerogel/cli/lib/File';\nimport Log from '@aerogel/cli/lib/Log';\nimport Template from '@aerogel/cli/lib/Template';\nimport { packNotFound, packagePackPath, packagePath, templatePath } from '@aerogel/cli/lib/utils/paths';\nimport { Editor } from '@aerogel/cli/lib/Editor';\nimport { simpleGit } from 'simple-git';\n\nexport interface Options {\n next?: boolean;\n local?: boolean;\n linkedLocal?: boolean;\n}\n\nexport default class App {\n\n constructor(\n protected name: string,\n protected options: Options = {},\n ) {}\n\n public async create(path: string): Promise<void> {\n if (File.exists(path) && (!File.isDirectory(path) || !File.isEmptyDirectory(path))) {\n Log.fail(`Folder at '${path}' already exists!`);\n }\n\n // Clone repository\n await simpleGit().clone('https://github.com/NoelDeMartin/aerogel-template.git', path, {\n '--depth': 1,\n });\n\n File.delete(resolve(path, '.git'));\n\n // Apply replacements\n const dependencies = this.getDependencies();\n\n File.replace(\n resolve(path, 'vite.config.ts'),\n 'Aerogel({ name: \\'Aerogel\\' })',\n `Aerogel({ name: '${this.name}' })`,\n );\n\n File.replace(resolve(path, 'src/lang/en.yaml'), 'title: \\'App\\'', `title: '${this.name}'`);\n\n for (const [name, version] of Object.entries(dependencies)) {\n File.replace(resolve(path, 'package.json'), new RegExp(`\"${name}\": \".*?\"`, 'g'), `\"${name}\": \"${version}\"`);\n }\n\n // Copy template\n Template.instantiate(templatePath('app'), path, { app: { name: this.name } });\n }\n\n public edit(): Editor {\n return new Editor();\n }\n\n protected getDependencies(): Record<string, string> {\n const withFilePrefix = <T extends Record<string, string>>(paths: T) =>\n Object.entries(paths).reduce(\n (pathsWithFile, [name, path]) => Object.assign(pathsWithFile, { [name]: `file:${path}` }) as T,\n {} as T,\n );\n\n const dependencies: Record<string, string> = {};\n\n if (this.options.next) {\n dependencies['@aerogel/cli'] = 'next';\n dependencies['@aerogel/core'] = 'next';\n dependencies['@aerogel/cypress'] = 'next';\n dependencies['@aerogel/plugin-i18n'] = 'next';\n dependencies['@aerogel/plugin-local-first'] = 'next';\n dependencies['@aerogel/plugin-routing'] = 'next';\n dependencies['@aerogel/plugin-solid'] = 'next';\n dependencies['@aerogel/plugin-soukai'] = 'next';\n dependencies['@aerogel/vite'] = 'next';\n dependencies['@noeldemartin/solid-utils'] = 'next';\n dependencies['@noeldemartin/utils'] = 'next';\n dependencies['soukai-solid'] = 'next';\n dependencies['soukai'] = 'next';\n }\n\n if (this.options.linkedLocal) {\n Object.assign(\n dependencies,\n withFilePrefix({\n '@aerogel/cli': packagePath('cli'),\n '@aerogel/core': packagePath('core'),\n '@aerogel/cypress': packagePath('cypress'),\n '@aerogel/plugin-i18n': packagePath('plugin-i18n'),\n '@aerogel/plugin-routing': packagePath('plugin-routing'),\n '@aerogel/plugin-soukai': packagePath('plugin-soukai'),\n '@aerogel/plugin-solid': packagePath('plugin-solid'),\n '@aerogel/plugin-local-first': packagePath('plugin-local-first'),\n '@aerogel/vite': packagePath('vite'),\n }),\n );\n } else if (this.options.local) {\n Object.assign(\n dependencies,\n withFilePrefix({\n '@aerogel/cli': packagePackPath('cli') ?? packNotFound('cli'),\n '@aerogel/core': packagePackPath('core') ?? packNotFound('core'),\n '@aerogel/cypress': packagePackPath('cypress') ?? packNotFound('cypress'),\n '@aerogel/plugin-i18n': packagePackPath('plugin-i18n') ?? packNotFound('plugin-i18n'),\n '@aerogel/plugin-routing': packagePackPath('plugin-routing') ?? packNotFound('plugin-routing'),\n '@aerogel/plugin-soukai': packagePackPath('plugin-soukai') ?? packNotFound('plugin-soukai'),\n '@aerogel/plugin-solid': packagePackPath('plugin-solid') ?? packNotFound('plugin-solid'),\n '@aerogel/plugin-local-first':\n packagePackPath('plugin-local-first') ?? packNotFound('plugin-local-first'),\n '@aerogel/vite': packagePackPath('vite') ?? packNotFound('vite'),\n }),\n );\n }\n\n return dependencies;\n }\n\n}\n","import File from '@aerogel/cli/lib/File';\nimport Log from '@aerogel/cli/lib/Log';\nimport type { Constructor } from '@noeldemartin/utils';\nimport type { Command as CommanderCommand } from 'commander';\n\nexport type CommandConstructor<T extends Command = Command> = Constructor<T>;\nexport type CommandOptions = Record<string, string | { description: string; type?: string }>;\n\nexport default class Command {\n\n protected static command: string = '';\n protected static description: string = '';\n protected static parameters: [string, string][] = [];\n protected static options: CommandOptions = {};\n\n public static define(program: CommanderCommand): void {\n program = program.command(this.command).description(this.description);\n\n for (const [name, description] of this.parameters) {\n program = program.argument(`<${name}>`, description);\n }\n\n for (const [name, definition] of Object.entries(this.options)) {\n const description = typeof definition === 'string' ? definition : definition.description;\n const type = typeof definition === 'string' ? 'string' : (definition.type ?? 'string');\n\n program = program.option(type === 'boolean' ? `--${name}` : `--${name} <${type}>`, description);\n }\n\n program = program.action((...args) => this.run.call(this, ...args));\n }\n\n public static async run<T extends CommandConstructor>(this: T, ...args: ConstructorParameters<T>): Promise<void> {\n const instance = new this(...args);\n\n await instance.validate();\n await instance.run();\n }\n\n protected async validate(): Promise<void> {\n // Placeholder for overrides, don't place any functionality here.\n }\n\n protected async run(): Promise<void> {\n // Placeholder for overrides, don't place any functionality here.\n }\n\n protected assertAerogelOrDirectory(path?: string): void {\n const packageJson = File.read('package.json');\n\n if (packageJson?.includes('@aerogel/core')) {\n return;\n }\n\n if (path && File.isDirectory(path)) {\n return;\n }\n\n const message = path ? `${path} folder does not exist.` : 'package.json does not contain @aerogel/core.';\n\n Log.fail(`${message} Are you sure this is an Aerogel app?`);\n }\n\n}\n","import { basename } from 'node:path';\nimport { stringToTitleCase } from '@noeldemartin/utils';\n\nimport App from '@aerogel/cli/lib/App';\nimport Command from '@aerogel/cli/commands/Command';\nimport Log from '@aerogel/cli/lib/Log';\nimport Shell from '@aerogel/cli/lib/Shell';\nimport type { CommandOptions } from '@aerogel/cli/commands/Command';\n\nexport interface Options {\n name?: string;\n local?: boolean;\n copy?: boolean;\n next?: boolean;\n}\n\nexport class CreateCommand extends Command {\n\n protected static override command: string = 'create';\n protected static override description: string = 'Create AerogelJS app';\n protected static override parameters: [string, string][] = [['path', 'Application path']];\n protected static override options: CommandOptions = {\n name: 'Application name',\n local: {\n type: 'boolean',\n description: 'Whether to create an app using local Aerogel packages (used for core development)',\n },\n next: {\n type: 'boolean',\n description: 'Whether to use the bleeding edge version for dependencies',\n },\n copy: {\n type: 'boolean',\n description: 'Whether to create an app linked to local Aerogel packages (used in CI)',\n },\n };\n\n private path: string;\n private options: Options;\n\n constructor(path: string, options: Options = {}) {\n super();\n\n this.path = path;\n this.options = options;\n }\n\n protected override async run(): Promise<void> {\n const path = this.path;\n const name = this.options.name ?? stringToTitleCase(basename(path));\n\n Shell.setWorkingDirectory(path);\n\n await this.createApp(name, path);\n await this.initializeGit();\n\n Log.success(`\n\n That's it! You can start working on **${name}** doing the following:\n\n cd ${path}\n pnpm install\n pnpm dev\n\n Have fun!\n `);\n }\n\n protected async createApp(name: string, path: string): Promise<void> {\n Log.info(`Creating **${name}**...`);\n\n const app = new App(name, {\n next: this.options.next,\n local: this.options.local,\n linkedLocal: this.options.local && !this.options.copy,\n });\n\n await app.create(path);\n }\n\n protected async initializeGit(): Promise<void> {\n await Log.animate('Initializing git', async () => {\n await Shell.run('git init');\n await Shell.run('git add .');\n await Shell.run('git commit -m \"Start\"');\n });\n }\n\n}\n","import App from '@aerogel/cli/lib/App';\nimport File from '@aerogel/cli/lib/File';\n\nexport function app(): App {\n // TODO parse app name\n return new App('');\n}\n\nexport function isLocalApp(): boolean {\n return File.contains('package.json', '\"@aerogel/core\": \"file:');\n}\n\nexport function isLinkedLocalApp(): boolean {\n return File.isSymlink('node_modules/@aerogel/core');\n}\n","import { arrayFrom } from '@noeldemartin/utils';\nimport type { Node, SyntaxKind } from 'ts-morph';\n\nexport function editFiles(): boolean {\n // TODO mock editor instead of relying on this for unit tests\n return true;\n}\n\nexport function findDescendant<T extends Node>(\n node: Node | undefined,\n options: {\n guard?: (node: Node | undefined) => node is T;\n validate?: (node: T) => boolean;\n skip?: SyntaxKind | SyntaxKind[];\n } = {},\n): T | undefined {\n if (!node) {\n return;\n }\n\n const guard = options.guard ?? (() => true);\n const validate = options.validate ?? (() => true);\n const skipKinds = arrayFrom(options.skip ?? []);\n\n return node.forEachDescendant((descendant, traversal) => {\n if (guard(descendant) && validate(descendant as T)) {\n return descendant as T;\n }\n\n const descendantKind = descendant.getKind();\n\n if (skipKinds.includes(descendantKind)) {\n traversal.skip();\n }\n });\n}\n\nexport function when<T extends Node>(node: Node | undefined, assertion: (node: Node) => node is T): T | undefined {\n if (!node || !assertion(node)) {\n return;\n }\n\n return node as T;\n}\n","import { arrayFrom, stringToSlug } from '@noeldemartin/utils';\nimport { Node, SyntaxKind } from 'ts-morph';\nimport type { ArrayLiteralExpression, CallExpression, SourceFile } from 'ts-morph';\n\nimport Command from '@aerogel/cli/commands/Command';\nimport File from '@aerogel/cli/lib/File';\nimport Log from '@aerogel/cli/lib/Log';\nimport Template from '@aerogel/cli/lib/Template';\nimport { app } from '@aerogel/cli/lib/utils/app';\nimport { editFiles, findDescendant } from '@aerogel/cli/lib/utils/edit';\nimport { templatePath } from '@aerogel/cli/lib/utils/paths';\n\nexport interface Options {\n button?: boolean;\n checkbox?: boolean;\n input?: boolean;\n story?: boolean;\n}\n\nexport class GenerateComponentCommand extends Command {\n\n protected static override command: string = 'generate:component';\n protected static override description: string = 'Generate an AerogelJS Component';\n protected static override parameters: [string, string][] = [\n ['path', 'Component path (relative to components folder; extension not necessary)'],\n ];\n\n private path: string;\n\n constructor(path: string) {\n super();\n\n this.path = path;\n }\n\n protected override async run(): Promise<void> {\n this.assertAerogelOrDirectory('src/components');\n\n const files = new Set<string>();\n const [directoryName, componentName] = this.parsePathComponents();\n\n await this.createComponent(directoryName, componentName, files);\n await this.declareComponents();\n\n const filesList = arrayFrom(files)\n .map((file) => `- ${file}`)\n .join('\\n');\n\n Log.info(`${componentName} component created successfully! The following files were created:\\n\\n${filesList}`);\n }\n\n protected async createComponent(directoryName: string, componentName: string, files: Set<string>): Promise<void> {\n await Log.animate('Creating component', async () => {\n if (File.exists(`src/components/${this.path}.vue`)) {\n Log.fail(`${this.path} component already exists!`);\n }\n\n const componentFiles = Template.instantiate(templatePath('component'), `src/components/${directoryName}`, {\n component: {\n name: componentName,\n slug: stringToSlug(componentName),\n },\n });\n\n componentFiles.forEach((file) => files.add(file));\n });\n }\n\n protected async declareComponents(): Promise<void> {\n if (!editFiles()) {\n return;\n }\n\n const editor = app().edit();\n const viteConfig = editor.requireSourceFile('vite.config.ts');\n const componentDirsArray = this.getComponentDirsArray(viteConfig);\n\n if (!componentDirsArray) {\n return Log.fail('Could not find component dirs declaration in vite config!');\n }\n\n if (\n componentDirsArray\n .getDescendantsOfKind(SyntaxKind.StringLiteral)\n .some((literal) => literal.getText() === '\\'src/components\\'')\n ) {\n return;\n }\n\n await Log.animate('Updating vite config', async () => {\n componentDirsArray.addElement('\\'src/components\\'');\n\n await editor.save(viteConfig);\n });\n\n await editor.format();\n }\n\n protected getComponentDirsArray(viteConfig: SourceFile): ArrayLiteralExpression | null {\n const pluginCall = findDescendant(viteConfig, {\n guard: Node.isCallExpression,\n validate: (callExpression) => callExpression.getText().startsWith('Components('),\n skip: SyntaxKind.ImportDeclaration,\n });\n\n if (!pluginCall) {\n return null;\n }\n\n const dirsAssignment = findDescendant(pluginCall, {\n guard: Node.isPropertyAssignment,\n validate: (propertyAssignment) => propertyAssignment.getName() === 'dirs',\n });\n\n const dirsArray = dirsAssignment?.getInitializer();\n\n if (!Node.isArrayLiteralExpression(dirsArray)) {\n return this.declareComponentDirsArray(pluginCall);\n }\n\n return dirsArray;\n }\n\n protected declareComponentDirsArray(pluginCall: CallExpression): ArrayLiteralExpression | null {\n const pluginOptions = findDescendant(pluginCall, { guard: Node.isObjectLiteralExpression });\n const dirsAssignment = pluginOptions?.addPropertyAssignment({\n name: 'dirs',\n initializer: '[]',\n });\n\n return (dirsAssignment?.getInitializer() as ArrayLiteralExpression) ?? null;\n }\n\n protected parsePathComponents(): [string, string] {\n const lastSlashIndex = this.path.lastIndexOf('/');\n\n return lastSlashIndex === -1\n ? ['', this.path]\n : [this.path.substring(0, lastSlashIndex), this.path.substring(lastSlashIndex + 1)];\n }\n\n}\n","import { formatCodeBlock, stringToStudlyCase } from '@noeldemartin/utils';\n\nimport Command from '@aerogel/cli/commands/Command';\nimport File from '@aerogel/cli/lib/File';\nimport Log from '@aerogel/cli/lib/Log';\nimport Template from '@aerogel/cli/lib/Template';\nimport { templatePath } from '@aerogel/cli/lib/utils/paths';\nimport type { CommandOptions } from '@aerogel/cli/commands/Command';\n\ninterface Options {\n fields?: string;\n}\n\nexport class GenerateModelCommand extends Command {\n\n protected static override command: string = 'generate:model';\n protected static override description: string = 'Generate an AerogelJS Model';\n protected static override parameters: [string, string][] = [['name', 'Model name']];\n protected static override options: CommandOptions = {\n fields: 'Create model with the given fields',\n };\n\n private name: string;\n private options: Options;\n\n constructor(name: string, options: Options = {}) {\n super();\n\n this.name = name;\n this.options = options;\n }\n\n protected override async run(): Promise<void> {\n this.assertAerogelOrDirectory('src/models');\n\n if (File.exists(`src/models/${this.name}.ts`)) {\n Log.fail(`${this.name} model already exists!`);\n }\n\n this.assertSoukaiInstalled();\n\n const filesList = await Log.animate('Creating model', async () => {\n const files = Template.instantiate(templatePath('model'), 'src/models', {\n model: {\n name: this.name,\n fieldsDefinition: this.getFieldsDefinition(),\n },\n });\n\n return files.map((file) => `- ${file}`).join('\\n');\n });\n\n Log.info(`${this.name} model created successfully! The following files were created:\\n\\n${filesList}`);\n }\n\n protected getFieldsDefinition(): string {\n if (!this.options.fields) {\n return ' //';\n }\n\n const code = this.options.fields\n .split(',')\n .map((field) => {\n const [name, type, rules] = field.split(':');\n\n return {\n name,\n type: stringToStudlyCase(type ?? 'string'),\n required: rules === 'required',\n };\n })\n .reduce((definition, field) => {\n const fieldDefinition = field.required\n ? formatCodeBlock(`\n ${field.name}: {\n type: FieldType.${field.type},\n required: true,\n }\n `)\n : `${field.name}: FieldType.${field.type}`;\n\n return definition + `\\n${fieldDefinition},`;\n }, '');\n\n return formatCodeBlock(code, { indent: 8 });\n }\n\n protected assertSoukaiInstalled(): void {\n if (!File.contains('package.json', '\"soukai\"') && !File.contains('package.json', '\"@aerogel/plugin-soukai\"')) {\n Log.fail(`\n Soukai is not installed yet! You can install it running:\n npx gel install soukai\n `);\n }\n }\n\n}\n","import { arrayFrom, formatCodeBlock, stringToCamelCase } from '@noeldemartin/utils';\nimport { Node, SyntaxKind } from 'ts-morph';\nimport type { ObjectLiteralExpression, SourceFile } from 'ts-morph';\n\nimport Command from '@aerogel/cli/commands/Command';\nimport File from '@aerogel/cli/lib/File';\nimport Log from '@aerogel/cli/lib/Log';\nimport Template from '@aerogel/cli/lib/Template';\nimport { app } from '@aerogel/cli/lib/utils/app';\nimport { templatePath } from '@aerogel/cli/lib/utils/paths';\nimport { editFiles, findDescendant } from '@aerogel/cli/lib/utils/edit';\nimport type { Editor } from '@aerogel/cli/lib/Editor';\n\nexport class GenerateServiceCommand extends Command {\n\n protected static override command: string = 'generate:service';\n protected static override description: string = 'Generate an AerogelJS Service';\n protected static override parameters: [string, string][] = [['name', 'Service name']];\n\n private name: string;\n\n constructor(name: string) {\n super();\n\n this.name = name;\n }\n\n protected override async run(): Promise<void> {\n this.assertAerogelOrDirectory('src/services');\n\n const files = new Set<string>();\n const editor = app().edit();\n\n await this.createService(files);\n\n if (editFiles()) {\n await this.registerService(editor);\n await editor.format();\n }\n\n const filesList = arrayFrom(files)\n .map((file) => `- ${file}`)\n .join('\\n');\n\n Log.info(`${this.name} service created successfully! The following files were created:\\n\\n${filesList}`);\n }\n\n protected async createService(files: Set<string>): Promise<void> {\n await Log.animate('Creating service', async () => {\n if (File.exists(`src/services/${this.name}.ts`)) {\n Log.fail(`${this.name} service already exists!`);\n }\n\n const serviceFiles = Template.instantiate(templatePath('service'), 'src/services', {\n service: {\n name: this.name,\n },\n });\n\n serviceFiles.forEach((file) => files.add(file));\n });\n }\n\n protected async registerService(editor: Editor): Promise<void> {\n await Log.animate('Registering service', async () => {\n if (!File.exists('src/services/index.ts')) {\n await this.createServicesIndex(editor);\n }\n\n const servicesIndex = editor.requireSourceFile('src/services/index.ts');\n const servicesObject = this.getServicesObject(servicesIndex);\n\n if (!servicesObject) {\n return Log.fail('Could not find services object in services config, please add it manually.');\n }\n\n servicesIndex.addImportDeclaration({\n defaultImport: this.name,\n moduleSpecifier: `./${this.name}`,\n });\n servicesObject.addPropertyAssignment({\n name: `$${stringToCamelCase(this.name)}`,\n initializer: this.name,\n });\n\n await editor.save(servicesIndex);\n });\n }\n\n protected async createServicesIndex(editor: Editor): Promise<void> {\n File.write(\n 'src/services/index.ts',\n formatCodeBlock(`\n export const services = {};\n\n export type AppServices = typeof services;\n\n declare module '@aerogel/core' {\n interface Services extends AppServices {}\n }\n `),\n );\n\n editor.addSourceFile('src/services/index.ts');\n\n const mainConfig = editor.requireSourceFile('src/main.ts');\n const bootstrapOptions = this.getBootstrapOptions(mainConfig);\n\n if (!bootstrapOptions) {\n return Log.fail('Could not find options object in bootstrap config, please add the services manually.');\n }\n\n bootstrapOptions.insertShorthandPropertyAssignment(0, { name: 'services' });\n mainConfig.addImportDeclaration({\n namedImports: ['services'],\n moduleSpecifier: './services',\n });\n\n await editor.save(mainConfig);\n }\n\n protected getBootstrapOptions(mainConfig: SourceFile): ObjectLiteralExpression | null {\n const bootstrapAppCall = findDescendant(mainConfig, {\n guard: Node.isCallExpression,\n validate: (callExpression) => callExpression.getExpression().getText() === 'bootstrap',\n skip: SyntaxKind.ImportDeclaration,\n });\n const bootstrapOptions = bootstrapAppCall?.getArguments()[1];\n\n if (!Node.isObjectLiteralExpression(bootstrapOptions)) {\n return null;\n }\n\n return bootstrapOptions;\n }\n\n protected getServicesObject(servicesIndex: SourceFile): ObjectLiteralExpression | null {\n const servicesDeclaration = findDescendant(servicesIndex, {\n guard: Node.isVariableDeclaration,\n validate: (variableDeclaration) => variableDeclaration.getName() === 'services',\n });\n const servicesObject = servicesDeclaration?.getInitializer();\n\n if (!Node.isObjectLiteralExpression(servicesObject)) {\n return null;\n }\n\n return servicesObject;\n }\n\n}\n","import { URL, fileURLToPath } from 'node:url';\n\nimport Command from '@aerogel/cli/commands/Command';\nimport Log from '@aerogel/cli/lib/Log';\nexport class InfoCommand extends Command {\n\n protected static override command: string = 'info';\n protected static override description: string = 'Show debugging information about the CLI';\n\n protected override async run(): Promise<void> {\n Log.info('[AerogelJS CLI info]');\n Log.info('Installation directory: ' + fileURLToPath(new URL(/* @vite-ignore */ './', import.meta.url)));\n }\n\n}\n","import { arraySorted } from '@noeldemartin/utils';\n\nimport File from '@aerogel/cli/lib/File';\n\nexport function addNpmDependency(name: string, version: string, development: boolean = false): void {\n const packageJson = (JSON.parse(File.read('package.json') ?? '{}') ?? {}) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const dependencies = (development ? packageJson?.devDependencies : packageJson?.dependencies) ?? {};\n const dependencyNames = arraySorted(Object.keys(dependencies).concat(name));\n const index = dependencyNames.indexOf(name);\n const previousDependency = dependencyNames[index - 1] ?? '';\n\n File.replace(\n 'package.json',\n `\"${previousDependency}\": \"${dependencies[previousDependency]}\",`,\n `\n \"${previousDependency}\": \"${dependencies[previousDependency]}\",\n \"${name}\": \"${version}\",\n `,\n );\n}\n","import { Node, SyntaxKind } from 'ts-morph';\nimport { stringToCamelCase } from '@noeldemartin/utils';\nimport type { ArrayLiteralExpression, ImportDeclarationStructure, OptionalKind, SourceFile } from 'ts-morph';\n\nimport Log from '@aerogel/cli/lib/Log';\nimport Shell from '@aerogel/cli/lib/Shell';\nimport File from '@aerogel/cli/lib/File';\nimport { app, isLinkedLocalApp, isLocalApp } from '@aerogel/cli/lib/utils/app';\nimport { addNpmDependency } from '@aerogel/cli/utils/package';\nimport { editFiles, findDescendant, when } from '@aerogel/cli/lib/utils/edit';\nimport { packNotFound, packagePackPath, packagePath } from '@aerogel/cli/lib/utils/paths';\nimport type { Editor } from '@aerogel/cli/lib/Editor';\n\nexport default abstract class Plugin {\n\n public readonly name: string;\n\n constructor(name: string) {\n this.name = name;\n }\n\n public async install(options: { skipInstall?: boolean } = {}): Promise<void> {\n this.assertNotInstalled();\n\n await this.beforeInstall();\n await this.addDependencies();\n\n if (!options.skipInstall) {\n await this.installDependencies();\n }\n\n if (editFiles()) {\n const editor = app().edit();\n\n editor.addSourceFile('package.json');\n\n await this.updateFiles(editor);\n await editor.format();\n }\n\n await this.afterInstall();\n\n Log.info(`Plugin ${this.name} installed!`);\n }\n\n protected assertNotInstalled(): void {\n if (File.contains('package.json', `\"${this.getNpmPackageName()}\"`)) {\n Log.fail(`${this.name} is already installed!`);\n }\n }\n\n protected async beforeInstall(): Promise<void> {\n // Placeholder for overrides, don't place any functionality here.\n }\n\n protected async afterInstall(): Promise<void> {\n // Placeholder for overrides, don't place any functionality here.\n }\n\n protected async addDependencies(): Promise<void> {\n Log.info('Adding plugin dependencies');\n this.addNpmDependencies();\n }\n\n protected async installDependencies(): Promise<void> {\n await Log.animate('Installing plugin dependencies', async () => {\n await Shell.run('pnpm install --no-save');\n });\n }\n\n protected async updateFiles(editor: Editor): Promise<void> {\n if (this.isForDevelopment()) {\n return;\n }\n\n await this.updateBootstrapConfig(editor);\n }\n\n protected addNpmDependencies(): void {\n if (isLinkedLocalApp()) {\n addNpmDependency(\n this.getNpmPackageName(),\n `file:${packagePath(this.getLocalPackageName())}`,\n this.isForDevelopment(),\n );\n\n return;\n }\n\n if (isLocalApp()) {\n const packPath = packagePackPath(this.getLocalPackageName()) ?? packNotFound(this.getLocalPackageName());\n\n addNpmDependency(this.getNpmPackageName(), `file:${packPath}`, this.isForDevelopment());\n\n return;\n }\n\n addNpmDependency(this.getNpmPackageName(), 'next', this.isForDevelopment());\n }\n\n protected async updateBootstrapConfig(editor: Editor): Promise<void> {\n await Log.animate('Injecting plugin in bootstrap configuration', async () => {\n const mainConfig = editor.requireSourceFile('src/main.ts');\n const pluginsArray = this.getBootstrapPluginsDeclaration(mainConfig);\n\n if (!pluginsArray) {\n return Log.fail(`\n Could not find plugins array in bootstrap config, please add the following manually:\n\n ${this.getBootstrapConfig()}\n `);\n }\n\n mainConfig.addImportDeclaration(this.getBootstrapImport());\n pluginsArray.addElement(this.getBootstrapConfig());\n\n await editor.save(mainConfig);\n });\n }\n\n protected getBootstrapPluginsDeclaration(mainConfig: SourceFile): ArrayLiteralExpression | null {\n const bootstrapAppCall = findDescendant(mainConfig, {\n guard: Node.isCallExpression,\n validate: (callExpression) => callExpression.getExpression().getText() === 'bootstrap',\n skip: SyntaxKind.ImportDeclaration,\n });\n const bootstrapOptions = bootstrapAppCall?.getArguments()[1];\n const pluginsOption = when(bootstrapOptions, Node.isObjectLiteralExpression)?.getProperty('plugins');\n const pluginsArray = when(pluginsOption, Node.isPropertyAssignment)?.getInitializer();\n\n if (!Node.isArrayLiteralExpression(pluginsArray)) {\n return null;\n }\n\n return pluginsArray;\n }\n\n protected getTailwindContentArray(tailwindConfig: SourceFile): ArrayLiteralExpression | null {\n const contentAssignment = findDescendant(tailwindConfig, {\n guard: Node.isPropertyAssignment,\n validate: (propertyAssignment) => propertyAssignment.getName() === 'content',\n skip: SyntaxKind.JSDoc,\n });\n const contentArray = contentAssignment?.getInitializer();\n\n if (!Node.isArrayLiteralExpression(contentArray)) {\n return null;\n }\n\n return contentArray;\n }\n\n protected getBootstrapImport(): OptionalKind<ImportDeclarationStructure> {\n return {\n defaultImport: stringToCamelCase(this.name),\n moduleSpecifier: `@aerogel/plugin-${this.name}`,\n };\n }\n\n protected getNpmPackageName(): string {\n return `@aerogel/${this.getLocalPackageName()}`;\n }\n\n protected getLocalPackageName(): string {\n return `plugin-${this.name}`;\n }\n\n protected isForDevelopment(): boolean {\n return false;\n }\n\n protected getBootstrapConfig(): string {\n return `${stringToCamelCase(this.name)}()`;\n }\n\n}\n","import Plugin from '@aerogel/cli/plugins/Plugin';\n\nexport default class LocalFirst extends Plugin {\n\n constructor() {\n super('local-first');\n }\n\n}\n","import File from '@aerogel/cli/lib/File';\nimport Log from '@aerogel/cli/lib/Log';\nimport Plugin from '@aerogel/cli/plugins/Plugin';\nimport { addNpmDependency } from '@aerogel/cli/utils/package';\nimport type { Editor } from '@aerogel/cli/lib/Editor';\n\nexport default class Solid extends Plugin {\n\n constructor() {\n super('solid');\n }\n\n protected override async updateFiles(editor: Editor): Promise<void> {\n await this.updateNpmScripts(editor);\n await this.updateGitIgnore();\n await super.updateFiles(editor);\n }\n\n protected override addNpmDependencies(): void {\n addNpmDependency('soukai-solid', 'next');\n addNpmDependency('@noeldemartin/solid-utils', 'next');\n addNpmDependency('@solid/community-server', '7.1.6', true);\n\n super.addNpmDependencies();\n }\n\n protected async updateNpmScripts(editor: Editor): Promise<void> {\n Log.info('Updating npm scripts...');\n\n const packageJson = File.read('package.json');\n\n if (!packageJson) {\n return Log.fail('Could not find package.json file');\n }\n\n File.write(\n 'package.json',\n packageJson\n .replace(\n '\"cy:dev\": \"concurrently --kill-others \\\\\"pnpm test:serve-app\\\\\" \\\\\"pnpm cy:open\\\\\"\",',\n '\"cy:dev\": \"concurrently --kill-others ' +\n '\\\\\"pnpm test:serve-app\\\\\" \\\\\"pnpm test:serve-pod\\\\\" \\\\\"pnpm cy:open\\\\\"\",',\n )\n .replace(\n '\"cy:test\": \"start-server-and-test test:serve-app http-get://localhost:5001 cy:run\",',\n '\"cy:test\": \"start-server-and-test ' +\n 'test:serve-app http-get://localhost:5001 test:serve-pod http-get://localhost:3000 cy:run\",',\n )\n .replace(\n '\"dev\": \"vite\",',\n '\"dev\": \"vite\",\\n' +\n '\"dev:serve-pod\": \"community-solid-server -c @css:config/file.json -f ./solid\",',\n )\n .replace(\n '\"test:serve-app\": \"vite --port 5001 --mode testing\"',\n '\"test:serve-app\": \"vite --port 5001 --mode testing\",\\n' +\n '\"test:serve-pod\": \"community-solid-server -l warn\"',\n ),\n );\n\n editor.addModifiedFile('package.json');\n }\n\n protected async updateGitIgnore(): Promise<void> {\n Log.info('Updating .gitignore');\n\n const gitignore = File.read('.gitignore') ?? '';\n\n File.write('.gitignore', `${gitignore}/solid\\n`);\n }\n\n}\n","import Plugin from '@aerogel/cli/plugins/Plugin';\nimport { addNpmDependency } from '@aerogel/cli/utils/package';\n\nexport default class Soukai extends Plugin {\n\n constructor() {\n super('soukai');\n }\n\n protected override addNpmDependencies(): void {\n addNpmDependency('soukai', 'next');\n\n super.addNpmDependencies();\n }\n\n protected override getBootstrapConfig(): string {\n return 'soukai({ models: import.meta.glob(\\'@/models/*\\', { eager: true }) })';\n }\n\n}\n","import Command from '@aerogel/cli/commands/Command';\nimport LocalFirst from '@aerogel/cli/plugins/LocalFirst';\nimport Log from '@aerogel/cli/lib/Log';\nimport Solid from '@aerogel/cli/plugins/Solid';\nimport Soukai from '@aerogel/cli/plugins/Soukai';\nimport type Plugin from '@aerogel/cli/plugins/Plugin';\nimport type { CommandOptions } from '@aerogel/cli/commands/Command';\n\nconst plugins = [new Soukai(), new Solid(), new LocalFirst()].reduce(\n (pluginsObject, plugin) => Object.assign(pluginsObject, { [plugin.name]: plugin }),\n {} as Record<string, Plugin>,\n);\nexport interface Options {\n skipInstall?: boolean;\n}\n\nexport class InstallCommand extends Command {\n\n protected static override command: string = 'install';\n protected static override description: string = 'Install an AerogelJS plugin';\n protected static override parameters: [string, string][] = [['plugin', 'Plugin to install']];\n protected static override options: CommandOptions = {\n skipInstall: {\n type: 'boolean',\n description: 'Skip installing dependencies, just add them to package.json',\n },\n };\n\n private options: Options;\n private plugin: Plugin;\n\n constructor(plugin: string, options: Options = {}) {\n super();\n\n this.options = options;\n this.plugin =\n plugins[plugin] ??\n Log.fail(`Plugin '${plugin}' doesn't exist. Available plugins: ${Object.keys(plugins).join(', ')}`);\n }\n\n protected override async run(): Promise<void> {\n await this.plugin.install({\n skipInstall: this.options.skipInstall,\n });\n }\n\n}\n","import { Command } from 'commander';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { facade, fail } from '@noeldemartin/utils';\nimport { URL, fileURLToPath } from 'node:url';\n\nimport { CreateCommand } from '@aerogel/cli/commands/create';\nimport { GenerateComponentCommand } from '@aerogel/cli/commands/generate-component';\nimport { GenerateModelCommand } from '@aerogel/cli/commands/generate-model';\nimport { GenerateServiceCommand } from '@aerogel/cli/commands/generate-service';\nimport { InfoCommand } from '@aerogel/cli/commands/info';\nimport { InstallCommand } from '@aerogel/cli/commands/install';\n\nexport class CLIService {\n\n public run(argv?: string[]): void {\n const program = new Command();\n\n program.name('gel').description('AerogelJS CLI').version(this.getVersion());\n\n CreateCommand.define(program);\n GenerateComponentCommand.define(program);\n GenerateModelCommand.define(program);\n GenerateServiceCommand.define(program);\n InfoCommand.define(program);\n InstallCommand.define(program);\n\n program.parse(argv);\n }\n\n public getVersion(): string {\n const errorMessage = 'Could not find CLI\\'s version, please report this bug.';\n const packageJsonPath = fileURLToPath(new URL(/* @vite-ignore */ '../package.json', import.meta.url));\n\n if (!existsSync(packageJsonPath)) {\n throw new Error(errorMessage);\n }\n\n const packageJson = JSON.parse(readFileSync(packageJsonPath).toString()) as { version?: string };\n\n return packageJson.version ?? fail(errorMessage);\n }\n\n}\n\nexport default facade(CLIService);\n"],"names":["FileService","path","contents","_a","existsSync","rmSync","unlinkSync","lstatSync","readFileSync","search","replacement","directoryPath","children","readdirSync","files","child","resolve","mkdirSync","dirname","writeFileSync","File","facade","LogService","__publicField","chalk","message","operation","updateStdout","end","done","progress","frame","interval","result","matches","stringMatchAll","match","formatMessage","line","lines","firstLetter","indentation","cursorTo","clearLine","Log","Template","destination","replacements","filenameReplacements","file","relativePath","fileContents","filePath","Mustache","prefix","key","value","toString","basePath","fileURLToPath","URL","packageJson","stringMatch","cliPath","packNotFound","packageName","packagePackPath","packagePath","templatePath","name","ShellService","cwd","command","reject","exec","error","Shell","Editor","Project","usingPrettier","usingESLint","formatFile","arrayFrom","App","options","simpleGit","dependencies","version","withFilePrefix","paths","pathsWithFile","Command","program","description","definition","type","args","instance","CreateCommand","stringToTitleCase","basename","app","isLocalApp","isLinkedLocalApp","findDescendant","node","guard","validate","skipKinds","descendant","traversal","descendantKind","when","assertion","GenerateComponentCommand","directoryName","componentName","filesList","stringToSlug","editor","viteConfig","componentDirsArray","SyntaxKind","literal","pluginCall","Node","callExpression","dirsAssignment","propertyAssignment","dirsArray","pluginOptions","lastSlashIndex","GenerateModelCommand","code","field","rules","stringToStudlyCase","fieldDefinition","formatCodeBlock","GenerateServiceCommand","servicesIndex","servicesObject","stringToCamelCase","mainConfig","bootstrapOptions","bootstrapAppCall","servicesDeclaration","variableDeclaration","InfoCommand","addNpmDependency","development","dependencyNames","arraySorted","index","previousDependency","Plugin","packPath","pluginsArray","pluginsOption","_b","tailwindConfig","contentAssignment","contentArray","LocalFirst","Solid","gitignore","Soukai","plugins","pluginsObject","plugin","InstallCommand","CLIService","argv","errorMessage","packageJsonPath","fail","cli"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aerogel/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2-next.faf07b8323db56fdfa807f3b9ffa8af276fdf288",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"exports": {
|
|
@@ -26,13 +26,19 @@
|
|
|
26
26
|
"verify": "noeldemartin-verify"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@noeldemartin/utils": "
|
|
29
|
+
"@noeldemartin/utils": "catalog:",
|
|
30
30
|
"chalk": "^5.4.1",
|
|
31
31
|
"commander": "^11.0.0",
|
|
32
32
|
"mustache": "^4.2.0",
|
|
33
33
|
"simple-git": "^3.27.0",
|
|
34
34
|
"ts-morph": "^20.0.0"
|
|
35
35
|
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@arethetypeswrong/cli": "catalog:",
|
|
38
|
+
"@noeldemartin/scripts": "catalog:",
|
|
39
|
+
"eslint": "catalog:",
|
|
40
|
+
"publint": "catalog:"
|
|
41
|
+
},
|
|
36
42
|
"eslintConfig": {
|
|
37
43
|
"extends": [
|
|
38
44
|
"@noeldemartin/eslint-config-typescript"
|
package/src/commands/create.ts
CHANGED
|
@@ -11,6 +11,7 @@ export interface Options {
|
|
|
11
11
|
name?: string;
|
|
12
12
|
local?: boolean;
|
|
13
13
|
copy?: boolean;
|
|
14
|
+
next?: boolean;
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
export class CreateCommand extends Command {
|
|
@@ -24,6 +25,10 @@ export class CreateCommand extends Command {
|
|
|
24
25
|
type: 'boolean',
|
|
25
26
|
description: 'Whether to create an app using local Aerogel packages (used for core development)',
|
|
26
27
|
},
|
|
28
|
+
next: {
|
|
29
|
+
type: 'boolean',
|
|
30
|
+
description: 'Whether to use the bleeding edge version for dependencies',
|
|
31
|
+
},
|
|
27
32
|
copy: {
|
|
28
33
|
type: 'boolean',
|
|
29
34
|
description: 'Whether to create an app linked to local Aerogel packages (used in CI)',
|
|
@@ -65,6 +70,7 @@ export class CreateCommand extends Command {
|
|
|
65
70
|
Log.info(`Creating **${name}**...`);
|
|
66
71
|
|
|
67
72
|
const app = new App(name, {
|
|
73
|
+
next: this.options.next,
|
|
68
74
|
local: this.options.local,
|
|
69
75
|
linkedLocal: this.options.local && !this.options.copy,
|
|
70
76
|
});
|
package/src/lib/App.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { Editor } from '@aerogel/cli/lib/Editor';
|
|
|
8
8
|
import { simpleGit } from 'simple-git';
|
|
9
9
|
|
|
10
10
|
export interface Options {
|
|
11
|
+
next?: boolean;
|
|
11
12
|
local?: boolean;
|
|
12
13
|
linkedLocal?: boolean;
|
|
13
14
|
}
|
|
@@ -61,29 +62,58 @@ export default class App {
|
|
|
61
62
|
{} as T,
|
|
62
63
|
);
|
|
63
64
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
65
|
+
const dependencies: Record<string, string> = {};
|
|
66
|
+
|
|
67
|
+
if (this.options.next) {
|
|
68
|
+
dependencies['@aerogel/cli'] = 'next';
|
|
69
|
+
dependencies['@aerogel/core'] = 'next';
|
|
70
|
+
dependencies['@aerogel/cypress'] = 'next';
|
|
71
|
+
dependencies['@aerogel/plugin-i18n'] = 'next';
|
|
72
|
+
dependencies['@aerogel/plugin-local-first'] = 'next';
|
|
73
|
+
dependencies['@aerogel/plugin-routing'] = 'next';
|
|
74
|
+
dependencies['@aerogel/plugin-solid'] = 'next';
|
|
75
|
+
dependencies['@aerogel/plugin-soukai'] = 'next';
|
|
76
|
+
dependencies['@aerogel/vite'] = 'next';
|
|
77
|
+
dependencies['@noeldemartin/solid-utils'] = 'next';
|
|
78
|
+
dependencies['@noeldemartin/utils'] = 'next';
|
|
79
|
+
dependencies['soukai-solid'] = 'next';
|
|
80
|
+
dependencies['soukai'] = 'next';
|
|
73
81
|
}
|
|
74
82
|
|
|
75
|
-
if (this.options.
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
83
|
+
if (this.options.linkedLocal) {
|
|
84
|
+
Object.assign(
|
|
85
|
+
dependencies,
|
|
86
|
+
withFilePrefix({
|
|
87
|
+
'@aerogel/cli': packagePath('cli'),
|
|
88
|
+
'@aerogel/core': packagePath('core'),
|
|
89
|
+
'@aerogel/cypress': packagePath('cypress'),
|
|
90
|
+
'@aerogel/plugin-i18n': packagePath('plugin-i18n'),
|
|
91
|
+
'@aerogel/plugin-routing': packagePath('plugin-routing'),
|
|
92
|
+
'@aerogel/plugin-soukai': packagePath('plugin-soukai'),
|
|
93
|
+
'@aerogel/plugin-solid': packagePath('plugin-solid'),
|
|
94
|
+
'@aerogel/plugin-local-first': packagePath('plugin-local-first'),
|
|
95
|
+
'@aerogel/vite': packagePath('vite'),
|
|
96
|
+
}),
|
|
97
|
+
);
|
|
98
|
+
} else if (this.options.local) {
|
|
99
|
+
Object.assign(
|
|
100
|
+
dependencies,
|
|
101
|
+
withFilePrefix({
|
|
102
|
+
'@aerogel/cli': packagePackPath('cli') ?? packNotFound('cli'),
|
|
103
|
+
'@aerogel/core': packagePackPath('core') ?? packNotFound('core'),
|
|
104
|
+
'@aerogel/cypress': packagePackPath('cypress') ?? packNotFound('cypress'),
|
|
105
|
+
'@aerogel/plugin-i18n': packagePackPath('plugin-i18n') ?? packNotFound('plugin-i18n'),
|
|
106
|
+
'@aerogel/plugin-routing': packagePackPath('plugin-routing') ?? packNotFound('plugin-routing'),
|
|
107
|
+
'@aerogel/plugin-soukai': packagePackPath('plugin-soukai') ?? packNotFound('plugin-soukai'),
|
|
108
|
+
'@aerogel/plugin-solid': packagePackPath('plugin-solid') ?? packNotFound('plugin-solid'),
|
|
109
|
+
'@aerogel/plugin-local-first':
|
|
110
|
+
packagePackPath('plugin-local-first') ?? packNotFound('plugin-local-first'),
|
|
111
|
+
'@aerogel/vite': packagePackPath('vite') ?? packNotFound('vite'),
|
|
112
|
+
}),
|
|
113
|
+
);
|
|
84
114
|
}
|
|
85
115
|
|
|
86
|
-
return
|
|
116
|
+
return dependencies;
|
|
87
117
|
}
|
|
88
118
|
|
|
89
119
|
}
|
package/src/lib/utils/paths.ts
CHANGED
|
@@ -13,7 +13,7 @@ export function basePath(path: string = ''): string {
|
|
|
13
13
|
if (
|
|
14
14
|
File.contains(
|
|
15
15
|
fileURLToPath(new URL(/* @vite-ignore */ '../../../package.json', import.meta.url)),
|
|
16
|
-
'"
|
|
16
|
+
'"name": "aerogel"',
|
|
17
17
|
)
|
|
18
18
|
) {
|
|
19
19
|
return resolve(fileURLToPath(new URL(/* @vite-ignore */ '../', import.meta.url)), path);
|
package/src/plugins/Solid.ts
CHANGED
|
@@ -37,9 +37,9 @@ export default class Solid extends Plugin {
|
|
|
37
37
|
'package.json',
|
|
38
38
|
packageJson
|
|
39
39
|
.replace(
|
|
40
|
-
'"cy:dev": "concurrently --kill-others \\"
|
|
40
|
+
'"cy:dev": "concurrently --kill-others \\"pnpm test:serve-app\\" \\"pnpm cy:open\\"",',
|
|
41
41
|
'"cy:dev": "concurrently --kill-others ' +
|
|
42
|
-
'\\"
|
|
42
|
+
'\\"pnpm test:serve-app\\" \\"pnpm test:serve-pod\\" \\"pnpm cy:open\\"",',
|
|
43
43
|
)
|
|
44
44
|
.replace(
|
|
45
45
|
'"cy:test": "start-server-and-test test:serve-app http-get://localhost:5001 cy:run",',
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'vitest';
|
|
2
|
-
|
|
3
|
-
import FileMock from '@aerogel/cli/lib/File.mock';
|
|
4
|
-
|
|
5
|
-
import { GenerateServiceCommand } from './generate-service';
|
|
6
|
-
|
|
7
|
-
describe('Generate Service command', () => {
|
|
8
|
-
|
|
9
|
-
it('generates services', async () => {
|
|
10
|
-
// Arrange
|
|
11
|
-
FileMock.stub('package.json', '@aerogel/core');
|
|
12
|
-
|
|
13
|
-
// Act
|
|
14
|
-
await GenerateServiceCommand.run('FooBar');
|
|
15
|
-
|
|
16
|
-
// Assert
|
|
17
|
-
FileMock.expectCreated('src/services/FooBar.ts').toContain('class FooBarService extends Service');
|
|
18
|
-
FileMock.expectCreated('src/services/FooBar.ts').toContain('export default facade(FooBarService);');
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
});
|