@webiny/api-file-manager-s3 0.0.0-unstable.d7f521b032 → 0.0.0-unstable.ecd8734205

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.
package/index.js CHANGED
@@ -1,16 +1,11 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = void 0;
9
-
10
8
  var _graphqlFileStorageS = _interopRequireDefault(require("./plugins/graphqlFileStorageS3"));
11
-
12
9
  var _fileStorageS = _interopRequireDefault(require("./plugins/fileStorageS3"));
13
-
14
10
  var _default = () => [(0, _fileStorageS.default)(), _graphqlFileStorageS.default];
15
-
16
11
  exports.default = _default;
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["fileStorageS3","graphqlFileStorageS3"],"sources":["index.ts"],"sourcesContent":["import graphqlFileStorageS3 from \"./plugins/graphqlFileStorageS3\";\nimport fileStorageS3 from \"./plugins/fileStorageS3\";\n\nexport default () => [fileStorageS3(), graphqlFileStorageS3];\n"],"mappings":";;;;;;;;;AAAA;;AACA;;eAEe,MAAM,CAAC,IAAAA,qBAAA,GAAD,EAAkBC,4BAAlB,C"}
1
+ {"version":3,"names":["fileStorageS3","graphqlFileStorageS3"],"sources":["index.ts"],"sourcesContent":["import graphqlFileStorageS3 from \"./plugins/graphqlFileStorageS3\";\nimport fileStorageS3 from \"./plugins/fileStorageS3\";\n\nexport default () => [fileStorageS3(), graphqlFileStorageS3];\n"],"mappings":";;;;;;;AAAA;AACA;AAAoD,eAErC,MAAM,CAAC,IAAAA,qBAAa,GAAE,EAAEC,4BAAoB,CAAC;AAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-file-manager-s3",
3
- "version": "0.0.0-unstable.d7f521b032",
3
+ "version": "0.0.0-unstable.ecd8734205",
4
4
  "main": "index.js",
5
5
  "repository": {
6
6
  "type": "git",
@@ -10,21 +10,21 @@
10
10
  "author": "Webiny Ltd",
11
11
  "license": "MIT",
12
12
  "dependencies": {
13
- "@webiny/api-file-manager": "0.0.0-unstable.d7f521b032",
14
- "@webiny/error": "0.0.0-unstable.d7f521b032",
15
- "@webiny/handler-graphql": "0.0.0-unstable.d7f521b032",
16
- "@webiny/validation": "0.0.0-unstable.d7f521b032",
13
+ "@webiny/api-file-manager": "0.0.0-unstable.ecd8734205",
14
+ "@webiny/error": "0.0.0-unstable.ecd8734205",
15
+ "@webiny/handler-graphql": "0.0.0-unstable.ecd8734205",
16
+ "@webiny/validation": "0.0.0-unstable.ecd8734205",
17
17
  "form-data": "4.0.0",
18
+ "mdbid": "1.0.0",
18
19
  "node-fetch": "2.6.9",
19
- "sanitize-filename": "1.6.3",
20
- "uniqid": "5.4.0"
20
+ "sanitize-filename": "1.6.3"
21
21
  },
22
22
  "devDependencies": {
23
23
  "@babel/cli": "^7.19.3",
24
24
  "@babel/core": "^7.19.3",
25
25
  "@types/node-fetch": "^2.6.1",
26
- "@webiny/cli": "^0.0.0-unstable.d7f521b032",
27
- "@webiny/project-utils": "^0.0.0-unstable.d7f521b032",
26
+ "@webiny/cli": "^0.0.0-unstable.ecd8734205",
27
+ "@webiny/project-utils": "^0.0.0-unstable.ecd8734205",
28
28
  "rimraf": "^3.0.2",
29
29
  "typescript": "4.7.4"
30
30
  },
@@ -36,5 +36,5 @@
36
36
  "build": "yarn webiny run build",
37
37
  "watch": "yarn webiny run watch"
38
38
  },
39
- "gitHead": "d7f521b0325964664dbeb6d2d07e2b6518e53841"
39
+ "gitHead": "ecd8734205e0e21ae04076c28ff9806dad07a730"
40
40
  }
@@ -1,25 +1,17 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = void 0;
9
-
10
8
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
11
-
12
9
  var _s = _interopRequireDefault(require("aws-sdk/clients/s3"));
13
-
14
10
  var _getPresignedPostPayload = _interopRequireDefault(require("../utils/getPresignedPostPayload"));
15
-
16
11
  var _uploadFileToS = _interopRequireDefault(require("../utils/uploadFileToS3"));
17
-
18
12
  var _FilePhysicalStoragePlugin = require("@webiny/api-file-manager/plugins/definitions/FilePhysicalStoragePlugin");
19
-
20
13
  const _excluded = ["settings", "buffer"];
21
14
  const S3_BUCKET = process.env.S3_BUCKET;
