@webiny/api-file-manager-s3 6.3.0 → 6.4.0-beta.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 (121) hide show
  1. package/assetDelivery/assetDeliveryConfig.js +32 -39
  2. package/assetDelivery/assetDeliveryConfig.js.map +1 -1
  3. package/assetDelivery/createAssetDelivery.js +5 -19
  4. package/assetDelivery/createAssetDelivery.js.map +1 -1
  5. package/assetDelivery/index.js +0 -2
  6. package/assetDelivery/s3/S3AssetResolver.js +21 -22
  7. package/assetDelivery/s3/S3AssetResolver.js.map +1 -1
  8. package/assetDelivery/s3/S3ContentsReader.js +13 -16
  9. package/assetDelivery/s3/S3ContentsReader.js.map +1 -1
  10. package/assetDelivery/s3/S3ErrorAssetReply.js +10 -9
  11. package/assetDelivery/s3/S3ErrorAssetReply.js.map +1 -1
  12. package/assetDelivery/s3/S3OutputStrategy.js +23 -27
  13. package/assetDelivery/s3/S3OutputStrategy.js.map +1 -1
  14. package/assetDelivery/s3/S3RedirectAssetReply.js +12 -11
  15. package/assetDelivery/s3/S3RedirectAssetReply.js.map +1 -1
  16. package/assetDelivery/s3/S3StreamAssetReply.js +12 -11
  17. package/assetDelivery/s3/S3StreamAssetReply.js.map +1 -1
  18. package/assetDelivery/s3/SharpTransform.js +139 -169
  19. package/assetDelivery/s3/SharpTransform.js.map +1 -1
  20. package/assetDelivery/s3/transformation/AssetKeyGenerator.js +18 -17
  21. package/assetDelivery/s3/transformation/AssetKeyGenerator.js.map +1 -1
  22. package/assetDelivery/s3/transformation/CallableContentsReader.js +8 -7
  23. package/assetDelivery/s3/transformation/CallableContentsReader.js.map +1 -1
  24. package/assetDelivery/s3/transformation/WidthCollection.js +15 -16
  25. package/assetDelivery/s3/transformation/WidthCollection.js.map +1 -1
  26. package/assetDelivery/s3/transformation/utils.js +24 -30
  27. package/assetDelivery/s3/transformation/utils.js.map +1 -1
  28. package/assetDelivery/threatDetection/ObjectKey.js +15 -14
  29. package/assetDelivery/threatDetection/ObjectKey.js.map +1 -1
  30. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js +28 -42
  31. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js.map +1 -1
  32. package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js +2 -3
  33. package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js.map +1 -1
  34. package/assetDelivery/threatDetection/index.js +0 -2
  35. package/assetDelivery/threatDetection/processThreatScanResult.js +48 -54
  36. package/assetDelivery/threatDetection/processThreatScanResult.js.map +1 -1
  37. package/assetDelivery/threatDetection/types.js +0 -3
  38. package/assetDelivery/types.js +0 -3
  39. package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js +17 -13
  40. package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js.map +1 -1
  41. package/enterprise/ApplyThreatScanning/feature.js +6 -5
  42. package/enterprise/ApplyThreatScanning/feature.js.map +1 -1
  43. package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js +26 -27
  44. package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js.map +1 -1
  45. package/features/DeleteFileFromBucket/DeleteS3FolderTask.js +40 -51
  46. package/features/DeleteFileFromBucket/DeleteS3FolderTask.js.map +1 -1
  47. package/features/DeleteFileFromBucket/feature.js +7 -6
  48. package/features/DeleteFileFromBucket/feature.js.map +1 -1
  49. package/features/ExtractMetadata/ExtractMetadataHandler.js +18 -19
  50. package/features/ExtractMetadata/ExtractMetadataHandler.js.map +1 -1
  51. package/features/ExtractMetadata/ExtractMetadataTask.js +75 -114
  52. package/features/ExtractMetadata/ExtractMetadataTask.js.map +1 -1
  53. package/features/ExtractMetadata/feature.js +7 -6
  54. package/features/ExtractMetadata/feature.js.map +1 -1
  55. package/features/FlushCache/FlushCacheOnFileDeleteHandler.js +20 -19
  56. package/features/FlushCache/FlushCacheOnFileDeleteHandler.js.map +1 -1
  57. package/features/FlushCache/FlushCacheOnFileUpdateHandler.js +22 -26
  58. package/features/FlushCache/FlushCacheOnFileUpdateHandler.js.map +1 -1
  59. package/features/FlushCache/InvalidateCacheTask.js +63 -75
  60. package/features/FlushCache/InvalidateCacheTask.js.map +1 -1
  61. package/features/FlushCache/feature.js +8 -7
  62. package/features/FlushCache/feature.js.map +1 -1
  63. package/features/GetFileContentsById/GetFileContentsByIdUseCase.d.ts +13 -0
  64. package/features/GetFileContentsById/GetFileContentsByIdUseCase.js +40 -0
  65. package/features/GetFileContentsById/GetFileContentsByIdUseCase.js.map +1 -0
  66. package/features/GetFileContentsById/feature.d.ts +4 -0
  67. package/features/GetFileContentsById/feature.js +11 -0
  68. package/features/GetFileContentsById/feature.js.map +1 -0
  69. package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.d.ts +13 -0
  70. package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.js +40 -0
  71. package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.js.map +1 -0
  72. package/features/GetFileContentsByKey/feature.d.ts +4 -0
  73. package/features/GetFileContentsByKey/feature.js +11 -0
  74. package/features/GetFileContentsByKey/feature.js.map +1 -0
  75. package/features/WriteFileMetadata/MetadataReader.js +9 -10
  76. package/features/WriteFileMetadata/MetadataReader.js.map +1 -1
  77. package/features/WriteFileMetadata/MetadataWriter.js +23 -25
  78. package/features/WriteFileMetadata/MetadataWriter.js.map +1 -1
  79. package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js +14 -12
  80. package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js.map +1 -1
  81. package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js +16 -12
  82. package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js.map +1 -1
  83. package/features/WriteFileMetadata/feature.js +7 -6
  84. package/features/WriteFileMetadata/feature.js.map +1 -1
  85. package/graphql/checkPermissions.js +17 -32
  86. package/graphql/checkPermissions.js.map +1 -1
  87. package/graphql/schema.js +99 -102
  88. package/graphql/schema.js.map +1 -1
  89. package/index.js +19 -13
  90. package/index.js.map +1 -1
  91. package/multiPartUpload/CompleteMultiPartUploadUseCase.js +50 -53
  92. package/multiPartUpload/CompleteMultiPartUploadUseCase.js.map +1 -1
  93. package/multiPartUpload/CreateMultiPartUploadUseCase.js +31 -38
  94. package/multiPartUpload/CreateMultiPartUploadUseCase.js.map +1 -1
  95. package/package.json +17 -17
  96. package/types.js +0 -2
  97. package/utils/CdnPathsGenerator.js +8 -4
  98. package/utils/CdnPathsGenerator.js.map +1 -1
  99. package/utils/FileExtension.js +12 -13
  100. package/utils/FileExtension.js.map +1 -1
  101. package/utils/FileKey.js +29 -21
  102. package/utils/FileKey.js.map +1 -1
  103. package/utils/FileKey.test.js +49 -49
  104. package/utils/FileKey.test.js.map +1 -1
  105. package/utils/FileNormalizer.js +34 -35
  106. package/utils/FileNormalizer.js.map +1 -1
  107. package/utils/FileUploadModifier.js +32 -32
  108. package/utils/FileUploadModifier.js.map +1 -1
  109. package/utils/createFileNormalizerFromContext.js +5 -4
  110. package/utils/createFileNormalizerFromContext.js.map +1 -1
  111. package/utils/getPresignedPostPayload.js +36 -33
  112. package/utils/getPresignedPostPayload.js.map +1 -1
  113. package/utils/mimeTypes.js +6 -10
  114. package/utils/mimeTypes.js.map +1 -1
  115. package/utils/uploadFileToS3.js +11 -10
  116. package/utils/uploadFileToS3.js.map +1 -1
  117. package/assetDelivery/index.js.map +0 -1
  118. package/assetDelivery/threatDetection/index.js.map +0 -1
  119. package/assetDelivery/threatDetection/types.js.map +0 -1
  120. package/assetDelivery/types.js.map +0 -1
  121. package/types.js.map +0 -1
