diff --git a/.changeset/hip-steaks-share.md b/.changeset/hip-steaks-share.md new file mode 100644 index 000000000..5cd59183b --- /dev/null +++ b/.changeset/hip-steaks-share.md @@ -0,0 +1,5 @@ +--- +"sst": patch +--- + +Fix sst bind to skip empty env vars so local env values aren’t overwritten diff --git a/packages/sst/src/cli/commands/bind.ts b/packages/sst/src/cli/commands/bind.ts index f5f8f3d50..8dc0226df 100644 --- a/packages/sst/src/cli/commands/bind.ts +++ b/packages/sst/src/cli/commands/bind.ts @@ -14,8 +14,8 @@ type BIND_REASON = | "secrets_updated" | "iam_expired"; -class MetadataNotFoundError extends Error {} -class MetadataOutdatedError extends Error {} +class MetadataNotFoundError extends Error { } +class MetadataOutdatedError extends Error { } export const bind = (program: Program) => program @@ -183,8 +183,8 @@ export const bind = (program: Program) => const siteConfig = ssrSite ? await getSsrSiteMetadata() : staticSite - ? await getStaticSiteMetadata() - : await getServiceMetadata(); + ? await getStaticSiteMetadata() + : await getServiceMetadata(); // Handle rebind due to metadata updated if (reason === "metadata_updated") { @@ -204,7 +204,7 @@ export const bind = (program: Program) => (await getLiveIamCredentials(siteConfig.role))) || (await getLocalIamCredentials()); await runCommand({ - ...siteConfig.envs, + ...stripEmptyEnvValues(siteConfig.envs), ...credentials, }); } @@ -228,7 +228,7 @@ export const bind = (program: Program) => const { Config } = await import("../../config.js"); await runCommand({ - ...constructEnvs, + ...stripEmptyEnvValues(constructEnvs), ...(await Config.env()), ...(await getLocalIamCredentials()), }); @@ -242,6 +242,18 @@ export const bind = (program: Program) => }); } + function stripEmptyEnvValues( + envs: Record | undefined + ): Record { + const result: Record = {}; + for (const [key, value] of Object.entries(envs ?? {})) { + if (value !== undefined && value !== null && value !== "") { + result[key] = value; + } + } + return result; + } + async function getSsrSiteMetadata() { const [ { metadataForStack },