sst 2.15.0 → 2.16.1

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/sst.mjs CHANGED
@@ -2164,6 +2164,7 @@ import { AssetManifestBuilder } from "sst-aws-cdk/lib/util/asset-manifest-builde
2164
2164
  import { publishAssets } from "sst-aws-cdk/lib/util/asset-publishing.js";
2165
2165
  import { contentHash } from "sst-aws-cdk/lib/util/content-hash.js";
2166
2166
  import { CfnEvaluationException } from "sst-aws-cdk/lib/api/evaluate-cloudformation-template.js";
2167
+ import { HotswapMode } from "sst-aws-cdk/lib/api/hotswap/common.js";
2167
2168
  import { tryHotswapDeployment } from "sst-aws-cdk/lib/api/hotswap-deployments.js";
2168
2169
  import {
2169
2170
  changeSetHasNoChanges,
@@ -2243,13 +2244,15 @@ async function deployStack(options) {
2243
2244
  parallel: options.assetParallelism
2244
2245
  }
2245
2246
  );
2246
- if (options.hotswap) {
2247
+ const hotswapMode = options.hotswap;
2248
+ if (hotswapMode && hotswapMode !== HotswapMode.FULL_DEPLOYMENT) {
2247
2249
  try {
2248
2250
  const hotswapDeploymentResult = await tryHotswapDeployment(
2249
2251
  options.sdkProvider,
2250
- assetParams,
2252
+ stackParams.values,
2251
2253
  cloudFormationStack,
2252
- stackArtifact
2254
+ stackArtifact,
2255
+ hotswapMode
2253
2256
  );
2254
2257
  if (hotswapDeploymentResult) {
2255
2258
  return hotswapDeploymentResult;
@@ -2267,8 +2270,16 @@ async function deployStack(options) {
2267
2270
  e.message
2268
2271
  );
2269
2272
  }
2270
- print("Falling back to doing a full deployment");
2271
- options.sdk.appendCustomUserAgent("cdk-hotswap/fallback");
2273
+ if (hotswapMode === HotswapMode.FALL_BACK) {
2274
+ print("Falling back to doing a full deployment");
2275
+ options.sdk.appendCustomUserAgent("cdk-hotswap/fallback");
2276
+ } else {
2277
+ return {
2278
+ noOp: true,
2279
+ stackArn: cloudFormationStack.stackId,
2280
+ outputs: cloudFormationStack.outputs
2281
+ };
2282
+ }
2272
2283
  }
2273
2284
  const fullDeployment = new FullCloudFormationDeployment(
2274
2285
  options,
@@ -2673,18 +2684,21 @@ var init_deploy_stack = __esm({
2673
2684
  }
2674
2685
  });
2675
2686
 
2676
- // src/cdk/cloudformation-deployments.ts
2677
- var cloudformation_deployments_exports = {};
2678
- __export(cloudformation_deployments_exports, {
2687
+ // src/cdk/deployments.ts
2688
+ var deployments_exports = {};
2689
+ __export(deployments_exports, {
2679
2690
  CloudFormationDeployments: () => CloudFormationDeployments,
2680
- prepareSdkWithLookupRoleFor: () => prepareSdkWithLookupRoleFor
2691
+ Deployments: () => Deployments
2681
2692
  });
2682
2693
  import * as cxapi2 from "@aws-cdk/cx-api";
2694
+ import * as cdk_assets from "cdk-assets";
2683
2695
  import { AssetManifest } from "cdk-assets";
2684
2696
  import { debug as debug2, warning } from "sst-aws-cdk/lib/logging.js";
2685
2697
  import {
2686
2698
  buildAssets,
2687
- publishAssets as publishAssets2
2699
+ publishAssets as publishAssets2,
2700
+ PublishingAws,
2701
+ EVENT_TO_LOGGER
2688
2702
  } from "sst-aws-cdk/lib/util/asset-publishing.js";
2689
2703
  import { Mode } from "sst-aws-cdk/lib/api/aws-auth/credentials.js";
2690
2704
  import {
@@ -2696,62 +2710,21 @@ import {
2696
2710
  CloudFormationStack as CloudFormationStack2
2697
2711
  } from "sst-aws-cdk/lib/api/util/cloudformation.js";
2698
2712
  import { replaceEnvPlaceholders } from "sst-aws-cdk/lib/api/util/placeholders.js";
2699
- async function prepareSdkWithLookupRoleFor(sdkProvider, stack) {
2700
- const resolvedEnvironment = await sdkProvider.resolveEnvironment(
2701
- stack.environment
2702
- );
2703
- const arns = await replaceEnvPlaceholders(
2704
- {
2705
- lookupRoleArn: stack.lookupRole?.arn
2706
- },
2707
- resolvedEnvironment,
2708
- sdkProvider
2709
- );
2710
- const warningMessage = `Could not assume ${arns.lookupRoleArn}, proceeding anyway.`;
2711
- const upgradeMessage = `(To get rid of this warning, please upgrade to bootstrap version >= ${stack.lookupRole?.requiresBootstrapStackVersion})`;
2712
- try {
2713
- const stackSdk = await sdkProvider.forEnvironment(
2714
- resolvedEnvironment,
2715
- Mode.ForReading,
2716
- {
2717
- assumeRoleArn: arns.lookupRoleArn,
2718
- assumeRoleExternalId: stack.lookupRole?.assumeRoleExternalId
2719
- }
2720
- );
2721
- if (stackSdk.didAssumeRole && stack.lookupRole?.bootstrapStackVersionSsmParameter && stack.lookupRole.requiresBootstrapStackVersion) {
2722
- const version2 = await ToolkitInfo.versionFromSsmParameter(
2723
- stackSdk.sdk,
2724
- stack.lookupRole.bootstrapStackVersionSsmParameter
2725
- );
2726
- if (version2 < stack.lookupRole.requiresBootstrapStackVersion) {
2727
- throw new Error(
2728
- `Bootstrap stack version '${stack.lookupRole.requiresBootstrapStackVersion}' is required, found version '${version2}'.`
2729
- );
2730
- }
2731
- } else if (!stackSdk.didAssumeRole && stack.lookupRole?.requiresBootstrapStackVersion) {
2732
- warning(upgradeMessage);
2733
- }
2734
- return { ...stackSdk, resolvedEnvironment };
2735
- } catch (e) {
2736
- debug2(e);
2737
- if (stack.lookupRole && stack.lookupRole.requiresBootstrapStackVersion) {
2738
- warning(warningMessage);
2739
- warning(upgradeMessage);
2740
- }
2741
- throw e;
2742
- }
2743
- }
2744
- var CloudFormationDeployments;
2745
- var init_cloudformation_deployments = __esm({
2746
- "src/cdk/cloudformation-deployments.ts"() {
2713
+ var Deployments, ParallelSafeAssetProgress, CloudFormationDeployments;
2714
+ var init_deployments = __esm({
2715
+ "src/cdk/deployments.ts"() {
2747
2716
  "use strict";
2748
2717
  init_deploy_stack();
2749
2718
  init_util();
2750
- CloudFormationDeployments = class {
2751
- sdkProvider;
2719
+ Deployments = class {
2752
2720
  constructor(props) {
2721
+ this.props = props;
2753
2722
  this.sdkProvider = props.sdkProvider;
2754
2723
  }
2724
+ sdkProvider;
2725
+ toolkitInfoCache = /* @__PURE__ */ new Map();
2726
+ sdkCache = /* @__PURE__ */ new Map();
2727
+ publisherCache = /* @__PURE__ */ new Map();
2755
2728
  async readCurrentTemplateWithNestedStacks(rootStackArtifact, retrieveProcessedTemplate = false) {
2756
2729
  const sdk = (await this.prepareSdkWithLookupOrDeployRole(rootStackArtifact)).stackSdk;
2757
2730
  return (await loadCurrentTemplateWithNestedStacks(
@@ -2775,7 +2748,7 @@ var init_cloudformation_deployments = __esm({
2775
2748
  Mode.ForReading
2776
2749
  );
2777
2750
  const cfn = stackSdk.cloudFormation();
2778
- const toolkitInfo = await ToolkitInfo.lookup(
2751
+ const toolkitInfo = await this.lookupToolkit(
2779
2752
  resolvedEnvironment,
2780
2753
  stackSdk,
2781
2754
  toolkitStackName
@@ -2809,29 +2782,31 @@ var init_cloudformation_deployments = __esm({
2809
2782
  execute: options.execute
2810
2783
  };
2811
2784
  }
2812
- const { stackSdk, resolvedEnvironment, cloudFormationRoleArn } = await this.prepareSdkFor(options.stack, options.roleArn);
2785
+ const { stackSdk, resolvedEnvironment, cloudFormationRoleArn } = await this.prepareSdkFor(options.stack, options.roleArn, Mode.ForWriting);
2813
2786
  const toolkitInfo = await callWithRetry(
2814
- () => ToolkitInfo.lookup(
2787
+ () => this.lookupToolkit(
2815
2788
  resolvedEnvironment,
2816
2789
  stackSdk,
2817
2790
  options.toolkitStackName
2818
2791
  )
2819
2792
  );
2820
- if (options.resourcesToImport === void 0) {
2821
- await this.publishStackAssets(options.stack, toolkitInfo, {
2822
- buildAssets: options.buildAssets ?? true,
2823
- publishOptions: {
2824
- quiet: options.quiet,
2825
- parallel: options.assetParallelism
2826
- }
2827
- });
2828
- }
2829
2793
  await this.validateBootstrapStackVersion(
2830
2794
  options.stack.stackName,
2831
2795
  options.stack.requiresBootstrapStackVersion,
2832
2796
  options.stack.bootstrapStackVersionSsmParameter,
2833
2797
  toolkitInfo
2834
2798
  );
2799
+ const assetArtifacts = options.stack.dependencies.filter(
2800
+ cxapi2.AssetManifestArtifact.isAssetManifestArtifact
2801
+ );
2802
+ for (const asset of assetArtifacts) {
2803
+ const manifest = AssetManifest.fromFile(asset.file);
2804
+ await publishAssets2(manifest, this.sdkProvider, resolvedEnvironment, {
2805
+ buildAssets: true,
2806
+ quiet: options.quiet,
2807
+ parallel: options.assetParallelism
2808
+ });
2809
+ }
2835
2810
  return deployStack({
2836
2811
  stack: options.stack,
2837
2812
  noMonitor: true,
@@ -2860,7 +2835,7 @@ var init_cloudformation_deployments = __esm({
2860
2835
  });
2861
2836
  }
2862
2837
  async destroyStack(options) {
2863
- const { stackSdk, cloudFormationRoleArn: roleArn } = await this.prepareSdkFor(options.stack, options.roleArn);
2838
+ const { stackSdk, cloudFormationRoleArn: roleArn } = await this.prepareSdkFor(options.stack, options.roleArn, Mode.ForWriting);
2864
2839
  return destroyStack({
2865
2840
  sdk: stackSdk,
2866
2841
  roleArn,
@@ -2884,10 +2859,7 @@ var init_cloudformation_deployments = __esm({
2884
2859
  }
2885
2860
  async prepareSdkWithLookupOrDeployRole(stackArtifact) {
2886
2861
  try {
2887
- const result = await prepareSdkWithLookupRoleFor(
2888
- this.sdkProvider,
2889
- stackArtifact
2890
- );
2862
+ const result = await this.prepareSdkWithLookupRoleFor(stackArtifact);
2891
2863
  if (result.didAssumeRole) {
2892
2864
  return {
2893
2865
  resolvedEnvironment: result.resolvedEnvironment,
@@ -2898,7 +2870,7 @@ var init_cloudformation_deployments = __esm({
2898
2870
  }
2899
2871
  return this.prepareSdkFor(stackArtifact, void 0, Mode.ForReading);
2900
2872
  }
2901
- async prepareSdkFor(stack, roleArn, mode = Mode.ForWriting) {
2873
+ async prepareSdkFor(stack, roleArn, mode) {
2902
2874
  if (!stack.environment) {
2903
2875
  throw new Error(
2904
2876
  `The stack ${stack.displayName} does not have an environment`
@@ -2915,7 +2887,7 @@ var init_cloudformation_deployments = __esm({
2915
2887
  resolvedEnvironment,
2916
2888
  this.sdkProvider
2917
2889
  );
2918
- const stackSdk = await this.sdkProvider.forEnvironment(
2890
+ const stackSdk = await this.cachedSdkForEnvironment(
2919
2891
  resolvedEnvironment,
2920
2892
  mode,
2921
2893
  {
@@ -2929,12 +2901,72 @@ var init_cloudformation_deployments = __esm({
2929
2901
  cloudFormationRoleArn: arns.cloudFormationRoleArn
2930
2902
  };
2931
2903
  }
2932
- async buildStackAssets(options) {
2904
+ async prepareSdkWithLookupRoleFor(stack) {
2905
+ const resolvedEnvironment = await this.sdkProvider.resolveEnvironment(
2906
+ stack.environment
2907
+ );
2908
+ const arns = await replaceEnvPlaceholders(
2909
+ {
2910
+ lookupRoleArn: stack.lookupRole?.arn
2911
+ },
2912
+ resolvedEnvironment,
2913
+ this.sdkProvider
2914
+ );
2915
+ const warningMessage = `Could not assume ${arns.lookupRoleArn}, proceeding anyway.`;
2916
+ const upgradeMessage = `(To get rid of this warning, please upgrade to bootstrap version >= ${stack.lookupRole?.requiresBootstrapStackVersion})`;
2917
+ try {
2918
+ const stackSdk = await this.cachedSdkForEnvironment(
2919
+ resolvedEnvironment,
2920
+ Mode.ForReading,
2921
+ {
2922
+ assumeRoleArn: arns.lookupRoleArn,
2923
+ assumeRoleExternalId: stack.lookupRole?.assumeRoleExternalId
2924
+ }
2925
+ );
2926
+ if (stackSdk.didAssumeRole && stack.lookupRole?.bootstrapStackVersionSsmParameter && stack.lookupRole.requiresBootstrapStackVersion) {
2927
+ const version2 = await ToolkitInfo.versionFromSsmParameter(
2928
+ stackSdk.sdk,
2929
+ stack.lookupRole.bootstrapStackVersionSsmParameter
2930
+ );
2931
+ if (version2 < stack.lookupRole.requiresBootstrapStackVersion) {
2932
+ throw new Error(
2933
+ `Bootstrap stack version '${stack.lookupRole.requiresBootstrapStackVersion}' is required, found version '${version2}'.`
2934
+ );
2935
+ }
2936
+ } else if (!stackSdk.didAssumeRole && stack.lookupRole?.requiresBootstrapStackVersion) {
2937
+ warning(upgradeMessage);
2938
+ }
2939
+ return { ...stackSdk, resolvedEnvironment };
2940
+ } catch (e) {
2941
+ debug2(e);
2942
+ if (stack.lookupRole && stack.lookupRole.requiresBootstrapStackVersion) {
2943
+ warning(warningMessage);
2944
+ warning(upgradeMessage);
2945
+ }
2946
+ throw e;
2947
+ }
2948
+ }
2949
+ async lookupToolkit(resolvedEnvironment, sdk, toolkitStackName) {
2950
+ const key = `${resolvedEnvironment.account}:${resolvedEnvironment.region}:${toolkitStackName}`;
2951
+ const existing = this.toolkitInfoCache.get(key);
2952
+ if (existing) {
2953
+ return existing;
2954
+ }
2955
+ const ret = await ToolkitInfo.lookup(
2956
+ resolvedEnvironment,
2957
+ sdk,
2958
+ toolkitStackName
2959
+ );
2960
+ this.toolkitInfoCache.set(key, ret);
2961
+ return ret;
2962
+ }
2963
+ async prepareAndValidateAssets(asset, options) {
2933
2964
  const { stackSdk, resolvedEnvironment } = await this.prepareSdkFor(
2934
2965
  options.stack,
2935
- options.roleArn
2966
+ options.roleArn,
2967
+ Mode.ForWriting
2936
2968
  );
2937
- const toolkitInfo = await ToolkitInfo.lookup(
2969
+ const toolkitInfo = await this.lookupToolkit(
2938
2970
  resolvedEnvironment,
2939
2971
  stackSdk,
2940
2972
  options.toolkitStackName
@@ -2942,45 +2974,84 @@ var init_cloudformation_deployments = __esm({
2942
2974
  const stackEnv = await this.sdkProvider.resolveEnvironment(
2943
2975
  options.stack.environment
2944
2976
  );
2945
- const assetArtifacts = options.stack.dependencies.filter(
2946
- cxapi2.AssetManifestArtifact.isAssetManifestArtifact
2977
+ await this.validateBootstrapStackVersion(
2978
+ options.stack.stackName,
2979
+ asset.requiresBootstrapStackVersion,
2980
+ asset.bootstrapStackVersionSsmParameter,
2981
+ toolkitInfo
2947
2982
  );
2948
- for (const assetArtifact of assetArtifacts) {
2949
- await this.validateBootstrapStackVersion(
2950
- options.stack.stackName,
2951
- assetArtifact.requiresBootstrapStackVersion,
2952
- assetArtifact.bootstrapStackVersionSsmParameter,
2953
- toolkitInfo
2954
- );
2955
- const manifest = AssetManifest.fromFile(assetArtifact.file);
2956
- await buildAssets(
2957
- manifest,
2958
- this.sdkProvider,
2959
- stackEnv,
2960
- options.buildOptions
2961
- );
2962
- }
2983
+ const manifest = AssetManifest.fromFile(asset.file);
2984
+ return { manifest, stackEnv };
2963
2985
  }
2964
- async publishStackAssets(stack, toolkitInfo, options = {}) {
2965
- const stackEnv = await this.sdkProvider.resolveEnvironment(
2966
- stack.environment
2986
+ async buildAssets(asset, options) {
2987
+ const { manifest, stackEnv } = await this.prepareAndValidateAssets(
2988
+ asset,
2989
+ options
2967
2990
  );
2968
- const assetArtifacts = stack.dependencies.filter(
2969
- cxapi2.AssetManifestArtifact.isAssetManifestArtifact
2991
+ await buildAssets(
2992
+ manifest,
2993
+ this.sdkProvider,
2994
+ stackEnv,
2995
+ options.buildOptions
2970
2996
  );
2971
- for (const assetArtifact of assetArtifacts) {
2972
- await this.validateBootstrapStackVersion(
2973
- stack.stackName,
2974
- assetArtifact.requiresBootstrapStackVersion,
2975
- assetArtifact.bootstrapStackVersionSsmParameter,
2976
- toolkitInfo
2977
- );
2978
- const manifest = AssetManifest.fromFile(assetArtifact.file);
2979
- await publishAssets2(manifest, this.sdkProvider, stackEnv, {
2980
- ...options.publishOptions,
2981
- buildAssets: options.buildAssets ?? true
2982
- });
2983
- }
2997
+ }
2998
+ async publishAssets(asset, options) {
2999
+ const { manifest, stackEnv } = await this.prepareAndValidateAssets(
3000
+ asset,
3001
+ options
3002
+ );
3003
+ await publishAssets2(
3004
+ manifest,
3005
+ this.sdkProvider,
3006
+ stackEnv,
3007
+ options.publishOptions
3008
+ );
3009
+ }
3010
+ async buildSingleAsset(assetArtifact, assetManifest, asset, options) {
3011
+ const { stackSdk, resolvedEnvironment: stackEnv } = await this.prepareSdkFor(options.stack, options.roleArn, Mode.ForWriting);
3012
+ const toolkitInfo = await this.lookupToolkit(
3013
+ stackEnv,
3014
+ stackSdk,
3015
+ options.toolkitStackName
3016
+ );
3017
+ await this.validateBootstrapStackVersion(
3018
+ options.stack.stackName,
3019
+ assetArtifact.requiresBootstrapStackVersion,
3020
+ assetArtifact.bootstrapStackVersionSsmParameter,
3021
+ toolkitInfo
3022
+ );
3023
+ const publisher = this.cachedPublisher(
3024
+ assetManifest,
3025
+ stackEnv,
3026
+ options.stackName
3027
+ );
3028
+ await publisher.buildEntry(asset);
3029
+ }
3030
+ async publishSingleAsset(assetManifest, asset, options) {
3031
+ const { resolvedEnvironment: stackEnv } = await this.prepareSdkFor(
3032
+ options.stack,
3033
+ options.roleArn,
3034
+ Mode.ForWriting
3035
+ );
3036
+ const publisher = this.cachedPublisher(
3037
+ assetManifest,
3038
+ stackEnv,
3039
+ options.stackName
3040
+ );
3041
+ await publisher.publishEntry(asset);
3042
+ }
3043
+ async isSingleAssetPublished(assetManifest, asset, options) {
3044
+ const { resolvedEnvironment: stackEnv } = await this.prepareSdkFor(
3045
+ options.stack,
3046
+ options.roleArn,
3047
+ Mode.ForWriting
3048
+ );
3049
+ const publisher = this.cachedPublisher(
3050
+ assetManifest,
3051
+ stackEnv,
3052
+ options.stackName
3053
+ );
3054
+ return publisher.isEntryPublished(asset);
2984
3055
  }
2985
3056
  async validateBootstrapStackVersion(stackName, requiresBootstrapStackVersion, bootstrapStackVersionSsmParameter, toolkitInfo) {
2986
3057
  if (requiresBootstrapStackVersion === void 0) {
@@ -2995,21 +3066,72 @@ var init_cloudformation_deployments = __esm({
2995
3066
  throw new Error(`${stackName}: ${e.message}`);
2996
3067
  }
2997
3068
  }
3069
+ async cachedSdkForEnvironment(environment, mode, options) {
3070
+ const cacheKey = [
3071
+ environment.account,
3072
+ environment.region,
3073
+ `${mode}`,
3074
+ options?.assumeRoleArn ?? "",
3075
+ options?.assumeRoleExternalId ?? ""
3076
+ ].join(":");
3077
+ const existing = this.sdkCache.get(cacheKey);
3078
+ if (existing) {
3079
+ return existing;
3080
+ }
3081
+ const ret = await this.sdkProvider.forEnvironment(
3082
+ environment,
3083
+ mode,
3084
+ options
3085
+ );
3086
+ this.sdkCache.set(cacheKey, ret);
3087
+ return ret;
3088
+ }
3089
+ cachedPublisher(assetManifest, env, stackName) {
3090
+ const existing = this.publisherCache.get(assetManifest);
3091
+ if (existing) {
3092
+ return existing;
3093
+ }
3094
+ const prefix = stackName ? `${stackName}: ` : "";
3095
+ const publisher = new cdk_assets.AssetPublishing(assetManifest, {
3096
+ aws: new PublishingAws(this.sdkProvider, env),
3097
+ progressListener: new ParallelSafeAssetProgress(
3098
+ prefix,
3099
+ this.props.quiet ?? false
3100
+ )
3101
+ });
3102
+ this.publisherCache.set(assetManifest, publisher);
3103
+ return publisher;
3104
+ }
3105
+ };
3106
+ ParallelSafeAssetProgress = class {
3107
+ constructor(prefix, quiet) {
3108
+ this.prefix = prefix;
3109
+ this.quiet = quiet;
3110
+ }
3111
+ onPublishEvent(type, event) {
3112
+ const handler = this.quiet && type !== "fail" ? debug2 : EVENT_TO_LOGGER[type];
3113
+ handler(`${this.prefix} ${type}: ${event.message}`);
3114
+ }
3115
+ };
3116
+ CloudFormationDeployments = class extends Deployments {
2998
3117
  };
2999
3118
  }
3000
3119
  });
3001
3120
 
3002
- // src/cdk/cloudformation-deployments-wrapper.ts
3003
- var cloudformation_deployments_wrapper_exports = {};
3004
- __export(cloudformation_deployments_wrapper_exports, {
3121
+ // src/cdk/deployments-wrapper.ts
3122
+ var deployments_wrapper_exports = {};
3123
+ __export(deployments_wrapper_exports, {
3005
3124
  publishDeployAssets: () => publishDeployAssets
3006
3125
  });
3126
+ import * as cxapi3 from "@aws-cdk/cx-api";
3127
+ import { AssetManifest as AssetManifest2 } from "cdk-assets";
3007
3128
  import { debug as debug3 } from "sst-aws-cdk/lib/logging.js";
3008
3129
  import {
3009
3130
  CloudFormationStack as CloudFormationStack3,
3010
3131
  TemplateParameters as TemplateParameters2,
3011
3132
  waitForStackDelete as waitForStackDelete2
3012
3133
  } from "sst-aws-cdk/lib/api/util/cloudformation.js";
3134
+ import { Mode as Mode2 } from "sst-aws-cdk/lib/api/aws-auth/credentials.js";
3013
3135
  import { ToolkitInfo as ToolkitInfo2 } from "sst-aws-cdk/lib/api/toolkit-info.js";
3014
3136
  import { addMetadataAssetsToManifest as addMetadataAssetsToManifest2 } from "sst-aws-cdk/lib/assets.js";
3015
3137
  import { publishAssets as publishAssets3 } from "sst-aws-cdk/lib/util/asset-publishing.js";
@@ -3022,13 +3144,17 @@ async function publishDeployAssets(sdkProvider, options) {
3022
3144
  resolvedEnvironment,
3023
3145
  cloudFormationRoleArn
3024
3146
  } = await useDeployment().get(sdkProvider, options);
3025
- await deployment.publishStackAssets(options.stack, toolkitInfo, {
3026
- buildAssets: options.buildAssets ?? true,
3027
- publishOptions: {
3147
+ const assetArtifacts = options.stack.dependencies.filter(
3148
+ cxapi3.AssetManifestArtifact.isAssetManifestArtifact
3149
+ );
3150
+ for (const asset of assetArtifacts) {
3151
+ const manifest = AssetManifest2.fromFile(asset.file);
3152
+ await publishAssets3(manifest, sdkProvider, resolvedEnvironment, {
3153
+ buildAssets: true,
3028
3154
  quiet: options.quiet,
3029
3155
  parallel: options.assetParallelism
3030
- }
3031
- });
3156
+ });
3157
+ }
3032
3158
  return deployStack2({
3033
3159
  stack: options.stack,
3034
3160
  noMonitor: true,
@@ -3124,10 +3250,10 @@ async function deployStack2(options) {
3124
3250
  };
3125
3251
  }
3126
3252
  var useDeployment;
3127
- var init_cloudformation_deployments_wrapper = __esm({
3128
- "src/cdk/cloudformation-deployments-wrapper.ts"() {
3253
+ var init_deployments_wrapper = __esm({
3254
+ "src/cdk/deployments-wrapper.ts"() {
3129
3255
  "use strict";
3130
- init_cloudformation_deployments();
3256
+ init_deployments();
3131
3257
  init_deploy_stack();
3132
3258
  init_context();
3133
3259
  useDeployment = Context.memo(() => {
@@ -3136,8 +3262,12 @@ var init_cloudformation_deployments_wrapper = __esm({
3136
3262
  async get(sdkProvider, options) {
3137
3263
  const region = options.stack.environment.region;
3138
3264
  if (!state2.has(region)) {
3139
- const deployment = new CloudFormationDeployments({ sdkProvider });
3140
- const { stackSdk, resolvedEnvironment, cloudFormationRoleArn } = await deployment.prepareSdkFor(options.stack, options.roleArn);
3265
+ const deployment = new Deployments({ sdkProvider });
3266
+ const { stackSdk, resolvedEnvironment, cloudFormationRoleArn } = await deployment.prepareSdkFor(
3267
+ options.stack,
3268
+ options.roleArn,
3269
+ Mode2.ForWriting
3270
+ );
3141
3271
  const toolkitInfo = await ToolkitInfo2.lookup(
3142
3272
  resolvedEnvironment,
3143
3273
  stackSdk,
@@ -3168,7 +3298,7 @@ var init_cloudformation_deployments_wrapper = __esm({
3168
3298
  async function publishAssets4(stacks) {
3169
3299
  Logger.debug("Publishing assets");
3170
3300
  const provider = await useAWSProvider();
3171
- const { publishDeployAssets: publishDeployAssets2 } = await Promise.resolve().then(() => (init_cloudformation_deployments_wrapper(), cloudformation_deployments_wrapper_exports));
3301
+ const { publishDeployAssets: publishDeployAssets2 } = await Promise.resolve().then(() => (init_deployments_wrapper(), deployments_wrapper_exports));
3172
3302
  const results = {};
3173
3303
  for (const stack of stacks) {
3174
3304
  const result = await publishDeployAssets2(provider, {
@@ -3239,10 +3369,8 @@ async function deploy(stack) {
3239
3369
  const bus = useBus();
3240
3370
  Logger.debug("Deploying stack", stack.id);
3241
3371
  const provider = await useAWSProvider();
3242
- const { CloudFormationDeployments: CloudFormationDeployments2 } = await Promise.resolve().then(() => (init_cloudformation_deployments(), cloudformation_deployments_exports));
3243
- const deployment = new CloudFormationDeployments2({
3244
- sdkProvider: provider
3245
- });
3372
+ const { Deployments: Deployments2 } = await Promise.resolve().then(() => (init_deployments(), deployments_exports));
3373
+ const deployment = new Deployments2({ sdkProvider: provider });
3246
3374
  const stackTags = Object.entries(stack.tags ?? {}).map(([Key, Value]) => ({
3247
3375
  Key,
3248
3376
  Value
@@ -5023,6 +5151,7 @@ async function synth(opts) {
5023
5151
  region: project.config.region,
5024
5152
  mode: opts.mode,
5025
5153
  debugIncreaseTimeout: opts.increaseTimeout,
5154
+ debugScriptVersion: opts.scriptVersion,
5026
5155
  isActiveStack: opts.isActiveStack
5027
5156
  },
5028
5157
  {
@@ -7012,6 +7141,7 @@ var dev = (program2) => program2.command(
7012
7141
  const useStackBuilder = Context2.memo(async () => {
7013
7142
  const watcher = useWatcher2();
7014
7143
  const project = useProject2();
7144
+ const scriptVersion = Date.now().toString();
7015
7145
  let lastDeployed;
7016
7146
  let isWorking = false;
7017
7147
  let isDirty = false;
@@ -7035,6 +7165,7 @@ var dev = (program2) => program2.command(
7035
7165
  project.stacks = sstConfig.stacks;
7036
7166
  const assembly = await Stacks.synth({
7037
7167
  increaseTimeout: args["increase-timeout"],
7168
+ scriptVersion,
7038
7169
  fn: project.stacks,
7039
7170
  outDir: `.sst/cdk.out`,
7040
7171
  mode: "dev"
package/stacks/deploy.js CHANGED
@@ -6,7 +6,7 @@ import { VisibleError } from "../error.js";
6
6
  export async function publishAssets(stacks) {
7
7
  Logger.debug("Publishing assets");
8
8
  const provider = await useAWSProvider();
9
- const { publishDeployAssets } = await import("../cdk/cloudformation-deployments-wrapper.js");
9
+ const { publishDeployAssets } = await import("../cdk/deployments-wrapper.js");
10
10
  const results = {};
11
11
  for (const stack of stacks) {
12
12
  const result = await publishDeployAssets(provider, {
@@ -74,10 +74,8 @@ export async function deploy(stack) {
74
74
  const bus = useBus();
75
75
  Logger.debug("Deploying stack", stack.id);
76
76
  const provider = await useAWSProvider();
77
- const { CloudFormationDeployments } = await import("../cdk/cloudformation-deployments.js");
78
- const deployment = new CloudFormationDeployments({
79
- sdkProvider: provider,
80
- });
77
+ const { Deployments } = await import("../cdk/deployments.js");
78
+ const deployment = new Deployments({ sdkProvider: provider });
81
79
  const stackTags = Object.entries(stack.tags ?? {}).map(([Key, Value]) => ({
82
80
  Key,
83
81
  Value,
package/stacks/synth.d.ts CHANGED
@@ -3,6 +3,7 @@ interface SynthOptions {
3
3
  buildDir?: string;
4
4
  outDir?: string;
5
5
  increaseTimeout?: boolean;
6
+ scriptVersion?: string;
6
7
  mode: App["mode"];
7
8
  fn: (app: App) => Promise<void> | void;
8
9
  isActiveStack?: (stackName: string) => boolean;
package/stacks/synth.js CHANGED
@@ -46,6 +46,7 @@ export async function synth(opts) {
46
46
  region: project.config.region,
47
47
  mode: opts.mode,
48
48
  debugIncreaseTimeout: opts.increaseTimeout,
49
+ debugScriptVersion: opts.scriptVersion,
49
50
  isActiveStack: opts.isActiveStack,
50
51
  }, {
51
52
  outdir: opts.buildDir,