@aws-amplify/storage 6.11.2-unstable.a361dd1.0 → 6.11.2-unstable.b6d4c7a.0

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.
Files changed (110) hide show
  1. package/dist/cjs/internals/apis/remove.js +13 -12
  2. package/dist/cjs/internals/apis/remove.js.map +1 -1
  3. package/dist/cjs/providers/s3/apis/internal/remove.js +53 -29
  4. package/dist/cjs/providers/s3/apis/internal/remove.js.map +1 -1
  5. package/dist/cjs/providers/s3/apis/remove.js +6 -1
  6. package/dist/cjs/providers/s3/apis/remove.js.map +1 -1
  7. package/dist/cjs/providers/s3/apis/server/remove.js +6 -1
  8. package/dist/cjs/providers/s3/apis/server/remove.js.map +1 -1
  9. package/dist/cjs/providers/s3/utils/client/s3data/deleteObjects.js +70 -0
  10. package/dist/cjs/providers/s3/utils/client/s3data/deleteObjects.js.map +1 -0
  11. package/dist/cjs/providers/s3/utils/client/s3data/index.js +3 -1
  12. package/dist/cjs/providers/s3/utils/client/s3data/index.js.map +1 -1
  13. package/dist/cjs/providers/s3/utils/createAbortableTask.js +35 -0
  14. package/dist/cjs/providers/s3/utils/createAbortableTask.js.map +1 -0
  15. package/dist/cjs/providers/s3/utils/deleteFolderContents.js +80 -0
  16. package/dist/cjs/providers/s3/utils/deleteFolderContents.js.map +1 -0
  17. package/dist/cjs/providers/s3/utils/generateDeleteObjectsXml.js +38 -0
  18. package/dist/cjs/providers/s3/utils/generateDeleteObjectsXml.js.map +1 -0
  19. package/dist/cjs/providers/s3/utils/index.js +13 -1
  20. package/dist/cjs/providers/s3/utils/index.js.map +1 -1
  21. package/dist/cjs/providers/s3/utils/isPathFolder.js +38 -0
  22. package/dist/cjs/providers/s3/utils/isPathFolder.js.map +1 -0
  23. package/dist/cjs/providers/s3/utils/resolveFinalKey.js +22 -0
  24. package/dist/cjs/providers/s3/utils/resolveFinalKey.js.map +1 -0
  25. package/dist/cjs/providers/s3/utils/validateRemovePath.js +21 -0
  26. package/dist/cjs/providers/s3/utils/validateRemovePath.js.map +1 -0
  27. package/dist/esm/internals/apis/remove.d.ts +2 -1
  28. package/dist/esm/internals/apis/remove.mjs +13 -12
  29. package/dist/esm/internals/apis/remove.mjs.map +1 -1
  30. package/dist/esm/providers/s3/apis/internal/copy.mjs +8 -7
  31. package/dist/esm/providers/s3/apis/internal/copy.mjs.map +1 -1
  32. package/dist/esm/providers/s3/apis/internal/downloadData.d.ts +1 -1
  33. package/dist/esm/providers/s3/apis/internal/downloadData.mjs +6 -5
  34. package/dist/esm/providers/s3/apis/internal/downloadData.mjs.map +1 -1
  35. package/dist/esm/providers/s3/apis/internal/getProperties.mjs +7 -6
  36. package/dist/esm/providers/s3/apis/internal/getProperties.mjs.map +1 -1
  37. package/dist/esm/providers/s3/apis/internal/getUrl.mjs +2 -1
  38. package/dist/esm/providers/s3/apis/internal/getUrl.mjs.map +1 -1
  39. package/dist/esm/providers/s3/apis/internal/list.mjs +8 -7
  40. package/dist/esm/providers/s3/apis/internal/list.mjs.map +1 -1
  41. package/dist/esm/providers/s3/apis/internal/remove.d.ts +3 -2
  42. package/dist/esm/providers/s3/apis/internal/remove.mjs +58 -27
  43. package/dist/esm/providers/s3/apis/internal/remove.mjs.map +1 -1
  44. package/dist/esm/providers/s3/apis/internal/uploadData/index.mjs +13 -0
  45. package/dist/esm/providers/s3/apis/internal/uploadData/index.mjs.map +1 -1
  46. package/dist/esm/providers/s3/apis/internal/uploadData/multipart/initialUpload.mjs +1 -0
  47. package/dist/esm/providers/s3/apis/internal/uploadData/multipart/initialUpload.mjs.map +1 -1
  48. package/dist/esm/providers/s3/apis/internal/uploadData/multipart/uploadCache.mjs +1 -0
  49. package/dist/esm/providers/s3/apis/internal/uploadData/multipart/uploadCache.mjs.map +1 -1
  50. package/dist/esm/providers/s3/apis/internal/uploadData/multipart/uploadHandlers.mjs +6 -5
  51. package/dist/esm/providers/s3/apis/internal/uploadData/multipart/uploadHandlers.mjs.map +1 -1
  52. package/dist/esm/providers/s3/apis/internal/uploadData/multipart/uploadPartExecutor.mjs +1 -0
  53. package/dist/esm/providers/s3/apis/internal/uploadData/multipart/uploadPartExecutor.mjs.map +1 -1
  54. package/dist/esm/providers/s3/apis/internal/uploadData/putObjectJob.mjs +7 -6
  55. package/dist/esm/providers/s3/apis/internal/uploadData/putObjectJob.mjs.map +1 -1
  56. package/dist/esm/providers/s3/apis/remove.d.ts +6 -6
  57. package/dist/esm/providers/s3/apis/remove.mjs +6 -1
  58. package/dist/esm/providers/s3/apis/remove.mjs.map +1 -1
  59. package/dist/esm/providers/s3/apis/server/remove.d.ts +6 -6
  60. package/dist/esm/providers/s3/apis/server/remove.mjs +6 -1
  61. package/dist/esm/providers/s3/apis/server/remove.mjs.map +1 -1
  62. package/dist/esm/providers/s3/types/index.d.ts +1 -1
  63. package/dist/esm/providers/s3/types/inputs.d.ts +24 -1
  64. package/dist/esm/providers/s3/utils/client/s3data/deleteObjects.d.ts +30 -0
  65. package/dist/esm/providers/s3/utils/client/s3data/deleteObjects.mjs +74 -0
  66. package/dist/esm/providers/s3/utils/client/s3data/deleteObjects.mjs.map +1 -0
  67. package/dist/esm/providers/s3/utils/client/s3data/index.d.ts +1 -0
  68. package/dist/esm/providers/s3/utils/client/s3data/index.mjs +1 -0
  69. package/dist/esm/providers/s3/utils/client/s3data/index.mjs.map +1 -1
  70. package/dist/esm/providers/s3/utils/client/s3data/types.d.ts +26 -0
  71. package/dist/esm/providers/s3/utils/createAbortableTask.d.ts +6 -0
  72. package/dist/esm/providers/s3/utils/createAbortableTask.mjs +33 -0
  73. package/dist/esm/providers/s3/utils/createAbortableTask.mjs.map +1 -0
  74. package/dist/esm/providers/s3/utils/deleteFolderContents.d.ts +16 -0
  75. package/dist/esm/providers/s3/utils/deleteFolderContents.mjs +90 -0
  76. package/dist/esm/providers/s3/utils/deleteFolderContents.mjs.map +1 -0
  77. package/dist/esm/providers/s3/utils/generateDeleteObjectsXml.d.ts +10 -0
  78. package/dist/esm/providers/s3/utils/generateDeleteObjectsXml.mjs +35 -0
  79. package/dist/esm/providers/s3/utils/generateDeleteObjectsXml.mjs.map +1 -0
  80. package/dist/esm/providers/s3/utils/index.d.ts +6 -0
  81. package/dist/esm/providers/s3/utils/index.mjs +6 -0
  82. package/dist/esm/providers/s3/utils/index.mjs.map +1 -1
  83. package/dist/esm/providers/s3/utils/isPathFolder.d.ts +13 -0
  84. package/dist/esm/providers/s3/utils/isPathFolder.mjs +48 -0
  85. package/dist/esm/providers/s3/utils/isPathFolder.mjs.map +1 -0
  86. package/dist/esm/providers/s3/utils/resolveFinalKey.d.ts +9 -0
  87. package/dist/esm/providers/s3/utils/resolveFinalKey.mjs +20 -0
  88. package/dist/esm/providers/s3/utils/resolveFinalKey.mjs.map +1 -0
  89. package/dist/esm/providers/s3/utils/validateRemovePath.d.ts +8 -0
  90. package/dist/esm/providers/s3/utils/validateRemovePath.mjs +18 -0
  91. package/dist/esm/providers/s3/utils/validateRemovePath.mjs.map +1 -0
  92. package/dist/esm/types/common.d.ts +3 -0
  93. package/package.json +5 -5
  94. package/src/internals/apis/remove.ts +17 -10
  95. package/src/providers/s3/apis/internal/remove.ts +96 -41
  96. package/src/providers/s3/apis/remove.ts +11 -6
  97. package/src/providers/s3/apis/server/remove.ts +11 -6
  98. package/src/providers/s3/types/index.ts +2 -0
  99. package/src/providers/s3/types/inputs.ts +24 -1
  100. package/src/providers/s3/utils/client/s3data/deleteObjects.ts +122 -0
  101. package/src/providers/s3/utils/client/s3data/index.ts +5 -0
  102. package/src/providers/s3/utils/client/s3data/types.ts +20 -0
  103. package/src/providers/s3/utils/createAbortableTask.ts +45 -0
  104. package/src/providers/s3/utils/deleteFolderContents.ts +118 -0
  105. package/src/providers/s3/utils/generateDeleteObjectsXml.ts +38 -0
  106. package/src/providers/s3/utils/index.ts +6 -0
  107. package/src/providers/s3/utils/isPathFolder.ts +50 -0
  108. package/src/providers/s3/utils/resolveFinalKey.ts +22 -0
  109. package/src/providers/s3/utils/validateRemovePath.ts +16 -0
  110. package/src/types/common.ts +5 -0
