@geekmidas/cli 1.10.26 → 1.10.28

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 (35) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/FUNCTION_CRON_SUPPORT.md +2 -2
  3. package/dist/{fullstack-secrets-C6jD5nlK.mjs → fullstack-secrets-BDE7Sk93.mjs} +7 -3
  4. package/dist/fullstack-secrets-BDE7Sk93.mjs.map +1 -0
  5. package/dist/{fullstack-secrets-BsO5GyPi.cjs → fullstack-secrets-CsxU84eN.cjs} +7 -3
  6. package/dist/fullstack-secrets-CsxU84eN.cjs.map +1 -0
  7. package/dist/index.cjs +42 -85
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.mjs +42 -85
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/{openapi-BXuCY14q.cjs → openapi-CBU4TEi-.cjs} +23 -130
  12. package/dist/openapi-CBU4TEi-.cjs.map +1 -0
  13. package/dist/{openapi-DeG0ffQ8.mjs → openapi-CQCoLuzh.mjs} +24 -113
  14. package/dist/openapi-CQCoLuzh.mjs.map +1 -0
  15. package/dist/openapi.cjs +1 -1
  16. package/dist/openapi.mjs +1 -1
  17. package/dist/{reconcile-jfx0dsno.mjs → reconcile-BjWhjfSp.mjs} +2 -2
  18. package/dist/{reconcile-jfx0dsno.mjs.map → reconcile-BjWhjfSp.mjs.map} +1 -1
  19. package/dist/{reconcile-BJ_UqFLI.cjs → reconcile-DF8t4HC7.cjs} +2 -2
  20. package/dist/{reconcile-BJ_UqFLI.cjs.map → reconcile-DF8t4HC7.cjs.map} +1 -1
  21. package/package.json +3 -3
  22. package/src/credentials/index.ts +5 -4
  23. package/src/dev/index.ts +5 -100
  24. package/src/init/generators/docker.ts +8 -10
  25. package/src/init/generators/monorepo.ts +0 -3
  26. package/src/init/generators/package.ts +1 -4
  27. package/src/init/generators/web.ts +7 -3
  28. package/src/secrets/__tests__/generator.spec.ts +8 -3
  29. package/src/secrets/generator.ts +12 -4
  30. package/src/setup/__tests__/reconcile-secrets.spec.ts +11 -0
  31. package/src/setup/index.ts +20 -19
  32. package/dist/fullstack-secrets-BsO5GyPi.cjs.map +0 -1
  33. package/dist/fullstack-secrets-C6jD5nlK.mjs.map +0 -1
  34. package/dist/openapi-BXuCY14q.cjs.map +0 -1
  35. package/dist/openapi-DeG0ffQ8.mjs.map +0 -1
package/dist/index.mjs CHANGED
@@ -3,9 +3,9 @@ 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 { createStageSecrets, generateConnectionUrls, generateDbPassword, generateDbUrl, generateFullstackCustomSecrets, generateLocalStackCredentials, generatePgBossUrl, generateSecurePassword, generateServiceCredentials, rotateServicePassword, writeDockerEnvFromSecrets } from "./fullstack-secrets-C6jD5nlK.mjs";
6
+ import { createStageSecrets, generateConnectionUrls, generateDbPassword, generateDbUrl, generateFullstackCustomSecrets, generateLocalStackCredentials, generatePgBossUrl, generateSecurePassword, generateServiceCredentials, rotateServicePassword, writeDockerEnvFromSecrets } from "./fullstack-secrets-BDE7Sk93.mjs";
7
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";
8
+ import { ConstructGenerator, EndpointGenerator, OPENAPI_OUTPUT_PATH, generateOpenApi, isPartitionedRoutes, normalizeRoutes, openapiCommand, resolveOpenApiConfig } from "./openapi-CQCoLuzh.mjs";
9
9
  import { DokployApi } from "./dokploy-api-BIT0683o.mjs";
