@geekmidas/cli 10.0.0-alpha.50 → 10.0.0-alpha.52

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 (67) hide show
  1. package/dist/{backends-B9V2XD2M.cjs → backends-BXcwhb7p.cjs} +2 -2
  2. package/dist/{backends-B9V2XD2M.cjs.map → backends-BXcwhb7p.cjs.map} +1 -1
  3. package/dist/{backends-CSuLl0YP.mjs → backends-CLq1wlQf.mjs} +2 -2
  4. package/dist/{backends-CSuLl0YP.mjs.map → backends-CLq1wlQf.mjs.map} +1 -1
  5. package/dist/{config-CsYSyUya.cjs → config-Cvr5fCbn.cjs} +3 -2
  6. package/dist/config-Cvr5fCbn.cjs.map +1 -0
  7. package/dist/{config-D8J5rrTb.mjs → config-SOkDH-n1.mjs} +3 -2
  8. package/dist/config-SOkDH-n1.mjs.map +1 -0
  9. package/dist/config.cjs +2 -2
  10. package/dist/config.d.cts +2 -2
  11. package/dist/config.d.mts +2 -2
  12. package/dist/config.mjs +2 -2
  13. package/dist/{encryption-DyQnPsZN.mjs → encryption-Cv-Ej9vR.mjs} +4 -4
  14. package/dist/{encryption-DyQnPsZN.mjs.map → encryption-Cv-Ej9vR.mjs.map} +1 -1
  15. package/dist/{encryption-C7OGMve_.cjs → encryption-DCsdx4Po.cjs} +4 -4
  16. package/dist/{encryption-C7OGMve_.cjs.map → encryption-DCsdx4Po.cjs.map} +1 -1
  17. package/dist/{github-BrI1tv6u.cjs → github-BGx4U61b.cjs} +3 -3
  18. package/dist/{github-BrI1tv6u.cjs.map → github-BGx4U61b.cjs.map} +1 -1
  19. package/dist/{github-BfpadQWQ.mjs → github-U_frvZgD.mjs} +3 -3
  20. package/dist/{github-BfpadQWQ.mjs.map → github-U_frvZgD.mjs.map} +1 -1
  21. package/dist/{index-BQhJXpaQ.d.mts → index-DYh5TrsZ.d.mts} +2 -2
  22. package/dist/{index-BQhJXpaQ.d.mts.map → index-DYh5TrsZ.d.mts.map} +1 -1
  23. package/dist/{index-DHJePE0y.d.cts → index-fU3qHy7c.d.cts} +2 -2
  24. package/dist/{index-DHJePE0y.d.cts.map → index-fU3qHy7c.d.cts.map} +1 -1
  25. package/dist/index.cjs +95 -83
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.mjs +95 -83
  28. package/dist/index.mjs.map +1 -1
  29. package/dist/{migrate-CNlew9Ek.cjs → migrate-DCxK1NRd.cjs} +4 -4
  30. package/dist/{migrate-CNlew9Ek.cjs.map → migrate-DCxK1NRd.cjs.map} +1 -1
  31. package/dist/{migrate-B00XpVaO.mjs → migrate-DmabhO_N.mjs} +4 -4
  32. package/dist/{migrate-B00XpVaO.mjs.map → migrate-DmabhO_N.mjs.map} +1 -1
  33. package/dist/openapi.cjs +1 -1
  34. package/dist/openapi.d.cts +1 -1
  35. package/dist/openapi.d.mts +1 -1
  36. package/dist/openapi.mjs +1 -1
  37. package/dist/{ready-lr2Fm-ep.cjs → ready-ClUpTxoL.cjs} +14 -2
  38. package/dist/ready-ClUpTxoL.cjs.map +1 -0
  39. package/dist/{ready-WfT-eWlm.mjs → ready-tQLNHNya.mjs} +15 -3
  40. package/dist/ready-tQLNHNya.mjs.map +1 -0
  41. package/dist/reconcile/public.d.cts +1 -1
  42. package/dist/reconcile/public.d.mts +1 -1
  43. package/dist/{types-BbrNu83u.d.mts → types-CT0ymlBk.d.mts} +25 -24
  44. package/dist/{types-BbrNu83u.d.mts.map → types-CT0ymlBk.d.mts.map} +1 -1
  45. package/dist/{types-DNqEsctD.d.cts → types-DYDT4FfE.d.cts} +25 -24
  46. package/dist/{types-DNqEsctD.d.cts.map → types-DYDT4FfE.d.cts.map} +1 -1
  47. package/dist/vitest.cjs +1 -1
  48. package/dist/vitest.mjs +1 -1
  49. package/dist/workspace/index.cjs +1 -1
  50. package/dist/workspace/index.d.cts +2 -2
  51. package/dist/workspace/index.d.mts +2 -2
  52. package/dist/workspace/index.mjs +1 -1
  53. package/dist/{workspace-j6ZxvJqq.cjs → workspace-BEGUDNwK.cjs} +17 -6
  54. package/dist/workspace-BEGUDNwK.cjs.map +1 -0
  55. package/dist/{workspace-DEibcoBe.cjs → workspace-BcCiLzTO.cjs} +4 -4
  56. package/dist/{workspace-DEibcoBe.cjs.map → workspace-BcCiLzTO.cjs.map} +1 -1
  57. package/dist/{workspace-DNzWgM1J.mjs → workspace-bOsks1uk.mjs} +4 -4
  58. package/dist/{workspace-DNzWgM1J.mjs.map → workspace-bOsks1uk.mjs.map} +1 -1
  59. package/dist/{workspace-BsbxbqV-.mjs → workspace-fa5H6l7D.mjs} +17 -6
  60. package/dist/workspace-fa5H6l7D.mjs.map +1 -0
  61. package/package.json +14 -14
  62. package/dist/config-CsYSyUya.cjs.map +0 -1
  63. package/dist/config-D8J5rrTb.mjs.map +0 -1
  64. package/dist/ready-WfT-eWlm.mjs.map +0 -1
  65. package/dist/ready-lr2Fm-ep.cjs.map +0 -1
  66. package/dist/workspace-BsbxbqV-.mjs.map +0 -1
  67. package/dist/workspace-j6ZxvJqq.cjs.map +0 -1
