@geekmidas/cli 1.10.25 → 1.10.27

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 (69) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/FUNCTION_CRON_SUPPORT.md +2 -2
  3. package/dist/{CachedStateProvider-D_uISMmJ.cjs → CachedStateProvider-37pG1HBx.cjs} +1 -1
  4. package/dist/{CachedStateProvider-BDq5WqSy.mjs → CachedStateProvider-C8A-cCm5.mjs} +1 -1
  5. package/dist/{CachedStateProvider-BDq5WqSy.mjs.map → CachedStateProvider-C8A-cCm5.mjs.map} +1 -1
  6. package/dist/CachedStateProvider-CC0DyO09.mjs +3 -0
  7. package/dist/{CachedStateProvider-D73dCqfH.cjs → CachedStateProvider-CxsXOKkg.cjs} +1 -1
  8. package/dist/{CachedStateProvider-D73dCqfH.cjs.map → CachedStateProvider-CxsXOKkg.cjs.map} +1 -1
  9. package/dist/{bundler-i-az1DZ2.cjs → bundler-BG6P249p.cjs} +3 -3
  10. package/dist/{bundler-i-az1DZ2.cjs.map → bundler-BG6P249p.cjs.map} +1 -1
  11. package/dist/{bundler-C5xkxnyr.mjs → bundler-c6QvGUBM.mjs} +3 -3
  12. package/dist/{bundler-C5xkxnyr.mjs.map → bundler-c6QvGUBM.mjs.map} +1 -1
  13. package/dist/{dokploy-api-2ldYoN3i.mjs → dokploy-api-BIT0683o.mjs} +1 -1
  14. package/dist/{dokploy-api-2ldYoN3i.mjs.map → dokploy-api-BIT0683o.mjs.map} +1 -1
  15. package/dist/dokploy-api-BOx71j6F.cjs +3 -0
  16. package/dist/dokploy-api-BZGk-lkD.mjs +3 -0
  17. package/dist/{dokploy-api-DLgvEQlr.cjs → dokploy-api-Dvyq-LsM.cjs} +1 -1
  18. package/dist/{dokploy-api-DLgvEQlr.cjs.map → dokploy-api-Dvyq-LsM.cjs.map} +1 -1
  19. package/dist/{encryption-Cv3zips0.cjs → encryption-CipsS0KW.cjs} +1 -1
  20. package/dist/{encryption-BOH5M-f-.mjs → encryption-DSkIlEZ6.mjs} +1 -1
  21. package/dist/{encryption-BOH5M-f-.mjs.map → encryption-DSkIlEZ6.mjs.map} +1 -1
  22. package/dist/encryption-Db2zvGqM.mjs +3 -0
  23. package/dist/{encryption-BE0UOb8j.cjs → encryption-DgKS-Dv9.cjs} +1 -1
  24. package/dist/{encryption-BE0UOb8j.cjs.map → encryption-DgKS-Dv9.cjs.map} +1 -1
  25. package/dist/{fullstack-secrets-x2Kffx7-.mjs → fullstack-secrets-BDE7Sk93.mjs} +8 -4
  26. package/dist/fullstack-secrets-BDE7Sk93.mjs.map +1 -0
  27. package/dist/{fullstack-secrets-DOHBU4Rp.cjs → fullstack-secrets-CsxU84eN.cjs} +13 -3
  28. package/dist/fullstack-secrets-CsxU84eN.cjs.map +1 -0
  29. package/dist/index.cjs +58 -47
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.mjs +58 -47
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/{openapi-N_iCUhJU.cjs → openapi-BXuCY14q.cjs} +1 -1
  34. package/dist/{openapi-N_iCUhJU.cjs.map → openapi-BXuCY14q.cjs.map} +1 -1
  35. package/dist/{openapi-DnIYqDH3.mjs → openapi-DeG0ffQ8.mjs} +1 -1
  36. package/dist/{openapi-DnIYqDH3.mjs.map → openapi-DeG0ffQ8.mjs.map} +1 -1
  37. package/dist/openapi.cjs +1 -1
  38. package/dist/openapi.mjs +1 -1
  39. package/dist/{reconcile-BLh6rswz.mjs → reconcile-BjWhjfSp.mjs} +2 -2
  40. package/dist/{reconcile-BLh6rswz.mjs.map → reconcile-BjWhjfSp.mjs.map} +1 -1
  41. package/dist/{reconcile-Ch7sIcf8.cjs → reconcile-DF8t4HC7.cjs} +2 -2
  42. package/dist/{reconcile-Ch7sIcf8.cjs.map → reconcile-DF8t4HC7.cjs.map} +1 -1
  43. package/dist/{storage-DLEb8Dkd.cjs → storage-B1wvztiJ.cjs} +1 -1
  44. package/dist/{storage-DLEb8Dkd.cjs.map → storage-B1wvztiJ.cjs.map} +1 -1
  45. package/dist/{storage-mwbL7PhP.mjs → storage-Cs4WBsc4.mjs} +1 -1
  46. package/dist/{storage-ChVQI_G7.cjs → storage-DOEtT2Hr.cjs} +1 -1
  47. package/dist/{storage-CpMNB77O.mjs → storage-dbb9RyBl.mjs} +1 -1
  48. package/dist/{storage-CpMNB77O.mjs.map → storage-dbb9RyBl.mjs.map} +1 -1
  49. package/dist/{sync-CYBVB64f.mjs → sync-COnAugP-.mjs} +1 -1
  50. package/dist/sync-D1Pa30oV.cjs +4 -0
  51. package/dist/{sync-BWD_I5Ai.cjs → sync-DGXXSk2v.cjs} +2 -2
  52. package/dist/{sync-BWD_I5Ai.cjs.map → sync-DGXXSk2v.cjs.map} +1 -1
  53. package/dist/{sync-lExOTa9t.mjs → sync-D_NowTkZ.mjs} +2 -2
  54. package/dist/{sync-lExOTa9t.mjs.map → sync-D_NowTkZ.mjs.map} +1 -1
  55. package/package.json +3 -3
  56. package/src/credentials/index.ts +20 -0
  57. package/src/generators/SubscriberGenerator.ts +5 -6
  58. package/src/init/generators/docker.ts +8 -10
  59. package/src/secrets/__tests__/generator.spec.ts +8 -3
  60. package/src/secrets/generator.ts +12 -4
  61. package/src/setup/__tests__/reconcile-secrets.spec.ts +11 -0
  62. package/src/setup/index.ts +20 -19
  63. package/dist/CachedStateProvider-CI61keQ1.mjs +0 -3
  64. package/dist/dokploy-api-C93pveuy.mjs +0 -3
  65. package/dist/dokploy-api-CbDh4o93.cjs +0 -3
  66. package/dist/encryption-a9TNMWav.mjs +0 -3
  67. package/dist/fullstack-secrets-DOHBU4Rp.cjs.map +0 -1
  68. package/dist/fullstack-secrets-x2Kffx7-.mjs.map +0 -1
  69. package/dist/sync-ByaRPBxh.cjs +0 -4
