From 48963f736d5401d0fb4755b983b26cd738b9a1fe Mon Sep 17 00:00:00 2001
From: Adam Ruka <adamruka@amazon.com>
Date: Thu, 4 Mar 2021 08:44:32 -0800
Subject: [PATCH] chore: add new interfaces for Assets (#13356)

This is a re-submit of the PR #12700,
which had to be reverted because of JSII issue https://github.com/aws/jsii/issues/2256.
Since that issue has been fixed in JSII version `1.23.0`,
which is what we currently use,
re-introduce the changes from that PR.

----

*By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
---
 packages/@aws-cdk/assets/lib/fs/options.ts    |  1 +
 .../aws-ecr-assets/lib/image-asset.ts         | 17 +++++--
 packages/@aws-cdk/aws-s3-assets/lib/asset.ts  |  4 +-
 packages/@aws-cdk/core/lib/fs/options.ts      | 51 ++++++++++++++-----
 4 files changed, 54 insertions(+), 19 deletions(-)

diff --git a/packages/@aws-cdk/assets/lib/fs/options.ts b/packages/@aws-cdk/assets/lib/fs/options.ts
index 3ccc107d3700d..548fa4bda42ee 100644
--- a/packages/@aws-cdk/assets/lib/fs/options.ts
+++ b/packages/@aws-cdk/assets/lib/fs/options.ts
@@ -10,6 +10,7 @@ export interface CopyOptions {
    * A strategy for how to handle symlinks.
    *
    * @default Never
+   * @deprecated use `followSymlinks` instead
    */
   readonly follow?: FollowMode;
 
diff --git a/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts b/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts
index 26a3a40f35335..3dd422c694176 100644
--- a/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts
+++ b/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts
@@ -2,7 +2,7 @@ import * as fs from 'fs';
 import * as path from 'path';
 import * as assets from '@aws-cdk/assets';
 import * as ecr from '@aws-cdk/aws-ecr';
-import { Annotations, FeatureFlags, IgnoreMode, Stack, Token } from '@aws-cdk/core';
+import { Annotations, AssetStaging, FeatureFlags, FileFingerprintOptions, IgnoreMode, Stack, SymlinkFollowMode, Token } from '@aws-cdk/core';
 import * as cxapi from '@aws-cdk/cx-api';
 import { Construct } from 'constructs';
 
@@ -13,7 +13,7 @@ import { Construct as CoreConstruct } from '@aws-cdk/core';
 /**
  * Options for DockerImageAsset
  */
-export interface DockerImageAssetOptions extends assets.FingerprintOptions {
+export interface DockerImageAssetOptions extends assets.FingerprintOptions, FileFingerprintOptions {
   /**
    * ECR repository name
    *
@@ -141,8 +141,9 @@ export class DockerImageAsset extends CoreConstruct implements assets.IAsset {
     // deletion of the ECR repository the app used).
     extraHash.version = '1.21.0';
 
-    const staging = new assets.Staging(this, 'Staging', {
+    const staging = new AssetStaging(this, 'Staging', {
       ...props,
+      follow: props.followSymlinks ?? toSymlinkFollow(props.follow),
       exclude,
       ignoreMode,
       sourcePath: dir,
@@ -185,3 +186,13 @@ function validateBuildArgs(buildArgs?: { [key: string]: string }) {
     }
   }
 }
+
+function toSymlinkFollow(follow?: assets.FollowMode): SymlinkFollowMode | undefined {
+  switch (follow) {
+    case undefined: return undefined;
+    case assets.FollowMode.NEVER: return SymlinkFollowMode.NEVER;
+    case assets.FollowMode.ALWAYS: return SymlinkFollowMode.ALWAYS;
+    case assets.FollowMode.BLOCK_EXTERNAL: return SymlinkFollowMode.BLOCK_EXTERNAL;
+    case assets.FollowMode.EXTERNAL: return SymlinkFollowMode.EXTERNAL;
+  }
+}
diff --git a/packages/@aws-cdk/aws-s3-assets/lib/asset.ts b/packages/@aws-cdk/aws-s3-assets/lib/asset.ts
index 510834a61c634..aa342337a9df3 100644
--- a/packages/@aws-cdk/aws-s3-assets/lib/asset.ts
+++ b/packages/@aws-cdk/aws-s3-assets/lib/asset.ts
@@ -12,7 +12,7 @@ import { toSymlinkFollow } from './compat';
 // eslint-disable-next-line no-duplicate-imports, import/order
 import { Construct as CoreConstruct } from '@aws-cdk/core';
 
-export interface AssetOptions extends assets.CopyOptions, cdk.AssetOptions {
+export interface AssetOptions extends assets.CopyOptions, cdk.FileCopyOptions, cdk.AssetOptions {
   /**
    * A list of principals that should be able to read this asset from S3.
    * You can use `asset.grantRead(principal)` to grant read permissions later.
@@ -125,7 +125,7 @@ export class Asset extends CoreConstruct implements cdk.IAsset {
     const staging = new cdk.AssetStaging(this, 'Stage', {
       ...props,
       sourcePath: path.resolve(props.path),
-      follow: toSymlinkFollow(props.follow),
+      follow: props.followSymlinks ?? toSymlinkFollow(props.follow),
       assetHash: props.assetHash ?? props.sourceHash,
     });
 
diff --git a/packages/@aws-cdk/core/lib/fs/options.ts b/packages/@aws-cdk/core/lib/fs/options.ts
index 3ea836a24e831..baf73bd7ffd30 100644
--- a/packages/@aws-cdk/core/lib/fs/options.ts
+++ b/packages/@aws-cdk/core/lib/fs/options.ts
@@ -56,19 +56,9 @@ export enum IgnoreMode {
    * context flag is set.
    */
   DOCKER = 'docker'
-};
-
-/**
- * Obtains applied when copying directories into the staging location.
- */
-export interface CopyOptions {
-  /**
-   * A strategy for how to handle symlinks.
-   *
-   * @default SymlinkFollowMode.NEVER
-   */
-  readonly follow?: SymlinkFollowMode;
+}
 
+interface FileOptions {
   /**
    * Glob patterns to exclude from the copy.
    *
@@ -85,9 +75,30 @@ export interface CopyOptions {
 }
 
 /**
- * Options related to calculating source hash.
+ * Options applied when copying directories
+ */
+export interface CopyOptions extends FileOptions {
+  /**
+   * A strategy for how to handle symlinks.
+   *
+   * @default SymlinkFollowMode.NEVER
+   */
+  readonly follow?: SymlinkFollowMode;
+}
+
+/**
+ * Options applied when copying directories into the staging location.
  */
-export interface FingerprintOptions extends CopyOptions {
+export interface FileCopyOptions extends FileOptions {
+  /**
+   * A strategy for how to handle symlinks.
+   *
+   * @default SymlinkFollowMode.NEVER
+   */
+  readonly followSymlinks?: SymlinkFollowMode;
+}
+
+interface ExtraHashOptions {
   /**
    * Extra information to encode into the fingerprint (e.g. build instructions
    * and other inputs)
@@ -96,3 +107,15 @@ export interface FingerprintOptions extends CopyOptions {
    */
   readonly extraHash?: string;
 }
+
+/**
+ * Options related to calculating source hash.
+ */
+export interface FingerprintOptions extends CopyOptions, ExtraHashOptions {
+}
+
+/**
+ * Options related to calculating source hash.
+ */
+export interface FileFingerprintOptions extends FileCopyOptions, ExtraHashOptions {
+}