@@ -1,41 +1,34 @@
1
- import { getSignedUrl, UploadPartCommand } from "@webiny/aws-sdk/client-s3/index.js";
2
- export class CreateMultiPartUploadUseCase {
3
- constructor(bucket, s3Client) {
4
- this.bucket = bucket;
5
- this.s3 = s3Client;
6
- }
7
- async execute({
8
- file,
9
- numberOfParts
10
- }) {
11
- const s3Params = {
12
- Bucket: this.bucket,
13
- Key: file.key
14
- };
15
- const {
16
- UploadId
17
- } = await this.s3.createMultipartUpload(s3Params);
18
- const parts = await Promise.all(Array.from({
19
- length: numberOfParts
20
- }).map((_, index) => {
21
- return getSignedUrl(this.s3, new UploadPartCommand({
22
- ...s3Params,
23
- UploadId,
24
- PartNumber: index + 1
25
- }), {
26
- // URL expires after 24 hours.
27
- expiresIn: 86400
28
- }).then(url => ({
29
- url,
30
- partNumber: index + 1
31
- }));
32
- }));
33
- return {
34
- file,
35
- uploadId: UploadId,
36
- parts
37
- };
38
- }
1
+ import { UploadPartCommand, getSignedUrl } from "@webiny/aws-sdk/client-s3/index.js";
2
+ class CreateMultiPartUploadUseCase {
3
+ constructor(bucket, s3Client){
4
+ this.bucket = bucket;
5
+ this.s3 = s3Client;
6
+ }
7
+ async execute({ file, numberOfParts }) {
8
+ const s3Params = {
9
+ Bucket: this.bucket,
10
+ Key: file.key
11
+ };
12
+ const { UploadId } = await this.s3.createMultipartUpload(s3Params);
13
+ const parts = await Promise.all(Array.from({
14
+ length: numberOfParts
15
+ }).map((_, index)=>getSignedUrl(this.s3, new UploadPartCommand({
16
+ ...s3Params,
17
+ UploadId,
18
+ PartNumber: index + 1
19
+ }), {
20
+ expiresIn: 86400
21
+ }).then((url)=>({
22
+ url,
23
+ partNumber: index + 1
24
+ }))));
25
+ return {
26
+ file,
27
+ uploadId: UploadId,
28
+ parts
29
+ };
30
+ }
39
31
  }
32
+ export { CreateMultiPartUploadUseCase };
40
33
 
41
34
  //# sourceMappingURL=CreateMultiPartUploadUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["getSignedUrl","UploadPartCommand","CreateMultiPartUploadUseCase","constructor","bucket","s3Client","s3","execute","file","numberOfParts","s3Params","Bucket","Key","key","UploadId","createMultipartUpload","parts","Promise","all","Array","from","length","map","_","index","PartNumber","expiresIn","then","url","partNumber","uploadId"],"sources":["CreateMultiPartUploadUseCase.ts"],"sourcesContent":["import type { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport { getSignedUrl, UploadPartCommand } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport type { FileData } from \"~/types.js\";\n\ninterface CreateMultiPartUploadParams {\n file: FileData;\n numberOfParts: number;\n}\n\nexport class CreateMultiPartUploadUseCase {\n private readonly s3: S3;\n private readonly bucket: string;\n\n constructor(bucket: string, s3Client: S3) {\n this.bucket = bucket;\n this.s3 = s3Client;\n }\n\n async execute({ file, numberOfParts }: CreateMultiPartUploadParams) {\n const s3Params = { Bucket: this.bucket, Key: file.key };\n\n const { UploadId } = await this.s3.createMultipartUpload(s3Params);\n\n const parts = await Promise.all(\n Array.from({ length: numberOfParts }).map((_, index) => {\n return getSignedUrl(\n this.s3,\n new UploadPartCommand({ ...s3Params, UploadId, PartNumber: index + 1 }),\n {\n // URL expires after 24 hours.\n expiresIn: 86400\n }\n ).then(url => ({\n url,\n partNumber: index + 1\n }));\n })\n );\n\n return {\n file,\n uploadId: UploadId,\n parts\n };\n }\n}\n"],"mappings":"AACA,SAASA,YAAY,EAAEC,iBAAiB,QAAQ,oCAAoC;AAQpF,OAAO,MAAMC,4BAA4B,CAAC;EAItCC,WAAWA,CAACC,MAAc,EAAEC,QAAY,EAAE;IACtC,IAAI,CAACD,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACE,EAAE,GAAGD,QAAQ;EACtB;EAEA,MAAME,OAAOA,CAAC;IAAEC,IAAI;IAAEC;EAA2C,CAAC,EAAE;IAChE,MAAMC,QAAQ,GAAG;MAAEC,MAAM,EAAE,IAAI,CAACP,MAAM;MAAEQ,GAAG,EAAEJ,IAAI,CAACK;IAAI,CAAC;IAEvD,MAAM;MAAEC;IAAS,CAAC,GAAG,MAAM,IAAI,CAACR,EAAE,CAACS,qBAAqB,CAACL,QAAQ,CAAC;IAElE,MAAMM,KAAK,GAAG,MAAMC,OAAO,CAACC,GAAG,CAC3BC,KAAK,CAACC,IAAI,CAAC;MAAEC,MAAM,EAAEZ;IAAc,CAAC,CAAC,CAACa,GAAG,CAAC,CAACC,CAAC,EAAEC,KAAK,KAAK;MACpD,OAAOxB,YAAY,CACf,IAAI,CAACM,EAAE,EACP,IAAIL,iBAAiB,CAAC;QAAE,GAAGS,QAAQ;QAAEI,QAAQ;QAAEW,UAAU,EAAED,KAAK,GAAG;MAAE,CAAC,CAAC,EACvE;QACI;QACAE,SAAS,EAAE;MACf,CACJ,CAAC,CAACC,IAAI,CAACC,GAAG,KAAK;QACXA,GAAG;QACHC,UAAU,EAAEL,KAAK,GAAG;MACxB,CAAC,CAAC,CAAC;IACP,CAAC,CACL,CAAC;IAED,OAAO;MACHhB,IAAI;MACJsB,QAAQ,EAAEhB,QAAQ;MAClBE;IACJ,CAAC;EACL;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"multiPartUpload/CreateMultiPartUploadUseCase.js","sources":["../../src/multiPartUpload/CreateMultiPartUploadUseCase.ts"],"sourcesContent":["import type { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport { getSignedUrl, UploadPartCommand } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport type { FileData } from \"~/types.js\";\n\ninterface CreateMultiPartUploadParams {\n file: FileData;\n numberOfParts: number;\n}\n\nexport class CreateMultiPartUploadUseCase {\n private readonly s3: S3;\n private readonly bucket: string;\n\n constructor(bucket: string, s3Client: S3) {\n this.bucket = bucket;\n this.s3 = s3Client;\n }\n\n async execute({ file, numberOfParts }: CreateMultiPartUploadParams) {\n const s3Params = { Bucket: this.bucket, Key: file.key };\n\n const { UploadId } = await this.s3.createMultipartUpload(s3Params);\n\n const parts = await Promise.all(\n Array.from({ length: numberOfParts }).map((_, index) => {\n return getSignedUrl(\n this.s3,\n new UploadPartCommand({ ...s3Params, UploadId, PartNumber: index + 1 }),\n {\n // URL expires after 24 hours.\n expiresIn: 86400\n }\n ).then(url => ({\n url,\n partNumber: index + 1\n }));\n })\n );\n\n return {\n file,\n uploadId: UploadId,\n parts\n };\n }\n}\n"],"names":["CreateMultiPartUploadUseCase","bucket","s3Client","file","numberOfParts","s3Params","UploadId","parts","Promise","Array","_","index","getSignedUrl","UploadPartCommand","url"],"mappings":";AASO,MAAMA;IAIT,YAAYC,MAAc,EAAEC,QAAY,CAAE;QACtC,IAAI,CAAC,MAAM,GAAGD;QACd,IAAI,CAAC,EAAE,GAAGC;IACd;IAEA,MAAM,QAAQ,EAAEC,IAAI,EAAEC,aAAa,EAA+B,EAAE;QAChE,MAAMC,WAAW;YAAE,QAAQ,IAAI,CAAC,MAAM;YAAE,KAAKF,KAAK,GAAG;QAAC;QAEtD,MAAM,EAAEG,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAACD;QAEzD,MAAME,QAAQ,MAAMC,QAAQ,GAAG,CAC3BC,MAAM,IAAI,CAAC;YAAE,QAAQL;QAAc,GAAG,GAAG,CAAC,CAACM,GAAGC,QACnCC,aACH,IAAI,CAAC,EAAE,EACP,IAAIC,kBAAkB;gBAAE,GAAGR,QAAQ;gBAAEC;gBAAU,YAAYK,QAAQ;YAAE,IACrE;gBAEI,WAAW;YACf,GACF,IAAI,CAACG,CAAAA,MAAQ;oBACXA;oBACA,YAAYH,QAAQ;gBACxB;QAIR,OAAO;YACHR;YACA,UAAUG;YACVC;QACJ;IACJ;AACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-file-manager-s3",
3
- "version": "6.3.0",
3
+ "version": "6.4.0-beta.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -14,19 +14,19 @@
14
14
  "author": "Webiny Ltd",
15
15
  "license": "MIT",
16
16
  "dependencies": {
17
- "@webiny/api": "6.3.0",
18
- "@webiny/api-core": "6.3.0",
19
- "@webiny/api-file-manager": "6.3.0",
20
- "@webiny/api-websockets": "6.3.0",
21
- "@webiny/aws-sdk": "6.3.0",
22
- "@webiny/feature": "6.3.0",
23
- "@webiny/handler": "6.3.0",
24
- "@webiny/handler-aws": "6.3.0",
25
- "@webiny/handler-graphql": "6.3.0",
26
- "@webiny/plugins": "6.3.0",
27
- "@webiny/tasks": "6.3.0",
28
- "@webiny/utils": "6.3.0",
29
- "@webiny/validation": "6.3.0",
17
+ "@webiny/api": "6.4.0-beta.0",
18
+ "@webiny/api-core": "6.4.0-beta.0",
19
+ "@webiny/api-file-manager": "6.4.0-beta.0",
20
+ "@webiny/api-websockets": "6.4.0-beta.0",
21
+ "@webiny/aws-sdk": "6.4.0-beta.0",
22
+ "@webiny/feature": "6.4.0-beta.0",
23
+ "@webiny/handler": "6.4.0-beta.0",
24
+ "@webiny/handler-aws": "6.4.0-beta.0",
25
+ "@webiny/handler-graphql": "6.4.0-beta.0",
26
+ "@webiny/plugins": "6.4.0-beta.0",
27
+ "@webiny/tasks": "6.4.0-beta.0",
28
+ "@webiny/utils": "6.4.0-beta.0",
29
+ "@webiny/validation": "6.4.0-beta.0",
30
30
  "exifreader": "4.38.1",
31
31
  "mime": "4.1.0",
32
32
  "object-hash": "3.0.0",
@@ -36,14 +36,14 @@
36
36
  "sharp": "0.34.5"
37
37
  },
38
38
  "devDependencies": {
39
- "@webiny/build-tools": "6.3.0",
39
+ "@webiny/build-tools": "6.4.0-beta.0",
40
40
  "rimraf": "6.1.3",
41
41
  "typescript": "6.0.3",
42
- "vitest": "4.1.5"
42
+ "vitest": "4.1.6"
43
43
  },
44
44
  "publishConfig": {
45
45
  "access": "public",
46
46
  "directory": "dist"
47
47
  },
48
- "gitHead": "7cefe15431dbd65504e1f58147dc9e55bcbfa693"
48
+ "gitHead": "a545d7529828af07d08d49c3da1bcb967483b9ce"
49
49
  }
