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