package/dist/index.mjs CHANGED
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env -S npx tsx
2
2
  import { n as __require, t as __exportAll } from "./rolldown-runtime-BhDjJH2R.mjs";
3
3
  import { i as ConstructGenerator, t as discover } from "./discover-Cf2jAcgF.mjs";
4
- import { d as parseModuleConfig, f as appKey, l as loadWorkspaceConfig, n as NotABackendApp, o as loadAppConfig, p as derivedApps, r as NotInAnApp, s as loadConfig, t as ConfigNotFound, u as loadWorkspaceSettings } from "./config-D8J5rrTb.mjs";
5
- import { D as assertDeployedStage, E as TEST_STAGE, O as deployedProblems, T as InvalidStages, a as getAppBuildOrder, b as getDeployTargetError, k as stageProblems, m as stripPublicPrefix, o as getAppGkmConfig, p as getPublicEnvPrefix, t as allConstructGlobs, x as isDeployTargetSupported } from "./workspace-DNzWgM1J.mjs";
4
+ import { d as parseModuleConfig, f as appKey, l as loadWorkspaceConfig, n as NotABackendApp, o as loadAppConfig, p as derivedApps, r as NotInAnApp, s as loadConfig, t as ConfigNotFound, u as loadWorkspaceSettings } from "./config-SOkDH-n1.mjs";
5
+ import { D as assertDeployedStage, E as TEST_STAGE, O as deployedProblems, T as InvalidStages, a as getAppBuildOrder, b as getDeployTargetError, k as stageProblems, m as stripPublicPrefix, o as getAppGkmConfig, p as getPublicEnvPrefix, t as allConstructGlobs, x as isDeployTargetSupported } from "./workspace-bOsks1uk.mjs";
6
6
  import { a as withCustomSecret, i as toEmbeddableSecrets, n as maskPassword, t as initStageSecrets } from "./storage-BzaUxmqe.mjs";
7
7
  import { a as getKeyPath, i as FileSecretsStore, n as secretsStoreFor } from "./store-DeGATCS-.mjs";