package/types.js CHANGED
@@ -1,3 +1 @@
1
1
  import "@webiny/tasks/features/TaskController/augmentation.js";
2
-
3
- //# sourceMappingURL=types.js.map
@@ -1,7 +1,11 @@
1
- export class CdnPathsGenerator {
2
- generate(fileId) {
3
- return [`/files/${fileId}/*`, `/private/${fileId}/*`];
4
- }
1
+ class CdnPathsGenerator {
2
+ generate(fileId) {
3
+ return [
4
+ `/files/${fileId}/*`,
5
+ `/private/${fileId}/*`
6
+ ];
7
+ }
5
8
  }
9
+ export { CdnPathsGenerator };
6
10
 
7
11
  //# sourceMappingURL=CdnPathsGenerator.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["CdnPathsGenerator","generate","fileId"],"sources":["CdnPathsGenerator.ts"],"sourcesContent":["export class CdnPathsGenerator {\n generate(fileId: string): string[] {\n return [`/files/${fileId}/*`, `/private/${fileId}/*`];\n }\n}\n"],"mappings":"AAAA,OAAO,MAAMA,iBAAiB,CAAC;EAC3BC,QAAQA,CAACC,MAAc,EAAY;IAC/B,OAAO,CAAC,UAAUA,MAAM,IAAI,EAAE,YAAYA,MAAM,IAAI,CAAC;EACzD;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"utils/CdnPathsGenerator.js","sources":["../../src/utils/CdnPathsGenerator.ts"],"sourcesContent":["export class CdnPathsGenerator {\n generate(fileId: string): string[] {\n return [`/files/${fileId}/*`, `/private/${fileId}/*`];\n }\n}\n"],"names":["CdnPathsGenerator","fileId"],"mappings":"AAAO,MAAMA;IACT,SAASC,MAAc,EAAY;QAC/B,OAAO;YAAC,CAAC,OAAO,EAAEA,OAAO,EAAE,CAAC;YAAE,CAAC,SAAS,EAAEA,OAAO,EAAE,CAAC;SAAC;IACzD;AACJ"}
@@ -1,17 +1,16 @@
1
- import { mimeTypes } from "./mimeTypes.js";
2
- export class FileExtension {
3
- constructor(data) {
4
- this.data = data;
5
- }
6
- getValue() {
7
- const name = (this.data.key || this.data.name).toLowerCase();
8
- const maybeExt = name.split(".").pop();
9
- const extensions = mimeTypes[this.data.type];
10
- if (extensions && !extensions.includes(maybeExt)) {
11
- return extensions[0];
1
+ import { mimeTypes as external_mimeTypes_js_mimeTypes } from "./mimeTypes.js";
2
+ class FileExtension {
3
+ constructor(data){
4
+ this.data = data;
5
+ }
6
+ getValue() {
7
+ const name = (this.data.key || this.data.name).toLowerCase();
8
+ const maybeExt = name.split(".").pop();
9
+ const extensions = external_mimeTypes_js_mimeTypes[this.data.type];
10
+ if (extensions && !extensions.includes(maybeExt)) return extensions[0];
11
+ return "";
12
12
  }
13
- return "";
14
- }
15
13
  }
14
+ export { FileExtension };
16
15
 
17
16
  //# sourceMappingURL=FileExtension.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["mimeTypes","FileExtension","constructor","data","getValue","name","key","toLowerCase","maybeExt","split","pop","extensions","type","includes"],"sources":["FileExtension.ts"],"sourcesContent":["import { mimeTypes } from \"~/utils/mimeTypes.js\";\nimport type { PresignedPostPayloadData } from \"~/types.js\";\n\nexport class FileExtension {\n private data: PresignedPostPayloadData;\n\n constructor(data: PresignedPostPayloadData) {\n this.data = data;\n }\n\n getValue() {\n const name = (this.data.key || this.data.name).toLowerCase();\n\n const maybeExt = name.split(\".\").pop() as string;\n const extensions = mimeTypes[this.data.type];\n if (extensions && !extensions.includes(maybeExt)) {\n return extensions[0];\n }\n\n return \"\";\n }\n}\n"],"mappings":"AAAA,SAASA,SAAS;AAGlB,OAAO,MAAMC,aAAa,CAAC;EAGvBC,WAAWA,CAACC,IAA8B,EAAE;IACxC,IAAI,CAACA,IAAI,GAAGA,IAAI;EACpB;EAEAC,QAAQA,CAAA,EAAG;IACP,MAAMC,IAAI,GAAG,CAAC,IAAI,CAACF,IAAI,CAACG,GAAG,IAAI,IAAI,CAACH,IAAI,CAACE,IAAI,EAAEE,WAAW,CAAC,CAAC;IAE5D,MAAMC,QAAQ,GAAGH,IAAI,CAACI,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAW;IAChD,MAAMC,UAAU,GAAGX,SAAS,CAAC,IAAI,CAACG,IAAI,CAACS,IAAI,CAAC;IAC5C,IAAID,UAAU,IAAI,CAACA,UAAU,CAACE,QAAQ,CAACL,QAAQ,CAAC,EAAE;MAC9C,OAAOG,UAAU,CAAC,CAAC,CAAC;IACxB;IAEA,OAAO,EAAE;EACb;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"utils/FileExtension.js","sources":["../../src/utils/FileExtension.ts"],"sourcesContent":["import { mimeTypes } from \"~/utils/mimeTypes.js\";\nimport type { PresignedPostPayloadData } from \"~/types.js\";\n\nexport class FileExtension {\n private data: PresignedPostPayloadData;\n\n constructor(data: PresignedPostPayloadData) {\n this.data = data;\n }\n\n getValue() {\n const name = (this.data.key || this.data.name).toLowerCase();\n\n const maybeExt = name.split(\".\").pop() as string;\n const extensions = mimeTypes[this.data.type];\n if (extensions && !extensions.includes(maybeExt)) {\n return extensions[0];\n }\n\n return \"\";\n }\n}\n"],"names":["FileExtension","data","name","maybeExt","extensions","mimeTypes"],"mappings":";AAGO,MAAMA;IAGT,YAAYC,IAA8B,CAAE;QACxC,IAAI,CAAC,IAAI,GAAGA;IAChB;IAEA,WAAW;QACP,MAAMC,OAAQ,KAAI,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAG,EAAG,WAAW;QAE1D,MAAMC,WAAWD,KAAK,KAAK,CAAC,KAAK,GAAG;QACpC,MAAME,aAAaC,+BAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5C,IAAID,cAAc,CAACA,WAAW,QAAQ,CAACD,WACnC,OAAOC,UAAU,CAAC,EAAE;QAGxB,OAAO;IACX;AACJ"}
package/utils/FileKey.js CHANGED
@@ -1,25 +1,33 @@
1
- import sanitizeFilename from "sanitize-filename";
1
+ import sanitize_filename from "sanitize-filename";
2
2
  import { FileExtension } from "./FileExtension.js";
3
- export class FileKey {
4
- constructor(data) {
5
- this.data = data;
6
- this.extension = new FileExtension(data);
7
- this.key = this.getSanitizedKey();
8
- }
9
- getExtension() {
10
- return this.extension.getValue();
11
- }
12
- setKey(key) {
13
- this.key = key;
14
- return this;
15
- }
16
- toString() {
17
- return [this.data.keyPrefix, this.data.id, this.key].filter(Boolean).join("/");
18
- }
19
- getSanitizedKey() {
20
- const key = sanitizeFilename(this.data.key || this.data.name).replace(/\s/g, "");
21
- return [key, this.getExtension()].filter(Boolean).join(".");
22
- }
3
+ class FileKey {
4
+ constructor(data){
5
+ this.data = data;
6
+ this.extension = new FileExtension(data);
7
+ this.key = this.getSanitizedKey();
8
+ }
9
+ getExtension() {
10
+ return this.extension.getValue();
11
+ }
12
+ setKey(key) {
13
+ this.key = key;
14
+ return this;
15
+ }
16
+ toString() {
17
+ return [
18
+ this.data.keyPrefix,
19
+ this.data.id,
20
+ this.key
21
+ ].filter(Boolean).join("/");
22
+ }
23
+ getSanitizedKey() {
24
+ const key = sanitize_filename(this.data.key || this.data.name).replace(/\s/g, "");
25
+ return [
26
+ key,
27
+ this.getExtension()
28
+ ].filter(Boolean).join(".");
29
+ }
23
30
  }
31
+ export { FileKey };
24
32
 
25
33
  //# sourceMappingURL=FileKey.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["sanitizeFilename","FileExtension","FileKey","constructor","data","extension","key","getSanitizedKey","getExtension","getValue","setKey","toString","keyPrefix","id","filter","Boolean","join","name","replace"],"sources":["FileKey.ts"],"sourcesContent":["import sanitizeFilename from \"sanitize-filename\";\nimport type { PresignedPostPayloadData } from \"~/types.js\";\nimport { FileExtension } from \"~/utils/FileExtension.js\";\n\nexport class FileKey {\n private data: PresignedPostPayloadData;\n private extension: FileExtension;\n private key: string;\n\n constructor(data: PresignedPostPayloadData) {\n this.data = data;\n this.extension = new FileExtension(data);\n this.key = this.getSanitizedKey();\n }\n\n getExtension() {\n return this.extension.getValue();\n }\n\n setKey(key: string) {\n this.key = key;\n return this;\n }\n\n toString() {\n return [this.data.keyPrefix, this.data.id, this.key].filter(Boolean).join(\"/\");\n }\n\n private getSanitizedKey() {\n const key = sanitizeFilename(this.data.key || this.data.name).replace(/\\s/g, \"\");\n\n return [key, this.getExtension()].filter(Boolean).join(\".\");\n }\n}\n"],"mappings":"AAAA,OAAOA,gBAAgB,MAAM,mBAAmB;AAEhD,SAASC,aAAa;AAEtB,OAAO,MAAMC,OAAO,CAAC;EAKjBC,WAAWA,CAACC,IAA8B,EAAE;IACxC,IAAI,CAACA,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACC,SAAS,GAAG,IAAIJ,aAAa,CAACG,IAAI,CAAC;IACxC,IAAI,CAACE,GAAG,GAAG,IAAI,CAACC,eAAe,CAAC,CAAC;EACrC;EAEAC,YAAYA,CAAA,EAAG;IACX,OAAO,IAAI,CAACH,SAAS,CAACI,QAAQ,CAAC,CAAC;EACpC;EAEAC,MAAMA,CAACJ,GAAW,EAAE;IAChB,IAAI,CAACA,GAAG,GAAGA,GAAG;IACd,OAAO,IAAI;EACf;EAEAK,QAAQA,CAAA,EAAG;IACP,OAAO,CAAC,IAAI,CAACP,IAAI,CAACQ,SAAS,EAAE,IAAI,CAACR,IAAI,CAACS,EAAE,EAAE,IAAI,CAACP,GAAG,CAAC,CAACQ,MAAM,CAACC,OAAO,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC;EAClF;EAEQT,eAAeA,CAAA,EAAG;IACtB,MAAMD,GAAG,GAAGN,gBAAgB,CAAC,IAAI,CAACI,IAAI,CAACE,GAAG,IAAI,IAAI,CAACF,IAAI,CAACa,IAAI,CAAC,CAACC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAEhF,OAAO,CAACZ,GAAG,EAAE,IAAI,CAACE,YAAY,CAAC,CAAC,CAAC,CAACM,MAAM,CAACC,OAAO,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC;EAC/D;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"utils/FileKey.js","sources":["../../src/utils/FileKey.ts"],"sourcesContent":["import sanitizeFilename from \"sanitize-filename\";\nimport type { PresignedPostPayloadData } from \"~/types.js\";\nimport { FileExtension } from \"~/utils/FileExtension.js\";\n\nexport class FileKey {\n private data: PresignedPostPayloadData;\n private extension: FileExtension;\n private key: string;\n\n constructor(data: PresignedPostPayloadData) {\n this.data = data;\n this.extension = new FileExtension(data);\n this.key = this.getSanitizedKey();\n }\n\n getExtension() {\n return this.extension.getValue();\n }\n\n setKey(key: string) {\n this.key = key;\n return this;\n }\n\n toString() {\n return [this.data.keyPrefix, this.data.id, this.key].filter(Boolean).join(\"/\");\n }\n\n private getSanitizedKey() {\n const key = sanitizeFilename(this.data.key || this.data.name).replace(/\\s/g, \"\");\n\n return [key, this.getExtension()].filter(Boolean).join(\".\");\n }\n}\n"],"names":["FileKey","data","FileExtension","key","Boolean","sanitizeFilename"],"mappings":";;AAIO,MAAMA;IAKT,YAAYC,IAA8B,CAAE;QACxC,IAAI,CAAC,IAAI,GAAGA;QACZ,IAAI,CAAC,SAAS,GAAG,IAAIC,cAAcD;QACnC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,eAAe;IACnC;IAEA,eAAe;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ;IAClC;IAEA,OAAOE,GAAW,EAAE;QAChB,IAAI,CAAC,GAAG,GAAGA;QACX,OAAO,IAAI;IACf;IAEA,WAAW;QACP,OAAO;YAAC,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,IAAI,CAAC,GAAG;SAAC,CAAC,MAAM,CAACC,SAAS,IAAI,CAAC;IAC9E;IAEQ,kBAAkB;QACtB,MAAMD,MAAME,kBAAiB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO;QAE7E,OAAO;YAACF;YAAK,IAAI,CAAC,YAAY;SAAG,CAAC,MAAM,CAACC,SAAS,IAAI,CAAC;IAC3D;AACJ"}
@@ -1,59 +1,59 @@
1
- import { describe, it, expect } from "vitest";
1
+ import { describe, expect, it } from "vitest";
2
2
  import { FileKey } from "./FileKey.js";
3
- describe("FileKey", () => {
4
- it("should generate a file key (extension is included in the name)", () => {
5
- const fileKey = new FileKey({
6
- size: 1071690,
7
- name: "image-14.jpg",
8
- type: "image/jpeg"
3
+ describe("FileKey", ()=>{
4
+ it("should generate a file key (extension is included in the name)", ()=>{
5
+ const fileKey = new FileKey({
6
+ size: 1071690,
7
+ name: "image-14.jpg",
8
+ type: "image/jpeg"
9
+ });
10
+ expect(fileKey.toString()).toEqual("image-14.jpg");
9
11
  });
10
- expect(fileKey.toString()).toEqual("image-14.jpg");
11
- });
12
- it("should generate a file key (extension derived from file type)", () => {
13
- const fileKey = new FileKey({
14
- size: 1071690,
15
- name: "image-14",
16
- type: "image/jpeg"
12
+ it("should generate a file key (extension derived from file type)", ()=>{
13
+ const fileKey = new FileKey({
14
+ size: 1071690,
15
+ name: "image-14",
16
+ type: "image/jpeg"
17
+ });
18
+ expect(fileKey.toString()).toEqual("image-14.jpg");
17
19
  });
18
- expect(fileKey.toString()).toEqual("image-14.jpg");
19
- });
20
- it("should generate a file key containing id", () => {
21
- const fileKey = new FileKey({
22
- size: 1071690,
23
- name: "image-14.jpeg",
24
- type: "image/jpeg",
25
- id: "12345678"
20
+ it("should generate a file key containing id", ()=>{
21
+ const fileKey = new FileKey({
22
+ size: 1071690,
23
+ name: "image-14.jpeg",
24
+ type: "image/jpeg",
25
+ id: "12345678"
26
+ });
27
+ expect(fileKey.toString()).toEqual("12345678/image-14.jpeg");
26
28
  });
27
- expect(fileKey.toString()).toEqual("12345678/image-14.jpeg");
28
- });
29
- it("should generate a file key containing prefix", () => {
30
- const fileKey = new FileKey({
31
- size: 1071690,
32
- name: "image-14.jpeg",
33
- type: "image/jpeg",
34
- keyPrefix: "prefix"
29
+ it("should generate a file key containing prefix", ()=>{
30
+ const fileKey = new FileKey({
31
+ size: 1071690,
32
+ name: "image-14.jpeg",
33
+ type: "image/jpeg",
34
+ keyPrefix: "prefix"
35
+ });
36
+ expect(fileKey.toString()).toEqual("prefix/image-14.jpeg");
35
37
  });
36
- expect(fileKey.toString()).toEqual("prefix/image-14.jpeg");
37
- });
38
- it("should generate a file key containing id and prefix", () => {
39
- const fileKey = new FileKey({
40
- size: 1071690,
41
- name: "image-14.jpeg",
42
- type: "image/jpeg",
43
- id: "12345678",
44
- keyPrefix: "prefix"
38
+ it("should generate a file key containing id and prefix", ()=>{
39
+ const fileKey = new FileKey({
40
+ size: 1071690,
41
+ name: "image-14.jpeg",
42
+ type: "image/jpeg",
43
+ id: "12345678",
44
+ keyPrefix: "prefix"
45
+ });
46
+ expect(fileKey.toString()).toEqual("prefix/12345678/image-14.jpeg");
45
47
  });
46
- expect(fileKey.toString()).toEqual("prefix/12345678/image-14.jpeg");
47
- });
48
- it("should use the key defined in the input", () => {
49
- const fileKey = new FileKey({
50
- size: 1071690,
51
- name: "image",
52
- type: "image/jpeg",
53
- key: "image-14.jpg"
48
+ it("should use the key defined in the input", ()=>{
49
+ const fileKey = new FileKey({
50
+ size: 1071690,
51
+ name: "image",
52
+ type: "image/jpeg",
53
+ key: "image-14.jpg"
54
+ });
55
+ expect(fileKey.toString()).toEqual("image-14.jpg");
54
56
  });
55
- expect(fileKey.toString()).toEqual("image-14.jpg");
56
- });
57
57
  });
58
58
 
59
59
  //# sourceMappingURL=FileKey.test.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["describe","it","expect","FileKey","fileKey","size","name","type","toString","toEqual","id","keyPrefix","key"],"sources":["FileKey.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { FileKey } from \"./FileKey.js\";\n\ndescribe(\"FileKey\", () => {\n it(\"should generate a file key (extension is included in the name)\", () => {\n const fileKey = new FileKey({\n size: 1071690,\n name: \"image-14.jpg\",\n type: \"image/jpeg\"\n });\n\n expect(fileKey.toString()).toEqual(\"image-14.jpg\");\n });\n\n it(\"should generate a file key (extension derived from file type)\", () => {\n const fileKey = new FileKey({\n size: 1071690,\n name: \"image-14\",\n type: \"image/jpeg\"\n });\n\n expect(fileKey.toString()).toEqual(\"image-14.jpg\");\n });\n\n it(\"should generate a file key containing id\", () => {\n const fileKey = new FileKey({\n size: 1071690,\n name: \"image-14.jpeg\",\n type: \"image/jpeg\",\n id: \"12345678\"\n });\n\n expect(fileKey.toString()).toEqual(\"12345678/image-14.jpeg\");\n });\n\n it(\"should generate a file key containing prefix\", () => {\n const fileKey = new FileKey({\n size: 1071690,\n name: \"image-14.jpeg\",\n type: \"image/jpeg\",\n keyPrefix: \"prefix\"\n });\n\n expect(fileKey.toString()).toEqual(\"prefix/image-14.jpeg\");\n });\n\n it(\"should generate a file key containing id and prefix\", () => {\n const fileKey = new FileKey({\n size: 1071690,\n name: \"image-14.jpeg\",\n type: \"image/jpeg\",\n id: \"12345678\",\n keyPrefix: \"prefix\"\n });\n\n expect(fileKey.toString()).toEqual(\"prefix/12345678/image-14.jpeg\");\n });\n\n it(\"should use the key defined in the input\", () => {\n const fileKey = new FileKey({\n size: 1071690,\n name: \"image\",\n type: \"image/jpeg\",\n key: \"image-14.jpg\"\n });\n\n expect(fileKey.toString()).toEqual(\"image-14.jpg\");\n });\n});\n"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,EAAE,EAAEC,MAAM,QAAQ,QAAQ;AAC7C,SAASC,OAAO;AAEhBH,QAAQ,CAAC,SAAS,EAAE,MAAM;EACtBC,EAAE,CAAC,gEAAgE,EAAE,MAAM;IACvE,MAAMG,OAAO,GAAG,IAAID,OAAO,CAAC;MACxBE,IAAI,EAAE,OAAO;MACbC,IAAI,EAAE,cAAc;MACpBC,IAAI,EAAE;IACV,CAAC,CAAC;IAEFL,MAAM,CAACE,OAAO,CAACI,QAAQ,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,cAAc,CAAC;EACtD,CAAC,CAAC;EAEFR,EAAE,CAAC,+DAA+D,EAAE,MAAM;IACtE,MAAMG,OAAO,GAAG,IAAID,OAAO,CAAC;MACxBE,IAAI,EAAE,OAAO;MACbC,IAAI,EAAE,UAAU;MAChBC,IAAI,EAAE;IACV,CAAC,CAAC;IAEFL,MAAM,CAACE,OAAO,CAACI,QAAQ,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,cAAc,CAAC;EACtD,CAAC,CAAC;EAEFR,EAAE,CAAC,0CAA0C,EAAE,MAAM;IACjD,MAAMG,OAAO,GAAG,IAAID,OAAO,CAAC;MACxBE,IAAI,EAAE,OAAO;MACbC,IAAI,EAAE,eAAe;MACrBC,IAAI,EAAE,YAAY;MAClBG,EAAE,EAAE;IACR,CAAC,CAAC;IAEFR,MAAM,CAACE,OAAO,CAACI,QAAQ,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,wBAAwB,CAAC;EAChE,CAAC,CAAC;EAEFR,EAAE,CAAC,8CAA8C,EAAE,MAAM;IACrD,MAAMG,OAAO,GAAG,IAAID,OAAO,CAAC;MACxBE,IAAI,EAAE,OAAO;MACbC,IAAI,EAAE,eAAe;MACrBC,IAAI,EAAE,YAAY;MAClBI,SAAS,EAAE;IACf,CAAC,CAAC;IAEFT,MAAM,CAACE,OAAO,CAACI,QAAQ,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,sBAAsB,CAAC;EAC9D,CAAC,CAAC;EAEFR,EAAE,CAAC,qDAAqD,EAAE,MAAM;IAC5D,MAAMG,OAAO,GAAG,IAAID,OAAO,CAAC;MACxBE,IAAI,EAAE,OAAO;MACbC,IAAI,EAAE,eAAe;MACrBC,IAAI,EAAE,YAAY;MAClBG,EAAE,EAAE,UAAU;MACdC,SAAS,EAAE;IACf,CAAC,CAAC;IAEFT,MAAM,CAACE,OAAO,CAACI,QAAQ,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,+BAA+B,CAAC;EACvE,CAAC,CAAC;EAEFR,EAAE,CAAC,yCAAyC,EAAE,MAAM;IAChD,MAAMG,OAAO,GAAG,IAAID,OAAO,CAAC;MACxBE,IAAI,EAAE,OAAO;MACbC,IAAI,EAAE,OAAO;MACbC,IAAI,EAAE,YAAY;MAClBK,GAAG,EAAE;IACT,CAAC,CAAC;IAEFV,MAAM,CAACE,OAAO,CAACI,QAAQ,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,cAAc,CAAC;EACtD,CAAC,CAAC;AACN,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"utils/FileKey.test.js","sources":["../../src/utils/FileKey.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { FileKey } from \"./FileKey.js\";\n\ndescribe(\"FileKey\", () => {\n it(\"should generate a file key (extension is included in the name)\", () => {\n const fileKey = new FileKey({\n size: 1071690,\n name: \"image-14.jpg\",\n type: \"image/jpeg\"\n });\n\n expect(fileKey.toString()).toEqual(\"image-14.jpg\");\n });\n\n it(\"should generate a file key (extension derived from file type)\", () => {\n const fileKey = new FileKey({\n size: 1071690,\n name: \"image-14\",\n type: \"image/jpeg\"\n });\n\n expect(fileKey.toString()).toEqual(\"image-14.jpg\");\n });\n\n it(\"should generate a file key containing id\", () => {\n const fileKey = new FileKey({\n size: 1071690,\n name: \"image-14.jpeg\",\n type: \"image/jpeg\",\n id: \"12345678\"\n });\n\n expect(fileKey.toString()).toEqual(\"12345678/image-14.jpeg\");\n });\n\n it(\"should generate a file key containing prefix\", () => {\n const fileKey = new FileKey({\n size: 1071690,\n name: \"image-14.jpeg\",\n type: \"image/jpeg\",\n keyPrefix: \"prefix\"\n });\n\n expect(fileKey.toString()).toEqual(\"prefix/image-14.jpeg\");\n });\n\n it(\"should generate a file key containing id and prefix\", () => {\n const fileKey = new FileKey({\n size: 1071690,\n name: \"image-14.jpeg\",\n type: \"image/jpeg\",\n id: \"12345678\",\n keyPrefix: \"prefix\"\n });\n\n expect(fileKey.toString()).toEqual(\"prefix/12345678/image-14.jpeg\");\n });\n\n it(\"should use the key defined in the input\", () => {\n const fileKey = new FileKey({\n size: 1071690,\n name: \"image\",\n type: \"image/jpeg\",\n key: \"image-14.jpg\"\n });\n\n expect(fileKey.toString()).toEqual(\"image-14.jpg\");\n });\n});\n"],"names":["describe","it","fileKey","FileKey","expect"],"mappings":";;AAGAA,SAAS,WAAW;IAChBC,GAAG,kEAAkE;QACjE,MAAMC,UAAU,IAAIC,QAAQ;YACxB,MAAM;YACN,MAAM;YACN,MAAM;QACV;QAEAC,OAAOF,QAAQ,QAAQ,IAAI,OAAO,CAAC;IACvC;IAEAD,GAAG,iEAAiE;QAChE,MAAMC,UAAU,IAAIC,QAAQ;YACxB,MAAM;YACN,MAAM;YACN,MAAM;QACV;QAEAC,OAAOF,QAAQ,QAAQ,IAAI,OAAO,CAAC;IACvC;IAEAD,GAAG,4CAA4C;QAC3C,MAAMC,UAAU,IAAIC,QAAQ;YACxB,MAAM;YACN,MAAM;YACN,MAAM;YACN,IAAI;QACR;QAEAC,OAAOF,QAAQ,QAAQ,IAAI,OAAO,CAAC;IACvC;IAEAD,GAAG,gDAAgD;QAC/C,MAAMC,UAAU,IAAIC,QAAQ;YACxB,MAAM;YACN,MAAM;YACN,MAAM;YACN,WAAW;QACf;QAEAC,OAAOF,QAAQ,QAAQ,IAAI,OAAO,CAAC;IACvC;IAEAD,GAAG,uDAAuD;QACtD,MAAMC,UAAU,IAAIC,QAAQ;YACxB,MAAM;YACN,MAAM;YACN,MAAM;YACN,IAAI;YACJ,WAAW;QACf;QAEAC,OAAOF,QAAQ,QAAQ,IAAI,OAAO,CAAC;IACvC;IAEAD,GAAG,2CAA2C;QAC1C,MAAMC,UAAU,IAAIC,QAAQ;YACxB,MAAM;YACN,MAAM;YACN,MAAM;YACN,KAAK;QACT;QAEAC,OAAOF,QAAQ,QAAQ,IAAI,OAAO,CAAC;IACvC;AACJ"}
@@ -1,42 +1,41 @@
1
1
  import { mdbid } from "@webiny/utils";
2
2
  import { FileKey } from "./FileKey.js";
3
- /**
4
- * FileNormalizer normalizes file data, before it's signed for upload to S3.
5
- * It generates a unique file id, and makes sure that the file key includes the unique id.
6
- *
7
- */
8
- export class FileNormalizer {
9
- constructor(modifier) {
10
- this.modifier = modifier;
11
- }
12
- async normalizeFile(payload) {
13
- const data = {
14
- ...payload,
15
- id: payload.id || mdbid(),
16
- type: payload.type || "application/octet-stream"
17
- };
18
- const key = new FileKey(data);
19
- const defaultKey = key.toString();
20
- const file = {
21
- name: data.name,
22
- type: data.type,
23
- key: defaultKey,
24
- size: data.size
25
- };
26
- if (this.modifier) {
27
- Object.assign(file, await this.modifier(file));
3
+ import { mimeTypes as external_mimeTypes_js_mimeTypes } from "./mimeTypes.js";
4
+ const extensionToMime = new Map();
5
+ for (const [mime, extensions] of Object.entries(external_mimeTypes_js_mimeTypes))for (const ext of extensions)if (!extensionToMime.has(ext)) extensionToMime.set(ext, mime);
6
+ function resolveTypeFromName(name) {
7
+ const ext = name.slice(name.lastIndexOf(".") + 1).toLowerCase();
8
+ return extensionToMime.get(ext) || "application/octet-stream";
9
+ }
10
+ class FileNormalizer {
11
+ constructor(modifier){
12
+ this.modifier = modifier;
28
13
  }
29
- if (defaultKey !== file.key) {
30
- key.setKey(file.key);
14
+ async normalizeFile(payload) {
15
+ const data = {
16
+ ...payload,
17
+ id: payload.id || mdbid(),
18
+ type: payload.type || resolveTypeFromName(payload.name)
19
+ };
20
+ const key = new FileKey(data);
21
+ const defaultKey = key.toString();
22
+ const file = {
23
+ name: data.name,
24
+ type: data.type,
25
+ key: defaultKey,
26
+ size: data.size
27
+ };
28
+ if (this.modifier) Object.assign(file, await this.modifier(file));
29
+ if (defaultKey !== file.key) key.setKey(file.key);
30
+ return {
31
+ id: data.id,
32
+ key: key.toString(),
33
+ name: file.name,
34
+ size: file.size,
35
+ type: file.type
36
+ };
31
37
  }
32
- return {
33
- id: data.id,
34
- key: key.toString(),
35
- name: file.name,
36
- size: file.size,
37
- type: file.type
38
- };
39
- }
40
38
  }
39
+ export { FileNormalizer };
41
40
 
42
41
  //# sourceMappingURL=FileNormalizer.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["mdbid","FileKey","FileNormalizer","constructor","modifier","normalizeFile","payload","data","id","type","key","defaultKey","toString","file","name","size","Object","assign","setKey"],"sources":["FileNormalizer.ts"],"sourcesContent":["import { mdbid } from \"@webiny/utils\";\nimport type { FileData, PresignedPostPayloadData } from \"~/types.js\";\nimport { FileKey } from \"~/utils/FileKey.js\";\nimport type { FileModifier } from \"./FileUploadModifier.js\";\n\nexport interface FileToSign {\n name: string;\n key: string;\n type: string;\n size: number;\n}\n\n/**\n * FileNormalizer normalizes file data, before it's signed for upload to S3.\n * It generates a unique file id, and makes sure that the file key includes the unique id.\n *\n */\nexport class FileNormalizer {\n private readonly modifier: FileModifier | undefined;\n\n constructor(modifier?: FileModifier) {\n this.modifier = modifier;\n }\n\n async normalizeFile(payload: PresignedPostPayloadData): Promise<FileData> {\n const data = {\n ...payload,\n id: payload.id || mdbid(),\n type: payload.type || \"application/octet-stream\"\n };\n\n const key = new FileKey(data);\n const defaultKey = key.toString();\n\n const file: FileToSign = {\n name: data.name,\n type: data.type,\n key: defaultKey,\n size: data.size\n };\n\n if (this.modifier) {\n Object.assign(file, await this.modifier(file));\n }\n\n if (defaultKey !== file.key) {\n key.setKey(file.key);\n }\n\n return {\n id: data.id,\n key: key.toString(),\n name: file.name,\n size: file.size,\n type: file.type\n };\n }\n}\n"],"mappings":"AAAA,SAASA,KAAK,QAAQ,eAAe;AAErC,SAASC,OAAO;AAUhB;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,cAAc,CAAC;EAGxBC,WAAWA,CAACC,QAAuB,EAAE;IACjC,IAAI,CAACA,QAAQ,GAAGA,QAAQ;EAC5B;EAEA,MAAMC,aAAaA,CAACC,OAAiC,EAAqB;IACtE,MAAMC,IAAI,GAAG;MACT,GAAGD,OAAO;MACVE,EAAE,EAAEF,OAAO,CAACE,EAAE,IAAIR,KAAK,CAAC,CAAC;MACzBS,IAAI,EAAEH,OAAO,CAACG,IAAI,IAAI;IAC1B,CAAC;IAED,MAAMC,GAAG,GAAG,IAAIT,OAAO,CAACM,IAAI,CAAC;IAC7B,MAAMI,UAAU,GAAGD,GAAG,CAACE,QAAQ,CAAC,CAAC;IAEjC,MAAMC,IAAgB,GAAG;MACrBC,IAAI,EAAEP,IAAI,CAACO,IAAI;MACfL,IAAI,EAAEF,IAAI,CAACE,IAAI;MACfC,GAAG,EAAEC,UAAU;MACfI,IAAI,EAAER,IAAI,CAACQ;IACf,CAAC;IAED,IAAI,IAAI,CAACX,QAAQ,EAAE;MACfY,MAAM,CAACC,MAAM,CAACJ,IAAI,EAAE,MAAM,IAAI,CAACT,QAAQ,CAACS,IAAI,CAAC,CAAC;IAClD;IAEA,IAAIF,UAAU,KAAKE,IAAI,CAACH,GAAG,EAAE;MACzBA,GAAG,CAACQ,MAAM,CAACL,IAAI,CAACH,GAAG,CAAC;IACxB;IAEA,OAAO;MACHF,EAAE,EAAED,IAAI,CAACC,EAAE;MACXE,GAAG,EAAEA,GAAG,CAACE,QAAQ,CAAC,CAAC;MACnBE,IAAI,EAAED,IAAI,CAACC,IAAI;MACfC,IAAI,EAAEF,IAAI,CAACE,IAAI;MACfN,IAAI,EAAEI,IAAI,CAACJ;IACf,CAAC;EACL;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"utils/FileNormalizer.js","sources":["../../src/utils/FileNormalizer.ts"],"sourcesContent":["import { mdbid } from \"@webiny/utils\";\nimport type { FileData, PresignedPostPayloadData } from \"~/types.js\";\nimport { FileKey } from \"~/utils/FileKey.js\";\nimport { mimeTypes } from \"~/utils/mimeTypes.js\";\nimport type { FileModifier } from \"./FileUploadModifier.js\";\n\nexport interface FileToSign {\n name: string;\n key: string;\n type: string;\n size: number;\n}\n\nconst extensionToMime = new Map<string, string>();\nfor (const [mime, extensions] of Object.entries(mimeTypes)) {\n for (const ext of extensions) {\n if (!extensionToMime.has(ext)) {\n extensionToMime.set(ext, mime);\n }\n }\n}\n\nfunction resolveTypeFromName(name: string): string {\n const ext = name.slice(name.lastIndexOf(\".\") + 1).toLowerCase();\n return extensionToMime.get(ext) || \"application/octet-stream\";\n}\n\n/**\n * FileNormalizer normalizes file data, before it's signed for upload to S3.\n * It generates a unique file id, and makes sure that the file key includes the unique id.\n *\n */\nexport class FileNormalizer {\n private readonly modifier: FileModifier | undefined;\n\n constructor(modifier?: FileModifier) {\n this.modifier = modifier;\n }\n\n async normalizeFile(payload: PresignedPostPayloadData): Promise<FileData> {\n const data = {\n ...payload,\n id: payload.id || mdbid(),\n type: payload.type || resolveTypeFromName(payload.name)\n };\n\n const key = new FileKey(data);\n const defaultKey = key.toString();\n\n const file: FileToSign = {\n name: data.name,\n type: data.type,\n key: defaultKey,\n size: data.size\n };\n\n if (this.modifier) {\n Object.assign(file, await this.modifier(file));\n }\n\n if (defaultKey !== file.key) {\n key.setKey(file.key);\n }\n\n return {\n id: data.id,\n key: key.toString(),\n name: file.name,\n size: file.size,\n type: file.type\n };\n }\n}\n"],"names":["extensionToMime","Map","mime","extensions","Object","mimeTypes","ext","resolveTypeFromName","name","FileNormalizer","modifier","payload","data","mdbid","key","FileKey","defaultKey","file"],"mappings":";;;AAaA,MAAMA,kBAAkB,IAAIC;AAC5B,KAAK,MAAM,CAACC,MAAMC,WAAW,IAAIC,OAAO,OAAO,CAACC,iCAC5C,KAAK,MAAMC,OAAOH,WACd,IAAI,CAACH,gBAAgB,GAAG,CAACM,MACrBN,gBAAgB,GAAG,CAACM,KAAKJ;AAKrC,SAASK,oBAAoBC,IAAY;IACrC,MAAMF,MAAME,KAAK,KAAK,CAACA,KAAK,WAAW,CAAC,OAAO,GAAG,WAAW;IAC7D,OAAOR,gBAAgB,GAAG,CAACM,QAAQ;AACvC;AAOO,MAAMG;IAGT,YAAYC,QAAuB,CAAE;QACjC,IAAI,CAAC,QAAQ,GAAGA;IACpB;IAEA,MAAM,cAAcC,OAAiC,EAAqB;QACtE,MAAMC,OAAO;YACT,GAAGD,OAAO;YACV,IAAIA,QAAQ,EAAE,IAAIE;YAClB,MAAMF,QAAQ,IAAI,IAAIJ,oBAAoBI,QAAQ,IAAI;QAC1D;QAEA,MAAMG,MAAM,IAAIC,QAAQH;QACxB,MAAMI,aAAaF,IAAI,QAAQ;QAE/B,MAAMG,OAAmB;YACrB,MAAML,KAAK,IAAI;YACf,MAAMA,KAAK,IAAI;YACf,KAAKI;YACL,MAAMJ,KAAK,IAAI;QACnB;QAEA,IAAI,IAAI,CAAC,QAAQ,EACbR,OAAO,MAAM,CAACa,MAAM,MAAM,IAAI,CAAC,QAAQ,CAACA;QAG5C,IAAID,eAAeC,KAAK,GAAG,EACvBH,IAAI,MAAM,CAACG,KAAK,GAAG;QAGvB,OAAO;YACH,IAAIL,KAAK,EAAE;YACX,KAAKE,IAAI,QAAQ;YACjB,MAAMG,KAAK,IAAI;YACf,MAAMA,KAAK,IAAI;YACf,MAAMA,KAAK,IAAI;QACnB;IACJ;AACJ"}
@@ -1,39 +1,39 @@
1
- import pReduce from "p-reduce";
1
+ import p_reduce from "p-reduce";
2
2
  import { Plugin } from "@webiny/plugins";
3
3
  class FileUploadModifier {
4
- fileSetters = [];
5
- setFile(setter) {
6
- this.fileSetters.push(setter);
7
- }
8
- execute(file) {
9
- return pReduce(this.fileSetters, async (file, setter) => {
10
- // We need to spread the original file, then add (potentially) partial changes.
11
- return {
12
- ...file,
13
- ...(await setter(file))
14
- };
15
- }, file);
16
- }
4
+ setFile(setter) {
5
+ this.fileSetters.push(setter);
6
+ }
7
+ execute(file) {
8
+ return p_reduce(this.fileSetters, async (file, setter)=>({
9
+ ...file,
10
+ ...await setter(file)
11
+ }), file);
12
+ }
13
+ constructor(){
14
+ this.fileSetters = [];
15
+ }
17
16
  }
18
- export class FileUploadModifierPlugin extends Plugin {
19
- static type = "fm.s3.uploadModifier";
20
- constructor(cb) {
21
- super();
22
- this.cb = cb;
23
- }
24
- execute(params) {
25
- return this.cb(params);
26
- }
17
+ class FileUploadModifierPlugin extends Plugin {
18
+ static{
19
+ this.type = "fm.s3.uploadModifier";
20
+ }
21
+ constructor(cb){
22
+ super();
23
+ this.cb = cb;
24
+ }
25
+ execute(params) {
26
+ return this.cb(params);
27
+ }
27
28
  }
28
- export const createFileUploadModifier = cb => {
29
- return new FileUploadModifierPlugin(cb);
30
- };
31
- export const createModifierFromPlugins = (plugins = []) => {
32
- const modifier = new FileUploadModifier();
33
- plugins.forEach(pl => pl.execute({
34
- modifier
35
- }));
36
- return file => modifier.execute(file);
29
+ const createFileUploadModifier = (cb)=>new FileUploadModifierPlugin(cb);
30
+ const createModifierFromPlugins = (plugins = [])=>{
31
+ const modifier = new FileUploadModifier();
32
+ plugins.forEach((pl)=>pl.execute({
33
+ modifier
34
+ }));
35
+ return (file)=>modifier.execute(file);
37
36
  };
37
+ export { FileUploadModifierPlugin, createFileUploadModifier, createModifierFromPlugins };
38
38
 
39
39
  //# sourceMappingURL=FileUploadModifier.js.map