@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
@@ -1,4 +1,4 @@
1
- import { C as WorkspaceInput, E as Framework, S as WorkspaceConfig, a as Routes, g as LoadedConfig, h as InferredWorkspaceConfig, l as AppsRecord, r as GkmConfig, y as NormalizedWorkspace } from "./types-BbrNu83u.mjs";
1
+ import { C as WorkspaceInput, E as Framework, S as WorkspaceConfig, a as Routes, g as LoadedConfig, h as InferredWorkspaceConfig, l as AppsRecord, r as GkmConfig, y as NormalizedWorkspace } from "./types-CT0ymlBk.mjs";
2
2
  //#region src/workspace/publicEnv.d.ts
3
3
  /**
4
4
  * All public env-var prefixes the toolbox understands.
@@ -153,4 +153,4 @@ declare function getEndpointForStage(dokployConfig: {
153
153
  } | undefined, stage: string): string | undefined;
154
154
  //#endregion
155
155
  export { getAppBuildOrder as a, normalizeWorkspace as c, wrapSingleAppAsWorkspace as d, PUBLIC_ENV_PREFIXES as f, defineWorkspace as i, processConfig as l, stripPublicPrefix as m, appConstructGlobs as n, getAppGkmConfig as o, getPublicEnvPrefix as p, constructPatterns as r, getEndpointForStage as s, allConstructGlobs as t, workspaceConstructGlobs as u };
156
- //# sourceMappingURL=index-BQhJXpaQ.d.mts.map
156
+ //# sourceMappingURL=index-DYh5TrsZ.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-BQhJXpaQ.d.mts","names":[],"sources":["../src/workspace/publicEnv.ts","../src/workspace/index.ts"],"mappings":";;;;;;;;;cASa;;;;;;;;;;;;;;;iBAoBG,mBAAmB,YAAY;;;;;iBAoB/B,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBC2ElB,sBAAsB,cAAc,YACnD,QAAQ,eAAe,SACrB,wBAAwB;;;;iBA8BX,mBACf,QAAQ,iBACR,cACE;;;;;iBA+Ca,yBACf,QAAQ,WACR,cACE;;;;;iBAuDa,cACf,QAAQ,YAAY,iBACpB,cACE;;;;;;;iBA6Ba,wBACf,WAAW;;;;;;;;;;;;iBAkBI,kBACf,WAAW,qBACX;;;;;;;iBAsBe,kBAAkB,WAAW;;iBAa7B,kBAAkB,QAAQ;;;;;iBAS1B,gBACf,WAAW,qBACX,kBACE;;;;;iBAiCa,iBAAiB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoD5B,oBACf;EACK;EAAmB,YAAY;eAEpC"}
1
+ {"version":3,"file":"index-DYh5TrsZ.d.mts","names":[],"sources":["../src/workspace/publicEnv.ts","../src/workspace/index.ts"],"mappings":";;;;;;;;;cASa;;;;;;;;;;;;;;;iBAoBG,mBAAmB,YAAY;;;;;iBAoB/B,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBC2ElB,sBAAsB,cAAc,YACnD,QAAQ,eAAe,SACrB,wBAAwB;;;;iBA8BX,mBACf,QAAQ,iBACR,cACE;;;;;iBA+Ca,yBACf,QAAQ,WACR,cACE;;;;;iBAuDa,cACf,QAAQ,YAAY,iBACpB,cACE;;;;;;;iBA6Ba,wBACf,WAAW;;;;;;;;;;;;iBAkBI,kBACf,WAAW,qBACX;;;;;;;iBAsBe,kBAAkB,WAAW;;iBAa7B,kBAAkB,QAAQ;;;;;iBAS1B,gBACf,WAAW,qBACX,kBACE;;;;;iBAiCa,iBAAiB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoD5B,oBACf;EACK;EAAmB,YAAY;eAEpC"}
@@ -1,4 +1,4 @@
1
- import { C as WorkspaceInput, E as Framework, S as WorkspaceConfig, a as Routes, g as LoadedConfig, h as InferredWorkspaceConfig, l as AppsRecord, r as GkmConfig, y as NormalizedWorkspace } from "./types-DNqEsctD.cjs";
1
+ import { C as WorkspaceInput, E as Framework, S as WorkspaceConfig, a as Routes, g as LoadedConfig, h as InferredWorkspaceConfig, l as AppsRecord, r as GkmConfig, y as NormalizedWorkspace } from "./types-DYDT4FfE.cjs";
2
2
  //#region src/workspace/publicEnv.d.ts
3
3
  /**
4
4
  * All public env-var prefixes the toolbox understands.
@@ -153,4 +153,4 @@ declare function getEndpointForStage(dokployConfig: {
153
153
  } | undefined, stage: string): string | undefined;
154
154
  //#endregion
155
155
  export { getAppBuildOrder as a, normalizeWorkspace as c, wrapSingleAppAsWorkspace as d, PUBLIC_ENV_PREFIXES as f, defineWorkspace as i, processConfig as l, stripPublicPrefix as m, appConstructGlobs as n, getAppGkmConfig as o, getPublicEnvPrefix as p, constructPatterns as r, getEndpointForStage as s, allConstructGlobs as t, workspaceConstructGlobs as u };
156
- //# sourceMappingURL=index-DHJePE0y.d.cts.map
156
+ //# sourceMappingURL=index-fU3qHy7c.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-DHJePE0y.d.cts","names":[],"sources":["../src/workspace/publicEnv.ts","../src/workspace/index.ts"],"mappings":";;;;;;;;;cASa;;;;;;;;;;;;;;;iBAoBG,mBAAmB,YAAY;;;;;iBAoB/B,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBC2ElB,sBAAsB,cAAc,YACnD,QAAQ,eAAe,SACrB,wBAAwB;;;;iBA8BX,mBACf,QAAQ,iBACR,cACE;;;;;iBA+Ca,yBACf,QAAQ,WACR,cACE;;;;;iBAuDa,cACf,QAAQ,YAAY,iBACpB,cACE;;;;;;;iBA6Ba,wBACf,WAAW;;;;;;;;;;;;iBAkBI,kBACf,WAAW,qBACX;;;;;;;iBAsBe,kBAAkB,WAAW;;iBAa7B,kBAAkB,QAAQ;;;;;iBAS1B,gBACf,WAAW,qBACX,kBACE;;;;;iBAiCa,iBAAiB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoD5B,oBACf;EACK;EAAmB,YAAY;eAEpC"}
1
+ {"version":3,"file":"index-fU3qHy7c.d.cts","names":[],"sources":["../src/workspace/publicEnv.ts","../src/workspace/index.ts"],"mappings":";;;;;;;;;cASa;;;;;;;;;;;;;;;iBAoBG,mBAAmB,YAAY;;;;;iBAoB/B,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBC2ElB,sBAAsB,cAAc,YACnD,QAAQ,eAAe,SACrB,wBAAwB;;;;iBA8BX,mBACf,QAAQ,iBACR,cACE;;;;;iBA+Ca,yBACf,QAAQ,WACR,cACE;;;;;iBAuDa,cACf,QAAQ,YAAY,iBACpB,cACE;;;;;;;iBA6Ba,wBACf,WAAW;;;;;;;;;;;;iBAkBI,kBACf,WAAW,qBACX;;;;;;;iBAsBe,kBAAkB,WAAW;;iBAa7B,kBAAkB,QAAQ;;;;;iBAS1B,gBACf,WAAW,qBACX,kBACE;;;;;iBAiCa,iBAAiB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoD5B,oBACf;EACK;EAAmB,YAAY;eAEpC"}
package/dist/index.cjs CHANGED
@@ -2,15 +2,15 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const require_rolldown_runtime = require("./rolldown-runtime-C0BPl7ul.cjs");
4
4
  const require_discover = require("./discover-DXNviAh-.cjs");
5
- const require_config = require("./config-CsYSyUya.cjs");
6
- const require_workspace = require("./workspace-DEibcoBe.cjs");
5
+ const require_config = require("./config-Cvr5fCbn.cjs");
6
+ const require_workspace = require("./workspace-BcCiLzTO.cjs");
7
7
  const require_storage = require("./storage-CSGoC3bK.cjs");
8
8
  const require_store = require("./store-DQgxT_WR.cjs");
9
- const require_workspace$1 = require("./workspace-j6ZxvJqq.cjs");
9
+ const require_workspace$1 = require("./workspace-BEGUDNwK.cjs");
10
10
  const require_OpenApiTsGenerator = require("./OpenApiTsGenerator-BN0PIZxd.cjs");
11
11
  const require_openapi = require("./openapi.cjs");
12
- const require_ready = require("./ready-lr2Fm-ep.cjs");
13
- const require_backends = require("./backends-B9V2XD2M.cjs");
12
+ const require_ready = require("./ready-ClUpTxoL.cjs");
13
+ const require_backends = require("./backends-BXcwhb7p.cjs");
14
14
  const require_emit = require("./emit-Dmc1nvdS.cjs");
15
15
  let commander = require("commander");
16
16
  let node_process = require("node:process");
@@ -48,7 +48,7 @@ let _geekmidas_constructs_queue = require("@geekmidas/constructs/queue");
48
48
  let _geekmidas_constructs_topic = require("@geekmidas/constructs/topic");
49
49
  let node_dns_promises = require("node:dns/promises");
50
50
  //#region package.json
51
- var version = "10.0.0-alpha.50";
51
+ var version = "10.0.0-alpha.52";
52
52
  //#endregion
53
53
  //#region src/auth/credentials.ts
54
54
  /**
@@ -1731,9 +1731,9 @@ async function workspaceDevCommand(configured, options) {
1731
1731
  for (const { id, port } of fakes) logger$9.log(`🎭 ${id} fake: http://localhost:${port}`);
1732
1732
  logger$9.log(options.migrate || options.seed ? "🗄️ Migrating the databases" : "🗄️ Checking for pending migrations");
1733
1733
  if (options.migrate || options.seed) {
1734
- const { prepareDevDatabases } = await Promise.resolve().then(() => require("./migrate-CNlew9Ek.cjs"));
1734
+ const { prepareDevDatabases } = await Promise.resolve().then(() => require("./migrate-DCxK1NRd.cjs"));
1735
1735
  await prepareDevDatabases(workspace, reconciled.env, { seed: !!options.seed });
1736
- } else await Promise.resolve().then(() => require("./migrate-CNlew9Ek.cjs")).then(({ reportPendingMigrations }) => reportPendingMigrations(workspace, reconciled.env)).catch((error) => {
1736
+ } else await Promise.resolve().then(() => require("./migrate-DCxK1NRd.cjs")).then(({ reportPendingMigrations }) => reportPendingMigrations(workspace, reconciled.env)).catch((error) => {
1737
1737
  logger$9.log(`⚠️ Could not check for pending migrations: ${error instanceof Error ? error.message : String(error)}`);
1738
1738
  });
1739
1739
  const appUrls = {};
@@ -2316,7 +2316,7 @@ var CronGenerator = class extends require_discover.ConstructGenerator {
2316
2316
  */
