@geekmidas/cli 1.10.3 → 1.10.5

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/index.mjs CHANGED
@@ -8,7 +8,7 @@ import { getKeyPath, maskPassword, readStageSecrets, secretsExist, setCustomSecr
8
8
  import { DokployApi } from "./dokploy-api-2ldYoN3i.mjs";
9
9
  import { encryptSecrets } from "./encryption-BOH5M-f-.mjs";
10
10
  import { CachedStateProvider } from "./CachedStateProvider-BDq5WqSy.mjs";
11
- import { createStageSecrets, generateDbPassword, generateDbUrl, generateFullstackCustomSecrets, rotateServicePassword, writeDockerEnvFromSecrets } from "./fullstack-secrets-UZAFWuH4.mjs";
11
+ import { createStageSecrets, generateDbPassword, generateDbUrl, generateFullstackCustomSecrets, rotateServicePassword, writeDockerEnvFromSecrets } from "./fullstack-secrets-odm79Uo1.mjs";
12
12
  import { generateReactQueryCommand } from "./openapi-react-query-C4UdILaI.mjs";
13
13
  import { isSSMConfigured, pullSecrets, pushSecrets } from "./sync-CbeKrnQV.mjs";
14
14
  import { createRequire } from "node:module";
@@ -35,7 +35,7 @@ import prompts from "prompts";
35
35
 
36
36
  //#region package.json
37
37
  var name = "@geekmidas/cli";
38
- var version = "1.10.2";
38
+ var version = "1.10.4";
39
39
  var description = "CLI tools for building Lambda handlers, server applications, and generating OpenAPI specs";
40
40
  var private$1 = false;
41
41
  var type = "module";
@@ -815,13 +815,19 @@ function rewriteUrlsWithPorts(secrets, resolvedPorts) {
815
815
  const { ports, mappings } = resolvedPorts;
816
816
  const result = { ...secrets };
817
817
  const portReplacements = [];
818
+ const serviceNames = /* @__PURE__ */ new Set();
818
819
  for (const mapping of mappings) {
820
+ serviceNames.add(mapping.service);
819
821
  const resolved = ports[mapping.envVar];
820
822
  if (resolved !== void 0) portReplacements.push({
821
823
  defaultPort: mapping.defaultPort,
822
824
  resolvedPort: resolved
823
825
  });
824
826
  }
827
+ for (const [key, value] of Object.entries(result)) {
828
+ if (!key.endsWith("_HOST")) continue;
829
+ if (serviceNames.has(value)) result[key] = "localhost";
830
+ }
825
831
  for (const [key, value] of Object.entries(result)) {
826
832
  if (!key.endsWith("_PORT")) continue;
827
833
  for (const { defaultPort, resolvedPort } of portReplacements) if (value === String(defaultPort)) result[key] = String(resolvedPort);
@@ -829,6 +835,7 @@ function rewriteUrlsWithPorts(secrets, resolvedPorts) {
829
835
  for (const [key, value] of Object.entries(result)) {
830
836
  if (!key.endsWith("_URL") && key !== "DATABASE_URL") continue;
831
837
  let rewritten = value;
838
+ for (const name$1 of serviceNames) rewritten = rewritten.replace(new RegExp(`@${name$1}:`, "g"), "@localhost:");
832
839
  for (const { defaultPort, resolvedPort } of portReplacements) rewritten = replacePortInUrl(rewritten, defaultPort, resolvedPort);
833
840
  result[key] = rewritten;
834
841
  }
@@ -2882,7 +2889,7 @@ services:
2882
2889
  environment:
2883
2890
  - NODE_ENV=production
2884
2891
  `;
2885
- if (serviceMap.has("postgres")) yaml += ` - DATABASE_URL=\${DATABASE_URL:-postgresql://postgres:postgres@postgres:5432/app}
2892
+ if (serviceMap.has("postgres")) yaml += ` - DATABASE_URL=\${DATABASE_URL:-postgresql://\${POSTGRES_USER:-postgres}:\${POSTGRES_PASSWORD:-postgres}@postgres:5432/\${POSTGRES_DB:-app}}
2886
2893
  `;
2887
2894
  if (serviceMap.has("redis")) yaml += ` - REDIS_URL=\${REDIS_URL:-redis://redis:6379}
2888
2895
  `;
@@ -2917,7 +2924,7 @@ services:
2917
2924
  volumes:
2918
2925
  - postgres_data:/var/lib/postgresql/data
2919
2926
  healthcheck:
2920
- test: ["CMD-SHELL", "pg_isready -U postgres"]
2927
+ test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER"]
2921
2928
  interval: 5s
2922
2929
  timeout: 5s
2923
2930
  retries: 5
@@ -3046,7 +3053,7 @@ services:
3046
3053
  volumes:
3047
3054
  - postgres_data:/var/lib/postgresql/data
3048
3055
  healthcheck:
3049
- test: ["CMD-SHELL", "pg_isready -U postgres"]
3056
+ test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER"]
3050
3057
  interval: 5s
3051
3058
  timeout: 5s
3052
3059
  retries: 5
@@ -3139,7 +3146,7 @@ function generateAppService(appName, app, allApps, options) {
3139
3146
  `;
3140
3147
  }
3141
3148
  if (app.type === "backend") {
3142
- if (hasPostgres) yaml += ` - DATABASE_URL=\${DATABASE_URL:-postgresql://postgres:postgres@postgres:5432/app}
3149
+ if (hasPostgres) yaml += ` - DATABASE_URL=\${DATABASE_URL:-postgresql://\${POSTGRES_USER:-postgres}:\${POSTGRES_PASSWORD:-postgres}@postgres:5432/\${POSTGRES_DB:-app}}
3143
3150
  `;
3144
3151
  if (hasRedis) yaml += ` - REDIS_URL=\${REDIS_URL:-redis://redis:6379}
3145
3152
  `;
@@ -6951,15 +6958,15 @@ function generateDockerFiles(options, template, dbApps) {
6951
6958
  container_name: ${options.name}-postgres
6952
6959
  restart: unless-stopped${envFile}
6953
6960
  environment:
6954
- POSTGRES_USER: postgres
6955
- POSTGRES_PASSWORD: postgres
6956
- POSTGRES_DB: ${options.name.replace(/-/g, "_")}_dev
6961
+ POSTGRES_USER: \${POSTGRES_USER:-postgres}
6962
+ POSTGRES_PASSWORD: \${POSTGRES_PASSWORD:-postgres}
6963
+ POSTGRES_DB: \${POSTGRES_DB:-${options.name.replace(/-/g, "_")}_dev}
6957
6964
  ports:
6958
6965
  - '\${POSTGRES_HOST_PORT:-5432}:5432'
6959
6966
  volumes:
6960
6967
  - postgres_data:/var/lib/postgresql/data${initVolume}
6961
6968
  healthcheck:
6962
- test: ['CMD-SHELL', 'pg_isready -U postgres']
6969
+ test: ['CMD-SHELL', 'pg_isready -U $$POSTGRES_USER']
6963
6970
  interval: 5s
6964
6971
  timeout: 5s
6965
6972
  retries: 5`);
@@ -7607,6 +7614,7 @@ export default defineWorkspace({
7607
7614
  path: 'apps/auth',
7608
7615
  port: 3002,
7609
7616
  entry: './src/index.ts',
7617
+ framework: 'better-auth',
7610
7618
  envParser: './src/config/env#envParser',
7611
7619
  logger: './src/config/logger#logger',
7612
7620
  },
@@ -7649,6 +7657,10 @@ export default defineWorkspace({
7649
7657
  default: 'dokploy',
7650
7658
  },`;
7651
7659
  config$1 += `
7660
+ secrets: {
7661
+ enabled: true,
7662
+ },`;
7663
+ config$1 += `
7652
7664
  });
7653
7665
  `;
7654
7666
  return config$1;
@@ -11363,7 +11375,6 @@ async function testCommand(options = {}) {
11363
11375
  }
11364
11376
  }
11365
11377
  secretsEnv = rewriteDatabaseUrlForTests(secretsEnv);
11366
- await ensureTestDatabase(secretsEnv);
11367
11378
  let dependencyEnv = {};
11368
11379
  try {
11369
11380
  const appInfo = await loadWorkspaceAppInfo(cwd);
@@ -11384,6 +11395,24 @@ async function testCommand(options = {}) {
11384
11395
  }
11385
11396
  } catch {}
11386
11397
  console.log("");
11398
+ const allSecrets = {
11399
+ ...secretsEnv,
11400
+ ...dependencyEnv
11401
+ };
11402
+ const gkmDir = join(cwd, ".gkm");
11403
+ await mkdir(gkmDir, { recursive: true });
11404
+ const secretsJsonPath = join(gkmDir, "test-secrets.json");
11405
+ await writeFile(secretsJsonPath, JSON.stringify(allSecrets, null, 2));
11406
+ const preloadPath = join(gkmDir, "test-credentials-preload.ts");
11407
+ await createCredentialsPreload(preloadPath, secretsJsonPath);
11408
+ const existingNodeOptions = process.env.NODE_OPTIONS ?? "";
11409
+ const tsxImport = "--import=tsx";
11410
+ const preloadImport = `--import=${preloadPath}`;
11411
+ const nodeOptions = [
11412
+ existingNodeOptions,
11413
+ tsxImport,
11414
+ preloadImport
11415
+ ].filter(Boolean).join(" ");
11387
11416
  const args = [];
11388
11417
  if (options.run) args.push("run");
11389
11418
  else if (options.watch) args.push("--watch");
@@ -11395,9 +11424,9 @@ async function testCommand(options = {}) {
11395
11424
  stdio: "inherit",
11396
11425
  env: {
11397
11426
  ...process.env,
11398
- ...secretsEnv,
11399
- ...dependencyEnv,
11400
- NODE_ENV: "test"
11427
+ ...allSecrets,
11428
+ NODE_ENV: "test",
11429
+ NODE_OPTIONS: nodeOptions
11401
11430
  }
11402
11431
  });
11403
11432
  return new Promise((resolve$1, reject) => {
@@ -11433,34 +11462,6 @@ function rewriteDatabaseUrlForTests(env) {
11433
11462
  }
11434
11463
  return result;
11435
11464
  }
11436
- /**
11437
- * Ensure the test database exists by connecting to the default database
11438
- * and running CREATE DATABASE IF NOT EXISTS.
11439
- * @internal Exported for testing
11440
- */
11441
- async function ensureTestDatabase(env) {
11442
- const databaseUrl = env.DATABASE_URL;
11443
- if (!databaseUrl) return;
11444
- try {
11445
- const url = new URL(databaseUrl);
11446
- const testDbName = url.pathname.slice(1);
11447
- if (!testDbName) return;
11448
- url.pathname = "/postgres";
11449
- const { default: pg } = await import("pg");
11450
- const client = new pg.Client({ connectionString: url.toString() });
11451
- await client.connect();
11452
- try {
11453
- await client.query(`CREATE DATABASE "${testDbName}"`);
11454
- console.log(` 📦 Created test database "${testDbName}"`);
11455
- } catch (err) {
11456
- if (err.code !== "42P04") throw err;
11457
- } finally {
11458
- await client.end();
11459
- }
11460
- } catch (err) {
11461
- console.log(` ⚠️ Could not ensure test database: ${err.message}`);
11462
- }
11463
- }
11464
11465
 
11465
11466
  //#endregion
11466
11467
  //#region src/upgrade/index.ts
@@ -11828,7 +11829,7 @@ program.command("secrets:push").description("Push secrets to remote provider (SS
11828
11829
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11829
11830
  const { loadWorkspaceConfig: loadWorkspaceConfig$1 } = await import("./config.mjs");
11830
11831
  const { pushSecrets: pushSecrets$1 } = await import("./sync-6FoT41G3.mjs");
11831
- const { reconcileMissingSecrets } = await import("./reconcile-D2WCDQue.mjs");
11832
+ const { reconcileMissingSecrets } = await import("./reconcile-WzC1oAUV.mjs");
11832
11833
  const { readStageSecrets: readStageSecrets$1, writeStageSecrets: writeStageSecrets$1 } = await import("./storage-Dx_jZbq6.mjs");
11833
11834
  const { workspace } = await loadWorkspaceConfig$1();
11834
11835
  const secrets = await readStageSecrets$1(options.stage, workspace.root);
@@ -11854,7 +11855,7 @@ program.command("secrets:pull").description("Pull secrets from remote provider (
11854
11855
  const { loadWorkspaceConfig: loadWorkspaceConfig$1 } = await import("./config.mjs");
11855
11856
  const { pullSecrets: pullSecrets$1 } = await import("./sync-6FoT41G3.mjs");
11856
11857
  const { writeStageSecrets: writeStageSecrets$1 } = await import("./storage-Dx_jZbq6.mjs");
11857
- const { reconcileMissingSecrets } = await import("./reconcile-D2WCDQue.mjs");
11858
+ const { reconcileMissingSecrets } = await import("./reconcile-WzC1oAUV.mjs");
11858
11859
  const { workspace } = await loadWorkspaceConfig$1();
11859
11860
  let secrets = await pullSecrets$1(options.stage, workspace);
11860
11861
  if (!secrets) {
@@ -11879,7 +11880,7 @@ program.command("secrets:reconcile").description("Backfill missing custom secret
11879
11880
  const globalOptions = program.opts();
11880
11881
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
11881
11882
  const { loadWorkspaceConfig: loadWorkspaceConfig$1 } = await import("./config.mjs");
11882
- const { reconcileMissingSecrets } = await import("./reconcile-D2WCDQue.mjs");
11883
+ const { reconcileMissingSecrets } = await import("./reconcile-WzC1oAUV.mjs");
11883
11884
  const { readStageSecrets: readStageSecrets$1, writeStageSecrets: writeStageSecrets$1 } = await import("./storage-Dx_jZbq6.mjs");
11884
11885
  const { workspace } = await loadWorkspaceConfig$1();
11885
11886
  const secrets = await readStageSecrets$1(options.stage, workspace.root);