8
- import { C as loadEnvFiles, S as isPortAvailable, T as prepareEntryCredentials, _ as fakeKey, a as reconcileWorkspace, b as createEntryWrapper, c as LOCAL_CA_PATH, d as postgresDatabaseNames, f as quoteIdentifier, g as describeServices, h as rootSite, i as derivedContainers, l as forgetState, m as resourceName, n as backendsOf$1, p as pgClient, r as constructGlobs, s as COMPOSE_PATH, t as FAKE_ENV, u as applyPostgres, v as primaryPortKey, w as loadSecretsForApp, x as findAvailablePort, y as createCredentialsPreload } from "./workspace-BsbxbqV-.mjs";
8
+ import { C as loadEnvFiles, S as isPortAvailable, T as prepareEntryCredentials, _ as fakeKey, a as reconcileWorkspace, b as createEntryWrapper, c as LOCAL_CA_PATH, d as postgresDatabaseNames, f as quoteIdentifier, g as describeServices, h as rootSite, i as derivedContainers, l as forgetState, m as resourceName, n as backendsOf$1, p as pgClient, r as constructGlobs, s as COMPOSE_PATH, t as FAKE_ENV, u as applyPostgres, v as primaryPortKey, w as loadSecretsForApp, x as findAvailablePort, y as createCredentialsPreload } from "./workspace-fa5H6l7D.mjs";
9
9
  import { n as EndpointGenerator, r as runtimeFor } from "./OpenApiTsGenerator-BzIGy8KE.mjs";
10
10
  import { generateOpenApi, openapiCommand, resolveOpenApiConfig } from "./openapi.mjs";
11
- import { a as writeTestHarness, c as driversFor, i as TEST_MANIFEST_ENV, n as TEST_READY_FILE, o as SubscriberGenerator, s as cacheBackendsIn, t as TEST_READY_ENV } from "./ready-WfT-eWlm.mjs";
12
- import { i as storageBackendFor, n as eventsBackendFor, r as providerOf, t as cacheBackendFor } from "./backends-CSuLl0YP.mjs";
11
+ import { a as writeTestHarness, c as driversFor, i as TEST_MANIFEST_ENV, n as TEST_READY_FILE, o as SubscriberGenerator, s as cacheBackendsIn, t as TEST_READY_ENV } from "./ready-tQLNHNya.mjs";
12
+ import { i as storageBackendFor, n as eventsBackendFor, r as providerOf, t as cacheBackendFor } from "./backends-CLq1wlQf.mjs";
13
13
  import { n as withCompute, r as withRoutes, t as manifestModule } from "./emit-C1e8qD08.mjs";
14
14
  import { createRequire } from "node:module";
15
15
  import { Command } from "commander";
@@ -42,7 +42,7 @@ import { Queue } from "@geekmidas/constructs/queue";
42
42
  import { Topic } from "@geekmidas/constructs/topic";
43
43
  import { lookup } from "node:dns/promises";
44
44
  //#region package.json
45
- var version = "10.0.0-alpha.50";
45
+ var version = "10.0.0-alpha.52";
46
46
  //#endregion
47
47
  //#region src/auth/credentials.ts
48
48
  /**
@@ -1725,9 +1725,9 @@ async function workspaceDevCommand(configured, options) {
1725
1725
  for (const { id, port } of fakes) logger$9.log(`🎭 ${id} fake: http://localhost:${port}`);
1726
1726
  logger$9.log(options.migrate || options.seed ? "🗄️ Migrating the databases" : "🗄️ Checking for pending migrations");
1727
1727
  if (options.migrate || options.seed) {
1728
- const { prepareDevDatabases } = await import("./migrate-B00XpVaO.mjs");
1728
+ const { prepareDevDatabases } = await import("./migrate-DmabhO_N.mjs");
1729
1729
  await prepareDevDatabases(workspace, reconciled.env, { seed: !!options.seed });
1730
- } else await import("./migrate-B00XpVaO.mjs").then(({ reportPendingMigrations }) => reportPendingMigrations(workspace, reconciled.env)).catch((error) => {
1730
+ } else await import("./migrate-DmabhO_N.mjs").then(({ reportPendingMigrations }) => reportPendingMigrations(workspace, reconciled.env)).catch((error) => {
1731
1731
  logger$9.log(`⚠️ Could not check for pending migrations: ${error instanceof Error ? error.message : String(error)}`);
1732
1732
  });
1733
1733
  const appUrls = {};
@@ -2310,7 +2310,7 @@ var CronGenerator = class extends ConstructGenerator {
2310
2310
  */