@@ -0,0 +1,118 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { StorageAction } from '@aws-amplify/core/internals/utils';
5
+
6
+ import { CanceledError } from '../../../errors/CanceledError';
7
+ import { ProgressInfo, RemoveWithPathOutput } from '../types';
8
+
9
+ import { deleteObjects, listObjectsV2 } from './client/s3data';
10
+ import { getStorageUserAgentValue } from './userAgent';
11
+
12
+ const MAX_KEYS_PER_BATCH = 1000;
13
+
14
+ export interface DeleteFolderContentsParams {
15
+ s3Config: any;
16
+ bucket: string;
17
+ folderKey: string;
18
+ expectedBucketOwner?: string;
19
+ onProgress?(progress: ProgressInfo): void;
20
+ abortSignal?: AbortSignal;
21
+ }
22
+
23
+ /**
24
+ * Deletes all contents of a folder in S3 using batch operations
25
+ *
26
+ * @param params - Configuration object for the delete operation
27
+ * @returns Promise that resolves to the removal result
28
+ */
29
+ export const deleteFolderContents = async (
30
+ params: DeleteFolderContentsParams,
31
+ ): Promise<RemoveWithPathOutput> => {
32
+ const {
33
+ s3Config,
34
+ bucket,
35
+ folderKey,
36
+ expectedBucketOwner,
37
+ onProgress,
38
+ abortSignal,
39
+ } = params;
40
+
41
+ try {
42
+ const prefix = folderKey.endsWith('/') ? folderKey : `${folderKey}/`;
43
+ const progressCallback =
44
+ onProgress ??
45
+ (() => {
46
+ // no-op
47
+ });
48
+
49
+ let continuationToken: string | undefined;
50
+
51
+ do {
52
+ if (abortSignal?.aborted) {
53
+ throw new CanceledError({ message: 'Operation was canceled' });
54
+ }
55
+
56
+ const listResult = await listObjectsV2(
57
+ {
58
+ ...s3Config,
59
+ userAgentValue: getStorageUserAgentValue(StorageAction.Remove),
60
+ abortSignal,
61
+ },
62
+ {
63
+ Bucket: bucket,
64
+ Prefix: prefix,
65
+ MaxKeys: MAX_KEYS_PER_BATCH,
66
+ ContinuationToken: continuationToken,
67
+ ExpectedBucketOwner: expectedBucketOwner,
68
+ },
69
+ );
70
+
71
+ if (!listResult.Contents || listResult.Contents.length === 0) {
72
+ break;
73
+ }
74
+
75
+ if (abortSignal?.aborted) {
76
+ throw new CanceledError({ message: 'Operation was canceled' });
77
+ }
78
+
79
+ const batch = listResult.Contents.map(obj => ({ Key: obj.Key! }));
80
+
81
+ const deleteResult = await deleteObjects(
82
+ {
83
+ ...s3Config,
84
+ userAgentValue: getStorageUserAgentValue(StorageAction.Remove),
85
+ abortSignal,
86
+ },
87
+ {
88
+ Bucket: bucket,
89
+ Delete: {
90
+ Objects: batch,
91
+ Quiet: false,
92
+ },
93
+ ExpectedBucketOwner: expectedBucketOwner,
94
+ },
95
+ );
96
+
97
+ const deleted =
98
+ deleteResult.Deleted?.map(obj => ({ path: obj.Key! })) || [];
99
+ const failed =
100
+ deleteResult.Errors?.map(err => ({
101
+ path: err.Key!,
102
+ code: err.Code!,
103
+ message: err.Message!,
104
+ })) || [];
105
+
106
+ progressCallback({ deleted, failed });
107
+
108
+ continuationToken = listResult.NextContinuationToken;
109
+ } while (continuationToken);
110
+
111
+ return { path: folderKey };
112
+ } catch (error) {
113
+ if (abortSignal?.aborted) {
114
+ throw new CanceledError({ message: 'Operation was canceled' });
115
+ }
116
+ throw error;
117
+ }
118
+ };
@@ -0,0 +1,38 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ /**
5
+ * Escapes special XML characters in a string
6
+ * @param str - String to escape
7
+ * @returns XML-escaped string
8
+ */
9
+ const escapeXml = (str: string): string => {
10
+ return str
11
+ .replace(/&/g, '&amp;')
12
+ .replace(/</g, '&lt;')
13
+ .replace(/>/g, '&gt;')
14
+ .replace(/"/g, '&quot;')
15
+ .replace(/'/g, '&apos;');
16
+ };
17
+
18
+ /**
19
+ * Generates XML for S3 batch delete operations
20
+ *
21
+ * @param objects - Array of objects to delete with their keys
22
+ * @param quiet - Whether to use quiet mode (default: true)
23
+ * @returns XML string for the delete request
24
+ */
25
+ export const generateDeleteObjectsXml = (
26
+ objects: { Key: string }[],
27
+ quiet: boolean,
28
+ ): string => {
29
+ const objectsXml = objects
30
+ .map(obj => `<Object><Key>${escapeXml(obj.Key)}</Key></Object>`)
31
+ .join('');
32
+
33
+ return `<?xml version="1.0" encoding="UTF-8"?>
34
+ <Delete xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
35
+ <Quiet>${quiet ? 'true' : 'false'}</Quiet>
36
+ ${objectsXml}
37
+ </Delete>`;
38
+ };
@@ -2,10 +2,16 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  export { calculateContentMd5 } from './md5';
5
+ export { deleteFolderContents } from './deleteFolderContents';
6
+ export { generateDeleteObjectsXml } from './generateDeleteObjectsXml';
5
7
  export { resolveS3ConfigAndInput } from './resolveS3ConfigAndInput';
8
+ export { resolveFinalKey } from './resolveFinalKey';
6
9
  export { createDownloadTask, createUploadTask } from './transferTask';
7
10
  export { validateBucketOwnerID } from './validateBucketOwnerID';
11
+ export { validateRemovePath } from './validateRemovePath';
8
12
  export { validateStorageOperationInput } from './validateStorageOperationInput';
9
13
  export { validateStorageOperationInputWithPrefix } from './validateStorageOperationInputWithPrefix';
10
14
  export { isInputWithPath } from './isInputWithPath';
15
+ export { isPathFolder } from './isPathFolder';
11
16
  export { urlDecode } from './urlDecoder';
17
+ export { createAbortableTask } from './createAbortableTask';
@@ -0,0 +1,50 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { StorageAction } from '@aws-amplify/core/internals/utils';
5
+
6
+ import { listObjectsV2 } from './client/s3data';
7
+ import { getStorageUserAgentValue } from './userAgent';
8
+
9
+ export interface IsPathFolderParams {
10
+ s3Config: any;
11
+ bucket: string;
12
+ key: string;
13
+ expectedBucketOwner?: string;
14
+ }
15
+
16
+ /**
17
+ * Determines if a given S3 key represents a folder by checking if objects exist with that prefix.
18
+ *
19
+ * @param params - Configuration object for the folder check
20
+ * @returns Promise that resolves to true if the key represents a folder, false otherwise
21
+ */
22
+ export const isPathFolder = async (
23
+ params: IsPathFolderParams,
24
+ ): Promise<boolean> => {
25
+ const { s3Config, bucket, key, expectedBucketOwner } = params;
26
+ try {
27
+ const prefix = key.endsWith('/') ? key : `${key}/`;
28
+
29
+ const result = await listObjectsV2(
30
+ {
31
+ ...s3Config,
32
+ userAgentValue: getStorageUserAgentValue(StorageAction.Remove),
33
+ },
34
+ {
35
+ Bucket: bucket,
36
+ Prefix: prefix,
37
+ MaxKeys: 1,
38
+ ExpectedBucketOwner: expectedBucketOwner,
39
+ },
40
+ );
41
+
42
+ const isFolder =
43
+ !!(result.Contents && result.Contents.length > 0) ||
44
+ !!(result.CommonPrefixes && result.CommonPrefixes.length > 0);
45
+
46
+ return isFolder;
47
+ } catch (error) {
48
+ return false;
49
+ }
50
+ };
@@ -0,0 +1,22 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { STORAGE_INPUT_KEY } from './constants';
5
+
6
+ /**
7
+ * Resolves the final S3 key based on input type and key prefix.
8
+ *
9
+ * @param inputType - The type of input (key-based or path-based)
10
+ * @param objectKey - The object key from the input
11
+ * @param keyPrefix - The key prefix to prepend for key-based inputs
12
+ * @returns The final S3 key to use for the operation
13
+ */
14
+ export const resolveFinalKey = (
15
+ inputType: string,
16
+ objectKey: string,
17
+ keyPrefix: string,
18
+ ): string => {
19
+ return inputType === STORAGE_INPUT_KEY
20
+ ? `${keyPrefix}${objectKey}`
21
+ : objectKey;
22
+ };
@@ -0,0 +1,16 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ /**
5
+ * Validates that the path is safe for removal operations.
6
+ * Prevents deletion of dangerous paths that could affect entire buckets.
7
+ *
8
+ * @param path - The path to validate
9
+ * @throws Error if the path is considered dangerous
10
+ */
11
+ export const validateRemovePath = (path: string): void => {
12
+ const DANGEROUS_PATHS = ['', '/', '*'];
13
+ if (DANGEROUS_PATHS.includes(path.trim())) {
14
+ throw new Error('Cannot delete root or bucket-wide paths');
15
+ }
16
+ };
@@ -49,6 +49,11 @@ export interface TransferTask<Result> {
49
49
  result: Promise<Result>;
50
50
  }
51
51
 
52
+ export interface NonPausableTransferTask<T>
53
+ extends Omit<TransferTask<T>, 'pause' | 'resume' | 'state'> {
54
+ state: Omit<TransferTask<T>['state'], 'PAUSED'>;
55
+ }
56
+
52
57
  export type DownloadTask<Result> = Omit<
53
58
  TransferTask<Result>,
54
59
  'pause' | 'resume'