package/dist/index.mjs CHANGED
@@ -3,14 +3,14 @@ import { __require } from "./chunk-Duj1WY3L.mjs";
3
3
  import { getAppBuildOrder, getDependencyEnvVars, getDeployTargetError, isDeployTargetSupported } from "./workspace-D4z4A4cq.mjs";
4
4
  import { getAppNameFromCwd, loadAppConfig, loadConfig, loadWorkspaceAppInfo, loadWorkspaceConfig, parseModuleConfig } from "./config-jsRYHOHU.mjs";
5
5
  import { getCredentialsPath, getDokployCredentials, getDokployRegistryId, getDokployToken, removeDokployCredentials, storeDokployCredentials, storeDokployRegistryId } from "./credentials-s1kLcIzK.mjs";
6
- import { getKeyPath, maskPassword, readStageSecrets, secretsExist, setCustomSecret, toEmbeddableSecrets, writeStageSecrets } from "./storage-CpMNB77O.mjs";
7
- import { ConstructGenerator, EndpointGenerator, OPENAPI_OUTPUT_PATH, copyAllClients, copyClientToFrontends, generateOpenApi, getBackendOpenApiPath, isPartitionedRoutes, normalizeRoutes, openapiCommand, resolveOpenApiConfig } from "./openapi-DnIYqDH3.mjs";
8
- import { DokployApi } from "./dokploy-api-2ldYoN3i.mjs";
9
- import { encryptSecrets } from "./encryption-BOH5M-f-.mjs";
10
- import { CachedStateProvider } from "./CachedStateProvider-BDq5WqSy.mjs";
11
- import { createStageSecrets, generateConnectionUrls, generateDbPassword, generateDbUrl, generateFullstackCustomSecrets, generateLocalStackCredentials, generateSecurePassword, generateServiceCredentials, rotateServicePassword, writeDockerEnvFromSecrets } from "./fullstack-secrets-x2Kffx7-.mjs";
6
+ import { createStageSecrets, generateConnectionUrls, generateDbPassword, generateDbUrl, generateFullstackCustomSecrets, generateLocalStackCredentials, generatePgBossUrl, generateSecurePassword, generateServiceCredentials, rotateServicePassword, writeDockerEnvFromSecrets } from "./fullstack-secrets-BDE7Sk93.mjs";
7
+ import { getKeyPath, maskPassword, readStageSecrets, secretsExist, setCustomSecret, toEmbeddableSecrets, writeStageSecrets } from "./storage-dbb9RyBl.mjs";
8
+ import { ConstructGenerator, EndpointGenerator, OPENAPI_OUTPUT_PATH, copyAllClients, copyClientToFrontends, generateOpenApi, getBackendOpenApiPath, isPartitionedRoutes, normalizeRoutes, openapiCommand, resolveOpenApiConfig } from "./openapi-DeG0ffQ8.mjs";
9
+ import { DokployApi } from "./dokploy-api-BIT0683o.mjs";
10
+ import { encryptSecrets } from "./encryption-DSkIlEZ6.mjs";
11
+ import { CachedStateProvider } from "./CachedStateProvider-C8A-cCm5.mjs";
12
12
  import { generateReactQueryCommand } from "./openapi-react-query-C4UdILaI.mjs";
