@webiny/sdk 6.3.0 → 6.4.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/BaseError.js +8 -7
  2. package/BaseError.js.map +1 -1
  3. package/CmsSdk.js +34 -33
  4. package/CmsSdk.js.map +1 -1
  5. package/FileManagerSdk.js +50 -49
  6. package/FileManagerSdk.js.map +1 -1
  7. package/LanguagesSdk.js +10 -9
  8. package/LanguagesSdk.js.map +1 -1
  9. package/Result.js +40 -134
  10. package/Result.js.map +1 -1
  11. package/TasksSdk.js +26 -25
  12. package/TasksSdk.js.map +1 -1
  13. package/TenantManagerSdk.js +26 -25
  14. package/TenantManagerSdk.js.map +1 -1
  15. package/Webiny.js +24 -26
  16. package/Webiny.js.map +1 -1
  17. package/errors.js +31 -48
  18. package/errors.js.map +1 -1
  19. package/index.js +1 -21
  20. package/methods/cms/cmsTypes.js +0 -3
  21. package/methods/cms/createEntry.js +14 -39
  22. package/methods/cms/createEntry.js.map +1 -1
  23. package/methods/cms/deleteEntryRevision.js +12 -30
  24. package/methods/cms/deleteEntryRevision.js.map +1 -1
  25. package/methods/cms/getEntry.js +15 -36
  26. package/methods/cms/getEntry.js.map +1 -1
  27. package/methods/cms/listEntries.js +22 -51
  28. package/methods/cms/listEntries.js.map +1 -1
  29. package/methods/cms/publishEntryRevision.js +14 -33
  30. package/methods/cms/publishEntryRevision.js.map +1 -1
  31. package/methods/cms/schemas.js +39 -35
  32. package/methods/cms/schemas.js.map +1 -1
  33. package/methods/cms/unpublishEntryRevision.js +14 -33
  34. package/methods/cms/unpublishEntryRevision.js.map +1 -1
  35. package/methods/cms/updateEntryRevision.js +15 -42
  36. package/methods/cms/updateEntryRevision.js.map +1 -1
  37. package/methods/executeGraphQL.js +38 -41
  38. package/methods/executeGraphQL.js.map +1 -1
  39. package/methods/fileManager/buildFieldsSelection.js +25 -67
  40. package/methods/fileManager/buildFieldsSelection.js.map +1 -1
  41. package/methods/fileManager/completeMultiPartUpload.js +12 -29
  42. package/methods/fileManager/completeMultiPartUpload.js.map +1 -1
  43. package/methods/fileManager/createFile.js +61 -125
  44. package/methods/fileManager/createFile.js.map +1 -1
  45. package/methods/fileManager/createFiles.js +41 -76
  46. package/methods/fileManager/createFiles.js.map +1 -1
  47. package/methods/fileManager/createMultiPartUpload.js +12 -29
  48. package/methods/fileManager/createMultiPartUpload.js.map +1 -1
  49. package/methods/fileManager/deleteFile.js +11 -26
  50. package/methods/fileManager/deleteFile.js.map +1 -1
  51. package/methods/fileManager/fileManagerTypes.js +19 -18
  52. package/methods/fileManager/fileManagerTypes.js.map +1 -1
  53. package/methods/fileManager/getFile.js +15 -30
  54. package/methods/fileManager/getFile.js.map +1 -1
  55. package/methods/fileManager/getPresignedPostPayload.js +17 -40
  56. package/methods/fileManager/getPresignedPostPayload.js.map +1 -1
  57. package/methods/fileManager/getPresignedPostPayloads.js +17 -32
  58. package/methods/fileManager/getPresignedPostPayloads.js.map +1 -1
  59. package/methods/fileManager/listFiles.js +22 -45
  60. package/methods/fileManager/listFiles.js.map +1 -1
  61. package/methods/fileManager/listTags.js +11 -25
  62. package/methods/fileManager/listTags.js.map +1 -1
  63. package/methods/fileManager/schemas.js +15 -14
  64. package/methods/fileManager/schemas.js.map +1 -1
  65. package/methods/fileManager/updateFile.js +12 -29
  66. package/methods/fileManager/updateFile.js.map +1 -1
  67. package/methods/fileManager/utils/fileTypeDetection.js +10 -12
  68. package/methods/fileManager/utils/fileTypeDetection.js.map +1 -1
  69. package/methods/fileManager/utils/uploadLargeFile.js +86 -165
  70. package/methods/fileManager/utils/uploadLargeFile.js.map +1 -1
  71. package/methods/fileManager/utils/uploadToS3.js +41 -94
  72. package/methods/fileManager/utils/uploadToS3.js.map +1 -1
  73. package/methods/languages/listLanguages.js +8 -11
  74. package/methods/languages/listLanguages.js.map +1 -1
  75. package/methods/tasks/abortTask.js +11 -17
  76. package/methods/tasks/abortTask.js.map +1 -1
  77. package/methods/tasks/listDefinitions.js +8 -11
  78. package/methods/tasks/listDefinitions.js.map +1 -1
  79. package/methods/tasks/listLogs.js +10 -15
  80. package/methods/tasks/listLogs.js.map +1 -1
  81. package/methods/tasks/listTasks.js +8 -11
  82. package/methods/tasks/listTasks.js.map +1 -1
  83. package/methods/tasks/schemas.js +11 -10
  84. package/methods/tasks/schemas.js.map +1 -1
  85. package/methods/tasks/taskTypes.js +0 -3
  86. package/methods/tasks/triggerTask.js +11 -17
  87. package/methods/tasks/triggerTask.js.map +1 -1
  88. package/methods/tenantManager/createTenant.js +10 -24
  89. package/methods/tenantManager/createTenant.js.map +1 -1
  90. package/methods/tenantManager/disableTenant.js +10 -24
  91. package/methods/tenantManager/disableTenant.js.map +1 -1
  92. package/methods/tenantManager/enableTenant.js +10 -24
  93. package/methods/tenantManager/enableTenant.js.map +1 -1
  94. package/methods/tenantManager/getCurrentTenant.js +8 -18
  95. package/methods/tenantManager/getCurrentTenant.js.map +1 -1
  96. package/methods/tenantManager/installTenant.js +10 -24
  97. package/methods/tenantManager/installTenant.js.map +1 -1
  98. package/methods/tenantManager/schemas.js +13 -12
  99. package/methods/tenantManager/schemas.js.map +1 -1
  100. package/methods/tenantManager/tenantManagerTypes.js +0 -3
  101. package/package.json +5 -5
  102. package/types.js +0 -3
  103. package/utils/createMethod.js +6 -24
  104. package/utils/createMethod.js.map +1 -1
  105. package/utils/platform.js +3 -2
  106. package/utils/platform.js.map +1 -1
  107. package/utils/transformFieldErrors.js +14 -33
  108. package/utils/transformFieldErrors.js.map +1 -1
  109. package/utils/validateParams.js +13 -16
  110. package/utils/validateParams.js.map +1 -1
  111. package/index.js.map +0 -1
  112. package/methods/cms/cmsTypes.js.map +0 -1
  113. package/methods/tasks/taskTypes.js.map +0 -1
  114. package/methods/tenantManager/tenantManagerTypes.js.map +0 -1
  115. package/types.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"names":["Result","buildFieldsSelection","transformFieldErrors","createMethod","listFilesSchema","executeGraphQL","ApiError","listFiles","config","fetchFn","params","search","where","limit","after","sort","fields","fieldsSelection","query","result","isFail","error","fail","message","data","code","responseData","value","fileManager","ok","meta"],"sources":["listFiles.ts"],"sourcesContent":["import { Result } from \"../../Result.js\";\nimport type { HttpError, NetworkError } from \"../../errors.js\";\nimport type {\n FmFile,\n FmFileListWhereInput,\n FmFileListSorter,\n FmListMeta\n} from \"./fileManagerTypes.js\";\nimport { buildFieldsSelection } from \"./buildFieldsSelection.js\";\nimport { transformFieldErrors } from \"../../utils/transformFieldErrors.js\";\nimport { createMethod } from \"../../utils/createMethod.js\";\nimport { listFilesSchema } from \"./schemas.js\";\nimport { executeGraphQL } from \"../executeGraphQL.js\";\nimport { ApiError } from \"../../errors.js\";\n\nexport interface ListFilesParams {\n search?: string;\n where?: FmFileListWhereInput;\n limit?: number;\n after?: string;\n sort?: FmFileListSorter[];\n fields: string[];\n}\n\nexport interface ListFilesResult {\n data: FmFile[];\n meta: FmListMeta;\n}\n\n/**\n * Lists files from the file manager.\n *\n * @param config - SDK configuration\n * @param fetchFn - Fetch function to use for HTTP requests\n * @param params - Parameters for listing files\n * @param params.search - Search query\n * @param params.where - Filter conditions\n * @param params.limit - Maximum number of items to return\n * @param params.after - Cursor for pagination\n * @param params.sort - Sort order\n * @returns Result containing the list of files or an error\n */\nexport const listFiles = createMethod(\n listFilesSchema,\n async (\n config,\n fetchFn,\n params\n ): Promise<Result<ListFilesResult, HttpError | ApiError | NetworkError>> => {\n const { search, where, limit, after, sort, fields } = params;\n\n const fieldsSelection = buildFieldsSelection(fields);\n\n const query = `\n query ListFiles($search: String, $where: FmFileListWhereInput, $limit: Int, $after: String, $sort: [FmFileListSorter!]) {\n fileManager {\n listFiles(search: $search, where: $where, limit: $limit, after: $after, sort: $sort) {\n data {\n${fieldsSelection}\n }\n meta {\n cursor\n hasMoreItems\n totalCount\n }\n error {\n message\n code\n }\n }\n }\n }\n `;\n\n const result = await executeGraphQL(config, fetchFn, query, {\n search,\n where,\n limit,\n after,\n sort\n });\n\n if (result.isFail()) {\n const error = result.error;\n if (error instanceof ApiError) {\n return Result.fail(\n new ApiError(transformFieldErrors(error.message, fields), error.data?.code)\n );\n }\n return Result.fail(error);\n }\n\n const responseData = result.value;\n\n if (responseData.fileManager.listFiles.error) {\n return Result.fail(\n new ApiError(\n responseData.fileManager.listFiles.error.message,\n responseData.fileManager.listFiles.error.code\n )\n );\n }\n\n return Result.ok({\n data: responseData.fileManager.listFiles.data as FmFile[],\n meta: responseData.fileManager.listFiles.meta as FmListMeta\n });\n }\n);\n"],"mappings":"AAAA,SAASA,MAAM;AAQf,SAASC,oBAAoB;AAC7B,SAASC,oBAAoB;AAC7B,SAASC,YAAY;AACrB,SAASC,eAAe;AACxB,SAASC,cAAc;AACvB,SAASC,QAAQ;AAgBjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,SAAS,GAAGJ,YAAY,CACjCC,eAAe,EACf,OACII,MAAM,EACNC,OAAO,EACPC,MAAM,KACkE;EACxE,MAAM;IAAEC,MAAM;IAAEC,KAAK;IAAEC,KAAK;IAAEC,KAAK;IAAEC,IAAI;IAAEC;EAAO,CAAC,GAAGN,MAAM;EAE5D,MAAMO,eAAe,GAAGhB,oBAAoB,CAACe,MAAM,CAAC;EAEpD,MAAME,KAAK,GAAG;AACtB;AACA;AACA;AACA;AACA,EAAED,eAAe;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;EAEG,MAAME,MAAM,GAAG,MAAMd,cAAc,CAACG,MAAM,EAAEC,OAAO,EAAES,KAAK,EAAE;IACxDP,MAAM;IACNC,KAAK;IACLC,KAAK;IACLC,KAAK;IACLC;EACJ,CAAC,CAAC;EAEF,IAAII,MAAM,CAACC,MAAM,CAAC,CAAC,EAAE;IACjB,MAAMC,KAAK,GAAGF,MAAM,CAACE,KAAK;IAC1B,IAAIA,KAAK,YAAYf,QAAQ,EAAE;MAC3B,OAAON,MAAM,CAACsB,IAAI,CACd,IAAIhB,QAAQ,CAACJ,oBAAoB,CAACmB,KAAK,CAACE,OAAO,EAAEP,MAAM,CAAC,EAAEK,KAAK,CAACG,IAAI,EAAEC,IAAI,CAC9E,CAAC;IACL;IACA,OAAOzB,MAAM,CAACsB,IAAI,CAACD,KAAK,CAAC;EAC7B;EAEA,MAAMK,YAAY,GAAGP,MAAM,CAACQ,KAAK;EAEjC,IAAID,YAAY,CAACE,WAAW,CAACrB,SAAS,CAACc,KAAK,EAAE;IAC1C,OAAOrB,MAAM,CAACsB,IAAI,CACd,IAAIhB,QAAQ,CACRoB,YAAY,CAACE,WAAW,CAACrB,SAAS,CAACc,KAAK,CAACE,OAAO,EAChDG,YAAY,CAACE,WAAW,CAACrB,SAAS,CAACc,KAAK,CAACI,IAC7C,CACJ,CAAC;EACL;EAEA,OAAOzB,MAAM,CAAC6B,EAAE,CAAC;IACbL,IAAI,EAAEE,YAAY,CAACE,WAAW,CAACrB,SAAS,CAACiB,IAAgB;IACzDM,IAAI,EAAEJ,YAAY,CAACE,WAAW,CAACrB,SAAS,CAACuB;EAC7C,CAAC,CAAC;AACN,CACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"methods/fileManager/listFiles.js","sources":["../../../src/methods/fileManager/listFiles.ts"],"sourcesContent":["import { Result } from \"../../Result.js\";\nimport type { HttpError, NetworkError } from \"../../errors.js\";\nimport type {\n FmFile,\n FmFileListWhereInput,\n FmFileListSorter,\n FmListMeta\n} from \"./fileManagerTypes.js\";\nimport { buildFieldsSelection } from \"./buildFieldsSelection.js\";\nimport { transformFieldErrors } from \"../../utils/transformFieldErrors.js\";\nimport { createMethod } from \"../../utils/createMethod.js\";\nimport { listFilesSchema } from \"./schemas.js\";\nimport { executeGraphQL } from \"../executeGraphQL.js\";\nimport { ApiError } from \"../../errors.js\";\n\nexport interface ListFilesParams {\n search?: string;\n where?: FmFileListWhereInput;\n limit?: number;\n after?: string;\n sort?: FmFileListSorter[];\n fields: string[];\n}\n\nexport interface ListFilesResult {\n data: FmFile[];\n meta: FmListMeta;\n}\n\n/**\n * Lists files from the file manager.\n *\n * @param config - SDK configuration\n * @param fetchFn - Fetch function to use for HTTP requests\n * @param params - Parameters for listing files\n * @param params.search - Search query\n * @param params.where - Filter conditions\n * @param params.limit - Maximum number of items to return\n * @param params.after - Cursor for pagination\n * @param params.sort - Sort order\n * @returns Result containing the list of files or an error\n */\nexport const listFiles = createMethod(\n listFilesSchema,\n async (\n config,\n fetchFn,\n params\n ): Promise<Result<ListFilesResult, HttpError | ApiError | NetworkError>> => {\n const { search, where, limit, after, sort, fields } = params;\n\n const fieldsSelection = buildFieldsSelection(fields);\n\n const query = `\n query ListFiles($search: String, $where: FmFileListWhereInput, $limit: Int, $after: String, $sort: [FmFileListSorter!]) {\n fileManager {\n listFiles(search: $search, where: $where, limit: $limit, after: $after, sort: $sort) {\n data {\n${fieldsSelection}\n }\n meta {\n cursor\n hasMoreItems\n totalCount\n }\n error {\n message\n code\n }\n }\n }\n }\n `;\n\n const result = await executeGraphQL(config, fetchFn, query, {\n search,\n where,\n limit,\n after,\n sort\n });\n\n if (result.isFail()) {\n const error = result.error;\n if (error instanceof ApiError) {\n return Result.fail(\n new ApiError(transformFieldErrors(error.message, fields), error.data?.code)\n );\n }\n return Result.fail(error);\n }\n\n const responseData = result.value;\n\n if (responseData.fileManager.listFiles.error) {\n return Result.fail(\n new ApiError(\n responseData.fileManager.listFiles.error.message,\n responseData.fileManager.listFiles.error.code\n )\n );\n }\n\n return Result.ok({\n data: responseData.fileManager.listFiles.data as FmFile[],\n meta: responseData.fileManager.listFiles.meta as FmListMeta\n });\n }\n);\n"],"names":["listFiles","createMethod","listFilesSchema","config","fetchFn","params","search","where","limit","after","sort","fields","fieldsSelection","buildFieldsSelection","query","result","executeGraphQL","error","ApiError","Result","transformFieldErrors","responseData"],"mappings":";;;;;;;AA0CO,MAAMA,YAAYC,aACrBC,iBACA,OACIC,QACAC,SACAC;IAEA,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAEC,KAAK,EAAEC,IAAI,EAAEC,MAAM,EAAE,GAAGN;IAEtD,MAAMO,kBAAkBC,qBAAqBF;IAE7C,MAAMG,QAAQ,CAAC;;;;;AAKvB,EAAEF,gBAAgB;;;;;;;;;;;;;;IAcd,CAAC;IAEG,MAAMG,SAAS,MAAMC,eAAeb,QAAQC,SAASU,OAAO;QACxDR;QACAC;QACAC;QACAC;QACAC;IACJ;IAEA,IAAIK,OAAO,MAAM,IAAI;QACjB,MAAME,QAAQF,OAAO,KAAK;QAC1B,IAAIE,iBAAiBC,UACjB,OAAOC,OAAO,IAAI,CACd,IAAID,SAASE,qBAAqBH,MAAM,OAAO,EAAEN,SAASM,MAAM,IAAI,EAAE;QAG9E,OAAOE,OAAO,IAAI,CAACF;IACvB;IAEA,MAAMI,eAAeN,OAAO,KAAK;IAEjC,IAAIM,aAAa,WAAW,CAAC,SAAS,CAAC,KAAK,EACxC,OAAOF,OAAO,IAAI,CACd,IAAID,SACAG,aAAa,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAChDA,aAAa,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI;IAKzD,OAAOF,OAAO,EAAE,CAAC;QACb,MAAME,aAAa,WAAW,CAAC,SAAS,CAAC,IAAI;QAC7C,MAAMA,aAAa,WAAW,CAAC,SAAS,CAAC,IAAI;IACjD;AACJ"}