10
10
  import { encryptSecrets } from "./encryption-DSkIlEZ6.mjs";
11
11
  import { CachedStateProvider } from "./CachedStateProvider-C8A-cCm5.mjs";
@@ -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.25";
38
+ var version = "1.10.27";
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";
@@ -781,10 +781,10 @@ 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.POSTGRES_USER) {
784
+ if (!credentials.EVENT_PUBLISHER_CONNECTION_STRING && !credentials.EVENT_SUBSCRIBER_CONNECTION_STRING && credentials.PGBOSS_DB_USER) {
785
785
  const pgbossUrl = generatePgBossUrl({
786
- username: credentials.POSTGRES_USER,
787
- password: credentials.POSTGRES_PASSWORD ?? "",
786
+ username: credentials.PGBOSS_DB_USER,
787
+ password: credentials.PGBOSS_DB_PASSWORD ?? "",
788
788
  host: credentials.POSTGRES_HOST ?? "localhost",
789
789
  port: Number(credentials.POSTGRES_PORT ?? "5432"),
790
790
  database: credentials.POSTGRES_DB ?? "app"
@@ -1558,11 +1558,6 @@ async function workspaceDevCommand(workspace, options) {
1558
1558
  if (hasErrors) throw new Error("Frontend app validation failed. Fix the issues above and try again.");
1559
1559
  logger$11.log("✅ Frontend apps validated");
1560
1560
  }
1561
- if (frontendApps.length > 0 && backendApps.length > 0) {
1562
- const clientResults = await copyAllClients(workspace);
1563
- const copiedCount = clientResults.filter((r) => r.success).length;
1564
- if (copiedCount > 0) logger$11.log(`\n📦 Copied ${copiedCount} API client(s)`);
1565
- }
1566
1561
  const resolvedPorts = await resolveServicePorts(workspace.root);
1567
1562
  const rawSecrets = await loadDevSecrets(workspace);
1568
1563
  await startWorkspaceServices(workspace, resolvedPorts.dockerEnv, rawSecrets);
@@ -1625,50 +1620,11 @@ async function workspaceDevCommand(workspace, options) {
1625
1620
  env: turboEnv,
1626
1621
  detached: true
1627
1622
  });
1628
- let openApiWatcher = null;
1629
- if (frontendApps.length > 0 && backendApps.length > 0) {
1630
- const openApiPaths = [];
1631
- for (const [appName] of backendApps) {
1632
- const openApiPath = getBackendOpenApiPath(workspace, appName);
1633
- if (openApiPath) openApiPaths.push({
1634
- path: openApiPath,
1635
- appName
1636
- });
1637
- }
1638
- if (openApiPaths.length > 0) {
1639
- logger$11.log(`\n👀 Watching ${openApiPaths.length} backend OpenAPI spec(s) for changes`);
1640
- const pathToApp = new Map(openApiPaths.map((p) => [p.path, p.appName]));
1641
- openApiWatcher = chokidar.watch(openApiPaths.map((p) => p.path), {
1642
- persistent: true,
1643
- ignoreInitial: true,
1644
- depth: 0
1645
- });
1646
- let copyTimeout = null;
1647
- const handleChange = async (changedPath) => {
1648
- if (copyTimeout) clearTimeout(copyTimeout);
1649
- copyTimeout = setTimeout(async () => {
1650
- const backendAppName = pathToApp.get(changedPath);
1651
- if (!backendAppName) return;
1652
- logger$11.log(`\n🔄 OpenAPI spec changed for ${backendAppName}`);
1653
- try {
1654
- const results = await copyClientToFrontends(workspace, backendAppName, { silent: true });
1655
- for (const result of results) if (result.success) logger$11.log(` 📦 Copied client to ${result.frontendApp} (${result.endpointCount} endpoints)`);
1656
- else if (result.error) logger$11.error(` ❌ Failed to copy client to ${result.frontendApp}: ${result.error}`);
1657
- } catch (error) {
1658
- logger$11.error(` ❌ Failed to copy clients: ${error.message}`);
1659
- }
1660
- }, 200);
1661
- };
1662
- openApiWatcher.on("change", handleChange);
1663
- openApiWatcher.on("add", handleChange);
1664
- }
1665
- }
1666
1623
  let isShuttingDown = false;
1667
1624
  const shutdown = () => {
1668
1625
  if (isShuttingDown) return;
1669
1626
  isShuttingDown = true;
1670
1627
  logger$11.log("\n🛑 Shutting down workspace...");
1671
- if (openApiWatcher) openApiWatcher.close().catch(() => {});
1672
1628
  const pid = turboProcess.pid;
1673
1629
  if (pid) try {
1674
1630
  process.kill(-pid, "SIGTERM");
@@ -1696,7 +1652,6 @@ async function workspaceDevCommand(workspace, options) {
1696
1652
  reject(error);
1697
1653
  });
1698
1654
  turboProcess.on("exit", (code) => {
1699
- if (openApiWatcher) openApiWatcher.close().catch(() => {});
1700
1655
  if (code !== null && code !== 0) reject(new Error(`Turbo exited with code ${code}`));
1701
1656
  else resolve$1();
1702
1657
  });
@@ -7504,7 +7459,7 @@ function generateDockerEnv(apps, eventsBackend) {
7504
7459
  const envVar = `${app.name.toUpperCase()}_DB_PASSWORD`;
7505
7460
  return `${envVar}=${app.password}`;
7506
7461
  });
7507
- if (eventsBackend === "pgboss") envVars.push(`PGBOSS_DB_PASSWORD=pgboss-dev-password`);
7462
+ envVars.push(`PGBOSS_DB_PASSWORD=pgboss-dev-password`);
7508
7463
  return `# Auto-generated docker environment file
7509
7464
  # Contains database passwords for docker-compose postgres init
7510
7465
  # This file is gitignored - do not commit to version control
@@ -7565,8 +7520,7 @@ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-E
7565
7520
  EOSQL
7566
7521
  `;
7567
7522
  });
7568
- let pgbossBlock = "";
7569
- if (eventsBackend === "pgboss") pgbossBlock = `
7523
+ const pgbossBlock = `
7570
7524
  # Create pgboss user with dedicated schema - idempotent
7571
7525
  echo "Creating pgboss user and schema..."
7572
7526
  psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
@@ -7602,7 +7556,8 @@ set -e
7602
7556
  # Auto-generated PostgreSQL init script (idempotent - safe to re-run)
7603
7557
  # Creates per-app users with separate schemas in a single database
7604
7558
  # - api: uses public schema
7605
- # - auth: uses auth schema (search_path=auth)${eventsBackend === "pgboss" ? "\n# - pgboss: uses pgboss schema for event processing" : ""}
7559
+ # - auth: uses auth schema (search_path=auth)
7560
+ # - pgboss: uses pgboss schema for event processing
7606
7561
  ${extensions}
7607
7562
  ${userCreations.join("\n")}${pgbossBlock}
7608
7563
  echo "Database initialization complete!"
@@ -8104,9 +8059,6 @@ export default defineWorkspace({
8104
8059
  client: './src/config/client.ts',
8105
8060
  server: './src/config/server.ts',
8106
8061
  },
8107
- client: {
8108
- output: './src/api',
8109
- },
8110
8062
  },
8111
8063
  },
