@aws-amplify/storage 6.4.7 → 6.4.8-unstable.0a07393.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.
@@ -26,6 +26,7 @@ const list = async (amplify, input) => {
26
26
  Prefix: isInputWithPrefix ? `${generatedPrefix}${objectKey}` : objectKey,
27
27
  MaxKeys: options?.listAll ? undefined : options?.pageSize,
28
28
  ContinuationToken: options?.listAll ? undefined : options?.nextToken,
29
+ Delimiter: getDelimiter(options.subpathStrategy),
29
30
  };
30
31
  utils_3.logger.debug(`listing items from "${listParams.Prefix}"`);
31
32
  const listInputArgs = {
@@ -104,9 +105,10 @@ const _listWithPrefix = async ({ s3Config, listParams, generatedPrefix, }) => {
104
105
  };
105
106
  const _listAllWithPath = async ({ s3Config, listParams, }) => {
106
107
  const listResult = [];
108
+ const excludedSubpaths = [];
107
109
  let continuationToken = listParams.ContinuationToken;
108
110
  do {
109
- const { items: pageResults, nextToken: pageNextToken } = await _listWithPath({
111
+ const { items: pageResults, excludedSubpaths: pageExcludedSubpaths, nextToken: pageNextToken, } = await _listWithPath({
110
112
  s3Config,
111
113
  listParams: {
112
114
  ...listParams,
@@ -115,10 +117,12 @@ const _listAllWithPath = async ({ s3Config, listParams, }) => {
115
117
  },
116
118
  });
117
119
  listResult.push(...pageResults);
120
+ excludedSubpaths.push(...(pageExcludedSubpaths ?? []));
118
121
  continuationToken = pageNextToken;
119
122
  } while (continuationToken);
120
123
  return {
121
124
  items: listResult,
125
+ excludedSubpaths,
122
126
  };
123
127
  };
124
128
  const _listWithPath = async ({ s3Config, listParams, }) => {
@@ -127,23 +131,39 @@ const _listWithPath = async ({ s3Config, listParams, }) => {
127
131
  utils_3.logger.debug(`defaulting pageSize to ${MAX_PAGE_SIZE}.`);
128
132
  listParamsClone.MaxKeys = MAX_PAGE_SIZE;
129
133
  }
130
- const response = await (0, client_1.listObjectsV2)({
134
+ const { Contents: contents, NextContinuationToken: nextContinuationToken, CommonPrefixes: commonPrefixes, } = await (0, client_1.listObjectsV2)({
131
135
  ...s3Config,
132
136
  userAgentValue: (0, userAgent_1.getStorageUserAgentValue)(utils_1.StorageAction.List),
133
137
  }, listParamsClone);
134
- if (!response?.Contents) {
138
+ const excludedSubpaths = commonPrefixes && mapCommonPrefixesToExcludedSubpaths(commonPrefixes);
139
+ if (!contents) {
135
140
  return {
136
141
  items: [],
142
+ excludedSubpaths,
137
143
  };
138
144
  }
139
145
  return {
140
- items: response.Contents.map(item => ({
146
+ items: contents.map(item => ({
141
147
  path: item.Key,
142
148
  eTag: item.ETag,
143
149
  lastModified: item.LastModified,
144
150
  size: item.Size,
145
151
  })),
146
- nextToken: response.NextContinuationToken,
152
+ nextToken: nextContinuationToken,
153
+ excludedSubpaths,
147
154
  };
148
155
  };
156
+ const mapCommonPrefixesToExcludedSubpaths = (commonPrefixes) => {
157
+ return commonPrefixes.reduce((mappedSubpaths, { Prefix }) => {
158
+ if (Prefix) {
159
+ mappedSubpaths.push(Prefix);
160
+ }
161
+ return mappedSubpaths;
162
+ }, []);
163
+ };
164
+ const getDelimiter = (subpathStrategy) => {
165
+ if (subpathStrategy?.strategy === 'exclude') {
166
+ return subpathStrategy?.delimiter ?? constants_1.DEFAULT_DELIMITER;
167
+ }
168
+ };
149
169
  //# sourceMappingURL=list.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sources":["../../../../../../src/providers/s3/apis/internal/list.ts"],"sourcesContent":["\"use strict\";\n// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.list = void 0;\nconst utils_1 = require(\"@aws-amplify/core/internals/utils\");\nconst utils_2 = require(\"../../utils\");\nconst client_1 = require(\"../../utils/client\");\nconst userAgent_1 = require(\"../../utils/userAgent\");\nconst utils_3 = require(\"../../../../utils\");\nconst constants_1 = require(\"../../utils/constants\");\nconst MAX_PAGE_SIZE = 1000;\nconst list = async (amplify, input) => {\n const { options = {} } = input;\n const { s3Config, bucket, keyPrefix: generatedPrefix, identityId, } = await (0, utils_2.resolveS3ConfigAndInput)(amplify, options);\n const { inputType, objectKey } = (0, utils_2.validateStorageOperationInputWithPrefix)(input, identityId);\n const isInputWithPrefix = inputType === constants_1.STORAGE_INPUT_PREFIX;\n // @ts-expect-error pageSize and nextToken should not coexist with listAll\n if (options?.listAll && (options?.pageSize || options?.nextToken)) {\n const anyOptions = options;\n utils_3.logger.debug(`listAll is set to true, ignoring ${anyOptions?.pageSize ? `pageSize: ${anyOptions?.pageSize}` : ''} ${anyOptions?.nextToken ? `nextToken: ${anyOptions?.nextToken}` : ''}.`);\n }\n const listParams = {\n Bucket: bucket,\n Prefix: isInputWithPrefix ? `${generatedPrefix}${objectKey}` : objectKey,\n MaxKeys: options?.listAll ? undefined : options?.pageSize,\n ContinuationToken: options?.listAll ? undefined : options?.nextToken,\n };\n utils_3.logger.debug(`listing items from \"${listParams.Prefix}\"`);\n const listInputArgs = {\n s3Config,\n listParams,\n };\n if (options.listAll) {\n if (isInputWithPrefix) {\n return _listAllWithPrefix({\n ...listInputArgs,\n generatedPrefix,\n });\n }\n else {\n return _listAllWithPath(listInputArgs);\n }\n }\n else {\n if (isInputWithPrefix) {\n return _listWithPrefix({ ...listInputArgs, generatedPrefix });\n }\n else {\n return _listWithPath(listInputArgs);\n }\n }\n};\nexports.list = list;\n/** @deprecated Use {@link _listAllWithPath} instead. */\nconst _listAllWithPrefix = async ({ s3Config, listParams, generatedPrefix, }) => {\n const listResult = [];\n let continuationToken = listParams.ContinuationToken;\n do {\n const { items: pageResults, nextToken: pageNextToken } = await _listWithPrefix({\n generatedPrefix,\n s3Config,\n listParams: {\n ...listParams,\n ContinuationToken: continuationToken,\n MaxKeys: MAX_PAGE_SIZE,\n },\n });\n listResult.push(...pageResults);\n continuationToken = pageNextToken;\n } while (continuationToken);\n return {\n items: listResult,\n };\n};\n/** @deprecated Use {@link _listWithPath} instead. */\nconst _listWithPrefix = async ({ s3Config, listParams, generatedPrefix, }) => {\n const listParamsClone = { ...listParams };\n if (!listParamsClone.MaxKeys || listParamsClone.MaxKeys > MAX_PAGE_SIZE) {\n utils_3.logger.debug(`defaulting pageSize to ${MAX_PAGE_SIZE}.`);\n listParamsClone.MaxKeys = MAX_PAGE_SIZE;\n }\n const response = await (0, client_1.listObjectsV2)({\n ...s3Config,\n userAgentValue: (0, userAgent_1.getStorageUserAgentValue)(utils_1.StorageAction.List),\n }, listParamsClone);\n if (!response?.Contents) {\n return {\n items: [],\n };\n }\n return {\n items: response.Contents.map(item => ({\n key: generatedPrefix\n ? item.Key.substring(generatedPrefix.length)\n : item.Key,\n eTag: item.ETag,\n lastModified: item.LastModified,\n size: item.Size,\n })),\n nextToken: response.NextContinuationToken,\n };\n};\nconst _listAllWithPath = async ({ s3Config, listParams, }) => {\n const listResult = [];\n let continuationToken = listParams.ContinuationToken;\n do {\n const { items: pageResults, nextToken: pageNextToken } = await _listWithPath({\n s3Config,\n listParams: {\n ...listParams,\n ContinuationToken: continuationToken,\n MaxKeys: MAX_PAGE_SIZE,\n },\n });\n listResult.push(...pageResults);\n continuationToken = pageNextToken;\n } while (continuationToken);\n return {\n items: listResult,\n };\n};\nconst _listWithPath = async ({ s3Config, listParams, }) => {\n const listParamsClone = { ...listParams };\n if (!listParamsClone.MaxKeys || listParamsClone.MaxKeys > MAX_PAGE_SIZE) {\n utils_3.logger.debug(`defaulting pageSize to ${MAX_PAGE_SIZE}.`);\n listParamsClone.MaxKeys = MAX_PAGE_SIZE;\n }\n const response = await (0, client_1.listObjectsV2)({\n ...s3Config,\n userAgentValue: (0, userAgent_1.getStorageUserAgentValue)(utils_1.StorageAction.List),\n }, listParamsClone);\n if (!response?.Contents) {\n return {\n items: [],\n };\n }\n return {\n items: response.Contents.map(item => ({\n path: item.Key,\n eTag: item.ETag,\n lastModified: item.LastModified,\n size: item.Size,\n })),\n nextToken: response.NextContinuationToken,\n };\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list.js","sources":["../../../../../../src/providers/s3/apis/internal/list.ts"],"sourcesContent":["\"use strict\";\n// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.list = void 0;\nconst utils_1 = require(\"@aws-amplify/core/internals/utils\");\nconst utils_2 = require(\"../../utils\");\nconst client_1 = require(\"../../utils/client\");\nconst userAgent_1 = require(\"../../utils/userAgent\");\nconst utils_3 = require(\"../../../../utils\");\nconst constants_1 = require(\"../../utils/constants\");\nconst MAX_PAGE_SIZE = 1000;\nconst list = async (amplify, input) => {\n const { options = {} } = input;\n const { s3Config, bucket, keyPrefix: generatedPrefix, identityId, } = await (0, utils_2.resolveS3ConfigAndInput)(amplify, options);\n const { inputType, objectKey } = (0, utils_2.validateStorageOperationInputWithPrefix)(input, identityId);\n const isInputWithPrefix = inputType === constants_1.STORAGE_INPUT_PREFIX;\n // @ts-expect-error pageSize and nextToken should not coexist with listAll\n if (options?.listAll && (options?.pageSize || options?.nextToken)) {\n const anyOptions = options;\n utils_3.logger.debug(`listAll is set to true, ignoring ${anyOptions?.pageSize ? `pageSize: ${anyOptions?.pageSize}` : ''} ${anyOptions?.nextToken ? `nextToken: ${anyOptions?.nextToken}` : ''}.`);\n }\n const listParams = {\n Bucket: bucket,\n Prefix: isInputWithPrefix ? `${generatedPrefix}${objectKey}` : objectKey,\n MaxKeys: options?.listAll ? undefined : options?.pageSize,\n ContinuationToken: options?.listAll ? undefined : options?.nextToken,\n Delimiter: getDelimiter(options.subpathStrategy),\n };\n utils_3.logger.debug(`listing items from \"${listParams.Prefix}\"`);\n const listInputArgs = {\n s3Config,\n listParams,\n };\n if (options.listAll) {\n if (isInputWithPrefix) {\n return _listAllWithPrefix({\n ...listInputArgs,\n generatedPrefix,\n });\n }\n else {\n return _listAllWithPath(listInputArgs);\n }\n }\n else {\n if (isInputWithPrefix) {\n return _listWithPrefix({ ...listInputArgs, generatedPrefix });\n }\n else {\n return _listWithPath(listInputArgs);\n }\n }\n};\nexports.list = list;\n/** @deprecated Use {@link _listAllWithPath} instead. */\nconst _listAllWithPrefix = async ({ s3Config, listParams, generatedPrefix, }) => {\n const listResult = [];\n let continuationToken = listParams.ContinuationToken;\n do {\n const { items: pageResults, nextToken: pageNextToken } = await _listWithPrefix({\n generatedPrefix,\n s3Config,\n listParams: {\n ...listParams,\n ContinuationToken: continuationToken,\n MaxKeys: MAX_PAGE_SIZE,\n },\n });\n listResult.push(...pageResults);\n continuationToken = pageNextToken;\n } while (continuationToken);\n return {\n items: listResult,\n };\n};\n/** @deprecated Use {@link _listWithPath} instead. */\nconst _listWithPrefix = async ({ s3Config, listParams, generatedPrefix, }) => {\n const listParamsClone = { ...listParams };\n if (!listParamsClone.MaxKeys || listParamsClone.MaxKeys > MAX_PAGE_SIZE) {\n utils_3.logger.debug(`defaulting pageSize to ${MAX_PAGE_SIZE}.`);\n listParamsClone.MaxKeys = MAX_PAGE_SIZE;\n }\n const response = await (0, client_1.listObjectsV2)({\n ...s3Config,\n userAgentValue: (0, userAgent_1.getStorageUserAgentValue)(utils_1.StorageAction.List),\n }, listParamsClone);\n if (!response?.Contents) {\n return {\n items: [],\n };\n }\n return {\n items: response.Contents.map(item => ({\n key: generatedPrefix\n ? item.Key.substring(generatedPrefix.length)\n : item.Key,\n eTag: item.ETag,\n lastModified: item.LastModified,\n size: item.Size,\n })),\n nextToken: response.NextContinuationToken,\n };\n};\nconst _listAllWithPath = async ({ s3Config, listParams, }) => {\n const listResult = [];\n const excludedSubpaths = [];\n let continuationToken = listParams.ContinuationToken;\n do {\n const { items: pageResults, excludedSubpaths: pageExcludedSubpaths, nextToken: pageNextToken, } = await _listWithPath({\n s3Config,\n listParams: {\n ...listParams,\n ContinuationToken: continuationToken,\n MaxKeys: MAX_PAGE_SIZE,\n },\n });\n listResult.push(...pageResults);\n excludedSubpaths.push(...(pageExcludedSubpaths ?? []));\n continuationToken = pageNextToken;\n } while (continuationToken);\n return {\n items: listResult,\n excludedSubpaths,\n };\n};\nconst _listWithPath = async ({ s3Config, listParams, }) => {\n const listParamsClone = { ...listParams };\n if (!listParamsClone.MaxKeys || listParamsClone.MaxKeys > MAX_PAGE_SIZE) {\n utils_3.logger.debug(`defaulting pageSize to ${MAX_PAGE_SIZE}.`);\n listParamsClone.MaxKeys = MAX_PAGE_SIZE;\n }\n const { Contents: contents, NextContinuationToken: nextContinuationToken, CommonPrefixes: commonPrefixes, } = await (0, client_1.listObjectsV2)({\n ...s3Config,\n userAgentValue: (0, userAgent_1.getStorageUserAgentValue)(utils_1.StorageAction.List),\n }, listParamsClone);\n const excludedSubpaths = commonPrefixes && mapCommonPrefixesToExcludedSubpaths(commonPrefixes);\n if (!contents) {\n return {\n items: [],\n excludedSubpaths,\n };\n }\n return {\n items: contents.map(item => ({\n path: item.Key,\n eTag: item.ETag,\n lastModified: item.LastModified,\n size: item.Size,\n })),\n nextToken: nextContinuationToken,\n excludedSubpaths,\n };\n};\nconst mapCommonPrefixesToExcludedSubpaths = (commonPrefixes) => {\n return commonPrefixes.reduce((mappedSubpaths, { Prefix }) => {\n if (Prefix) {\n mappedSubpaths.push(Prefix);\n }\n return mappedSubpaths;\n }, []);\n};\nconst getDelimiter = (subpathStrategy) => {\n if (subpathStrategy?.strategy === 'exclude') {\n return subpathStrategy?.delimiter ?? constants_1.DEFAULT_DELIMITER;\n }\n};\n"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
4
  // SPDX-License-Identifier: Apache-2.0
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.STORAGE_INPUT_PATH = exports.STORAGE_INPUT_KEY = exports.STORAGE_INPUT_PREFIX = exports.UPLOADS_STORAGE_KEY = exports.DEFAULT_QUEUE_SIZE = exports.MAX_PARTS_COUNT = exports.MAX_OBJECT_SIZE = exports.DEFAULT_PART_SIZE = exports.MAX_URL_EXPIRATION = exports.DEFAULT_PRESIGN_EXPIRATION = exports.DEFAULT_ACCESS_LEVEL = exports.LOCAL_TESTING_S3_ENDPOINT = void 0;
6
+ exports.DEFAULT_DELIMITER = exports.STORAGE_INPUT_PATH = exports.STORAGE_INPUT_KEY = exports.STORAGE_INPUT_PREFIX = exports.UPLOADS_STORAGE_KEY = exports.DEFAULT_QUEUE_SIZE = exports.MAX_PARTS_COUNT = exports.MAX_OBJECT_SIZE = exports.DEFAULT_PART_SIZE = exports.MAX_URL_EXPIRATION = exports.DEFAULT_PRESIGN_EXPIRATION = exports.DEFAULT_ACCESS_LEVEL = exports.LOCAL_TESTING_S3_ENDPOINT = void 0;
7
7
  exports.LOCAL_TESTING_S3_ENDPOINT = 'http://localhost:20005';
8
8
  exports.DEFAULT_ACCESS_LEVEL = 'guest';
9
9
  exports.DEFAULT_PRESIGN_EXPIRATION = 900;
@@ -19,4 +19,5 @@ exports.UPLOADS_STORAGE_KEY = '__uploadInProgress';
19
19
  exports.STORAGE_INPUT_PREFIX = 'prefix';
20
20
  exports.STORAGE_INPUT_KEY = 'key';
21
21
  exports.STORAGE_INPUT_PATH = 'path';
22
+ exports.DEFAULT_DELIMITER = '/';
22
23
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../../../../../src/providers/s3/utils/constants.ts"],"sourcesContent":["\"use strict\";\n// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.STORAGE_INPUT_PATH = exports.STORAGE_INPUT_KEY = exports.STORAGE_INPUT_PREFIX = exports.UPLOADS_STORAGE_KEY = exports.DEFAULT_QUEUE_SIZE = exports.MAX_PARTS_COUNT = exports.MAX_OBJECT_SIZE = exports.DEFAULT_PART_SIZE = exports.MAX_URL_EXPIRATION = exports.DEFAULT_PRESIGN_EXPIRATION = exports.DEFAULT_ACCESS_LEVEL = exports.LOCAL_TESTING_S3_ENDPOINT = void 0;\nexports.LOCAL_TESTING_S3_ENDPOINT = 'http://localhost:20005';\nexports.DEFAULT_ACCESS_LEVEL = 'guest';\nexports.DEFAULT_PRESIGN_EXPIRATION = 900;\nexports.MAX_URL_EXPIRATION = 7 * 24 * 60 * 60 * 1000;\nconst MiB = 1024 * 1024;\nconst GiB = 1024 * MiB;\nconst TiB = 1024 * GiB;\nexports.DEFAULT_PART_SIZE = 5 * MiB;\nexports.MAX_OBJECT_SIZE = 5 * TiB;\nexports.MAX_PARTS_COUNT = 10000;\nexports.DEFAULT_QUEUE_SIZE = 4;\nexports.UPLOADS_STORAGE_KEY = '__uploadInProgress';\nexports.STORAGE_INPUT_PREFIX = 'prefix';\nexports.STORAGE_INPUT_KEY = 'key';\nexports.STORAGE_INPUT_PATH = 'path';\n"],"names":[],"mappings":";;AACA;AACA;AACA,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,OAAO,CAAC,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,GAAG,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,GAAG,OAAO,CAAC,0BAA0B,GAAG,OAAO,CAAC,oBAAoB,GAAG,OAAO,CAAC,yBAAyB,GAAG,KAAK,CAAC,CAAC;AAC/W,OAAO,CAAC,yBAAyB,GAAG,wBAAwB,CAAC;AAC7D,OAAO,CAAC,oBAAoB,GAAG,OAAO,CAAC;AACvC,OAAO,CAAC,0BAA0B,GAAG,GAAG,CAAC;AACzC,OAAO,CAAC,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACrD,MAAM,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AACxB,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AACvB,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AACvB,OAAO,CAAC,iBAAiB,GAAG,CAAC,GAAG,GAAG,CAAC;AACpC,OAAO,CAAC,eAAe,GAAG,CAAC,GAAG,GAAG,CAAC;AAClC,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC;AAChC,OAAO,CAAC,kBAAkB,GAAG,CAAC,CAAC;AAC/B,OAAO,CAAC,mBAAmB,GAAG,oBAAoB,CAAC;AACnD,OAAO,CAAC,oBAAoB,GAAG,QAAQ,CAAC;AACxC,OAAO,CAAC,iBAAiB,GAAG,KAAK,CAAC;AAClC,OAAO,CAAC,kBAAkB,GAAG,MAAM;;"}
1
+ {"version":3,"file":"constants.js","sources":["../../../../../src/providers/s3/utils/constants.ts"],"sourcesContent":["\"use strict\";\n// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DEFAULT_DELIMITER = exports.STORAGE_INPUT_PATH = exports.STORAGE_INPUT_KEY = exports.STORAGE_INPUT_PREFIX = exports.UPLOADS_STORAGE_KEY = exports.DEFAULT_QUEUE_SIZE = exports.MAX_PARTS_COUNT = exports.MAX_OBJECT_SIZE = exports.DEFAULT_PART_SIZE = exports.MAX_URL_EXPIRATION = exports.DEFAULT_PRESIGN_EXPIRATION = exports.DEFAULT_ACCESS_LEVEL = exports.LOCAL_TESTING_S3_ENDPOINT = void 0;\nexports.LOCAL_TESTING_S3_ENDPOINT = 'http://localhost:20005';\nexports.DEFAULT_ACCESS_LEVEL = 'guest';\nexports.DEFAULT_PRESIGN_EXPIRATION = 900;\nexports.MAX_URL_EXPIRATION = 7 * 24 * 60 * 60 * 1000;\nconst MiB = 1024 * 1024;\nconst GiB = 1024 * MiB;\nconst TiB = 1024 * GiB;\nexports.DEFAULT_PART_SIZE = 5 * MiB;\nexports.MAX_OBJECT_SIZE = 5 * TiB;\nexports.MAX_PARTS_COUNT = 10000;\nexports.DEFAULT_QUEUE_SIZE = 4;\nexports.UPLOADS_STORAGE_KEY = '__uploadInProgress';\nexports.STORAGE_INPUT_PREFIX = 'prefix';\nexports.STORAGE_INPUT_KEY = 'key';\nexports.STORAGE_INPUT_PATH = 'path';\nexports.DEFAULT_DELIMITER = '/';\n"],"names":[],"mappings":";;AACA;AACA;AACA,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,OAAO,CAAC,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,GAAG,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,GAAG,OAAO,CAAC,0BAA0B,GAAG,OAAO,CAAC,oBAAoB,GAAG,OAAO,CAAC,yBAAyB,GAAG,KAAK,CAAC,CAAC;AAC3Y,OAAO,CAAC,yBAAyB,GAAG,wBAAwB,CAAC;AAC7D,OAAO,CAAC,oBAAoB,GAAG,OAAO,CAAC;AACvC,OAAO,CAAC,0BAA0B,GAAG,GAAG,CAAC;AACzC,OAAO,CAAC,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACrD,MAAM,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AACxB,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AACvB,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AACvB,OAAO,CAAC,iBAAiB,GAAG,CAAC,GAAG,GAAG,CAAC;AACpC,OAAO,CAAC,eAAe,GAAG,CAAC,GAAG,GAAG,CAAC;AAClC,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC;AAChC,OAAO,CAAC,kBAAkB,GAAG,CAAC,CAAC;AAC/B,OAAO,CAAC,mBAAmB,GAAG,oBAAoB,CAAC;AACnD,OAAO,CAAC,oBAAoB,GAAG,QAAQ,CAAC;AACxC,OAAO,CAAC,iBAAiB,GAAG,KAAK,CAAC;AAClC,OAAO,CAAC,kBAAkB,GAAG,MAAM,CAAC;AACpC,OAAO,CAAC,iBAAiB,GAAG,GAAG;;"}
@@ -8,7 +8,7 @@ import 'buffer';
8
8
  import { resolveS3ConfigAndInput } from '../../utils/resolveS3ConfigAndInput.mjs';
9
9
  import '../../../../errors/types/validation.mjs';
10
10
  import { logger } from '../../../../utils/logger.mjs';
11
- import { STORAGE_INPUT_PREFIX } from '../../utils/constants.mjs';
11
+ import { DEFAULT_DELIMITER, STORAGE_INPUT_PREFIX } from '../../utils/constants.mjs';
12
12
  import { validateStorageOperationInputWithPrefix } from '../../utils/validateStorageOperationInputWithPrefix.mjs';
13
13
  import '../../utils/client/base.mjs';
14
14
  import '../../utils/client/getObject.mjs';
@@ -42,6 +42,7 @@ const list = async (amplify, input) => {
42
42
  Prefix: isInputWithPrefix ? `${generatedPrefix}${objectKey}` : objectKey,
43
43
  MaxKeys: options?.listAll ? undefined : options?.pageSize,
44
44
  ContinuationToken: options?.listAll ? undefined : options?.nextToken,
45
+ Delimiter: getDelimiter(options.subpathStrategy),
45
46
  };
46
47
  logger.debug(`listing items from "${listParams.Prefix}"`);
47
48
  const listInputArgs = {
@@ -119,9 +120,10 @@ const _listWithPrefix = async ({ s3Config, listParams, generatedPrefix, }) => {
119
120
  };
120
121
  const _listAllWithPath = async ({ s3Config, listParams, }) => {
121
122
  const listResult = [];
123
+ const excludedSubpaths = [];
122
124
  let continuationToken = listParams.ContinuationToken;
123
125
  do {
124
- const { items: pageResults, nextToken: pageNextToken } = await _listWithPath({
126
+ const { items: pageResults, excludedSubpaths: pageExcludedSubpaths, nextToken: pageNextToken, } = await _listWithPath({
125
127
  s3Config,
126
128
  listParams: {
127
129
  ...listParams,
@@ -130,10 +132,12 @@ const _listAllWithPath = async ({ s3Config, listParams, }) => {
130
132
  },
131
133
  });
132
134
  listResult.push(...pageResults);
135
+ excludedSubpaths.push(...(pageExcludedSubpaths ?? []));
133
136
  continuationToken = pageNextToken;
134
137
  } while (continuationToken);
135
138
  return {
136
139
  items: listResult,
140
+ excludedSubpaths,
137
141
  };
138
142
  };
139
143
  const _listWithPath = async ({ s3Config, listParams, }) => {
@@ -142,25 +146,41 @@ const _listWithPath = async ({ s3Config, listParams, }) => {
142
146
  logger.debug(`defaulting pageSize to ${MAX_PAGE_SIZE}.`);
143
147
  listParamsClone.MaxKeys = MAX_PAGE_SIZE;
144
148
  }
145
- const response = await listObjectsV2({
149
+ const { Contents: contents, NextContinuationToken: nextContinuationToken, CommonPrefixes: commonPrefixes, } = await listObjectsV2({
146
150
  ...s3Config,
147
151
  userAgentValue: getStorageUserAgentValue(StorageAction.List),
148
152
  }, listParamsClone);
149
- if (!response?.Contents) {
153
+ const excludedSubpaths = commonPrefixes && mapCommonPrefixesToExcludedSubpaths(commonPrefixes);
154
+ if (!contents) {
150
155
  return {
151
156
  items: [],
157
+ excludedSubpaths,
152
158
  };
153
159
  }
154
160
  return {
155
- items: response.Contents.map(item => ({
161
+ items: contents.map(item => ({
156
162
  path: item.Key,
157
163
  eTag: item.ETag,
158
164
  lastModified: item.LastModified,
159
165
  size: item.Size,
160
166
  })),
161
- nextToken: response.NextContinuationToken,
167
+ nextToken: nextContinuationToken,
168
+ excludedSubpaths,
162
169
  };
163
170
  };
171
+ const mapCommonPrefixesToExcludedSubpaths = (commonPrefixes) => {
172
+ return commonPrefixes.reduce((mappedSubpaths, { Prefix }) => {
173
+ if (Prefix) {
174
+ mappedSubpaths.push(Prefix);
175
+ }
176
+ return mappedSubpaths;
177
+ }, []);
178
+ };
179
+ const getDelimiter = (subpathStrategy) => {
180
+ if (subpathStrategy?.strategy === 'exclude') {
181
+ return subpathStrategy?.delimiter ?? DEFAULT_DELIMITER;
182
+ }
183
+ };
164
184
 
165
185
  export { list };
166
186
  //# sourceMappingURL=list.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"list.mjs","sources":["../../../../../../src/providers/s3/apis/internal/list.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { StorageAction } from '@aws-amplify/core/internals/utils';\nimport { resolveS3ConfigAndInput, validateStorageOperationInputWithPrefix, } from '../../utils';\nimport { listObjectsV2, } from '../../utils/client';\nimport { getStorageUserAgentValue } from '../../utils/userAgent';\nimport { logger } from '../../../../utils';\nimport { STORAGE_INPUT_PREFIX } from '../../utils/constants';\nconst MAX_PAGE_SIZE = 1000;\nexport const list = async (amplify, input) => {\n const { options = {} } = input;\n const { s3Config, bucket, keyPrefix: generatedPrefix, identityId, } = await resolveS3ConfigAndInput(amplify, options);\n const { inputType, objectKey } = validateStorageOperationInputWithPrefix(input, identityId);\n const isInputWithPrefix = inputType === STORAGE_INPUT_PREFIX;\n // @ts-expect-error pageSize and nextToken should not coexist with listAll\n if (options?.listAll && (options?.pageSize || options?.nextToken)) {\n const anyOptions = options;\n logger.debug(`listAll is set to true, ignoring ${anyOptions?.pageSize ? `pageSize: ${anyOptions?.pageSize}` : ''} ${anyOptions?.nextToken ? `nextToken: ${anyOptions?.nextToken}` : ''}.`);\n }\n const listParams = {\n Bucket: bucket,\n Prefix: isInputWithPrefix ? `${generatedPrefix}${objectKey}` : objectKey,\n MaxKeys: options?.listAll ? undefined : options?.pageSize,\n ContinuationToken: options?.listAll ? undefined : options?.nextToken,\n };\n logger.debug(`listing items from \"${listParams.Prefix}\"`);\n const listInputArgs = {\n s3Config,\n listParams,\n };\n if (options.listAll) {\n if (isInputWithPrefix) {\n return _listAllWithPrefix({\n ...listInputArgs,\n generatedPrefix,\n });\n }\n else {\n return _listAllWithPath(listInputArgs);\n }\n }\n else {\n if (isInputWithPrefix) {\n return _listWithPrefix({ ...listInputArgs, generatedPrefix });\n }\n else {\n return _listWithPath(listInputArgs);\n }\n }\n};\n/** @deprecated Use {@link _listAllWithPath} instead. */\nconst _listAllWithPrefix = async ({ s3Config, listParams, generatedPrefix, }) => {\n const listResult = [];\n let continuationToken = listParams.ContinuationToken;\n do {\n const { items: pageResults, nextToken: pageNextToken } = await _listWithPrefix({\n generatedPrefix,\n s3Config,\n listParams: {\n ...listParams,\n ContinuationToken: continuationToken,\n MaxKeys: MAX_PAGE_SIZE,\n },\n });\n listResult.push(...pageResults);\n continuationToken = pageNextToken;\n } while (continuationToken);\n return {\n items: listResult,\n };\n};\n/** @deprecated Use {@link _listWithPath} instead. */\nconst _listWithPrefix = async ({ s3Config, listParams, generatedPrefix, }) => {\n const listParamsClone = { ...listParams };\n if (!listParamsClone.MaxKeys || listParamsClone.MaxKeys > MAX_PAGE_SIZE) {\n logger.debug(`defaulting pageSize to ${MAX_PAGE_SIZE}.`);\n listParamsClone.MaxKeys = MAX_PAGE_SIZE;\n }\n const response = await listObjectsV2({\n ...s3Config,\n userAgentValue: getStorageUserAgentValue(StorageAction.List),\n }, listParamsClone);\n if (!response?.Contents) {\n return {\n items: [],\n };\n }\n return {\n items: response.Contents.map(item => ({\n key: generatedPrefix\n ? item.Key.substring(generatedPrefix.length)\n : item.Key,\n eTag: item.ETag,\n lastModified: item.LastModified,\n size: item.Size,\n })),\n nextToken: response.NextContinuationToken,\n };\n};\nconst _listAllWithPath = async ({ s3Config, listParams, }) => {\n const listResult = [];\n let continuationToken = listParams.ContinuationToken;\n do {\n const { items: pageResults, nextToken: pageNextToken } = await _listWithPath({\n s3Config,\n listParams: {\n ...listParams,\n ContinuationToken: continuationToken,\n MaxKeys: MAX_PAGE_SIZE,\n },\n });\n listResult.push(...pageResults);\n continuationToken = pageNextToken;\n } while (continuationToken);\n return {\n items: listResult,\n };\n};\nconst _listWithPath = async ({ s3Config, listParams, }) => {\n const listParamsClone = { ...listParams };\n if (!listParamsClone.MaxKeys || listParamsClone.MaxKeys > MAX_PAGE_SIZE) {\n logger.debug(`defaulting pageSize to ${MAX_PAGE_SIZE}.`);\n listParamsClone.MaxKeys = MAX_PAGE_SIZE;\n }\n const response = await listObjectsV2({\n ...s3Config,\n userAgentValue: getStorageUserAgentValue(StorageAction.List),\n }, listParamsClone);\n if (!response?.Contents) {\n return {\n items: [],\n };\n }\n return {\n items: response.Contents.map(item => ({\n path: item.Key,\n eTag: item.ETag,\n lastModified: item.LastModified,\n size: item.Size,\n })),\n nextToken: response.NextContinuationToken,\n };\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list.mjs","sources":["../../../../../../src/providers/s3/apis/internal/list.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { StorageAction } from '@aws-amplify/core/internals/utils';\nimport { resolveS3ConfigAndInput, validateStorageOperationInputWithPrefix, } from '../../utils';\nimport { listObjectsV2, } from '../../utils/client';\nimport { getStorageUserAgentValue } from '../../utils/userAgent';\nimport { logger } from '../../../../utils';\nimport { DEFAULT_DELIMITER, STORAGE_INPUT_PREFIX } from '../../utils/constants';\nconst MAX_PAGE_SIZE = 1000;\nexport const list = async (amplify, input) => {\n const { options = {} } = input;\n const { s3Config, bucket, keyPrefix: generatedPrefix, identityId, } = await resolveS3ConfigAndInput(amplify, options);\n const { inputType, objectKey } = validateStorageOperationInputWithPrefix(input, identityId);\n const isInputWithPrefix = inputType === STORAGE_INPUT_PREFIX;\n // @ts-expect-error pageSize and nextToken should not coexist with listAll\n if (options?.listAll && (options?.pageSize || options?.nextToken)) {\n const anyOptions = options;\n logger.debug(`listAll is set to true, ignoring ${anyOptions?.pageSize ? `pageSize: ${anyOptions?.pageSize}` : ''} ${anyOptions?.nextToken ? `nextToken: ${anyOptions?.nextToken}` : ''}.`);\n }\n const listParams = {\n Bucket: bucket,\n Prefix: isInputWithPrefix ? `${generatedPrefix}${objectKey}` : objectKey,\n MaxKeys: options?.listAll ? undefined : options?.pageSize,\n ContinuationToken: options?.listAll ? undefined : options?.nextToken,\n Delimiter: getDelimiter(options.subpathStrategy),\n };\n logger.debug(`listing items from \"${listParams.Prefix}\"`);\n const listInputArgs = {\n s3Config,\n listParams,\n };\n if (options.listAll) {\n if (isInputWithPrefix) {\n return _listAllWithPrefix({\n ...listInputArgs,\n generatedPrefix,\n });\n }\n else {\n return _listAllWithPath(listInputArgs);\n }\n }\n else {\n if (isInputWithPrefix) {\n return _listWithPrefix({ ...listInputArgs, generatedPrefix });\n }\n else {\n return _listWithPath(listInputArgs);\n }\n }\n};\n/** @deprecated Use {@link _listAllWithPath} instead. */\nconst _listAllWithPrefix = async ({ s3Config, listParams, generatedPrefix, }) => {\n const listResult = [];\n let continuationToken = listParams.ContinuationToken;\n do {\n const { items: pageResults, nextToken: pageNextToken } = await _listWithPrefix({\n generatedPrefix,\n s3Config,\n listParams: {\n ...listParams,\n ContinuationToken: continuationToken,\n MaxKeys: MAX_PAGE_SIZE,\n },\n });\n listResult.push(...pageResults);\n continuationToken = pageNextToken;\n } while (continuationToken);\n return {\n items: listResult,\n };\n};\n/** @deprecated Use {@link _listWithPath} instead. */\nconst _listWithPrefix = async ({ s3Config, listParams, generatedPrefix, }) => {\n const listParamsClone = { ...listParams };\n if (!listParamsClone.MaxKeys || listParamsClone.MaxKeys > MAX_PAGE_SIZE) {\n logger.debug(`defaulting pageSize to ${MAX_PAGE_SIZE}.`);\n listParamsClone.MaxKeys = MAX_PAGE_SIZE;\n }\n const response = await listObjectsV2({\n ...s3Config,\n userAgentValue: getStorageUserAgentValue(StorageAction.List),\n }, listParamsClone);\n if (!response?.Contents) {\n return {\n items: [],\n };\n }\n return {\n items: response.Contents.map(item => ({\n key: generatedPrefix\n ? item.Key.substring(generatedPrefix.length)\n : item.Key,\n eTag: item.ETag,\n lastModified: item.LastModified,\n size: item.Size,\n })),\n nextToken: response.NextContinuationToken,\n };\n};\nconst _listAllWithPath = async ({ s3Config, listParams, }) => {\n const listResult = [];\n const excludedSubpaths = [];\n let continuationToken = listParams.ContinuationToken;\n do {\n const { items: pageResults, excludedSubpaths: pageExcludedSubpaths, nextToken: pageNextToken, } = await _listWithPath({\n s3Config,\n listParams: {\n ...listParams,\n ContinuationToken: continuationToken,\n MaxKeys: MAX_PAGE_SIZE,\n },\n });\n listResult.push(...pageResults);\n excludedSubpaths.push(...(pageExcludedSubpaths ?? []));\n continuationToken = pageNextToken;\n } while (continuationToken);\n return {\n items: listResult,\n excludedSubpaths,\n };\n};\nconst _listWithPath = async ({ s3Config, listParams, }) => {\n const listParamsClone = { ...listParams };\n if (!listParamsClone.MaxKeys || listParamsClone.MaxKeys > MAX_PAGE_SIZE) {\n logger.debug(`defaulting pageSize to ${MAX_PAGE_SIZE}.`);\n listParamsClone.MaxKeys = MAX_PAGE_SIZE;\n }\n const { Contents: contents, NextContinuationToken: nextContinuationToken, CommonPrefixes: commonPrefixes, } = await listObjectsV2({\n ...s3Config,\n userAgentValue: getStorageUserAgentValue(StorageAction.List),\n }, listParamsClone);\n const excludedSubpaths = commonPrefixes && mapCommonPrefixesToExcludedSubpaths(commonPrefixes);\n if (!contents) {\n return {\n items: [],\n excludedSubpaths,\n };\n }\n return {\n items: contents.map(item => ({\n path: item.Key,\n eTag: item.ETag,\n lastModified: item.LastModified,\n size: item.Size,\n })),\n nextToken: nextContinuationToken,\n excludedSubpaths,\n };\n};\nconst mapCommonPrefixesToExcludedSubpaths = (commonPrefixes) => {\n return commonPrefixes.reduce((mappedSubpaths, { Prefix }) => {\n if (Prefix) {\n mappedSubpaths.push(Prefix);\n }\n return mappedSubpaths;\n }, []);\n};\nconst getDelimiter = (subpathStrategy) => {\n if (subpathStrategy?.strategy === 'exclude') {\n return subpathStrategy?.delimiter ?? DEFAULT_DELIMITER;\n }\n};\n"],"names":[],"mappings":"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"}
@@ -10,3 +10,4 @@ export declare const UPLOADS_STORAGE_KEY = "__uploadInProgress";
10
10
  export declare const STORAGE_INPUT_PREFIX = "prefix";
11
11
  export declare const STORAGE_INPUT_KEY = "key";
12
12
  export declare const STORAGE_INPUT_PATH = "path";
13
+ export declare const DEFAULT_DELIMITER = "/";
@@ -15,6 +15,7 @@ const UPLOADS_STORAGE_KEY = '__uploadInProgress';
15
15
  const STORAGE_INPUT_PREFIX = 'prefix';
16
16
  const STORAGE_INPUT_KEY = 'key';
17
17
  const STORAGE_INPUT_PATH = 'path';
18
+ const DEFAULT_DELIMITER = '/';
18
19
 
19
- export { DEFAULT_ACCESS_LEVEL, DEFAULT_PART_SIZE, DEFAULT_PRESIGN_EXPIRATION, DEFAULT_QUEUE_SIZE, LOCAL_TESTING_S3_ENDPOINT, MAX_OBJECT_SIZE, MAX_PARTS_COUNT, MAX_URL_EXPIRATION, STORAGE_INPUT_KEY, STORAGE_INPUT_PATH, STORAGE_INPUT_PREFIX, UPLOADS_STORAGE_KEY };
20
+ export { DEFAULT_ACCESS_LEVEL, DEFAULT_DELIMITER, DEFAULT_PART_SIZE, DEFAULT_PRESIGN_EXPIRATION, DEFAULT_QUEUE_SIZE, LOCAL_TESTING_S3_ENDPOINT, MAX_OBJECT_SIZE, MAX_PARTS_COUNT, MAX_URL_EXPIRATION, STORAGE_INPUT_KEY, STORAGE_INPUT_PATH, STORAGE_INPUT_PREFIX, UPLOADS_STORAGE_KEY };
20
21
  //# sourceMappingURL=constants.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.mjs","sources":["../../../../../src/providers/s3/utils/constants.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nexport const LOCAL_TESTING_S3_ENDPOINT = 'http://localhost:20005';\nexport const DEFAULT_ACCESS_LEVEL = 'guest';\nexport const DEFAULT_PRESIGN_EXPIRATION = 900;\nexport const MAX_URL_EXPIRATION = 7 * 24 * 60 * 60 * 1000;\nconst MiB = 1024 * 1024;\nconst GiB = 1024 * MiB;\nconst TiB = 1024 * GiB;\nexport const DEFAULT_PART_SIZE = 5 * MiB;\nexport const MAX_OBJECT_SIZE = 5 * TiB;\nexport const MAX_PARTS_COUNT = 10000;\nexport const DEFAULT_QUEUE_SIZE = 4;\nexport const UPLOADS_STORAGE_KEY = '__uploadInProgress';\nexport const STORAGE_INPUT_PREFIX = 'prefix';\nexport const STORAGE_INPUT_KEY = 'key';\nexport const STORAGE_INPUT_PATH = 'path';\n"],"names":[],"mappings":"AAAA;AACA;AACY,MAAC,yBAAyB,GAAG,yBAAyB;AACtD,MAAC,oBAAoB,GAAG,QAAQ;AAChC,MAAC,0BAA0B,GAAG,IAAI;AAClC,MAAC,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK;AAC1D,MAAM,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AACxB,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AACvB,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AACX,MAAC,iBAAiB,GAAG,CAAC,GAAG,IAAI;AAC7B,MAAC,eAAe,GAAG,CAAC,GAAG,IAAI;AAC3B,MAAC,eAAe,GAAG,MAAM;AACzB,MAAC,kBAAkB,GAAG,EAAE;AACxB,MAAC,mBAAmB,GAAG,qBAAqB;AAC5C,MAAC,oBAAoB,GAAG,SAAS;AACjC,MAAC,iBAAiB,GAAG,MAAM;AAC3B,MAAC,kBAAkB,GAAG;;;;"}
1
+ {"version":3,"file":"constants.mjs","sources":["../../../../../src/providers/s3/utils/constants.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nexport const LOCAL_TESTING_S3_ENDPOINT = 'http://localhost:20005';\nexport const DEFAULT_ACCESS_LEVEL = 'guest';\nexport const DEFAULT_PRESIGN_EXPIRATION = 900;\nexport const MAX_URL_EXPIRATION = 7 * 24 * 60 * 60 * 1000;\nconst MiB = 1024 * 1024;\nconst GiB = 1024 * MiB;\nconst TiB = 1024 * GiB;\nexport const DEFAULT_PART_SIZE = 5 * MiB;\nexport const MAX_OBJECT_SIZE = 5 * TiB;\nexport const MAX_PARTS_COUNT = 10000;\nexport const DEFAULT_QUEUE_SIZE = 4;\nexport const UPLOADS_STORAGE_KEY = '__uploadInProgress';\nexport const STORAGE_INPUT_PREFIX = 'prefix';\nexport const STORAGE_INPUT_KEY = 'key';\nexport const STORAGE_INPUT_PATH = 'path';\nexport const DEFAULT_DELIMITER = '/';\n"],"names":[],"mappings":"AAAA;AACA;AACY,MAAC,yBAAyB,GAAG,yBAAyB;AACtD,MAAC,oBAAoB,GAAG,QAAQ;AAChC,MAAC,0BAA0B,GAAG,IAAI;AAClC,MAAC,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK;AAC1D,MAAM,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AACxB,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AACvB,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AACX,MAAC,iBAAiB,GAAG,CAAC,GAAG,IAAI;AAC7B,MAAC,eAAe,GAAG,CAAC,GAAG,IAAI;AAC3B,MAAC,eAAe,GAAG,MAAM;AACzB,MAAC,kBAAkB,GAAG,EAAE;AACxB,MAAC,mBAAmB,GAAG,qBAAqB;AAC5C,MAAC,oBAAoB,GAAG,SAAS;AACjC,MAAC,iBAAiB,GAAG,MAAM;AAC3B,MAAC,kBAAkB,GAAG,OAAO;AAC7B,MAAC,iBAAiB,GAAG;;;;"}
@@ -1,4 +1,4 @@
1
1
  export { DownloadTask, TransferProgressEvent, TransferTaskState, UploadTask, } from './common';
2
2
  export { StorageGetPropertiesInputWithKey, StorageGetPropertiesInputWithPath, StorageListInputWithPrefix, StorageListInputWithPath, StorageRemoveInputWithPath, StorageRemoveInputWithKey, StorageDownloadDataInputWithKey, StorageDownloadDataInputWithPath, StorageUploadDataInputWithKey, StorageUploadDataInputWithPath, StorageCopyInputWithKey, StorageCopyInputWithPath, StorageGetUrlInputWithKey, StorageGetUrlInputWithPath, StorageUploadDataPayload, } from './inputs';
3
- export { StorageOptions, StorageRemoveOptions, StorageListAllOptions, StorageListPaginateOptions, } from './options';
3
+ export { StorageOptions, StorageRemoveOptions, StorageListAllOptions, StorageListPaginateOptions, StorageSubpathStrategy, } from './options';
4
4
  export { StorageItem, StorageItemWithKey, StorageItemWithPath, StorageListOutput, StorageDownloadDataOutput, StorageGetUrlOutput, StorageUploadOutput, } from './outputs';
@@ -5,10 +5,60 @@ export interface StorageOptions {
5
5
  }
6
6
  export type StorageListAllOptions = StorageOptions & {
7
7
  listAll: true;
8
+ subpathStrategy?: StorageSubpathStrategy;
8
9
  };
9
10
  export type StorageListPaginateOptions = StorageOptions & {
10
11
  listAll?: false;
11
12
  pageSize?: number;
12
13
  nextToken?: string;
14
+ subpathStrategy?: StorageSubpathStrategy;
13
15
  };
14
16
  export type StorageRemoveOptions = StorageOptions;
17
+ export type StorageSubpathStrategy = {
18
+ /**
19
+ * Default behavior. Includes all subpaths for a given page in the result.
20
+ */
21
+ strategy: 'include';
22
+ } | {
23
+ /**
24
+ * When passed, the output of the list API will provide a list of `excludedSubpaths`
25
+ * that are delimited by the `/` (by default) character.
26
+ *
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * const { excludedSubpaths } = await list({
31
+ * path: 'photos/',
32
+ * options: {
33
+ * subpathStrategy: {
34
+ * strategy: 'exclude',
35
+ * }
36
+ * }
37
+ * });
38
+ *
39
+ * console.log(excludedSubpaths);
40
+ *
41
+ * ```
42
+ */
43
+ strategy: 'exclude';
44
+ /**
45
+ * Deliminate with with a custom delimiter character.
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * const { excludedSubpaths } = await list({
50
+ * path: 'photos/',
51
+ * options: {
52
+ * subpathStrategy: {
53
+ * strategy: 'exclude',
54
+ * delimiter: '-'
55
+ * }
56
+ * }
57
+ * });
58
+ *
59
+ * console.log(excludedSubpaths);
60
+ *
61
+ * ```
62
+ */
63
+ delimiter?: string;
64
+ };
@@ -59,4 +59,8 @@ export interface StorageListOutput<Item extends StorageItem> {
59
59
  * List of items returned by the list API.
60
60
  */
61
61
  items: Item[];
62
+ /**
63
+ * List of excluded subpaths when `exclude` is passed as part of the `subpathStrategy` of the input options.
64
+ */
65
+ excludedSubpaths?: string[];
62
66
  }
package/package.json CHANGED
@@ -1,109 +1,109 @@
1
1
  {
2
- "name": "@aws-amplify/storage",
3
- "version": "6.4.7",
4
- "description": "Storage category of aws-amplify",
5
- "main": "./dist/cjs/index.js",
6
- "module": "./dist/esm/index.mjs",
7
- "react-native": {
8
- "./dist/cjs/index": "./src/index.ts",
9
- "fast-xml-parser": "fast-xml-parser",
10
- "buffer": "buffer"
11
- },
12
- "typings": "./dist/esm/index.d.ts",
13
- "browser": {
14
- "./dist/esm/providers/s3/utils/client/runtime/base64/index.native.mjs": "./dist/esm/providers/s3/utils/client/runtime/base64/index.browser.mjs",
15
- "./dist/esm/providers/s3/utils/client/runtime/s3TransferHandler/fetch.mjs": "./dist/esm/providers/s3/utils/client/runtime/s3TransferHandler/xhr.mjs",
16
- "./dist/esm/providers/s3/utils/client/runtime/xmlParser/pureJs.mjs": "./dist/esm/providers/s3/utils/client/runtime/xmlParser/dom.mjs",
17
- "fast-xml-parser": false,
18
- "buffer": false
19
- },
20
- "sideEffects": false,
21
- "publishConfig": {
22
- "access": "public"
23
- },
24
- "scripts": {
25
- "test": "npm run lint && jest -w 1 --coverage --logHeapUsage",
26
- "build-with-test": "npm test && npm run build",
27
- "build:umd": "webpack && webpack --config ./webpack.config.dev.js",
28
- "build:esm-cjs": "rollup --forceExit -c rollup.config.mjs",
29
- "build:watch": "npm run build:esm-cjs -- --watch",
30
- "build": "npm run clean && npm run build:esm-cjs && npm run build:umd",
31
- "clean": "npm run clean:size && rimraf lib-esm lib dist",
32
- "clean:size": "rimraf dual-publish-tmp tmp*",
33
- "format": "echo \"Not implemented\"",
34
- "lint": "eslint '**/*.{ts,tsx}' && npm run ts-coverage",
35
- "lint:fix": "eslint '**/*.{ts,tsx}' --fix",
36
- "ts-coverage": "typescript-coverage-report -p ./tsconfig.build.json -t 90.31"
37
- },
38
- "typesVersions": {
39
- ">=4.2": {
40
- "s3": [
41
- "./dist/esm/providers/s3/index.d.ts"
42
- ],
43
- "server": [
44
- "./dist/esm/server.d.ts"
45
- ],
46
- "s3/server": [
47
- "./dist/esm/providers/s3/server.d.ts"
48
- ]
49
- }
50
- },
51
- "repository": {
52
- "type": "git",
53
- "url": "https://github.com/aws-amplify/amplify-js.git"
54
- },
55
- "author": "Amazon Web Services",
56
- "license": "Apache-2.0",
57
- "bugs": {
58
- "url": "https://github.com/aws/aws-amplify/issues"
59
- },
60
- "homepage": "https://aws-amplify.github.io/",
61
- "files": [
62
- "dist/cjs",
63
- "dist/esm",
64
- "src",
65
- "server",
66
- "s3"
67
- ],
68
- "dependencies": {
69
- "@aws-sdk/types": "3.398.0",
70
- "@smithy/md5-js": "2.0.7",
71
- "buffer": "4.9.2",
72
- "fast-xml-parser": "^4.2.5",
73
- "tslib": "^2.5.0"
74
- },
75
- "exports": {
76
- ".": {
77
- "types": "./dist/esm/index.d.ts",
78
- "import": "./dist/esm/index.mjs",
79
- "require": "./dist/cjs/index.js",
80
- "react-native": "./src/index.ts"
81
- },
82
- "./server": {
83
- "types": "./dist/esm/server.d.ts",
84
- "import": "./dist/esm/server.mjs",
85
- "require": "./dist/cjs/server.js"
86
- },
87
- "./s3": {
88
- "types": "./dist/esm/providers/s3/index.d.ts",
89
- "import": "./dist/esm/providers/s3/index.mjs",
90
- "require": "./dist/cjs/providers/s3/index.js",
91
- "react-native": "./src/providers/s3/index.ts"
92
- },
93
- "./s3/server": {
94
- "types": "./dist/esm/providers/s3/server.d.ts",
95
- "import": "./dist/esm/providers/s3/server.mjs",
96
- "require": "./dist/cjs/providers/s3/server.js"
97
- },
98
- "./package.json": "./package.json"
99
- },
100
- "peerDependencies": {
101
- "@aws-amplify/core": "^6.1.0"
102
- },
103
- "devDependencies": {
104
- "@aws-amplify/core": "6.3.3",
105
- "@aws-amplify/react-native": "1.1.1",
106
- "typescript": "5.0.2"
107
- },
108
- "gitHead": "937771cfbf566d85e680112acef0bf428c24a1df"
2
+ "name": "@aws-amplify/storage",
3
+ "version": "6.4.8-unstable.0a07393.0+0a07393",
4
+ "description": "Storage category of aws-amplify",
5
+ "main": "./dist/cjs/index.js",
6
+ "module": "./dist/esm/index.mjs",
7
+ "react-native": {
8
+ "./dist/cjs/index": "./src/index.ts",
9
+ "fast-xml-parser": "fast-xml-parser",
10
+ "buffer": "buffer"
11
+ },
12
+ "typings": "./dist/esm/index.d.ts",
13
+ "browser": {
14
+ "./dist/esm/providers/s3/utils/client/runtime/base64/index.native.mjs": "./dist/esm/providers/s3/utils/client/runtime/base64/index.browser.mjs",
15
+ "./dist/esm/providers/s3/utils/client/runtime/s3TransferHandler/fetch.mjs": "./dist/esm/providers/s3/utils/client/runtime/s3TransferHandler/xhr.mjs",
16
+ "./dist/esm/providers/s3/utils/client/runtime/xmlParser/pureJs.mjs": "./dist/esm/providers/s3/utils/client/runtime/xmlParser/dom.mjs",
17
+ "fast-xml-parser": false,
18
+ "buffer": false
19
+ },
20
+ "sideEffects": false,
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "scripts": {
25
+ "test": "npm run lint && jest -w 1 --coverage --logHeapUsage",
26
+ "build-with-test": "npm test && npm run build",
27
+ "build:umd": "webpack && webpack --config ./webpack.config.dev.js",
28
+ "build:esm-cjs": "rollup --forceExit -c rollup.config.mjs",
29
+ "build:watch": "npm run build:esm-cjs -- --watch",
30
+ "build": "npm run clean && npm run build:esm-cjs && npm run build:umd",
31
+ "clean": "npm run clean:size && rimraf lib-esm lib dist",
32
+ "clean:size": "rimraf dual-publish-tmp tmp*",
33
+ "format": "echo \"Not implemented\"",
34
+ "lint": "eslint '**/*.{ts,tsx}' && npm run ts-coverage",
35
+ "lint:fix": "eslint '**/*.{ts,tsx}' --fix",
36
+ "ts-coverage": "typescript-coverage-report -p ./tsconfig.build.json -t 90.31"
37
+ },
38
+ "typesVersions": {
39
+ ">=4.2": {
40
+ "s3": [
41
+ "./dist/esm/providers/s3/index.d.ts"
42
+ ],
43
+ "server": [
44
+ "./dist/esm/server.d.ts"
45
+ ],
46
+ "s3/server": [
47
+ "./dist/esm/providers/s3/server.d.ts"
48
+ ]
49
+ }
50
+ },
51
+ "repository": {
52
+ "type": "git",
53
+ "url": "https://github.com/aws-amplify/amplify-js.git"
54
+ },
55
+ "author": "Amazon Web Services",
56
+ "license": "Apache-2.0",
57
+ "bugs": {
58
+ "url": "https://github.com/aws/aws-amplify/issues"
59
+ },
60
+ "homepage": "https://aws-amplify.github.io/",
61
+ "files": [
62
+ "dist/cjs",
63
+ "dist/esm",
64
+ "src",
65
+ "server",
66
+ "s3"
67
+ ],
68
+ "dependencies": {
69
+ "@aws-sdk/types": "3.398.0",
70
+ "@smithy/md5-js": "2.0.7",
71
+ "buffer": "4.9.2",
72
+ "fast-xml-parser": "^4.2.5",
73
+ "tslib": "^2.5.0"
74
+ },
75
+ "exports": {
76
+ ".": {
77
+ "types": "./dist/esm/index.d.ts",
78
+ "import": "./dist/esm/index.mjs",
79
+ "require": "./dist/cjs/index.js",
80
+ "react-native": "./src/index.ts"
81
+ },
82
+ "./server": {
83
+ "types": "./dist/esm/server.d.ts",
84
+ "import": "./dist/esm/server.mjs",
85
+ "require": "./dist/cjs/server.js"
86
+ },
87
+ "./s3": {
88
+ "types": "./dist/esm/providers/s3/index.d.ts",
89
+ "import": "./dist/esm/providers/s3/index.mjs",
90
+ "require": "./dist/cjs/providers/s3/index.js",
91
+ "react-native": "./src/providers/s3/index.ts"
92
+ },
93
+ "./s3/server": {
94
+ "types": "./dist/esm/providers/s3/server.d.ts",
95
+ "import": "./dist/esm/providers/s3/server.mjs",
96
+ "require": "./dist/cjs/providers/s3/server.js"
97
+ },
98
+ "./package.json": "./package.json"
99
+ },
100
+ "peerDependencies": {
101
+ "@aws-amplify/core": "6.3.4-unstable.0a07393.0+0a07393"
102
+ },
103
+ "devDependencies": {
104
+ "@aws-amplify/core": "6.3.4-unstable.0a07393.0+0a07393",
105
+ "@aws-amplify/react-native": "1.1.2-unstable.0a07393.0+0a07393",
106
+ "typescript": "5.0.2"
107
+ },
108
+ "gitHead": "0a07393dad8d6e37b19e03cfb6394b0664b061c9"
109
109
  }
@@ -28,7 +28,9 @@ import {
28
28
  } from '../../utils/client';
29
29
  import { getStorageUserAgentValue } from '../../utils/userAgent';
30
30
  import { logger } from '../../../../utils';
31
- import { STORAGE_INPUT_PREFIX } from '../../utils/constants';
31
+ import { DEFAULT_DELIMITER, STORAGE_INPUT_PREFIX } from '../../utils/constants';
32
+ import { CommonPrefix } from '../../utils/client/types';
33
+ import { StorageSubpathStrategy } from '../../../../types';
32
34
 
33
35
  const MAX_PAGE_SIZE = 1000;
34
36
 
@@ -79,6 +81,7 @@ export const list = async (
79
81
  Prefix: isInputWithPrefix ? `${generatedPrefix}${objectKey}` : objectKey,
80
82
  MaxKeys: options?.listAll ? undefined : options?.pageSize,
81
83
  ContinuationToken: options?.listAll ? undefined : options?.nextToken,
84
+ Delimiter: getDelimiter(options.subpathStrategy),
82
85
  };
83
86
  logger.debug(`listing items from "${listParams.Prefix}"`);
84
87
 
@@ -86,6 +89,7 @@ export const list = async (
86
89
  s3Config,
87
90
  listParams,
88
91
  };
92
+
89
93
  if (options.listAll) {
90
94
  if (isInputWithPrefix) {
91
95
  return _listAllWithPrefix({
@@ -176,23 +180,29 @@ const _listAllWithPath = async ({
176
180
  listParams,
177
181
  }: ListInputArgs): Promise<ListAllWithPathOutput> => {
178
182
  const listResult: ListOutputItemWithPath[] = [];
183
+ const excludedSubpaths: string[] = [];
179
184
  let continuationToken = listParams.ContinuationToken;
180
185
  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
- });
186
+ const {
187
+ items: pageResults,
188
+ excludedSubpaths: pageExcludedSubpaths,
189
+ nextToken: pageNextToken,
190
+ } = await _listWithPath({
191
+ s3Config,
192
+ listParams: {
193
+ ...listParams,
194
+ ContinuationToken: continuationToken,
195
+ MaxKeys: MAX_PAGE_SIZE,
196
+ },
197
+ });
190
198
  listResult.push(...pageResults);
199
+ excludedSubpaths.push(...(pageExcludedSubpaths ?? []));
191
200
  continuationToken = pageNextToken;
192
201
  } while (continuationToken);
193
202
 
194
203
  return {
195
204
  items: listResult,
205
+ excludedSubpaths,
196
206
  };
197
207
  };
198
208
 
@@ -206,7 +216,11 @@ const _listWithPath = async ({
206
216
  listParamsClone.MaxKeys = MAX_PAGE_SIZE;
207
217
  }
208
218
 
209
- const response: ListObjectsV2Output = await listObjectsV2(
219
+ const {
220
+ Contents: contents,
221
+ NextContinuationToken: nextContinuationToken,
222
+ CommonPrefixes: commonPrefixes,
223
+ }: ListObjectsV2Output = await listObjectsV2(
210
224
  {
211
225
  ...s3Config,
212
226
  userAgentValue: getStorageUserAgentValue(StorageAction.List),
@@ -214,19 +228,44 @@ const _listWithPath = async ({
214
228
  listParamsClone,
215
229
  );
216
230
 
217
- if (!response?.Contents) {
231
+ const excludedSubpaths =
232
+ commonPrefixes && mapCommonPrefixesToExcludedSubpaths(commonPrefixes);
233
+
234
+ if (!contents) {
218
235
  return {
219
236
  items: [],
237
+ excludedSubpaths,
220
238
  };
221
239
  }
222
240
 
223
241
  return {
224
- items: response.Contents.map(item => ({
242
+ items: contents.map(item => ({
225
243
  path: item.Key!,
226
244
  eTag: item.ETag,
227
245
  lastModified: item.LastModified,
228
246
  size: item.Size,
229
247
  })),
230
- nextToken: response.NextContinuationToken,
248
+ nextToken: nextContinuationToken,
249
+ excludedSubpaths,
231
250
  };
232
251
  };
252
+
253
+ const mapCommonPrefixesToExcludedSubpaths = (
254
+ commonPrefixes: CommonPrefix[],
255
+ ): string[] => {
256
+ return commonPrefixes.reduce((mappedSubpaths, { Prefix }) => {
257
+ if (Prefix) {
258
+ mappedSubpaths.push(Prefix);
259
+ }
260
+
261
+ return mappedSubpaths;
262
+ }, [] as string[]);
263
+ };
264
+
265
+ const getDelimiter = (
266
+ subpathStrategy?: StorageSubpathStrategy,
267
+ ): string | undefined => {
268
+ if (subpathStrategy?.strategy === 'exclude') {
269
+ return subpathStrategy?.delimiter ?? DEFAULT_DELIMITER;
270
+ }
271
+ };
@@ -23,3 +23,5 @@ export const UPLOADS_STORAGE_KEY = '__uploadInProgress';
23
23
  export const STORAGE_INPUT_PREFIX = 'prefix';
24
24
  export const STORAGE_INPUT_KEY = 'key';
25
25
  export const STORAGE_INPUT_PATH = 'path';
26
+
27
+ export const DEFAULT_DELIMITER = '/';
@@ -29,6 +29,7 @@ export {
29
29
  StorageRemoveOptions,
30
30
  StorageListAllOptions,
31
31
  StorageListPaginateOptions,
32
+ StorageSubpathStrategy,
32
33
  } from './options';
33
34
  export {
34
35
  StorageItem,
@@ -10,12 +10,65 @@ export interface StorageOptions {
10
10
 
11
11
  export type StorageListAllOptions = StorageOptions & {
12
12
  listAll: true;
13
+ subpathStrategy?: StorageSubpathStrategy;
13
14
  };
14
15
 
15
16
  export type StorageListPaginateOptions = StorageOptions & {
16
17
  listAll?: false;
17
18
  pageSize?: number;
18
19
  nextToken?: string;
20
+ subpathStrategy?: StorageSubpathStrategy;
19
21
  };
20
22
 
21
23
  export type StorageRemoveOptions = StorageOptions;
24
+
25
+ export type StorageSubpathStrategy =
26
+ | {
27
+ /**
28
+ * Default behavior. Includes all subpaths for a given page in the result.
29
+ */
30
+ strategy: 'include';
31
+ }
32
+ | {
33
+ /**
34
+ * When passed, the output of the list API will provide a list of `excludedSubpaths`
35
+ * that are delimited by the `/` (by default) character.
36
+ *
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * const { excludedSubpaths } = await list({
41
+ * path: 'photos/',
42
+ * options: {
43
+ * subpathStrategy: {
44
+ * strategy: 'exclude',
45
+ * }
46
+ * }
47
+ * });
48
+ *
49
+ * console.log(excludedSubpaths);
50
+ *
51
+ * ```
52
+ */
53
+ strategy: 'exclude';
54
+ /**
55
+ * Deliminate with with a custom delimiter character.
56
+ *
57
+ * @example
58
+ * ```ts
59
+ * const { excludedSubpaths } = await list({
60
+ * path: 'photos/',
61
+ * options: {
62
+ * subpathStrategy: {
63
+ * strategy: 'exclude',
64
+ * delimiter: '-'
65
+ * }
66
+ * }
67
+ * });
68
+ *
69
+ * console.log(excludedSubpaths);
70
+ *
71
+ * ```
72
+ */
73
+ delimiter?: string;
74
+ };
@@ -70,4 +70,8 @@ export interface StorageListOutput<Item extends StorageItem> {
70
70
  * List of items returned by the list API.
71
71
  */
72
72
  items: Item[];
73
+ /**
74
+ * List of excluded subpaths when `exclude` is passed as part of the `subpathStrategy` of the input options.
75
+ */
76
+ excludedSubpaths?: string[];
73
77
  }