2317
2317
  import type { EnvironmentParser } from '@geekmidas/envkit';
2318
2318
  import type { Logger } from '@geekmidas/logger';
2319
- import { toCronExpression } from '@geekmidas/constructs/crons';
2319
+ import { runCron, scheduleInProcess, toCronExpression } from '@geekmidas/constructs/crons';
2320
2320
  import { ServiceDiscovery } from '@geekmidas/services';
2321
2321
  ${Array.from(importsByFile.entries()).map(([importPath, exports]) => `import { ${exports.join(", ")} } from '${importPath}';`).join("\n")}
2322
2322
 
@@ -2357,11 +2357,10 @@ export async function setupCrons(
2357
2357
 
2358
2358
  const run = async (entry: (typeof prepared)[number]) => {
2359
2359
  try {
2360
- await entry.cron.handler({
2361
- input: undefined,
2362
- services: entry.services,
2363
- logger: entry.cron.logger,
2364
- });
2360
+ // The cron's own function, the way its Lambda would run it — services,
2361
+ // the worker's database as \`db\`, its events. It used to call a
2362
+ // \`handler\` a Cron does not have, so every firing logged a failure.
2363
+ await runCron(entry.cron, serviceDiscovery);
2365
2364
  } catch (error) {
2366
2365
  logger.error({ error, cron: entry.name }, 'Cron failed');
2367
2366
  }
@@ -2372,13 +2371,28 @@ export async function setupCrons(
2372
2371
  // memory fires each job once per replica — so the schedule lives in
2373
2372
  // Postgres. It used to be a second pg-boss on the worker's database, as the
2374
2373
  // runtime role, which can neither create a schema nor use the broker's.
2375
- const { url } = envParser
2374
+ const { url, devPid } = envParser
2376
2375
  .create((get) => ({
2377
2376
  url: get('EVENT_PUBLISHER_CONNECTION_STRING').string().optional(),
2377
+ // Set by \`gkm dev\` on the server it starts, and by nothing deployed.
2378
+ devPid: get('GKM_DEV_PID').string().optional(),
2378
2379
  }))
2379
2380
  .parse();
2380
2381
 
2381
2382
  if (!url?.startsWith('pgboss://')) {
2383
+ // \`gkm dev\` on a target whose crons are infrastructure once deployed —
2384
+ // EventBridge rules on AWS — has no broker to keep a schedule in. It is one
2385
+ // process, so a timer fires each job once, which is all pg-boss is for
2386
+ // here. Only there: a deployed server firing by timer fires once per
2387
+ // replica, so outside dev this stays the error below.
2388
+ if (devPid) {
2389
+ for (const entry of prepared) {
2390
+ running.push(scheduleInProcess(entry.schedule, () => run(entry)));
2391
+ logger.info({ cron: entry.name, schedule: entry.schedule }, 'Cron scheduled in this process');
2392
+ }
2393
+ return;
2394
+ }
2395
+
2382
2396
  logger.error(
2383
2397
  { crons: prepared.map(({ name }) => name) },
2384
2398
  'These crons have nowhere to keep their schedule. On a server they are ' +
@@ -3997,7 +4011,7 @@ async function provisionDeclared(options) {
3997
4011
  cache: require_backends.cacheBackendFor(require_backends.providerOf(workspace)),
3998
4012
  events: require_backends.eventsBackendFor(require_backends.providerOf(workspace)),
3999
4013
  storage: require_backends.storageBackendFor(require_backends.providerOf(workspace)),
4000
- addresses: surfaceAddresses(workspace, manifest, options.appUrls),
4014
+ addresses: surfaceAddresses(manifest, options.appUrls),
4001
4015
  seed: options.seed,
4002
4016
  ...options.supplied ? { supplied: options.supplied } : {},
4003
4017
  deferred: [],
@@ -4059,25 +4073,20 @@ function carriersLast(ordered, manifest) {
4059
4073
  return [...ordered.filter((id) => !carries(id)), ...ordered.filter(carries)];
4060
4074
  }
4061
4075
  /**
4062
- * Where each declared surface answers.
4063
- *
4064
- * Every `rest-api` in a process answers on that process's address, so an app
4065
- * serving both its own API and an auth server publishes one address twice —
4066
- * which is exactly what it does at runtime, and the same rule the local target
4067
- * applies.
4076
+ * Where each declared surface answers: its own app's address.
4068
4077
  *
4069
- * A workspace with two backends is the case this does not answer, and the
4070
- * manifest cannot yet: which surface belongs to which app is what §2's endpoint
4071
- * merge would record. Until then the first backend's address is used, and a
4072
- * second backend's surfaces would be wrong rather than missing — worth knowing
4073
- * before relying on it.
4078
+ * Every surface is an app of its own, keyed by its id the way the derivation
4079
+ * keyed it — `Api` is `api`, `Webhooks` is `webhooks` — and answers on that
4080
+ * app's host, `{subdomain}.{domain}`. It used to be handed the first backend's
4081
+ * address, so a workspace with two APIs pointed both at the same one.
4074
4082
  */
4075
- function surfaceAddresses(workspace, manifest, appUrls) {
4083
+ function surfaceAddresses(manifest, appUrls) {
4076
4084
  const addresses = {};
4077
- const backend = Object.entries(workspace.apps).find(([, app]) => app.type === "backend");
4078
- const url = backend ? appUrls[backend[0]] : void 0;
4079
- if (!url) return addresses;
4080
- for (const [id, declaration] of Object.entries(manifest)) if (declaration.kind === "rest-api") addresses[id] = url;
4085
+ for (const [id, declaration] of Object.entries(manifest)) {
4086
+ if (declaration.kind !== "rest-api") continue;
4087
+ const url = appUrls[require_config.appKey(id)];
4088
+ if (url) addresses[id] = url;
4089
+ }
4081
4090
  return addresses;
4082
4091
  }
4083
4092
  //#endregion
@@ -4562,32 +4571,34 @@ async function verifyDnsRecords(appHostnames, serverIp, state) {
4562
4571
  }
4563
4572
  //#endregion
4564
4573
  //#region src/deploy/domain.ts
4574
+ /** A stage was deployed that `deploy.domains` gives no domain. */
4575
+ var NoDomainForStage = class extends Error {
4576
+ stage;
4577
+ constructor(stage) {
4578
+ super(`No domain for stage "${stage}". Add it to gkm.config.ts: deploy: { domains: { ${stage}: 'example.com' } }.`);
4579
+ this.stage = stage;
4580
+ this.name = "NoDomainForStage";
4581
+ }
4582
+ };
4565
4583
  /**
4566
- * Resolve the hostname for an app based on stage configuration.
4584
+ * The hostname an app answers on for a stage.
4567
4585
  *
4568
- * Domain resolution priority:
4569
- * 1. Explicit app.domain override (string or stage-specific)
4570
- * 2. Default pattern based on app type:
4571
- * - Main frontend app gets base domain (e.g., 'myapp.com')
4572
- * - Other apps get prefixed domain (e.g., 'api.myapp.com')
4586
+ * 1. An explicit `app.domain` — a string, or one per stage — wins.
4587
+ * 2. Otherwise from the stage's base domain in `deploy.domains`: the root site
4588
+ * answers on the domain itself, and every other app on
4589
+ * `{subdomain}.{domain}` — its declaration's `subdomain`, or its own name.
4573
4590
  *
4574
- * @param appName - The name of the app
4575
- * @param app - The normalized app configuration
4576
- * @param stage - The deployment stage (e.g., 'production', 'development')
4577
- * @param dokployConfig - Dokploy workspace configuration with domain mappings
4578
- * @param isMainFrontend - Whether this is the main frontend app
4579
- * @returns The resolved hostname for the app
4580
- * @throws Error if no domain configuration is found for the stage
4591
+ * @throws {NoDomainForStage} when `deploy.domains` names no domain for it
4581
4592
  */
4582
- function resolveHost(appName, app, stage, dokployConfig, isMainFrontend) {
4593
+ function resolveHost(appName, app, stage, domains, isMainFrontend) {
4583
4594
  if (app.domain) {
4584
4595
  if (typeof app.domain === "string") return app.domain;
4585
4596
  if (app.domain[stage]) return app.domain[stage];
4586
4597
  }
4587
- const baseDomain = dokployConfig?.domains?.[stage];
4588
- if (!baseDomain) throw new Error(`No domain configured for stage "${stage}". Add deploy.dokploy.domains.${stage} to gkm.config.ts`);
4598
+ const baseDomain = domains?.[stage];
4599
+ if (!baseDomain) throw new NoDomainForStage(stage);
4589
4600
  if (isMainFrontend) return baseDomain;
4590
- return `${appName}.${baseDomain}`;
4601
+ return `${app.subdomain ?? appName}.${baseDomain}`;
4591
4602
  }
4592
4603
  /**
4593
4604
  * Whether this app is the site the base domain points at — see `rootSite`,
@@ -7612,7 +7623,6 @@ async function workspaceDeployCommand(configured, options) {
7612
7623
  if (skippedMobileApps.length > 0) logger$4.log(`\n📱 Skipping ${skippedMobileApps.length} mobile app(s) — deploy via framework toolchain: ${skippedMobileApps.join(", ")}`);
7613
7624
  const backendApps = appsToDeployNames.filter((name) => workspace.apps[name].type === "backend");
7614
7625
  const frontendApps = appsToDeployNames.filter((name) => workspace.apps[name].type === "web");
7615
- const dokployConfig = workspace.deploy.dokploy;
7616
7626
  let declaredEnv = {};
7617
7627
  let declaredClusters = {};
7618
7628
  {
@@ -7621,7 +7631,7 @@ async function workspaceDeployCommand(configured, options) {
7621
7631
  for (const appName of backendApps) {
7622
7632
  const app = workspace.apps[appName];
7623
7633
  if (!app) continue;
7624
- appUrls[appName] = `https://${resolveHost(appName, app, stage, dokployConfig, false)}`;
7634
+ appUrls[appName] = `https://${resolveHost(appName, app, stage, workspace.deploy?.domains, false)}`;
7625
7635
  }
7626
7636
  const declared = await provisionDeclared({
7627
7637
  api,
@@ -7685,7 +7695,8 @@ async function workspaceDeployCommand(configured, options) {
7685
7695
  const frontendUrls = [];
7686
7696
  for (const appName of frontendApps) {
7687
7697
  const app = workspace.apps[appName];
7688
- const hostname = resolveHost(appName, app, stage, dokployConfig, isMainFrontendApp(appName, app, workspace.apps));
7698
+ const isMainFrontend = isMainFrontendApp(appName, app, workspace.apps);
7699
+ const hostname = resolveHost(appName, app, stage, workspace.deploy?.domains, isMainFrontend);
7689
7700
  frontendUrls.push(`https://${hostname}`);
7690
7701
  }
7691
7702
  if (backendApps.length > 0) {
@@ -7731,7 +7742,7 @@ async function workspaceDeployCommand(configured, options) {
7731
7742
  },
7732
7743
  buildArgs
7733
7744
  });
7734
- const backendHost = resolveHost(appName, app, stage, dokployConfig, false);
7745
+ const backendHost = resolveHost(appName, app, stage, workspace.deploy?.domains, false);
7735
7746
  const dependencyUrls = {};
7736
7747
  if (app.dependencies) {
7737
7748
  for (const dep of app.dependencies) if (publicUrls[dep]) dependencyUrls[dep] = publicUrls[dep];
@@ -7836,7 +7847,8 @@ async function workspaceDeployCommand(configured, options) {
7836
7847
  if (app.dependencies) {
7837
7848
  for (const dep of app.dependencies) if (publicUrls[dep]) dependencyUrls[dep] = publicUrls[dep];
7838
7849
  }
7839
- const frontendHost = resolveHost(appName, app, stage, dokployConfig, isMainFrontendApp(appName, app, workspace.apps));
7850
+ const isMainFrontend = isMainFrontendApp(appName, app, workspace.apps);
7851
+ const frontendHost = resolveHost(appName, app, stage, workspace.deploy?.domains, isMainFrontend);
7840
7852
  const envContext = {
7841
7853
  app,
7842
7854
  appName,
@@ -9328,26 +9340,26 @@ function loadPackageJson() {
9328
9340
  * Run: pnpm --filter @geekmidas/cli sync-versions
9329
9341
  */
9330
9342
  const GEEKMIDAS_VERSIONS = {
9331
- "@geekmidas/audit": "~10.0.0-alpha.50",
9332
- "@geekmidas/auth": "~10.0.0-alpha.50",
9333
- "@geekmidas/cache": "~10.0.0-alpha.50",
9334
- "@geekmidas/client": "~10.0.0-alpha.50",
9335
- "@geekmidas/cloud": "~10.0.0-alpha.50",
9336
- "@geekmidas/constructs": "~10.0.0-alpha.50",
9337
- "@geekmidas/db": "~10.0.0-alpha.50",
9338
- "@geekmidas/emailkit": "~10.0.0-alpha.50",
9339
- "@geekmidas/envkit": "~10.0.0-alpha.50",
9340
- "@geekmidas/errors": "~10.0.0-alpha.50",
9341
- "@geekmidas/events": "~10.0.0-alpha.50",
9342
- "@geekmidas/logger": "~10.0.0-alpha.50",
9343
- "@geekmidas/manifest": "~10.0.0-alpha.50",
9344
- "@geekmidas/rate-limit": "~10.0.0-alpha.50",
9345
- "@geekmidas/schema": "~10.0.0-alpha.50",
9346
- "@geekmidas/services": "~10.0.0-alpha.50",
9347
- "@geekmidas/storage": "~10.0.0-alpha.50",
9348
- "@geekmidas/studio": "~10.0.0-alpha.50",
9349
- "@geekmidas/telescope": "~10.0.0-alpha.50",
9350
- "@geekmidas/testkit": "~10.0.0-alpha.50",
9343
+ "@geekmidas/audit": "~10.0.0-alpha.52",
9344
+ "@geekmidas/auth": "~10.0.0-alpha.52",
9345
+ "@geekmidas/cache": "~10.0.0-alpha.52",
9346
+ "@geekmidas/client": "~10.0.0-alpha.52",
9347
+ "@geekmidas/cloud": "~10.0.0-alpha.52",
9348
+ "@geekmidas/constructs": "~10.0.0-alpha.52",
9349
+ "@geekmidas/db": "~10.0.0-alpha.52",
9350
+ "@geekmidas/emailkit": "~10.0.0-alpha.52",
9351
+ "@geekmidas/envkit": "~10.0.0-alpha.52",
9352
+ "@geekmidas/errors": "~10.0.0-alpha.52",
9353
+ "@geekmidas/events": "~10.0.0-alpha.52",
9354
+ "@geekmidas/logger": "~10.0.0-alpha.52",
9355
+ "@geekmidas/manifest": "~10.0.0-alpha.52",
9356
+ "@geekmidas/rate-limit": "~10.0.0-alpha.52",
9357
+ "@geekmidas/schema": "~10.0.0-alpha.52",
9358
+ "@geekmidas/services": "~10.0.0-alpha.52",
9359
+ "@geekmidas/storage": "~10.0.0-alpha.52",
9360
+ "@geekmidas/studio": "~10.0.0-alpha.52",
9361
+ "@geekmidas/telescope": "~10.0.0-alpha.52",
9362
+ "@geekmidas/testkit": "~10.0.0-alpha.52",
9351
9363
  "@geekmidas/cli": `~${loadPackageJson().version}`
9352
9364
  };
9353
9365
  //#endregion
@@ -10902,7 +10914,7 @@ function generateDeployFiles(options) {
10902
10914
  // VPC with NAT is a monthly cost in an account that may already
10903
10915
  // have one — replace it with \`sst.aws.Vpc.get(…)\` if so.
10904
10916
  ${db.id}: { vpc },`] : [], ...options.constructs.mail ? [` // Every provider rejects an unverified sender, so there is no
10905
- // default; the synth stops with \`EmailNeedsSender\` until it is set.
10917
+ // default — \`fromManifest\` requires it, by the manifest's types.
10906
10918
  ${mail.id}: { from: process.env.MAIL_FROM as string },`] : []];
10907
10919
  return [{
10908
10920
  path: "sst.config.ts",
@@ -16090,7 +16102,7 @@ function testDatabases(reconciled) {
16090
16102
  * starts without the reference data the app needs.
16091
16103
  */
16092
16104
  async function migrateTestStage(workspace, env) {
16093
- const { migrateAndSeed } = await Promise.resolve().then(() => require("./migrate-CNlew9Ek.cjs"));
16105
+ const { migrateAndSeed } = await Promise.resolve().then(() => require("./migrate-DCxK1NRd.cjs"));
16094
16106
  const { discover } = await Promise.resolve().then(() => require("./discover-DXNviAh-.cjs")).then((n) => n.discover_exports);
16095
16107
  const sources = {};
16096
16108
  const manifest = await discover({
@@ -16521,7 +16533,7 @@ program.command("migrate").description("Apply each database construct's migratio
16521
16533
  try {
16522
16534
  const globalOptions = program.opts();
16523
16535
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
16524
- const { migrateCommand } = await Promise.resolve().then(() => require("./migrate-CNlew9Ek.cjs"));
16536
+ const { migrateCommand } = await Promise.resolve().then(() => require("./migrate-DCxK1NRd.cjs"));
16525
16537
  await migrateCommand({
16526
16538
  ...options,
16527
16539
  ...construct ? { construct } : {}
@@ -16535,7 +16547,7 @@ program.command("seed").description("Migrate, then run each database construct's
16535
16547
  try {
16536
16548
  const globalOptions = program.opts();
16537
16549
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
16538
- const { seedCommand } = await Promise.resolve().then(() => require("./migrate-CNlew9Ek.cjs"));
16550
+ const { seedCommand } = await Promise.resolve().then(() => require("./migrate-DCxK1NRd.cjs"));
16539
16551
  await seedCommand({
16540
16552
  ...options,
16541
16553
  ...construct ? { construct } : {}
@@ -16549,7 +16561,7 @@ program.command("migration").description("Write a construct's next migration: an
16549
16561
  try {
16550
16562
  const globalOptions = program.opts();
16551
16563
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
16552
- const { migrationCommand } = await Promise.resolve().then(() => require("./migrate-CNlew9Ek.cjs"));
16564
+ const { migrationCommand } = await Promise.resolve().then(() => require("./migrate-DCxK1NRd.cjs"));
16553
16565
  await migrationCommand({
16554
16566
  construct,
16555
16567
  ...name ? { name } : {}
@@ -16647,7 +16659,7 @@ program.command("encryption:rotate").description("Add a new current key to an En
16647
16659
  try {
16648
16660
  const globalOptions = program.opts();
16649
16661
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
16650
- const { encryptionRotateCommand } = await Promise.resolve().then(() => require("./encryption-C7OGMve_.cjs"));
16662
+ const { encryptionRotateCommand } = await Promise.resolve().then(() => require("./encryption-DCsdx4Po.cjs"));
16651
16663
  await encryptionRotateCommand(construct, options);
16652
16664
  } catch (error) {
16653
16665
  console.error(formatError(error));
@@ -16658,7 +16670,7 @@ program.command("encryption:retire").description("Remove an old key from an Encr
16658
16670
  try {
16659
16671
  const globalOptions = program.opts();
16660
16672
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
16661
- const { encryptionRetireCommand } = await Promise.resolve().then(() => require("./encryption-C7OGMve_.cjs"));
16673
+ const { encryptionRetireCommand } = await Promise.resolve().then(() => require("./encryption-DCsdx4Po.cjs"));
16662
16674
  await encryptionRetireCommand(construct, key, options);
16663
16675
  } catch (error) {
16664
16676
  console.error(formatError(error));
@@ -16710,7 +16722,7 @@ program.command("secrets:reconcile").description("Backfill missing custom secret
16710
16722
  console.error(`No secrets found for stage "${stage}". Run "gkm secrets:init --stage ${stage}" first.`);
16711
16723
  process.exit(1);
16712
16724
  }
16713
- const { derivedContainers } = await Promise.resolve().then(() => require("./workspace-j6ZxvJqq.cjs")).then((n) => n.workspace_exports);
16725
+ const { derivedContainers } = await Promise.resolve().then(() => require("./workspace-BEGUDNwK.cjs")).then((n) => n.workspace_exports);
16714
16726
  const result = reconcileMissingSecrets(secrets, workspace, await derivedContainers(workspace, stage));
16715
16727
  if (!result) {
16716
16728
  console.log(`\n✓ Secrets for stage "${stage}" are up-to-date`);
@@ -16769,7 +16781,7 @@ program.command("deploy:github").description("Let GitHub Actions deploy a stage:
16769
16781
  try {
16770
16782
  const globalOptions = program.opts();
16771
16783
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
16772
- const { deployGithubCommand } = await Promise.resolve().then(() => require("./github-BrI1tv6u.cjs"));
16784
+ const { deployGithubCommand } = await Promise.resolve().then(() => require("./github-BGx4U61b.cjs"));
16773
16785
  await deployGithubCommand(options);
16774
16786
  } catch (error) {
16775
16787
  console.error(formatError(error));