@geekmidas/cli 10.0.0-alpha.26 → 10.0.0-alpha.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.
- package/dist/{config-Dn9DW2Fz.cjs → config-7R_-WyHq.cjs} +24 -3
- package/dist/{config-Dn9DW2Fz.cjs.map → config-7R_-WyHq.cjs.map} +1 -1
- package/dist/{config-DBGpRTUy.mjs → config-DXrrYvob.mjs} +19 -4
- package/dist/{config-DBGpRTUy.mjs.map → config-DXrrYvob.mjs.map} +1 -1
- package/dist/config.cjs +3 -2
- package/dist/config.d.cts +12 -1
- package/dist/config.d.cts.map +1 -1
- package/dist/config.d.mts +12 -1
- package/dist/config.d.mts.map +1 -1
- package/dist/config.mjs +3 -3
- package/dist/{github-D5SBlOx5.mjs → github-Ba5kXEJo.mjs} +4 -4
- package/dist/{github-D5SBlOx5.mjs.map → github-Ba5kXEJo.mjs.map} +1 -1
- package/dist/{github-D58lt7RR.cjs → github-CQflOKKV.cjs} +4 -4
- package/dist/{github-D58lt7RR.cjs.map → github-CQflOKKV.cjs.map} +1 -1
- package/dist/{index-RCUizGxL.d.cts → index-BPN7kghQ.d.cts} +2 -12
- package/dist/{index-B4H4XF7A.d.mts.map → index-BPN7kghQ.d.cts.map} +1 -1
- package/dist/{index-B4H4XF7A.d.mts → index-BqWKWRm0.d.mts} +2 -12
- package/dist/{index-RCUizGxL.d.cts.map → index-BqWKWRm0.d.mts.map} +1 -1
- package/dist/index.cjs +100 -170
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +51 -121
- package/dist/index.mjs.map +1 -1
- package/dist/{openapi-DHQlstv6.mjs → openapi-3NLVvtz-.mjs} +2 -2
- package/dist/{openapi-DHQlstv6.mjs.map → openapi-3NLVvtz-.mjs.map} +1 -1
- package/dist/{openapi-BAKQLho-.cjs → openapi-rhJdy2GC.cjs} +2 -2
- package/dist/{openapi-BAKQLho-.cjs.map → openapi-rhJdy2GC.cjs.map} +1 -1
- package/dist/openapi.cjs +1 -1
- package/dist/openapi.mjs +1 -1
- package/dist/{generator-LfZU7NlU.mjs → reconcile-DhbCvh4K.mjs} +111 -2
- package/dist/reconcile-DhbCvh4K.mjs.map +1 -0
- package/dist/{generator-Wdfp0jCS.cjs → reconcile-szmJw_Sb.cjs} +130 -3
- package/dist/reconcile-szmJw_Sb.cjs.map +1 -0
- package/dist/{transfer-CAJs_vhu.mjs → transfer-BV00TxZv.mjs} +4 -4
- package/dist/{transfer-CAJs_vhu.mjs.map → transfer-BV00TxZv.mjs.map} +1 -1
- package/dist/{transfer-D2qLFXsw.cjs → transfer-BYIn7z8m.cjs} +4 -4
- package/dist/{transfer-D2qLFXsw.cjs.map → transfer-BYIn7z8m.cjs.map} +1 -1
- package/dist/workspace/index.cjs +1 -2
- package/dist/workspace/index.d.cts +2 -2
- package/dist/workspace/index.d.mts +2 -2
- package/dist/workspace/index.mjs +2 -2
- package/dist/{workspace-CRD9YinV.cjs → workspace-Bav3TVrP.cjs} +47 -78
- package/dist/workspace-Bav3TVrP.cjs.map +1 -0
- package/dist/{credentials-DI9kJcaP.mjs → workspace-CUmR_k4J.mjs} +228 -492
- package/dist/workspace-CUmR_k4J.mjs.map +1 -0
- package/dist/{credentials-fQSAe4Nb.cjs → workspace-DgeVgxmm.cjs} +229 -517
- package/dist/workspace-DgeVgxmm.cjs.map +1 -0
- package/dist/{workspace-Bu3xNCej.mjs → workspace-T4IVGSoB.mjs} +48 -73
- package/dist/workspace-T4IVGSoB.mjs.map +1 -0
- package/package.json +14 -14
- package/dist/credentials-DI9kJcaP.mjs.map +0 -1
- package/dist/credentials-fQSAe4Nb.cjs.map +0 -1
- package/dist/generator-LfZU7NlU.mjs.map +0 -1
- package/dist/generator-Wdfp0jCS.cjs.map +0 -1
- package/dist/reconcile-gb1lz1Dk.mjs +0 -113
- package/dist/reconcile-gb1lz1Dk.mjs.map +0 -1
- package/dist/reconcile-hx_vBvux.cjs +0 -136
- package/dist/reconcile-hx_vBvux.cjs.map +0 -1
- package/dist/workspace-Bu3xNCej.mjs.map +0 -1
- package/dist/workspace-CRD9YinV.cjs.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -2,15 +2,14 @@
|
|
|
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-B_HtYJCr.cjs");
|
|
5
|
-
const require_config = require("./config-
|
|
6
|
-
const require_workspace = require("./workspace-
|
|
7
|
-
const require_credentials = require("./credentials-fQSAe4Nb.cjs");
|
|
8
|
-
const require_generator = require("./generator-Wdfp0jCS.cjs");
|
|
5
|
+
const require_config = require("./config-7R_-WyHq.cjs");
|
|
6
|
+
const require_workspace = require("./workspace-Bav3TVrP.cjs");
|
|
9
7
|
const require_storage = require("./storage-DgypfSD6.cjs");
|
|
10
|
-
const
|
|
8
|
+
const require_workspace$1 = require("./workspace-DgeVgxmm.cjs");
|
|
9
|
+
const require_openapi = require("./openapi-rhJdy2GC.cjs");
|
|
11
10
|
const require_emit = require("./emit-BdoPFjZf.cjs");
|
|
12
|
-
const require_reconcile = require("./reconcile-
|
|
13
|
-
const require_transfer = require("./transfer-
|
|
11
|
+
const require_reconcile = require("./reconcile-szmJw_Sb.cjs");
|
|
12
|
+
const require_transfer = require("./transfer-BYIn7z8m.cjs");
|
|
14
13
|
let commander = require("commander");
|
|
15
14
|
let node_process = require("node:process");
|
|
16
15
|
let node_readline_promises = require("node:readline/promises");
|
|
@@ -25,13 +24,13 @@ let fast_glob = require("fast-glob");
|
|
|
25
24
|
fast_glob = require_rolldown_runtime.__toESM(fast_glob, 1);
|
|
26
25
|
let chokidar = require("chokidar");
|
|
27
26
|
chokidar = require_rolldown_runtime.__toESM(chokidar, 1);
|
|
28
|
-
let yaml = require("yaml");
|
|
29
27
|
let node_crypto = require("node:crypto");
|
|
28
|
+
let node_url = require("node:url");
|
|
30
29
|
let _geekmidas_db_pg_roles = require("@geekmidas/db/pg/roles");
|
|
31
30
|
let pg = require("pg");
|
|
31
|
+
let yaml = require("yaml");
|
|
32
32
|
let node_util = require("node:util");
|
|
33
33
|
let _geekmidas_cache_postgres = require("@geekmidas/cache/postgres");
|
|
34
|
-
let node_url = require("node:url");
|
|
35
34
|
let _geekmidas_constructs_crons = require("@geekmidas/constructs/crons");
|
|
36
35
|
let _geekmidas_constructs_functions = require("@geekmidas/constructs/functions");
|
|
37
36
|
let _geekmidas_constructs_queue = require("@geekmidas/constructs/queue");
|
|
@@ -44,7 +43,7 @@ prompts = require_rolldown_runtime.__toESM(prompts, 1);
|
|
|
44
43
|
let _geekmidas_envkit = require("@geekmidas/envkit");
|
|
45
44
|
let _geekmidas_services = require("@geekmidas/services");
|
|
46
45
|
//#region package.json
|
|
47
|
-
var version = "10.0.0-alpha.
|
|
46
|
+
var version = "10.0.0-alpha.27";
|
|
48
47
|
//#endregion
|
|
49
48
|
//#region src/auth/credentials.ts
|
|
50
49
|
/**
|
|
@@ -434,19 +433,16 @@ var NoCommandSpecified = class extends Error {
|
|
|
434
433
|
async function execCommand(commandArgs, options = {}) {
|
|
435
434
|
const cwd = options.cwd ?? process.cwd();
|
|
436
435
|
if (!commandArgs[0]) throw new NoCommandSpecified();
|
|
437
|
-
const defaultEnv =
|
|
436
|
+
const defaultEnv = require_workspace$1.loadEnvFiles(".env");
|
|
438
437
|
if (defaultEnv.loaded.length > 0) logger$12.log(`📦 Loaded env: ${defaultEnv.loaded.join(", ")}`);
|
|
439
|
-
const { credentials, secretsJsonPath, appName } = await
|
|
440
|
-
cwd,
|
|
441
|
-
resolveDockerPorts: "readonly"
|
|
442
|
-
});
|
|
438
|
+
const { credentials, secretsJsonPath, appName } = await require_workspace$1.prepareEntryCredentials({ cwd });
|
|
443
439
|
if (appName) logger$12.log(`📦 App: ${appName}`);
|
|
444
440
|
const secretCount = Object.keys(credentials).filter((k) => k !== "PORT").length;
|
|
445
441
|
if (secretCount > 0) logger$12.log(`🔐 Loaded ${secretCount} secret(s)`);
|
|
446
442
|
const preloadDir = (0, node_path.join)(cwd, ".gkm");
|
|
447
443
|
await (0, node_fs_promises.mkdir)(preloadDir, { recursive: true });
|
|
448
444
|
const preloadPath = (0, node_path.join)(preloadDir, "credentials-preload.mjs");
|
|
449
|
-
await
|
|
445
|
+
await require_workspace$1.createCredentialsPreload(preloadPath, secretsJsonPath);
|
|
450
446
|
const [cmd, ...args] = commandArgs;
|
|
451
447
|
logger$12.log(`🚀 Running: ${[cmd, ...args].join(" ")}`);
|
|
452
448
|
const nodeOptions = [(process.env.NODE_OPTIONS ?? "").replace(/--import[= ]\S+/g, "").trim(), `--import=${preloadPath}`].filter(Boolean).join(" ");
|
|
@@ -563,7 +559,7 @@ function getProductionConfigFromGkm(config) {
|
|
|
563
559
|
}
|
|
564
560
|
async function devCommand(options) {
|
|
565
561
|
if (options.entry) return entryDevCommand(options);
|
|
566
|
-
const defaultEnv =
|
|
562
|
+
const defaultEnv = require_workspace$1.loadEnvFiles(".env");
|
|
567
563
|
if (defaultEnv.loaded.length > 0) logger$11.log(`📦 Loaded env: ${defaultEnv.loaded.join(", ")}`);
|
|
568
564
|
const appName = require_config.getAppNameFromCwd();
|
|
569
565
|
let config;
|
|
@@ -597,6 +593,7 @@ async function devCommand(options) {
|
|
|
597
593
|
return workspaceDevCommand(loadedConfig.workspace, options);
|
|
598
594
|
}
|
|
599
595
|
config = loadedConfig.raw;
|
|
596
|
+
workspace = loadedConfig.workspace;
|
|
600
597
|
}
|
|
601
598
|
else {
|
|
602
599
|
const loadedConfig = await require_config.loadWorkspaceConfig();
|
|
@@ -608,7 +605,7 @@ async function devCommand(options) {
|
|
|
608
605
|
workspace = loadedConfig.workspace;
|
|
609
606
|
}
|
|
610
607
|
if (config.env) {
|
|
611
|
-
const { loaded, missing } =
|
|
608
|
+
const { loaded, missing } = require_workspace$1.loadEnvFiles(config.env, appRoot);
|
|
612
609
|
if (loaded.length > 0) logger$11.log(`📦 Loaded env: ${loaded.join(", ")}`);
|
|
613
610
|
if (missing.length > 0) logger$11.warn(`⚠️ Missing env files: ${missing.join(", ")}`);
|
|
614
611
|
}
|
|
@@ -629,7 +626,7 @@ async function devCommand(options) {
|
|
|
629
626
|
appRoot,
|
|
630
627
|
providers: ["server"],
|
|
631
628
|
enableOpenApi,
|
|
632
|
-
cacheBackend:
|
|
629
|
+
cacheBackend: require_workspace$1.cacheBackendFor(require_workspace$1.providerOf(workspace ?? config)),
|
|
633
630
|
telescope,
|
|
634
631
|
studio,
|
|
635
632
|
hooks,
|
|
@@ -640,25 +637,14 @@ async function devCommand(options) {
|
|
|
640
637
|
const initial = await build();
|
|
641
638
|
const runtime = config.runtime ?? "node";
|
|
642
639
|
let secretsJsonPath;
|
|
643
|
-
const appSecrets = await
|
|
644
|
-
if (workspace
|
|
645
|
-
const reconciled = await
|
|
640
|
+
const appSecrets = await require_workspace$1.loadSecretsForApp(secretsRoot, config.stages.local, workspaceAppName);
|
|
641
|
+
if (workspace) {
|
|
642
|
+
const reconciled = await require_workspace$1.reconcileWorkspace(workspace, { stage: workspace.stages.local });
|
|
646
643
|
if (reconciled.changed && reconciled.plan.containers.length > 0) {
|
|
647
644
|
logger$11.log(`🐳 Services: ${reconciled.plan.containers.join(", ")}`);
|
|
648
645
|
for (const [container, address] of Object.entries(reconciled.addresses)) logger$11.log(` ${container}: ${address}`);
|
|
649
646
|
}
|
|
650
647
|
Object.assign(appSecrets, reconciled.env);
|
|
651
|
-
} else {
|
|
652
|
-
const resolvedPorts = await require_credentials.resolveServicePorts(secretsRoot);
|
|
653
|
-
if (Object.keys(resolvedPorts.ports).length > 0) {
|
|
654
|
-
const rewritten = require_credentials.rewriteUrlsWithPorts(appSecrets, resolvedPorts);
|
|
655
|
-
Object.assign(appSecrets, rewritten);
|
|
656
|
-
logger$11.log(`🔌 Applied ${Object.keys(resolvedPorts.ports).length} port mapping(s)`);
|
|
657
|
-
}
|
|
658
|
-
}
|
|
659
|
-
if (workspace && workspaceAppName) {
|
|
660
|
-
const depEnv = require_workspace.getDependencyEnvVars(workspace, workspaceAppName);
|
|
661
|
-
for (const [key, value] of Object.entries(depEnv)) appSecrets[key] ??= value;
|
|
662
648
|
}
|
|
663
649
|
if (Object.keys(appSecrets).length > 0) {
|
|
664
650
|
const secretsDir = (0, node_path.join)(secretsRoot, ".gkm");
|
|
@@ -727,19 +713,6 @@ async function devCommand(options) {
|
|
|
727
713
|
process.on("SIGTERM", shutdown);
|
|
728
714
|
}
|
|
729
715
|
/**
|
|
730
|
-
* Generate all dependency environment variables for all apps.
|
|
731
|
-
* Returns a flat object with all {APP_NAME}_URL variables.
|
|
732
|
-
* @internal Exported for testing
|
|
733
|
-
*/
|
|
734
|
-
function generateAllDependencyEnvVars(workspace, urlPrefix = "http://localhost") {
|
|
735
|
-
const env = {};
|
|
736
|
-
for (const appName of Object.keys(workspace.apps)) {
|
|
737
|
-
const appEnv = require_workspace.getDependencyEnvVars(workspace, appName, urlPrefix);
|
|
738
|
-
Object.assign(env, appEnv);
|
|
739
|
-
}
|
|
740
|
-
return env;
|
|
741
|
-
}
|
|
742
|
-
/**
|
|
743
716
|
* Check for port conflicts across all apps.
|
|
744
717
|
* Returns list of conflicts if any ports are duplicated.
|
|
745
718
|
* @internal Exported for testing
|
|
@@ -964,38 +937,26 @@ async function workspaceDevCommand(workspace, options) {
|
|
|
964
937
|
logger$11.log("✅ Frontend apps validated");
|
|
965
938
|
}
|
|
966
939
|
const rawSecrets = await loadDevSecrets(workspace);
|
|
967
|
-
|
|
940
|
+
const reconciled = await require_workspace$1.reconcileWorkspace(workspace, { stage: workspace.stages.local });
|
|
941
|
+
if (reconciled.changed && reconciled.plan.containers.length > 0) {
|
|
942
|
+
logger$11.log(`🐳 Services: ${reconciled.plan.containers.join(", ")}`);
|
|
943
|
+
for (const [container, address] of Object.entries(reconciled.addresses)) logger$11.log(` ${container}: ${address}`);
|
|
944
|
+
}
|
|
945
|
+
const secretsEnv = {
|
|
946
|
+
...rawSecrets,
|
|
947
|
+
...reconciled.env
|
|
948
|
+
};
|
|
968
949
|
const appUrls = {};
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
for (const [container, address] of Object.entries(reconciled.addresses)) logger$11.log(` ${container}: ${address}`);
|
|
974
|
-
}
|
|
975
|
-
secretsEnv = {
|
|
976
|
-
...rawSecrets,
|
|
977
|
-
...reconciled.env
|
|
978
|
-
};
|
|
979
|
-
for (const resource of reconciled.plan.resources) {
|
|
980
|
-
if (resource.kind !== "rest-api" && resource.kind !== "site") continue;
|
|
981
|
-
const address = reconciled.env[resource.envKey];
|
|
982
|
-
if (address) appUrls[resource.id] = address;
|
|
983
|
-
}
|
|
984
|
-
} else {
|
|
985
|
-
const resolvedPorts = await require_credentials.resolveServicePorts(workspace.root);
|
|
986
|
-
await require_credentials.startWorkspaceServices(workspace, resolvedPorts.dockerEnv, rawSecrets);
|
|
987
|
-
secretsEnv = require_credentials.rewriteUrlsWithPorts(rawSecrets, resolvedPorts);
|
|
950
|
+
for (const resource of reconciled.plan.resources) {
|
|
951
|
+
if (resource.kind !== "rest-api" && resource.kind !== "site") continue;
|
|
952
|
+
const address = reconciled.env[resource.envKey];
|
|
953
|
+
if (address) appUrls[resource.id] = address;
|
|
988
954
|
}
|
|
989
955
|
if (Object.keys(secretsEnv).length > 0) logger$11.log(` Loaded ${Object.keys(secretsEnv).length} secret(s)`);
|
|
990
956
|
if (Object.keys(appUrls).length > 0) {
|
|
991
957
|
logger$11.log("🔒 App URLs:");
|
|
992
958
|
for (const [id, address] of Object.entries(appUrls)) logger$11.log(` ${id}: ${address}`);
|
|
993
959
|
}
|
|
994
|
-
const dependencyEnv = Object.fromEntries(Object.entries(generateAllDependencyEnvVars(workspace)).filter(([key]) => secretsEnv[key] === void 0));
|
|
995
|
-
if (Object.keys(dependencyEnv).length > 0) {
|
|
996
|
-
logger$11.log("📡 Dependency URLs:");
|
|
997
|
-
for (const [key, value] of Object.entries(dependencyEnv)) logger$11.log(` ${key}=${value}`);
|
|
998
|
-
}
|
|
999
960
|
let turboFilter = [];
|
|
1000
961
|
if (options.app) {
|
|
1001
962
|
if (!workspace.apps[options.app]) {
|
|
@@ -1038,7 +999,6 @@ async function workspaceDevCommand(workspace, options) {
|
|
|
1038
999
|
const turboEnv = {
|
|
1039
1000
|
...process.env,
|
|
1040
1001
|
...secretsEnv,
|
|
1041
|
-
...dependencyEnv,
|
|
1042
1002
|
NODE_ENV: "development",
|
|
1043
1003
|
...configPath ? { GKM_CONFIG_PATH: configPath } : {}
|
|
1044
1004
|
};
|
|
@@ -1046,7 +1006,7 @@ async function workspaceDevCommand(workspace, options) {
|
|
|
1046
1006
|
const held = [];
|
|
1047
1007
|
for (const appName of scoped) {
|
|
1048
1008
|
const port = workspace.apps[appName]?.port;
|
|
1049
|
-
if (port && !await
|
|
1009
|
+
if (port && !await require_workspace$1.isPortAvailable(port)) held.push({
|
|
1050
1010
|
app: appName,
|
|
1051
1011
|
port,
|
|
1052
1012
|
holder: listenerOn(port)
|
|
@@ -1111,16 +1071,16 @@ async function entryDevCommand(options) {
|
|
|
1111
1071
|
if (!entry) throw new Error("--entry requires a file path");
|
|
1112
1072
|
const entryPath = (0, node_path.resolve)(process.cwd(), entry);
|
|
1113
1073
|
if (!(0, node_fs.existsSync)(entryPath)) throw new Error(`Entry file not found: ${entryPath}`);
|
|
1114
|
-
const defaultEnv =
|
|
1074
|
+
const defaultEnv = require_workspace$1.loadEnvFiles(".env");
|
|
1115
1075
|
if (defaultEnv.loaded.length > 0) logger$11.log(`📦 Loaded env: ${defaultEnv.loaded.join(", ")}`);
|
|
1116
|
-
const { credentials, resolvedPort, secretsJsonPath, appName } = await
|
|
1076
|
+
const { credentials, resolvedPort, secretsJsonPath, appName } = await require_workspace$1.prepareEntryCredentials({ explicitPort: options.portExplicit ? options.port : void 0 });
|
|
1117
1077
|
if (appName) logger$11.log(`📦 App: ${appName} (port ${resolvedPort})`);
|
|
1118
1078
|
logger$11.log(`🚀 Starting entry file: ${entry} on port ${resolvedPort}`);
|
|
1119
1079
|
if (Object.keys(credentials).length > 1) logger$11.log(`🔐 Loaded ${Object.keys(credentials).length - 1} secret(s) + PORT`);
|
|
1120
1080
|
const wrapperDir = (0, node_path.join)(process.cwd(), ".gkm");
|
|
1121
1081
|
await (0, node_fs_promises.mkdir)(wrapperDir, { recursive: true });
|
|
1122
1082
|
const wrapperPath = (0, node_path.join)(wrapperDir, "entry-wrapper.ts");
|
|
1123
|
-
await
|
|
1083
|
+
await require_workspace$1.createEntryWrapper(wrapperPath, entryPath, secretsJsonPath);
|
|
1124
1084
|
const runner = new EntryRunner(wrapperPath, entryPath, watch, resolvedPort);
|
|
1125
1085
|
await runner.start();
|
|
1126
1086
|
let isShuttingDown = false;
|
|
@@ -1380,10 +1340,10 @@ var DevServer = class {
|
|
|
1380
1340
|
this.startTime = Date.now();
|
|
1381
1341
|
if (this.isRunning) await this.stop();
|
|
1382
1342
|
if (this.portExplicit) {
|
|
1383
|
-
if (!await
|
|
1343
|
+
if (!await require_workspace$1.isPortAvailable(this.requestedPort)) throw new DevPortInUse(this.requestedPort, listenerOn(this.requestedPort));
|
|
1384
1344
|
this.actualPort = this.requestedPort;
|
|
1385
1345
|
} else {
|
|
1386
|
-
this.actualPort = await
|
|
1346
|
+
this.actualPort = await require_workspace$1.findAvailablePort(this.requestedPort);
|
|
1387
1347
|
if (this.actualPort !== this.requestedPort) logger$11.log(`ℹ️ Port ${this.requestedPort} was in use, using port ${this.actualPort} instead`);
|
|
1388
1348
|
}
|
|
1389
1349
|
const serverEntryPath = (0, node_path.join)(this.appRoot, ".gkm", this.provider, "server.ts");
|
|
@@ -1456,7 +1416,7 @@ var DevServer = class {
|
|
|
1456
1416
|
await this.stop();
|
|
1457
1417
|
let attempts = 0;
|
|
1458
1418
|
while (attempts < 30) {
|
|
1459
|
-
if (await
|
|
1419
|
+
if (await require_workspace$1.isPortAvailable(portToReuse)) break;
|
|
1460
1420
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
1461
1421
|
attempts++;
|
|
1462
1422
|
}
|
|
@@ -2632,7 +2592,7 @@ async function buildCommand(options) {
|
|
|
2632
2592
|
}
|
|
2633
2593
|
const config = loadedConfig.type !== "workspace" ? await require_config.loadConfig() : (0, node_path.resolve)(process.cwd()) === (0, node_path.resolve)(loadedConfig.workspace.root) ? rootGkmConfig(loadedConfig.workspace) : (await require_config.loadAppConfig()).gkmConfig;
|
|
2634
2594
|
const resolved = resolveProviders(config, options);
|
|
2635
|
-
const cacheBackend =
|
|
2595
|
+
const cacheBackend = require_workspace$1.cacheBackendFor(require_workspace$1.providerOf(loadedConfig.workspace));
|
|
2636
2596
|
const productionConfigFromGkm = getProductionConfigFromGkm(config);
|
|
2637
2597
|
const production = normalizeProductionConfig(options.production ?? false, productionConfigFromGkm);
|
|
2638
2598
|
if (production) logger$9.log(`🏭 Building for PRODUCTION`);
|
|
@@ -3066,7 +3026,7 @@ const PROVISIONERS = {
|
|
|
3066
3026
|
*/
|
|
3067
3027
|
database: async (declaration, context) => {
|
|
3068
3028
|
if (declaration.kind !== "database") throw new WrongKind(declaration.kind);
|
|
3069
|
-
const name =
|
|
3029
|
+
const name = require_workspace$1.resourceName(declaration.id, declaration.kind, context.stage);
|
|
3070
3030
|
const { postgres } = await context.api.findOrCreatePostgres(serviceName({
|
|
3071
3031
|
stage: context.stage,
|
|
3072
3032
|
app: context.project
|
|
@@ -3102,7 +3062,7 @@ const PROVISIONERS = {
|
|
|
3102
3062
|
if (declaration.kind !== "database-schema") throw new WrongKind(declaration.kind);
|
|
3103
3063
|
const parent = context.provisioned[declaration.of];
|
|
3104
3064
|
if (!parent) throw new UnresolvedParent(declaration.id, declaration.of);
|
|
3105
|
-
const runtime =
|
|
3065
|
+
const runtime = require_workspace$1.resourceName(declaration.id, declaration.kind, context.stage);
|
|
3106
3066
|
const owner = (0, _geekmidas_db_pg_roles.ownerRole)(runtime);
|
|
3107
3067
|
const reads = readsFrom(context.manifest, declaration.id);
|
|
3108
3068
|
const parentUrl = new URL(parent.provides[(0, _geekmidas_manifest.provideKey)(declaration.of, "url")] ?? "");
|
|
@@ -3204,7 +3164,7 @@ const PROVISIONERS = {
|
|
|
3204
3164
|
stage: context.stage,
|
|
3205
3165
|
app: context.project
|
|
3206
3166
|
}, declaration.id);
|
|
3207
|
-
const bucket =
|
|
3167
|
+
const bucket = require_workspace$1.resourceName(declaration.id, declaration.kind, context.stage);
|
|
3208
3168
|
const user = `${bucket}-root`;
|
|
3209
3169
|
const password = derivedPassword(context, `objects:${declaration.id}`);
|
|
3210
3170
|
const { compose } = await context.api.findOrCreateCompose(service, context.projectId, context.environmentId, minioCompose({
|
|
@@ -3572,10 +3532,6 @@ var UnprovisionableBucket = class extends Error {
|
|
|
3572
3532
|
*/
|
|
3573
3533
|
/**
|
|
3574
3534
|
* Provision everything the workspace declares, and return what it resolved.
|
|
3575
|
-
*
|
|
3576
|
-
* Nothing happens for a project that has not adopted the model: `usesConstructs`
|
|
3577
|
-
* is the same hard switch reconcile reads, so an existing deploy is untouched
|
|
3578
|
-
* until it declares something.
|
|
3579
3535
|
*/
|
|
3580
3536
|
async function provisionDeclared(options) {
|
|
3581
3537
|
const { workspace } = options;
|
|
@@ -3585,9 +3541,8 @@ async function provisionDeclared(options) {
|
|
|
3585
3541
|
provisioned: {},
|
|
3586
3542
|
clusters: {}
|
|
3587
3543
|
};
|
|
3588
|
-
if (!require_credentials.usesConstructs(workspace)) return empty;
|
|
3589
3544
|
const manifest = options.manifest ?? await require_discover.discover({
|
|
3590
|
-
patterns:
|
|
3545
|
+
patterns: require_workspace$1.constructGlobs(workspace),
|
|
3591
3546
|
cwd: workspace.root
|
|
3592
3547
|
});
|
|
3593
3548
|
if (Object.keys(manifest).length === 0) return empty;
|
|
@@ -3599,9 +3554,9 @@ async function provisionDeclared(options) {
|
|
|
3599
3554
|
environmentId: options.environmentId,
|
|
3600
3555
|
stage: options.stage,
|
|
3601
3556
|
project: workspace.name,
|
|
3602
|
-
cache:
|
|
3603
|
-
events:
|
|
3604
|
-
storage:
|
|
3557
|
+
cache: require_workspace$1.cacheBackendFor(require_workspace$1.providerOf(workspace)),
|
|
3558
|
+
events: require_workspace$1.eventsBackendFor(require_workspace$1.providerOf(workspace)),
|
|
3559
|
+
storage: require_workspace$1.storageBackendFor(require_workspace$1.providerOf(workspace)),
|
|
3605
3560
|
addresses: surfaceAddresses(workspace, manifest, options.appUrls),
|
|
3606
3561
|
...options.secrets ? { secrets: options.secrets } : {},
|
|
3607
3562
|
deferred: [],
|
|
@@ -3638,7 +3593,7 @@ async function provisionDeclared(options) {
|
|
|
3638
3593
|
* run again.
|
|
3639
3594
|
*/
|
|
3640
3595
|
async function applyDeclared(client, statements) {
|
|
3641
|
-
return (await
|
|
3596
|
+
return (await require_workspace$1.applyPostgres(client, statements)).filter((entry) => entry.created).length;
|
|
3642
3597
|
}
|
|
3643
3598
|
/**
|
|
3644
3599
|
* The provisioning order, with queues and topics moved to the end.
|
|
@@ -5328,7 +5283,7 @@ async function workspaceDockerCommand(workspace) {
|
|
|
5328
5283
|
await (0, node_fs_promises.writeFile)(dockerignorePath, dockerignore);
|
|
5329
5284
|
logger$7.log(`\n Generated: .dockerignore (workspace root)`);
|
|
5330
5285
|
const composePath = await writeConstructsCompose(workspace);
|
|
5331
|
-
logger$7.log(`\n✅ Generated ${results.length} Dockerfile(s) + ${
|
|
5286
|
+
logger$7.log(`\n✅ Generated ${results.length} Dockerfile(s) + ${require_workspace$1.COMPOSE_PATH}`);
|
|
5332
5287
|
logger$7.log("\n📋 Build commands:");
|
|
5333
5288
|
for (const result of results) {
|
|
5334
5289
|
const icon = result.type === "backend" ? "⚙️" : result.type === "mobile" ? "📱" : "🌐";
|
|
@@ -5349,18 +5304,18 @@ async function workspaceDockerCommand(workspace) {
|
|
|
5349
5304
|
* describes and what `gkm dev` runs cannot disagree. Nothing is started.
|
|
5350
5305
|
*/
|
|
5351
5306
|
async function writeConstructsCompose(workspace) {
|
|
5352
|
-
await
|
|
5307
|
+
await require_workspace$1.reconcileWorkspace(workspace, {
|
|
5353
5308
|
stage: workspace.stages.local,
|
|
5354
5309
|
start: false
|
|
5355
5310
|
});
|
|
5356
|
-
logger$7.log(` Generated: ${
|
|
5357
|
-
return (0, node_path.join)(workspace.root,
|
|
5311
|
+
logger$7.log(` Generated: ${require_workspace$1.COMPOSE_PATH} (project root)`);
|
|
5312
|
+
return (0, node_path.join)(workspace.root, require_workspace$1.COMPOSE_PATH);
|
|
5358
5313
|
}
|
|
5359
5314
|
function printRunInstructions(workspace) {
|
|
5360
5315
|
const project = (0, node_fs.existsSync)((0, node_path.join)(workspace.root, "docker-compose.yml")) ? " -f docker-compose.yml" : "";
|
|
5361
5316
|
logger$7.log("\n📋 Run everything (the apps sit behind the \"apps\" profile):");
|
|
5362
5317
|
logger$7.log(" gkm setup # starts the containers and creates what they hold");
|
|
5363
|
-
logger$7.log(` docker compose -f ${
|
|
5318
|
+
logger$7.log(` docker compose -f ${require_workspace$1.COMPOSE_PATH}${project} --profile apps up --build`);
|
|
5364
5319
|
}
|
|
5365
5320
|
//#endregion
|
|
5366
5321
|
//#region src/deploy/docker.ts
|
|
@@ -7043,7 +6998,7 @@ function requiredOf(requirements) {
|
|
|
7043
6998
|
async function workspaceDeployCommand(configured, options) {
|
|
7044
6999
|
const { provider, stage, tag, apps: selectedApps } = options;
|
|
7045
7000
|
const manifest = await require_discover.discover({
|
|
7046
|
-
patterns:
|
|
7001
|
+
patterns: require_workspace$1.constructGlobs(configured),
|
|
7047
7002
|
cwd: configured.root
|
|
7048
7003
|
});
|
|
7049
7004
|
const units = deployUnits(manifest, configured);
|
|
@@ -8597,26 +8552,26 @@ function loadPackageJson() {
|
|
|
8597
8552
|
* Run: pnpm --filter @geekmidas/cli sync-versions
|
|
8598
8553
|
*/
|
|
8599
8554
|
const GEEKMIDAS_VERSIONS = {
|
|
8600
|
-
"@geekmidas/audit": "~10.0.0-alpha.
|
|
8601
|
-
"@geekmidas/auth": "~10.0.0-alpha.
|
|
8602
|
-
"@geekmidas/cache": "~10.0.0-alpha.
|
|
8603
|
-
"@geekmidas/client": "~10.0.0-alpha.
|
|
8604
|
-
"@geekmidas/cloud": "~10.0.0-alpha.
|
|
8605
|
-
"@geekmidas/constructs": "~10.0.0-alpha.
|
|
8606
|
-
"@geekmidas/db": "~10.0.0-alpha.
|
|
8607
|
-
"@geekmidas/emailkit": "~10.0.0-alpha.
|
|
8608
|
-
"@geekmidas/envkit": "~10.0.0-alpha.
|
|
8609
|
-
"@geekmidas/errors": "~10.0.0-alpha.
|
|
8610
|
-
"@geekmidas/events": "~10.0.0-alpha.
|
|
8611
|
-
"@geekmidas/logger": "~10.0.0-alpha.
|
|
8612
|
-
"@geekmidas/manifest": "~10.0.0-alpha.
|
|
8613
|
-
"@geekmidas/rate-limit": "~10.0.0-alpha.
|
|
8614
|
-
"@geekmidas/schema": "~10.0.0-alpha.
|
|
8615
|
-
"@geekmidas/services": "~10.0.0-alpha.
|
|
8616
|
-
"@geekmidas/storage": "~10.0.0-alpha.
|
|
8617
|
-
"@geekmidas/studio": "~10.0.0-alpha.
|
|
8618
|
-
"@geekmidas/telescope": "~10.0.0-alpha.
|
|
8619
|
-
"@geekmidas/testkit": "~10.0.0-alpha.
|
|
8555
|
+
"@geekmidas/audit": "~10.0.0-alpha.27",
|
|
8556
|
+
"@geekmidas/auth": "~10.0.0-alpha.27",
|
|
8557
|
+
"@geekmidas/cache": "~10.0.0-alpha.27",
|
|
8558
|
+
"@geekmidas/client": "~10.0.0-alpha.27",
|
|
8559
|
+
"@geekmidas/cloud": "~10.0.0-alpha.27",
|
|
8560
|
+
"@geekmidas/constructs": "~10.0.0-alpha.27",
|
|
8561
|
+
"@geekmidas/db": "~10.0.0-alpha.27",
|
|
8562
|
+
"@geekmidas/emailkit": "~10.0.0-alpha.27",
|
|
8563
|
+
"@geekmidas/envkit": "~10.0.0-alpha.27",
|
|
8564
|
+
"@geekmidas/errors": "~10.0.0-alpha.27",
|
|
8565
|
+
"@geekmidas/events": "~10.0.0-alpha.27",
|
|
8566
|
+
"@geekmidas/logger": "~10.0.0-alpha.27",
|
|
8567
|
+
"@geekmidas/manifest": "~10.0.0-alpha.27",
|
|
8568
|
+
"@geekmidas/rate-limit": "~10.0.0-alpha.27",
|
|
8569
|
+
"@geekmidas/schema": "~10.0.0-alpha.27",
|
|
8570
|
+
"@geekmidas/services": "~10.0.0-alpha.27",
|
|
8571
|
+
"@geekmidas/storage": "~10.0.0-alpha.27",
|
|
8572
|
+
"@geekmidas/studio": "~10.0.0-alpha.27",
|
|
8573
|
+
"@geekmidas/telescope": "~10.0.0-alpha.27",
|
|
8574
|
+
"@geekmidas/testkit": "~10.0.0-alpha.27",
|
|
8620
8575
|
"@geekmidas/cli": `~${loadPackageJson().version}`
|
|
8621
8576
|
};
|
|
8622
8577
|
//#endregion
|
|
@@ -14531,7 +14486,7 @@ async function initCommand(projectName, options = {}) {
|
|
|
14531
14486
|
}
|
|
14532
14487
|
console.log("🔐 Initializing encrypted secrets...\n");
|
|
14533
14488
|
const local = templateOptions.stages.local;
|
|
14534
|
-
const devSecrets =
|
|
14489
|
+
const devSecrets = require_reconcile.createStageSecrets(local, [], { projectName: name });
|
|
14535
14490
|
const customSecrets = {
|
|
14536
14491
|
PORT: "3000",
|
|
14537
14492
|
LOG_LEVEL: "debug",
|
|
@@ -14716,7 +14671,7 @@ async function secretsInitCommand(options) {
|
|
|
14716
14671
|
logger$3.log(" Detected workspace mode — generating per-app secrets");
|
|
14717
14672
|
}
|
|
14718
14673
|
} catch {}
|
|
14719
|
-
const secrets =
|
|
14674
|
+
const secrets = require_reconcile.createStageSecrets(stage, [], { projectName });
|
|
14720
14675
|
if (workspaceSecrets) secrets.custom = workspaceSecrets;
|
|
14721
14676
|
await require_storage.writeStageSecrets(secrets);
|
|
14722
14677
|
logger$3.log(`\n✓ Secrets initialized for stage "${stage}"`);
|
|
@@ -14814,13 +14769,13 @@ async function secretsRotateCommand(options) {
|
|
|
14814
14769
|
logger$3.error(`Service "${service}" not configured in stage "${stage}"`);
|
|
14815
14770
|
process.exit(1);
|
|
14816
14771
|
}
|
|
14817
|
-
const updated =
|
|
14772
|
+
const updated = require_reconcile.rotateServicePassword(secrets, service);
|
|
14818
14773
|
await require_storage.writeStageSecrets(updated);
|
|
14819
14774
|
logger$3.log(`\n✓ Password rotated for ${service} in stage "${stage}"`);
|
|
14820
14775
|
} else {
|
|
14821
14776
|
let updated = secrets;
|
|
14822
14777
|
const services = Object.keys(secrets.services);
|
|
14823
|
-
for (const svc of services) updated =
|
|
14778
|
+
for (const svc of services) updated = require_reconcile.rotateServicePassword(updated, svc);
|
|
14824
14779
|
await require_storage.writeStageSecrets(updated);
|
|
14825
14780
|
logger$3.log(`\n✓ Passwords rotated for all services in stage "${stage}": ${services.join(", ")}`);
|
|
14826
14781
|
}
|
|
@@ -14944,7 +14899,7 @@ function installation(platform, certificate) {
|
|
|
14944
14899
|
*/
|
|
14945
14900
|
async function trustCommand(options = {}) {
|
|
14946
14901
|
const { workspace } = await require_config.loadWorkspaceConfig();
|
|
14947
|
-
const certificate = (0, node_path.join)(workspace.root,
|
|
14902
|
+
const certificate = (0, node_path.join)(workspace.root, require_workspace$1.LOCAL_CA_PATH);
|
|
14948
14903
|
if (!(0, node_fs.existsSync)(certificate)) throw new NoLocalAuthority(certificate);
|
|
14949
14904
|
const { describe, steps } = installation(process.platform, certificate);
|
|
14950
14905
|
logger$2.log(`\n🔐 Trusting the local authority in ${describe}`);
|
|
@@ -15087,7 +15042,7 @@ async function setupCommand(options = {}) {
|
|
|
15087
15042
|
logger$1.error("❌ Failed to resolve secrets. Exiting.");
|
|
15088
15043
|
process.exit(1);
|
|
15089
15044
|
}
|
|
15090
|
-
const containers = await
|
|
15045
|
+
const containers = await require_workspace$1.derivedContainers(workspace, stage);
|
|
15091
15046
|
if (isMultiApp && containers.includes("postgres")) {
|
|
15092
15047
|
await require_reconcile.writeDockerEnvFromSecrets(secrets, workspace.root);
|
|
15093
15048
|
logger$1.log("📄 Generated docker/.env with database passwords");
|
|
@@ -15106,7 +15061,7 @@ async function setupCommand(options = {}) {
|
|
|
15106
15061
|
* free and quiet.
|
|
15107
15062
|
*/
|
|
15108
15063
|
async function reconcileLocal(workspace, stage, options) {
|
|
15109
|
-
const result = await
|
|
15064
|
+
const result = await require_workspace$1.reconcileWorkspace(workspace, { stage });
|
|
15110
15065
|
if (result.plan.containers.length === 0) {
|
|
15111
15066
|
logger$1.log("🐳 No containers declared");
|
|
15112
15067
|
return;
|
|
@@ -15138,7 +15093,7 @@ async function resolveSecrets(stage, workspace, options) {
|
|
|
15138
15093
|
logger$1.log("🔐 Using existing local secrets");
|
|
15139
15094
|
const secrets = await require_storage.readStageSecrets(stage, workspace.root);
|
|
15140
15095
|
if (secrets) {
|
|
15141
|
-
const reconciled = reconcileSecrets(secrets, workspace, await
|
|
15096
|
+
const reconciled = reconcileSecrets(secrets, workspace, await require_workspace$1.derivedContainers(workspace, stage));
|
|
15142
15097
|
if (reconciled) await require_storage.writeStageSecrets(reconciled, workspace.root);
|
|
15143
15098
|
return reconciled ?? secrets;
|
|
15144
15099
|
}
|
|
@@ -15186,7 +15141,7 @@ function reconcileSecrets(secrets, workspace, containers = []) {
|
|
|
15186
15141
|
let changed = false;
|
|
15187
15142
|
let result = { ...secrets };
|
|
15188
15143
|
for (const name of credentialedServices(containers)) if (!result.services[name]) {
|
|
15189
|
-
const creds =
|
|
15144
|
+
const creds = require_reconcile.generateServiceCredentials(name);
|
|
15190
15145
|
if (name === "minio") {
|
|
15191
15146
|
creds.bucket = workspace.name;
|
|
15192
15147
|
creds.username = workspace.name;
|
|
@@ -15198,7 +15153,7 @@ function reconcileSecrets(secrets, workspace, containers = []) {
|
|
|
15198
15153
|
[name]: creds
|
|
15199
15154
|
}
|
|
15200
15155
|
};
|
|
15201
|
-
result.urls =
|
|
15156
|
+
result.urls = require_reconcile.generateConnectionUrls(result.services, result.eventsBackend);
|
|
15202
15157
|
logger$1.log(` 🔄 Adding missing service credentials: ${name}`);
|
|
15203
15158
|
changed = true;
|
|
15204
15159
|
}
|
|
@@ -15211,12 +15166,12 @@ function reconcileSecrets(secrets, workspace, containers = []) {
|
|
|
15211
15166
|
host: result.services.postgres.host,
|
|
15212
15167
|
port: result.services.postgres.port,
|
|
15213
15168
|
username: "pgboss",
|
|
15214
|
-
password:
|
|
15169
|
+
password: require_reconcile.generateSecurePassword(),
|
|
15215
15170
|
database: result.services.postgres.database ?? "app"
|
|
15216
15171
|
}
|
|
15217
15172
|
}
|
|
15218
15173
|
};
|
|
15219
|
-
result.urls =
|
|
15174
|
+
result.urls = require_reconcile.generateConnectionUrls(result.services, result.eventsBackend);
|
|
15220
15175
|
logger$1.log(" 🔄 Adding missing service credentials: pgboss");
|
|
15221
15176
|
changed = true;
|
|
15222
15177
|
}
|
|
@@ -15251,7 +15206,7 @@ function reconcileSecrets(secrets, workspace, containers = []) {
|
|
|
15251
15206
|
*/
|
|
15252
15207
|
function createFreshWorkspaceSecrets(stage, workspace, containers = []) {
|
|
15253
15208
|
const serviceNames = credentialedServices(containers);
|
|
15254
|
-
const secrets =
|
|
15209
|
+
const secrets = require_reconcile.createStageSecrets(stage, serviceNames, { projectName: workspace.name });
|
|
15255
15210
|
if (Object.keys(workspace.apps).length > 1) secrets.custom = require_reconcile.generateFullstackCustomSecrets(workspace, containers);
|
|
15256
15211
|
else secrets.custom = {
|
|
15257
15212
|
PORT: "3000",
|
|
@@ -15273,7 +15228,7 @@ function createFreshWorkspaceSecrets(stage, workspace, containers = []) {
|
|
|
15273
15228
|
async function ensureStageSecrets(stage, cwd = process.cwd()) {
|
|
15274
15229
|
const { workspace } = await require_config.loadWorkspaceConfig(cwd);
|
|
15275
15230
|
if (require_storage.secretsExist(stage, workspace.root)) return false;
|
|
15276
|
-
const secrets = createFreshWorkspaceSecrets(stage, workspace, await
|
|
15231
|
+
const secrets = createFreshWorkspaceSecrets(stage, workspace, await require_workspace$1.derivedContainers(workspace, stage));
|
|
15277
15232
|
await require_storage.writeStageSecrets(secrets, workspace.root);
|
|
15278
15233
|
return true;
|
|
15279
15234
|
}
|
|
@@ -15281,7 +15236,7 @@ async function ensureStageSecrets(stage, cwd = process.cwd()) {
|
|
|
15281
15236
|
* Generate fresh secrets for the workspace.
|
|
15282
15237
|
*/
|
|
15283
15238
|
async function generateFreshSecrets(stage, workspace, options) {
|
|
15284
|
-
const secrets = createFreshWorkspaceSecrets(stage, workspace, await
|
|
15239
|
+
const secrets = createFreshWorkspaceSecrets(stage, workspace, await require_workspace$1.derivedContainers(workspace, stage));
|
|
15285
15240
|
await require_storage.writeStageSecrets(secrets, workspace.root);
|
|
15286
15241
|
logger$1.log(` Secrets written to .gkm/secrets/${stage}.json`);
|
|
15287
15242
|
if (require_transfer.isRemoteStore(workspace, stage) && !options.yes) {
|
|
@@ -15556,13 +15511,12 @@ async function testCommand(options = {}) {
|
|
|
15556
15511
|
const { ensureStageSecrets } = await Promise.resolve().then(() => setup_exports);
|
|
15557
15512
|
if (await ensureStageSecrets(stage, cwd)) console.log(` 🔐 Generated fresh ${stage} secrets (auto-setup)`);
|
|
15558
15513
|
}
|
|
15559
|
-
const defaultEnv =
|
|
15514
|
+
const defaultEnv = require_workspace$1.loadEnvFiles(".env");
|
|
15560
15515
|
if (defaultEnv.loaded.length > 0) console.log(` 📦 Loaded env: ${defaultEnv.loaded.join(", ")}`);
|
|
15561
|
-
const result = await
|
|
15516
|
+
const result = await require_workspace$1.prepareEntryCredentials({
|
|
15562
15517
|
stage,
|
|
15563
15518
|
startDocker: !options.prepare,
|
|
15564
15519
|
secretsFileName: "test-secrets.json",
|
|
15565
|
-
resolveDockerPorts: "full",
|
|
15566
15520
|
reconcileStage: "test"
|
|
15567
15521
|
});
|
|
15568
15522
|
let finalCredentials = { ...result.credentials };
|
|
@@ -15576,18 +15530,17 @@ async function testCommand(options = {}) {
|
|
|
15576
15530
|
console.log(` 🔍 Sniffed ${sniffed.requiredEnvVars.length} required env var(s)` + (result.declaredKeys.length > 0 ? `, kept ${result.declaredKeys.length} declared` : ""));
|
|
15577
15531
|
}
|
|
15578
15532
|
}
|
|
15579
|
-
finalCredentials = rewriteDatabaseUrlForTests(finalCredentials);
|
|
15580
15533
|
console.log("");
|
|
15581
15534
|
await (0, node_fs_promises.writeFile)(result.secretsJsonPath, JSON.stringify(finalCredentials, null, 2));
|
|
15582
15535
|
const gkmDir = (0, node_path.join)(cwd, ".gkm");
|
|
15583
15536
|
const preloadPath = (0, node_path.join)(gkmDir, "test-credentials-preload.ts");
|
|
15584
|
-
await
|
|
15537
|
+
await require_workspace$1.createCredentialsPreload(preloadPath, result.secretsJsonPath);
|
|
15585
15538
|
const workspace = await require_config.loadWorkspaceConfig(cwd).then((loaded) => loaded.workspace).catch(() => void 0);
|
|
15586
|
-
const manifestPath = workspace
|
|
15539
|
+
const manifestPath = workspace ? await writeTestHarness({
|
|
15587
15540
|
root: workspace.root,
|
|
15588
15541
|
targets: [workspace.root, ...Object.values(workspace.apps).map((app) => (0, node_path.isAbsolute)(app.path) ? app.path : (0, node_path.join)(workspace.root, app.path))],
|
|
15589
|
-
patterns:
|
|
15590
|
-
cacheBackend:
|
|
15542
|
+
patterns: require_workspace$1.constructGlobs(workspace),
|
|
15543
|
+
cacheBackend: require_workspace$1.backendsOf(workspace).cache,
|
|
15591
15544
|
stage: require_workspace.TEST_STAGE,
|
|
15592
15545
|
env: finalCredentials
|
|
15593
15546
|
}) : void 0;
|
|
@@ -15627,29 +15580,6 @@ async function testCommand(options = {}) {
|
|
|
15627
15580
|
});
|
|
15628
15581
|
});
|
|
15629
15582
|
}
|
|
15630
|
-
const TEST_DB_SUFFIX = "_test";
|
|
15631
|
-
/**
|
|
15632
|
-
* Rewrite DATABASE_URL to point to a separate test database.
|
|
15633
|
-
* Appends `_test` to the database name (e.g., `app` -> `app_test`).
|
|
15634
|
-
* @internal Exported for testing
|
|
15635
|
-
*/
|
|
15636
|
-
function rewriteDatabaseUrlForTests(env) {
|
|
15637
|
-
const result = { ...env };
|
|
15638
|
-
for (const key of Object.keys(result)) {
|
|
15639
|
-
if (!key.includes("DATABASE_URL")) continue;
|
|
15640
|
-
const value = result[key];
|
|
15641
|
-
try {
|
|
15642
|
-
const url = new URL(value);
|
|
15643
|
-
const dbName = url.pathname.slice(1);
|
|
15644
|
-
if (dbName && !dbName.endsWith(TEST_DB_SUFFIX)) {
|
|
15645
|
-
url.pathname = `/${dbName}${TEST_DB_SUFFIX}`;
|
|
15646
|
-
result[key] = url.toString();
|
|
15647
|
-
console.log(` 🧪 ${key}: using test database "${dbName}${TEST_DB_SUFFIX}"`);
|
|
15648
|
-
}
|
|
15649
|
-
} catch {}
|
|
15650
|
-
}
|
|
15651
|
-
return result;
|
|
15652
|
-
}
|
|
15653
15583
|
/** `gkm test` outside a project that declares stages, with none named. */
|
|
15654
15584
|
var NoStageToTest = class extends Error {
|
|
15655
15585
|
constructor() {
|
|
@@ -16190,7 +16120,7 @@ program.command("secrets:push").description("Send a deployed stage's secrets to
|
|
|
16190
16120
|
const globalOptions = program.opts();
|
|
16191
16121
|
if (globalOptions.cwd) process.chdir(globalOptions.cwd);
|
|
16192
16122
|
const { loadWorkspaceConfig } = await Promise.resolve().then(() => require("./config.cjs"));
|
|
16193
|
-
const { pushStageSecrets } = await Promise.resolve().then(() => require("./transfer-
|
|
16123
|
+
const { pushStageSecrets } = await Promise.resolve().then(() => require("./transfer-BYIn7z8m.cjs")).then((n) => n.transfer_exports);
|
|
16194
16124
|
const { workspace } = await loadWorkspaceConfig();
|
|
16195
16125
|
const { addedKeys } = await pushStageSecrets(workspace, options.stage, { profile: options.profile });
|
|
16196
16126
|
for (const key of addedKeys) console.log(` + ${key} (reconciled)`);
|
|
@@ -16205,7 +16135,7 @@ program.command("secrets:pull").description("Bring a deployed stage's secrets fr
|
|
|
16205
16135
|
const globalOptions = program.opts();
|
|
16206
16136
|
if (globalOptions.cwd) process.chdir(globalOptions.cwd);
|
|
16207
16137
|
const { loadWorkspaceConfig } = await Promise.resolve().then(() => require("./config.cjs"));
|
|
16208
|
-
const { pullStageSecrets } = await Promise.resolve().then(() => require("./transfer-
|
|
16138
|
+
const { pullStageSecrets } = await Promise.resolve().then(() => require("./transfer-BYIn7z8m.cjs")).then((n) => n.transfer_exports);
|
|
16209
16139
|
const { workspace } = await loadWorkspaceConfig();
|
|
16210
16140
|
const { addedKeys } = await pullStageSecrets(workspace, options.stage, { profile: options.profile });
|
|
16211
16141
|
for (const key of addedKeys) console.log(` + ${key} (reconciled)`);
|
|
@@ -16220,7 +16150,7 @@ program.command("secrets:reconcile").description("Backfill missing custom secret
|
|
|
16220
16150
|
const globalOptions = program.opts();
|
|
16221
16151
|
if (globalOptions.cwd) process.chdir(globalOptions.cwd);
|
|
16222
16152
|
const { loadWorkspaceConfig } = await Promise.resolve().then(() => require("./config.cjs"));
|
|
16223
|
-
const { reconcileMissingSecrets } = await Promise.resolve().then(() => require("./reconcile-
|
|
16153
|
+
const { reconcileMissingSecrets } = await Promise.resolve().then(() => require("./reconcile-szmJw_Sb.cjs")).then((n) => n.reconcile_exports);
|
|
16224
16154
|
const { readStageSecrets, writeStageSecrets } = await Promise.resolve().then(() => require("./storage-DgypfSD6.cjs")).then((n) => n.storage_exports);
|
|
16225
16155
|
const { workspace } = await loadWorkspaceConfig();
|
|
16226
16156
|
const stage = options.stage ?? workspace.stages.local;
|
|
@@ -16229,7 +16159,7 @@ program.command("secrets:reconcile").description("Backfill missing custom secret
|
|
|
16229
16159
|
console.error(`No secrets found for stage "${stage}". Run "gkm secrets:init --stage ${stage}" first.`);
|
|
16230
16160
|
process.exit(1);
|
|
16231
16161
|
}
|
|
16232
|
-
const { derivedContainers } = await Promise.resolve().then(() => require("./
|
|
16162
|
+
const { derivedContainers } = await Promise.resolve().then(() => require("./workspace-DgeVgxmm.cjs")).then((n) => n.workspace_exports);
|
|
16233
16163
|
const result = reconcileMissingSecrets(secrets, workspace, await derivedContainers(workspace, stage));
|
|
16234
16164
|
if (!result) {
|
|
16235
16165
|
console.log(`\n✓ Secrets for stage "${stage}" are up-to-date`);
|
|
@@ -16288,7 +16218,7 @@ program.command("deploy:github").description("Let GitHub Actions deploy a stage:
|
|
|
16288
16218
|
try {
|
|
16289
16219
|
const globalOptions = program.opts();
|
|
16290
16220
|
if (globalOptions.cwd) process.chdir(globalOptions.cwd);
|
|
16291
|
-
const { deployGithubCommand } = await Promise.resolve().then(() => require("./github-
|
|
16221
|
+
const { deployGithubCommand } = await Promise.resolve().then(() => require("./github-CQflOKKV.cjs"));
|
|
16292
16222
|
await deployGithubCommand(options);
|
|
16293
16223
|
} catch (error) {
|
|
16294
16224
|
console.error(formatError(error));
|