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.
Files changed (97) hide show
  1. package/README.md +0 -0
  2. package/bin/quik.dev.ts +8 -0
  3. package/bin/quik.js +9 -0
  4. package/dist/commands/VersionCommand.d.ts +12 -0
  5. package/dist/commands/VersionCommand.d.ts.map +1 -0
  6. package/dist/commands/VersionCommand.js +13 -0
  7. package/dist/commands/VersionCommand.js.map +1 -0
  8. package/dist/commands/init/InitCommand.d.ts +21 -0
  9. package/dist/commands/init/InitCommand.d.ts.map +1 -0
  10. package/dist/commands/init/InitCommand.js +22 -0
  11. package/dist/commands/init/InitCommand.js.map +1 -0
  12. package/dist/commands/init/impl/astro.scaffold.d.ts +9 -0
  13. package/dist/commands/init/impl/astro.scaffold.d.ts.map +1 -0
  14. package/dist/commands/init/impl/astro.scaffold.js +23 -0
  15. package/dist/commands/init/impl/astro.scaffold.js.map +1 -0
  16. package/dist/commands/init/impl/init.impl.d.ts +3 -0
  17. package/dist/commands/init/impl/init.impl.d.ts.map +1 -0
  18. package/dist/commands/init/impl/init.impl.js +201 -0
  19. package/dist/commands/init/impl/init.impl.js.map +1 -0
  20. package/dist/commands/init/impl/nextjs.scaffold.d.ts +9 -0
  21. package/dist/commands/init/impl/nextjs.scaffold.d.ts.map +1 -0
  22. package/dist/commands/init/impl/nextjs.scaffold.js +29 -0
  23. package/dist/commands/init/impl/nextjs.scaffold.js.map +1 -0
  24. package/dist/commands/init/templates/astro/.env.template +23 -0
  25. package/dist/commands/init/templates/astro/api-proxy.template +8 -0
  26. package/dist/commands/init/templates/astro/env.template +23 -0
  27. package/dist/commands/init/templates/astro/page.template +14 -0
  28. package/dist/commands/init/templates/nextjs/api-proxy.template +25 -0
  29. package/dist/commands/init/templates/nextjs/config.template +15 -0
  30. package/dist/commands/init/templates/nextjs/env.template +23 -0
  31. package/dist/commands/init/templates/nextjs/layout.template +67 -0
  32. package/dist/commands/init/templates/nextjs/page.template +12 -0
  33. package/dist/commands/run/RunCommand.d.ts +13 -0
  34. package/dist/commands/run/RunCommand.d.ts.map +1 -0
  35. package/dist/commands/run/RunCommand.js +15 -0
  36. package/dist/commands/run/RunCommand.js.map +1 -0
  37. package/dist/commands/run/impl/run.impl.d.ts +3 -0
  38. package/dist/commands/run/impl/run.impl.d.ts.map +1 -0
  39. package/dist/commands/run/impl/run.impl.js +73 -0
  40. package/dist/commands/run/impl/run.impl.js.map +1 -0
  41. package/dist/core/Banner.d.ts +2 -0
  42. package/dist/core/Banner.d.ts.map +1 -0
  43. package/dist/core/Banner.js +11 -0
  44. package/dist/core/Banner.js.map +1 -0
  45. package/dist/core/BaseCommand.d.ts +6 -0
  46. package/dist/core/BaseCommand.d.ts.map +1 -0
  47. package/dist/core/BaseCommand.js +3 -0
  48. package/dist/core/BaseCommand.js.map +1 -0
  49. package/dist/core/CLI.d.ts +23 -0
  50. package/dist/core/CLI.d.ts.map +1 -0
  51. package/dist/core/CLI.js +119 -0
  52. package/dist/core/CLI.js.map +1 -0
  53. package/dist/core/CommandRegistry.d.ts +13 -0
  54. package/dist/core/CommandRegistry.d.ts.map +1 -0
  55. package/dist/core/CommandRegistry.js +42 -0
  56. package/dist/core/CommandRegistry.js.map +1 -0
  57. package/dist/core/ConfigLoader.d.ts +5 -0
  58. package/dist/core/ConfigLoader.d.ts.map +1 -0
  59. package/dist/core/ConfigLoader.js +14 -0
  60. package/dist/core/ConfigLoader.js.map +1 -0
  61. package/dist/core/EventBus.d.ts +9 -0
  62. package/dist/core/EventBus.d.ts.map +1 -0
  63. package/dist/core/EventBus.js +33 -0
  64. package/dist/core/EventBus.js.map +1 -0
  65. package/dist/core/Loader.d.ts +36 -0
  66. package/dist/core/Loader.d.ts.map +1 -0
  67. package/dist/core/Loader.js +127 -0
  68. package/dist/core/Loader.js.map +1 -0
  69. package/dist/core/Logger.d.ts +18 -0
  70. package/dist/core/Logger.d.ts.map +1 -0
  71. package/dist/core/Logger.js +67 -0
  72. package/dist/core/Logger.js.map +1 -0
  73. package/dist/core/PluginManager.d.ts +13 -0
  74. package/dist/core/PluginManager.d.ts.map +1 -0
  75. package/dist/core/PluginManager.js +47 -0
  76. package/dist/core/PluginManager.js.map +1 -0
  77. package/dist/core/QuikError.d.ts +52 -0
  78. package/dist/core/QuikError.d.ts.map +1 -0
  79. package/dist/core/QuikError.js +75 -0
  80. package/dist/core/QuikError.js.map +1 -0
  81. package/dist/core/TemplateRenderer.d.ts +27 -0
  82. package/dist/core/TemplateRenderer.d.ts.map +1 -0
  83. package/dist/core/TemplateRenderer.js +38 -0
  84. package/dist/core/TemplateRenderer.js.map +1 -0
  85. package/dist/index.d.ts +12 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +13 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/types/index.d.ts +55 -0
  90. package/dist/types/index.d.ts.map +1 -0
  91. package/dist/types/index.js +7 -0
  92. package/dist/types/index.js.map +1 -0
  93. package/dist/utils/PackageInstaller.d.ts +17 -0
  94. package/dist/utils/PackageInstaller.d.ts.map +1 -0
  95. package/dist/utils/PackageInstaller.js +100 -0
  96. package/dist/utils/PackageInstaller.js.map +1 -0
  97. 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,3 @@
1
+ import type { CommandContext } from "../../../types/index.js";
2
+ export declare function executeRun(context: CommandContext): Promise<void>;
3
+ //# sourceMappingURL=run.impl.d.ts.map
@@ -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,2 @@
1
+ export declare function printBanner(version: string): void;
2
+ //# sourceMappingURL=Banner.d.ts.map
@@ -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,6 @@
1
+ import type { CommandMeta, CommandContext } from "../types/index.js";
2
+ export declare abstract class BaseCommand {
3
+ abstract readonly meta: CommandMeta;
4
+ abstract execute(context: CommandContext): Promise<void> | void;
5
+ }
6
+ //# sourceMappingURL=BaseCommand.d.ts.map
@@ -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,3 @@
1
+ export class BaseCommand {
2
+ }
3
+ //# sourceMappingURL=BaseCommand.js.map
@@ -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"}
@@ -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,5 @@
1
+ import type { QuikConfig } from "../types/index.js";
2
+ export declare class ConfigLoader {
3
+ load(cwd: string): Promise<QuikConfig>;
4
+ }
5
+ //# sourceMappingURL=ConfigLoader.d.ts.map
@@ -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"}