2311
2311
  import type { EnvironmentParser } from '@geekmidas/envkit';
2312
2312
  import type { Logger } from '@geekmidas/logger';
2313
- import { toCronExpression } from '@geekmidas/constructs/crons';
2313
+ import { runCron, scheduleInProcess, toCronExpression } from '@geekmidas/constructs/crons';
2314
2314
  import { ServiceDiscovery } from '@geekmidas/services';
2315
2315
  ${Array.from(importsByFile.entries()).map(([importPath, exports]) => `import { ${exports.join(", ")} } from '${importPath}';`).join("\n")}
2316
2316
 
@@ -2351,11 +2351,10 @@ export async function setupCrons(
2351
2351
 
2352
2352
  const run = async (entry: (typeof prepared)[number]) => {
2353
2353
  try {
2354
- await entry.cron.handler({
2355
- input: undefined,
2356
- services: entry.services,
2357
- logger: entry.cron.logger,
2358
- });
2354
+ // The cron's own function, the way its Lambda would run it — services,
2355
+ // the worker's database as \`db\`, its events. It used to call a
2356
+ // \`handler\` a Cron does not have, so every firing logged a failure.
2357
+ await runCron(entry.cron, serviceDiscovery);
2359
2358
  } catch (error) {
2360
2359
  logger.error({ error, cron: entry.name }, 'Cron failed');
2361
2360
  }
@@ -2366,13 +2365,28 @@ export async function setupCrons(
2366
2365
  // memory fires each job once per replica — so the schedule lives in
2367
2366
  // Postgres. It used to be a second pg-boss on the worker's database, as the
2368
2367
  // runtime role, which can neither create a schema nor use the broker's.
2369
- const { url } = envParser
2368
+ const { url, devPid } = envParser
2370
2369
  .create((get) => ({
2371
2370
  url: get('EVENT_PUBLISHER_CONNECTION_STRING').string().optional(),
2371
+ // Set by \`gkm dev\` on the server it starts, and by nothing deployed.
2372
+ devPid: get('GKM_DEV_PID').string().optional(),
2372
2373
  }))
2373
2374
  .parse();
2374
2375
 
2375
2376
  if (!url?.startsWith('pgboss://')) {
2377
+ // \`gkm dev\` on a target whose crons are infrastructure once deployed —
2378
+ // EventBridge rules on AWS — has no broker to keep a schedule in. It is one
2379
+ // process, so a timer fires each job once, which is all pg-boss is for
2380
+ // here. Only there: a deployed server firing by timer fires once per
2381
+ // replica, so outside dev this stays the error below.
2382
+ if (devPid) {
2383
+ for (const entry of prepared) {
2384
+ running.push(scheduleInProcess(entry.schedule, () => run(entry)));
2385
+ logger.info({ cron: entry.name, schedule: entry.schedule }, 'Cron scheduled in this process');
2386
+ }
2387
+ return;
2388
+ }
2389
+
2376
2390
  logger.error(
2377
2391
  { crons: prepared.map(({ name }) => name) },
2378
2392
  'These crons have nowhere to keep their schedule. On a server they are ' +
@@ -3991,7 +4005,7 @@ async function provisionDeclared(options) {
3991
4005
  cache: cacheBackendFor(providerOf(workspace)),
3992
4006
  events: eventsBackendFor(providerOf(workspace)),
3993
4007
  storage: storageBackendFor(providerOf(workspace)),
3994
- addresses: surfaceAddresses(workspace, manifest, options.appUrls),
4008
+ addresses: surfaceAddresses(manifest, options.appUrls),
3995
4009
  seed: options.seed,
3996
4010
  ...options.supplied ? { supplied: options.supplied } : {},
3997
4011
  deferred: [],
@@ -4053,25 +4067,20 @@ function carriersLast(ordered, manifest) {
4053
4067
  return [...ordered.filter((id) => !carries(id)), ...ordered.filter(carries)];
4054
4068
  }
4055
4069
  /**
4056
- * Where each declared surface answers.
4057
- *
4058
- * Every `rest-api` in a process answers on that process's address, so an app
4059
- * serving both its own API and an auth server publishes one address twice —
4060
- * which is exactly what it does at runtime, and the same rule the local target
4061
- * applies.
4070
+ * Where each declared surface answers: its own app's address.
4062
4071
  *
4063
- * A workspace with two backends is the case this does not answer, and the
4064
- * manifest cannot yet: which surface belongs to which app is what §2's endpoint
4065
- * merge would record. Until then the first backend's address is used, and a
4066
- * second backend's surfaces would be wrong rather than missing — worth knowing
4067
- * before relying on it.
4072
+ * Every surface is an app of its own, keyed by its id the way the derivation
4073
+ * keyed it — `Api` is `api`, `Webhooks` is `webhooks` — and answers on that
4074
+ * app's host, `{subdomain}.{domain}`. It used to be handed the first backend's
4075
+ * address, so a workspace with two APIs pointed both at the same one.
4068
4076
  */
4069
- function surfaceAddresses(workspace, manifest, appUrls) {
4077
+ function surfaceAddresses(manifest, appUrls) {
4070
4078
  const addresses = {};
4071
- const backend = Object.entries(workspace.apps).find(([, app]) => app.type === "backend");
4072
- const url = backend ? appUrls[backend[0]] : void 0;
4073
- if (!url) return addresses;
4074
- for (const [id, declaration] of Object.entries(manifest)) if (declaration.kind === "rest-api") addresses[id] = url;
4079
+ for (const [id, declaration] of Object.entries(manifest)) {
4080
+ if (declaration.kind !== "rest-api") continue;
4081
+ const url = appUrls[appKey(id)];
4082
+ if (url) addresses[id] = url;
4083
+ }
4075
4084
  return addresses;
4076
4085
  }
4077
4086
  //#endregion
@@ -4550,32 +4559,34 @@ async function verifyDnsRecords(appHostnames, serverIp, state) {
4550
4559
  }
4551
4560
  //#endregion
4552
4561
  //#region src/deploy/domain.ts
4562
+ /** A stage was deployed that `deploy.domains` gives no domain. */
4563
+ var NoDomainForStage = class extends Error {
4564
+ stage;
4565
+ constructor(stage) {
4566
+ super(`No domain for stage "${stage}". Add it to gkm.config.ts: deploy: { domains: { ${stage}: 'example.com' } }.`);
4567
+ this.stage = stage;
4568
+ this.name = "NoDomainForStage";
4569
+ }
4570
+ };
4553
4571
  /**
4554
- * Resolve the hostname for an app based on stage configuration.
4572
+ * The hostname an app answers on for a stage.
4555
4573
  *
4556
- * Domain resolution priority:
4557
- * 1. Explicit app.domain override (string or stage-specific)
4558
- * 2. Default pattern based on app type:
4559
- * - Main frontend app gets base domain (e.g., 'myapp.com')
4560
- * - Other apps get prefixed domain (e.g., 'api.myapp.com')
4574
+ * 1. An explicit `app.domain` — a string, or one per stage — wins.
4575
+ * 2. Otherwise from the stage's base domain in `deploy.domains`: the root site
4576
+ * answers on the domain itself, and every other app on
4577
+ * `{subdomain}.{domain}` — its declaration's `subdomain`, or its own name.
4561
4578
  *
4562
- * @param appName - The name of the app
4563
- * @param app - The normalized app configuration
4564
- * @param stage - The deployment stage (e.g., 'production', 'development')
4565
- * @param dokployConfig - Dokploy workspace configuration with domain mappings
4566
- * @param isMainFrontend - Whether this is the main frontend app
4567
- * @returns The resolved hostname for the app
4568
- * @throws Error if no domain configuration is found for the stage
4579
+ * @throws {NoDomainForStage} when `deploy.domains` names no domain for it
4569
4580
  */
4570
- function resolveHost(appName, app, stage, dokployConfig, isMainFrontend) {
4581
+ function resolveHost(appName, app, stage, domains, isMainFrontend) {
4571
4582
  if (app.domain) {
4572
4583
  if (typeof app.domain === "string") return app.domain;
4573
4584
  if (app.domain[stage]) return app.domain[stage];
4574
4585
  }
4575
- const baseDomain = dokployConfig?.domains?.[stage];
4576
- if (!baseDomain) throw new Error(`No domain configured for stage "${stage}". Add deploy.dokploy.domains.${stage} to gkm.config.ts`);
4586
+ const baseDomain = domains?.[stage];
4587
+ if (!baseDomain) throw new NoDomainForStage(stage);
4577
4588
  if (isMainFrontend) return baseDomain;
4578
- return `${appName}.${baseDomain}`;
4589
+ return `${app.subdomain ?? appName}.${baseDomain}`;
4579
4590
  }
4580
4591
  /**
4581
4592
  * Whether this app is the site the base domain points at — see `rootSite`,
@@ -7600,7 +7611,6 @@ async function workspaceDeployCommand(configured, options) {
7600
7611
  if (skippedMobileApps.length > 0) logger$4.log(`\n📱 Skipping ${skippedMobileApps.length} mobile app(s) — deploy via framework toolchain: ${skippedMobileApps.join(", ")}`);
7601
7612
  const backendApps = appsToDeployNames.filter((name) => workspace.apps[name].type === "backend");
7602
7613
  const frontendApps = appsToDeployNames.filter((name) => workspace.apps[name].type === "web");
7603
- const dokployConfig = workspace.deploy.dokploy;
7604
7614
  let declaredEnv = {};
7605
7615
  let declaredClusters = {};
7606
7616
  {
@@ -7609,7 +7619,7 @@ async function workspaceDeployCommand(configured, options) {
7609
7619
  for (const appName of backendApps) {
7610
7620
  const app = workspace.apps[appName];
7611
7621
  if (!app) continue;
7612
- appUrls[appName] = `https://${resolveHost(appName, app, stage, dokployConfig, false)}`;
7622
+ appUrls[appName] = `https://${resolveHost(appName, app, stage, workspace.deploy?.domains, false)}`;
7613
7623
  }
7614
7624
  const declared = await provisionDeclared({
7615
7625
  api,
@@ -7673,7 +7683,8 @@ async function workspaceDeployCommand(configured, options) {
7673
7683
  const frontendUrls = [];
7674
7684
  for (const appName of frontendApps) {
7675
7685
  const app = workspace.apps[appName];
7676
- const hostname = resolveHost(appName, app, stage, dokployConfig, isMainFrontendApp(appName, app, workspace.apps));
7686
+ const isMainFrontend = isMainFrontendApp(appName, app, workspace.apps);
7687
+ const hostname = resolveHost(appName, app, stage, workspace.deploy?.domains, isMainFrontend);
7677
7688
  frontendUrls.push(`https://${hostname}`);
7678
7689
  }
7679
7690
  if (backendApps.length > 0) {
@@ -7719,7 +7730,7 @@ async function workspaceDeployCommand(configured, options) {
7719
7730
  },
7720
7731
  buildArgs
7721
7732
  });
7722
- const backendHost = resolveHost(appName, app, stage, dokployConfig, false);
7733
+ const backendHost = resolveHost(appName, app, stage, workspace.deploy?.domains, false);
7723
7734
  const dependencyUrls = {};
7724
7735
  if (app.dependencies) {
7725
7736
  for (const dep of app.dependencies) if (publicUrls[dep]) dependencyUrls[dep] = publicUrls[dep];
@@ -7824,7 +7835,8 @@ async function workspaceDeployCommand(configured, options) {
7824
7835
  if (app.dependencies) {
7825
7836
  for (const dep of app.dependencies) if (publicUrls[dep]) dependencyUrls[dep] = publicUrls[dep];
7826
7837
  }
7827
- const frontendHost = resolveHost(appName, app, stage, dokployConfig, isMainFrontendApp(appName, app, workspace.apps));
7838
+ const isMainFrontend = isMainFrontendApp(appName, app, workspace.apps);
7839
+ const frontendHost = resolveHost(appName, app, stage, workspace.deploy?.domains, isMainFrontend);
7828
7840
  const envContext = {
7829
7841
  app,
7830
7842
  appName,
@@ -9316,26 +9328,26 @@ function loadPackageJson() {
9316
9328
  * Run: pnpm --filter @geekmidas/cli sync-versions
9317
9329
  */
9318
9330
  const GEEKMIDAS_VERSIONS = {
9319
- "@geekmidas/audit": "~10.0.0-alpha.50",
9320
- "@geekmidas/auth": "~10.0.0-alpha.50",
9321
- "@geekmidas/cache": "~10.0.0-alpha.50",
9322
- "@geekmidas/client": "~10.0.0-alpha.50",
9323
- "@geekmidas/cloud": "~10.0.0-alpha.50",
9324
- "@geekmidas/constructs": "~10.0.0-alpha.50",
9325
- "@geekmidas/db": "~10.0.0-alpha.50",
9326
- "@geekmidas/emailkit": "~10.0.0-alpha.50",
9327
- "@geekmidas/envkit": "~10.0.0-alpha.50",
9328
- "@geekmidas/errors": "~10.0.0-alpha.50",
9329
- "@geekmidas/events": "~10.0.0-alpha.50",
9330
- "@geekmidas/logger": "~10.0.0-alpha.50",
9331
- "@geekmidas/manifest": "~10.0.0-alpha.50",
9332
- "@geekmidas/rate-limit": "~10.0.0-alpha.50",
9333
- "@geekmidas/schema": "~10.0.0-alpha.50",
9334
- "@geekmidas/services": "~10.0.0-alpha.50",
9335
- "@geekmidas/storage": "~10.0.0-alpha.50",
9336
- "@geekmidas/studio": "~10.0.0-alpha.50",
9337
- "@geekmidas/telescope": "~10.0.0-alpha.50",
9338
- "@geekmidas/testkit": "~10.0.0-alpha.50",
9331
+ "@geekmidas/audit": "~10.0.0-alpha.52",
9332
+ "@geekmidas/auth": "~10.0.0-alpha.52",
9333
+ "@geekmidas/cache": "~10.0.0-alpha.52",
9334
+ "@geekmidas/client": "~10.0.0-alpha.52",
9335
+ "@geekmidas/cloud": "~10.0.0-alpha.52",
9336
+ "@geekmidas/constructs": "~10.0.0-alpha.52",
9337
+ "@geekmidas/db": "~10.0.0-alpha.52",
9338
+ "@geekmidas/emailkit": "~10.0.0-alpha.52",
9339
+ "@geekmidas/envkit": "~10.0.0-alpha.52",
9340
+ "@geekmidas/errors": "~10.0.0-alpha.52",
9341
+ "@geekmidas/events": "~10.0.0-alpha.52",
9342
+ "@geekmidas/logger": "~10.0.0-alpha.52",
9343
+ "@geekmidas/manifest": "~10.0.0-alpha.52",
9344
+ "@geekmidas/rate-limit": "~10.0.0-alpha.52",
9345
+ "@geekmidas/schema": "~10.0.0-alpha.52",
9346
+ "@geekmidas/services": "~10.0.0-alpha.52",
9347
+ "@geekmidas/storage": "~10.0.0-alpha.52",
9348
+ "@geekmidas/studio": "~10.0.0-alpha.52",
9349
+ "@geekmidas/telescope": "~10.0.0-alpha.52",
9350
+ "@geekmidas/testkit": "~10.0.0-alpha.52",
9339
9351
  "@geekmidas/cli": `~${loadPackageJson().version}`
9340
9352
  };
9341
9353
  //#endregion
@@ -10890,7 +10902,7 @@ function generateDeployFiles(options) {
10890
10902
  // VPC with NAT is a monthly cost in an account that may already
10891
10903
  // have one — replace it with \`sst.aws.Vpc.get(…)\` if so.
10892
10904
  ${db.id}: { vpc },`] : [], ...options.constructs.mail ? [` // Every provider rejects an unverified sender, so there is no
10893
- // default; the synth stops with \`EmailNeedsSender\` until it is set.
10905
+ // default — \`fromManifest\` requires it, by the manifest's types.
10894
10906
  ${mail.id}: { from: process.env.MAIL_FROM as string },`] : []];
10895
10907
  return [{
10896
10908
  path: "sst.config.ts",
@@ -16078,7 +16090,7 @@ function testDatabases(reconciled) {
16078
16090
  * starts without the reference data the app needs.
16079
16091
  */
16080
16092
  async function migrateTestStage(workspace, env) {
16081
- const { migrateAndSeed } = await import("./migrate-B00XpVaO.mjs");
16093
+ const { migrateAndSeed } = await import("./migrate-DmabhO_N.mjs");
16082
16094
  const { discover } = await import("./discover-Cf2jAcgF.mjs").then((n) => n.n);
16083
16095
  const sources = {};
16084
16096
  const manifest = await discover({
@@ -16509,7 +16521,7 @@ program.command("migrate").description("Apply each database construct's migratio
16509
16521
  try {
16510
16522
  const globalOptions = program.opts();
16511
16523
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
16512
- const { migrateCommand } = await import("./migrate-B00XpVaO.mjs");
16524
+ const { migrateCommand } = await import("./migrate-DmabhO_N.mjs");
16513
16525
  await migrateCommand({
16514
16526
  ...options,
16515
16527
  ...construct ? { construct } : {}
@@ -16523,7 +16535,7 @@ program.command("seed").description("Migrate, then run each database construct's
16523
16535
  try {
16524
16536
  const globalOptions = program.opts();
16525
16537
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
16526
- const { seedCommand } = await import("./migrate-B00XpVaO.mjs");
16538
+ const { seedCommand } = await import("./migrate-DmabhO_N.mjs");
16527
16539
  await seedCommand({
16528
16540
  ...options,
16529
16541
  ...construct ? { construct } : {}
@@ -16537,7 +16549,7 @@ program.command("migration").description("Write a construct's next migration: an
16537
16549
  try {
16538
16550
  const globalOptions = program.opts();
16539
16551
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
16540
- const { migrationCommand } = await import("./migrate-B00XpVaO.mjs");
16552
+ const { migrationCommand } = await import("./migrate-DmabhO_N.mjs");
16541
16553
  await migrationCommand({
16542
16554
  construct,
16543
16555
  ...name ? { name } : {}
@@ -16635,7 +16647,7 @@ program.command("encryption:rotate").description("Add a new current key to an En
16635
16647
  try {
16636
16648
  const globalOptions = program.opts();
16637
16649
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
16638
- const { encryptionRotateCommand } = await import("./encryption-DyQnPsZN.mjs");
16650
+ const { encryptionRotateCommand } = await import("./encryption-Cv-Ej9vR.mjs");
16639
16651
  await encryptionRotateCommand(construct, options);
16640
16652
  } catch (error) {
16641
16653
  console.error(formatError(error));
@@ -16646,7 +16658,7 @@ program.command("encryption:retire").description("Remove an old key from an Encr
16646
16658
  try {
16647
16659
  const globalOptions = program.opts();
16648
16660
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
16649
- const { encryptionRetireCommand } = await import("./encryption-DyQnPsZN.mjs");
16661
+ const { encryptionRetireCommand } = await import("./encryption-Cv-Ej9vR.mjs");
16650
16662
  await encryptionRetireCommand(construct, key, options);
16651
16663
  } catch (error) {
16652
16664
  console.error(formatError(error));
@@ -16698,7 +16710,7 @@ program.command("secrets:reconcile").description("Backfill missing custom secret
16698
16710
  console.error(`No secrets found for stage "${stage}". Run "gkm secrets:init --stage ${stage}" first.`);
16699
16711
  process.exit(1);
16700
16712
  }
16701
- const { derivedContainers } = await import("./workspace-BsbxbqV-.mjs").then((n) => n.o);
16713
+ const { derivedContainers } = await import("./workspace-fa5H6l7D.mjs").then((n) => n.o);
16702
16714
  const result = reconcileMissingSecrets(secrets, workspace, await derivedContainers(workspace, stage));
16703
16715
  if (!result) {
16704
16716
  console.log(`\n✓ Secrets for stage "${stage}" are up-to-date`);
@@ -16757,7 +16769,7 @@ program.command("deploy:github").description("Let GitHub Actions deploy a stage:
16757
16769
  try {
16758
16770
  const globalOptions = program.opts();
16759
16771
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
16760
- const { deployGithubCommand } = await import("./github-BfpadQWQ.mjs");
16772
+ const { deployGithubCommand } = await import("./github-U_frvZgD.mjs");
16761
16773
  await deployGithubCommand(options);
16762
16774
  } catch (error) {
16763
16775
  console.error(formatError(error));