13
- import { isSSMConfigured, pullSecrets, pushSecrets } from "./sync-lExOTa9t.mjs";
13
+ import { isSSMConfigured, pullSecrets, pushSecrets } from "./sync-D_NowTkZ.mjs";
14
14
  import { createRequire } from "node:module";
15
15
  import { copyFileSync, existsSync, readFileSync, unlinkSync } from "node:fs";
16
16
  import { basename, dirname, join, parse, relative, resolve } from "node:path";
@@ -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.24";
38
+ var version = "1.10.26";
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";
@@ -138,7 +138,7 @@ const logger$14 = console;
138
138
  * Validate Dokploy token by making a test API call
139
139
  */
140
140
  async function validateDokployToken(endpoint, token) {
141
- const { DokployApi: DokployApi$1 } = await import("./dokploy-api-C93pveuy.mjs");
141
+ const { DokployApi: DokployApi$1 } = await import("./dokploy-api-BZGk-lkD.mjs");
142
142
  const api = new DokployApi$1({
143
143
  baseUrl: endpoint,
144
144
  token
@@ -781,6 +781,17 @@ async function prepareEntryCredentials(options) {
781
781
  const depEnv = getDependencyEnvVars(appInfo.workspace, appInfo.appName);
782
782
  Object.assign(credentials, depEnv);
783
783
  }
784
+ if (!credentials.EVENT_PUBLISHER_CONNECTION_STRING && !credentials.EVENT_SUBSCRIBER_CONNECTION_STRING && credentials.PGBOSS_DB_USER) {
785
+ const pgbossUrl = generatePgBossUrl({
786
+ username: credentials.PGBOSS_DB_USER,
787
+ password: credentials.PGBOSS_DB_PASSWORD ?? "",
788
+ host: credentials.POSTGRES_HOST ?? "localhost",
789
+ port: Number(credentials.POSTGRES_PORT ?? "5432"),
790
+ database: credentials.POSTGRES_DB ?? "app"
791
+ });
792
+ credentials.EVENT_PUBLISHER_CONNECTION_STRING = pgbossUrl;
793
+ credentials.EVENT_SUBSCRIBER_CONNECTION_STRING = pgbossUrl;
794
+ }
784
795
  const secretsDir = join(secretsRoot, ".gkm");
785
796
  await mkdir(secretsDir, { recursive: true });
786
797
  const secretsFileName = options.secretsFileName ?? (appName ? `dev-secrets-${appName}.json` : "dev-secrets.json");
@@ -995,17 +1006,16 @@ export async function setupSubscribers(
995
1006
  envParser: EnvironmentParser<any>,
996
1007
  logger: Logger,
997
1008
  ): Promise<void> {
1009
+ if (subscribers.length === 0) {
1010
+ return;
1011
+ }
1012
+
998
1013
  logger.info('Setting up subscribers in polling mode (local development)');
999
1014
 
1000
1015
  const config = envParser.create((get) => ({
1001
- connectionString: get('EVENT_SUBSCRIBER_CONNECTION_STRING').string().optional(),
1016
+ connectionString: get('EVENT_SUBSCRIBER_CONNECTION_STRING').string(),
1002
1017
  })).parse();
1003
1018
 
1004
- if (!config.connectionString) {
1005
- logger.warn('EVENT_SUBSCRIBER_CONNECTION_STRING not configured, skipping subscriber setup');
1006
- return;
1007
- }
1008
-
1009
1019
  const serviceDiscovery = ServiceDiscovery.getInstance(envParser);
1010
1020
 
1011
1021
  // Create connection once, outside the loop (more efficient)
@@ -2278,7 +2288,7 @@ async function buildForProvider(provider, context, rootOutputDir, endpointGenera
2278
2288
  let masterKey;
2279
2289
  if (context.production?.bundle && !skipBundle) {
2280
2290
  logger$9.log(`\n📦 Bundling production server...`);
2281
- const { bundleServer } = await import("./bundler-C5xkxnyr.mjs");
2291
+ const { bundleServer } = await import("./bundler-c6QvGUBM.mjs");
2282
2292
  const allConstructs = [
2283
2293
  ...endpoints.map((e) => e.construct),
2284
2294
  ...functions.map((f) => f.construct),
@@ -5090,7 +5100,7 @@ async function createStateProvider(options) {
5090
5100
  if (!workspaceName) throw new Error("Workspace name is required for SSM state provider. Set \"name\" in gkm.config.ts.");
5091
5101
  const { LocalStateProvider } = await import("./LocalStateProvider-Dp0KkRcw.mjs");
5092
5102
  const { SSMStateProvider } = await import("./SSMStateProvider-CksOTB8M.mjs");
5093
- const { CachedStateProvider: CachedStateProvider$1 } = await import("./CachedStateProvider-CI61keQ1.mjs");
5103
+ const { CachedStateProvider: CachedStateProvider$1 } = await import("./CachedStateProvider-CC0DyO09.mjs");
5094
5104
  const ssmConfig = config$1;
5095
5105
  const local = new LocalStateProvider(workspaceRoot);
5096
5106
  const ssm = SSMStateProvider.create({
@@ -6557,7 +6567,7 @@ async function deployCommand(options) {
6557
6567
  dokployConfig = setupResult.config;
6558
6568
  finalRegistry = dokployConfig.registry ?? dockerConfig.registry;
6559
6569
  if (setupResult.serviceUrls) {
6560
- const { readStageSecrets: readStageSecrets$1, writeStageSecrets: writeStageSecrets$1, initStageSecrets } = await import("./storage-mwbL7PhP.mjs");
6570
+ const { readStageSecrets: readStageSecrets$1, writeStageSecrets: writeStageSecrets$1, initStageSecrets } = await import("./storage-Cs4WBsc4.mjs");
6561
6571
  let secrets = await readStageSecrets$1(stage);
6562
6572
  if (!secrets) {
6563
6573
  logger$3.log(` Creating secrets file for stage "${stage}"...`);
@@ -7494,7 +7504,7 @@ function generateDockerEnv(apps, eventsBackend) {
7494
7504
  const envVar = `${app.name.toUpperCase()}_DB_PASSWORD`;
7495
7505
  return `${envVar}=${app.password}`;
7496
7506
  });
7497
- if (eventsBackend === "pgboss") envVars.push(`PGBOSS_DB_PASSWORD=pgboss-dev-password`);
7507
+ envVars.push(`PGBOSS_DB_PASSWORD=pgboss-dev-password`);
7498
7508
  return `# Auto-generated docker environment file
7499
7509
  # Contains database passwords for docker-compose postgres init
7500
7510
  # This file is gitignored - do not commit to version control
@@ -7555,8 +7565,7 @@ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-E
7555
7565
  EOSQL
7556
7566
  `;
7557
7567
  });
7558
- let pgbossBlock = "";
7559
- if (eventsBackend === "pgboss") pgbossBlock = `
7568
+ const pgbossBlock = `
7560
7569
  # Create pgboss user with dedicated schema - idempotent
7561
7570
  echo "Creating pgboss user and schema..."
7562
7571
  psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
@@ -7592,7 +7601,8 @@ set -e
7592
7601
  # Auto-generated PostgreSQL init script (idempotent - safe to re-run)
7593
7602
  # Creates per-app users with separate schemas in a single database
7594
7603
  # - api: uses public schema
7595
- # - auth: uses auth schema (search_path=auth)${eventsBackend === "pgboss" ? "\n# - pgboss: uses pgboss schema for event processing" : ""}
7604
+ # - auth: uses auth schema (search_path=auth)
7605
+ # - pgboss: uses pgboss schema for event processing
7596
7606
  ${extensions}
7597
7607
  ${userCreations.join("\n")}${pgbossBlock}
7598
7608
  echo "Database initialization complete!"
@@ -11827,26 +11837,27 @@ function reconcileSecrets(secrets, workspace) {
11827
11837
  logger$1.log(` 🔄 Adding missing service credentials: ${name$1}`);
11828
11838
  changed = true;
11829
11839
  }
11840
+ if (result.services.postgres && !result.services.pgboss) {
11841
+ result = {
11842
+ ...result,
11843
+ services: {
11844
+ ...result.services,
11845
+ pgboss: {
11846
+ host: result.services.postgres.host,
11847
+ port: result.services.postgres.port,
11848
+ username: "pgboss",
11849
+ password: generateSecurePassword(),
11850
+ database: result.services.postgres.database ?? "app"
11851
+ }
11852
+ }
11853
+ };
11854
+ result.urls = generateConnectionUrls(result.services, result.eventsBackend);
11855
+ logger$1.log(" 🔄 Adding missing service credentials: pgboss");
11856
+ changed = true;
11857
+ }
11830
11858
  const eventsBackend = workspace.services.events;
11831
11859
  if (eventsBackend && result.eventsBackend !== eventsBackend) {
11832
11860
  result.eventsBackend = eventsBackend;
11833
- if (eventsBackend === "pgboss" && !result.services.pgboss) {
11834
- result = {
11835
- ...result,
11836
- services: {
11837
- ...result.services,
11838
- pgboss: {
11839
- host: result.services.postgres?.host ?? "localhost",
11840
- port: result.services.postgres?.port ?? 5432,
11841
- username: "pgboss",
11842
- password: generateSecurePassword(),
11843
- database: result.services.postgres?.database ?? "app"
11844
- }
11845
- }
11846
- };
11847
- logger$1.log(" 🔄 Adding missing service credentials: pgboss");
11848
- changed = true;
11849
- }
11850
11861
  if (eventsBackend === "sns" && !result.services.localstack) {
11851
11862
  result = {
11852
11863
  ...result,
@@ -12416,9 +12427,9 @@ program.command("secrets:push").description("Push secrets to remote provider (SS
12416
12427
  const globalOptions = program.opts();
12417
12428
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
12418
12429
  const { loadWorkspaceConfig: loadWorkspaceConfig$1 } = await import("./config.mjs");
12419
- const { pushSecrets: pushSecrets$1 } = await import("./sync-CYBVB64f.mjs");
12420
- const { reconcileMissingSecrets } = await import("./reconcile-BLh6rswz.mjs");
12421
- const { readStageSecrets: readStageSecrets$1, writeStageSecrets: writeStageSecrets$1 } = await import("./storage-mwbL7PhP.mjs");
12430
+ const { pushSecrets: pushSecrets$1 } = await import("./sync-COnAugP-.mjs");
12431
+ const { reconcileMissingSecrets } = await import("./reconcile-BjWhjfSp.mjs");
12432
+ const { readStageSecrets: readStageSecrets$1, writeStageSecrets: writeStageSecrets$1 } = await import("./storage-Cs4WBsc4.mjs");
12422
12433
  const { workspace } = await loadWorkspaceConfig$1();
12423
12434
  const secrets = await readStageSecrets$1(options.stage, workspace.root);
12424
12435
  if (secrets) {
@@ -12441,9 +12452,9 @@ program.command("secrets:pull").description("Pull secrets from remote provider (
12441
12452
  const globalOptions = program.opts();
12442
12453
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
12443
12454
  const { loadWorkspaceConfig: loadWorkspaceConfig$1 } = await import("./config.mjs");
12444
- const { pullSecrets: pullSecrets$1 } = await import("./sync-CYBVB64f.mjs");
12445
- const { writeStageSecrets: writeStageSecrets$1 } = await import("./storage-mwbL7PhP.mjs");
12446
- const { reconcileMissingSecrets } = await import("./reconcile-BLh6rswz.mjs");
12455
+ const { pullSecrets: pullSecrets$1 } = await import("./sync-COnAugP-.mjs");
12456
+ const { writeStageSecrets: writeStageSecrets$1 } = await import("./storage-Cs4WBsc4.mjs");
12457
+ const { reconcileMissingSecrets } = await import("./reconcile-BjWhjfSp.mjs");
12447
12458
  const { workspace } = await loadWorkspaceConfig$1();
12448
12459
  let secrets = await pullSecrets$1(options.stage, workspace);
12449
12460
  if (!secrets) {
@@ -12468,8 +12479,8 @@ program.command("secrets:reconcile").description("Backfill missing custom secret
12468
12479
  const globalOptions = program.opts();
12469
12480
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
12470
12481
  const { loadWorkspaceConfig: loadWorkspaceConfig$1 } = await import("./config.mjs");
12471
- const { reconcileMissingSecrets } = await import("./reconcile-BLh6rswz.mjs");
12472
- const { readStageSecrets: readStageSecrets$1, writeStageSecrets: writeStageSecrets$1 } = await import("./storage-mwbL7PhP.mjs");
12482
+ const { reconcileMissingSecrets } = await import("./reconcile-BjWhjfSp.mjs");
12483
+ const { readStageSecrets: readStageSecrets$1, writeStageSecrets: writeStageSecrets$1 } = await import("./storage-Cs4WBsc4.mjs");
12473
12484
  const { workspace } = await loadWorkspaceConfig$1();
12474
12485
  const secrets = await readStageSecrets$1(options.stage, workspace.root);
12475
12486
  if (!secrets) {