@geekmidas/cli 0.23.0 → 0.24.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/dist/config-BogU0_oQ.mjs +189 -0
- package/dist/config-BogU0_oQ.mjs.map +1 -0
- package/dist/{config-CxrLu8ia.cjs → config-CTftATBX.cjs} +95 -9
- package/dist/config-CTftATBX.cjs.map +1 -0
- package/dist/config.cjs +3 -1
- package/dist/config.d.cts +36 -2
- package/dist/config.d.cts.map +1 -1
- package/dist/config.d.mts +36 -2
- package/dist/config.d.mts.map +1 -1
- package/dist/config.mjs +2 -2
- package/dist/index.cjs +71 -31
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +71 -31
- package/dist/index.mjs.map +1 -1
- package/dist/{openapi-DfpxS0xv.cjs → openapi-BrhkPKM7.cjs} +2 -2
- package/dist/{openapi-DfpxS0xv.cjs.map → openapi-BrhkPKM7.cjs.map} +1 -1
- package/dist/{openapi-CgqR6Jkw.mjs → openapi-DNbXfhXE.mjs} +2 -2
- package/dist/{openapi-CgqR6Jkw.mjs.map → openapi-DNbXfhXE.mjs.map} +1 -1
- package/dist/openapi.cjs +2 -2
- package/dist/openapi.mjs +2 -2
- package/package.json +4 -4
- package/src/__tests__/config.spec.ts +314 -2
- package/src/config.ts +151 -15
- package/src/dev/index.ts +78 -26
- package/src/init/generators/docker.ts +1 -1
- package/src/init/versions.ts +13 -2
- package/dist/config-BaYqrF3n.mjs +0 -115
- package/dist/config-BaYqrF3n.mjs.map +0 -1
- package/dist/config-CxrLu8ia.cjs.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env -S npx tsx
|
|
2
2
|
const require_chunk = require('./chunk-CUT6urMc.cjs');
|
|
3
3
|
const require_workspace = require('./workspace-iWgBlX6h.cjs');
|
|
4
|
-
const require_config = require('./config-
|
|
5
|
-
const require_openapi = require('./openapi-
|
|
4
|
+
const require_config = require('./config-CTftATBX.cjs');
|
|
5
|
+
const require_openapi = require('./openapi-BrhkPKM7.cjs');
|
|
6
6
|
const require_storage = require('./storage-BPRgh3DU.cjs');
|
|
7
7
|
const require_dokploy_api = require('./dokploy-api-C5czOZoc.cjs');
|
|
8
8
|
const require_openapi_react_query = require('./openapi-react-query-DvNpdDpM.cjs');
|
|
@@ -27,7 +27,7 @@ const node_module = require_chunk.__toESM(require("node:module"));
|
|
|
27
27
|
|
|
28
28
|
//#region package.json
|
|
29
29
|
var name = "@geekmidas/cli";
|
|
30
|
-
var version = "0.
|
|
30
|
+
var version = "0.24.0";
|
|
31
31
|
var description = "CLI tools for building Lambda handlers, server applications, and generating OpenAPI specs";
|
|
32
32
|
var private$1 = false;
|
|
33
33
|
var type = "module";
|
|
@@ -977,10 +977,10 @@ function normalizeStudioConfig(config) {
|
|
|
977
977
|
* Normalize hooks configuration
|
|
978
978
|
* @internal Exported for testing
|
|
979
979
|
*/
|
|
980
|
-
function normalizeHooksConfig(config) {
|
|
980
|
+
function normalizeHooksConfig(config, cwd = process.cwd()) {
|
|
981
981
|
if (!config?.server) return void 0;
|
|
982
982
|
const serverPath = config.server.endsWith(".ts") ? config.server : `${config.server}.ts`;
|
|
983
|
-
const resolvedPath = (0, node_path.resolve)(
|
|
983
|
+
const resolvedPath = (0, node_path.resolve)(cwd, serverPath);
|
|
984
984
|
return { serverHooksPath: resolvedPath };
|
|
985
985
|
}
|
|
986
986
|
/**
|
|
@@ -1014,14 +1014,32 @@ function getProductionConfigFromGkm(config) {
|
|
|
1014
1014
|
async function devCommand(options) {
|
|
1015
1015
|
const defaultEnv = loadEnvFiles(".env");
|
|
1016
1016
|
if (defaultEnv.loaded.length > 0) logger$8.log(`📦 Loaded env: ${defaultEnv.loaded.join(", ")}`);
|
|
1017
|
-
const
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1017
|
+
const appName = require_config.getAppNameFromCwd();
|
|
1018
|
+
let config;
|
|
1019
|
+
let appRoot = process.cwd();
|
|
1020
|
+
if (appName) try {
|
|
1021
|
+
const appConfig = await require_config.loadAppConfig();
|
|
1022
|
+
config = appConfig.gkmConfig;
|
|
1023
|
+
appRoot = appConfig.appRoot;
|
|
1024
|
+
logger$8.log(`📦 Running app: ${appConfig.appName}`);
|
|
1025
|
+
} catch {
|
|
1026
|
+
const loadedConfig = await require_config.loadWorkspaceConfig();
|
|
1027
|
+
if (loadedConfig.type === "workspace") {
|
|
1028
|
+
logger$8.log("📦 Detected workspace configuration");
|
|
1029
|
+
return workspaceDevCommand(loadedConfig.workspace, options);
|
|
1030
|
+
}
|
|
1031
|
+
config = loadedConfig.raw;
|
|
1032
|
+
}
|
|
1033
|
+
else {
|
|
1034
|
+
const loadedConfig = await require_config.loadWorkspaceConfig();
|
|
1035
|
+
if (loadedConfig.type === "workspace") {
|
|
1036
|
+
logger$8.log("📦 Detected workspace configuration");
|
|
1037
|
+
return workspaceDevCommand(loadedConfig.workspace, options);
|
|
1038
|
+
}
|
|
1039
|
+
config = loadedConfig.raw;
|
|
1021
1040
|
}
|
|
1022
|
-
const config = loadedConfig.raw;
|
|
1023
1041
|
if (config.env) {
|
|
1024
|
-
const { loaded, missing } = loadEnvFiles(config.env);
|
|
1042
|
+
const { loaded, missing } = loadEnvFiles(config.env, appRoot);
|
|
1025
1043
|
if (loaded.length > 0) logger$8.log(`📦 Loaded env: ${loaded.join(", ")}`);
|
|
1026
1044
|
if (missing.length > 0) logger$8.warn(`⚠️ Missing env files: ${missing.join(", ")}`);
|
|
1027
1045
|
}
|
|
@@ -1038,7 +1056,7 @@ async function devCommand(options) {
|
|
|
1038
1056
|
if (telescope) logger$8.log(`🔭 Telescope enabled at ${telescope.path}`);
|
|
1039
1057
|
const studio = normalizeStudioConfig(config.studio);
|
|
1040
1058
|
if (studio) logger$8.log(`🗄️ Studio enabled at ${studio.path}`);
|
|
1041
|
-
const hooks = normalizeHooksConfig(config.hooks);
|
|
1059
|
+
const hooks = normalizeHooksConfig(config.hooks, appRoot);
|
|
1042
1060
|
if (hooks) logger$8.log(`🪝 Server hooks enabled from ${config.hooks?.server}`);
|
|
1043
1061
|
const openApiConfig = require_openapi.resolveOpenApiConfig(config);
|
|
1044
1062
|
const enableOpenApi = openApiConfig.enabled || resolved.enableOpenApi;
|
|
@@ -1052,10 +1070,10 @@ async function devCommand(options) {
|
|
|
1052
1070
|
studio,
|
|
1053
1071
|
hooks
|
|
1054
1072
|
};
|
|
1055
|
-
await buildServer(config, buildContext, resolved.providers[0], enableOpenApi);
|
|
1073
|
+
await buildServer(config, buildContext, resolved.providers[0], enableOpenApi, appRoot);
|
|
1056
1074
|
if (enableOpenApi) await require_openapi.generateOpenApi(config);
|
|
1057
1075
|
const runtime = config.runtime ?? "node";
|
|
1058
|
-
const devServer = new DevServer(resolved.providers[0], options.port || 3e3, options.portExplicit ?? false, enableOpenApi, telescope, studio, runtime);
|
|
1076
|
+
const devServer = new DevServer(resolved.providers[0], options.port || 3e3, options.portExplicit ?? false, enableOpenApi, telescope, studio, runtime, appRoot);
|
|
1059
1077
|
await devServer.start();
|
|
1060
1078
|
const envParserFile = config.envParser.split("#")[0] ?? config.envParser;
|
|
1061
1079
|
const loggerFile = config.logger.split("#")[0] ?? config.logger;
|
|
@@ -1073,7 +1091,7 @@ async function devCommand(options) {
|
|
|
1073
1091
|
const normalizedPatterns = watchPatterns.map((p) => p.startsWith("./") ? p.slice(2) : p);
|
|
1074
1092
|
logger$8.log(`👀 Watching for changes in: ${normalizedPatterns.join(", ")}`);
|
|
1075
1093
|
const resolvedFiles = await (0, fast_glob.default)(normalizedPatterns, {
|
|
1076
|
-
cwd:
|
|
1094
|
+
cwd: appRoot,
|
|
1077
1095
|
absolute: false,
|
|
1078
1096
|
onlyFiles: true
|
|
1079
1097
|
});
|
|
@@ -1086,7 +1104,7 @@ async function devCommand(options) {
|
|
|
1086
1104
|
ignored: /(^|[/\\])\../,
|
|
1087
1105
|
persistent: true,
|
|
1088
1106
|
ignoreInitial: true,
|
|
1089
|
-
cwd:
|
|
1107
|
+
cwd: appRoot
|
|
1090
1108
|
});
|
|
1091
1109
|
watcher.on("ready", () => {
|
|
1092
1110
|
logger$8.log("🔍 File watcher ready");
|
|
@@ -1101,7 +1119,7 @@ async function devCommand(options) {
|
|
|
1101
1119
|
rebuildTimeout = setTimeout(async () => {
|
|
1102
1120
|
try {
|
|
1103
1121
|
logger$8.log("🔄 Rebuilding...");
|
|
1104
|
-
await buildServer(config, buildContext, resolved.providers[0], enableOpenApi);
|
|
1122
|
+
await buildServer(config, buildContext, resolved.providers[0], enableOpenApi, appRoot);
|
|
1105
1123
|
if (enableOpenApi) await require_openapi.generateOpenApi(config, { silent: true });
|
|
1106
1124
|
logger$8.log("✅ Rebuild complete, restarting server...");
|
|
1107
1125
|
await devServer.restart();
|
|
@@ -1323,11 +1341,25 @@ async function workspaceDevCommand(workspace, options) {
|
|
|
1323
1341
|
const deps = app.dependencies.length > 0 ? ` (depends on: ${app.dependencies.join(", ")})` : "";
|
|
1324
1342
|
logger$8.log(` ${app.type === "backend" ? "🔧" : "🌐"} ${appName} → http://localhost:${app.port}${deps}`);
|
|
1325
1343
|
}
|
|
1344
|
+
const configFiles = [
|
|
1345
|
+
"gkm.config.ts",
|
|
1346
|
+
"gkm.config.js",
|
|
1347
|
+
"gkm.config.json"
|
|
1348
|
+
];
|
|
1349
|
+
let configPath = "";
|
|
1350
|
+
for (const file of configFiles) {
|
|
1351
|
+
const fullPath = (0, node_path.join)(workspace.root, file);
|
|
1352
|
+
if ((0, node_fs.existsSync)(fullPath)) {
|
|
1353
|
+
configPath = fullPath;
|
|
1354
|
+
break;
|
|
1355
|
+
}
|
|
1356
|
+
}
|
|
1326
1357
|
const turboEnv = {
|
|
1327
1358
|
...process.env,
|
|
1328
1359
|
...secretsEnv,
|
|
1329
1360
|
...dependencyEnv,
|
|
1330
|
-
NODE_ENV: "development"
|
|
1361
|
+
NODE_ENV: "development",
|
|
1362
|
+
...configPath ? { GKM_CONFIG_PATH: configPath } : {}
|
|
1331
1363
|
};
|
|
1332
1364
|
logger$8.log("\n🏃 Starting turbo run dev...\n");
|
|
1333
1365
|
const turboProcess = (0, node_child_process.spawn)("pnpm", [
|
|
@@ -1430,18 +1462,18 @@ async function workspaceDevCommand(workspace, options) {
|
|
|
1430
1462
|
});
|
|
1431
1463
|
});
|
|
1432
1464
|
}
|
|
1433
|
-
async function buildServer(config, context, provider, enableOpenApi) {
|
|
1465
|
+
async function buildServer(config, context, provider, enableOpenApi, appRoot = process.cwd()) {
|
|
1434
1466
|
const endpointGenerator = new require_openapi.EndpointGenerator();
|
|
1435
1467
|
const functionGenerator = new FunctionGenerator();
|
|
1436
1468
|
const cronGenerator = new CronGenerator();
|
|
1437
1469
|
const subscriberGenerator = new SubscriberGenerator();
|
|
1438
1470
|
const [allEndpoints, allFunctions, allCrons, allSubscribers] = await Promise.all([
|
|
1439
|
-
endpointGenerator.load(config.routes),
|
|
1440
|
-
config.functions ? functionGenerator.load(config.functions) : [],
|
|
1441
|
-
config.crons ? cronGenerator.load(config.crons) : [],
|
|
1442
|
-
config.subscribers ? subscriberGenerator.load(config.subscribers) : []
|
|
1471
|
+
endpointGenerator.load(config.routes, appRoot),
|
|
1472
|
+
config.functions ? functionGenerator.load(config.functions, appRoot) : [],
|
|
1473
|
+
config.crons ? cronGenerator.load(config.crons, appRoot) : [],
|
|
1474
|
+
config.subscribers ? subscriberGenerator.load(config.subscribers, appRoot) : []
|
|
1443
1475
|
]);
|
|
1444
|
-
const outputDir = (0, node_path.join)(
|
|
1476
|
+
const outputDir = (0, node_path.join)(appRoot, ".gkm", provider);
|
|
1445
1477
|
await (0, node_fs_promises.mkdir)(outputDir, { recursive: true });
|
|
1446
1478
|
await Promise.all([
|
|
1447
1479
|
endpointGenerator.build(context, allEndpoints, outputDir, {
|
|
@@ -1457,7 +1489,7 @@ var DevServer = class {
|
|
|
1457
1489
|
serverProcess = null;
|
|
1458
1490
|
isRunning = false;
|
|
1459
1491
|
actualPort;
|
|
1460
|
-
constructor(provider, requestedPort, portExplicit, enableOpenApi, telescope, studio, runtime = "node") {
|
|
1492
|
+
constructor(provider, requestedPort, portExplicit, enableOpenApi, telescope, studio, runtime = "node", appRoot = process.cwd()) {
|
|
1461
1493
|
this.provider = provider;
|
|
1462
1494
|
this.requestedPort = requestedPort;
|
|
1463
1495
|
this.portExplicit = portExplicit;
|
|
@@ -1465,6 +1497,7 @@ var DevServer = class {
|
|
|
1465
1497
|
this.telescope = telescope;
|
|
1466
1498
|
this.studio = studio;
|
|
1467
1499
|
this.runtime = runtime;
|
|
1500
|
+
this.appRoot = appRoot;
|
|
1468
1501
|
this.actualPort = requestedPort;
|
|
1469
1502
|
}
|
|
1470
1503
|
async start() {
|
|
@@ -1477,7 +1510,7 @@ var DevServer = class {
|
|
|
1477
1510
|
this.actualPort = await findAvailablePort(this.requestedPort);
|
|
1478
1511
|
if (this.actualPort !== this.requestedPort) logger$8.log(`ℹ️ Port ${this.requestedPort} was in use, using port ${this.actualPort} instead`);
|
|
1479
1512
|
}
|
|
1480
|
-
const serverEntryPath = (0, node_path.join)(
|
|
1513
|
+
const serverEntryPath = (0, node_path.join)(this.appRoot, ".gkm", this.provider, "server.ts");
|
|
1481
1514
|
await this.createServerEntry();
|
|
1482
1515
|
logger$8.log(`\n✨ Starting server on port ${this.actualPort}...`);
|
|
1483
1516
|
this.serverProcess = (0, node_child_process.spawn)("npx", [
|
|
@@ -1545,7 +1578,7 @@ var DevServer = class {
|
|
|
1545
1578
|
async createServerEntry() {
|
|
1546
1579
|
const { writeFile: writeFile$9 } = await import("node:fs/promises");
|
|
1547
1580
|
const { relative: relative$7, dirname: dirname$7 } = await import("node:path");
|
|
1548
|
-
const serverPath = (0, node_path.join)(
|
|
1581
|
+
const serverPath = (0, node_path.join)(this.appRoot, ".gkm", this.provider, "server.ts");
|
|
1549
1582
|
const relativeAppPath = relative$7(dirname$7(serverPath), (0, node_path.join)(dirname$7(serverPath), "app.js"));
|
|
1550
1583
|
const serveCode = this.runtime === "bun" ? `Bun.serve({
|
|
1551
1584
|
port,
|
|
@@ -3070,7 +3103,7 @@ async function workspaceDockerCommand(workspace, options) {
|
|
|
3070
3103
|
* Get app name from package.json in the current working directory
|
|
3071
3104
|
* Used for Dokploy app/project naming
|
|
3072
3105
|
*/
|
|
3073
|
-
function getAppNameFromCwd() {
|
|
3106
|
+
function getAppNameFromCwd$1() {
|
|
3074
3107
|
const packageJsonPath = (0, node_path.join)(process.cwd(), "package.json");
|
|
3075
3108
|
if (!(0, node_fs.existsSync)(packageJsonPath)) return void 0;
|
|
3076
3109
|
try {
|
|
@@ -3188,7 +3221,7 @@ async function deployDocker(options) {
|
|
|
3188
3221
|
*/
|
|
3189
3222
|
function resolveDockerConfig(config) {
|
|
3190
3223
|
const projectName = getAppNameFromPackageJson() ?? "app";
|
|
3191
|
-
const appName = getAppNameFromCwd() ?? projectName;
|
|
3224
|
+
const appName = getAppNameFromCwd$1() ?? projectName;
|
|
3192
3225
|
const imageName = config.docker?.imageName ?? appName;
|
|
3193
3226
|
return {
|
|
3194
3227
|
registry: config.docker?.registry,
|
|
@@ -4224,7 +4257,14 @@ function rotateServicePassword(secrets, service) {
|
|
|
4224
4257
|
//#endregion
|
|
4225
4258
|
//#region src/init/versions.ts
|
|
4226
4259
|
const require$1 = (0, node_module.createRequire)(require("url").pathToFileURL(__filename).href);
|
|
4227
|
-
|
|
4260
|
+
function loadPackageJson() {
|
|
4261
|
+
try {
|
|
4262
|
+
return require$1("../package.json");
|
|
4263
|
+
} catch {
|
|
4264
|
+
return require$1("../../package.json");
|
|
4265
|
+
}
|
|
4266
|
+
}
|
|
4267
|
+
const pkg = loadPackageJson();
|
|
4228
4268
|
/**
|
|
4229
4269
|
* CLI version from package.json (used for scaffolded projects)
|
|
4230
4270
|
*/
|
|
@@ -4754,7 +4794,7 @@ function generateDockerFiles(options, template, dbApps) {
|
|
|
4754
4794
|
retries: 5`);
|
|
4755
4795
|
volumes.push(" rabbitmq_data:");
|
|
4756
4796
|
}
|
|
4757
|
-
if (options.services
|
|
4797
|
+
if (options.services?.mail) services.push(` mailpit:
|
|
4758
4798
|
image: axllent/mailpit:latest
|
|
4759
4799
|
container_name: ${options.name}-mailpit
|
|
4760
4800
|
restart: unless-stopped
|