8112
8064
  shared: {
@@ -9179,10 +9131,7 @@ function generatePackageJson(options, template) {
9179
9131
  version: "0.0.1",
9180
9132
  private: true,
9181
9133
  type: "module",
9182
- exports: { "./client": {
9183
- types: OPENAPI_OUTPUT_PATH$1,
9184
- import: OPENAPI_OUTPUT_PATH$1
9185
- } },
9134
+ exports: { "./client": OPENAPI_OUTPUT_PATH$1 },
9186
9135
  scripts: scripts$1,
9187
9136
  dependencies: sortObject(dependencies$1),
9188
9137
  devDependencies: sortObject(devDependencies$1)
@@ -10736,6 +10685,7 @@ storybook-static/
10736
10685
  function generateWebAppFiles(options) {
10737
10686
  if (!options.monorepo || options.template !== "fullstack") return [];
10738
10687
  const packageName = `@${options.name}/web`;
10688
+ const apiPackage = `@${options.name}/api`;
10739
10689
  const modelsPackage = `@${options.name}/models`;
10740
10690
  const uiPackage = `@${options.name}/ui`;
10741
10691
  const packageJson = {
@@ -10750,6 +10700,7 @@ function generateWebAppFiles(options) {
10750
10700
  typecheck: "tsc --noEmit"
10751
10701
  },
10752
10702
  dependencies: {
10703
+ [apiPackage]: "workspace:*",
10753
10704
  [modelsPackage]: "workspace:*",
10754
10705
  [uiPackage]: "workspace:*",
10755
10706
  "@geekmidas/client": GEEKMIDAS_VERSIONS["@geekmidas/client"],
@@ -10776,7 +10727,7 @@ function generateWebAppFiles(options) {
10776
10727
  const nextConfig: NextConfig = {
10777
10728
  output: 'standalone',
10778
10729
  reactStrictMode: true,
10779
- transpilePackages: ['${modelsPackage}', '${uiPackage}'],
10730
+ transpilePackages: ['${apiPackage}', '${modelsPackage}', '${uiPackage}'],
10780
10731
  };
10781
10732
 
10782
10733
  export default nextConfig;
@@ -10811,6 +10762,7 @@ export default nextConfig;
10811
10762
  baseUrl: ".",
10812
10763
  paths: {
10813
10764
  "~/*": ["./src/*", "../../packages/ui/src/*"],
10765
+ [`${apiPackage}/client`]: ["../../apps/api/.gkm/openapi.ts"],
10814
10766
  [`${modelsPackage}`]: ["../../packages/models/src"],
10815
10767
  [`${modelsPackage}/*`]: ["../../packages/models/src/*"],
10816
10768
  [`${uiPackage}`]: ["../../packages/ui/src"],
@@ -10824,7 +10776,11 @@ export default nextConfig;
10824
10776
  ".next/types/**/*.ts"
10825
10777
  ],
10826
10778
  exclude: ["node_modules"],
10827
- references: [{ path: "../../packages/ui" }, { path: "../../packages/models" }]
10779
+ references: [
10780
+ { path: "../../apps/api" },
10781
+ { path: "../../packages/ui" },
10782
+ { path: "../../packages/models" }
10783
+ ]
10828
10784
  };
10829
10785
  const queryClientTs = `import { QueryClient } from '@tanstack/react-query';
10830
10786
 
@@ -10903,7 +10859,7 @@ export function Providers({ children }: { children: React.ReactNode }) {
10903
10859
  );
10904
10860
  }
10905
10861
  `;
10906
- const apiIndexTs = `import { createApi } from './api.ts';
10862
+ const apiIndexTs = `import { createApi } from '${apiPackage}/client';
10907
10863
  import { getQueryClient } from '~/lib/query-client.ts';
10908
10864
  import { clientConfig } from '~/config/client.ts';
10909
10865
 
@@ -11837,26 +11793,27 @@ function reconcileSecrets(secrets, workspace) {
11837
11793
  logger$1.log(` 🔄 Adding missing service credentials: ${name$1}`);
11838
11794
  changed = true;
11839
11795
  }
11796
+ if (result.services.postgres && !result.services.pgboss) {
11797
+ result = {
11798
+ ...result,
11799
+ services: {
11800
+ ...result.services,
11801
+ pgboss: {
11802
+ host: result.services.postgres.host,
11803
+ port: result.services.postgres.port,
11804
+ username: "pgboss",
11805
+ password: generateSecurePassword(),
11806
+ database: result.services.postgres.database ?? "app"
11807
+ }
11808
+ }
11809
+ };
11810
+ result.urls = generateConnectionUrls(result.services, result.eventsBackend);
11811
+ logger$1.log(" 🔄 Adding missing service credentials: pgboss");
11812
+ changed = true;
11813
+ }
11840
11814
  const eventsBackend = workspace.services.events;
11841
11815
  if (eventsBackend && result.eventsBackend !== eventsBackend) {
11842
11816
  result.eventsBackend = eventsBackend;
11843
- if (eventsBackend === "pgboss" && !result.services.pgboss) {
11844
- result = {
11845
- ...result,
11846
- services: {
11847
- ...result.services,
11848
- pgboss: {
11849
- host: result.services.postgres?.host ?? "localhost",
11850
- port: result.services.postgres?.port ?? 5432,
11851
- username: "pgboss",
11852
- password: generateSecurePassword(),
11853
- database: result.services.postgres?.database ?? "app"
11854
- }
11855
- }
11856
- };
11857
- logger$1.log(" 🔄 Adding missing service credentials: pgboss");
11858
- changed = true;
11859
- }
11860
11817
  if (eventsBackend === "sns" && !result.services.localstack) {
11861
11818
  result = {
11862
11819
  ...result,
@@ -12427,7 +12384,7 @@ program.command("secrets:push").description("Push secrets to remote provider (SS
12427
12384
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
12428
12385
  const { loadWorkspaceConfig: loadWorkspaceConfig$1 } = await import("./config.mjs");
12429
12386
  const { pushSecrets: pushSecrets$1 } = await import("./sync-COnAugP-.mjs");
12430
- const { reconcileMissingSecrets } = await import("./reconcile-jfx0dsno.mjs");
12387
+ const { reconcileMissingSecrets } = await import("./reconcile-BjWhjfSp.mjs");
12431
12388
  const { readStageSecrets: readStageSecrets$1, writeStageSecrets: writeStageSecrets$1 } = await import("./storage-Cs4WBsc4.mjs");
12432
12389
  const { workspace } = await loadWorkspaceConfig$1();
12433
12390
  const secrets = await readStageSecrets$1(options.stage, workspace.root);
@@ -12453,7 +12410,7 @@ program.command("secrets:pull").description("Pull secrets from remote provider (
12453
12410
  const { loadWorkspaceConfig: loadWorkspaceConfig$1 } = await import("./config.mjs");
12454
12411
  const { pullSecrets: pullSecrets$1 } = await import("./sync-COnAugP-.mjs");
12455
12412
  const { writeStageSecrets: writeStageSecrets$1 } = await import("./storage-Cs4WBsc4.mjs");
12456
- const { reconcileMissingSecrets } = await import("./reconcile-jfx0dsno.mjs");
12413
+ const { reconcileMissingSecrets } = await import("./reconcile-BjWhjfSp.mjs");
12457
12414
  const { workspace } = await loadWorkspaceConfig$1();
12458
12415
  let secrets = await pullSecrets$1(options.stage, workspace);
12459
12416
  if (!secrets) {
@@ -12478,7 +12435,7 @@ program.command("secrets:reconcile").description("Backfill missing custom secret
12478
12435
  const globalOptions = program.opts();
12479
12436
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
12480
12437
  const { loadWorkspaceConfig: loadWorkspaceConfig$1 } = await import("./config.mjs");
12481
- const { reconcileMissingSecrets } = await import("./reconcile-jfx0dsno.mjs");
12438
+ const { reconcileMissingSecrets } = await import("./reconcile-BjWhjfSp.mjs");
12482
12439
  const { readStageSecrets: readStageSecrets$1, writeStageSecrets: writeStageSecrets$1 } = await import("./storage-Cs4WBsc4.mjs");
12483
12440
  const { workspace } = await loadWorkspaceConfig$1();
12484
12441
  const secrets = await readStageSecrets$1(options.stage, workspace.root);