@geekmidas/cli 0.29.0 → 0.30.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-BhryDQEq.cjs → config-BAE9LFC1.cjs} +2 -2
- package/dist/{config-BhryDQEq.cjs.map → config-BAE9LFC1.cjs.map} +1 -1
- package/dist/{config-C9bdq0l-.mjs → config-BC5n1a2D.mjs} +2 -2
- package/dist/{config-C9bdq0l-.mjs.map → config-BC5n1a2D.mjs.map} +1 -1
- package/dist/config.cjs +2 -2
- package/dist/config.d.cts +1 -1
- package/dist/config.d.mts +1 -1
- package/dist/config.mjs +2 -2
- package/dist/{index-CWN-bgrO.d.mts → index-C7TkoYmt.d.mts} +5 -1
- package/dist/index-C7TkoYmt.d.mts.map +1 -0
- package/dist/{index-DEWYvYvg.d.cts → index-CpchsC9w.d.cts} +5 -1
- package/dist/index-CpchsC9w.d.cts.map +1 -0
- package/dist/index.cjs +58 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +58 -9
- package/dist/index.mjs.map +1 -1
- package/dist/{openapi-BCEFhkLh.mjs → openapi-CjYeF-Tg.mjs} +2 -2
- package/dist/{openapi-BCEFhkLh.mjs.map → openapi-CjYeF-Tg.mjs.map} +1 -1
- package/dist/{openapi-D82bBqG7.cjs → openapi-a-e3Y8WA.cjs} +2 -2
- package/dist/{openapi-D82bBqG7.cjs.map → openapi-a-e3Y8WA.cjs.map} +1 -1
- package/dist/openapi.cjs +3 -3
- package/dist/openapi.mjs +3 -3
- package/dist/workspace/index.cjs +1 -1
- package/dist/workspace/index.d.cts +1 -1
- package/dist/workspace/index.d.mts +1 -1
- package/dist/workspace/index.mjs +1 -1
- package/dist/{workspace-DQjmv9lk.mjs → workspace-DFJ3sWfY.mjs} +19 -3
- package/dist/{workspace-DQjmv9lk.mjs.map → workspace-DFJ3sWfY.mjs.map} +1 -1
- package/dist/{workspace-CiZBOjf9.cjs → workspace-My0A4IRO.cjs} +19 -3
- package/dist/{workspace-CiZBOjf9.cjs.map → workspace-My0A4IRO.cjs.map} +1 -1
- package/package.json +4 -4
- package/src/dev/__tests__/index.spec.ts +223 -0
- package/src/dev/index.ts +83 -4
- package/src/init/__tests__/generators.spec.ts +17 -9
- package/src/workspace/__tests__/schema.spec.ts +114 -0
- package/src/workspace/schema.ts +23 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/index-CWN-bgrO.d.mts.map +0 -1
- package/dist/index-DEWYvYvg.d.cts.map +0 -1
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env -S npx tsx
|
|
2
|
-
import { __require, getAppBuildOrder, getDependencyEnvVars, getDeployTargetError, isDeployTargetSupported } from "./workspace-
|
|
3
|
-
import { getAppNameFromCwd, loadAppConfig, loadConfig, loadWorkspaceConfig, parseModuleConfig } from "./config-
|
|
4
|
-
import { ConstructGenerator, EndpointGenerator, OPENAPI_OUTPUT_PATH, OpenApiTsGenerator, generateOpenApi, openapiCommand, resolveOpenApiConfig } from "./openapi-
|
|
2
|
+
import { __require, getAppBuildOrder, getDependencyEnvVars, getDeployTargetError, isDeployTargetSupported } from "./workspace-DFJ3sWfY.mjs";
|
|
3
|
+
import { getAppNameFromCwd, loadAppConfig, loadConfig, loadWorkspaceConfig, parseModuleConfig } from "./config-BC5n1a2D.mjs";
|
|
4
|
+
import { ConstructGenerator, EndpointGenerator, OPENAPI_OUTPUT_PATH, OpenApiTsGenerator, generateOpenApi, openapiCommand, resolveOpenApiConfig } from "./openapi-CjYeF-Tg.mjs";
|
|
5
5
|
import { getKeyPath, maskPassword, readStageSecrets, secretsExist, setCustomSecret, toEmbeddableSecrets, writeStageSecrets } from "./storage-Dhst7BhI.mjs";
|
|
6
6
|
import { DokployApi } from "./dokploy-api-B9qR2Yn1.mjs";
|
|
7
7
|
import { generateReactQueryCommand } from "./openapi-react-query-5rSortLH.mjs";
|
|
@@ -26,7 +26,7 @@ import prompts from "prompts";
|
|
|
26
26
|
|
|
27
27
|
//#region package.json
|
|
28
28
|
var name = "@geekmidas/cli";
|
|
29
|
-
var version = "0.
|
|
29
|
+
var version = "0.30.0";
|
|
30
30
|
var description = "CLI tools for building Lambda handlers, server applications, and generating OpenAPI specs";
|
|
31
31
|
var private$1 = false;
|
|
32
32
|
var type = "module";
|
|
@@ -1016,10 +1016,14 @@ async function devCommand(options) {
|
|
|
1016
1016
|
const appName = getAppNameFromCwd();
|
|
1017
1017
|
let config$1;
|
|
1018
1018
|
let appRoot = process.cwd();
|
|
1019
|
+
let secretsRoot = process.cwd();
|
|
1020
|
+
let workspaceAppName;
|
|
1019
1021
|
if (appName) try {
|
|
1020
1022
|
const appConfig = await loadAppConfig();
|
|
1021
1023
|
config$1 = appConfig.gkmConfig;
|
|
1022
1024
|
appRoot = appConfig.appRoot;
|
|
1025
|
+
secretsRoot = appConfig.workspaceRoot;
|
|
1026
|
+
workspaceAppName = appConfig.appName;
|
|
1023
1027
|
logger$8.log(`📦 Running app: ${appConfig.appName}`);
|
|
1024
1028
|
} catch {
|
|
1025
1029
|
const loadedConfig = await loadWorkspaceConfig();
|
|
@@ -1072,7 +1076,16 @@ async function devCommand(options) {
|
|
|
1072
1076
|
await buildServer(config$1, buildContext, resolved.providers[0], enableOpenApi, appRoot);
|
|
1073
1077
|
if (enableOpenApi) await generateOpenApi(config$1);
|
|
1074
1078
|
const runtime = config$1.runtime ?? "node";
|
|
1075
|
-
|
|
1079
|
+
let secretsJsonPath;
|
|
1080
|
+
const appSecrets = await loadSecretsForApp(secretsRoot, workspaceAppName);
|
|
1081
|
+
if (Object.keys(appSecrets).length > 0) {
|
|
1082
|
+
const secretsDir = join(secretsRoot, ".gkm");
|
|
1083
|
+
await mkdir(secretsDir, { recursive: true });
|
|
1084
|
+
secretsJsonPath = join(secretsDir, "dev-secrets.json");
|
|
1085
|
+
await writeFile(secretsJsonPath, JSON.stringify(appSecrets, null, 2));
|
|
1086
|
+
logger$8.log(`🔐 Loaded ${Object.keys(appSecrets).length} secret(s)`);
|
|
1087
|
+
}
|
|
1088
|
+
const devServer = new DevServer(resolved.providers[0], options.port || 3e3, options.portExplicit ?? false, enableOpenApi, telescope, studio, runtime, appRoot, secretsJsonPath);
|
|
1076
1089
|
await devServer.start();
|
|
1077
1090
|
const envParserFile = config$1.envParser.split("#")[0] ?? config$1.envParser;
|
|
1078
1091
|
const loggerFile = config$1.logger.split("#")[0] ?? config$1.logger;
|
|
@@ -1244,6 +1257,31 @@ async function loadDevSecrets(workspace) {
|
|
|
1244
1257
|
return {};
|
|
1245
1258
|
}
|
|
1246
1259
|
/**
|
|
1260
|
+
* Load secrets from a path for dev mode.
|
|
1261
|
+
* For single app: returns secrets as-is.
|
|
1262
|
+
* For workspace app: maps {APP}_DATABASE_URL → DATABASE_URL.
|
|
1263
|
+
* @internal Exported for testing
|
|
1264
|
+
*/
|
|
1265
|
+
async function loadSecretsForApp(secretsRoot, appName) {
|
|
1266
|
+
const stages = ["dev", "development"];
|
|
1267
|
+
let secrets = {};
|
|
1268
|
+
for (const stage of stages) if (secretsExist(stage, secretsRoot)) {
|
|
1269
|
+
const stageSecrets = await readStageSecrets(stage, secretsRoot);
|
|
1270
|
+
if (stageSecrets) {
|
|
1271
|
+
logger$8.log(`🔐 Loading secrets from stage: ${stage}`);
|
|
1272
|
+
secrets = toEmbeddableSecrets(stageSecrets);
|
|
1273
|
+
break;
|
|
1274
|
+
}
|
|
1275
|
+
}
|
|
1276
|
+
if (Object.keys(secrets).length === 0) return {};
|
|
1277
|
+
if (!appName) return secrets;
|
|
1278
|
+
const prefix = appName.toUpperCase();
|
|
1279
|
+
const mapped = { ...secrets };
|
|
1280
|
+
const appDbUrl = secrets[`${prefix}_DATABASE_URL`];
|
|
1281
|
+
if (appDbUrl) mapped.DATABASE_URL = appDbUrl;
|
|
1282
|
+
return mapped;
|
|
1283
|
+
}
|
|
1284
|
+
/**
|
|
1247
1285
|
* Start docker-compose services for the workspace.
|
|
1248
1286
|
* @internal Exported for testing
|
|
1249
1287
|
*/
|
|
@@ -1488,7 +1526,7 @@ var DevServer = class {
|
|
|
1488
1526
|
serverProcess = null;
|
|
1489
1527
|
isRunning = false;
|
|
1490
1528
|
actualPort;
|
|
1491
|
-
constructor(provider, requestedPort, portExplicit, enableOpenApi, telescope, studio, runtime = "node", appRoot = process.cwd()) {
|
|
1529
|
+
constructor(provider, requestedPort, portExplicit, enableOpenApi, telescope, studio, runtime = "node", appRoot = process.cwd(), secretsJsonPath) {
|
|
1492
1530
|
this.provider = provider;
|
|
1493
1531
|
this.requestedPort = requestedPort;
|
|
1494
1532
|
this.portExplicit = portExplicit;
|
|
@@ -1497,6 +1535,7 @@ var DevServer = class {
|
|
|
1497
1535
|
this.studio = studio;
|
|
1498
1536
|
this.runtime = runtime;
|
|
1499
1537
|
this.appRoot = appRoot;
|
|
1538
|
+
this.secretsJsonPath = secretsJsonPath;
|
|
1500
1539
|
this.actualPort = requestedPort;
|
|
1501
1540
|
}
|
|
1502
1541
|
async start() {
|
|
@@ -1575,10 +1614,20 @@ var DevServer = class {
|
|
|
1575
1614
|
await this.start();
|
|
1576
1615
|
}
|
|
1577
1616
|
async createServerEntry() {
|
|
1578
|
-
const { writeFile:
|
|
1617
|
+
const { writeFile: fsWriteFile } = await import("node:fs/promises");
|
|
1579
1618
|
const { relative: relative$1, dirname: dirname$1 } = await import("node:path");
|
|
1580
1619
|
const serverPath = join(this.appRoot, ".gkm", this.provider, "server.ts");
|
|
1581
1620
|
const relativeAppPath = relative$1(dirname$1(serverPath), join(dirname$1(serverPath), "app.js"));
|
|
1621
|
+
const credentialsInjection = this.secretsJsonPath ? `import { Credentials } from '@geekmidas/envkit/credentials';
|
|
1622
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
1623
|
+
|
|
1624
|
+
// Inject dev secrets into Credentials (must happen before app import)
|
|
1625
|
+
const secretsPath = '${this.secretsJsonPath}';
|
|
1626
|
+
if (existsSync(secretsPath)) {
|
|
1627
|
+
Object.assign(Credentials, JSON.parse(readFileSync(secretsPath, 'utf-8')));
|
|
1628
|
+
}
|
|
1629
|
+
|
|
1630
|
+
` : "";
|
|
1582
1631
|
const serveCode = this.runtime === "bun" ? `Bun.serve({
|
|
1583
1632
|
port,
|
|
1584
1633
|
fetch: app.fetch,
|
|
@@ -1598,7 +1647,7 @@ var DevServer = class {
|
|
|
1598
1647
|
* Development server entry point
|
|
1599
1648
|
* This file is auto-generated by 'gkm dev'
|
|
1600
1649
|
*/
|
|
1601
|
-
import { createApp } from './${relativeAppPath.startsWith(".") ? relativeAppPath : `./${relativeAppPath}`}';
|
|
1650
|
+
${credentialsInjection}import { createApp } from './${relativeAppPath.startsWith(".") ? relativeAppPath : `./${relativeAppPath}`}';
|
|
1602
1651
|
|
|
1603
1652
|
const port = process.argv.includes('--port')
|
|
1604
1653
|
? Number.parseInt(process.argv[process.argv.indexOf('--port') + 1])
|
|
@@ -1618,7 +1667,7 @@ start({
|
|
|
1618
1667
|
process.exit(1);
|
|
1619
1668
|
});
|
|
1620
1669
|
`;
|
|
1621
|
-
await
|
|
1670
|
+
await fsWriteFile(serverPath, content);
|
|
1622
1671
|
}
|
|
1623
1672
|
};
|
|
1624
1673
|
|