@aws-amplify/storage 6.0.28 → 6.0.29-gen2-storage.e54bfa9.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 (194) hide show
  1. package/dist/cjs/errors/types/validation.js +22 -2
  2. package/dist/cjs/errors/types/validation.js.map +1 -1
  3. package/dist/cjs/providers/s3/apis/copy.js +2 -12
  4. package/dist/cjs/providers/s3/apis/copy.js.map +1 -1
  5. package/dist/cjs/providers/s3/apis/downloadData.js +13 -38
  6. package/dist/cjs/providers/s3/apis/downloadData.js.map +1 -1
  7. package/dist/cjs/providers/s3/apis/getProperties.js +2 -11
  8. package/dist/cjs/providers/s3/apis/getProperties.js.map +1 -1
  9. package/dist/cjs/providers/s3/apis/getUrl.js +2 -18
  10. package/dist/cjs/providers/s3/apis/getUrl.js.map +1 -1
  11. package/dist/cjs/providers/s3/apis/internal/copy.js +41 -7
  12. package/dist/cjs/providers/s3/apis/internal/copy.js.map +1 -1
  13. package/dist/cjs/providers/s3/apis/internal/getProperties.js +10 -6
  14. package/dist/cjs/providers/s3/apis/internal/getProperties.js.map +1 -1
  15. package/dist/cjs/providers/s3/apis/internal/getUrl.js +8 -6
  16. package/dist/cjs/providers/s3/apis/internal/getUrl.js.map +1 -1
  17. package/dist/cjs/providers/s3/apis/internal/list.js +86 -16
  18. package/dist/cjs/providers/s3/apis/internal/list.js.map +1 -1
  19. package/dist/cjs/providers/s3/apis/internal/remove.js +20 -7
  20. package/dist/cjs/providers/s3/apis/internal/remove.js.map +1 -1
  21. package/dist/cjs/providers/s3/apis/list.js +4 -4
  22. package/dist/cjs/providers/s3/apis/list.js.map +1 -1
  23. package/dist/cjs/providers/s3/apis/remove.js +2 -9
  24. package/dist/cjs/providers/s3/apis/remove.js.map +1 -1
  25. package/dist/cjs/providers/s3/apis/server/copy.js +4 -4
  26. package/dist/cjs/providers/s3/apis/server/copy.js.map +1 -1
  27. package/dist/cjs/providers/s3/apis/server/getProperties.js +2 -2
  28. package/dist/cjs/providers/s3/apis/server/getProperties.js.map +1 -1
  29. package/dist/cjs/providers/s3/apis/server/getUrl.js +2 -2
  30. package/dist/cjs/providers/s3/apis/server/getUrl.js.map +1 -1
  31. package/dist/cjs/providers/s3/apis/server/list.js +4 -4
  32. package/dist/cjs/providers/s3/apis/server/list.js.map +1 -1
  33. package/dist/cjs/providers/s3/apis/server/remove.js +2 -2
  34. package/dist/cjs/providers/s3/apis/server/remove.js.map +1 -1
  35. package/dist/cjs/providers/s3/apis/uploadData/index.js +4 -50
  36. package/dist/cjs/providers/s3/apis/uploadData/index.js.map +1 -1
  37. package/dist/cjs/providers/s3/apis/uploadData/multipart/initialUpload.js +1 -1
  38. package/dist/cjs/providers/s3/apis/uploadData/multipart/initialUpload.js.map +1 -1
  39. package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadCache.js +8 -1
  40. package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadCache.js.map +1 -1
  41. package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadHandlers.js +28 -13
  42. package/dist/cjs/providers/s3/apis/uploadData/multipart/uploadHandlers.js.map +1 -1
  43. package/dist/cjs/providers/s3/apis/uploadData/putObjectJob.js +10 -5
  44. package/dist/cjs/providers/s3/apis/uploadData/putObjectJob.js.map +1 -1
  45. package/dist/cjs/providers/s3/utils/client/utils/parsePayload.js +1 -1
  46. package/dist/cjs/providers/s3/utils/client/utils/parsePayload.js.map +1 -1
  47. package/dist/cjs/providers/s3/utils/constants.js +4 -1
  48. package/dist/cjs/providers/s3/utils/constants.js.map +1 -1
  49. package/dist/cjs/providers/s3/utils/index.js +7 -1
  50. package/dist/cjs/providers/s3/utils/index.js.map +1 -1
  51. package/dist/cjs/providers/s3/utils/isInputWithPath.js +11 -0
  52. package/dist/cjs/providers/s3/utils/isInputWithPath.js.map +1 -0
  53. package/dist/cjs/providers/s3/utils/resolveS3ConfigAndInput.js +2 -1
  54. package/dist/cjs/providers/s3/utils/resolveS3ConfigAndInput.js.map +1 -1
  55. package/dist/cjs/providers/s3/utils/validateStorageOperationInput.js +31 -0
  56. package/dist/cjs/providers/s3/utils/validateStorageOperationInput.js.map +1 -0
  57. package/dist/cjs/providers/s3/utils/validateStorageOperationInputWithPrefix.js +32 -0
  58. package/dist/cjs/providers/s3/utils/validateStorageOperationInputWithPrefix.js.map +1 -0
  59. package/dist/esm/errors/types/validation.d.ts +7 -2
  60. package/dist/esm/errors/types/validation.mjs +22 -2
  61. package/dist/esm/errors/types/validation.mjs.map +1 -1
  62. package/dist/esm/index.d.ts +2 -2
  63. package/dist/esm/providers/s3/apis/copy.d.ts +22 -9
  64. package/dist/esm/providers/s3/apis/copy.mjs +2 -12
  65. package/dist/esm/providers/s3/apis/copy.mjs.map +1 -1
  66. package/dist/esm/providers/s3/apis/downloadData.d.ts +41 -7
  67. package/dist/esm/providers/s3/apis/downloadData.mjs +15 -39
  68. package/dist/esm/providers/s3/apis/downloadData.mjs.map +1 -1
  69. package/dist/esm/providers/s3/apis/getProperties.d.ts +18 -5
  70. package/dist/esm/providers/s3/apis/getProperties.mjs +2 -11
  71. package/dist/esm/providers/s3/apis/getProperties.mjs.map +1 -1
  72. package/dist/esm/providers/s3/apis/getUrl.d.ts +27 -7
  73. package/dist/esm/providers/s3/apis/getUrl.mjs +2 -18
  74. package/dist/esm/providers/s3/apis/getUrl.mjs.map +1 -1
  75. package/dist/esm/providers/s3/apis/internal/copy.d.ts +4 -2
  76. package/dist/esm/providers/s3/apis/internal/copy.mjs +41 -6
  77. package/dist/esm/providers/s3/apis/internal/copy.mjs.map +1 -1
  78. package/dist/esm/providers/s3/apis/internal/getProperties.d.ts +2 -2
  79. package/dist/esm/providers/s3/apis/internal/getProperties.mjs +11 -6
  80. package/dist/esm/providers/s3/apis/internal/getProperties.mjs.map +1 -1
  81. package/dist/esm/providers/s3/apis/internal/getUrl.d.ts +2 -2
  82. package/dist/esm/providers/s3/apis/internal/getUrl.mjs +10 -7
  83. package/dist/esm/providers/s3/apis/internal/getUrl.mjs.map +1 -1
  84. package/dist/esm/providers/s3/apis/internal/list.d.ts +2 -2
  85. package/dist/esm/providers/s3/apis/internal/list.mjs +87 -16
  86. package/dist/esm/providers/s3/apis/internal/list.mjs.map +1 -1
  87. package/dist/esm/providers/s3/apis/internal/remove.d.ts +2 -2
  88. package/dist/esm/providers/s3/apis/internal/remove.mjs +21 -7
  89. package/dist/esm/providers/s3/apis/internal/remove.mjs.map +1 -1
  90. package/dist/esm/providers/s3/apis/list.d.ts +39 -22
  91. package/dist/esm/providers/s3/apis/list.mjs +2 -2
  92. package/dist/esm/providers/s3/apis/list.mjs.map +1 -1
  93. package/dist/esm/providers/s3/apis/remove.d.ts +18 -5
  94. package/dist/esm/providers/s3/apis/remove.mjs +2 -9
  95. package/dist/esm/providers/s3/apis/remove.mjs.map +1 -1
  96. package/dist/esm/providers/s3/apis/server/copy.d.ts +27 -2
  97. package/dist/esm/providers/s3/apis/server/copy.mjs +2 -2
  98. package/dist/esm/providers/s3/apis/server/copy.mjs.map +1 -1
  99. package/dist/esm/providers/s3/apis/server/getProperties.d.ts +26 -2
  100. package/dist/esm/providers/s3/apis/server/getProperties.mjs +2 -2
  101. package/dist/esm/providers/s3/apis/server/getProperties.mjs.map +1 -1
  102. package/dist/esm/providers/s3/apis/server/getUrl.d.ts +40 -2
  103. package/dist/esm/providers/s3/apis/server/getUrl.mjs +2 -2
  104. package/dist/esm/providers/s3/apis/server/getUrl.mjs.map +1 -1
  105. package/dist/esm/providers/s3/apis/server/list.d.ts +41 -22
  106. package/dist/esm/providers/s3/apis/server/list.mjs +2 -2
  107. package/dist/esm/providers/s3/apis/server/list.mjs.map +1 -1
  108. package/dist/esm/providers/s3/apis/server/remove.d.ts +24 -2
  109. package/dist/esm/providers/s3/apis/server/remove.mjs +2 -2
  110. package/dist/esm/providers/s3/apis/server/remove.mjs.map +1 -1
  111. package/dist/esm/providers/s3/apis/uploadData/index.d.ts +64 -7
  112. package/dist/esm/providers/s3/apis/uploadData/index.mjs +4 -50
  113. package/dist/esm/providers/s3/apis/uploadData/index.mjs.map +1 -1
  114. package/dist/esm/providers/s3/apis/uploadData/multipart/initialUpload.d.ts +2 -2
  115. package/dist/esm/providers/s3/apis/uploadData/multipart/initialUpload.mjs +1 -1
  116. package/dist/esm/providers/s3/apis/uploadData/multipart/initialUpload.mjs.map +1 -1
  117. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadCache.d.ts +1 -1
  118. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadCache.mjs +8 -1
  119. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadCache.mjs.map +1 -1
  120. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadHandlers.d.ts +4 -4
  121. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadHandlers.mjs +30 -14
  122. package/dist/esm/providers/s3/apis/uploadData/multipart/uploadHandlers.mjs.map +1 -1
  123. package/dist/esm/providers/s3/apis/uploadData/putObjectJob.d.ts +3 -3
  124. package/dist/esm/providers/s3/apis/uploadData/putObjectJob.mjs +11 -5
  125. package/dist/esm/providers/s3/apis/uploadData/putObjectJob.mjs.map +1 -1
  126. package/dist/esm/providers/s3/index.d.ts +2 -2
  127. package/dist/esm/providers/s3/types/index.d.ts +3 -3
  128. package/dist/esm/providers/s3/types/inputs.d.ts +51 -11
  129. package/dist/esm/providers/s3/types/options.d.ts +41 -10
  130. package/dist/esm/providers/s3/types/outputs.d.ts +68 -13
  131. package/dist/esm/providers/s3/utils/client/utils/parsePayload.mjs +1 -1
  132. package/dist/esm/providers/s3/utils/client/utils/parsePayload.mjs.map +1 -1
  133. package/dist/esm/providers/s3/utils/constants.d.ts +3 -0
  134. package/dist/esm/providers/s3/utils/constants.mjs +4 -1
  135. package/dist/esm/providers/s3/utils/constants.mjs.map +1 -1
  136. package/dist/esm/providers/s3/utils/index.d.ts +3 -0
  137. package/dist/esm/providers/s3/utils/index.mjs +3 -0
  138. package/dist/esm/providers/s3/utils/index.mjs.map +1 -1
  139. package/dist/esm/providers/s3/utils/isInputWithPath.d.ts +2 -0
  140. package/dist/esm/providers/s3/utils/isInputWithPath.mjs +8 -0
  141. package/dist/esm/providers/s3/utils/isInputWithPath.mjs.map +1 -0
  142. package/dist/esm/providers/s3/utils/resolveS3ConfigAndInput.d.ts +2 -1
  143. package/dist/esm/providers/s3/utils/resolveS3ConfigAndInput.mjs +2 -1
  144. package/dist/esm/providers/s3/utils/resolveS3ConfigAndInput.mjs.map +1 -1
  145. package/dist/esm/providers/s3/utils/validateStorageOperationInput.d.ts +5 -0
  146. package/dist/esm/providers/s3/utils/validateStorageOperationInput.mjs +29 -0
  147. package/dist/esm/providers/s3/utils/validateStorageOperationInput.mjs.map +1 -0
  148. package/dist/esm/providers/s3/utils/validateStorageOperationInputWithPrefix.d.ts +5 -0
  149. package/dist/esm/providers/s3/utils/validateStorageOperationInputWithPrefix.mjs +30 -0
  150. package/dist/esm/providers/s3/utils/validateStorageOperationInputWithPrefix.mjs.map +1 -0
  151. package/dist/esm/types/index.d.ts +2 -2
  152. package/dist/esm/types/inputs.d.ts +41 -13
  153. package/dist/esm/types/options.d.ts +1 -0
  154. package/dist/esm/types/outputs.d.ts +26 -6
  155. package/package.json +107 -107
  156. package/src/errors/types/validation.ts +23 -2
  157. package/src/index.ts +16 -0
  158. package/src/providers/s3/apis/copy.ts +30 -11
  159. package/src/providers/s3/apis/downloadData.ts +78 -19
  160. package/src/providers/s3/apis/getProperties.ts +31 -8
  161. package/src/providers/s3/apis/getUrl.ts +37 -10
  162. package/src/providers/s3/apis/internal/copy.ts +89 -8
  163. package/src/providers/s3/apis/internal/getProperties.ts +27 -12
  164. package/src/providers/s3/apis/internal/getUrl.ts +28 -14
  165. package/src/providers/s3/apis/internal/list.ts +135 -29
  166. package/src/providers/s3/apis/internal/remove.ts +36 -13
  167. package/src/providers/s3/apis/list.ts +54 -26
  168. package/src/providers/s3/apis/remove.ts +28 -7
  169. package/src/providers/s3/apis/server/copy.ts +42 -5
  170. package/src/providers/s3/apis/server/getProperties.ts +41 -4
  171. package/src/providers/s3/apis/server/getUrl.ts +55 -4
  172. package/src/providers/s3/apis/server/list.ts +64 -32
  173. package/src/providers/s3/apis/server/remove.ts +39 -4
  174. package/src/providers/s3/apis/uploadData/index.ts +77 -8
  175. package/src/providers/s3/apis/uploadData/multipart/initialUpload.ts +4 -3
  176. package/src/providers/s3/apis/uploadData/multipart/uploadCache.ts +11 -2
  177. package/src/providers/s3/apis/uploadData/multipart/uploadHandlers.ts +50 -20
  178. package/src/providers/s3/apis/uploadData/putObjectJob.ts +23 -9
  179. package/src/providers/s3/index.ts +16 -0
  180. package/src/providers/s3/types/index.ts +37 -14
  181. package/src/providers/s3/types/inputs.ts +95 -26
  182. package/src/providers/s3/types/options.ts +73 -27
  183. package/src/providers/s3/types/outputs.ts +80 -13
  184. package/src/providers/s3/utils/client/utils/parsePayload.ts +1 -1
  185. package/src/providers/s3/utils/constants.ts +4 -0
  186. package/src/providers/s3/utils/index.ts +3 -0
  187. package/src/providers/s3/utils/isInputWithPath.ts +13 -0
  188. package/src/providers/s3/utils/resolveS3ConfigAndInput.ts +3 -2
  189. package/src/providers/s3/utils/validateStorageOperationInput.ts +39 -0
  190. package/src/providers/s3/utils/validateStorageOperationInputWithPrefix.ts +46 -0
  191. package/src/types/index.ts +16 -8
  192. package/src/types/inputs.ts +73 -20
  193. package/src/types/options.ts +1 -0
  194. package/src/types/outputs.ts +29 -6
