@webiny/app-file-manager-s3 5.44.1-beta.0 → 5.45.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.
@@ -1,4 +1,4 @@
1
- import { UploadedFile } from "@webiny/app/types";
1
+ import type { UploadedFile } from "@webiny/app/types.js";
2
2
  export interface CreateUploadParams {
3
3
  data: {
4
4
  size: number;
@@ -1,7 +1,3 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
1
+ export {};
6
2
 
7
3
  //# sourceMappingURL=MultiPartUploadAPI.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["MultiPartUploadAPI.ts"],"sourcesContent":["import { UploadedFile } from \"@webiny/app/types\";\n\nexport interface CreateUploadParams {\n data: {\n size: number;\n name: string;\n type: string;\n };\n numberOfParts: number;\n}\n\nexport interface CompleteUploadParams {\n fileKey: string;\n uploadId: string;\n}\n\nexport interface FilePart {\n partNumber: number;\n url: string;\n}\n\nexport interface MultiPartUpload {\n file: UploadedFile;\n uploadId: string;\n parts: FilePart[];\n}\n\nexport interface MultiPartUploadAPI {\n createUpload(params: CreateUploadParams): Promise<MultiPartUpload>;\n completeUpload(params: CompleteUploadParams): Promise<boolean>;\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["MultiPartUploadAPI.ts"],"sourcesContent":["import type { UploadedFile } from \"@webiny/app/types.js\";\n\nexport interface CreateUploadParams {\n data: {\n size: number;\n name: string;\n type: string;\n };\n numberOfParts: number;\n}\n\nexport interface CompleteUploadParams {\n fileKey: string;\n uploadId: string;\n}\n\nexport interface FilePart {\n partNumber: number;\n url: string;\n}\n\nexport interface MultiPartUpload {\n file: UploadedFile;\n uploadId: string;\n parts: FilePart[];\n}\n\nexport interface MultiPartUploadAPI {\n createUpload(params: CreateUploadParams): Promise<MultiPartUpload>;\n completeUpload(params: CompleteUploadParams): Promise<boolean>;\n}\n"],"mappings":"","ignoreList":[]}
@@ -1,5 +1,5 @@
1
- import { UploadOptions } from "@webiny/app/types";
2
- import { CompleteUploadParams, CreateUploadParams, MultiPartUpload, MultiPartUploadAPI } from "./MultiPartUploadAPI";
1
+ import type { UploadOptions } from "@webiny/app/types.js";
2
+ import type { CompleteUploadParams, CreateUploadParams, MultiPartUpload, MultiPartUploadAPI } from "./MultiPartUploadAPI.js";
3
3
  export declare class MultiPartUploadGraphQLAPI implements MultiPartUploadAPI {
4
4
  private client;
5
5
  constructor(client: UploadOptions["apolloClient"]);
@@ -1,53 +1,77 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.MultiPartUploadGraphQLAPI = void 0;
8
- var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
9
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
11
- var _graphqlTag = _interopRequireDefault(require("graphql-tag"));
12
- var _templateObject, _templateObject2;
13
- var MultiPartUploadGraphQLAPI = exports.MultiPartUploadGraphQLAPI = /*#__PURE__*/function () {
14
- function MultiPartUploadGraphQLAPI(client) {
15
- (0, _classCallCheck2.default)(this, MultiPartUploadGraphQLAPI);
1
+ import gql from "graphql-tag";
2
+ export class MultiPartUploadGraphQLAPI {
3
+ constructor(client) {
16
4
  this.client = client;
17
5
  }
18
- return (0, _createClass2.default)(MultiPartUploadGraphQLAPI, [{
19
- key: "createUpload",
20
- value: async function createUpload(params) {
21
- var _await$this$client$mu = await this.client.mutate({
22
- mutation: CREATE_UPLOAD,
23
- variables: params
24
- }),
25
- data = _await$this$client$mu.data,
26
- errors = _await$this$client$mu.errors;
27
- if (!data) {
28
- console.error(errors);
29
- throw new Error("Failed to initialize a multi-part file upload!");
30
- }
31
- return data.fileManager.createMultiPartUpload.data;
6
+ async createUpload(params) {
7
+ const {
8
+ data,
9
+ errors
10
+ } = await this.client.mutate({
11
+ mutation: CREATE_UPLOAD,
12
+ variables: params
13
+ });
14
+ if (!data) {
15
+ console.error(errors);
16
+ throw new Error(`Failed to initialize a multi-part file upload!`);
17
+ }
18
+ return data.fileManager.createMultiPartUpload.data;
19
+ }
20
+ async completeUpload(params) {
21
+ const {
22
+ data,
23
+ errors
24
+ } = await this.client.mutate({
25
+ mutation: COMPLETE_UPLOAD,
26
+ variables: params
27
+ });
28
+ if (!data) {
29
+ console.error(errors);
30
+ throw new Error(`Failed to complete a multi-part file upload!`);
31
+ }
32
+ return data.fileManager.completeMultiPartUpload.data;
33
+ }
34
+ }
35
+ const CREATE_UPLOAD = gql`
36
+ mutation CreateMultiPartUpload($data: PreSignedPostPayloadInput!, $numberOfParts: Number!) {
37
+ fileManager {
38
+ createMultiPartUpload(data: $data, numberOfParts: $numberOfParts) {
39
+ data {
40
+ file {
41
+ id
42
+ key
43
+ name
44
+ size
45
+ type
46
+ }
47
+ uploadId
48
+ parts {
49
+ partNumber
50
+ url
51
+ }
52
+ }
53
+ error {
54
+ code
55
+ message
56
+ data
57
+ }
58
+ }
59
+ }
32
60
  }
33
- }, {
34
- key: "completeUpload",
35
- value: async function completeUpload(params) {
36
- var _await$this$client$mu2 = await this.client.mutate({
37
- mutation: COMPLETE_UPLOAD,
38
- variables: params
39
- }),
40
- data = _await$this$client$mu2.data,
41
- errors = _await$this$client$mu2.errors;
42
- if (!data) {
43
- console.error(errors);
44
- throw new Error("Failed to complete a multi-part file upload!");
45
- }
46
- return data.fileManager.completeMultiPartUpload.data;
61
+ `;
62
+ const COMPLETE_UPLOAD = gql`
63
+ mutation CompleteMultiPartUpload($fileKey: String!, $uploadId: String!) {
64
+ fileManager {
65
+ completeMultiPartUpload(fileKey: $fileKey, uploadId: $uploadId) {
66
+ data
67
+ error {
68
+ code
69
+ message
70
+ data
71
+ }
72
+ }
73
+ }
47
74
  }
48
- }]);
49
- }();
50
- var CREATE_UPLOAD = (0, _graphqlTag.default)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n mutation CreateMultiPartUpload($data: PreSignedPostPayloadInput!, $numberOfParts: Number!) {\n fileManager {\n createMultiPartUpload(data: $data, numberOfParts: $numberOfParts) {\n data {\n file {\n id\n key\n name\n size\n type\n }\n uploadId\n parts {\n partNumber\n url\n }\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n"])));
51
- var COMPLETE_UPLOAD = (0, _graphqlTag.default)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n mutation CompleteMultiPartUpload($fileKey: String!, $uploadId: String!) {\n fileManager {\n completeMultiPartUpload(fileKey: $fileKey, uploadId: $uploadId) {\n data\n error {\n code\n message\n data\n }\n }\n }\n }\n"])));
75
+ `;
52
76
 
53
77
  //# sourceMappingURL=MultiPartUploadGraphQLAPI.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_graphqlTag","_interopRequireDefault","require","_templateObject","_templateObject2","MultiPartUploadGraphQLAPI","exports","client","_classCallCheck2","default","_createClass2","key","value","createUpload","params","_await$this$client$mu","mutate","mutation","CREATE_UPLOAD","variables","data","errors","console","error","Error","fileManager","createMultiPartUpload","completeUpload","_await$this$client$mu2","COMPLETE_UPLOAD","completeMultiPartUpload","gql","_taggedTemplateLiteral2"],"sources":["MultiPartUploadGraphQLAPI.ts"],"sourcesContent":["import { UploadOptions } from \"@webiny/app/types\";\nimport gql from \"graphql-tag\";\nimport {\n CompleteUploadParams,\n CreateUploadParams,\n MultiPartUpload,\n MultiPartUploadAPI\n} from \"~/MultiPartUploadAPI\";\n\nexport class MultiPartUploadGraphQLAPI implements MultiPartUploadAPI {\n private client: UploadOptions[\"apolloClient\"];\n\n constructor(client: UploadOptions[\"apolloClient\"]) {\n this.client = client;\n }\n\n async createUpload(params: CreateUploadParams): Promise<MultiPartUpload> {\n const { data, errors } = await this.client.mutate<CreateUploadResponse>({\n mutation: CREATE_UPLOAD,\n variables: params\n });\n\n if (!data) {\n console.error(errors);\n throw new Error(`Failed to initialize a multi-part file upload!`);\n }\n\n return data.fileManager.createMultiPartUpload.data;\n }\n\n async completeUpload(params: CompleteUploadParams): Promise<boolean> {\n const { data, errors } = await this.client.mutate<CompleteUploadResponse>({\n mutation: COMPLETE_UPLOAD,\n variables: params\n });\n\n if (!data) {\n console.error(errors);\n throw new Error(`Failed to complete a multi-part file upload!`);\n }\n\n return data.fileManager.completeMultiPartUpload.data;\n }\n}\n\nconst CREATE_UPLOAD = gql`\n mutation CreateMultiPartUpload($data: PreSignedPostPayloadInput!, $numberOfParts: Number!) {\n fileManager {\n createMultiPartUpload(data: $data, numberOfParts: $numberOfParts) {\n data {\n file {\n id\n key\n name\n size\n type\n }\n uploadId\n parts {\n partNumber\n url\n }\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n\ninterface CreateUploadResponse {\n fileManager: {\n createMultiPartUpload: {\n data: MultiPartUpload;\n error: {\n code: string;\n message: string;\n data: Record<string, any>;\n };\n };\n };\n}\n\nconst COMPLETE_UPLOAD = gql`\n mutation CompleteMultiPartUpload($fileKey: String!, $uploadId: String!) {\n fileManager {\n completeMultiPartUpload(fileKey: $fileKey, uploadId: $uploadId) {\n data\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n\ninterface CompleteUploadResponse {\n fileManager: {\n completeMultiPartUpload: {\n data: boolean;\n error: {\n code: string;\n message: string;\n data: Record<string, any>;\n };\n };\n };\n}\n"],"mappings":";;;;;;;;;;AACA,IAAAA,WAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA8B,IAAAC,eAAA,EAAAC,gBAAA;AAAA,IAQjBC,yBAAyB,GAAAC,OAAA,CAAAD,yBAAA;EAGlC,SAAAA,0BAAYE,MAAqC,EAAE;IAAA,IAAAC,gBAAA,CAAAC,OAAA,QAAAJ,yBAAA;IAC/C,IAAI,CAACE,MAAM,GAAGA,MAAM;EACxB;EAAC,WAAAG,aAAA,CAAAD,OAAA,EAAAJ,yBAAA;IAAAM,GAAA;IAAAC,KAAA,EAED,eAAMC,YAAYA,CAACC,MAA0B,EAA4B;MACrE,IAAAC,qBAAA,GAAyB,MAAM,IAAI,CAACR,MAAM,CAACS,MAAM,CAAuB;UACpEC,QAAQ,EAAEC,aAAa;UACvBC,SAAS,EAAEL;QACf,CAAC,CAAC;QAHMM,IAAI,GAAAL,qBAAA,CAAJK,IAAI;QAAEC,MAAM,GAAAN,qBAAA,CAANM,MAAM;MAKpB,IAAI,CAACD,IAAI,EAAE;QACPE,OAAO,CAACC,KAAK,CAACF,MAAM,CAAC;QACrB,MAAM,IAAIG,KAAK,iDAAiD,CAAC;MACrE;MAEA,OAAOJ,IAAI,CAACK,WAAW,CAACC,qBAAqB,CAACN,IAAI;IACtD;EAAC;IAAAT,GAAA;IAAAC,KAAA,EAED,eAAMe,cAAcA,CAACb,MAA4B,EAAoB;MACjE,IAAAc,sBAAA,GAAyB,MAAM,IAAI,CAACrB,MAAM,CAACS,MAAM,CAAyB;UACtEC,QAAQ,EAAEY,eAAe;UACzBV,SAAS,EAAEL;QACf,CAAC,CAAC;QAHMM,IAAI,GAAAQ,sBAAA,CAAJR,IAAI;QAAEC,MAAM,GAAAO,sBAAA,CAANP,MAAM;MAKpB,IAAI,CAACD,IAAI,EAAE;QACPE,OAAO,CAACC,KAAK,CAACF,MAAM,CAAC;QACrB,MAAM,IAAIG,KAAK,+CAA+C,CAAC;MACnE;MAEA,OAAOJ,IAAI,CAACK,WAAW,CAACK,uBAAuB,CAACV,IAAI;IACxD;EAAC;AAAA;AAGL,IAAMF,aAAa,OAAGa,mBAAG,EAAA5B,eAAA,KAAAA,eAAA,OAAA6B,uBAAA,CAAAvB,OAAA,uvBA0BxB;AAeD,IAAMoB,eAAe,OAAGE,mBAAG,EAAA3B,gBAAA,KAAAA,gBAAA,OAAA4B,uBAAA,CAAAvB,OAAA,oXAa1B","ignoreList":[]}
1
+ {"version":3,"names":["gql","MultiPartUploadGraphQLAPI","constructor","client","createUpload","params","data","errors","mutate","mutation","CREATE_UPLOAD","variables","console","error","Error","fileManager","createMultiPartUpload","completeUpload","COMPLETE_UPLOAD","completeMultiPartUpload"],"sources":["MultiPartUploadGraphQLAPI.ts"],"sourcesContent":["import type { UploadOptions } from \"@webiny/app/types.js\";\nimport gql from \"graphql-tag\";\nimport type {\n CompleteUploadParams,\n CreateUploadParams,\n MultiPartUpload,\n MultiPartUploadAPI\n} from \"~/MultiPartUploadAPI.js\";\n\nexport class MultiPartUploadGraphQLAPI implements MultiPartUploadAPI {\n private client: UploadOptions[\"apolloClient\"];\n\n constructor(client: UploadOptions[\"apolloClient\"]) {\n this.client = client;\n }\n\n async createUpload(params: CreateUploadParams): Promise<MultiPartUpload> {\n const { data, errors } = await this.client.mutate<CreateUploadResponse>({\n mutation: CREATE_UPLOAD,\n variables: params\n });\n\n if (!data) {\n console.error(errors);\n throw new Error(`Failed to initialize a multi-part file upload!`);\n }\n\n return data.fileManager.createMultiPartUpload.data;\n }\n\n async completeUpload(params: CompleteUploadParams): Promise<boolean> {\n const { data, errors } = await this.client.mutate<CompleteUploadResponse>({\n mutation: COMPLETE_UPLOAD,\n variables: params\n });\n\n if (!data) {\n console.error(errors);\n throw new Error(`Failed to complete a multi-part file upload!`);\n }\n\n return data.fileManager.completeMultiPartUpload.data;\n }\n}\n\nconst CREATE_UPLOAD = gql`\n mutation CreateMultiPartUpload($data: PreSignedPostPayloadInput!, $numberOfParts: Number!) {\n fileManager {\n createMultiPartUpload(data: $data, numberOfParts: $numberOfParts) {\n data {\n file {\n id\n key\n name\n size\n type\n }\n uploadId\n parts {\n partNumber\n url\n }\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n\ninterface CreateUploadResponse {\n fileManager: {\n createMultiPartUpload: {\n data: MultiPartUpload;\n error: {\n code: string;\n message: string;\n data: Record<string, any>;\n };\n };\n };\n}\n\nconst COMPLETE_UPLOAD = gql`\n mutation CompleteMultiPartUpload($fileKey: String!, $uploadId: String!) {\n fileManager {\n completeMultiPartUpload(fileKey: $fileKey, uploadId: $uploadId) {\n data\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n\ninterface CompleteUploadResponse {\n fileManager: {\n completeMultiPartUpload: {\n data: boolean;\n error: {\n code: string;\n message: string;\n data: Record<string, any>;\n };\n };\n };\n}\n"],"mappings":"AACA,OAAOA,GAAG,MAAM,aAAa;AAQ7B,OAAO,MAAMC,yBAAyB,CAA+B;EAGjEC,WAAWA,CAACC,MAAqC,EAAE;IAC/C,IAAI,CAACA,MAAM,GAAGA,MAAM;EACxB;EAEA,MAAMC,YAAYA,CAACC,MAA0B,EAA4B;IACrE,MAAM;MAAEC,IAAI;MAAEC;IAAO,CAAC,GAAG,MAAM,IAAI,CAACJ,MAAM,CAACK,MAAM,CAAuB;MACpEC,QAAQ,EAAEC,aAAa;MACvBC,SAAS,EAAEN;IACf,CAAC,CAAC;IAEF,IAAI,CAACC,IAAI,EAAE;MACPM,OAAO,CAACC,KAAK,CAACN,MAAM,CAAC;MACrB,MAAM,IAAIO,KAAK,CAAC,gDAAgD,CAAC;IACrE;IAEA,OAAOR,IAAI,CAACS,WAAW,CAACC,qBAAqB,CAACV,IAAI;EACtD;EAEA,MAAMW,cAAcA,CAACZ,MAA4B,EAAoB;IACjE,MAAM;MAAEC,IAAI;MAAEC;IAAO,CAAC,GAAG,MAAM,IAAI,CAACJ,MAAM,CAACK,MAAM,CAAyB;MACtEC,QAAQ,EAAES,eAAe;MACzBP,SAAS,EAAEN;IACf,CAAC,CAAC;IAEF,IAAI,CAACC,IAAI,EAAE;MACPM,OAAO,CAACC,KAAK,CAACN,MAAM,CAAC;MACrB,MAAM,IAAIO,KAAK,CAAC,8CAA8C,CAAC;IACnE;IAEA,OAAOR,IAAI,CAACS,WAAW,CAACI,uBAAuB,CAACb,IAAI;EACxD;AACJ;AAEA,MAAMI,aAAa,GAAGV,GAAG;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAeD,MAAMkB,eAAe,GAAGlB,GAAG;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC","ignoreList":[]}
@@ -1,5 +1,5 @@
1
- import { UploadedFile, UploadOptions } from "@webiny/app/types";
2
- import { FileUploadStrategy } from "./index";
1
+ import type { UploadedFile, UploadOptions } from "@webiny/app/types.js";
2
+ import type { FileUploadStrategy } from "./index.js";
3
3
  export declare class MultiPartUploadStrategy implements FileUploadStrategy {
4
4
  upload(file: File, options: UploadOptions): Promise<UploadedFile>;
5
5
  private detectChunkSize;
@@ -1,66 +1,47 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.MultiPartUploadStrategy = void 0;
8
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
9
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
10
- var _MultiPartUploader = require("./MultiPartUploader");
11
- var _MultiPartUploadGraphQLAPI = require("./MultiPartUploadGraphQLAPI");
12
- var MultiPartUploadStrategy = exports.MultiPartUploadStrategy = /*#__PURE__*/function () {
13
- function MultiPartUploadStrategy() {
14
- (0, _classCallCheck2.default)(this, MultiPartUploadStrategy);
15
- }
16
- return (0, _createClass2.default)(MultiPartUploadStrategy, [{
17
- key: "upload",
18
- value: async function upload(file, options) {
19
- var api = new _MultiPartUploadGraphQLAPI.MultiPartUploadGraphQLAPI(options.apolloClient);
20
- var uploader = new _MultiPartUploader.MultiPartUploader(api, {
21
- chunkSize: this.detectChunkSize(),
22
- parallelUploads: this.detectParallelChunks()
23
- });
24
- if (options.onProgress) {
25
- uploader.onProgress(options.onProgress);
26
- }
27
- return uploader.uploadFile(file);
1
+ import { MultiPartUploader } from "./MultiPartUploader.js";
2
+ import { MultiPartUploadGraphQLAPI } from "./MultiPartUploadGraphQLAPI.js";
3
+ export class MultiPartUploadStrategy {
4
+ async upload(file, options) {
5
+ const api = new MultiPartUploadGraphQLAPI(options.apolloClient);
6
+ const uploader = new MultiPartUploader(api, {
7
+ chunkSize: this.detectChunkSize(),
8
+ parallelUploads: this.detectParallelChunks()
9
+ });
10
+ if (options.onProgress) {
11
+ uploader.onProgress(options.onProgress);
28
12
  }
29
- }, {
30
- key: "detectChunkSize",
31
- value: function detectChunkSize() {
32
- var envSize = parseInt(process.env.WEBINY_FILE_UPLOAD_CHUNK_SIZE || "0");
13
+ return uploader.uploadFile(file);
14
+ }
15
+ detectChunkSize() {
16
+ const envSize = parseInt(process.env.WEBINY_FILE_UPLOAD_CHUNK_SIZE || "0");
33
17
 
34
- // For dev purposes, we take this global var into consideration.
35
- if (process.env.NODE_ENV === "development") {
36
- // @ts-expect-error
37
- var windowSize = window["fmUploadChunkSize"];
38
- if (windowSize) {
39
- return windowSize;
40
- }
18
+ // For dev purposes, we take this global var into consideration.
19
+ if (process.env.NODE_ENV === "development") {
20
+ // @ts-expect-error
21
+ const windowSize = window["fmUploadChunkSize"];
22
+ if (windowSize) {
23
+ return windowSize;
41
24
  }
42
-
43
- // As a last resort, we check the baked in value, or fall back to 50MB chunk size.
44
- return envSize || 50;
45
25
  }
46
- }, {
47
- key: "detectParallelChunks",
48
- value: function detectParallelChunks() {
49
- var envChunks = parseInt(process.env.WEBINY_FILE_UPLOAD_PARALLEL_CHUNKS || "0");
50
26
 
51
- // For dev purposes, we take this global var into consideration.
52
- if (process.env.NODE_ENV === "development") {
53
- // @ts-expect-error
54
- var windowChunks = window["fmUploadParallelChunks"];
55
- if (windowChunks) {
56
- return windowChunks;
57
- }
58
- }
27
+ // As a last resort, we check the baked in value, or fall back to 50MB chunk size.
28
+ return envSize || 50;
29
+ }
30
+ detectParallelChunks() {
31
+ const envChunks = parseInt(process.env.WEBINY_FILE_UPLOAD_PARALLEL_CHUNKS || "0");
59
32
 
60
- // As a last resort, we check the baked in value, or fall back to 5 parallel chunks.
61
- return envChunks || 5;
33
+ // For dev purposes, we take this global var into consideration.
34
+ if (process.env.NODE_ENV === "development") {
35
+ // @ts-expect-error
36
+ const windowChunks = window["fmUploadParallelChunks"];
37
+ if (windowChunks) {
38
+ return windowChunks;
39
+ }
62
40
  }
63
- }]);
64
- }();
41
+
42
+ // As a last resort, we check the baked in value, or fall back to 5 parallel chunks.
43
+ return envChunks || 5;
44
+ }
45
+ }
65
46
 
66
47
  //# sourceMappingURL=MultiPartUploadStrategy.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_MultiPartUploader","require","_MultiPartUploadGraphQLAPI","MultiPartUploadStrategy","exports","_classCallCheck2","default","_createClass2","key","value","upload","file","options","api","MultiPartUploadGraphQLAPI","apolloClient","uploader","MultiPartUploader","chunkSize","detectChunkSize","parallelUploads","detectParallelChunks","onProgress","uploadFile","envSize","parseInt","process","env","WEBINY_FILE_UPLOAD_CHUNK_SIZE","NODE_ENV","windowSize","window","envChunks","WEBINY_FILE_UPLOAD_PARALLEL_CHUNKS","windowChunks"],"sources":["MultiPartUploadStrategy.ts"],"sourcesContent":["import { UploadedFile, UploadOptions } from \"@webiny/app/types\";\nimport { FileUploadStrategy } from \"~/index\";\nimport { MultiPartUploader } from \"~/MultiPartUploader\";\nimport { MultiPartUploadGraphQLAPI } from \"~/MultiPartUploadGraphQLAPI\";\n\nexport class MultiPartUploadStrategy implements FileUploadStrategy {\n async upload(file: File, options: UploadOptions): Promise<UploadedFile> {\n const api = new MultiPartUploadGraphQLAPI(options.apolloClient);\n\n const uploader = new MultiPartUploader(api, {\n chunkSize: this.detectChunkSize(),\n parallelUploads: this.detectParallelChunks()\n });\n\n if (options.onProgress) {\n uploader.onProgress(options.onProgress);\n }\n return uploader.uploadFile(file);\n }\n\n private detectChunkSize(): number {\n const envSize = parseInt(process.env.WEBINY_FILE_UPLOAD_CHUNK_SIZE || \"0\");\n\n // For dev purposes, we take this global var into consideration.\n if (process.env.NODE_ENV === \"development\") {\n // @ts-expect-error\n const windowSize = window[\"fmUploadChunkSize\"];\n if (windowSize) {\n return windowSize;\n }\n }\n\n // As a last resort, we check the baked in value, or fall back to 50MB chunk size.\n return envSize || 50;\n }\n\n private detectParallelChunks(): number {\n const envChunks = parseInt(process.env.WEBINY_FILE_UPLOAD_PARALLEL_CHUNKS || \"0\");\n\n // For dev purposes, we take this global var into consideration.\n if (process.env.NODE_ENV === \"development\") {\n // @ts-expect-error\n const windowChunks = window[\"fmUploadParallelChunks\"];\n if (windowChunks) {\n return windowChunks;\n }\n }\n\n // As a last resort, we check the baked in value, or fall back to 5 parallel chunks.\n return envChunks || 5;\n }\n}\n"],"mappings":";;;;;;;;;AAEA,IAAAA,kBAAA,GAAAC,OAAA;AACA,IAAAC,0BAAA,GAAAD,OAAA;AAAwE,IAE3DE,uBAAuB,GAAAC,OAAA,CAAAD,uBAAA;EAAA,SAAAA,wBAAA;IAAA,IAAAE,gBAAA,CAAAC,OAAA,QAAAH,uBAAA;EAAA;EAAA,WAAAI,aAAA,CAAAD,OAAA,EAAAH,uBAAA;IAAAK,GAAA;IAAAC,KAAA,EAChC,eAAMC,MAAMA,CAACC,IAAU,EAAEC,OAAsB,EAAyB;MACpE,IAAMC,GAAG,GAAG,IAAIC,oDAAyB,CAACF,OAAO,CAACG,YAAY,CAAC;MAE/D,IAAMC,QAAQ,GAAG,IAAIC,oCAAiB,CAACJ,GAAG,EAAE;QACxCK,SAAS,EAAE,IAAI,CAACC,eAAe,CAAC,CAAC;QACjCC,eAAe,EAAE,IAAI,CAACC,oBAAoB,CAAC;MAC/C,CAAC,CAAC;MAEF,IAAIT,OAAO,CAACU,UAAU,EAAE;QACpBN,QAAQ,CAACM,UAAU,CAACV,OAAO,CAACU,UAAU,CAAC;MAC3C;MACA,OAAON,QAAQ,CAACO,UAAU,CAACZ,IAAI,CAAC;IACpC;EAAC;IAAAH,GAAA;IAAAC,KAAA,EAED,SAAQU,eAAeA,CAAA,EAAW;MAC9B,IAAMK,OAAO,GAAGC,QAAQ,CAACC,OAAO,CAACC,GAAG,CAACC,6BAA6B,IAAI,GAAG,CAAC;;MAE1E;MACA,IAAIF,OAAO,CAACC,GAAG,CAACE,QAAQ,KAAK,aAAa,EAAE;QACxC;QACA,IAAMC,UAAU,GAAGC,MAAM,CAAC,mBAAmB,CAAC;QAC9C,IAAID,UAAU,EAAE;UACZ,OAAOA,UAAU;QACrB;MACJ;;MAEA;MACA,OAAON,OAAO,IAAI,EAAE;IACxB;EAAC;IAAAhB,GAAA;IAAAC,KAAA,EAED,SAAQY,oBAAoBA,CAAA,EAAW;MACnC,IAAMW,SAAS,GAAGP,QAAQ,CAACC,OAAO,CAACC,GAAG,CAACM,kCAAkC,IAAI,GAAG,CAAC;;MAEjF;MACA,IAAIP,OAAO,CAACC,GAAG,CAACE,QAAQ,KAAK,aAAa,EAAE;QACxC;QACA,IAAMK,YAAY,GAAGH,MAAM,CAAC,wBAAwB,CAAC;QACrD,IAAIG,YAAY,EAAE;UACd,OAAOA,YAAY;QACvB;MACJ;;MAEA;MACA,OAAOF,SAAS,IAAI,CAAC;IACzB;EAAC;AAAA","ignoreList":[]}
1
+ {"version":3,"names":["MultiPartUploader","MultiPartUploadGraphQLAPI","MultiPartUploadStrategy","upload","file","options","api","apolloClient","uploader","chunkSize","detectChunkSize","parallelUploads","detectParallelChunks","onProgress","uploadFile","envSize","parseInt","process","env","WEBINY_FILE_UPLOAD_CHUNK_SIZE","NODE_ENV","windowSize","window","envChunks","WEBINY_FILE_UPLOAD_PARALLEL_CHUNKS","windowChunks"],"sources":["MultiPartUploadStrategy.ts"],"sourcesContent":["import type { UploadedFile, UploadOptions } from \"@webiny/app/types.js\";\nimport type { FileUploadStrategy } from \"~/index.js\";\nimport { MultiPartUploader } from \"~/MultiPartUploader.js\";\nimport { MultiPartUploadGraphQLAPI } from \"~/MultiPartUploadGraphQLAPI.js\";\n\nexport class MultiPartUploadStrategy implements FileUploadStrategy {\n async upload(file: File, options: UploadOptions): Promise<UploadedFile> {\n const api = new MultiPartUploadGraphQLAPI(options.apolloClient);\n\n const uploader = new MultiPartUploader(api, {\n chunkSize: this.detectChunkSize(),\n parallelUploads: this.detectParallelChunks()\n });\n\n if (options.onProgress) {\n uploader.onProgress(options.onProgress);\n }\n return uploader.uploadFile(file);\n }\n\n private detectChunkSize(): number {\n const envSize = parseInt(process.env.WEBINY_FILE_UPLOAD_CHUNK_SIZE || \"0\");\n\n // For dev purposes, we take this global var into consideration.\n if (process.env.NODE_ENV === \"development\") {\n // @ts-expect-error\n const windowSize = window[\"fmUploadChunkSize\"];\n if (windowSize) {\n return windowSize;\n }\n }\n\n // As a last resort, we check the baked in value, or fall back to 50MB chunk size.\n return envSize || 50;\n }\n\n private detectParallelChunks(): number {\n const envChunks = parseInt(process.env.WEBINY_FILE_UPLOAD_PARALLEL_CHUNKS || \"0\");\n\n // For dev purposes, we take this global var into consideration.\n if (process.env.NODE_ENV === \"development\") {\n // @ts-expect-error\n const windowChunks = window[\"fmUploadParallelChunks\"];\n if (windowChunks) {\n return windowChunks;\n }\n }\n\n // As a last resort, we check the baked in value, or fall back to 5 parallel chunks.\n return envChunks || 5;\n }\n}\n"],"mappings":"AAEA,SAASA,iBAAiB;AAC1B,SAASC,yBAAyB;AAElC,OAAO,MAAMC,uBAAuB,CAA+B;EAC/D,MAAMC,MAAMA,CAACC,IAAU,EAAEC,OAAsB,EAAyB;IACpE,MAAMC,GAAG,GAAG,IAAIL,yBAAyB,CAACI,OAAO,CAACE,YAAY,CAAC;IAE/D,MAAMC,QAAQ,GAAG,IAAIR,iBAAiB,CAACM,GAAG,EAAE;MACxCG,SAAS,EAAE,IAAI,CAACC,eAAe,CAAC,CAAC;MACjCC,eAAe,EAAE,IAAI,CAACC,oBAAoB,CAAC;IAC/C,CAAC,CAAC;IAEF,IAAIP,OAAO,CAACQ,UAAU,EAAE;MACpBL,QAAQ,CAACK,UAAU,CAACR,OAAO,CAACQ,UAAU,CAAC;IAC3C;IACA,OAAOL,QAAQ,CAACM,UAAU,CAACV,IAAI,CAAC;EACpC;EAEQM,eAAeA,CAAA,EAAW;IAC9B,MAAMK,OAAO,GAAGC,QAAQ,CAACC,OAAO,CAACC,GAAG,CAACC,6BAA6B,IAAI,GAAG,CAAC;;IAE1E;IACA,IAAIF,OAAO,CAACC,GAAG,CAACE,QAAQ,KAAK,aAAa,EAAE;MACxC;MACA,MAAMC,UAAU,GAAGC,MAAM,CAAC,mBAAmB,CAAC;MAC9C,IAAID,UAAU,EAAE;QACZ,OAAOA,UAAU;MACrB;IACJ;;IAEA;IACA,OAAON,OAAO,IAAI,EAAE;EACxB;EAEQH,oBAAoBA,CAAA,EAAW;IACnC,MAAMW,SAAS,GAAGP,QAAQ,CAACC,OAAO,CAACC,GAAG,CAACM,kCAAkC,IAAI,GAAG,CAAC;;IAEjF;IACA,IAAIP,OAAO,CAACC,GAAG,CAACE,QAAQ,KAAK,aAAa,EAAE;MACxC;MACA,MAAMK,YAAY,GAAGH,MAAM,CAAC,wBAAwB,CAAC;MACrD,IAAIG,YAAY,EAAE;QACd,OAAOA,YAAY;MACvB;IACJ;;IAEA;IACA,OAAOF,SAAS,IAAI,CAAC;EACzB;AACJ","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import { MultiPartUploadAPI } from "./MultiPartUploadAPI";
1
+ import type { MultiPartUploadAPI } from "./MultiPartUploadAPI.js";
2
2
  interface MultiPartUploaderOptions {
3
3
  /**
4
4
  * Chunk size in MB. Must be >=5MB (enforced by AWS).
@@ -30,7 +30,7 @@ export declare class MultiPartUploader {
30
30
  private onErrorFn;
31
31
  private onProgressFn;
32
32
  constructor(api: MultiPartUploadAPI, options?: MultiPartUploaderOptions);
33
- uploadFile(file: File): Promise<import("@webiny/app/types").UploadedFile>;
33
+ uploadFile(file: File): Promise<import("@webiny/app/types.js").UploadedFile>;
34
34
  onProgress(onProgress: OnProgressCallback): this;
35
35
  onError(onError: OnErrorCallback): this;
36
36
  private complete;
@@ -1,215 +1,165 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.MultiPartUploader = void 0;
8
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
11
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
- var _pRetry = _interopRequireDefault(require("p-retry"));
13
- var MultiPartUploader = exports.MultiPartUploader = /*#__PURE__*/function () {
14
- function MultiPartUploader(api) {
15
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
16
- (0, _classCallCheck2.default)(this, MultiPartUploader);
17
- (0, _defineProperty2.default)(this, "activeConnections", new Map());
18
- (0, _defineProperty2.default)(this, "progressTracker", new Map());
19
- (0, _defineProperty2.default)(this, "onErrorFn", function (error) {
20
- return console.error(error);
21
- });
1
+ import pRetry from "p-retry";
2
+ export class MultiPartUploader {
3
+ activeConnections = new Map();
4
+ progressTracker = new Map();
5
+ onErrorFn = error => console.error(error);
6
+ constructor(api, options = {}) {
22
7
  this.api = api;
23
- var chunkSize = options.chunkSize || 50;
24
- var parallelUploads = options.parallelUploads || 5;
8
+ const chunkSize = options.chunkSize || 50;
9
+ const parallelUploads = options.parallelUploads || 5;
25
10
  this.chunkSize = Math.max(1024 * 1024 * chunkSize, 1024 * 1024 * 5);
26
11
  this.parallelUploads = Math.min(parallelUploads, 15);
27
12
  }
28
- return (0, _createClass2.default)(MultiPartUploader, [{
29
- key: "uploadFile",
30
- value: async function uploadFile(file) {
31
- var _this = this;
32
- this.file = file;
33
- var numberOfParts = Math.ceil(file.size / this.chunkSize);
34
- try {
35
- /**
36
- * Initialize the file upload on AWS S3.
37
- */
38
- this.upload = await this.api.createUpload({
39
- data: {
40
- name: file.name,
41
- size: file.size,
42
- type: file.type
43
- },
44
- numberOfParts: numberOfParts
45
- });
13
+ async uploadFile(file) {
14
+ this.file = file;
15
+ const numberOfParts = Math.ceil(file.size / this.chunkSize);
16
+ try {
17
+ /**
18
+ * Initialize the file upload on AWS S3.
19
+ */
20
+ this.upload = await this.api.createUpload({
21
+ data: {
22
+ name: file.name,
23
+ size: file.size,
24
+ type: file.type
25
+ },
26
+ numberOfParts
27
+ });
46
28
 
47
- /**
48
- * Run the defined number of parallel uploads. Each thread will continue to process parts
49
- * for as long as there are parts to upload. The promise will resolve once there's no more parts to upload.
50
- */
51
- var threads = Math.min(numberOfParts, this.parallelUploads);
52
- await Promise.all(Array.from({
53
- length: threads
54
- }).map(function () {
55
- return _this.uploadNextPart();
56
- }));
57
- await this.complete();
58
- return this.upload.file;
59
- } catch (error) {
60
- await this.complete(error);
61
- throw error;
62
- }
29
+ /**
30
+ * Run the defined number of parallel uploads. Each thread will continue to process parts
31
+ * for as long as there are parts to upload. The promise will resolve once there's no more parts to upload.
32
+ */
33
+ const threads = Math.min(numberOfParts, this.parallelUploads);
34
+ await Promise.all(Array.from({
35
+ length: threads
36
+ }).map(() => this.uploadNextPart()));
37
+ await this.complete();
38
+ return this.upload.file;
39
+ } catch (error) {
40
+ await this.complete(error);
41
+ throw error;
63
42
  }
64
- }, {
65
- key: "onProgress",
66
- value: function onProgress(_onProgress) {
67
- this.onProgressFn = _onProgress;
68
- return this;
43
+ }
44
+ onProgress(onProgress) {
45
+ this.onProgressFn = onProgress;
46
+ return this;
47
+ }
48
+ onError(onError) {
49
+ this.onErrorFn = onError;
50
+ return this;
51
+ }
52
+ async complete(error) {
53
+ if (error) {
54
+ this.onErrorFn(error);
55
+ return;
69
56
  }
70
- }, {
71
- key: "onError",
72
- value: function onError(_onError) {
73
- this.onErrorFn = _onError;
74
- return this;
57
+ try {
58
+ await this.sendCompleteRequest();
59
+ } catch (error) {
60
+ this.onErrorFn(error);
75
61
  }
76
- }, {
77
- key: "complete",
78
- value: async function complete(error) {
79
- if (error) {
80
- this.onErrorFn(error);
81
- return;
82
- }
62
+ }
63
+ async sendCompleteRequest() {
64
+ this.assertIsDefined(this.upload, `Upload must be created before calling "sendCompleteRequest"!`);
65
+ return this.api.completeUpload({
66
+ fileKey: this.upload.file.key,
67
+ uploadId: this.upload.uploadId
68
+ });
69
+ }
70
+ progressListener(part, event) {
71
+ if (!this.file) {
72
+ return;
73
+ }
74
+ this.progressTracker.set(part.partNumber, event.loaded);
75
+ const uploaded = Array.from(this.progressTracker.values()).reduce((sum = 0, value) => sum + value);
76
+ const uploadedSize = Math.min(uploaded, this.file.size);
77
+ if (this.onProgressFn) {
83
78
  try {
84
- await this.sendCompleteRequest();
85
- } catch (error) {
86
- this.onErrorFn(error);
79
+ this.onProgressFn({
80
+ sent: uploadedSize,
81
+ total: this.file.size,
82
+ percentage: Math.round(uploadedSize / this.file.size * 100)
83
+ });
84
+ } catch (err) {
85
+ console.error(`Error executing the "onProgress" callback`, err);
87
86
  }
88
87
  }
89
- }, {
90
- key: "sendCompleteRequest",
91
- value: async function sendCompleteRequest() {
92
- this.assertIsDefined(this.upload, "Upload must be created before calling \"sendCompleteRequest\"!");
93
- return this.api.completeUpload({
94
- fileKey: this.upload.file.key,
95
- uploadId: this.upload.uploadId
96
- });
88
+ }
89
+ async uploadNextPart() {
90
+ if (!this.upload) {
91
+ return;
97
92
  }
98
- }, {
99
- key: "progressListener",
100
- value: function progressListener(part, event) {
101
- if (!this.file) {
102
- return;
103
- }
104
- this.progressTracker.set(part.partNumber, event.loaded);
105
- var uploaded = Array.from(this.progressTracker.values()).reduce(function () {
106
- var sum = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
107
- var value = arguments.length > 1 ? arguments[1] : undefined;
108
- return sum + value;
109
- });
110
- var uploadedSize = Math.min(uploaded, this.file.size);
111
- if (this.onProgressFn) {
112
- try {
113
- this.onProgressFn({
114
- sent: uploadedSize,
115
- total: this.file.size,
116
- percentage: Math.round(uploadedSize / this.file.size * 100)
117
- });
118
- } catch (err) {
119
- console.error("Error executing the \"onProgress\" callback", err);
120
- }
121
- }
93
+ const part = this.upload.parts.shift();
94
+ if (!part) {
95
+ return;
122
96
  }
123
- }, {
124
- key: "uploadNextPart",
125
- value: async function uploadNextPart() {
126
- var _this2 = this;
127
- if (!this.upload) {
128
- return;
129
- }
130
- var part = this.upload.parts.shift();
131
- if (!part) {
132
- return;
97
+ return executeWithRetry(() => this.uploadPart(part)).then(() => this.uploadNextPart());
98
+ }
99
+ uploadPart(part) {
100
+ this.assertIsDefined(this.upload, `Upload must be created before calling "sendCompleteRequest"!`);
101
+ this.assertIsDefined(this.file, `File must be set before calling "uploadPart"!`);
102
+ const sentSize = (part.partNumber - 1) * this.chunkSize;
103
+ const nextChunkSize = Math.min(sentSize + this.chunkSize, this.file.size);
104
+ const chunk = this.file.slice(sentSize, nextChunkSize, this.upload.file.type);
105
+ console.log(`Chunk for part #${part.partNumber}`, chunk.size);
106
+ return new Promise((resolve, reject) => {
107
+ const throwXHRError = error => {
108
+ this.activeConnections.delete(part.partNumber);
109
+ reject(error);
110
+ };
111
+ if (!window.navigator.onLine) {
112
+ return reject(new Error("Browser is offline!"));
133
113
  }
134
- return executeWithRetry(function () {
135
- return _this2.uploadPart(part);
136
- }).then(function () {
137
- return _this2.uploadNextPart();
138
- });
139
- }
140
- }, {
141
- key: "uploadPart",
142
- value: function uploadPart(part) {
143
- var _this3 = this;
144
- this.assertIsDefined(this.upload, "Upload must be created before calling \"sendCompleteRequest\"!");
145
- this.assertIsDefined(this.file, "File must be set before calling \"uploadPart\"!");
146
- var sentSize = (part.partNumber - 1) * this.chunkSize;
147
- var nextChunkSize = Math.min(sentSize + this.chunkSize, this.file.size);
148
- var chunk = this.file.slice(sentSize, nextChunkSize, this.upload.file.type);
149
- console.log("Chunk for part #".concat(part.partNumber), chunk.size);
150
- return new Promise(function (resolve, reject) {
151
- var throwXHRError = function throwXHRError(error) {
152
- _this3.activeConnections.delete(part.partNumber);
153
- reject(error);
154
- };
155
- if (!window.navigator.onLine) {
156
- return reject(new Error("Browser is offline!"));
157
- }
158
- var xhr = new XMLHttpRequest();
159
- _this3.activeConnections.set(part.partNumber, xhr);
160
- var abortXHR = function abortXHR() {
161
- return xhr.abort();
162
- };
163
- xhr.upload.addEventListener("progress", function (event) {
164
- return _this3.progressListener(part, event);
165
- });
166
- window.addEventListener("offline", abortXHR);
167
- var removeListeners = function removeListeners() {
168
- window.removeEventListener("offline", abortXHR);
169
- };
170
- xhr.open("PUT", part.url);
171
- xhr.onreadystatechange = function () {
172
- if (xhr.readyState === 4 && xhr.status === 200) {
173
- try {
174
- _this3.activeConnections.delete(part.partNumber);
175
- window.removeEventListener("offline", abortXHR);
176
- resolve(xhr.status);
177
- } catch (err) {
178
- console.error("Error in \"onreadystatechange\"", err);
179
- }
114
+ const xhr = new XMLHttpRequest();
115
+ this.activeConnections.set(part.partNumber, xhr);
116
+ const abortXHR = () => xhr.abort();
117
+ xhr.upload.addEventListener("progress", event => this.progressListener(part, event));
118
+ window.addEventListener("offline", abortXHR);
119
+ const removeListeners = () => {
120
+ window.removeEventListener("offline", abortXHR);
121
+ };
122
+ xhr.open("PUT", part.url);
123
+ xhr.onreadystatechange = () => {
124
+ if (xhr.readyState === 4 && xhr.status === 200) {
125
+ try {
126
+ this.activeConnections.delete(part.partNumber);
127
+ window.removeEventListener("offline", abortXHR);
128
+ resolve(xhr.status);
129
+ } catch (err) {
130
+ console.error(`Error in "onreadystatechange"`, err);
180
131
  }
181
- };
182
- xhr.onerror = function () {
183
- removeListeners();
184
- throwXHRError(new Error("Failed to upload file part #".concat(part.partNumber)));
185
- };
186
- xhr.ontimeout = function () {
187
- removeListeners();
188
- throwXHRError(new Error("Request timed out for file part #".concat(part.partNumber, "!")));
189
- };
190
- xhr.onabort = function () {
191
- removeListeners();
192
- throwXHRError(new Error("Upload was cancelled for part #".concat(part.partNumber, "!")));
193
- };
194
- xhr.send(chunk);
195
- });
196
- }
197
- }, {
198
- key: "assertIsDefined",
199
- value: function assertIsDefined(upload, message) {
200
- if (!upload) {
201
- throw new Error(message);
202
- }
132
+ }
133
+ };
134
+ xhr.onerror = () => {
135
+ removeListeners();
136
+ throwXHRError(new Error(`Failed to upload file part #${part.partNumber}`));
137
+ };
138
+ xhr.ontimeout = () => {
139
+ removeListeners();
140
+ throwXHRError(new Error(`Request timed out for file part #${part.partNumber}!`));
141
+ };
142
+ xhr.onabort = () => {
143
+ removeListeners();
144
+ throwXHRError(new Error(`Upload was cancelled for part #${part.partNumber}!`));
145
+ };
146
+ xhr.send(chunk);
147
+ });
148
+ }
149
+ assertIsDefined(upload, message) {
150
+ if (!upload) {
151
+ throw new Error(message);
203
152
  }
204
- }]);
205
- }();
206
- var executeWithRetry = function executeWithRetry(execute, options) {
207
- return (0, _pRetry.default)(execute, (0, _objectSpread2.default)({
153
+ }
154
+ }
155
+ const executeWithRetry = (execute, options) => {
156
+ return pRetry(execute, {
208
157
  maxRetryTime: 300000,
209
158
  retries: 5,
210
159
  minTimeout: 1500,
211
- maxTimeout: 30000
212
- }, options));
160
+ maxTimeout: 30000,
161
+ ...options
162
+ });
213
163
  };
214
164
 
215
165
  //# sourceMappingURL=MultiPartUploader.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_pRetry","_interopRequireDefault","require","MultiPartUploader","exports","api","options","arguments","length","undefined","_classCallCheck2","default","_defineProperty2","Map","error","console","chunkSize","parallelUploads","Math","max","min","_createClass2","key","value","uploadFile","file","_this","numberOfParts","ceil","size","upload","createUpload","data","name","type","threads","Promise","all","Array","from","map","uploadNextPart","complete","onProgress","onProgressFn","onError","onErrorFn","sendCompleteRequest","assertIsDefined","completeUpload","fileKey","uploadId","progressListener","part","event","progressTracker","set","partNumber","loaded","uploaded","values","reduce","sum","uploadedSize","sent","total","percentage","round","err","_this2","parts","shift","executeWithRetry","uploadPart","then","_this3","sentSize","nextChunkSize","chunk","slice","log","concat","resolve","reject","throwXHRError","activeConnections","delete","window","navigator","onLine","Error","xhr","XMLHttpRequest","abortXHR","abort","addEventListener","removeListeners","removeEventListener","open","url","onreadystatechange","readyState","status","onerror","ontimeout","onabort","send","message","execute","pRetry","_objectSpread2","maxRetryTime","retries","minTimeout","maxTimeout"],"sources":["MultiPartUploader.ts"],"sourcesContent":["import pRetry from \"p-retry\";\nimport { MultiPartUpload, MultiPartUploadAPI, FilePart } from \"./MultiPartUploadAPI\";\n\ninterface MultiPartUploaderOptions {\n /**\n * Chunk size in MB. Must be >=5MB (enforced by AWS).\n */\n chunkSize?: number;\n /**\n * Number of parallel uploads. Must be >=5 && <=15.\n */\n parallelUploads?: number;\n}\n\ninterface OnProgressCallback {\n (params: { sent: number; total: number; percentage: number }): void;\n}\n\ninterface OnErrorCallback {\n (error: Error): void;\n}\n\nexport class MultiPartUploader {\n private readonly api: MultiPartUploadAPI;\n private readonly chunkSize: number;\n private readonly parallelUploads: number;\n private readonly activeConnections: Map<number, XMLHttpRequest> = new Map();\n private readonly progressTracker: Map<number, number> = new Map();\n private upload: MultiPartUpload | undefined;\n private file: File | undefined;\n private onErrorFn: OnErrorCallback = error => console.error(error);\n private onProgressFn: OnProgressCallback | undefined;\n\n constructor(api: MultiPartUploadAPI, options: MultiPartUploaderOptions = {}) {\n this.api = api;\n const chunkSize = options.chunkSize || 50;\n const parallelUploads = options.parallelUploads || 5;\n\n this.chunkSize = Math.max(1024 * 1024 * chunkSize, 1024 * 1024 * 5);\n this.parallelUploads = Math.min(parallelUploads, 15);\n }\n\n async uploadFile(file: File) {\n this.file = file;\n const numberOfParts = Math.ceil(file.size / this.chunkSize);\n\n try {\n /**\n * Initialize the file upload on AWS S3.\n */\n this.upload = await this.api.createUpload({\n data: { name: file.name, size: file.size, type: file.type },\n numberOfParts\n });\n\n /**\n * Run the defined number of parallel uploads. Each thread will continue to process parts\n * for as long as there are parts to upload. The promise will resolve once there's no more parts to upload.\n */\n const threads = Math.min(numberOfParts, this.parallelUploads);\n await Promise.all(Array.from({ length: threads }).map(() => this.uploadNextPart()));\n\n await this.complete();\n\n return this.upload.file;\n } catch (error) {\n await this.complete(error);\n throw error;\n }\n }\n\n onProgress(onProgress: OnProgressCallback) {\n this.onProgressFn = onProgress;\n return this;\n }\n\n onError(onError: OnErrorCallback) {\n this.onErrorFn = onError;\n return this;\n }\n\n private async complete(error?: Error) {\n if (error) {\n this.onErrorFn(error);\n return;\n }\n\n try {\n await this.sendCompleteRequest();\n } catch (error) {\n this.onErrorFn(error);\n }\n }\n\n private async sendCompleteRequest() {\n this.assertIsDefined(\n this.upload,\n `Upload must be created before calling \"sendCompleteRequest\"!`\n );\n\n return this.api.completeUpload({\n fileKey: this.upload.file.key,\n uploadId: this.upload.uploadId\n });\n }\n\n private progressListener(part: FilePart, event: ProgressEvent<XMLHttpRequestEventTarget>) {\n if (!this.file) {\n return;\n }\n\n this.progressTracker.set(part.partNumber, event.loaded);\n\n const uploaded = Array.from(this.progressTracker.values()).reduce(\n (sum = 0, value) => sum + value\n );\n\n const uploadedSize = Math.min(uploaded, this.file.size);\n\n if (this.onProgressFn) {\n try {\n this.onProgressFn({\n sent: uploadedSize,\n total: this.file.size,\n percentage: Math.round((uploadedSize / this.file.size) * 100)\n });\n } catch (err) {\n console.error(`Error executing the \"onProgress\" callback`, err);\n }\n }\n }\n\n private async uploadNextPart(): Promise<void> {\n if (!this.upload) {\n return;\n }\n\n const part = this.upload.parts.shift();\n\n if (!part) {\n return;\n }\n\n return executeWithRetry(() => this.uploadPart(part)).then(() => this.uploadNextPart());\n }\n\n private uploadPart(part: FilePart) {\n this.assertIsDefined(\n this.upload,\n `Upload must be created before calling \"sendCompleteRequest\"!`\n );\n\n this.assertIsDefined(this.file, `File must be set before calling \"uploadPart\"!`);\n\n const sentSize = (part.partNumber - 1) * this.chunkSize;\n const nextChunkSize = Math.min(sentSize + this.chunkSize, this.file.size);\n const chunk = this.file.slice(sentSize, nextChunkSize, this.upload.file.type);\n console.log(`Chunk for part #${part.partNumber}`, chunk.size);\n\n return new Promise((resolve, reject) => {\n const throwXHRError = (error: Error) => {\n this.activeConnections.delete(part.partNumber);\n reject(error);\n };\n\n if (!window.navigator.onLine) {\n return reject(new Error(\"Browser is offline!\"));\n }\n\n const xhr = new XMLHttpRequest();\n this.activeConnections.set(part.partNumber, xhr);\n const abortXHR = () => xhr.abort();\n\n xhr.upload.addEventListener(\"progress\", event => this.progressListener(part, event));\n\n window.addEventListener(\"offline\", abortXHR);\n const removeListeners = () => {\n window.removeEventListener(\"offline\", abortXHR);\n };\n\n xhr.open(\"PUT\", part.url);\n\n xhr.onreadystatechange = () => {\n if (xhr.readyState === 4 && xhr.status === 200) {\n try {\n this.activeConnections.delete(part.partNumber);\n window.removeEventListener(\"offline\", abortXHR);\n resolve(xhr.status);\n } catch (err) {\n console.error(`Error in \"onreadystatechange\"`, err);\n }\n }\n };\n\n xhr.onerror = () => {\n removeListeners();\n throwXHRError(new Error(`Failed to upload file part #${part.partNumber}`));\n };\n xhr.ontimeout = () => {\n removeListeners();\n throwXHRError(new Error(`Request timed out for file part #${part.partNumber}!`));\n };\n xhr.onabort = () => {\n removeListeners();\n throwXHRError(new Error(`Upload was cancelled for part #${part.partNumber}!`));\n };\n xhr.send(chunk);\n });\n }\n\n private assertIsDefined<T>(upload: T, message: string): asserts upload is NonNullable<T> {\n if (!upload) {\n throw new Error(message);\n }\n }\n}\n\nconst executeWithRetry = (execute: () => void, options?: Parameters<typeof pRetry>[1]) => {\n return pRetry(execute, {\n maxRetryTime: 300000,\n retries: 5,\n minTimeout: 1500,\n maxTimeout: 30000,\n ...options\n });\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["pRetry","MultiPartUploader","activeConnections","Map","progressTracker","onErrorFn","error","console","constructor","api","options","chunkSize","parallelUploads","Math","max","min","uploadFile","file","numberOfParts","ceil","size","upload","createUpload","data","name","type","threads","Promise","all","Array","from","length","map","uploadNextPart","complete","onProgress","onProgressFn","onError","sendCompleteRequest","assertIsDefined","completeUpload","fileKey","key","uploadId","progressListener","part","event","set","partNumber","loaded","uploaded","values","reduce","sum","value","uploadedSize","sent","total","percentage","round","err","parts","shift","executeWithRetry","uploadPart","then","sentSize","nextChunkSize","chunk","slice","log","resolve","reject","throwXHRError","delete","window","navigator","onLine","Error","xhr","XMLHttpRequest","abortXHR","abort","addEventListener","removeListeners","removeEventListener","open","url","onreadystatechange","readyState","status","onerror","ontimeout","onabort","send","message","execute","maxRetryTime","retries","minTimeout","maxTimeout"],"sources":["MultiPartUploader.ts"],"sourcesContent":["import pRetry from \"p-retry\";\nimport type { MultiPartUpload, MultiPartUploadAPI, FilePart } from \"./MultiPartUploadAPI.js\";\n\ninterface MultiPartUploaderOptions {\n /**\n * Chunk size in MB. Must be >=5MB (enforced by AWS).\n */\n chunkSize?: number;\n /**\n * Number of parallel uploads. Must be >=5 && <=15.\n */\n parallelUploads?: number;\n}\n\ninterface OnProgressCallback {\n (params: { sent: number; total: number; percentage: number }): void;\n}\n\ninterface OnErrorCallback {\n (error: Error): void;\n}\n\nexport class MultiPartUploader {\n private readonly api: MultiPartUploadAPI;\n private readonly chunkSize: number;\n private readonly parallelUploads: number;\n private readonly activeConnections: Map<number, XMLHttpRequest> = new Map();\n private readonly progressTracker: Map<number, number> = new Map();\n private upload: MultiPartUpload | undefined;\n private file: File | undefined;\n private onErrorFn: OnErrorCallback = error => console.error(error);\n private onProgressFn: OnProgressCallback | undefined;\n\n constructor(api: MultiPartUploadAPI, options: MultiPartUploaderOptions = {}) {\n this.api = api;\n const chunkSize = options.chunkSize || 50;\n const parallelUploads = options.parallelUploads || 5;\n\n this.chunkSize = Math.max(1024 * 1024 * chunkSize, 1024 * 1024 * 5);\n this.parallelUploads = Math.min(parallelUploads, 15);\n }\n\n async uploadFile(file: File) {\n this.file = file;\n const numberOfParts = Math.ceil(file.size / this.chunkSize);\n\n try {\n /**\n * Initialize the file upload on AWS S3.\n */\n this.upload = await this.api.createUpload({\n data: { name: file.name, size: file.size, type: file.type },\n numberOfParts\n });\n\n /**\n * Run the defined number of parallel uploads. Each thread will continue to process parts\n * for as long as there are parts to upload. The promise will resolve once there's no more parts to upload.\n */\n const threads = Math.min(numberOfParts, this.parallelUploads);\n await Promise.all(Array.from({ length: threads }).map(() => this.uploadNextPart()));\n\n await this.complete();\n\n return this.upload.file;\n } catch (error) {\n await this.complete(error);\n throw error;\n }\n }\n\n onProgress(onProgress: OnProgressCallback) {\n this.onProgressFn = onProgress;\n return this;\n }\n\n onError(onError: OnErrorCallback) {\n this.onErrorFn = onError;\n return this;\n }\n\n private async complete(error?: Error) {\n if (error) {\n this.onErrorFn(error);\n return;\n }\n\n try {\n await this.sendCompleteRequest();\n } catch (error) {\n this.onErrorFn(error);\n }\n }\n\n private async sendCompleteRequest() {\n this.assertIsDefined(\n this.upload,\n `Upload must be created before calling \"sendCompleteRequest\"!`\n );\n\n return this.api.completeUpload({\n fileKey: this.upload.file.key,\n uploadId: this.upload.uploadId\n });\n }\n\n private progressListener(part: FilePart, event: ProgressEvent<XMLHttpRequestEventTarget>) {\n if (!this.file) {\n return;\n }\n\n this.progressTracker.set(part.partNumber, event.loaded);\n\n const uploaded = Array.from(this.progressTracker.values()).reduce(\n (sum = 0, value) => sum + value\n );\n\n const uploadedSize = Math.min(uploaded, this.file.size);\n\n if (this.onProgressFn) {\n try {\n this.onProgressFn({\n sent: uploadedSize,\n total: this.file.size,\n percentage: Math.round((uploadedSize / this.file.size) * 100)\n });\n } catch (err) {\n console.error(`Error executing the \"onProgress\" callback`, err);\n }\n }\n }\n\n private async uploadNextPart(): Promise<void> {\n if (!this.upload) {\n return;\n }\n\n const part = this.upload.parts.shift();\n\n if (!part) {\n return;\n }\n\n return executeWithRetry(() => this.uploadPart(part)).then(() => this.uploadNextPart());\n }\n\n private uploadPart(part: FilePart) {\n this.assertIsDefined(\n this.upload,\n `Upload must be created before calling \"sendCompleteRequest\"!`\n );\n\n this.assertIsDefined(this.file, `File must be set before calling \"uploadPart\"!`);\n\n const sentSize = (part.partNumber - 1) * this.chunkSize;\n const nextChunkSize = Math.min(sentSize + this.chunkSize, this.file.size);\n const chunk = this.file.slice(sentSize, nextChunkSize, this.upload.file.type);\n console.log(`Chunk for part #${part.partNumber}`, chunk.size);\n\n return new Promise((resolve, reject) => {\n const throwXHRError = (error: Error) => {\n this.activeConnections.delete(part.partNumber);\n reject(error);\n };\n\n if (!window.navigator.onLine) {\n return reject(new Error(\"Browser is offline!\"));\n }\n\n const xhr = new XMLHttpRequest();\n this.activeConnections.set(part.partNumber, xhr);\n const abortXHR = () => xhr.abort();\n\n xhr.upload.addEventListener(\"progress\", event => this.progressListener(part, event));\n\n window.addEventListener(\"offline\", abortXHR);\n const removeListeners = () => {\n window.removeEventListener(\"offline\", abortXHR);\n };\n\n xhr.open(\"PUT\", part.url);\n\n xhr.onreadystatechange = () => {\n if (xhr.readyState === 4 && xhr.status === 200) {\n try {\n this.activeConnections.delete(part.partNumber);\n window.removeEventListener(\"offline\", abortXHR);\n resolve(xhr.status);\n } catch (err) {\n console.error(`Error in \"onreadystatechange\"`, err);\n }\n }\n };\n\n xhr.onerror = () => {\n removeListeners();\n throwXHRError(new Error(`Failed to upload file part #${part.partNumber}`));\n };\n xhr.ontimeout = () => {\n removeListeners();\n throwXHRError(new Error(`Request timed out for file part #${part.partNumber}!`));\n };\n xhr.onabort = () => {\n removeListeners();\n throwXHRError(new Error(`Upload was cancelled for part #${part.partNumber}!`));\n };\n xhr.send(chunk);\n });\n }\n\n private assertIsDefined<T>(upload: T, message: string): asserts upload is NonNullable<T> {\n if (!upload) {\n throw new Error(message);\n }\n }\n}\n\nconst executeWithRetry = (execute: () => void, options?: Parameters<typeof pRetry>[1]) => {\n return pRetry(execute, {\n maxRetryTime: 300000,\n retries: 5,\n minTimeout: 1500,\n maxTimeout: 30000,\n ...options\n });\n};\n"],"mappings":"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","ignoreList":[]}
package/README.md CHANGED
@@ -1 +1,11 @@
1
- # @webiny/app-file-manager-s3
1
+ # @webiny/app-file-manager-s3
2
+
3
+ > [!NOTE]
4
+ > This package is part of the [Webiny](https://www.webiny.com) monorepo.
5
+ > It’s **included in every Webiny project by default** and is not meant to be used as a standalone package.
6
+
7
+ 📘 **Documentation:** [https://www.webiny.com/docs](https://www.webiny.com/docs)
8
+
9
+ ---
10
+
11
+ _This README file is automatically generated during the publish process._
@@ -1,5 +1,5 @@
1
- import { UploadedFile, UploadOptions } from "@webiny/app/types";
2
- import { FileUploadStrategy } from "./index";
1
+ import type { UploadedFile, UploadOptions } from "@webiny/app/types.js";
2
+ import type { FileUploadStrategy } from "./index.js";
3
3
  declare global {
4
4
  interface File {
5
5
  key?: string;
@@ -1,71 +1,59 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.SimpleUploadStrategy = void 0;
8
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
9
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
10
- var _graphql = require("./graphql");
11
- var SimpleUploadStrategy = exports.SimpleUploadStrategy = /*#__PURE__*/function () {
12
- function SimpleUploadStrategy() {
13
- (0, _classCallCheck2.default)(this, SimpleUploadStrategy);
14
- }
15
- return (0, _createClass2.default)(SimpleUploadStrategy, [{
16
- key: "upload",
17
- value: async function upload(file, _ref) {
18
- var apolloClient = _ref.apolloClient,
19
- onProgress = _ref.onProgress;
20
- // 1. GET PreSignedPostPayload
21
- var response = await apolloClient.query({
22
- query: _graphql.GET_PRE_SIGNED_POST_PAYLOAD,
23
- fetchPolicy: "no-cache",
24
- variables: {
25
- data: {
26
- size: file.size,
27
- name: file.name,
28
- type: file.type,
29
- key: file.key,
30
- keyPrefix: file.keyPrefix
31
- }
1
+ import { GET_PRE_SIGNED_POST_PAYLOAD } from "./graphql.js";
2
+ export class SimpleUploadStrategy {
3
+ async upload(file, {
4
+ apolloClient,
5
+ onProgress
6
+ }) {
7
+ // 1. GET PreSignedPostPayload
8
+ const response = await apolloClient.query({
9
+ query: GET_PRE_SIGNED_POST_PAYLOAD,
10
+ fetchPolicy: "no-cache",
11
+ variables: {
12
+ data: {
13
+ size: file.size,
14
+ name: file.name,
15
+ type: file.type,
16
+ key: file.key,
17
+ keyPrefix: file.keyPrefix
32
18
  }
33
- });
34
- var getPreSignedPostPayload = response.data.fileManager.getPreSignedPostPayload;
35
- if (getPreSignedPostPayload.error) {
36
- console.error(getPreSignedPostPayload);
37
- throw Error(getPreSignedPostPayload.error);
38
19
  }
20
+ });
21
+ const {
22
+ getPreSignedPostPayload
23
+ } = response.data.fileManager;
24
+ if (getPreSignedPostPayload.error) {
25
+ console.error(getPreSignedPostPayload);
26
+ throw Error(getPreSignedPostPayload.error);
27
+ }
39
28
 
40
- // 2. upload file to S3
41
- return new Promise(function (resolve, reject) {
42
- var formData = new window.FormData();
43
- Object.keys(getPreSignedPostPayload.data.data.fields).forEach(function (key) {
44
- formData.append(key, getPreSignedPostPayload.data.data.fields[key]);
45
- });
46
- formData.append("file", file);
47
- var xhr = new window.XMLHttpRequest();
48
- xhr.upload.addEventListener("progress", function (event) {
49
- if (onProgress) {
50
- onProgress({
51
- sent: event.loaded,
52
- total: file.size,
53
- percentage: event.loaded / file.size * 100
54
- });
55
- }
56
- }, false);
57
- xhr.open("POST", getPreSignedPostPayload.data.data.url, true);
58
- xhr.send(formData);
59
- xhr.onload = function () {
60
- if (this.status === 204) {
61
- resolve(getPreSignedPostPayload.data.file);
62
- return;
63
- }
64
- reject(this.responseText);
65
- };
29
+ // 2. upload file to S3
30
+ return new Promise((resolve, reject) => {
31
+ const formData = new window.FormData();
32
+ Object.keys(getPreSignedPostPayload.data.data.fields).forEach(key => {
33
+ formData.append(key, getPreSignedPostPayload.data.data.fields[key]);
66
34
  });
67
- }
68
- }]);
69
- }();
35
+ formData.append("file", file);
36
+ const xhr = new window.XMLHttpRequest();
37
+ xhr.upload.addEventListener("progress", event => {
38
+ if (onProgress) {
39
+ onProgress({
40
+ sent: event.loaded,
41
+ total: file.size,
42
+ percentage: event.loaded / file.size * 100
43
+ });
44
+ }
45
+ }, false);
46
+ xhr.open("POST", getPreSignedPostPayload.data.data.url, true);
47
+ xhr.send(formData);
48
+ xhr.onload = function () {
49
+ if (this.status === 204) {
50
+ resolve(getPreSignedPostPayload.data.file);
51
+ return;
52
+ }
53
+ reject(this.responseText);
54
+ };
55
+ });
56
+ }
57
+ }
70
58
 
71
59
  //# sourceMappingURL=SimpleUploadStrategy.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_graphql","require","SimpleUploadStrategy","exports","_classCallCheck2","default","_createClass2","key","value","upload","file","_ref","apolloClient","onProgress","response","query","GET_PRE_SIGNED_POST_PAYLOAD","fetchPolicy","variables","data","size","name","type","keyPrefix","getPreSignedPostPayload","fileManager","error","console","Error","Promise","resolve","reject","formData","window","FormData","Object","keys","fields","forEach","append","xhr","XMLHttpRequest","addEventListener","event","sent","loaded","total","percentage","open","url","send","onload","status","responseText"],"sources":["SimpleUploadStrategy.ts"],"sourcesContent":["import { UploadedFile, UploadOptions } from \"@webiny/app/types\";\nimport { GET_PRE_SIGNED_POST_PAYLOAD } from \"./graphql\";\nimport { FileUploadStrategy } from \"~/index\";\n\ndeclare global {\n interface File {\n key?: string;\n keyPrefix?: string;\n }\n}\n\nexport class SimpleUploadStrategy implements FileUploadStrategy {\n async upload(file: File, { apolloClient, onProgress }: UploadOptions): Promise<UploadedFile> {\n // 1. GET PreSignedPostPayload\n const response = await apolloClient.query({\n query: GET_PRE_SIGNED_POST_PAYLOAD,\n fetchPolicy: \"no-cache\",\n variables: {\n data: {\n size: file.size,\n name: file.name,\n type: file.type,\n key: file.key,\n keyPrefix: file.keyPrefix\n }\n }\n });\n\n const { getPreSignedPostPayload } = response.data.fileManager;\n if (getPreSignedPostPayload.error) {\n console.error(getPreSignedPostPayload);\n throw Error(getPreSignedPostPayload.error);\n }\n\n // 2. upload file to S3\n return new Promise((resolve, reject) => {\n const formData = new window.FormData();\n Object.keys(getPreSignedPostPayload.data.data.fields).forEach(key => {\n formData.append(key, getPreSignedPostPayload.data.data.fields[key]);\n });\n\n formData.append(\"file\", file);\n\n const xhr = new window.XMLHttpRequest();\n xhr.upload.addEventListener(\n \"progress\",\n event => {\n if (onProgress) {\n onProgress({\n sent: event.loaded,\n total: file.size,\n percentage: (event.loaded / file.size) * 100\n });\n }\n },\n false\n );\n xhr.open(\"POST\", getPreSignedPostPayload.data.data.url, true);\n xhr.send(formData);\n xhr.onload = function () {\n if (this.status === 204) {\n resolve(getPreSignedPostPayload.data.file);\n return;\n }\n\n reject(this.responseText);\n };\n });\n }\n}\n"],"mappings":";;;;;;;;;AACA,IAAAA,QAAA,GAAAC,OAAA;AAAwD,IAU3CC,oBAAoB,GAAAC,OAAA,CAAAD,oBAAA;EAAA,SAAAA,qBAAA;IAAA,IAAAE,gBAAA,CAAAC,OAAA,QAAAH,oBAAA;EAAA;EAAA,WAAAI,aAAA,CAAAD,OAAA,EAAAH,oBAAA;IAAAK,GAAA;IAAAC,KAAA,EAC7B,eAAMC,MAAMA,CAACC,IAAU,EAAAC,IAAA,EAAsE;MAAA,IAAlEC,YAAY,GAAAD,IAAA,CAAZC,YAAY;QAAEC,UAAU,GAAAF,IAAA,CAAVE,UAAU;MAC/C;MACA,IAAMC,QAAQ,GAAG,MAAMF,YAAY,CAACG,KAAK,CAAC;QACtCA,KAAK,EAAEC,oCAA2B;QAClCC,WAAW,EAAE,UAAU;QACvBC,SAAS,EAAE;UACPC,IAAI,EAAE;YACFC,IAAI,EAAEV,IAAI,CAACU,IAAI;YACfC,IAAI,EAAEX,IAAI,CAACW,IAAI;YACfC,IAAI,EAAEZ,IAAI,CAACY,IAAI;YACff,GAAG,EAAEG,IAAI,CAACH,GAAG;YACbgB,SAAS,EAAEb,IAAI,CAACa;UACpB;QACJ;MACJ,CAAC,CAAC;MAEF,IAAQC,uBAAuB,GAAKV,QAAQ,CAACK,IAAI,CAACM,WAAW,CAArDD,uBAAuB;MAC/B,IAAIA,uBAAuB,CAACE,KAAK,EAAE;QAC/BC,OAAO,CAACD,KAAK,CAACF,uBAAuB,CAAC;QACtC,MAAMI,KAAK,CAACJ,uBAAuB,CAACE,KAAK,CAAC;MAC9C;;MAEA;MACA,OAAO,IAAIG,OAAO,CAAC,UAACC,OAAO,EAAEC,MAAM,EAAK;QACpC,IAAMC,QAAQ,GAAG,IAAIC,MAAM,CAACC,QAAQ,CAAC,CAAC;QACtCC,MAAM,CAACC,IAAI,CAACZ,uBAAuB,CAACL,IAAI,CAACA,IAAI,CAACkB,MAAM,CAAC,CAACC,OAAO,CAAC,UAAA/B,GAAG,EAAI;UACjEyB,QAAQ,CAACO,MAAM,CAAChC,GAAG,EAAEiB,uBAAuB,CAACL,IAAI,CAACA,IAAI,CAACkB,MAAM,CAAC9B,GAAG,CAAC,CAAC;QACvE,CAAC,CAAC;QAEFyB,QAAQ,CAACO,MAAM,CAAC,MAAM,EAAE7B,IAAI,CAAC;QAE7B,IAAM8B,GAAG,GAAG,IAAIP,MAAM,CAACQ,cAAc,CAAC,CAAC;QACvCD,GAAG,CAAC/B,MAAM,CAACiC,gBAAgB,CACvB,UAAU,EACV,UAAAC,KAAK,EAAI;UACL,IAAI9B,UAAU,EAAE;YACZA,UAAU,CAAC;cACP+B,IAAI,EAAED,KAAK,CAACE,MAAM;cAClBC,KAAK,EAAEpC,IAAI,CAACU,IAAI;cAChB2B,UAAU,EAAGJ,KAAK,CAACE,MAAM,GAAGnC,IAAI,CAACU,IAAI,GAAI;YAC7C,CAAC,CAAC;UACN;QACJ,CAAC,EACD,KACJ,CAAC;QACDoB,GAAG,CAACQ,IAAI,CAAC,MAAM,EAAExB,uBAAuB,CAACL,IAAI,CAACA,IAAI,CAAC8B,GAAG,EAAE,IAAI,CAAC;QAC7DT,GAAG,CAACU,IAAI,CAAClB,QAAQ,CAAC;QAClBQ,GAAG,CAACW,MAAM,GAAG,YAAY;UACrB,IAAI,IAAI,CAACC,MAAM,KAAK,GAAG,EAAE;YACrBtB,OAAO,CAACN,uBAAuB,CAACL,IAAI,CAACT,IAAI,CAAC;YAC1C;UACJ;UAEAqB,MAAM,CAAC,IAAI,CAACsB,YAAY,CAAC;QAC7B,CAAC;MACL,CAAC,CAAC;IACN;EAAC;AAAA","ignoreList":[]}
1
+ {"version":3,"names":["GET_PRE_SIGNED_POST_PAYLOAD","SimpleUploadStrategy","upload","file","apolloClient","onProgress","response","query","fetchPolicy","variables","data","size","name","type","key","keyPrefix","getPreSignedPostPayload","fileManager","error","console","Error","Promise","resolve","reject","formData","window","FormData","Object","keys","fields","forEach","append","xhr","XMLHttpRequest","addEventListener","event","sent","loaded","total","percentage","open","url","send","onload","status","responseText"],"sources":["SimpleUploadStrategy.ts"],"sourcesContent":["import type { UploadedFile, UploadOptions } from \"@webiny/app/types.js\";\nimport { GET_PRE_SIGNED_POST_PAYLOAD } from \"./graphql.js\";\nimport type { FileUploadStrategy } from \"~/index.js\";\n\ndeclare global {\n interface File {\n key?: string;\n keyPrefix?: string;\n }\n}\n\nexport class SimpleUploadStrategy implements FileUploadStrategy {\n async upload(file: File, { apolloClient, onProgress }: UploadOptions): Promise<UploadedFile> {\n // 1. GET PreSignedPostPayload\n const response = await apolloClient.query({\n query: GET_PRE_SIGNED_POST_PAYLOAD,\n fetchPolicy: \"no-cache\",\n variables: {\n data: {\n size: file.size,\n name: file.name,\n type: file.type,\n key: file.key,\n keyPrefix: file.keyPrefix\n }\n }\n });\n\n const { getPreSignedPostPayload } = response.data.fileManager;\n if (getPreSignedPostPayload.error) {\n console.error(getPreSignedPostPayload);\n throw Error(getPreSignedPostPayload.error);\n }\n\n // 2. upload file to S3\n return new Promise((resolve, reject) => {\n const formData = new window.FormData();\n Object.keys(getPreSignedPostPayload.data.data.fields).forEach(key => {\n formData.append(key, getPreSignedPostPayload.data.data.fields[key]);\n });\n\n formData.append(\"file\", file);\n\n const xhr = new window.XMLHttpRequest();\n xhr.upload.addEventListener(\n \"progress\",\n event => {\n if (onProgress) {\n onProgress({\n sent: event.loaded,\n total: file.size,\n percentage: (event.loaded / file.size) * 100\n });\n }\n },\n false\n );\n xhr.open(\"POST\", getPreSignedPostPayload.data.data.url, true);\n xhr.send(formData);\n xhr.onload = function () {\n if (this.status === 204) {\n resolve(getPreSignedPostPayload.data.file);\n return;\n }\n\n reject(this.responseText);\n };\n });\n }\n}\n"],"mappings":"AACA,SAASA,2BAA2B;AAUpC,OAAO,MAAMC,oBAAoB,CAA+B;EAC5D,MAAMC,MAAMA,CAACC,IAAU,EAAE;IAAEC,YAAY;IAAEC;EAA0B,CAAC,EAAyB;IACzF;IACA,MAAMC,QAAQ,GAAG,MAAMF,YAAY,CAACG,KAAK,CAAC;MACtCA,KAAK,EAAEP,2BAA2B;MAClCQ,WAAW,EAAE,UAAU;MACvBC,SAAS,EAAE;QACPC,IAAI,EAAE;UACFC,IAAI,EAAER,IAAI,CAACQ,IAAI;UACfC,IAAI,EAAET,IAAI,CAACS,IAAI;UACfC,IAAI,EAAEV,IAAI,CAACU,IAAI;UACfC,GAAG,EAAEX,IAAI,CAACW,GAAG;UACbC,SAAS,EAAEZ,IAAI,CAACY;QACpB;MACJ;IACJ,CAAC,CAAC;IAEF,MAAM;MAAEC;IAAwB,CAAC,GAAGV,QAAQ,CAACI,IAAI,CAACO,WAAW;IAC7D,IAAID,uBAAuB,CAACE,KAAK,EAAE;MAC/BC,OAAO,CAACD,KAAK,CAACF,uBAAuB,CAAC;MACtC,MAAMI,KAAK,CAACJ,uBAAuB,CAACE,KAAK,CAAC;IAC9C;;IAEA;IACA,OAAO,IAAIG,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACpC,MAAMC,QAAQ,GAAG,IAAIC,MAAM,CAACC,QAAQ,CAAC,CAAC;MACtCC,MAAM,CAACC,IAAI,CAACZ,uBAAuB,CAACN,IAAI,CAACA,IAAI,CAACmB,MAAM,CAAC,CAACC,OAAO,CAAChB,GAAG,IAAI;QACjEU,QAAQ,CAACO,MAAM,CAACjB,GAAG,EAAEE,uBAAuB,CAACN,IAAI,CAACA,IAAI,CAACmB,MAAM,CAACf,GAAG,CAAC,CAAC;MACvE,CAAC,CAAC;MAEFU,QAAQ,CAACO,MAAM,CAAC,MAAM,EAAE5B,IAAI,CAAC;MAE7B,MAAM6B,GAAG,GAAG,IAAIP,MAAM,CAACQ,cAAc,CAAC,CAAC;MACvCD,GAAG,CAAC9B,MAAM,CAACgC,gBAAgB,CACvB,UAAU,EACVC,KAAK,IAAI;QACL,IAAI9B,UAAU,EAAE;UACZA,UAAU,CAAC;YACP+B,IAAI,EAAED,KAAK,CAACE,MAAM;YAClBC,KAAK,EAAEnC,IAAI,CAACQ,IAAI;YAChB4B,UAAU,EAAGJ,KAAK,CAACE,MAAM,GAAGlC,IAAI,CAACQ,IAAI,GAAI;UAC7C,CAAC,CAAC;QACN;MACJ,CAAC,EACD,KACJ,CAAC;MACDqB,GAAG,CAACQ,IAAI,CAAC,MAAM,EAAExB,uBAAuB,CAACN,IAAI,CAACA,IAAI,CAAC+B,GAAG,EAAE,IAAI,CAAC;MAC7DT,GAAG,CAACU,IAAI,CAAClB,QAAQ,CAAC;MAClBQ,GAAG,CAACW,MAAM,GAAG,YAAY;QACrB,IAAI,IAAI,CAACC,MAAM,KAAK,GAAG,EAAE;UACrBtB,OAAO,CAACN,uBAAuB,CAACN,IAAI,CAACP,IAAI,CAAC;UAC1C;QACJ;QAEAoB,MAAM,CAAC,IAAI,CAACsB,YAAY,CAAC;MAC7B,CAAC;IACL,CAAC,CAAC;EACN;AACJ","ignoreList":[]}
package/graphql.js CHANGED
@@ -1,13 +1,24 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.GET_PRE_SIGNED_POST_PAYLOAD = void 0;
8
- var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
9
- var _graphqlTag = _interopRequireDefault(require("graphql-tag"));
10
- var _templateObject;
11
- var GET_PRE_SIGNED_POST_PAYLOAD = exports.GET_PRE_SIGNED_POST_PAYLOAD = (0, _graphqlTag.default)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n query getPreSignedPostPayload($data: PreSignedPostPayloadInput!) {\n fileManager {\n getPreSignedPostPayload(data: $data) {\n data {\n data\n file {\n id\n type\n name\n size\n key\n }\n }\n error {\n message\n }\n }\n }\n }\n"])));
1
+ import gql from "graphql-tag";
2
+ export const GET_PRE_SIGNED_POST_PAYLOAD = gql`
3
+ query getPreSignedPostPayload($data: PreSignedPostPayloadInput!) {
4
+ fileManager {
5
+ getPreSignedPostPayload(data: $data) {
6
+ data {
7
+ data
8
+ file {
9
+ id
10
+ type
11
+ name
12
+ size
13
+ key
14
+ }
15
+ }
16
+ error {
17
+ message
18
+ }
19
+ }
20
+ }
21
+ }
22
+ `;
12
23
 
13
24
  //# sourceMappingURL=graphql.js.map
package/graphql.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["_graphqlTag","_interopRequireDefault","require","_templateObject","GET_PRE_SIGNED_POST_PAYLOAD","exports","gql","_taggedTemplateLiteral2","default"],"sources":["graphql.ts"],"sourcesContent":["import gql from \"graphql-tag\";\n\nexport const GET_PRE_SIGNED_POST_PAYLOAD = gql`\n query getPreSignedPostPayload($data: PreSignedPostPayloadInput!) {\n fileManager {\n getPreSignedPostPayload(data: $data) {\n data {\n data\n file {\n id\n type\n name\n size\n key\n }\n }\n error {\n message\n }\n }\n }\n }\n`;\n"],"mappings":";;;;;;;;AAAA,IAAAA,WAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA8B,IAAAC,eAAA;AAEvB,IAAMC,2BAA2B,GAAAC,OAAA,CAAAD,2BAAA,OAAGE,mBAAG,EAAAH,eAAA,KAAAA,eAAA,OAAAI,uBAAA,CAAAC,OAAA,mhBAoB7C","ignoreList":[]}
1
+ {"version":3,"names":["gql","GET_PRE_SIGNED_POST_PAYLOAD"],"sources":["graphql.ts"],"sourcesContent":["import gql from \"graphql-tag\";\n\nexport const GET_PRE_SIGNED_POST_PAYLOAD = gql`\n query getPreSignedPostPayload($data: PreSignedPostPayloadInput!) {\n fileManager {\n getPreSignedPostPayload(data: $data) {\n data {\n data\n file {\n id\n type\n name\n size\n key\n }\n }\n error {\n message\n }\n }\n }\n }\n`;\n"],"mappings":"AAAA,OAAOA,GAAG,MAAM,aAAa;AAE7B,OAAO,MAAMC,2BAA2B,GAAGD,GAAG;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC","ignoreList":[]}
package/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { FileUploaderPlugin } from "@webiny/app/types";
1
+ import type { FileUploaderPlugin } from "@webiny/app/types.js";
2
2
  export interface FileUploadStrategy {
3
3
  upload: FileUploaderPlugin["upload"];
4
4
  }
package/index.js CHANGED
@@ -1,34 +1,18 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.default = void 0;
8
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
9
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
10
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
- var _SimpleUploadStrategy = require("./SimpleUploadStrategy");
12
- var _MultiPartUploadStrategy = require("./MultiPartUploadStrategy");
13
- var _default = exports.default = function _default() {
14
- var S3FileUploader = /*#__PURE__*/function () {
15
- function S3FileUploader() {
16
- (0, _classCallCheck2.default)(this, S3FileUploader);
17
- (0, _defineProperty2.default)(this, "type", "file-uploader");
18
- (0, _defineProperty2.default)(this, "name", "file-uploader");
1
+ import { SimpleUploadStrategy } from "./SimpleUploadStrategy.js";
2
+ import { MultiPartUploadStrategy } from "./MultiPartUploadStrategy.js";
3
+ export default () => {
4
+ class S3FileUploader {
5
+ type = "file-uploader";
6
+ name = "file-uploader";
7
+ upload(file, options) {
8
+ // Use "simple" strategy for files smaller than ~100MB
9
+ // @ts-expect-error
10
+ const multiPartThreshold = window["fmUploadMultiPartThreshold"] ?? 100;
11
+ const simple = file.size < multiPartThreshold * 1024 * 1024;
12
+ const strategy = simple ? new SimpleUploadStrategy() : new MultiPartUploadStrategy();
13
+ return strategy.upload(file, options);
19
14
  }
20
- return (0, _createClass2.default)(S3FileUploader, [{
21
- key: "upload",
22
- value: function upload(file, options) {
23
- // Use "simple" strategy for files smaller than ~100MB
24
- // @ts-expect-error
25
- var multiPartThreshold = window["fmUploadMultiPartThreshold"] ?? 100;
26
- var simple = file.size < multiPartThreshold * 1024 * 1024;
27
- var strategy = simple ? new _SimpleUploadStrategy.SimpleUploadStrategy() : new _MultiPartUploadStrategy.MultiPartUploadStrategy();
28
- return strategy.upload(file, options);
29
- }
30
- }]);
31
- }();
15
+ }
32
16
  return new S3FileUploader();
33
17
  };
34
18
 
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["_SimpleUploadStrategy","require","_MultiPartUploadStrategy","_default","exports","default","S3FileUploader","_classCallCheck2","_defineProperty2","_createClass2","key","value","upload","file","options","multiPartThreshold","window","simple","size","strategy","SimpleUploadStrategy","MultiPartUploadStrategy"],"sources":["index.ts"],"sourcesContent":["import { FileUploaderPlugin, UploadOptions } from \"@webiny/app/types\";\nimport { SimpleUploadStrategy } from \"~/SimpleUploadStrategy\";\nimport { MultiPartUploadStrategy } from \"~/MultiPartUploadStrategy\";\n\nexport interface FileUploadStrategy {\n upload: FileUploaderPlugin[\"upload\"];\n}\n\nexport default (): FileUploaderPlugin => {\n class S3FileUploader implements FileUploaderPlugin {\n public readonly type = \"file-uploader\";\n public readonly name = \"file-uploader\";\n\n upload(file: File, options: UploadOptions) {\n // Use \"simple\" strategy for files smaller than ~100MB\n // @ts-expect-error\n const multiPartThreshold = window[\"fmUploadMultiPartThreshold\"] ?? 100;\n const simple = file.size < multiPartThreshold * 1024 * 1024;\n\n const strategy: FileUploadStrategy = simple\n ? new SimpleUploadStrategy()\n : new MultiPartUploadStrategy();\n\n return strategy.upload(file, options);\n }\n }\n\n return new S3FileUploader();\n};\n"],"mappings":";;;;;;;;;;AACA,IAAAA,qBAAA,GAAAC,OAAA;AACA,IAAAC,wBAAA,GAAAD,OAAA;AAAoE,IAAAE,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAMrD,SAAAF,SAAA,EAA0B;EAAA,IAC/BG,cAAc;IAAA,SAAAA,eAAA;MAAA,IAAAC,gBAAA,CAAAF,OAAA,QAAAC,cAAA;MAAA,IAAAE,gBAAA,CAAAH,OAAA,gBACO,eAAe;MAAA,IAAAG,gBAAA,CAAAH,OAAA,gBACf,eAAe;IAAA;IAAA,WAAAI,aAAA,CAAAJ,OAAA,EAAAC,cAAA;MAAAI,GAAA;MAAAC,KAAA,EAEtC,SAAAC,MAAMA,CAACC,IAAU,EAAEC,OAAsB,EAAE;QACvC;QACA;QACA,IAAMC,kBAAkB,GAAGC,MAAM,CAAC,4BAA4B,CAAC,IAAI,GAAG;QACtE,IAAMC,MAAM,GAAGJ,IAAI,CAACK,IAAI,GAAGH,kBAAkB,GAAG,IAAI,GAAG,IAAI;QAE3D,IAAMI,QAA4B,GAAGF,MAAM,GACrC,IAAIG,0CAAoB,CAAC,CAAC,GAC1B,IAAIC,gDAAuB,CAAC,CAAC;QAEnC,OAAOF,QAAQ,CAACP,MAAM,CAACC,IAAI,EAAEC,OAAO,CAAC;MACzC;IAAC;EAAA;EAGL,OAAO,IAAIR,cAAc,CAAC,CAAC;AAC/B,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["SimpleUploadStrategy","MultiPartUploadStrategy","S3FileUploader","type","name","upload","file","options","multiPartThreshold","window","simple","size","strategy"],"sources":["index.ts"],"sourcesContent":["import type { FileUploaderPlugin, UploadOptions } from \"@webiny/app/types.js\";\nimport { SimpleUploadStrategy } from \"~/SimpleUploadStrategy.js\";\nimport { MultiPartUploadStrategy } from \"~/MultiPartUploadStrategy.js\";\n\nexport interface FileUploadStrategy {\n upload: FileUploaderPlugin[\"upload\"];\n}\n\nexport default (): FileUploaderPlugin => {\n class S3FileUploader implements FileUploaderPlugin {\n public readonly type = \"file-uploader\";\n public readonly name = \"file-uploader\";\n\n upload(file: File, options: UploadOptions) {\n // Use \"simple\" strategy for files smaller than ~100MB\n // @ts-expect-error\n const multiPartThreshold = window[\"fmUploadMultiPartThreshold\"] ?? 100;\n const simple = file.size < multiPartThreshold * 1024 * 1024;\n\n const strategy: FileUploadStrategy = simple\n ? new SimpleUploadStrategy()\n : new MultiPartUploadStrategy();\n\n return strategy.upload(file, options);\n }\n }\n\n return new S3FileUploader();\n};\n"],"mappings":"AACA,SAASA,oBAAoB;AAC7B,SAASC,uBAAuB;AAMhC,eAAe,MAA0B;EACrC,MAAMC,cAAc,CAA+B;IAC/BC,IAAI,GAAG,eAAe;IACtBC,IAAI,GAAG,eAAe;IAEtCC,MAAMA,CAACC,IAAU,EAAEC,OAAsB,EAAE;MACvC;MACA;MACA,MAAMC,kBAAkB,GAAGC,MAAM,CAAC,4BAA4B,CAAC,IAAI,GAAG;MACtE,MAAMC,MAAM,GAAGJ,IAAI,CAACK,IAAI,GAAGH,kBAAkB,GAAG,IAAI,GAAG,IAAI;MAE3D,MAAMI,QAA4B,GAAGF,MAAM,GACrC,IAAIV,oBAAoB,CAAC,CAAC,GAC1B,IAAIC,uBAAuB,CAAC,CAAC;MAEnC,OAAOW,QAAQ,CAACP,MAAM,CAACC,IAAI,EAAEC,OAAO,CAAC;IACzC;EACJ;EAEA,OAAO,IAAIL,cAAc,CAAC,CAAC;AAC/B,CAAC","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@webiny/app-file-manager-s3",
3
- "version": "5.44.1-beta.0",
3
+ "version": "5.45.0-beta.0",
4
+ "type": "module",
4
5
  "main": "index.js",
5
6
  "repository": {
6
7
  "type": "git",
@@ -10,22 +11,18 @@
10
11
  "author": "Webiny Ltd",
11
12
  "license": "MIT",
12
13
  "dependencies": {
13
- "@webiny/app": "5.44.1-beta.0",
14
+ "@webiny/app": "5.45.0-beta.0",
14
15
  "graphql-tag": "2.12.6",
15
- "p-retry": "4.6.2"
16
+ "p-retry": "7.1.1"
16
17
  },
17
18
  "devDependencies": {
18
- "@webiny/project-utils": "5.44.1-beta.0",
19
- "rimraf": "6.0.1",
20
- "typescript": "5.3.3"
19
+ "@webiny/build-tools": "5.45.0-beta.0",
20
+ "rimraf": "6.1.3",
21
+ "typescript": "5.9.3"
21
22
  },
22
23
  "publishConfig": {
23
24
  "access": "public",
24
25
  "directory": "dist"
25
26
  },
26
- "scripts": {
27
- "build": "node ../cli/bin.js run build",
28
- "watch": "node ../cli/bin.js run watch"
29
- },
30
- "gitHead": "c80e6d88501ac84229f6577dee7b30163a906379"
27
+ "gitHead": "b85c33cfbe7c02c130445c918d913ef4b2c09cb2"
31
28
  }