quik-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -0
- package/bin/quik.dev.ts +8 -0
- package/bin/quik.js +9 -0
- package/dist/commands/VersionCommand.d.ts +12 -0
- package/dist/commands/VersionCommand.d.ts.map +1 -0
- package/dist/commands/VersionCommand.js +13 -0
- package/dist/commands/VersionCommand.js.map +1 -0
- package/dist/commands/init/InitCommand.d.ts +21 -0
- package/dist/commands/init/InitCommand.d.ts.map +1 -0
- package/dist/commands/init/InitCommand.js +22 -0
- package/dist/commands/init/InitCommand.js.map +1 -0
- package/dist/commands/init/impl/astro.scaffold.d.ts +9 -0
- package/dist/commands/init/impl/astro.scaffold.d.ts.map +1 -0
- package/dist/commands/init/impl/astro.scaffold.js +23 -0
- package/dist/commands/init/impl/astro.scaffold.js.map +1 -0
- package/dist/commands/init/impl/init.impl.d.ts +3 -0
- package/dist/commands/init/impl/init.impl.d.ts.map +1 -0
- package/dist/commands/init/impl/init.impl.js +201 -0
- package/dist/commands/init/impl/init.impl.js.map +1 -0
- package/dist/commands/init/impl/nextjs.scaffold.d.ts +9 -0
- package/dist/commands/init/impl/nextjs.scaffold.d.ts.map +1 -0
- package/dist/commands/init/impl/nextjs.scaffold.js +29 -0
- package/dist/commands/init/impl/nextjs.scaffold.js.map +1 -0
- package/dist/commands/init/templates/astro/.env.template +23 -0
- package/dist/commands/init/templates/astro/api-proxy.template +8 -0
- package/dist/commands/init/templates/astro/env.template +23 -0
- package/dist/commands/init/templates/astro/page.template +14 -0
- package/dist/commands/init/templates/nextjs/api-proxy.template +25 -0
- package/dist/commands/init/templates/nextjs/config.template +15 -0
- package/dist/commands/init/templates/nextjs/env.template +23 -0
- package/dist/commands/init/templates/nextjs/layout.template +67 -0
- package/dist/commands/init/templates/nextjs/page.template +12 -0
- package/dist/commands/run/RunCommand.d.ts +13 -0
- package/dist/commands/run/RunCommand.d.ts.map +1 -0
- package/dist/commands/run/RunCommand.js +15 -0
- package/dist/commands/run/RunCommand.js.map +1 -0
- package/dist/commands/run/impl/run.impl.d.ts +3 -0
- package/dist/commands/run/impl/run.impl.d.ts.map +1 -0
- package/dist/commands/run/impl/run.impl.js +73 -0
- package/dist/commands/run/impl/run.impl.js.map +1 -0
- package/dist/core/Banner.d.ts +2 -0
- package/dist/core/Banner.d.ts.map +1 -0
- package/dist/core/Banner.js +11 -0
- package/dist/core/Banner.js.map +1 -0
- package/dist/core/BaseCommand.d.ts +6 -0
- package/dist/core/BaseCommand.d.ts.map +1 -0
- package/dist/core/BaseCommand.js +3 -0
- package/dist/core/BaseCommand.js.map +1 -0
- package/dist/core/CLI.d.ts +23 -0
- package/dist/core/CLI.d.ts.map +1 -0
- package/dist/core/CLI.js +119 -0
- package/dist/core/CLI.js.map +1 -0
- package/dist/core/CommandRegistry.d.ts +13 -0
- package/dist/core/CommandRegistry.d.ts.map +1 -0
- package/dist/core/CommandRegistry.js +42 -0
- package/dist/core/CommandRegistry.js.map +1 -0
- package/dist/core/ConfigLoader.d.ts +5 -0
- package/dist/core/ConfigLoader.d.ts.map +1 -0
- package/dist/core/ConfigLoader.js +14 -0
- package/dist/core/ConfigLoader.js.map +1 -0
- package/dist/core/EventBus.d.ts +9 -0
- package/dist/core/EventBus.d.ts.map +1 -0
- package/dist/core/EventBus.js +33 -0
- package/dist/core/EventBus.js.map +1 -0
- package/dist/core/Loader.d.ts +36 -0
- package/dist/core/Loader.d.ts.map +1 -0
- package/dist/core/Loader.js +127 -0
- package/dist/core/Loader.js.map +1 -0
- package/dist/core/Logger.d.ts +18 -0
- package/dist/core/Logger.d.ts.map +1 -0
- package/dist/core/Logger.js +67 -0
- package/dist/core/Logger.js.map +1 -0
- package/dist/core/PluginManager.d.ts +13 -0
- package/dist/core/PluginManager.d.ts.map +1 -0
- package/dist/core/PluginManager.js +47 -0
- package/dist/core/PluginManager.js.map +1 -0
- package/dist/core/QuikError.d.ts +52 -0
- package/dist/core/QuikError.d.ts.map +1 -0
- package/dist/core/QuikError.js +75 -0
- package/dist/core/QuikError.js.map +1 -0
- package/dist/core/TemplateRenderer.d.ts +27 -0
- package/dist/core/TemplateRenderer.d.ts.map +1 -0
- package/dist/core/TemplateRenderer.js +38 -0
- package/dist/core/TemplateRenderer.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +55 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/PackageInstaller.d.ts +17 -0
- package/dist/utils/PackageInstaller.d.ts.map +1 -0
- package/dist/utils/PackageInstaller.js +100 -0
- package/dist/utils/PackageInstaller.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { QuikEngine } from "@quikcr/quik-engine";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Optional catch-all route that delegates to the package's QuikEngine.
|
|
6
|
+
*
|
|
7
|
+
* The package handles the pathname internally through `usePathname()`, so
|
|
8
|
+
* the host does not need to forward any props here.
|
|
9
|
+
*/
|
|
10
|
+
export default function CatchAllPage() {
|
|
11
|
+
return <QuikEngine />;
|
|
12
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BaseCommand } from "../../core/BaseCommand.js";
|
|
2
|
+
import type { CommandContext } from "../../types/index.js";
|
|
3
|
+
export declare class RunCommand extends BaseCommand {
|
|
4
|
+
readonly meta: {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
args: string;
|
|
8
|
+
aliases: string[];
|
|
9
|
+
category: string;
|
|
10
|
+
};
|
|
11
|
+
execute(context: CommandContext): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=RunCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunCommand.d.ts","sourceRoot":"","sources":["../../../src/commands/run/RunCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,qBAAa,UAAW,SAAQ,WAAW;IACzC,QAAQ,CAAC,IAAI;;;;;;MAMX;IAEI,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAItD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BaseCommand } from "../../core/BaseCommand.js";
|
|
2
|
+
export class RunCommand extends BaseCommand {
|
|
3
|
+
meta = {
|
|
4
|
+
name: "run",
|
|
5
|
+
description: "Run the application in the specified environment",
|
|
6
|
+
args: "<dev|prod|build>",
|
|
7
|
+
aliases: ["r"],
|
|
8
|
+
category: "app",
|
|
9
|
+
};
|
|
10
|
+
async execute(context) {
|
|
11
|
+
const { executeRun } = await import("./impl/run.impl.js");
|
|
12
|
+
await executeRun(context);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=RunCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunCommand.js","sourceRoot":"","sources":["../../../src/commands/run/RunCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,MAAM,OAAO,UAAW,SAAQ,WAAW;IAChC,IAAI,GAAG;QACd,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,kDAAkD;QAC/D,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,CAAC,GAAG,CAAC;QACd,QAAQ,EAAE,KAAK;KAChB,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC1D,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.impl.d.ts","sourceRoot":"","sources":["../../../../src/commands/run/impl/run.impl.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AA6C9D,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCvE"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { QuikError, ErrorCode } from "../../../core/QuikError.js";
|
|
5
|
+
/** Detects the framework based on config files in cwd. */
|
|
6
|
+
function detectFramework(cwd) {
|
|
7
|
+
if (existsSync(join(cwd, "next.config.js")) ||
|
|
8
|
+
existsSync(join(cwd, "next.config.ts"))) {
|
|
9
|
+
return "nextjs";
|
|
10
|
+
}
|
|
11
|
+
if (existsSync(join(cwd, "astro.config.mjs")) ||
|
|
12
|
+
existsSync(join(cwd, ".config/astro/config.mjs"))) {
|
|
13
|
+
return "astro";
|
|
14
|
+
}
|
|
15
|
+
return "unknown";
|
|
16
|
+
}
|
|
17
|
+
const FRAMEWORK_COMMANDS = {
|
|
18
|
+
nextjs: {
|
|
19
|
+
dev: ["npx", "next", "dev"],
|
|
20
|
+
build: ["npx", "next", "build"],
|
|
21
|
+
prod: ["npx", "next", "start"],
|
|
22
|
+
},
|
|
23
|
+
astro: {
|
|
24
|
+
dev: ["npx", "astro", "dev"],
|
|
25
|
+
build: ["npx", "astro", "build"],
|
|
26
|
+
prod: ["npx", "astro", "preview"],
|
|
27
|
+
},
|
|
28
|
+
unknown: {
|
|
29
|
+
dev: [],
|
|
30
|
+
build: [],
|
|
31
|
+
prod: [],
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
export async function executeRun(context) {
|
|
35
|
+
const env = context.args[0];
|
|
36
|
+
if (!env) {
|
|
37
|
+
throw new QuikError(ErrorCode.SCA_001, "scaffold", "Usage: quik run <dev|prod|build>");
|
|
38
|
+
}
|
|
39
|
+
if (!["dev", "prod", "build"].includes(env)) {
|
|
40
|
+
throw new QuikError(ErrorCode.SCA_001, "scaffold", `Invalid environment: ${env}. Use dev, prod, or build.`);
|
|
41
|
+
}
|
|
42
|
+
const framework = detectFramework(context.cwd);
|
|
43
|
+
if (framework === "unknown") {
|
|
44
|
+
throw new QuikError(ErrorCode.SCA_001, "scaffold", "Unable to detect framework. Ensure you are in a quik project directory.");
|
|
45
|
+
}
|
|
46
|
+
const [cmd, ...args] = FRAMEWORK_COMMANDS[framework][env];
|
|
47
|
+
context.logger.info(`Running: ${cmd} ${args.join(" ")}`);
|
|
48
|
+
runProcess(cmd, args, context.cwd);
|
|
49
|
+
}
|
|
50
|
+
function runProcess(cmd, args, cwd) {
|
|
51
|
+
const child = spawn(cmd, args, {
|
|
52
|
+
cwd,
|
|
53
|
+
stdio: "inherit",
|
|
54
|
+
shell: process.platform === "win32",
|
|
55
|
+
windowsHide: false,
|
|
56
|
+
});
|
|
57
|
+
child.on("error", (err) => {
|
|
58
|
+
// Spawn failed — log and exit
|
|
59
|
+
console.error(`Failed to start ${cmd}: ${err.message}`);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
});
|
|
62
|
+
child.on("close", (code) => {
|
|
63
|
+
process.exit(code ?? 0);
|
|
64
|
+
});
|
|
65
|
+
// Forward Ctrl+C to the child process
|
|
66
|
+
process.on("SIGINT", () => {
|
|
67
|
+
child.kill("SIGINT");
|
|
68
|
+
});
|
|
69
|
+
process.on("SIGTERM", () => {
|
|
70
|
+
child.kill("SIGTERM");
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=run.impl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.impl.js","sourceRoot":"","sources":["../../../../src/commands/run/impl/run.impl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Banner.d.ts","sourceRoot":"","sources":["../../src/core/Banner.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAQjD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import pc from "picocolors";
|
|
2
|
+
export function printBanner(version) {
|
|
3
|
+
const banner = `
|
|
4
|
+
${pc.cyan("╔══════════════════════════════════════╗")}
|
|
5
|
+
${pc.cyan("║")} ${pc.bold(pc.white("quik-cli"))} ${pc.dim(`v${version}`)} ${pc.cyan("║")}
|
|
6
|
+
${pc.cyan("║")} ${pc.dim("Fast, dynamic CLI framework")} ${pc.cyan("║")}
|
|
7
|
+
${pc.cyan("╚══════════════════════════════════════╝")}
|
|
8
|
+
`;
|
|
9
|
+
console.log(banner);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=Banner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Banner.js","sourceRoot":"","sources":["../../src/core/Banner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,MAAM,GAAG;EACf,EAAE,CAAC,IAAI,CAAC,0CAA0C,CAAC;EACnD,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,uBAAuB,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;EAC3G,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,6BAA6B,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;EAC9E,EAAE,CAAC,IAAI,CAAC,0CAA0C,CAAC;CACpD,CAAC;IACA,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseCommand.d.ts","sourceRoot":"","sources":["../../src/core/BaseCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAErE,8BAAsB,WAAW;IAC/B,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAEpC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;CAChE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseCommand.js","sourceRoot":"","sources":["../../src/core/BaseCommand.ts"],"names":[],"mappings":"AAEA,MAAM,OAAgB,WAAW;CAIhC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { CommandRegistry } from "./CommandRegistry.js";
|
|
2
|
+
export interface CLIOptions {
|
|
3
|
+
name?: string;
|
|
4
|
+
version?: string;
|
|
5
|
+
cwd?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class CLI {
|
|
8
|
+
private readonly program;
|
|
9
|
+
private readonly logger;
|
|
10
|
+
private readonly events;
|
|
11
|
+
private readonly registry;
|
|
12
|
+
private readonly pluginManager;
|
|
13
|
+
private readonly configLoader;
|
|
14
|
+
private readonly cwd;
|
|
15
|
+
constructor(options?: CLIOptions & {
|
|
16
|
+
registry?: CommandRegistry;
|
|
17
|
+
});
|
|
18
|
+
run(argv: string[]): Promise<void>;
|
|
19
|
+
private applyGlobalLogLevel;
|
|
20
|
+
private wireCommands;
|
|
21
|
+
private registerMetaCommands;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=CLI.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CLI.d.ts","sourceRoot":"","sources":["../../src/core/CLI.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAMvD,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,GAAG;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAEjB,OAAO,GAAE,UAAU,GAAG;QAAE,QAAQ,CAAC,EAAE,eAAe,CAAA;KAAO;IAkB/D,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBxC,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,YAAY;IAkDpB,OAAO,CAAC,oBAAoB;CAwB7B"}
|
package/dist/core/CLI.js
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { Logger } from "./Logger.js";
|
|
4
|
+
import { EventBus } from "./EventBus.js";
|
|
5
|
+
import { ConfigLoader } from "./ConfigLoader.js";
|
|
6
|
+
import { CommandRegistry } from "./CommandRegistry.js";
|
|
7
|
+
import { PluginManager } from "./PluginManager.js";
|
|
8
|
+
import { printBanner } from "./Banner.js";
|
|
9
|
+
import { QuikError } from "./QuikError.js";
|
|
10
|
+
export class CLI {
|
|
11
|
+
program;
|
|
12
|
+
logger;
|
|
13
|
+
events = new EventBus();
|
|
14
|
+
registry;
|
|
15
|
+
pluginManager;
|
|
16
|
+
configLoader = new ConfigLoader();
|
|
17
|
+
cwd;
|
|
18
|
+
constructor(options = {}) {
|
|
19
|
+
this.cwd = options.cwd ?? process.cwd();
|
|
20
|
+
this.logger = new Logger("quik");
|
|
21
|
+
this.registry = options.registry ?? new CommandRegistry(this.logger);
|
|
22
|
+
this.pluginManager = new PluginManager(this.registry, this.events, this.logger);
|
|
23
|
+
this.program = new Command()
|
|
24
|
+
.name(options.name ?? "quik")
|
|
25
|
+
.version(options.version ?? "1.0.0")
|
|
26
|
+
.option("-v, --verbose", "enable verbose (debug) logging")
|
|
27
|
+
.option("--quiet", "suppress non-error output")
|
|
28
|
+
.option("--cwd <path>", "run as if started in <path>", this.cwd);
|
|
29
|
+
}
|
|
30
|
+
async run(argv) {
|
|
31
|
+
this.applyGlobalLogLevel(argv);
|
|
32
|
+
const config = await this.configLoader.load(this.cwd);
|
|
33
|
+
this.events.emit("config:loaded", config);
|
|
34
|
+
await this.registry.loadBuiltins();
|
|
35
|
+
await this.pluginManager.loadAll(config, this.cwd);
|
|
36
|
+
this.wireCommands(config);
|
|
37
|
+
this.registerMetaCommands();
|
|
38
|
+
if (argv.length <= 2) {
|
|
39
|
+
printBanner(this.program.version() ?? "1.0.0");
|
|
40
|
+
this.program.outputHelp();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
await this.program.parseAsync(argv);
|
|
44
|
+
}
|
|
45
|
+
applyGlobalLogLevel(argv) {
|
|
46
|
+
if (argv.includes("-v") || argv.includes("--verbose")) {
|
|
47
|
+
this.logger.setLevel("debug");
|
|
48
|
+
}
|
|
49
|
+
else if (argv.includes("--quiet")) {
|
|
50
|
+
this.logger.setLevel("error");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
wireCommands(config) {
|
|
54
|
+
for (const command of this.registry.list()) {
|
|
55
|
+
const { meta } = command;
|
|
56
|
+
const definition = this.program
|
|
57
|
+
.command(`${meta.name}${meta.args ? ` ${meta.args}` : ""}`)
|
|
58
|
+
.description(meta.description);
|
|
59
|
+
if (meta.aliases?.length) {
|
|
60
|
+
definition.aliases(meta.aliases);
|
|
61
|
+
}
|
|
62
|
+
for (const opt of meta.options ?? []) {
|
|
63
|
+
definition.option(opt.flag, opt.description, opt.defaultValue);
|
|
64
|
+
}
|
|
65
|
+
definition.action(async (...actionArgs) => {
|
|
66
|
+
const cmdObj = actionArgs.pop();
|
|
67
|
+
const options = actionArgs.pop();
|
|
68
|
+
const positional = actionArgs;
|
|
69
|
+
const context = {
|
|
70
|
+
args: positional,
|
|
71
|
+
options: { ...cmdObj.optsWithGlobals(), ...options },
|
|
72
|
+
config,
|
|
73
|
+
logger: this.logger.child(meta.name),
|
|
74
|
+
events: this.events,
|
|
75
|
+
cwd: this.cwd,
|
|
76
|
+
};
|
|
77
|
+
try {
|
|
78
|
+
await command.execute(context);
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
if (err instanceof QuikError) {
|
|
82
|
+
const debugMode = context.options.verbose === true || config.debug === true;
|
|
83
|
+
if (debugMode) {
|
|
84
|
+
this.logger.error(err.debugMessage());
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this.logger.error(err.userMessage());
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
this.logger.error(`Command "${meta.name}" failed:`, err);
|
|
92
|
+
}
|
|
93
|
+
throw err;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
registerMetaCommands() {
|
|
99
|
+
this.program
|
|
100
|
+
.command("commands")
|
|
101
|
+
.description("list every available command (built-in + plugin-provided)")
|
|
102
|
+
.action(() => {
|
|
103
|
+
this.logger.raw(chalk.bold("\nAvailable commands:\n"));
|
|
104
|
+
const grouped = new Map();
|
|
105
|
+
for (const { meta } of this.registry.list()) {
|
|
106
|
+
const category = meta.category ?? "general";
|
|
107
|
+
const lines = grouped.get(category) ?? [];
|
|
108
|
+
lines.push(` ${chalk.cyan(meta.name.padEnd(16))} ${meta.description}`);
|
|
109
|
+
grouped.set(category, lines);
|
|
110
|
+
}
|
|
111
|
+
for (const [category, lines] of grouped) {
|
|
112
|
+
this.logger.raw(chalk.dim(`${category}:`));
|
|
113
|
+
lines.forEach((line) => this.logger.raw(line));
|
|
114
|
+
this.logger.raw("");
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=CLI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CLI.js","sourceRoot":"","sources":["../../src/core/CLI.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BaseCommand } from "../types/index.js";
|
|
2
|
+
import type { Logger } from "./Logger.js";
|
|
3
|
+
export declare class CommandRegistry {
|
|
4
|
+
private commands;
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(logger: Logger);
|
|
7
|
+
register(command: BaseCommand): void;
|
|
8
|
+
list(): BaseCommand[];
|
|
9
|
+
get(name: string): BaseCommand | undefined;
|
|
10
|
+
loadBuiltins(): Promise<void>;
|
|
11
|
+
loadFromDir(dir: string): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=CommandRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandRegistry.d.ts","sourceRoot":"","sources":["../../src/core/CommandRegistry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,MAAM;IAI1B,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAKpC,IAAI,IAAI,WAAW,EAAE;IAIrB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIpC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAU7B,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAY9C"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { readdir } from "node:fs/promises";
|
|
2
|
+
import { VersionCommand } from "../commands/VersionCommand.js";
|
|
3
|
+
import { InitCommand } from "../commands/init/InitCommand.js";
|
|
4
|
+
import { RunCommand } from "../commands/run/RunCommand.js";
|
|
5
|
+
export class CommandRegistry {
|
|
6
|
+
commands = new Map();
|
|
7
|
+
logger;
|
|
8
|
+
constructor(logger) {
|
|
9
|
+
this.logger = logger;
|
|
10
|
+
}
|
|
11
|
+
register(command) {
|
|
12
|
+
this.commands.set(command.meta.name, command);
|
|
13
|
+
this.logger.debug(`Registered command: ${command.meta.name}`);
|
|
14
|
+
}
|
|
15
|
+
list() {
|
|
16
|
+
return Array.from(this.commands.values());
|
|
17
|
+
}
|
|
18
|
+
get(name) {
|
|
19
|
+
return this.commands.get(name);
|
|
20
|
+
}
|
|
21
|
+
async loadBuiltins() {
|
|
22
|
+
const builtins = [new VersionCommand(), new InitCommand(), new RunCommand()];
|
|
23
|
+
for (const command of builtins) {
|
|
24
|
+
this.register(command);
|
|
25
|
+
}
|
|
26
|
+
this.logger.debug(`Built-in commands loaded: ${builtins.length}`);
|
|
27
|
+
}
|
|
28
|
+
async loadFromDir(dir) {
|
|
29
|
+
try {
|
|
30
|
+
const files = await readdir(dir, { withFileTypes: true });
|
|
31
|
+
for (const file of files) {
|
|
32
|
+
if (file.isFile() && file.name.endsWith(".js")) {
|
|
33
|
+
this.logger.debug(`Loading command file: ${file.name}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Directory may not exist
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=CommandRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandRegistry.js","sourceRoot":"","sources":["../../src/core/CommandRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAI3D,MAAM,OAAO,eAAe;IAClB,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IACjC,MAAM,CAAS;IAEhC,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,QAAQ,CAAC,OAAoB;QAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,QAAQ,GAAkB,CAAC,IAAI,cAAc,EAAE,EAAE,IAAI,WAAW,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC,CAAC;QAE5F,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAW;QAC3B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC/C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigLoader.d.ts","sourceRoot":"","sources":["../../src/core/ConfigLoader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,qBAAa,YAAY;IACjB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;CAQ7C"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { cosmiconfig } from "cosmiconfig";
|
|
2
|
+
const explorer = cosmiconfig("quik");
|
|
3
|
+
export class ConfigLoader {
|
|
4
|
+
async load(cwd) {
|
|
5
|
+
try {
|
|
6
|
+
const result = await explorer.search(cwd);
|
|
7
|
+
return (result?.config ?? {});
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return {};
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=ConfigLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigLoader.js","sourceRoot":"","sources":["../../src/core/ConfigLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;AAErC,MAAM,OAAO,YAAY;IACvB,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1C,OAAO,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAe,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { EventHandler } from "../types/index.js";
|
|
2
|
+
export declare class EventBus {
|
|
3
|
+
private handlers;
|
|
4
|
+
on(event: string, handler: EventHandler): void;
|
|
5
|
+
off(event: string, handler: EventHandler): void;
|
|
6
|
+
emit(event: string, ...args: unknown[]): Promise<void>;
|
|
7
|
+
once(event: string, handler: EventHandler): void;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=EventBus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventBus.d.ts","sourceRoot":"","sources":["../../src/core/EventBus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAwC;IAExD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAO9C,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAIzC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;CAOjD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export class EventBus {
|
|
2
|
+
handlers = new Map();
|
|
3
|
+
on(event, handler) {
|
|
4
|
+
if (!this.handlers.has(event)) {
|
|
5
|
+
this.handlers.set(event, new Set());
|
|
6
|
+
}
|
|
7
|
+
this.handlers.get(event).add(handler);
|
|
8
|
+
}
|
|
9
|
+
off(event, handler) {
|
|
10
|
+
this.handlers.get(event)?.delete(handler);
|
|
11
|
+
}
|
|
12
|
+
async emit(event, ...args) {
|
|
13
|
+
const handlers = this.handlers.get(event);
|
|
14
|
+
if (!handlers)
|
|
15
|
+
return;
|
|
16
|
+
for (const handler of handlers) {
|
|
17
|
+
try {
|
|
18
|
+
await handler(...args);
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
console.error(`Event handler error for "${event}":`, err);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
once(event, handler) {
|
|
26
|
+
const onceHandler = async (...args) => {
|
|
27
|
+
await handler(...args);
|
|
28
|
+
this.off(event, onceHandler);
|
|
29
|
+
};
|
|
30
|
+
this.on(event, onceHandler);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=EventBus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventBus.js","sourceRoot":"","sources":["../../src/core/EventBus.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,QAAQ;IACX,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;IAExD,EAAE,CAAC,KAAa,EAAE,OAAqB;QACrC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,OAAqB;QACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,GAAG,IAAe;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;YACzB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,4BAA4B,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAa,EAAE,OAAqB;QACvC,MAAM,WAAW,GAAiB,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE;YAClD,MAAM,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC/B,CAAC,CAAC;QACF,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** Animation types for different operations */
|
|
2
|
+
export type AnimationType = "default" | "installing" | "webrequest" | "creating" | "updating" | "deleting";
|
|
3
|
+
/**
|
|
4
|
+
* Dynamic loader that prints completed steps as it goes and animates
|
|
5
|
+
* the current step with a type-appropriate spinner.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* loader.start("Creating project files", "creating");
|
|
9
|
+
* await loader.stepFor("Setting up env", "webrequest");
|
|
10
|
+
* await loader.stepFor("Installing packages", "installing");
|
|
11
|
+
* loader.done("All set");
|
|
12
|
+
*/
|
|
13
|
+
export declare class Loader {
|
|
14
|
+
private intervalId;
|
|
15
|
+
private config;
|
|
16
|
+
private index;
|
|
17
|
+
private currentMessage;
|
|
18
|
+
start(message?: string, type?: AnimationType): void;
|
|
19
|
+
/**
|
|
20
|
+
* Finish the current step (printing a checkmark line immediately),
|
|
21
|
+
* then start animating the next one. If a promise/task is provided,
|
|
22
|
+
* the spinner runs until it resolves, with minMs as a floor so quick
|
|
23
|
+
* steps don't flash by unreadably.
|
|
24
|
+
*/
|
|
25
|
+
stepFor(message: string, type?: AnimationType, minMs?: number, task?: () => Promise<void>): Promise<void>;
|
|
26
|
+
private render;
|
|
27
|
+
/** Clears the in-progress line and prints it as a completed step. */
|
|
28
|
+
private commitCurrentLine;
|
|
29
|
+
/** Stop spinner, commit the final step, and print a closing message. */
|
|
30
|
+
done(message?: string): void;
|
|
31
|
+
fail(message?: string): void;
|
|
32
|
+
stop(): void;
|
|
33
|
+
}
|
|
34
|
+
/** Global shared loader instance */
|
|
35
|
+
export declare const loader: Loader;
|
|
36
|
+
//# sourceMappingURL=Loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Loader.d.ts","sourceRoot":"","sources":["../../src/core/Loader.ts"],"names":[],"mappings":"AAOA,+CAA+C;AAC/C,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,YAAY,GACZ,YAAY,GACZ,UAAU,GACV,UAAU,GACV,UAAU,CAAC;AA8Cf;;;;;;;;;GASG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,cAAc,CAAM;IAE5B,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE,aAAyB,GAAG,IAAI;IAY9D;;;;;OAKG;IACG,OAAO,CACX,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,aAAyB,EAC/B,KAAK,SAAM,EACX,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACzB,OAAO,CAAC,IAAI,CAAC;IAmBhB,OAAO,CAAC,MAAM;IAMd,qEAAqE;IACrE,OAAO,CAAC,iBAAiB;IAMzB,wEAAwE;IACxE,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAS5B,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAO5B,IAAI,IAAI,IAAI;CAKb;AAED,oCAAoC;AACpC,eAAO,MAAM,MAAM,QAAe,CAAC"}
|