22
-
23
15
  var _default = () => {
24
16
  /**
25
17
  * We need to extends the type for FilePhysicalStoragePlugin.
@@ -28,20 +20,18 @@ var _default = () => {
28
20
  return new _FilePhysicalStoragePlugin.FilePhysicalStoragePlugin({
29
21
  upload: async params => {
30
22
  const {
31
- settings,
32
- buffer
33
- } = params,
34
- data = (0, _objectWithoutProperties2.default)(params, _excluded);
23
+ settings,
24
+ buffer
25
+ } = params,
26
+ data = (0, _objectWithoutProperties2.default)(params, _excluded);
35
27
  const {
36
28
  data: preSignedPostPayload,
37
29
  file
38
30
  } = await (0, _getPresignedPostPayload.default)(data, settings);
39
31
  const response = await (0, _uploadFileToS.default)(buffer, preSignedPostPayload);
40
-
41
32
  if (!response.ok) {
42
33
  throw Error("Unable to upload file.");
43
34
  }
44
-
45
35
  return {
46
36
  data: preSignedPostPayload,
47
37
  file
@@ -52,11 +42,9 @@ var _default = () => {
52
42
  key
53
43
  } = params;
54
44
  const s3 = new _s.default();
55
-
56
45
  if (!key || !S3_BUCKET) {
57
46
  return;
58
47
  }
59
-
60
48
  await s3.deleteObject({
61
49
  Bucket: S3_BUCKET,
62
50
  Key: key
@@ -64,5 +52,4 @@ var _default = () => {
64
52
  }
65
53
  });
66
54
  };
67
-
68
55
  exports.default = _default;
@@ -1 +1 @@
1
- {"version":3,"names":["S3_BUCKET","process","env","FilePhysicalStoragePlugin","upload","params","settings","buffer","data","preSignedPostPayload","file","getPresignedPostPayload","response","uploadFileToS3","ok","Error","delete","key","s3","S3","deleteObject","Bucket","Key","promise"],"sources":["fileStorageS3.ts"],"sourcesContent":["import S3 from \"aws-sdk/clients/s3\";\nimport getPresignedPostPayload from \"../utils/getPresignedPostPayload\";\nimport uploadFileToS3 from \"../utils/uploadFileToS3\";\nimport {\n FilePhysicalStoragePlugin,\n FilePhysicalStoragePluginUploadParams\n} from \"@webiny/api-file-manager/plugins/definitions/FilePhysicalStoragePlugin\";\nimport { PresignedPostPayloadData } from \"~/types\";\n\nconst S3_BUCKET = process.env.S3_BUCKET;\n\nexport interface S3FilePhysicalStoragePluginUploadParams\n extends FilePhysicalStoragePluginUploadParams,\n PresignedPostPayloadData {}\n\nexport default (): FilePhysicalStoragePlugin => {\n /**\n * We need to extends the type for FilePhysicalStoragePlugin.\n * Otherwise the getPresignedPostPayload does not know it has all required values in params.\n */\n return new FilePhysicalStoragePlugin<S3FilePhysicalStoragePluginUploadParams>({\n upload: async params => {\n const { settings, buffer, ...data } = params;\n\n const { data: preSignedPostPayload, file } = await getPresignedPostPayload(\n data,\n settings\n );\n\n const response = await uploadFileToS3(buffer, preSignedPostPayload);\n if (!response.ok) {\n throw Error(\"Unable to upload file.\");\n }\n\n return {\n data: preSignedPostPayload,\n file\n };\n },\n delete: async params => {\n const { key } = params;\n const s3 = new S3();\n\n if (!key || !S3_BUCKET) {\n return;\n }\n\n await s3\n .deleteObject({\n Bucket: S3_BUCKET,\n Key: key\n })\n .promise();\n }\n });\n};\n"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;;AAMA,MAAMA,SAAS,GAAGC,OAAO,CAACC,GAAR,CAAYF,SAA9B;;eAMe,MAAiC;EAC5C;AACJ;AACA;AACA;EACI,OAAO,IAAIG,oDAAJ,CAAuE;IAC1EC,MAAM,EAAE,MAAMC,MAAN,IAAgB;MACpB,MAAM;QAAEC,QAAF;QAAYC;MAAZ,IAAgCF,MAAtC;MAAA,MAA6BG,IAA7B,0CAAsCH,MAAtC;MAEA,MAAM;QAAEG,IAAI,EAAEC,oBAAR;QAA8BC;MAA9B,IAAuC,MAAM,IAAAC,gCAAA,EAC/CH,IAD+C,EAE/CF,QAF+C,CAAnD;MAKA,MAAMM,QAAQ,GAAG,MAAM,IAAAC,sBAAA,EAAeN,MAAf,EAAuBE,oBAAvB,CAAvB;;MACA,IAAI,CAACG,QAAQ,CAACE,EAAd,EAAkB;QACd,MAAMC,KAAK,CAAC,wBAAD,CAAX;MACH;;MAED,OAAO;QACHP,IAAI,EAAEC,oBADH;QAEHC;MAFG,CAAP;IAIH,CAlByE;IAmB1EM,MAAM,EAAE,MAAMX,MAAN,IAAgB;MACpB,MAAM;QAAEY;MAAF,IAAUZ,MAAhB;MACA,MAAMa,EAAE,GAAG,IAAIC,UAAJ,EAAX;;MAEA,IAAI,CAACF,GAAD,IAAQ,CAACjB,SAAb,EAAwB;QACpB;MACH;;MAED,MAAMkB,EAAE,CACHE,YADC,CACY;QACVC,MAAM,EAAErB,SADE;QAEVsB,GAAG,EAAEL;MAFK,CADZ,EAKDM,OALC,EAAN;IAMH;EAjCyE,CAAvE,CAAP;AAmCH,C"}
1
+ {"version":3,"names":["S3_BUCKET","process","env","FilePhysicalStoragePlugin","upload","params","settings","buffer","data","preSignedPostPayload","file","getPresignedPostPayload","response","uploadFileToS3","ok","Error","delete","key","s3","S3","deleteObject","Bucket","Key","promise"],"sources":["fileStorageS3.ts"],"sourcesContent":["import S3 from \"aws-sdk/clients/s3\";\nimport getPresignedPostPayload from \"../utils/getPresignedPostPayload\";\nimport uploadFileToS3 from \"../utils/uploadFileToS3\";\nimport {\n FilePhysicalStoragePlugin,\n FilePhysicalStoragePluginUploadParams\n} from \"@webiny/api-file-manager/plugins/definitions/FilePhysicalStoragePlugin\";\nimport { PresignedPostPayloadData } from \"~/types\";\n\nconst S3_BUCKET = process.env.S3_BUCKET;\n\nexport interface S3FilePhysicalStoragePluginUploadParams\n extends FilePhysicalStoragePluginUploadParams,\n PresignedPostPayloadData {}\n\nexport default (): FilePhysicalStoragePlugin => {\n /**\n * We need to extends the type for FilePhysicalStoragePlugin.\n * Otherwise the getPresignedPostPayload does not know it has all required values in params.\n */\n return new FilePhysicalStoragePlugin<S3FilePhysicalStoragePluginUploadParams>({\n upload: async params => {\n const { settings, buffer, ...data } = params;\n\n const { data: preSignedPostPayload, file } = await getPresignedPostPayload(\n data,\n settings\n );\n\n const response = await uploadFileToS3(buffer, preSignedPostPayload);\n if (!response.ok) {\n throw Error(\"Unable to upload file.\");\n }\n\n return {\n data: preSignedPostPayload,\n file\n };\n },\n delete: async params => {\n const { key } = params;\n const s3 = new S3();\n\n if (!key || !S3_BUCKET) {\n return;\n }\n\n await s3\n .deleteObject({\n Bucket: S3_BUCKET,\n Key: key\n })\n .promise();\n }\n });\n};\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AAGgF;AAGhF,MAAMA,SAAS,GAAGC,OAAO,CAACC,GAAG,CAACF,SAAS;AAAC,eAMzB,MAAiC;EAC5C;AACJ;AACA;AACA;EACI,OAAO,IAAIG,oDAAyB,CAA0C;IAC1EC,MAAM,EAAE,MAAMC,MAAM,IAAI;MACpB,MAAM;UAAEC,QAAQ;UAAEC;QAAgB,CAAC,GAAGF,MAAM;QAAfG,IAAI,0CAAKH,MAAM;MAE5C,MAAM;QAAEG,IAAI,EAAEC,oBAAoB;QAAEC;MAAK,CAAC,GAAG,MAAM,IAAAC,gCAAuB,EACtEH,IAAI,EACJF,QAAQ,CACX;MAED,MAAMM,QAAQ,GAAG,MAAM,IAAAC,sBAAc,EAACN,MAAM,EAAEE,oBAAoB,CAAC;MACnE,IAAI,CAACG,QAAQ,CAACE,EAAE,EAAE;QACd,MAAMC,KAAK,CAAC,wBAAwB,CAAC;MACzC;MAEA,OAAO;QACHP,IAAI,EAAEC,oBAAoB;QAC1BC;MACJ,CAAC;IACL,CAAC;IACDM,MAAM,EAAE,MAAMX,MAAM,IAAI;MACpB,MAAM;QAAEY;MAAI,CAAC,GAAGZ,MAAM;MACtB,MAAMa,EAAE,GAAG,IAAIC,UAAE,EAAE;MAEnB,IAAI,CAACF,GAAG,IAAI,CAACjB,SAAS,EAAE;QACpB;MACJ;MAEA,MAAMkB,EAAE,CACHE,YAAY,CAAC;QACVC,MAAM,EAAErB,SAAS;QACjBsB,GAAG,EAAEL;MACT,CAAC,CAAC,CACDM,OAAO,EAAE;IAClB;EACJ,CAAC,CAAC;AACN,CAAC;AAAA"}
@@ -1,28 +1,20 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = void 0;
9
-
10
8
  var _responses = require("@webiny/handler-graphql/responses");
11
-
12
9
  var _checkBasePermissions = _interopRequireDefault(require("@webiny/api-file-manager/plugins/crud/utils/checkBasePermissions"));
13
-
14
10
  var _getPresignedPostPayload = _interopRequireDefault(require("../utils/getPresignedPostPayload"));
15
-
16
11
  var _error = _interopRequireDefault(require("@webiny/error"));
17
-
18
12
  const BATCH_UPLOAD_MAX_FILES = 20;
19
13
  const plugin = {
20
14
  type: "graphql-schema",
21
15
  name: "graphql-schema-api-file-manager-s3",
22
16
  schema: {
23
- typeDefs:
24
- /* GraphQL */
25
- `
17
+ typeDefs: /* GraphQL */`
26
18
  input PreSignedPostPayloadInput {
27
19
  name: String!
28
20
  type: String!
@@ -30,10 +22,11 @@ const plugin = {
30
22
  }
31
23
 
32
24
  type GetPreSignedPostPayloadResponseDataFile {
33
- name: String
34
- type: String
35
- size: Int
36
- key: String
25
+ id: ID!
26
+ name: String!
27
+ type: String!
28
+ size: Int!
29
+ key: String!
37
30
  }
38
31
 
39
32
  type GetPreSignedPostPayloadResponseData {
@@ -72,13 +65,11 @@ const plugin = {
72
65
  data
73
66
  } = args;
74
67
  const settings = await context.fileManager.settings.getSettings();
75
-
76
68
  if (!settings) {
77
69
  throw new _error.default("Missing File Manager Settings.", "FILE_MANAGER_SETTINGS_ERROR", {
78
70
  file: data
79
71
  });
80
72
  }
81
-
82
73
  const response = await (0, _getPresignedPostPayload.default)(data, settings);
83
74
  return new _responses.Response(response);
84
75
  } catch (e) {
@@ -96,43 +87,35 @@ const plugin = {
96
87
  const {
97
88
  data: files
98
89
  } = args;
99
-
100
90
  if (!Array.isArray(files)) {
101
91
  return new _responses.ErrorResponse({
102
92
  code: "UPLOAD_FILES_NON_ARRAY",
103
93
  message: `"data" argument must be an array.`
104
94
  });
105
95
  }
106
-
107
96
  if (files.length === 0) {
108
97
  return new _responses.ErrorResponse({
109
98
  code: "UPLOAD_FILES_MIN_FILES",
110
99
  message: `"data" argument must contain at least one file.`
111
100
  });
112
101
  }
113
-
114
102
  if (files.length > BATCH_UPLOAD_MAX_FILES) {
115
103
  return new _responses.ErrorResponse({
116
104
  code: "UPLOAD_FILES_MAX_FILES",
117
105
  message: `"data" argument must not contain more than ${BATCH_UPLOAD_MAX_FILES} files.`
118
106
  });
119
107
  }
120
-
121
108
  try {
122
109
  const settings = await context.fileManager.settings.getSettings();
123
-
124
110
  if (!settings) {
125
111
  throw new _error.default("Missing File Manager Settings.", "FILE_MANAGER_SETTINGS_ERROR", {
126
112
  files
127
113
  });
128
114
  }
129
-
130
115
  const promises = [];
131
-
132
116
  for (const item of files) {
133
117
  promises.push((0, _getPresignedPostPayload.default)(item, settings));
134
118
  }
135
-
136
119
  return new _responses.Response(await Promise.all(promises));
137
120
  } catch (e) {
138
121
  return new _responses.ErrorResponse({
@@ -1 +1 @@
1
- {"version":3,"names":["BATCH_UPLOAD_MAX_FILES","plugin","type","name","schema","typeDefs","resolvers","FmQuery","getPreSignedPostPayload","_","args","context","checkBasePermissions","rwd","data","settings","fileManager","getSettings","WebinyError","file","response","getPresignedPostPayload","Response","e","ErrorResponse","message","code","getPreSignedPostPayloads","files","Array","isArray","length","promises","item","push","Promise","all"],"sources":["graphqlFileStorageS3.ts"],"sourcesContent":["import { GraphQLSchemaPlugin } from \"@webiny/handler-graphql/types\";\nimport { ErrorResponse, Response } from \"@webiny/handler-graphql/responses\";\nimport checkBasePermissions from \"@webiny/api-file-manager/plugins/crud/utils/checkBasePermissions\";\nimport { FileManagerContext } from \"@webiny/api-file-manager/types\";\nimport getPresignedPostPayload from \"../utils/getPresignedPostPayload\";\nimport WebinyError from \"@webiny/error\";\n\nconst BATCH_UPLOAD_MAX_FILES = 20;\n\nconst plugin: GraphQLSchemaPlugin<FileManagerContext> = {\n type: \"graphql-schema\",\n name: \"graphql-schema-api-file-manager-s3\",\n schema: {\n typeDefs: /* GraphQL */ `\n input PreSignedPostPayloadInput {\n name: String!\n type: String!\n size: Int!\n }\n\n type GetPreSignedPostPayloadResponseDataFile {\n name: String\n type: String\n size: Int\n key: String\n }\n\n type GetPreSignedPostPayloadResponseData {\n # Contains data that is necessary for initiating a file upload.\n data: JSON\n file: UploadFileResponseDataFile\n }\n\n type GetPreSignedPostPayloadResponse {\n error: FileError\n data: GetPreSignedPostPayloadResponseData\n }\n\n type GetPreSignedPostPayloadsResponse {\n error: FileError\n data: [GetPreSignedPostPayloadResponseData]!\n }\n\n extend type FmQuery {\n getPreSignedPostPayload(\n data: PreSignedPostPayloadInput!\n ): GetPreSignedPostPayloadResponse\n getPreSignedPostPayloads(\n data: [PreSignedPostPayloadInput]!\n ): GetPreSignedPostPayloadsResponse\n }\n `,\n resolvers: {\n FmQuery: {\n getPreSignedPostPayload: async (_, args: any, context) => {\n try {\n await checkBasePermissions(context, { rwd: \"w\" });\n\n const { data } = args;\n const settings = await context.fileManager.settings.getSettings();\n if (!settings) {\n throw new WebinyError(\n \"Missing File Manager Settings.\",\n \"FILE_MANAGER_SETTINGS_ERROR\",\n {\n file: data\n }\n );\n }\n const response = await getPresignedPostPayload(data, settings);\n\n return new Response(response);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n },\n getPreSignedPostPayloads: async (_, args: any, context) => {\n await checkBasePermissions(context, { rwd: \"w\" });\n\n const { data: files } = args;\n if (!Array.isArray(files)) {\n return new ErrorResponse({\n code: \"UPLOAD_FILES_NON_ARRAY\",\n message: `\"data\" argument must be an array.`\n });\n }\n\n if (files.length === 0) {\n return new ErrorResponse({\n code: \"UPLOAD_FILES_MIN_FILES\",\n message: `\"data\" argument must contain at least one file.`\n });\n }\n\n if (files.length > BATCH_UPLOAD_MAX_FILES) {\n return new ErrorResponse({\n code: \"UPLOAD_FILES_MAX_FILES\",\n message: `\"data\" argument must not contain more than ${BATCH_UPLOAD_MAX_FILES} files.`\n });\n }\n\n try {\n const settings = await context.fileManager.settings.getSettings();\n if (!settings) {\n throw new WebinyError(\n \"Missing File Manager Settings.\",\n \"FILE_MANAGER_SETTINGS_ERROR\",\n {\n files\n }\n );\n }\n\n const promises = [];\n for (const item of files) {\n promises.push(getPresignedPostPayload(item, settings));\n }\n\n return new Response(await Promise.all(promises));\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n }\n }\n }\n }\n};\n\nexport default plugin;\n"],"mappings":"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"}
1
+ {"version":3,"names":["BATCH_UPLOAD_MAX_FILES","plugin","type","name","schema","typeDefs","resolvers","FmQuery","getPreSignedPostPayload","_","args","context","checkBasePermissions","rwd","data","settings","fileManager","getSettings","WebinyError","file","response","getPresignedPostPayload","Response","e","ErrorResponse","message","code","getPreSignedPostPayloads","files","Array","isArray","length","promises","item","push","Promise","all"],"sources":["graphqlFileStorageS3.ts"],"sourcesContent":["import { GraphQLSchemaPlugin } from \"@webiny/handler-graphql/types\";\nimport { ErrorResponse, Response } from \"@webiny/handler-graphql/responses\";\nimport checkBasePermissions from \"@webiny/api-file-manager/plugins/crud/utils/checkBasePermissions\";\nimport { FileManagerContext } from \"@webiny/api-file-manager/types\";\nimport getPresignedPostPayload from \"../utils/getPresignedPostPayload\";\nimport WebinyError from \"@webiny/error\";\n\nconst BATCH_UPLOAD_MAX_FILES = 20;\n\nconst plugin: GraphQLSchemaPlugin<FileManagerContext> = {\n type: \"graphql-schema\",\n name: \"graphql-schema-api-file-manager-s3\",\n schema: {\n typeDefs: /* GraphQL */ `\n input PreSignedPostPayloadInput {\n name: String!\n type: String!\n size: Int!\n }\n\n type GetPreSignedPostPayloadResponseDataFile {\n id: ID!\n name: String!\n type: String!\n size: Int!\n key: String!\n }\n\n type GetPreSignedPostPayloadResponseData {\n # Contains data that is necessary for initiating a file upload.\n data: JSON\n file: UploadFileResponseDataFile\n }\n\n type GetPreSignedPostPayloadResponse {\n error: FileError\n data: GetPreSignedPostPayloadResponseData\n }\n\n type GetPreSignedPostPayloadsResponse {\n error: FileError\n data: [GetPreSignedPostPayloadResponseData]!\n }\n\n extend type FmQuery {\n getPreSignedPostPayload(\n data: PreSignedPostPayloadInput!\n ): GetPreSignedPostPayloadResponse\n getPreSignedPostPayloads(\n data: [PreSignedPostPayloadInput]!\n ): GetPreSignedPostPayloadsResponse\n }\n `,\n resolvers: {\n FmQuery: {\n getPreSignedPostPayload: async (_, args: any, context) => {\n try {\n await checkBasePermissions(context, { rwd: \"w\" });\n\n const { data } = args;\n const settings = await context.fileManager.settings.getSettings();\n if (!settings) {\n throw new WebinyError(\n \"Missing File Manager Settings.\",\n \"FILE_MANAGER_SETTINGS_ERROR\",\n {\n file: data\n }\n );\n }\n const response = await getPresignedPostPayload(data, settings);\n\n return new Response(response);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n },\n getPreSignedPostPayloads: async (_, args: any, context) => {\n await checkBasePermissions(context, { rwd: \"w\" });\n\n const { data: files } = args;\n if (!Array.isArray(files)) {\n return new ErrorResponse({\n code: \"UPLOAD_FILES_NON_ARRAY\",\n message: `\"data\" argument must be an array.`\n });\n }\n\n if (files.length === 0) {\n return new ErrorResponse({\n code: \"UPLOAD_FILES_MIN_FILES\",\n message: `\"data\" argument must contain at least one file.`\n });\n }\n\n if (files.length > BATCH_UPLOAD_MAX_FILES) {\n return new ErrorResponse({\n code: \"UPLOAD_FILES_MAX_FILES\",\n message: `\"data\" argument must not contain more than ${BATCH_UPLOAD_MAX_FILES} files.`\n });\n }\n\n try {\n const settings = await context.fileManager.settings.getSettings();\n if (!settings) {\n throw new WebinyError(\n \"Missing File Manager Settings.\",\n \"FILE_MANAGER_SETTINGS_ERROR\",\n {\n files\n }\n );\n }\n\n const promises = [];\n for (const item of files) {\n promises.push(getPresignedPostPayload(item, settings));\n }\n\n return new Response(await Promise.all(promises));\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n }\n }\n }\n }\n};\n\nexport default plugin;\n"],"mappings":"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"}
package/types.d.ts CHANGED
@@ -8,6 +8,7 @@ export interface PresignedPostPayloadData {
8
8
  export interface PresignedPostPayloadDataResponse {
9
9
  data: S3.PresignedPost;
10
10
  file: {
11
+ id: string;
11
12
  name: string;
12
13
  key: string;
13
14
  type: string;
package/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import S3 from \"aws-sdk/clients/s3\";\n\nexport interface PresignedPostPayloadData {\n name: string;\n type: string;\n size: number;\n keyPrefix: string;\n}\n\nexport interface PresignedPostPayloadDataResponse {\n data: S3.PresignedPost;\n file: {\n name: string;\n key: string;\n type: string;\n size: number;\n };\n}\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import S3 from \"aws-sdk/clients/s3\";\n\nexport interface PresignedPostPayloadData {\n name: string;\n type: string;\n size: number;\n keyPrefix: string;\n}\n\nexport interface PresignedPostPayloadDataResponse {\n data: S3.PresignedPost;\n file: {\n id: string;\n name: string;\n key: string;\n type: string;\n size: number;\n };\n}\n"],"mappings":""}
@@ -1,19 +1,15 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = void 0;
9
-
10
- var _uniqid = _interopRequireDefault(require("uniqid"));
11
-
8
+ var _mdbid = _interopRequireDefault(require("mdbid"));
12
9
  var _sanitizeFilename = _interopRequireDefault(require("sanitize-filename"));
13
-
14
10
  var _s = _interopRequireDefault(require("aws-sdk/clients/s3"));
15
-
16
11
  var _validation = require("@webiny/validation");
12
+ // @ts-ignore `mdbid` has no type declarations
17
13
 
18
14
  const S3_BUCKET = process.env.S3_BUCKET;
19
15
  const UPLOAD_MAX_FILE_SIZE_DEFAULT = 26214400; // 25MB
@@ -21,38 +17,32 @@ const UPLOAD_MAX_FILE_SIZE_DEFAULT = 26214400; // 25MB
21
17
  const sanitizeFileSizeValue = (value, defaultValue) => {
22
18
  try {
23
19
  _validation.validation.validateSync(value, "required,numeric,gte:0");
24
-
25
20
  return value;
26
21
  } catch (e) {
27
22
  // TODO @ts-refactor No need to log the error?
28
23
  return defaultValue;
29
24
  }
30
25
  };
31
-
32
26
  var _default = async (data, settings) => {
33
27
  // If type is missing, let's use the default "application/octet-stream" type,
34
28
  // which is also the default type that the Amazon S3 would use.
35
29
  if (!data.type) {
36
30
  data.type = "application/octet-stream";
37
31
  }
38
-
39
32
  const contentType = data.type;
40
-
41
33
  if (!contentType) {
42
34
  throw Error(`File's content type could not be resolved.`);
43
35
  }
44
-
36
+ const id = (0, _mdbid.default)();
45
37
  let key = (0, _sanitizeFilename.default)(data.name);
46
-
47
38
  if (key) {
48
- key = (0, _uniqid.default)() + "-" + key;
39
+ key = id + "/" + key;
49
40
  }
50
-
51
41
  if (data.keyPrefix) {
52
- key = `${(0, _sanitizeFilename.default)(data.keyPrefix)}-${key}`;
53
- } // Replace all whitespace.
54
-
42
+ key = `${(0, _sanitizeFilename.default)(data.keyPrefix)}${key}`;
43
+ }
55
44
 
45
+ // Replace all whitespace.
56
46
  key = key.replace(/\s/g, "");
57
47
  const uploadMinFileSize = sanitizeFileSizeValue(settings.uploadMinFileSize, 0);
58
48
  const uploadMaxFileSize = sanitizeFileSizeValue(settings.uploadMaxFileSize, UPLOAD_MAX_FILE_SIZE_DEFAULT);
@@ -66,22 +56,20 @@ var _default = async (data, settings) => {
66
56
  key
67
57
  }
68
58
  };
69
-
70
59
  if (params.Fields.key.startsWith("/")) {
71
60
  params.Fields.key = params.Fields.key.slice(1);
72
61
  }
73
-
74
62
  const s3 = new _s.default();
75
63
  const payload = s3.createPresignedPost(params);
76
64
  return {
77
65
  data: payload,
78
66
  file: {
79
- name: key,
67
+ id,
68
+ name: data.name,
80
69
  key,
81
70
  type: contentType,
82
71
  size: data.size
83
72
  }
84
73
  };
85
74
  };
86
-
87
75
  exports.default = _default;
@@ -1 +1 @@
1
- {"version":3,"names":["S3_BUCKET","process","env","UPLOAD_MAX_FILE_SIZE_DEFAULT","sanitizeFileSizeValue","value","defaultValue","validation","validateSync","e","data","settings","type","contentType","Error","key","sanitizeFilename","name","uniqueId","keyPrefix","replace","uploadMinFileSize","uploadMaxFileSize","params","Expires","Bucket","Conditions","Fields","startsWith","slice","s3","S3","payload","createPresignedPost","file","size"],"sources":["getPresignedPostPayload.ts"],"sourcesContent":["import uniqueId from \"uniqid\";\nimport sanitizeFilename from \"sanitize-filename\";\nimport S3 from \"aws-sdk/clients/s3\";\nimport { validation } from \"@webiny/validation\";\nimport { PresignedPostPayloadData, PresignedPostPayloadDataResponse } from \"~/types\";\nimport { FileManagerSettings } from \"@webiny/api-file-manager/types\";\n\nconst S3_BUCKET = process.env.S3_BUCKET;\nconst UPLOAD_MAX_FILE_SIZE_DEFAULT = 26214400; // 25MB\n\nconst sanitizeFileSizeValue = (value: number, defaultValue: number): number => {\n try {\n validation.validateSync(value, \"required,numeric,gte:0\");\n return value;\n } catch (e) {\n // TODO @ts-refactor No need to log the error?\n return defaultValue;\n }\n};\n\nexport default async (\n data: PresignedPostPayloadData,\n settings: FileManagerSettings\n): Promise<PresignedPostPayloadDataResponse> => {\n // If type is missing, let's use the default \"application/octet-stream\" type,\n // which is also the default type that the Amazon S3 would use.\n if (!data.type) {\n data.type = \"application/octet-stream\";\n }\n\n const contentType = data.type;\n if (!contentType) {\n throw Error(`File's content type could not be resolved.`);\n }\n\n let key = sanitizeFilename(data.name);\n if (key) {\n key = uniqueId() + \"-\" + key;\n }\n\n if (data.keyPrefix) {\n key = `${sanitizeFilename(data.keyPrefix)}-${key}`;\n }\n\n // Replace all whitespace.\n key = key.replace(/\\s/g, \"\");\n\n const uploadMinFileSize = sanitizeFileSizeValue(settings.uploadMinFileSize, 0);\n const uploadMaxFileSize = sanitizeFileSizeValue(\n settings.uploadMaxFileSize,\n UPLOAD_MAX_FILE_SIZE_DEFAULT\n );\n\n const params = {\n Expires: 60,\n Bucket: S3_BUCKET,\n Conditions: [[\"content-length-range\", uploadMinFileSize, uploadMaxFileSize]], // 0 Bytes - 25MB\n Fields: {\n \"Content-Type\": contentType,\n key\n }\n };\n\n if (params.Fields.key.startsWith(\"/\")) {\n params.Fields.key = params.Fields.key.slice(1);\n }\n\n const s3 = new S3();\n const payload = s3.createPresignedPost(params);\n\n return {\n data: payload,\n file: {\n name: key,\n key,\n type: contentType,\n size: data.size\n }\n };\n};\n"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AAIA,MAAMA,SAAS,GAAGC,OAAO,CAACC,GAAR,CAAYF,SAA9B;AACA,MAAMG,4BAA4B,GAAG,QAArC,C,CAA+C;;AAE/C,MAAMC,qBAAqB,GAAG,CAACC,KAAD,EAAgBC,YAAhB,KAAiD;EAC3E,IAAI;IACAC,sBAAA,CAAWC,YAAX,CAAwBH,KAAxB,EAA+B,wBAA/B;;IACA,OAAOA,KAAP;EACH,CAHD,CAGE,OAAOI,CAAP,EAAU;IACR;IACA,OAAOH,YAAP;EACH;AACJ,CARD;;eAUe,OACXI,IADW,EAEXC,QAFW,KAGiC;EAC5C;EACA;EACA,IAAI,CAACD,IAAI,CAACE,IAAV,EAAgB;IACZF,IAAI,CAACE,IAAL,GAAY,0BAAZ;EACH;;EAED,MAAMC,WAAW,GAAGH,IAAI,CAACE,IAAzB;;EACA,IAAI,CAACC,WAAL,EAAkB;IACd,MAAMC,KAAK,CAAE,4CAAF,CAAX;EACH;;EAED,IAAIC,GAAG,GAAG,IAAAC,yBAAA,EAAiBN,IAAI,CAACO,IAAtB,CAAV;;EACA,IAAIF,GAAJ,EAAS;IACLA,GAAG,GAAG,IAAAG,eAAA,MAAa,GAAb,GAAmBH,GAAzB;EACH;;EAED,IAAIL,IAAI,CAACS,SAAT,EAAoB;IAChBJ,GAAG,GAAI,GAAE,IAAAC,yBAAA,EAAiBN,IAAI,CAACS,SAAtB,CAAiC,IAAGJ,GAAI,EAAjD;EACH,CAnB2C,CAqB5C;;;EACAA,GAAG,GAAGA,GAAG,CAACK,OAAJ,CAAY,KAAZ,EAAmB,EAAnB,CAAN;EAEA,MAAMC,iBAAiB,GAAGjB,qBAAqB,CAACO,QAAQ,CAACU,iBAAV,EAA6B,CAA7B,CAA/C;EACA,MAAMC,iBAAiB,GAAGlB,qBAAqB,CAC3CO,QAAQ,CAACW,iBADkC,EAE3CnB,4BAF2C,CAA/C;EAKA,MAAMoB,MAAM,GAAG;IACXC,OAAO,EAAE,EADE;IAEXC,MAAM,EAAEzB,SAFG;IAGX0B,UAAU,EAAE,CAAC,CAAC,sBAAD,EAAyBL,iBAAzB,EAA4CC,iBAA5C,CAAD,CAHD;IAGmE;IAC9EK,MAAM,EAAE;MACJ,gBAAgBd,WADZ;MAEJE;IAFI;EAJG,CAAf;;EAUA,IAAIQ,MAAM,CAACI,MAAP,CAAcZ,GAAd,CAAkBa,UAAlB,CAA6B,GAA7B,CAAJ,EAAuC;IACnCL,MAAM,CAACI,MAAP,CAAcZ,GAAd,GAAoBQ,MAAM,CAACI,MAAP,CAAcZ,GAAd,CAAkBc,KAAlB,CAAwB,CAAxB,CAApB;EACH;;EAED,MAAMC,EAAE,GAAG,IAAIC,UAAJ,EAAX;EACA,MAAMC,OAAO,GAAGF,EAAE,CAACG,mBAAH,CAAuBV,MAAvB,CAAhB;EAEA,OAAO;IACHb,IAAI,EAAEsB,OADH;IAEHE,IAAI,EAAE;MACFjB,IAAI,EAAEF,GADJ;MAEFA,GAFE;MAGFH,IAAI,EAAEC,WAHJ;MAIFsB,IAAI,EAAEzB,IAAI,CAACyB;IAJT;EAFH,CAAP;AASH,C"}
1
+ {"version":3,"names":["S3_BUCKET","process","env","UPLOAD_MAX_FILE_SIZE_DEFAULT","sanitizeFileSizeValue","value","defaultValue","validation","validateSync","e","data","settings","type","contentType","Error","id","mdbid","key","sanitizeFilename","name","keyPrefix","replace","uploadMinFileSize","uploadMaxFileSize","params","Expires","Bucket","Conditions","Fields","startsWith","slice","s3","S3","payload","createPresignedPost","file","size"],"sources":["getPresignedPostPayload.ts"],"sourcesContent":["// @ts-ignore `mdbid` has no type declarations\nimport mdbid from \"mdbid\";\nimport sanitizeFilename from \"sanitize-filename\";\nimport S3 from \"aws-sdk/clients/s3\";\nimport { validation } from \"@webiny/validation\";\nimport { PresignedPostPayloadData, PresignedPostPayloadDataResponse } from \"~/types\";\nimport { FileManagerSettings } from \"@webiny/api-file-manager/types\";\n\nconst S3_BUCKET = process.env.S3_BUCKET;\nconst UPLOAD_MAX_FILE_SIZE_DEFAULT = 26214400; // 25MB\n\nconst sanitizeFileSizeValue = (value: number, defaultValue: number): number => {\n try {\n validation.validateSync(value, \"required,numeric,gte:0\");\n return value;\n } catch (e) {\n // TODO @ts-refactor No need to log the error?\n return defaultValue;\n }\n};\n\nexport default async (\n data: PresignedPostPayloadData,\n settings: FileManagerSettings\n): Promise<PresignedPostPayloadDataResponse> => {\n // If type is missing, let's use the default \"application/octet-stream\" type,\n // which is also the default type that the Amazon S3 would use.\n if (!data.type) {\n data.type = \"application/octet-stream\";\n }\n\n const contentType = data.type;\n if (!contentType) {\n throw Error(`File's content type could not be resolved.`);\n }\n\n const id = mdbid();\n let key = sanitizeFilename(data.name);\n if (key) {\n key = id + \"/\" + key;\n }\n\n if (data.keyPrefix) {\n key = `${sanitizeFilename(data.keyPrefix)}${key}`;\n }\n\n // Replace all whitespace.\n key = key.replace(/\\s/g, \"\");\n\n const uploadMinFileSize = sanitizeFileSizeValue(settings.uploadMinFileSize, 0);\n const uploadMaxFileSize = sanitizeFileSizeValue(\n settings.uploadMaxFileSize,\n UPLOAD_MAX_FILE_SIZE_DEFAULT\n );\n\n const params = {\n Expires: 60,\n Bucket: S3_BUCKET,\n Conditions: [[\"content-length-range\", uploadMinFileSize, uploadMaxFileSize]], // 0 Bytes - 25MB\n Fields: {\n \"Content-Type\": contentType,\n key\n }\n };\n\n if (params.Fields.key.startsWith(\"/\")) {\n params.Fields.key = params.Fields.key.slice(1);\n }\n\n const s3 = new S3();\n const payload = s3.createPresignedPost(params);\n\n return {\n data: payload,\n file: {\n id,\n name: data.name,\n key,\n type: contentType,\n size: data.size\n }\n };\n};\n"],"mappings":";;;;;;;AACA;AACA;AACA;AACA;AAJA;;AAQA,MAAMA,SAAS,GAAGC,OAAO,CAACC,GAAG,CAACF,SAAS;AACvC,MAAMG,4BAA4B,GAAG,QAAQ,CAAC,CAAC;;AAE/C,MAAMC,qBAAqB,GAAG,CAACC,KAAa,EAAEC,YAAoB,KAAa;EAC3E,IAAI;IACAC,sBAAU,CAACC,YAAY,CAACH,KAAK,EAAE,wBAAwB,CAAC;IACxD,OAAOA,KAAK;EAChB,CAAC,CAAC,OAAOI,CAAC,EAAE;IACR;IACA,OAAOH,YAAY;EACvB;AACJ,CAAC;AAAC,eAEa,OACXI,IAA8B,EAC9BC,QAA6B,KACe;EAC5C;EACA;EACA,IAAI,CAACD,IAAI,CAACE,IAAI,EAAE;IACZF,IAAI,CAACE,IAAI,GAAG,0BAA0B;EAC1C;EAEA,MAAMC,WAAW,GAAGH,IAAI,CAACE,IAAI;EAC7B,IAAI,CAACC,WAAW,EAAE;IACd,MAAMC,KAAK,CAAE,4CAA2C,CAAC;EAC7D;EAEA,MAAMC,EAAE,GAAG,IAAAC,cAAK,GAAE;EAClB,IAAIC,GAAG,GAAG,IAAAC,yBAAgB,EAACR,IAAI,CAACS,IAAI,CAAC;EACrC,IAAIF,GAAG,EAAE;IACLA,GAAG,GAAGF,EAAE,GAAG,GAAG,GAAGE,GAAG;EACxB;EAEA,IAAIP,IAAI,CAACU,SAAS,EAAE;IAChBH,GAAG,GAAI,GAAE,IAAAC,yBAAgB,EAACR,IAAI,CAACU,SAAS,CAAE,GAAEH,GAAI,EAAC;EACrD;;EAEA;EACAA,GAAG,GAAGA,GAAG,CAACI,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;EAE5B,MAAMC,iBAAiB,GAAGlB,qBAAqB,CAACO,QAAQ,CAACW,iBAAiB,EAAE,CAAC,CAAC;EAC9E,MAAMC,iBAAiB,GAAGnB,qBAAqB,CAC3CO,QAAQ,CAACY,iBAAiB,EAC1BpB,4BAA4B,CAC/B;EAED,MAAMqB,MAAM,GAAG;IACXC,OAAO,EAAE,EAAE;IACXC,MAAM,EAAE1B,SAAS;IACjB2B,UAAU,EAAE,CAAC,CAAC,sBAAsB,EAAEL,iBAAiB,EAAEC,iBAAiB,CAAC,CAAC;IAAE;IAC9EK,MAAM,EAAE;MACJ,cAAc,EAAEf,WAAW;MAC3BI;IACJ;EACJ,CAAC;EAED,IAAIO,MAAM,CAACI,MAAM,CAACX,GAAG,CAACY,UAAU,CAAC,GAAG,CAAC,EAAE;IACnCL,MAAM,CAACI,MAAM,CAACX,GAAG,GAAGO,MAAM,CAACI,MAAM,CAACX,GAAG,CAACa,KAAK,CAAC,CAAC,CAAC;EAClD;EAEA,MAAMC,EAAE,GAAG,IAAIC,UAAE,EAAE;EACnB,MAAMC,OAAO,GAAGF,EAAE,CAACG,mBAAmB,CAACV,MAAM,CAAC;EAE9C,OAAO;IACHd,IAAI,EAAEuB,OAAO;IACbE,IAAI,EAAE;MACFpB,EAAE;MACFI,IAAI,EAAET,IAAI,CAACS,IAAI;MACfF,GAAG;MACHL,IAAI,EAAEC,WAAW;MACjBuB,IAAI,EAAE1B,IAAI,CAAC0B;IACf;EACJ,CAAC;AACL,CAAC;AAAA"}
@@ -1,29 +1,24 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = void 0;
9
-
10
8
  var _formData = _interopRequireDefault(require("form-data"));
11
-
12
9
  var _nodeFetch = _interopRequireDefault(require("node-fetch"));
13
-
14
10
  var _default = async (buffer, preSignedPostPayload) => {
15
- const formData = new _formData.default(); // Add all pre signed payload field to "FormData".
16
-
11
+ const formData = new _formData.default();
12
+ // Add all pre signed payload field to "FormData".
17
13
  Object.keys(preSignedPostPayload.fields).forEach(key => {
18
14
  formData.append(key, preSignedPostPayload.fields[key]);
19
- }); // Add file content to "FormData".
20
-
21
- formData.append("file", buffer); // Finally make the upload request to S3.
22
-
15
+ });
16
+ // Add file content to "FormData".
17
+ formData.append("file", buffer);
18
+ // Finally make the upload request to S3.
23
19
  return (0, _nodeFetch.default)(preSignedPostPayload.url, {
24
20
  method: "POST",
25
21
  body: formData
26
22
  });
27
23
  };
28
-
29
24
  exports.default = _default;
@@ -1 +1 @@
1
- {"version":3,"names":["buffer","preSignedPostPayload","formData","FormData","Object","keys","fields","forEach","key","append","fetch","url","method","body"],"sources":["uploadFileToS3.ts"],"sourcesContent":["import FormData from \"form-data\";\nimport fetch, { Response } from \"node-fetch\";\nimport S3 from \"aws-sdk/clients/s3\";\n\nexport default async (\n buffer: Buffer,\n preSignedPostPayload: S3.PresignedPost\n): Promise<Response> => {\n const formData = new FormData();\n // Add all pre signed payload field to \"FormData\".\n Object.keys(preSignedPostPayload.fields).forEach(key => {\n formData.append(key, preSignedPostPayload.fields[key]);\n });\n // Add file content to \"FormData\".\n formData.append(\"file\", buffer);\n // Finally make the upload request to S3.\n return fetch(preSignedPostPayload.url, {\n method: \"POST\",\n body: formData\n });\n};\n"],"mappings":";;;;;;;;;AAAA;;AACA;;eAGe,OACXA,MADW,EAEXC,oBAFW,KAGS;EACpB,MAAMC,QAAQ,GAAG,IAAIC,iBAAJ,EAAjB,CADoB,CAEpB;;EACAC,MAAM,CAACC,IAAP,CAAYJ,oBAAoB,CAACK,MAAjC,EAAyCC,OAAzC,CAAiDC,GAAG,IAAI;IACpDN,QAAQ,CAACO,MAAT,CAAgBD,GAAhB,EAAqBP,oBAAoB,CAACK,MAArB,CAA4BE,GAA5B,CAArB;EACH,CAFD,EAHoB,CAMpB;;EACAN,QAAQ,CAACO,MAAT,CAAgB,MAAhB,EAAwBT,MAAxB,EAPoB,CAQpB;;EACA,OAAO,IAAAU,kBAAA,EAAMT,oBAAoB,CAACU,GAA3B,EAAgC;IACnCC,MAAM,EAAE,MAD2B;IAEnCC,IAAI,EAAEX;EAF6B,CAAhC,CAAP;AAIH,C"}
1
+ {"version":3,"names":["buffer","preSignedPostPayload","formData","FormData","Object","keys","fields","forEach","key","append","fetch","url","method","body"],"sources":["uploadFileToS3.ts"],"sourcesContent":["import FormData from \"form-data\";\nimport fetch, { Response } from \"node-fetch\";\nimport S3 from \"aws-sdk/clients/s3\";\n\nexport default async (\n buffer: Buffer,\n preSignedPostPayload: S3.PresignedPost\n): Promise<Response> => {\n const formData = new FormData();\n // Add all pre signed payload field to \"FormData\".\n Object.keys(preSignedPostPayload.fields).forEach(key => {\n formData.append(key, preSignedPostPayload.fields[key]);\n });\n // Add file content to \"FormData\".\n formData.append(\"file\", buffer);\n // Finally make the upload request to S3.\n return fetch(preSignedPostPayload.url, {\n method: \"POST\",\n body: formData\n });\n};\n"],"mappings":";;;;;;;AAAA;AACA;AAA6C,eAG9B,OACXA,MAAc,EACdC,oBAAsC,KAClB;EACpB,MAAMC,QAAQ,GAAG,IAAIC,iBAAQ,EAAE;EAC/B;EACAC,MAAM,CAACC,IAAI,CAACJ,oBAAoB,CAACK,MAAM,CAAC,CAACC,OAAO,CAACC,GAAG,IAAI;IACpDN,QAAQ,CAACO,MAAM,CAACD,GAAG,EAAEP,oBAAoB,CAACK,MAAM,CAACE,GAAG,CAAC,CAAC;EAC1D,CAAC,CAAC;EACF;EACAN,QAAQ,CAACO,MAAM,CAAC,MAAM,EAAET,MAAM,CAAC;EAC/B;EACA,OAAO,IAAAU,kBAAK,EAACT,oBAAoB,CAACU,GAAG,EAAE;IACnCC,MAAM,EAAE,MAAM;IACdC,IAAI,EAAEX;EACV,CAAC,CAAC;AACN,CAAC;AAAA"}