@@ -1,20 +1,9 @@
1
1
  import { Result } from "../../Result.js";
2
2
  import { executeGraphQL } from "../executeGraphQL.js";
3
3
  import { ApiError } from "../../errors.js";
4
- /**
5
- * Lists tags from the file manager.
6
- *
7
- * @param config - SDK configuration
8
- * @param fetchFn - Fetch function to use for HTTP requests
9
- * @param params - Parameters for listing tags
10
- * @param params.where - Filter conditions
11
- * @returns Result containing the list of tags or an error
12
- */
13
- export async function listTags(config, fetchFn, params = {}) {
14
- const {
15
- where
16
- } = params;
17
- const query = `
4
+ async function listTags(config, fetchFn, params = {}) {
5
+ const { where } = params;
6
+ const query = `
18
7
  query ListTags($where: FmTagsListWhereInput) {
19
8
  fileManager {
20
9
  listTags(where: $where) {
@@ -30,17 +19,14 @@ export async function listTags(config, fetchFn, params = {}) {
30
19
  }
31
20
  }
32
21
  `;
33
- const result = await executeGraphQL(config, fetchFn, query, {
34
- where
35
- });
36
- if (result.isFail()) {
37
- return Result.fail(result.error);
38
- }
39
- const responseData = result.value;
40
- if (responseData.fileManager.listTags.error) {
41
- return Result.fail(new ApiError(responseData.fileManager.listTags.error.message, responseData.fileManager.listTags.error.code));
42
- }
43
- return Result.ok(responseData.fileManager.listTags.data);
22
+ const result = await executeGraphQL(config, fetchFn, query, {
23
+ where
24
+ });
25
+ if (result.isFail()) return Result.fail(result.error);
26
+ const responseData = result.value;
27
+ if (responseData.fileManager.listTags.error) return Result.fail(new ApiError(responseData.fileManager.listTags.error.message, responseData.fileManager.listTags.error.code));
28
+ return Result.ok(responseData.fileManager.listTags.data);
44
29
  }
30
+ export { listTags };
45
31
 
46
32
  //# sourceMappingURL=listTags.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","executeGraphQL","ApiError","listTags","config","fetchFn","params","where","query","result","isFail","fail","error","responseData","value","fileManager","message","code","ok","data"],"sources":["listTags.ts"],"sourcesContent":["import type { WebinyConfig } from \"../../types.js\";\nimport { Result } from \"../../Result.js\";\nimport type { HttpError, NetworkError } from \"../../errors.js\";\nimport type { FmTag, FmTagsListWhereInput } from \"./fileManagerTypes.js\";\nimport { executeGraphQL } from \"../executeGraphQL.js\";\nimport { ApiError } from \"../../errors.js\";\n\nexport interface ListTagsParams {\n where?: FmTagsListWhereInput;\n}\n\n/**\n * Lists tags from the file manager.\n *\n * @param config - SDK configuration\n * @param fetchFn - Fetch function to use for HTTP requests\n * @param params - Parameters for listing tags\n * @param params.where - Filter conditions\n * @returns Result containing the list of tags or an error\n */\nexport async function listTags(\n config: WebinyConfig,\n fetchFn: typeof fetch,\n params: ListTagsParams = {}\n): Promise<Result<FmTag[], HttpError | ApiError | NetworkError>> {\n const { where } = params;\n\n const query = `\n query ListTags($where: FmTagsListWhereInput) {\n fileManager {\n listTags(where: $where) {\n data {\n tag\n count\n }\n error {\n message\n code\n }\n }\n }\n }\n `;\n\n const result = await executeGraphQL(config, fetchFn, query, { where });\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const responseData = result.value;\n\n if (responseData.fileManager.listTags.error) {\n return Result.fail(\n new ApiError(\n responseData.fileManager.listTags.error.message,\n responseData.fileManager.listTags.error.code\n )\n );\n }\n\n return Result.ok(responseData.fileManager.listTags.data);\n}\n"],"mappings":"AACA,SAASA,MAAM;AAGf,SAASC,cAAc;AACvB,SAASC,QAAQ;AAMjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,QAAQA,CAC1BC,MAAoB,EACpBC,OAAqB,EACrBC,MAAsB,GAAG,CAAC,CAAC,EACkC;EAC7D,MAAM;IAAEC;EAAM,CAAC,GAAGD,MAAM;EAExB,MAAME,KAAK,GAAG;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;EAED,MAAMC,MAAM,GAAG,MAAMR,cAAc,CAACG,MAAM,EAAEC,OAAO,EAAEG,KAAK,EAAE;IAAED;EAAM,CAAC,CAAC;EAEtE,IAAIE,MAAM,CAACC,MAAM,CAAC,CAAC,EAAE;IACjB,OAAOV,MAAM,CAACW,IAAI,CAACF,MAAM,CAACG,KAAK,CAAC;EACpC;EAEA,MAAMC,YAAY,GAAGJ,MAAM,CAACK,KAAK;EAEjC,IAAID,YAAY,CAACE,WAAW,CAACZ,QAAQ,CAACS,KAAK,EAAE;IACzC,OAAOZ,MAAM,CAACW,IAAI,CACd,IAAIT,QAAQ,CACRW,YAAY,CAACE,WAAW,CAACZ,QAAQ,CAACS,KAAK,CAACI,OAAO,EAC/CH,YAAY,CAACE,WAAW,CAACZ,QAAQ,CAACS,KAAK,CAACK,IAC5C,CACJ,CAAC;EACL;EAEA,OAAOjB,MAAM,CAACkB,EAAE,CAACL,YAAY,CAACE,WAAW,CAACZ,QAAQ,CAACgB,IAAI,CAAC;AAC5D","ignoreList":[]}
1
+ {"version":3,"file":"methods/fileManager/listTags.js","sources":["../../../src/methods/fileManager/listTags.ts"],"sourcesContent":["import type { WebinyConfig } from \"../../types.js\";\nimport { Result } from \"../../Result.js\";\nimport type { HttpError, NetworkError } from \"../../errors.js\";\nimport type { FmTag, FmTagsListWhereInput } from \"./fileManagerTypes.js\";\nimport { executeGraphQL } from \"../executeGraphQL.js\";\nimport { ApiError } from \"../../errors.js\";\n\nexport interface ListTagsParams {\n where?: FmTagsListWhereInput;\n}\n\n/**\n * Lists tags from the file manager.\n *\n * @param config - SDK configuration\n * @param fetchFn - Fetch function to use for HTTP requests\n * @param params - Parameters for listing tags\n * @param params.where - Filter conditions\n * @returns Result containing the list of tags or an error\n */\nexport async function listTags(\n config: WebinyConfig,\n fetchFn: typeof fetch,\n params: ListTagsParams = {}\n): Promise<Result<FmTag[], HttpError | ApiError | NetworkError>> {\n const { where } = params;\n\n const query = `\n query ListTags($where: FmTagsListWhereInput) {\n fileManager {\n listTags(where: $where) {\n data {\n tag\n count\n }\n error {\n message\n code\n }\n }\n }\n }\n `;\n\n const result = await executeGraphQL(config, fetchFn, query, { where });\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const responseData = result.value;\n\n if (responseData.fileManager.listTags.error) {\n return Result.fail(\n new ApiError(\n responseData.fileManager.listTags.error.message,\n responseData.fileManager.listTags.error.code\n )\n );\n }\n\n return Result.ok(responseData.fileManager.listTags.data);\n}\n"],"names":["listTags","config","fetchFn","params","where","query","result","executeGraphQL","Result","responseData","ApiError"],"mappings":";;;AAoBO,eAAeA,SAClBC,MAAoB,EACpBC,OAAqB,EACrBC,SAAyB,CAAC,CAAC;IAE3B,MAAM,EAAEC,KAAK,EAAE,GAAGD;IAElB,MAAME,QAAQ,CAAC;;;;;;;;;;;;;;;IAef,CAAC;IAED,MAAMC,SAAS,MAAMC,eAAeN,QAAQC,SAASG,OAAO;QAAED;IAAM;IAEpE,IAAIE,OAAO,MAAM,IACb,OAAOE,OAAO,IAAI,CAACF,OAAO,KAAK;IAGnC,MAAMG,eAAeH,OAAO,KAAK;IAEjC,IAAIG,aAAa,WAAW,CAAC,QAAQ,CAAC,KAAK,EACvC,OAAOD,OAAO,IAAI,CACd,IAAIE,SACAD,aAAa,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAC/CA,aAAa,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI;IAKxD,OAAOD,OAAO,EAAE,CAACC,aAAa,WAAW,CAAC,QAAQ,CAAC,IAAI;AAC3D"}
@@ -1,22 +1,23 @@
1
1
  import { z } from "zod";
2
2
  const fields = z.array(z.string().min(1)).min(1, "fields must contain at least one entry");
3
3
  const where = z.record(z.string(), z.unknown()).optional();
4
- export const listFilesSchema = z.object({
5
- search: z.string().optional(),
6
- where,
7
- limit: z.number().int().positive().optional(),
8
- after: z.string().optional(),
9
- sort: z.array(z.string()).optional(),
10
- fields
4
+ const listFilesSchema = z.object({
5
+ search: z.string().optional(),
6
+ where: where,
7
+ limit: z.number().int().positive().optional(),
8
+ after: z.string().optional(),
9
+ sort: z.array(z.string()).optional(),
10
+ fields: fields
11
11
  });
12
- export const getFileSchema = z.object({
13
- id: z.string().min(1, "id is required"),
14
- fields
12
+ const getFileSchema = z.object({
13
+ id: z.string().min(1, "id is required"),
14
+ fields: fields
15
15
  });
16
- export const updateFileSchema = z.object({
17
- id: z.string().min(1, "id is required"),
18
- data: z.record(z.string(), z.unknown()),
19
- fields
16
+ const updateFileSchema = z.object({
17
+ id: z.string().min(1, "id is required"),
18
+ data: z.record(z.string(), z.unknown()),
19
+ fields: fields
20
20
  });
21
+ export { getFileSchema, listFilesSchema, updateFileSchema };
21
22
 
22
23
  //# sourceMappingURL=schemas.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["z","fields","array","string","min","where","record","unknown","optional","listFilesSchema","object","search","limit","number","int","positive","after","sort","getFileSchema","id","updateFileSchema","data"],"sources":["schemas.ts"],"sourcesContent":["import { z } from \"zod\";\n\nconst fields = z.array(z.string().min(1)).min(1, \"fields must contain at least one entry\");\nconst where = z.record(z.string(), z.unknown()).optional();\n\nexport const listFilesSchema = z.object({\n search: z.string().optional(),\n where,\n limit: z.number().int().positive().optional(),\n after: z.string().optional(),\n sort: z.array(z.string()).optional(),\n fields\n});\n\nexport const getFileSchema = z.object({\n id: z.string().min(1, \"id is required\"),\n fields\n});\n\nexport const updateFileSchema = z.object({\n id: z.string().min(1, \"id is required\"),\n data: z.record(z.string(), z.unknown()),\n fields\n});\n"],"mappings":"AAAA,SAASA,CAAC,QAAQ,KAAK;AAEvB,MAAMC,MAAM,GAAGD,CAAC,CAACE,KAAK,CAACF,CAAC,CAACG,MAAM,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,CAAC,CAAC,CAACA,GAAG,CAAC,CAAC,EAAE,wCAAwC,CAAC;AAC1F,MAAMC,KAAK,GAAGL,CAAC,CAACM,MAAM,CAACN,CAAC,CAACG,MAAM,CAAC,CAAC,EAAEH,CAAC,CAACO,OAAO,CAAC,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;AAE1D,OAAO,MAAMC,eAAe,GAAGT,CAAC,CAACU,MAAM,CAAC;EACpCC,MAAM,EAAEX,CAAC,CAACG,MAAM,CAAC,CAAC,CAACK,QAAQ,CAAC,CAAC;EAC7BH,KAAK;EACLO,KAAK,EAAEZ,CAAC,CAACa,MAAM,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC,CAACP,QAAQ,CAAC,CAAC;EAC7CQ,KAAK,EAAEhB,CAAC,CAACG,MAAM,CAAC,CAAC,CAACK,QAAQ,CAAC,CAAC;EAC5BS,IAAI,EAAEjB,CAAC,CAACE,KAAK,CAACF,CAAC,CAACG,MAAM,CAAC,CAAC,CAAC,CAACK,QAAQ,CAAC,CAAC;EACpCP;AACJ,CAAC,CAAC;AAEF,OAAO,MAAMiB,aAAa,GAAGlB,CAAC,CAACU,MAAM,CAAC;EAClCS,EAAE,EAAEnB,CAAC,CAACG,MAAM,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,EAAE,gBAAgB,CAAC;EACvCH;AACJ,CAAC,CAAC;AAEF,OAAO,MAAMmB,gBAAgB,GAAGpB,CAAC,CAACU,MAAM,CAAC;EACrCS,EAAE,EAAEnB,CAAC,CAACG,MAAM,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,EAAE,gBAAgB,CAAC;EACvCiB,IAAI,EAAErB,CAAC,CAACM,MAAM,CAACN,CAAC,CAACG,MAAM,CAAC,CAAC,EAAEH,CAAC,CAACO,OAAO,CAAC,CAAC,CAAC;EACvCN;AACJ,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"methods/fileManager/schemas.js","sources":["../../../src/methods/fileManager/schemas.ts"],"sourcesContent":["import { z } from \"zod\";\n\nconst fields = z.array(z.string().min(1)).min(1, \"fields must contain at least one entry\");\nconst where = z.record(z.string(), z.unknown()).optional();\n\nexport const listFilesSchema = z.object({\n search: z.string().optional(),\n where,\n limit: z.number().int().positive().optional(),\n after: z.string().optional(),\n sort: z.array(z.string()).optional(),\n fields\n});\n\nexport const getFileSchema = z.object({\n id: z.string().min(1, \"id is required\"),\n fields\n});\n\nexport const updateFileSchema = z.object({\n id: z.string().min(1, \"id is required\"),\n data: z.record(z.string(), z.unknown()),\n fields\n});\n"],"names":["fields","z","where","listFilesSchema","getFileSchema","updateFileSchema"],"mappings":";AAEA,MAAMA,SAASC,EAAE,KAAK,CAACA,EAAE,MAAM,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG;AACjD,MAAMC,QAAQD,EAAE,MAAM,CAACA,EAAE,MAAM,IAAIA,EAAE,OAAO,IAAI,QAAQ;AAEjD,MAAME,kBAAkBF,EAAE,MAAM,CAAC;IACpC,QAAQA,EAAE,MAAM,GAAG,QAAQ;IAC3BC,OAAAA;IACA,OAAOD,EAAE,MAAM,GAAG,GAAG,GAAG,QAAQ,GAAG,QAAQ;IAC3C,OAAOA,EAAE,MAAM,GAAG,QAAQ;IAC1B,MAAMA,EAAE,KAAK,CAACA,EAAE,MAAM,IAAI,QAAQ;IAClCD,QAAAA;AACJ;AAEO,MAAMI,gBAAgBH,EAAE,MAAM,CAAC;IAClC,IAAIA,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG;IACtBD,QAAAA;AACJ;AAEO,MAAMK,mBAAmBJ,EAAE,MAAM,CAAC;IACrC,IAAIA,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG;IACtB,MAAMA,EAAE,MAAM,CAACA,EAAE,MAAM,IAAIA,EAAE,OAAO;IACpCD,QAAAA;AACJ"}
@@ -4,23 +4,9 @@ import { createMethod } from "../../utils/createMethod.js";
4
4
  import { updateFileSchema } from "./schemas.js";
5
5
  import { executeGraphQL } from "../executeGraphQL.js";
6
6
  import { ApiError } from "../../errors.js";
7
- /**
8
- * Updates a file in the file manager.
9
- *
10
- * @param config - SDK configuration
11
- * @param fetchFn - Fetch function to use for HTTP requests
12
- * @param params - Parameters for updating the file
13
- * @param params.id - ID of the file to update
14
- * @param params.data - The file data to update
15
- * @returns Result containing the updated file data or an error
16
- */
17
- export const updateFile = createMethod(updateFileSchema, async (config, fetchFn, {
18
- id,
19
- data,
20
- fields
21
- }) => {
22
- const fieldsSelection = buildFieldsSelection(fields);
23
- const query = `
7
+ const updateFile = createMethod(updateFileSchema, async (config, fetchFn, { id, data, fields })=>{
8
+ const fieldsSelection = buildFieldsSelection(fields);
9
+ const query = `
24
10
  mutation UpdateFile($id: ID!, $data: FmFileUpdateInput!) {
25
11
  fileManager {
26
12
  updateFile(id: $id, data: $data) {
@@ -35,18 +21,15 @@ ${fieldsSelection}
35
21
  }
36
22
  }
37
23
  `;
38
- const result = await executeGraphQL(config, fetchFn, query, {
39
- id,
40
- data
41
- });
42
- if (result.isFail()) {
43
- return Result.fail(result.error);
44
- }
45
- const responseData = result.value;
46
- if (responseData.fileManager.updateFile.error) {
47
- return Result.fail(new ApiError(responseData.fileManager.updateFile.error.message, responseData.fileManager.updateFile.error.code));
48
- }
49
- return Result.ok(responseData.fileManager.updateFile.data);
24
+ const result = await executeGraphQL(config, fetchFn, query, {
25
+ id,
26
+ data
27
+ });
28
+ if (result.isFail()) return Result.fail(result.error);
29
+ const responseData = result.value;
30
+ if (responseData.fileManager.updateFile.error) return Result.fail(new ApiError(responseData.fileManager.updateFile.error.message, responseData.fileManager.updateFile.error.code));
31
+ return Result.ok(responseData.fileManager.updateFile.data);
50
32
  });
33
+ export { updateFile };
51
34
 
52
35
  //# sourceMappingURL=updateFile.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","buildFieldsSelection","createMethod","updateFileSchema","executeGraphQL","ApiError","updateFile","config","fetchFn","id","data","fields","fieldsSelection","query","result","isFail","fail","error","responseData","value","fileManager","message","code","ok"],"sources":["updateFile.ts"],"sourcesContent":["import { Result } from \"../../Result.js\";\nimport type { FmFile, FmIdentity, FmLocationInput } from \"./fileManagerTypes.js\";\nimport { buildFieldsSelection } from \"./buildFieldsSelection.js\";\nimport { createMethod } from \"../../utils/createMethod.js\";\nimport { updateFileSchema } from \"./schemas.js\";\nimport { executeGraphQL } from \"../executeGraphQL.js\";\nimport { ApiError } from \"../../errors.js\";\n\nexport interface UpdateFileData {\n createdOn?: Date | string;\n modifiedOn?: Date | string;\n savedOn?: Date | string;\n createdBy?: FmIdentity;\n modifiedBy?: FmIdentity;\n savedBy?: FmIdentity;\n location?: FmLocationInput;\n name?: string;\n key?: string;\n type?: string;\n size?: number;\n tags?: string[];\n [key: string]: any;\n}\n\nexport interface UpdateFileParams {\n id: string;\n data: UpdateFileData;\n fields: string[];\n}\n\n/**\n * Updates a file in the file manager.\n *\n * @param config - SDK configuration\n * @param fetchFn - Fetch function to use for HTTP requests\n * @param params - Parameters for updating the file\n * @param params.id - ID of the file to update\n * @param params.data - The file data to update\n * @returns Result containing the updated file data or an error\n */\nexport const updateFile = createMethod(\n updateFileSchema,\n async (config, fetchFn, { id, data, fields }) => {\n const fieldsSelection = buildFieldsSelection(fields);\n\n const query = `\n mutation UpdateFile($id: ID!, $data: FmFileUpdateInput!) {\n fileManager {\n updateFile(id: $id, data: $data) {\n data {\n${fieldsSelection}\n }\n error {\n message\n code\n }\n }\n }\n }\n `;\n\n const result = await executeGraphQL(config, fetchFn, query, { id, data });\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const responseData = result.value;\n\n if (responseData.fileManager.updateFile.error) {\n return Result.fail(\n new ApiError(\n responseData.fileManager.updateFile.error.message,\n responseData.fileManager.updateFile.error.code\n )\n );\n }\n\n return Result.ok(responseData.fileManager.updateFile.data as FmFile);\n }\n);\n"],"mappings":"AAAA,SAASA,MAAM;AAEf,SAASC,oBAAoB;AAC7B,SAASC,YAAY;AACrB,SAASC,gBAAgB;AACzB,SAASC,cAAc;AACvB,SAASC,QAAQ;AAwBjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,UAAU,GAAGJ,YAAY,CAClCC,gBAAgB,EAChB,OAAOI,MAAM,EAAEC,OAAO,EAAE;EAAEC,EAAE;EAAEC,IAAI;EAAEC;AAAO,CAAC,KAAK;EAC7C,MAAMC,eAAe,GAAGX,oBAAoB,CAACU,MAAM,CAAC;EAEpD,MAAME,KAAK,GAAG;AACtB;AACA;AACA;AACA;AACA,EAAED,eAAe;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;EAEG,MAAME,MAAM,GAAG,MAAMV,cAAc,CAACG,MAAM,EAAEC,OAAO,EAAEK,KAAK,EAAE;IAAEJ,EAAE;IAAEC;EAAK,CAAC,CAAC;EAEzE,IAAII,MAAM,CAACC,MAAM,CAAC,CAAC,EAAE;IACjB,OAAOf,MAAM,CAACgB,IAAI,CAACF,MAAM,CAACG,KAAK,CAAC;EACpC;EAEA,MAAMC,YAAY,GAAGJ,MAAM,CAACK,KAAK;EAEjC,IAAID,YAAY,CAACE,WAAW,CAACd,UAAU,CAACW,KAAK,EAAE;IAC3C,OAAOjB,MAAM,CAACgB,IAAI,CACd,IAAIX,QAAQ,CACRa,YAAY,CAACE,WAAW,CAACd,UAAU,CAACW,KAAK,CAACI,OAAO,EACjDH,YAAY,CAACE,WAAW,CAACd,UAAU,CAACW,KAAK,CAACK,IAC9C,CACJ,CAAC;EACL;EAEA,OAAOtB,MAAM,CAACuB,EAAE,CAACL,YAAY,CAACE,WAAW,CAACd,UAAU,CAACI,IAAc,CAAC;AACxE,CACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"methods/fileManager/updateFile.js","sources":["../../../src/methods/fileManager/updateFile.ts"],"sourcesContent":["import { Result } from \"../../Result.js\";\nimport type { FmFile, FmIdentity, FmLocationInput } from \"./fileManagerTypes.js\";\nimport { buildFieldsSelection } from \"./buildFieldsSelection.js\";\nimport { createMethod } from \"../../utils/createMethod.js\";\nimport { updateFileSchema } from \"./schemas.js\";\nimport { executeGraphQL } from \"../executeGraphQL.js\";\nimport { ApiError } from \"../../errors.js\";\n\nexport interface UpdateFileData {\n createdOn?: Date | string;\n modifiedOn?: Date | string;\n savedOn?: Date | string;\n createdBy?: FmIdentity;\n modifiedBy?: FmIdentity;\n savedBy?: FmIdentity;\n location?: FmLocationInput;\n name?: string;\n key?: string;\n type?: string;\n size?: number;\n tags?: string[];\n [key: string]: any;\n}\n\nexport interface UpdateFileParams {\n id: string;\n data: UpdateFileData;\n fields: string[];\n}\n\n/**\n * Updates a file in the file manager.\n *\n * @param config - SDK configuration\n * @param fetchFn - Fetch function to use for HTTP requests\n * @param params - Parameters for updating the file\n * @param params.id - ID of the file to update\n * @param params.data - The file data to update\n * @returns Result containing the updated file data or an error\n */\nexport const updateFile = createMethod(\n updateFileSchema,\n async (config, fetchFn, { id, data, fields }) => {\n const fieldsSelection = buildFieldsSelection(fields);\n\n const query = `\n mutation UpdateFile($id: ID!, $data: FmFileUpdateInput!) {\n fileManager {\n updateFile(id: $id, data: $data) {\n data {\n${fieldsSelection}\n }\n error {\n message\n code\n }\n }\n }\n }\n `;\n\n const result = await executeGraphQL(config, fetchFn, query, { id, data });\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const responseData = result.value;\n\n if (responseData.fileManager.updateFile.error) {\n return Result.fail(\n new ApiError(\n responseData.fileManager.updateFile.error.message,\n responseData.fileManager.updateFile.error.code\n )\n );\n }\n\n return Result.ok(responseData.fileManager.updateFile.data as FmFile);\n }\n);\n"],"names":["updateFile","createMethod","updateFileSchema","config","fetchFn","id","data","fields","fieldsSelection","buildFieldsSelection","query","result","executeGraphQL","Result","responseData","ApiError"],"mappings":";;;;;;AAwCO,MAAMA,aAAaC,aACtBC,kBACA,OAAOC,QAAQC,SAAS,EAAEC,EAAE,EAAEC,IAAI,EAAEC,MAAM,EAAE;IACxC,MAAMC,kBAAkBC,qBAAqBF;IAE7C,MAAMG,QAAQ,CAAC;;;;;AAKvB,EAAEF,gBAAgB;;;;;;;;;IASd,CAAC;IAEG,MAAMG,SAAS,MAAMC,eAAeT,QAAQC,SAASM,OAAO;QAAEL;QAAIC;IAAK;IAEvE,IAAIK,OAAO,MAAM,IACb,OAAOE,OAAO,IAAI,CAACF,OAAO,KAAK;IAGnC,MAAMG,eAAeH,OAAO,KAAK;IAEjC,IAAIG,aAAa,WAAW,CAAC,UAAU,CAAC,KAAK,EACzC,OAAOD,OAAO,IAAI,CACd,IAAIE,SACAD,aAAa,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EACjDA,aAAa,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI;IAK1D,OAAOD,OAAO,EAAE,CAACC,aAAa,WAAW,CAAC,UAAU,CAAC,IAAI;AAC7D"}
@@ -1,19 +1,17 @@
1
1
  import { isBrowser } from "../../../utils/platform.js";
2
- export function isBuffer(file) {
3
- // Check if Buffer exists (Node.js) before using it.
4
- return typeof Buffer !== "undefined" && Buffer.isBuffer(file);
2
+ function isBuffer(file) {
3
+ return "u" > typeof Buffer && Buffer.isBuffer(file);
5
4
  }
6
- export function isBlob(file) {
7
- return typeof Blob !== "undefined" && file instanceof Blob;
5
+ function isBlob(file) {
6
+ return "u" > typeof Blob && file instanceof Blob;
8
7
  }
9
- export function isFile(file) {
10
- return isBrowser && typeof File !== "undefined" && file instanceof File;
8
+ function isFile(file) {
9
+ return isBrowser && "u" > typeof File && file instanceof File;
11
10
  }
12
- export function getFileSize(file) {
13
- if (isBuffer(file)) {
14
- return file.length;
15
- }
16
- return file.size;
11
+ function getFileSize(file) {
12
+ if (isBuffer(file)) return file.length;
13
+ return file.size;
17
14
  }
15
+ export { getFileSize, isBlob, isBuffer, isFile };
18
16
 
19
17
  //# sourceMappingURL=fileTypeDetection.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["isBrowser","isBuffer","file","Buffer","isBlob","Blob","isFile","File","getFileSize","length","size"],"sources":["fileTypeDetection.ts"],"sourcesContent":["import { isBrowser } from \"../../../utils/platform.js\";\n\nexport function isBuffer(file: any): file is Buffer {\n // Check if Buffer exists (Node.js) before using it.\n return typeof Buffer !== \"undefined\" && Buffer.isBuffer(file);\n}\n\nexport function isBlob(file: any): file is Blob {\n return typeof Blob !== \"undefined\" && file instanceof Blob;\n}\n\nexport function isFile(file: any): file is File {\n return isBrowser && typeof File !== \"undefined\" && file instanceof File;\n}\n\nexport function getFileSize(file: Buffer | Blob | File): number {\n if (isBuffer(file)) {\n return file.length;\n }\n return file.size;\n}\n"],"mappings":"AAAA,SAASA,SAAS;AAElB,OAAO,SAASC,QAAQA,CAACC,IAAS,EAAkB;EAChD;EACA,OAAO,OAAOC,MAAM,KAAK,WAAW,IAAIA,MAAM,CAACF,QAAQ,CAACC,IAAI,CAAC;AACjE;AAEA,OAAO,SAASE,MAAMA,CAACF,IAAS,EAAgB;EAC5C,OAAO,OAAOG,IAAI,KAAK,WAAW,IAAIH,IAAI,YAAYG,IAAI;AAC9D;AAEA,OAAO,SAASC,MAAMA,CAACJ,IAAS,EAAgB;EAC5C,OAAOF,SAAS,IAAI,OAAOO,IAAI,KAAK,WAAW,IAAIL,IAAI,YAAYK,IAAI;AAC3E;AAEA,OAAO,SAASC,WAAWA,CAACN,IAA0B,EAAU;EAC5D,IAAID,QAAQ,CAACC,IAAI,CAAC,EAAE;IAChB,OAAOA,IAAI,CAACO,MAAM;EACtB;EACA,OAAOP,IAAI,CAACQ,IAAI;AACpB","ignoreList":[]}
1
+ {"version":3,"file":"methods/fileManager/utils/fileTypeDetection.js","sources":["../../../../src/methods/fileManager/utils/fileTypeDetection.ts"],"sourcesContent":["import { isBrowser } from \"../../../utils/platform.js\";\n\nexport function isBuffer(file: any): file is Buffer {\n // Check if Buffer exists (Node.js) before using it.\n return typeof Buffer !== \"undefined\" && Buffer.isBuffer(file);\n}\n\nexport function isBlob(file: any): file is Blob {\n return typeof Blob !== \"undefined\" && file instanceof Blob;\n}\n\nexport function isFile(file: any): file is File {\n return isBrowser && typeof File !== \"undefined\" && file instanceof File;\n}\n\nexport function getFileSize(file: Buffer | Blob | File): number {\n if (isBuffer(file)) {\n return file.length;\n }\n return file.size;\n}\n"],"names":["isBuffer","file","Buffer","isBlob","Blob","isFile","isBrowser","File","getFileSize"],"mappings":";AAEO,SAASA,SAASC,IAAS;IAE9B,OAAO,AAAkB,MAAlB,OAAOC,UAA0BA,OAAO,QAAQ,CAACD;AAC5D;AAEO,SAASE,OAAOF,IAAS;IAC5B,OAAO,AAAgB,MAAhB,OAAOG,QAAwBH,gBAAgBG;AAC1D;AAEO,SAASC,OAAOJ,IAAS;IAC5B,OAAOK,aAAa,AAAgB,MAAhB,OAAOC,QAAwBN,gBAAgBM;AACvE;AAEO,SAASC,YAAYP,IAA0B;IAClD,IAAID,SAASC,OACT,OAAOA,KAAK,MAAM;IAEtB,OAAOA,KAAK,IAAI;AACpB"}
@@ -1,183 +1,104 @@
1
1
  import { isBrowser } from "../../../utils/platform.js";
2
- import { isBuffer, isFile, getFileSize } from "./fileTypeDetection.js";
3
- import pMap from "p-map";
4
- import pRetry from "p-retry";
2
+ import { getFileSize, isBuffer, isFile } from "./fileTypeDetection.js";
3
+ import p_map from "p-map";
4
+ import p_retry from "p-retry";
5
5
  import { createMultiPartUpload } from "../createMultiPartUpload.js";
6
6
  import { completeMultiPartUpload } from "../completeMultiPartUpload.js";
7
- /**
8
- * Uploads a large file to S3 using multi-part upload.
9
- *
10
- * @param file - The file to upload (Buffer, Blob, or File)
11
- * @param fileData - File metadata
12
- * @param config - SDK configuration
13
- * @param fetchFn - Fetch function to use for HTTP requests
14
- * @param options - Upload options
15
- * @returns Promise that resolves with the uploaded file metadata
16
- */
17
- export async function uploadLargeFile(file, fileData, config, fetchFn, options = {}) {
18
- const {
19
- onProgress,
20
- signal,
21
- chunkSize = 50,
22
- parallelUploads = 5
23
- } = options;
24
- const fileSize = getFileSize(file);
25
- const chunkSizeBytes = Math.max(chunkSize * 1024 * 1024, 5 * 1024 * 1024);
26
- const numberOfParts = Math.ceil(fileSize / chunkSizeBytes);
27
-
28
- // 1. Create multi-part upload.
29
- const createResult = await createMultiPartUpload(config, fetchFn, {
30
- data: fileData,
31
- numberOfParts
32
- });
33
- if (createResult.isFail()) {
34
- throw createResult.error;
35
- }
36
- const uploadData = createResult.value;
37
- const progressTracker = new Map();
38
-
39
- // Helper to track progress.
40
- const updateProgress = () => {
41
- if (!onProgress) {
42
- return;
43
- }
44
- const uploaded = Array.from(progressTracker.values()).reduce((sum, value) => sum + value, 0);
45
- const uploadedSize = Math.min(uploaded, fileSize);
46
- onProgress({
47
- sent: uploadedSize,
48
- total: fileSize,
49
- percentage: Math.round(uploadedSize / fileSize * 100)
7
+ async function uploadLargeFile(file, fileData, config, fetchFn, options = {}) {
8
+ const { onProgress, signal, chunkSize = 50, parallelUploads = 5 } = options;
9
+ const fileSize = getFileSize(file);
10
+ const chunkSizeBytes = Math.max(1024 * chunkSize * 1024, 5242880);
11
+ const numberOfParts = Math.ceil(fileSize / chunkSizeBytes);
12
+ const createResult = await createMultiPartUpload(config, fetchFn, {
13
+ data: fileData,
14
+ numberOfParts
50
15
  });
51
- };
52
-
53
- // 2. Upload parts in parallel.
54
- await pMap(uploadData.parts, async part => {
55
- // Check abort signal.
56
- if (signal?.aborted) {
57
- throw new Error("Upload aborted");
58
- }
59
-
60
- // Upload part with retry.
61
- await pRetry(async () => {
62
- const chunk = await getFileChunk(file, part.partNumber, chunkSizeBytes, fileData.type);
63
- await uploadPart(part.url, chunk, loaded => {
64
- progressTracker.set(part.partNumber, loaded);
65
- updateProgress();
66
- }, signal);
16
+ if (createResult.isFail()) throw createResult.error;
17
+ const uploadData = createResult.value;
18
+ const progressTracker = new Map();
19
+ const updateProgress = ()=>{
20
+ if (!onProgress) return;
21
+ const uploaded = Array.from(progressTracker.values()).reduce((sum, value)=>sum + value, 0);
22
+ const uploadedSize = Math.min(uploaded, fileSize);
23
+ onProgress({
24
+ sent: uploadedSize,
25
+ total: fileSize,
26
+ percentage: Math.round(uploadedSize / fileSize * 100)
27
+ });
28
+ };
29
+ await p_map(uploadData.parts, async (part)=>{
30
+ if (signal?.aborted) throw new Error("Upload aborted");
31
+ await p_retry(async ()=>{
32
+ const chunk = await getFileChunk(file, part.partNumber, chunkSizeBytes, fileData.type);
33
+ await uploadPart(part.url, chunk, (loaded)=>{
34
+ progressTracker.set(part.partNumber, loaded);
35
+ updateProgress();
36
+ }, signal);
37
+ }, {
38
+ retries: 5,
39
+ minTimeout: 1500,
40
+ maxTimeout: 30000,
41
+ maxRetryTime: 300000
42
+ });
67
43
  }, {
68
- retries: 5,
69
- minTimeout: 1500,
70
- maxTimeout: 30000,
71
- maxRetryTime: 300000
44
+ concurrency: Math.min(numberOfParts, parallelUploads)
72
45
  });
73
- }, {
74
- concurrency: Math.min(numberOfParts, parallelUploads)
75
- });
76
-
77
- // 3. Complete multi-part upload.
78
- const completeResult = await completeMultiPartUpload(config, fetchFn, {
79
- fileKey: uploadData.file.key,
80
- uploadId: uploadData.uploadId
81
- });
82
- if (completeResult.isFail()) {
83
- throw completeResult.error;
84
- }
85
-
86
- // Return the file metadata.
87
- return uploadData.file;
46
+ const completeResult = await completeMultiPartUpload(config, fetchFn, {
47
+ fileKey: uploadData.file.key,
48
+ uploadId: uploadData.uploadId
49
+ });
50
+ if (completeResult.isFail()) throw completeResult.error;
51
+ return uploadData.file;
88
52
  }
89
-
90
- /**
91
- * Gets a chunk of the file for a specific part number.
92
- */
93
53
  async function getFileChunk(file, partNumber, chunkSize, fileType) {
94
- const start = (partNumber - 1) * chunkSize;
95
- const end = Math.min(start + chunkSize, getFileSize(file));
96
- if (isBuffer(file)) {
97
- return file.slice(start, end);
98
- }
99
- if (isFile(file) || file instanceof Blob) {
100
- return file.slice(start, end, fileType);
101
- }
102
- throw new Error("Unsupported file type");
54
+ const start = (partNumber - 1) * chunkSize;
55
+ const end = Math.min(start + chunkSize, getFileSize(file));
56
+ if (isBuffer(file)) return file.slice(start, end);
57
+ if (isFile(file) || file instanceof Blob) return file.slice(start, end, fileType);
58
+ throw new Error("Unsupported file type");
103
59
  }
104
-
105
- /**
106
- * Uploads a single part to S3.
107
- */
108
60
  async function uploadPart(url, chunk, onProgress, signal) {
109
- if (isBrowser && typeof XMLHttpRequest !== "undefined") {
110
- return uploadPartWithXHR(url, chunk, onProgress, signal);
111
- }
112
- return uploadPartWithFetch(url, chunk, signal);
61
+ if (isBrowser && "u" > typeof XMLHttpRequest) return uploadPartWithXHR(url, chunk, onProgress, signal);
62
+ return uploadPartWithFetch(url, chunk, signal);
113
63
  }
114
-
115
- /**
116
- * Upload part using XMLHttpRequest (browser only, supports progress).
117
- */
118
64
  function uploadPartWithXHR(url, chunk, onProgress, signal) {
119
- return new Promise((resolve, reject) => {
120
- const xhr = new XMLHttpRequest();
121
-
122
- // Handle abort signal.
123
- if (signal) {
124
- signal.addEventListener("abort", () => xhr.abort());
125
- }
126
-
127
- // Track upload progress.
128
- xhr.upload.addEventListener("progress", event => {
129
- if (event.lengthComputable) {
130
- onProgress(event.loaded);
131
- }
132
- });
133
-
134
- // Handle completion.
135
- xhr.addEventListener("readystatechange", () => {
136
- if (xhr.readyState === 4 && xhr.status === 200) {
137
- resolve();
138
- }
139
- });
140
-
141
- // Handle errors.
142
- xhr.addEventListener("error", () => {
143
- reject(new Error("Part upload failed due to network error"));
144
- });
145
- xhr.addEventListener("abort", () => {
146
- reject(new Error("Part upload aborted"));
147
- });
148
- xhr.addEventListener("timeout", () => {
149
- reject(new Error("Part upload timed out"));
65
+ return new Promise((resolve, reject)=>{
66
+ const xhr = new XMLHttpRequest();
67
+ if (signal) signal.addEventListener("abort", ()=>xhr.abort());
68
+ xhr.upload.addEventListener("progress", (event)=>{
69
+ if (event.lengthComputable) onProgress(event.loaded);
70
+ });
71
+ xhr.addEventListener("readystatechange", ()=>{
72
+ if (4 === xhr.readyState && 200 === xhr.status) resolve();
73
+ });
74
+ xhr.addEventListener("error", ()=>{
75
+ reject(new Error("Part upload failed due to network error"));
76
+ });
77
+ xhr.addEventListener("abort", ()=>{
78
+ reject(new Error("Part upload aborted"));
79
+ });
80
+ xhr.addEventListener("timeout", ()=>{
81
+ reject(new Error("Part upload timed out"));
82
+ });
83
+ let body;
84
+ body = isBuffer(chunk) ? new Blob([
85
+ chunk
86
+ ]) : chunk;
87
+ xhr.open("PUT", url);
88
+ xhr.send(body);
150
89
  });
151
-
152
- // Convert Buffer to Blob if needed.
153
- let body;
154
- if (isBuffer(chunk)) {
155
- // Buffer is a Uint8Array, so we can pass it to Blob.
156
- // Use 'as any' to work around TypeScript's strict type checking for ArrayBufferLike.
157
- body = new Blob([chunk]);
158
- } else {
159
- body = chunk;
160
- }
161
-
162
- // Send request.
163
- xhr.open("PUT", url);
164
- xhr.send(body);
165
- });
166
90
  }
167
-
168
- /**
169
- * Upload part using fetch (Node.js and browser).
170
- */
171
91
  async function uploadPartWithFetch(url, chunk, signal) {
172
- const response = await fetch(url, {
173
- method: "PUT",
174
- body: chunk,
175
- signal
176
- });
177
- if (response.status !== 200) {
178
- const text = await response.text();
179
- throw new Error(`Part upload failed with status ${response.status}: ${text}`);
180
- }
92
+ const response = await fetch(url, {
93
+ method: "PUT",
94
+ body: chunk,
95
+ signal
96
+ });
97
+ if (200 !== response.status) {
98
+ const text = await response.text();
99
+ throw new Error(`Part upload failed with status ${response.status}: ${text}`);
100
+ }
181
101
  }
102
+ export { uploadLargeFile };
182
103
 
183
104
  //# sourceMappingURL=uploadLargeFile.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["isBrowser","isBuffer","isFile","getFileSize","pMap","pRetry","createMultiPartUpload","completeMultiPartUpload","uploadLargeFile","file","fileData","config","fetchFn","options","onProgress","signal","chunkSize","parallelUploads","fileSize","chunkSizeBytes","Math","max","numberOfParts","ceil","createResult","data","isFail","error","uploadData","value","progressTracker","Map","updateProgress","uploaded","Array","from","values","reduce","sum","uploadedSize","min","sent","total","percentage","round","parts","part","aborted","Error","chunk","getFileChunk","partNumber","type","uploadPart","url","loaded","set","retries","minTimeout","maxTimeout","maxRetryTime","concurrency","completeResult","fileKey","key","uploadId","fileType","start","end","slice","Blob","XMLHttpRequest","uploadPartWithXHR","uploadPartWithFetch","Promise","resolve","reject","xhr","addEventListener","abort","upload","event","lengthComputable","readyState","status","body","open","send","response","fetch","method","text"],"sources":["uploadLargeFile.ts"],"sourcesContent":["import type { WebinyConfig } from \"../../../types.js\";\nimport type { FmFile, UploadProgress } from \"../fileManagerTypes.js\";\nimport { isBrowser } from \"../../../utils/platform.js\";\nimport { isBuffer, isFile, getFileSize } from \"./fileTypeDetection.js\";\nimport pMap from \"p-map\";\nimport pRetry from \"p-retry\";\nimport { createMultiPartUpload } from \"../createMultiPartUpload.js\";\nimport { completeMultiPartUpload } from \"../completeMultiPartUpload.js\";\n\nexport interface UploadLargeFileOptions {\n onProgress?: (progress: UploadProgress) => void;\n signal?: AbortSignal;\n chunkSize?: number;\n parallelUploads?: number;\n}\n\n/**\n * Uploads a large file to S3 using multi-part upload.\n *\n * @param file - The file to upload (Buffer, Blob, or File)\n * @param fileData - File metadata\n * @param config - SDK configuration\n * @param fetchFn - Fetch function to use for HTTP requests\n * @param options - Upload options\n * @returns Promise that resolves with the uploaded file metadata\n */\nexport async function uploadLargeFile(\n file: Buffer | Blob | File,\n fileData: { name: string; type: string; size: number; key?: string; keyPrefix?: string },\n config: WebinyConfig,\n fetchFn: typeof fetch,\n options: UploadLargeFileOptions = {}\n): Promise<FmFile> {\n const { onProgress, signal, chunkSize = 50, parallelUploads = 5 } = options;\n\n const fileSize = getFileSize(file);\n const chunkSizeBytes = Math.max(chunkSize * 1024 * 1024, 5 * 1024 * 1024);\n const numberOfParts = Math.ceil(fileSize / chunkSizeBytes);\n\n // 1. Create multi-part upload.\n const createResult = await createMultiPartUpload(config, fetchFn, {\n data: fileData,\n numberOfParts\n });\n\n if (createResult.isFail()) {\n throw createResult.error;\n }\n\n const uploadData = createResult.value;\n const progressTracker = new Map<number, number>();\n\n // Helper to track progress.\n const updateProgress = () => {\n if (!onProgress) {\n return;\n }\n\n const uploaded = Array.from(progressTracker.values()).reduce(\n (sum, value) => sum + value,\n 0\n );\n const uploadedSize = Math.min(uploaded, fileSize);\n\n onProgress({\n sent: uploadedSize,\n total: fileSize,\n percentage: Math.round((uploadedSize / fileSize) * 100)\n });\n };\n\n // 2. Upload parts in parallel.\n await pMap(\n uploadData.parts,\n async (part: { partNumber: number; url: string }) => {\n // Check abort signal.\n if (signal?.aborted) {\n throw new Error(\"Upload aborted\");\n }\n\n // Upload part with retry.\n await pRetry(\n async () => {\n const chunk = await getFileChunk(\n file,\n part.partNumber,\n chunkSizeBytes,\n fileData.type\n );\n\n await uploadPart(\n part.url,\n chunk,\n loaded => {\n progressTracker.set(part.partNumber, loaded);\n updateProgress();\n },\n signal\n );\n },\n {\n retries: 5,\n minTimeout: 1500,\n maxTimeout: 30000,\n maxRetryTime: 300000\n }\n );\n },\n { concurrency: Math.min(numberOfParts, parallelUploads) }\n );\n\n // 3. Complete multi-part upload.\n const completeResult = await completeMultiPartUpload(config, fetchFn, {\n fileKey: uploadData.file.key,\n uploadId: uploadData.uploadId\n });\n\n if (completeResult.isFail()) {\n throw completeResult.error;\n }\n\n // Return the file metadata.\n return uploadData.file as FmFile;\n}\n\n/**\n * Gets a chunk of the file for a specific part number.\n */\nasync function getFileChunk(\n file: Buffer | Blob | File,\n partNumber: number,\n chunkSize: number,\n fileType: string\n): Promise<Blob | Buffer> {\n const start = (partNumber - 1) * chunkSize;\n const end = Math.min(start + chunkSize, getFileSize(file));\n\n if (isBuffer(file)) {\n return file.slice(start, end);\n }\n\n if (isFile(file) || file instanceof Blob) {\n return file.slice(start, end, fileType);\n }\n\n throw new Error(\"Unsupported file type\");\n}\n\n/**\n * Uploads a single part to S3.\n */\nasync function uploadPart(\n url: string,\n chunk: Blob | Buffer,\n onProgress: (loaded: number) => void,\n signal?: AbortSignal\n): Promise<void> {\n if (isBrowser && typeof XMLHttpRequest !== \"undefined\") {\n return uploadPartWithXHR(url, chunk, onProgress, signal);\n }\n\n return uploadPartWithFetch(url, chunk, signal);\n}\n\n/**\n * Upload part using XMLHttpRequest (browser only, supports progress).\n */\nfunction uploadPartWithXHR(\n url: string,\n chunk: Blob | Buffer,\n onProgress: (loaded: number) => void,\n signal?: AbortSignal\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n\n // Handle abort signal.\n if (signal) {\n signal.addEventListener(\"abort\", () => xhr.abort());\n }\n\n // Track upload progress.\n xhr.upload.addEventListener(\"progress\", (event: ProgressEvent) => {\n if (event.lengthComputable) {\n onProgress(event.loaded);\n }\n });\n\n // Handle completion.\n xhr.addEventListener(\"readystatechange\", () => {\n if (xhr.readyState === 4 && xhr.status === 200) {\n resolve();\n }\n });\n\n // Handle errors.\n xhr.addEventListener(\"error\", () => {\n reject(new Error(\"Part upload failed due to network error\"));\n });\n\n xhr.addEventListener(\"abort\", () => {\n reject(new Error(\"Part upload aborted\"));\n });\n\n xhr.addEventListener(\"timeout\", () => {\n reject(new Error(\"Part upload timed out\"));\n });\n\n // Convert Buffer to Blob if needed.\n let body: Blob;\n if (isBuffer(chunk)) {\n // Buffer is a Uint8Array, so we can pass it to Blob.\n // Use 'as any' to work around TypeScript's strict type checking for ArrayBufferLike.\n body = new Blob([chunk as any]);\n } else {\n body = chunk;\n }\n\n // Send request.\n xhr.open(\"PUT\", url);\n xhr.send(body);\n });\n}\n\n/**\n * Upload part using fetch (Node.js and browser).\n */\nasync function uploadPartWithFetch(\n url: string,\n chunk: Blob | Buffer,\n signal?: AbortSignal\n): Promise<void> {\n const response = await fetch(url, {\n method: \"PUT\",\n body: chunk as any,\n signal\n });\n\n if (response.status !== 200) {\n const text = await response.text();\n throw new Error(`Part upload failed with status ${response.status}: ${text}`);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"methods/fileManager/utils/uploadLargeFile.js","sources":["../../../../src/methods/fileManager/utils/uploadLargeFile.ts"],"sourcesContent":["import type { WebinyConfig } from \"../../../types.js\";\nimport type { FmFile, UploadProgress } from \"../fileManagerTypes.js\";\nimport { isBrowser } from \"../../../utils/platform.js\";\nimport { isBuffer, isFile, getFileSize } from \"./fileTypeDetection.js\";\nimport pMap from \"p-map\";\nimport pRetry from \"p-retry\";\nimport { createMultiPartUpload } from \"../createMultiPartUpload.js\";\nimport { completeMultiPartUpload } from \"../completeMultiPartUpload.js\";\n\nexport interface UploadLargeFileOptions {\n onProgress?: (progress: UploadProgress) => void;\n signal?: AbortSignal;\n chunkSize?: number;\n parallelUploads?: number;\n}\n\n/**\n * Uploads a large file to S3 using multi-part upload.\n *\n * @param file - The file to upload (Buffer, Blob, or File)\n * @param fileData - File metadata\n * @param config - SDK configuration\n * @param fetchFn - Fetch function to use for HTTP requests\n * @param options - Upload options\n * @returns Promise that resolves with the uploaded file metadata\n */\nexport async function uploadLargeFile(\n file: Buffer | Blob | File,\n fileData: { name: string; type: string; size: number; key?: string; keyPrefix?: string },\n config: WebinyConfig,\n fetchFn: typeof fetch,\n options: UploadLargeFileOptions = {}\n): Promise<FmFile> {\n const { onProgress, signal, chunkSize = 50, parallelUploads = 5 } = options;\n\n const fileSize = getFileSize(file);\n const chunkSizeBytes = Math.max(chunkSize * 1024 * 1024, 5 * 1024 * 1024);\n const numberOfParts = Math.ceil(fileSize / chunkSizeBytes);\n\n // 1. Create multi-part upload.\n const createResult = await createMultiPartUpload(config, fetchFn, {\n data: fileData,\n numberOfParts\n });\n\n if (createResult.isFail()) {\n throw createResult.error;\n }\n\n const uploadData = createResult.value;\n const progressTracker = new Map<number, number>();\n\n // Helper to track progress.\n const updateProgress = () => {\n if (!onProgress) {\n return;\n }\n\n const uploaded = Array.from(progressTracker.values()).reduce(\n (sum, value) => sum + value,\n 0\n );\n const uploadedSize = Math.min(uploaded, fileSize);\n\n onProgress({\n sent: uploadedSize,\n total: fileSize,\n percentage: Math.round((uploadedSize / fileSize) * 100)\n });\n };\n\n // 2. Upload parts in parallel.\n await pMap(\n uploadData.parts,\n async (part: { partNumber: number; url: string }) => {\n // Check abort signal.\n if (signal?.aborted) {\n throw new Error(\"Upload aborted\");\n }\n\n // Upload part with retry.\n await pRetry(\n async () => {\n const chunk = await getFileChunk(\n file,\n part.partNumber,\n chunkSizeBytes,\n fileData.type\n );\n\n await uploadPart(\n part.url,\n chunk,\n loaded => {\n progressTracker.set(part.partNumber, loaded);\n updateProgress();\n },\n signal\n );\n },\n {\n retries: 5,\n minTimeout: 1500,\n maxTimeout: 30000,\n maxRetryTime: 300000\n }\n );\n },\n { concurrency: Math.min(numberOfParts, parallelUploads) }\n );\n\n // 3. Complete multi-part upload.\n const completeResult = await completeMultiPartUpload(config, fetchFn, {\n fileKey: uploadData.file.key,\n uploadId: uploadData.uploadId\n });\n\n if (completeResult.isFail()) {\n throw completeResult.error;\n }\n\n // Return the file metadata.\n return uploadData.file as FmFile;\n}\n\n/**\n * Gets a chunk of the file for a specific part number.\n */\nasync function getFileChunk(\n file: Buffer | Blob | File,\n partNumber: number,\n chunkSize: number,\n fileType: string\n): Promise<Blob | Buffer> {\n const start = (partNumber - 1) * chunkSize;\n const end = Math.min(start + chunkSize, getFileSize(file));\n\n if (isBuffer(file)) {\n return file.slice(start, end);\n }\n\n if (isFile(file) || file instanceof Blob) {\n return file.slice(start, end, fileType);\n }\n\n throw new Error(\"Unsupported file type\");\n}\n\n/**\n * Uploads a single part to S3.\n */\nasync function uploadPart(\n url: string,\n chunk: Blob | Buffer,\n onProgress: (loaded: number) => void,\n signal?: AbortSignal\n): Promise<void> {\n if (isBrowser && typeof XMLHttpRequest !== \"undefined\") {\n return uploadPartWithXHR(url, chunk, onProgress, signal);\n }\n\n return uploadPartWithFetch(url, chunk, signal);\n}\n\n/**\n * Upload part using XMLHttpRequest (browser only, supports progress).\n */\nfunction uploadPartWithXHR(\n url: string,\n chunk: Blob | Buffer,\n onProgress: (loaded: number) => void,\n signal?: AbortSignal\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n\n // Handle abort signal.\n if (signal) {\n signal.addEventListener(\"abort\", () => xhr.abort());\n }\n\n // Track upload progress.\n xhr.upload.addEventListener(\"progress\", (event: ProgressEvent) => {\n if (event.lengthComputable) {\n onProgress(event.loaded);\n }\n });\n\n // Handle completion.\n xhr.addEventListener(\"readystatechange\", () => {\n if (xhr.readyState === 4 && xhr.status === 200) {\n resolve();\n }\n });\n\n // Handle errors.\n xhr.addEventListener(\"error\", () => {\n reject(new Error(\"Part upload failed due to network error\"));\n });\n\n xhr.addEventListener(\"abort\", () => {\n reject(new Error(\"Part upload aborted\"));\n });\n\n xhr.addEventListener(\"timeout\", () => {\n reject(new Error(\"Part upload timed out\"));\n });\n\n // Convert Buffer to Blob if needed.\n let body: Blob;\n if (isBuffer(chunk)) {\n // Buffer is a Uint8Array, so we can pass it to Blob.\n // Use 'as any' to work around TypeScript's strict type checking for ArrayBufferLike.\n body = new Blob([chunk as any]);\n } else {\n body = chunk;\n }\n\n // Send request.\n xhr.open(\"PUT\", url);\n xhr.send(body);\n });\n}\n\n/**\n * Upload part using fetch (Node.js and browser).\n */\nasync function uploadPartWithFetch(\n url: string,\n chunk: Blob | Buffer,\n signal?: AbortSignal\n): Promise<void> {\n const response = await fetch(url, {\n method: \"PUT\",\n body: chunk as any,\n signal\n });\n\n if (response.status !== 200) {\n const text = await response.text();\n throw new Error(`Part upload failed with status ${response.status}: ${text}`);\n }\n}\n"],"names":["uploadLargeFile","file","fileData","config","fetchFn","options","onProgress","signal","chunkSize","parallelUploads","fileSize","getFileSize","chunkSizeBytes","Math","numberOfParts","createResult","createMultiPartUpload","uploadData","progressTracker","Map","updateProgress","uploaded","Array","sum","value","uploadedSize","pMap","part","Error","pRetry","chunk","getFileChunk","uploadPart","loaded","completeResult","completeMultiPartUpload","partNumber","fileType","start","end","isBuffer","isFile","Blob","url","isBrowser","XMLHttpRequest","uploadPartWithXHR","uploadPartWithFetch","Promise","resolve","reject","xhr","event","body","response","fetch","text"],"mappings":"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"}