@@ -7,11 +7,19 @@ import { StorageAction } from '@aws-amplify/core/internals/utils';
7
7
  import {
8
8
  ListAllInput,
9
9
  ListAllOutput,
10
+ ListAllWithPathInput,
11
+ ListAllWithPathOutput,
10
12
  ListOutputItem,
13
+ ListOutputItemWithPath,
11
14
  ListPaginateInput,
12
15
  ListPaginateOutput,
16
+ ListPaginateWithPathInput,
17
+ ListPaginateWithPathOutput,
13
18
  } from '../../types';
14
- import { resolveS3ConfigAndInput } from '../../utils';
19
+ import {
20
+ resolveS3ConfigAndInput,
21
+ validateStorageOperationInputWithPrefix,
22
+ } from '../../utils';
15
23
  import { ResolvedS3Config } from '../../types/options';
16
24
  import {
17
25
  ListObjectsV2Input,
@@ -20,25 +28,43 @@ import {
20
28
  } from '../../utils/client';
21
29
  import { getStorageUserAgentValue } from '../../utils/userAgent';
22
30
  import { logger } from '../../../../utils';
31
+ import { STORAGE_INPUT_PREFIX } from '../../utils/constants';
23
32
 
24
33
  const MAX_PAGE_SIZE = 1000;
25
34
 
26
35
  interface ListInputArgs {
27
36
  s3Config: ResolvedS3Config;
28
37
  listParams: ListObjectsV2Input;
29
- prefix: string;
38
+ generatedPrefix?: string;
30
39
  }
31
40
 
32
41
  export const list = async (
33
42
  amplify: AmplifyClassV6,
34
- input?: ListAllInput | ListPaginateInput,
35
- ): Promise<ListAllOutput | ListPaginateOutput> => {
36
- const { options = {}, prefix: path = '' } = input ?? {};
43
+ input:
44
+ | ListAllInput
45
+ | ListPaginateInput
46
+ | ListAllWithPathInput
47
+ | ListPaginateWithPathInput,
48
+ ): Promise<
49
+ | ListAllOutput
50
+ | ListPaginateOutput
51
+ | ListAllWithPathOutput
52
+ | ListPaginateWithPathOutput
53
+ > => {
54
+ const { options = {} } = input;
37
55
  const {
38
56
  s3Config,
39
57
  bucket,
40
- keyPrefix: prefix,
58
+ keyPrefix: generatedPrefix,
59
+ identityId,
41
60
  } = await resolveS3ConfigAndInput(amplify, options);
61
+
62
+ const { inputType, objectKey } = validateStorageOperationInputWithPrefix(
63
+ input,
64
+ identityId,
65
+ );
66
+ const isInputWithPrefix = inputType === STORAGE_INPUT_PREFIX;
67
+
42
68
  // @ts-expect-error pageSize and nextToken should not coexist with listAll
43
69
  if (options?.listAll && (options?.pageSize || options?.nextToken)) {
44
70
  const anyOptions = options as any;
@@ -50,34 +76,53 @@ export const list = async (
50
76
  }
51
77
  const listParams = {
52
78
  Bucket: bucket,
53
- Prefix: `${prefix}${path}`,
79
+ Prefix: isInputWithPrefix ? `${generatedPrefix}${objectKey}` : objectKey,
54
80
  MaxKeys: options?.listAll ? undefined : options?.pageSize,
55
81
  ContinuationToken: options?.listAll ? undefined : options?.nextToken,
56
82
  };
57
83
  logger.debug(`listing items from "${listParams.Prefix}"`);
58
84
 
59
- return options.listAll
60
- ? _listAll({ s3Config, listParams, prefix })
61
- : _list({ s3Config, listParams, prefix });
85
+ const listInputArgs: ListInputArgs = {
86
+ s3Config,
87
+ listParams,
88
+ };
89
+ if (options.listAll) {
90
+ if (isInputWithPrefix) {
91
+ return _listAllWithPrefix({
92
+ ...listInputArgs,
93
+ generatedPrefix,
94
+ });
95
+ } else {
96
+ return _listAllWithPath(listInputArgs);
97
+ }
98
+ } else {
99
+ if (isInputWithPrefix) {
100
+ return _listWithPrefix({ ...listInputArgs, generatedPrefix });
101
+ } else {
102
+ return _listWithPath(listInputArgs);
103
+ }
104
+ }
62
105
  };
63
106
 
64
- const _listAll = async ({
107
+ /** @deprecated Use {@link _listAllWithPath} instead. */
108
+ const _listAllWithPrefix = async ({
65
109
  s3Config,
66
110
  listParams,
67
- prefix,
111
+ generatedPrefix,
68
112
  }: ListInputArgs): Promise<ListAllOutput> => {
69
113
  const listResult: ListOutputItem[] = [];
70
114
  let continuationToken = listParams.ContinuationToken;
71
115
  do {
72
- const { items: pageResults, nextToken: pageNextToken } = await _list({
73
- prefix,
74
- s3Config,
75
- listParams: {
76
- ...listParams,
77
- ContinuationToken: continuationToken,
78
- MaxKeys: MAX_PAGE_SIZE,
79
- },
80
- });
116
+ const { items: pageResults, nextToken: pageNextToken } =
117
+ await _listWithPrefix({
118
+ generatedPrefix,
119
+ s3Config,
120
+ listParams: {
121
+ ...listParams,
122
+ ContinuationToken: continuationToken,
123
+ MaxKeys: MAX_PAGE_SIZE,
124
+ },
125
+ });
81
126
  listResult.push(...pageResults);
82
127
  continuationToken = pageNextToken;
83
128
  } while (continuationToken);
@@ -87,10 +132,11 @@ const _listAll = async ({
87
132
  };
88
133
  };
89
134
 
90
- const _list = async ({
135
+ /** @deprecated Use {@link _listWithPath} instead. */
136
+ const _listWithPrefix = async ({
91
137
  s3Config,
92
138
  listParams,
93
- prefix,
139
+ generatedPrefix,
94
140
  }: ListInputArgs): Promise<ListPaginateOutput> => {
95
141
  const listParamsClone = { ...listParams };
96
142
  if (!listParamsClone.MaxKeys || listParamsClone.MaxKeys > MAX_PAGE_SIZE) {
@@ -112,15 +158,75 @@ const _list = async ({
112
158
  };
113
159
  }
114
160
 
115
- const listResult = response.Contents.map(item => ({
116
- key: item.Key!.substring(prefix.length),
117
- eTag: item.ETag,
118
- lastModified: item.LastModified,
119
- size: item.Size,
120
- }));
161
+ return {
162
+ items: response.Contents.map(item => ({
163
+ key: generatedPrefix
164
+ ? item.Key!.substring(generatedPrefix.length)
165
+ : item.Key!,
166
+ eTag: item.ETag,
167
+ lastModified: item.LastModified,
168
+ size: item.Size,
169
+ })),
170
+ nextToken: response.NextContinuationToken,
171
+ };
172
+ };
173
+
174
+ const _listAllWithPath = async ({
175
+ s3Config,
176
+ listParams,
177
+ }: ListInputArgs): Promise<ListAllWithPathOutput> => {
178
+ const listResult: ListOutputItemWithPath[] = [];
179
+ let continuationToken = listParams.ContinuationToken;
180
+ do {
181
+ const { items: pageResults, nextToken: pageNextToken } =
182
+ await _listWithPath({
183
+ s3Config,
184
+ listParams: {
185
+ ...listParams,
186
+ ContinuationToken: continuationToken,
187
+ MaxKeys: MAX_PAGE_SIZE,
188
+ },
189
+ });
190
+ listResult.push(...pageResults);
191
+ continuationToken = pageNextToken;
192
+ } while (continuationToken);
121
193
 
122
194
  return {
123
195
  items: listResult,
196
+ };
197
+ };
198
+
199
+ const _listWithPath = async ({
200
+ s3Config,
201
+ listParams,
202
+ }: ListInputArgs): Promise<ListPaginateWithPathOutput> => {
203
+ const listParamsClone = { ...listParams };
204
+ if (!listParamsClone.MaxKeys || listParamsClone.MaxKeys > MAX_PAGE_SIZE) {
205
+ logger.debug(`defaulting pageSize to ${MAX_PAGE_SIZE}.`);
206
+ listParamsClone.MaxKeys = MAX_PAGE_SIZE;
207
+ }
208
+
209
+ const response: ListObjectsV2Output = await listObjectsV2(
210
+ {
211
+ ...s3Config,
212
+ userAgentValue: getStorageUserAgentValue(StorageAction.List),
213
+ },
214
+ listParamsClone,
215
+ );
216
+
217
+ if (!response?.Contents) {
218
+ return {
219
+ items: [],
220
+ };
221
+ }
222
+
223
+ return {
224
+ items: response.Contents.map(item => ({
225
+ path: item.Key!,
226
+ eTag: item.ETag,
227
+ lastModified: item.LastModified,
228
+ size: item.Size,
229
+ })),
124
230
  nextToken: response.NextContinuationToken,
125
231
  };
126
232
  };
@@ -4,24 +4,43 @@
4
4
  import { AmplifyClassV6 } from '@aws-amplify/core';
5
5
  import { StorageAction } from '@aws-amplify/core/internals/utils';
6
6
 
7
- import { RemoveInput, RemoveOutput } from '../../types';
8
- import { resolveS3ConfigAndInput } from '../../utils';
7
+ import {
8
+ RemoveInput,
9
+ RemoveOutput,
10
+ RemoveWithPathInput,
11
+ RemoveWithPathOutput,
12
+ } from '../../types';
13
+ import {
14
+ resolveS3ConfigAndInput,
15
+ validateStorageOperationInput,
16
+ } from '../../utils';
9
17
  import { deleteObject } from '../../utils/client';
10
18
  import { getStorageUserAgentValue } from '../../utils/userAgent';
11
19
  import { logger } from '../../../../utils';
20
+ import { STORAGE_INPUT_KEY } from '../../utils/constants';
12
21
 
13
22
  export const remove = async (
14
23
  amplify: AmplifyClassV6,
15
- input: RemoveInput,
16
- ): Promise<RemoveOutput> => {
17
- const { key, options = {} } = input;
18
- const { s3Config, keyPrefix, bucket } = await resolveS3ConfigAndInput(
19
- amplify,
20
- options,
24
+ input: RemoveInput | RemoveWithPathInput,
25
+ ): Promise<RemoveOutput | RemoveWithPathOutput> => {
26
+ const { options = {} } = input ?? {};
27
+ const { s3Config, keyPrefix, bucket, identityId } =
28
+ await resolveS3ConfigAndInput(amplify, options);
29
+
30
+ const { inputType, objectKey } = validateStorageOperationInput(
31
+ input,
32
+ identityId,
21
33
  );
22
34
 
23
- const finalKey = `${keyPrefix}${key}`;
24
- logger.debug(`remove "${key}" from "${finalKey}".`);
35
+ let finalKey;
36
+ if (inputType === STORAGE_INPUT_KEY) {
37
+ finalKey = `${keyPrefix}${objectKey}`;
38
+ logger.debug(`remove "${objectKey}" from "${finalKey}".`);
39
+ } else {
40
+ finalKey = objectKey;
41
+ logger.debug(`removing object in path "${finalKey}"`);
42
+ }
43
+
25
44
  await deleteObject(
26
45
  {
27
46
  ...s3Config,
@@ -33,7 +52,11 @@ export const remove = async (
33
52
  },
34
53
  );
35
54
 
36
- return {
37
- key,
38
- };
55
+ return inputType === STORAGE_INPUT_KEY
56
+ ? {
57
+ key: objectKey,
58
+ }
59
+ : {
60
+ path: objectKey,
61
+ };
39
62
  };
@@ -1,41 +1,69 @@
1
1
  // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
-
4
3
  import { Amplify } from '@aws-amplify/core';
5
4
 
6
5
  import {
7
6
  ListAllInput,
8
7
  ListAllOutput,
8
+ ListAllWithPathInput,
9
+ ListAllWithPathOutput,
9
10
  ListPaginateInput,
10
11
  ListPaginateOutput,
11
- S3Exception,
12
+ ListPaginateWithPathInput,
13
+ ListPaginateWithPathOutput,
12
14
  } from '../types';
13
- import { StorageValidationErrorCode } from '../../../errors/types/validation';
14
15
 
15
16
  import { list as listInternal } from './internal/list';
16
17
 
17
- interface ListApi {
18
- /**
19
- * List files with given prefix in pages
20
- * pageSize defaulted to 1000. Additionally, the result will include a nextToken if there are more items to retrieve.
21
- * @param input - The ListPaginateInput object.
22
- * @returns A list of keys and metadata with
23
- * @throws service: {@link S3Exception} - S3 service errors thrown when checking for existence of bucket
24
- * @throws validation: {@link StorageValidationErrorCode } - thrown when there are issues with credentials
25
- */
26
- (input?: ListPaginateInput): Promise<ListPaginateOutput>;
27
- /**
28
- * List all files from S3. You can set `listAll` to true in `options` to get all the files from S3.
29
- * @param input - The ListAllInput object.
30
- * @returns A list of keys and metadata for all objects in path
31
- * @throws service: {@link S3Exception} - S3 service errors thrown when checking for existence of bucket
32
- * @throws validation: {@link StorageValidationErrorCode } - thrown when there are issues with credentials
33
- */
34
- (input?: ListAllInput): Promise<ListAllOutput>;
35
- }
18
+ /**
19
+ * List files in pages with the given `path`.
20
+ * `pageSize` is defaulted to 1000. Additionally, the result will include a `nextToken` if there are more items to retrieve.
21
+ * @param input - The `ListPaginateWithPathInput` object.
22
+ * @returns A list of objects with path and metadata
23
+ * @throws service: `S3Exception` - S3 service errors thrown when checking for existence of bucket
24
+ * @throws validation: `StorageValidationErrorCode` - thrown when there are issues with credentials
25
+ */
26
+ export function list(
27
+ input: ListPaginateWithPathInput,
28
+ ): Promise<ListPaginateWithPathOutput>;
29
+ /**
30
+ * List all files from S3 for a given `path`. You can set `listAll` to true in `options` to get all the files from S3.
31
+ * @param input - The `ListAllWithPathInput` object.
32
+ * @returns A list of all objects with path and metadata
33
+ * @throws service: `S3Exception` - S3 service errors thrown when checking for existence of bucket
34
+ * @throws validation: `StorageValidationErrorCode` - thrown when there are issues with credentials
35
+ */
36
+ export function list(
37
+ input: ListAllWithPathInput,
38
+ ): Promise<ListAllWithPathOutput>;
39
+ /**
40
+ * @deprecated The `prefix` and `accessLevel` parameters are deprecated and may be removed in the next major version.
41
+ * Please use {@link https://docs.amplify.aws/react/build-a-backend/storage/list | path} instead.
42
+ * List files in pages with the given `prefix`.
43
+ * `pageSize` is defaulted to 1000. Additionally, the result will include a `nextToken` if there are more items to retrieve.
44
+ * @param input - The `ListPaginateInput` object.
45
+ * @returns A list of objects with key and metadata
46
+ * @throws service: `S3Exception` - S3 service errors thrown when checking for existence of bucket
47
+ * @throws validation: `StorageValidationErrorCode` - thrown when there are issues with credentials
48
+ */
49
+ export function list(input?: ListPaginateInput): Promise<ListPaginateOutput>;
50
+ /**
51
+ * @deprecated The `prefix` and `accessLevel` parameters are deprecated and may be removed in the next major version.
52
+ * Please use {@link https://docs.amplify.aws/react/build-a-backend/storage/list | path} instead.
53
+ * List all files from S3 for a given `prefix`. You can set `listAll` to true in `options` to get all the files from S3.
54
+ * @param input - The `ListAllInput` object.
55
+ * @returns A list of all objects with key and metadata
56
+ * @throws service: `S3Exception` - S3 service errors thrown when checking for existence of bucket
57
+ * @throws validation: `StorageValidationErrorCode` - thrown when there are issues with credentials
58
+ */
59
+ export function list(input?: ListAllInput): Promise<ListAllOutput>;
36
60
 
37
- export const list: ListApi = (
38
- input?: ListAllInput | ListPaginateInput,
39
- ): Promise<ListAllOutput | ListPaginateOutput> => {
61
+ export function list(
62
+ input?:
63
+ | ListAllInput
64
+ | ListPaginateInput
65
+ | ListAllWithPathInput
66
+ | ListPaginateWithPathInput,
67
+ ) {
40
68
  return listInternal(Amplify, input ?? {});
41
- };
69
+ }
@@ -3,18 +3,39 @@
3
3
 
4
4
  import { Amplify } from '@aws-amplify/core';
5
5
 
6
- import { RemoveInput, RemoveOutput, S3Exception } from '../types';
7
- import { StorageValidationErrorCode } from '../../../errors/types/validation';
6
+ import {
7
+ RemoveInput,
8
+ RemoveOutput,
9
+ RemoveWithPathInput,
10
+ RemoveWithPathOutput,
11
+ } from '../types';
8
12
 
9
13
  import { remove as removeInternal } from './internal/remove';
10
14
 
11
15
  /**
12
16
  * Remove a file from your S3 bucket.
13
- * @param input - The RemoveInput object.
17
+ * @param input - The `RemoveWithPathInput` object.
18
+ * @return Output containing the removed object path.
19
+ * @throws service: `S3Exception` - S3 service errors thrown while while removing the object.
20
+ * @throws validation: `StorageValidationErrorCode` - Validation errors thrown
21
+ * when there is no path or path is empty or path has a leading slash.
22
+ */
23
+ export function remove(
24
+ input: RemoveWithPathInput,
25
+ ): Promise<RemoveWithPathOutput>;
26
+ /**
27
+ * @deprecated The `key` and `accessLevel` parameters are deprecated and may be removed in the next major version.
28
+ * Please use {@link https://docs.amplify.aws/react/build-a-backend/storage/remove | path} instead.
29
+ *
30
+ * Remove a file from your S3 bucket.
31
+ * @param input - The `RemoveInput` object.
14
32
  * @return Output containing the removed object key
15
- * @throws service: {@link S3Exception} - S3 service errors thrown while getting properties
16
- * @throws validation: {@link StorageValidationErrorCode } - Validation errors thrown
33
+ * @throws service: `S3Exception` - S3 service errors thrown while while removing the object
34
+ * @throws validation: `StorageValidationErrorCode` - Validation errors thrown
35
+ * when there is no key or its empty.
17
36
  */
18
- export const remove = (input: RemoveInput): Promise<RemoveOutput> => {
37
+ export function remove(input: RemoveInput): Promise<RemoveOutput>;
38
+
39
+ export function remove(input: RemoveInput | RemoveWithPathInput) {
19
40
  return removeInternal(Amplify, input);
20
- };
41
+ }
@@ -1,17 +1,54 @@
1
1
  // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
-
4
3
  import {
5
4
  AmplifyServer,
6
5
  getAmplifyServerContext,
7
6
  } from '@aws-amplify/core/internals/adapter-core';
8
7
 
9
- import { CopyInput, CopyOutput } from '../../types';
8
+ import {
9
+ CopyInput,
10
+ CopyOutput,
11
+ CopyWithPathInput,
12
+ CopyWithPathOutput,
13
+ } from '../../types';
10
14
  import { copy as copyInternal } from '../internal/copy';
11
15
 
12
- export const copy = async (
16
+ /**
17
+ * Copy an object from a source to a destination object within the same bucket.
18
+ *
19
+ * @param contextSpec - The isolated server context.
20
+ * @param input - The `CopyWithPathInput` object.
21
+ * @returns Output containing the destination object path.
22
+ * @throws service: `S3Exception` - Thrown when checking for existence of the object
23
+ * @throws validation: `StorageValidationErrorCode` - Thrown when
24
+ * source or destination path is not defined.
25
+ */
26
+ export function copy(
27
+ contextSpec: AmplifyServer.ContextSpec,
28
+ input: CopyWithPathInput,
29
+ ): Promise<CopyWithPathOutput>;
30
+ /**
31
+ * @deprecated The `key` and `accessLevel` parameters are deprecated and may be removed in the next major version.
32
+ * Please use {@link https://docs.amplify.aws/react/build-a-backend/storage/copy | path} instead.
33
+ *
34
+ * Copy an object from a source to a destination object within the same bucket. Can optionally copy files across
35
+ * different accessLevel or identityId (if source object's accessLevel is 'protected').
36
+ *
37
+ * @param contextSpec - The isolated server context.
38
+ * @param input - The `CopyInput` object.
39
+ * @returns Output containing the destination object key.
40
+ * @throws service: `S3Exception` - Thrown when checking for existence of the object
41
+ * @throws validation: `StorageValidationErrorCode` - Thrown when
42
+ * source or destination key is not defined.
43
+ */
44
+ export function copy(
13
45
  contextSpec: AmplifyServer.ContextSpec,
14
46
  input: CopyInput,
15
- ): Promise<CopyOutput> => {
47
+ ): Promise<CopyOutput>;
48
+
49
+ export function copy(
50
+ contextSpec: AmplifyServer.ContextSpec,
51
+ input: CopyInput | CopyWithPathInput,
52
+ ) {
16
53
  return copyInternal(getAmplifyServerContext(contextSpec).amplify, input);
17
- };
54
+ }
@@ -6,15 +6,52 @@ import {
6
6
  getAmplifyServerContext,
7
7
  } from '@aws-amplify/core/internals/adapter-core';
8
8
 
9
- import { GetPropertiesInput, GetPropertiesOutput } from '../../types';
9
+ import {
10
+ GetPropertiesInput,
11
+ GetPropertiesOutput,
12
+ GetPropertiesWithPathInput,
13
+ GetPropertiesWithPathOutput,
14
+ } from '../../types';
10
15
  import { getProperties as getPropertiesInternal } from '../internal/getProperties';
11
16
 
12
- export const getProperties = (
17
+ /**
18
+ * Gets the properties of a file. The properties include S3 system metadata and
19
+ * the user metadata that was provided when uploading the file.
20
+ *
21
+ * @param contextSpec - The isolated server context.
22
+ * @param input - The `GetPropertiesWithPathInput` object.
23
+ * @returns Requested object properties.
24
+ * @throws An `S3Exception` when the underlying S3 service returned error.
25
+ * @throws A `StorageValidationErrorCode` when API call parameters are invalid.
26
+ */
27
+ export function getProperties(
28
+ contextSpec: AmplifyServer.ContextSpec,
29
+ input: GetPropertiesWithPathInput,
30
+ ): Promise<GetPropertiesWithPathOutput>;
31
+ /**
32
+ * @deprecated The `key` and `accessLevel` parameters are deprecated and may be removed in the next major version.
33
+ * Please use {@link https://docs.amplify.aws/javascript/build-a-backend/storage/get-properties/ | path} instead.
34
+ *
35
+ * Gets the properties of a file. The properties include S3 system metadata and
36
+ * the user metadata that was provided when uploading the file.
37
+ *
38
+ * @param contextSpec - The isolated server context.
39
+ * @param input - The `GetPropertiesInput` object.
40
+ * @returns Requested object properties.
41
+ * @throws An `S3Exception` when the underlying S3 service returned error.
42
+ * @throws A `StorageValidationErrorCode` when API call parameters are invalid.
43
+ */
44
+ export function getProperties(
13
45
  contextSpec: AmplifyServer.ContextSpec,
14
46
  input: GetPropertiesInput,
15
- ): Promise<GetPropertiesOutput> => {
47
+ ): Promise<GetPropertiesOutput>;
48
+
49
+ export function getProperties(
50
+ contextSpec: AmplifyServer.ContextSpec,
51
+ input: GetPropertiesInput | GetPropertiesWithPathInput,
52
+ ) {
16
53
  return getPropertiesInternal(
17
54
  getAmplifyServerContext(contextSpec).amplify,
18
55
  input,
19
56
  );
20
- };
57
+ }
@@ -6,12 +6,63 @@ import {
6
6
  getAmplifyServerContext,
7
7
  } from '@aws-amplify/core/internals/adapter-core';
8
8
 
9
- import { GetUrlInput, GetUrlOutput } from '../../types';
9
+ import {
10
+ GetUrlInput,
11
+ GetUrlOutput,
12
+ GetUrlWithPathInput,
13
+ GetUrlWithPathOutput,
14
+ } from '../../types';
10
15
  import { getUrl as getUrlInternal } from '../internal/getUrl';
11
16
 
12
- export const getUrl = async (
17
+ /**
18
+ * Get a temporary presigned URL to download the specified S3 object.
19
+ * The presigned URL expires when the associated role used to sign the request expires or
20
+ * the option `expiresIn` is reached. The `expiresAt` property in the output object indicates when the URL MAY expire.
21
+ *
22
+ * By default, it will not validate the object that exists in S3. If you set the `options.validateObjectExistence`
23
+ * to true, this method will verify the given object already exists in S3 before returning a presigned
24
+ * URL, and will throw `StorageError` if the object does not exist.
25
+ *
26
+ * @param contextSpec - The isolated server context.
27
+ * @param input - The `GetUrlWithPathInput` object.
28
+ * @returns Presigned URL and timestamp when the URL may expire.
29
+ * @throws service: `S3Exception` - thrown when checking for existence of the object
30
+ * @throws validation: `StorageValidationErrorCode` - Validation errors
31
+ * thrown either username or key are not defined.
32
+ *
33
+ */
34
+ export function getUrl(
35
+ contextSpec: AmplifyServer.ContextSpec,
36
+ input: GetUrlWithPathInput,
37
+ ): Promise<GetUrlWithPathOutput>;
38
+ /**
39
+ * @deprecated The `key` and `accessLevel` parameters are deprecated and may be removed in the next major version.
40
+ * Please use {@link https://docs.amplify.aws/javascript/build-a-backend/storage/download/#generate-a-download-url | path} instead.
41
+ *
42
+ * Get a temporary presigned URL to download the specified S3 object.
43
+ * The presigned URL expires when the associated role used to sign the request expires or
44
+ * the option `expiresIn` is reached. The `expiresAt` property in the output object indicates when the URL MAY expire.
45
+ *
46
+ * By default, it will not validate the object that exists in S3. If you set the `options.validateObjectExistence`
47
+ * to true, this method will verify the given object already exists in S3 before returning a presigned
48
+ * URL, and will throw `StorageError` if the object does not exist.
49
+ *
50
+ * @param contextSpec - The isolated server context.
51
+ * @param input - The `GetUrlInput` object.
52
+ * @returns Presigned URL and timestamp when the URL may expire.
53
+ * @throws service: `S3Exception` - thrown when checking for existence of the object
54
+ * @throws validation: `StorageValidationErrorCode` - Validation errors
55
+ * thrown either username or key are not defined.
56
+ *
57
+ */
58
+ export function getUrl(
13
59
  contextSpec: AmplifyServer.ContextSpec,
14
60
  input: GetUrlInput,
15
- ): Promise<GetUrlOutput> => {
61
+ ): Promise<GetUrlOutput>;
62
+
63
+ export function getUrl(
64
+ contextSpec: AmplifyServer.ContextSpec,
65
+ input: GetUrlInput | GetUrlWithPathInput,
66
+ ) {
16
67
  return getUrlInternal(getAmplifyServerContext(contextSpec).amplify, input);
17
- };
68
+ }