@webiny/sdk 6.3.0 → 6.4.0-beta.1

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 (155) 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/WebhooksSdk.d.ts +35 -0
  16. package/WebhooksSdk.js +49 -0
  17. package/WebhooksSdk.js.map +1 -0
  18. package/Webiny.d.ts +2 -0
  19. package/Webiny.js +29 -26
  20. package/Webiny.js.map +1 -1
  21. package/errors.js +31 -48
  22. package/errors.js.map +1 -1
  23. package/index.d.ts +11 -0
  24. package/index.js +2 -21
  25. package/methods/cms/cmsTypes.js +0 -3
  26. package/methods/cms/createEntry.js +14 -39
  27. package/methods/cms/createEntry.js.map +1 -1
  28. package/methods/cms/deleteEntryRevision.js +12 -30
  29. package/methods/cms/deleteEntryRevision.js.map +1 -1
  30. package/methods/cms/getEntry.js +15 -36
  31. package/methods/cms/getEntry.js.map +1 -1
  32. package/methods/cms/listEntries.js +22 -51
  33. package/methods/cms/listEntries.js.map +1 -1
  34. package/methods/cms/publishEntryRevision.js +14 -33
  35. package/methods/cms/publishEntryRevision.js.map +1 -1
  36. package/methods/cms/schemas.js +39 -35
  37. package/methods/cms/schemas.js.map +1 -1
  38. package/methods/cms/unpublishEntryRevision.js +14 -33
  39. package/methods/cms/unpublishEntryRevision.js.map +1 -1
  40. package/methods/cms/updateEntryRevision.js +15 -42
  41. package/methods/cms/updateEntryRevision.js.map +1 -1
  42. package/methods/executeGraphQL.js +38 -41
  43. package/methods/executeGraphQL.js.map +1 -1
  44. package/methods/fileManager/buildFieldsSelection.js +25 -67
  45. package/methods/fileManager/buildFieldsSelection.js.map +1 -1
  46. package/methods/fileManager/completeMultiPartUpload.js +12 -29
  47. package/methods/fileManager/completeMultiPartUpload.js.map +1 -1
  48. package/methods/fileManager/createFile.js +61 -125
  49. package/methods/fileManager/createFile.js.map +1 -1
  50. package/methods/fileManager/createFiles.js +41 -76
  51. package/methods/fileManager/createFiles.js.map +1 -1
  52. package/methods/fileManager/createMultiPartUpload.js +12 -29
  53. package/methods/fileManager/createMultiPartUpload.js.map +1 -1
  54. package/methods/fileManager/deleteFile.js +11 -26
  55. package/methods/fileManager/deleteFile.js.map +1 -1
  56. package/methods/fileManager/fileManagerTypes.js +19 -18
  57. package/methods/fileManager/fileManagerTypes.js.map +1 -1
  58. package/methods/fileManager/getFile.js +15 -30
  59. package/methods/fileManager/getFile.js.map +1 -1
  60. package/methods/fileManager/getPresignedPostPayload.js +17 -40
  61. package/methods/fileManager/getPresignedPostPayload.js.map +1 -1
  62. package/methods/fileManager/getPresignedPostPayloads.js +17 -32
  63. package/methods/fileManager/getPresignedPostPayloads.js.map +1 -1
  64. package/methods/fileManager/listFiles.js +22 -45
  65. package/methods/fileManager/listFiles.js.map +1 -1
  66. package/methods/fileManager/listTags.js +11 -25
  67. package/methods/fileManager/listTags.js.map +1 -1
  68. package/methods/fileManager/schemas.js +15 -14
  69. package/methods/fileManager/schemas.js.map +1 -1
  70. package/methods/fileManager/updateFile.js +12 -29
  71. package/methods/fileManager/updateFile.js.map +1 -1
  72. package/methods/fileManager/utils/fileTypeDetection.js +10 -12
  73. package/methods/fileManager/utils/fileTypeDetection.js.map +1 -1
  74. package/methods/fileManager/utils/uploadLargeFile.js +86 -165
  75. package/methods/fileManager/utils/uploadLargeFile.js.map +1 -1
  76. package/methods/fileManager/utils/uploadToS3.js +41 -94
  77. package/methods/fileManager/utils/uploadToS3.js.map +1 -1
  78. package/methods/languages/listLanguages.js +8 -11
  79. package/methods/languages/listLanguages.js.map +1 -1
  80. package/methods/tasks/abortTask.js +11 -17
  81. package/methods/tasks/abortTask.js.map +1 -1
  82. package/methods/tasks/listDefinitions.js +8 -11
  83. package/methods/tasks/listDefinitions.js.map +1 -1
  84. package/methods/tasks/listLogs.js +10 -15
  85. package/methods/tasks/listLogs.js.map +1 -1
  86. package/methods/tasks/listTasks.js +8 -11
  87. package/methods/tasks/listTasks.js.map +1 -1
  88. package/methods/tasks/schemas.js +11 -10
  89. package/methods/tasks/schemas.js.map +1 -1
  90. package/methods/tasks/taskTypes.js +0 -3
  91. package/methods/tasks/triggerTask.js +11 -17
  92. package/methods/tasks/triggerTask.js.map +1 -1
  93. package/methods/tenantManager/createTenant.js +10 -24
  94. package/methods/tenantManager/createTenant.js.map +1 -1
  95. package/methods/tenantManager/disableTenant.js +10 -24
  96. package/methods/tenantManager/disableTenant.js.map +1 -1
  97. package/methods/tenantManager/enableTenant.js +10 -24
  98. package/methods/tenantManager/enableTenant.js.map +1 -1
  99. package/methods/tenantManager/getCurrentTenant.js +8 -18
  100. package/methods/tenantManager/getCurrentTenant.js.map +1 -1
  101. package/methods/tenantManager/installTenant.js +10 -24
  102. package/methods/tenantManager/installTenant.js.map +1 -1
  103. package/methods/tenantManager/schemas.js +13 -12
  104. package/methods/tenantManager/schemas.js.map +1 -1
  105. package/methods/tenantManager/tenantManagerTypes.js +0 -3
  106. package/methods/webhooks/createWebhook.d.ts +12 -0
  107. package/methods/webhooks/createWebhook.js +41 -0
  108. package/methods/webhooks/createWebhook.js.map +1 -0
  109. package/methods/webhooks/deleteWebhook.d.ts +6 -0
  110. package/methods/webhooks/deleteWebhook.js +30 -0
  111. package/methods/webhooks/deleteWebhook.js.map +1 -0
  112. package/methods/webhooks/getWebhook.d.ts +7 -0
  113. package/methods/webhooks/getWebhook.js +41 -0
  114. package/methods/webhooks/getWebhook.js.map +1 -0
  115. package/methods/webhooks/getWebhookDelivery.d.ts +7 -0
  116. package/methods/webhooks/getWebhookDelivery.js +43 -0
  117. package/methods/webhooks/getWebhookDelivery.js.map +1 -0
  118. package/methods/webhooks/listAvailableWebhookEvents.d.ts +7 -0
  119. package/methods/webhooks/listAvailableWebhookEvents.js +31 -0
  120. package/methods/webhooks/listAvailableWebhookEvents.js.map +1 -0
  121. package/methods/webhooks/listWebhookDeliveries.d.ts +17 -0
  122. package/methods/webhooks/listWebhookDeliveries.js +53 -0
  123. package/methods/webhooks/listWebhookDeliveries.js.map +1 -0
  124. package/methods/webhooks/listWebhooks.d.ts +19 -0
  125. package/methods/webhooks/listWebhooks.js +51 -0
  126. package/methods/webhooks/listWebhooks.js.map +1 -0
  127. package/methods/webhooks/resendWebhookDelivery.d.ts +6 -0
  128. package/methods/webhooks/resendWebhookDelivery.js +30 -0
  129. package/methods/webhooks/resendWebhookDelivery.js.map +1 -0
  130. package/methods/webhooks/schemas.d.ts +46 -0
  131. package/methods/webhooks/schemas.js +50 -0
  132. package/methods/webhooks/schemas.js.map +1 -0
  133. package/methods/webhooks/triggerWebhook.d.ts +8 -0
  134. package/methods/webhooks/triggerWebhook.js +44 -0
  135. package/methods/webhooks/triggerWebhook.js.map +1 -0
  136. package/methods/webhooks/updateWebhook.d.ts +13 -0
  137. package/methods/webhooks/updateWebhook.js +42 -0
  138. package/methods/webhooks/updateWebhook.js.map +1 -0
  139. package/methods/webhooks/webhooksTypes.d.ts +32 -0
  140. package/methods/webhooks/webhooksTypes.js +0 -0
  141. package/package.json +5 -5
  142. package/types.js +0 -3
  143. package/utils/createMethod.js +6 -24
  144. package/utils/createMethod.js.map +1 -1
  145. package/utils/platform.js +3 -2
  146. package/utils/platform.js.map +1 -1
  147. package/utils/transformFieldErrors.js +14 -33
  148. package/utils/transformFieldErrors.js.map +1 -1
  149. package/utils/validateParams.js +13 -16
  150. package/utils/validateParams.js.map +1 -1
  151. package/index.js.map +0 -1
  152. package/methods/cms/cmsTypes.js.map +0 -1
  153. package/methods/tasks/taskTypes.js.map +0 -1
  154. package/methods/tenantManager/tenantManagerTypes.js.map +0 -1
  155. package/types.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"names":["Result","transformFieldErrors","createMethod","updateEntryRevisionSchema","executeGraphQL","ApiError","_impl","config","fetchFn","modelId","revisionId","data","fields","query","result","isFail","fail","error","responseData","value","cms","updateEntryRevision","message","code","ok","params"],"sources":["updateEntryRevision.ts"],"sourcesContent":["import type { WebinyConfig } from \"../../types.js\";\nimport { Result } from \"../../Result.js\";\nimport type { HttpError, NetworkError, ValidationError } from \"../../errors.js\";\nimport type { CmsEntryValues, CmsIdentity } from \"./cmsTypes.js\";\nimport { transformFieldErrors } from \"../../utils/transformFieldErrors.js\";\nimport { createMethod } from \"../../utils/createMethod.js\";\nimport { updateEntryRevisionSchema } from \"./schemas.js\";\nimport { executeGraphQL } from \"../executeGraphQL.js\";\nimport { ApiError } from \"../../errors.js\";\n\n/**\n * Update entry revision data.\n */\nexport interface UpdateCmsEntryData<TValues extends CmsEntryValues = CmsEntryValues> {\n /**\n * Revision-level meta fields.\n */\n revisionCreatedOn?: Date | string | null;\n revisionModifiedOn?: Date | string | null;\n revisionSavedOn?: Date | string | null;\n revisionDeletedOn?: Date | string | null;\n revisionRestoredOn?: Date | string | null;\n revisionFirstPublishedOn?: Date | string | null;\n revisionLastPublishedOn?: Date | string | null;\n revisionModifiedBy?: CmsIdentity | null;\n revisionCreatedBy?: CmsIdentity | null;\n revisionSavedBy?: CmsIdentity | null;\n revisionDeletedBy?: CmsIdentity | null;\n revisionRestoredBy?: CmsIdentity | null;\n revisionFirstPublishedBy?: CmsIdentity | null;\n revisionLastPublishedBy?: CmsIdentity | null;\n\n /**\n * Entry-level meta fields.\n */\n createdOn?: Date | string | null;\n modifiedOn?: Date | string | null;\n savedOn?: Date | string | null;\n deletedOn?: Date | string | null;\n restoredOn?: Date | string | null;\n firstPublishedOn?: Date | string | null;\n lastPublishedOn?: Date | string | null;\n createdBy?: CmsIdentity | null;\n modifiedBy?: CmsIdentity | null;\n savedBy?: CmsIdentity | null;\n deletedBy?: CmsIdentity | null;\n restoredBy?: CmsIdentity | null;\n firstPublishedBy?: CmsIdentity | null;\n lastPublishedBy?: CmsIdentity | null;\n\n location?: {\n folderId?: string | null;\n };\n\n values?: Partial<TValues>;\n}\n\nexport interface UpdateEntryRevisionParams<TValues extends CmsEntryValues = CmsEntryValues> {\n modelId: string;\n revisionId: string;\n data: UpdateCmsEntryData<TValues>;\n fields: string[];\n}\n\n/**1`\n * Updates an existing entry revision in the CMS.\n *\n * @template TValues - Type of the entry data object returned (typically contains id and entryId, or additional fields if specified)\n * @param config - SDK configuration\n * @param fetchFn - Fetch function to use for HTTP requests\n * @param params - Parameters for updating the entry revision\n * @param params.modelId - The model ID for the entry\n * @param params.revisionId - The revision ID of the entry to update (e.g., \"123#0001\")\n * @param params.data - The updated entry data\n * @param params.fields - Fields to include in the response. Use \"values.\" prefix for entry values (e.g., \"values.author.name\") or specify top-level fields like \"createdOn\"\n * @returns Result containing the updated entry data or an error\n */\n\nconst _impl = createMethod(\n updateEntryRevisionSchema,\n async (config, fetchFn, { modelId, revisionId, data, fields }) => {\n const query = `\n mutation UpdateEntryRevision($modelId: ID!, $revisionId: ID!, $data: JSON!, $fields: [String!]!) {\n cms {\n updateEntryRevision(modelId: $modelId, revisionId: $revisionId, data: $data, fields: $fields) {\n data\n error {\n message\n code\n }\n }\n }\n }\n `;\n\n const result = await executeGraphQL(config, fetchFn, query, {\n modelId,\n revisionId,\n data,\n fields\n });\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const responseData = result.value;\n\n if (responseData.cms.updateEntryRevision.error) {\n return Result.fail(\n new ApiError(\n transformFieldErrors(\n responseData.cms.updateEntryRevision.error.message,\n fields\n ),\n responseData.cms.updateEntryRevision.error.code\n )\n );\n }\n\n return Result.ok(responseData.cms.updateEntryRevision.data);\n }\n);\n\nexport function updateEntryRevision<TValues extends CmsEntryValues = CmsEntryValues>(\n config: WebinyConfig,\n fetchFn: typeof fetch,\n params: UpdateEntryRevisionParams<TValues>\n): Promise<\n Result<UpdateCmsEntryData<TValues>, HttpError | ApiError | NetworkError | ValidationError>\n> {\n return _impl(config, fetchFn, params) as Promise<\n Result<UpdateCmsEntryData<TValues>, HttpError | ApiError | NetworkError | ValidationError>\n >;\n}\n"],"mappings":"AACA,SAASA,MAAM;AAGf,SAASC,oBAAoB;AAC7B,SAASC,YAAY;AACrB,SAASC,yBAAyB;AAClC,SAASC,cAAc;AACvB,SAASC,QAAQ;;AAEjB;AACA;AACA;;AAoDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAMC,KAAK,GAAGJ,YAAY,CACtBC,yBAAyB,EACzB,OAAOI,MAAM,EAAEC,OAAO,EAAE;EAAEC,OAAO;EAAEC,UAAU;EAAEC,IAAI;EAAEC;AAAO,CAAC,KAAK;EAC9D,MAAMC,KAAK,GAAG;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;EAEG,MAAMC,MAAM,GAAG,MAAMV,cAAc,CAACG,MAAM,EAAEC,OAAO,EAAEK,KAAK,EAAE;IACxDJ,OAAO;IACPC,UAAU;IACVC,IAAI;IACJC;EACJ,CAAC,CAAC;EAEF,IAAIE,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,GAAG,CAACC,mBAAmB,CAACJ,KAAK,EAAE;IAC5C,OAAOjB,MAAM,CAACgB,IAAI,CACd,IAAIX,QAAQ,CACRJ,oBAAoB,CAChBiB,YAAY,CAACE,GAAG,CAACC,mBAAmB,CAACJ,KAAK,CAACK,OAAO,EAClDV,MACJ,CAAC,EACDM,YAAY,CAACE,GAAG,CAACC,mBAAmB,CAACJ,KAAK,CAACM,IAC/C,CACJ,CAAC;EACL;EAEA,OAAOvB,MAAM,CAACwB,EAAE,CAACN,YAAY,CAACE,GAAG,CAACC,mBAAmB,CAACV,IAAI,CAAC;AAC/D,CACJ,CAAC;AAED,OAAO,SAASU,mBAAmBA,CAC/Bd,MAAoB,EACpBC,OAAqB,EACrBiB,MAA0C,EAG5C;EACE,OAAOnB,KAAK,CAACC,MAAM,EAAEC,OAAO,EAAEiB,MAAM,CAAC;AAGzC","ignoreList":[]}
1
+ {"version":3,"file":"methods/cms/updateEntryRevision.js","sources":["../../../src/methods/cms/updateEntryRevision.ts"],"sourcesContent":["import type { WebinyConfig } from \"../../types.js\";\nimport { Result } from \"../../Result.js\";\nimport type { HttpError, NetworkError, ValidationError } from \"../../errors.js\";\nimport type { CmsEntryValues, CmsIdentity } from \"./cmsTypes.js\";\nimport { transformFieldErrors } from \"../../utils/transformFieldErrors.js\";\nimport { createMethod } from \"../../utils/createMethod.js\";\nimport { updateEntryRevisionSchema } from \"./schemas.js\";\nimport { executeGraphQL } from \"../executeGraphQL.js\";\nimport { ApiError } from \"../../errors.js\";\n\n/**\n * Update entry revision data.\n */\nexport interface UpdateCmsEntryData<TValues extends CmsEntryValues = CmsEntryValues> {\n /**\n * Revision-level meta fields.\n */\n revisionCreatedOn?: Date | string | null;\n revisionModifiedOn?: Date | string | null;\n revisionSavedOn?: Date | string | null;\n revisionDeletedOn?: Date | string | null;\n revisionRestoredOn?: Date | string | null;\n revisionFirstPublishedOn?: Date | string | null;\n revisionLastPublishedOn?: Date | string | null;\n revisionModifiedBy?: CmsIdentity | null;\n revisionCreatedBy?: CmsIdentity | null;\n revisionSavedBy?: CmsIdentity | null;\n revisionDeletedBy?: CmsIdentity | null;\n revisionRestoredBy?: CmsIdentity | null;\n revisionFirstPublishedBy?: CmsIdentity | null;\n revisionLastPublishedBy?: CmsIdentity | null;\n\n /**\n * Entry-level meta fields.\n */\n createdOn?: Date | string | null;\n modifiedOn?: Date | string | null;\n savedOn?: Date | string | null;\n deletedOn?: Date | string | null;\n restoredOn?: Date | string | null;\n firstPublishedOn?: Date | string | null;\n lastPublishedOn?: Date | string | null;\n createdBy?: CmsIdentity | null;\n modifiedBy?: CmsIdentity | null;\n savedBy?: CmsIdentity | null;\n deletedBy?: CmsIdentity | null;\n restoredBy?: CmsIdentity | null;\n firstPublishedBy?: CmsIdentity | null;\n lastPublishedBy?: CmsIdentity | null;\n\n location?: {\n folderId?: string | null;\n };\n\n values?: Partial<TValues>;\n}\n\nexport interface UpdateEntryRevisionParams<TValues extends CmsEntryValues = CmsEntryValues> {\n modelId: string;\n revisionId: string;\n data: UpdateCmsEntryData<TValues>;\n fields: string[];\n}\n\n/**1`\n * Updates an existing entry revision in the CMS.\n *\n * @template TValues - Type of the entry data object returned (typically contains id and entryId, or additional fields if specified)\n * @param config - SDK configuration\n * @param fetchFn - Fetch function to use for HTTP requests\n * @param params - Parameters for updating the entry revision\n * @param params.modelId - The model ID for the entry\n * @param params.revisionId - The revision ID of the entry to update (e.g., \"123#0001\")\n * @param params.data - The updated entry data\n * @param params.fields - Fields to include in the response. Use \"values.\" prefix for entry values (e.g., \"values.author.name\") or specify top-level fields like \"createdOn\"\n * @returns Result containing the updated entry data or an error\n */\n\nconst _impl = createMethod(\n updateEntryRevisionSchema,\n async (config, fetchFn, { modelId, revisionId, data, fields }) => {\n const query = `\n mutation UpdateEntryRevision($modelId: ID!, $revisionId: ID!, $data: JSON!, $fields: [String!]!) {\n cms {\n updateEntryRevision(modelId: $modelId, revisionId: $revisionId, data: $data, fields: $fields) {\n data\n error {\n message\n code\n }\n }\n }\n }\n `;\n\n const result = await executeGraphQL(config, fetchFn, query, {\n modelId,\n revisionId,\n data,\n fields\n });\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const responseData = result.value;\n\n if (responseData.cms.updateEntryRevision.error) {\n return Result.fail(\n new ApiError(\n transformFieldErrors(\n responseData.cms.updateEntryRevision.error.message,\n fields\n ),\n responseData.cms.updateEntryRevision.error.code\n )\n );\n }\n\n return Result.ok(responseData.cms.updateEntryRevision.data);\n }\n);\n\nexport function updateEntryRevision<TValues extends CmsEntryValues = CmsEntryValues>(\n config: WebinyConfig,\n fetchFn: typeof fetch,\n params: UpdateEntryRevisionParams<TValues>\n): Promise<\n Result<UpdateCmsEntryData<TValues>, HttpError | ApiError | NetworkError | ValidationError>\n> {\n return _impl(config, fetchFn, params) as Promise<\n Result<UpdateCmsEntryData<TValues>, HttpError | ApiError | NetworkError | ValidationError>\n >;\n}\n"],"names":["_impl","createMethod","updateEntryRevisionSchema","config","fetchFn","modelId","revisionId","data","fields","query","result","executeGraphQL","Result","responseData","ApiError","transformFieldErrors","updateEntryRevision","params"],"mappings":";;;;;;AA8EA,MAAMA,QAAQC,aACVC,2BACA,OAAOC,QAAQC,SAAS,EAAEC,OAAO,EAAEC,UAAU,EAAEC,IAAI,EAAEC,MAAM,EAAE;IACzD,MAAMC,QAAQ,CAAC;;;;;;;;;;;;IAYnB,CAAC;IAEG,MAAMC,SAAS,MAAMC,eAAeR,QAAQC,SAASK,OAAO;QACxDJ;QACAC;QACAC;QACAC;IACJ;IAEA,IAAIE,OAAO,MAAM,IACb,OAAOE,OAAO,IAAI,CAACF,OAAO,KAAK;IAGnC,MAAMG,eAAeH,OAAO,KAAK;IAEjC,IAAIG,aAAa,GAAG,CAAC,mBAAmB,CAAC,KAAK,EAC1C,OAAOD,OAAO,IAAI,CACd,IAAIE,SACAC,qBACIF,aAAa,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,OAAO,EAClDL,SAEJK,aAAa,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI;IAK3D,OAAOD,OAAO,EAAE,CAACC,aAAa,GAAG,CAAC,mBAAmB,CAAC,IAAI;AAC9D;AAGG,SAASG,oBACZb,MAAoB,EACpBC,OAAqB,EACrBa,MAA0C;IAI1C,OAAOjB,MAAMG,QAAQC,SAASa;AAGlC"}
@@ -1,46 +1,43 @@
1
1
  import { Result } from "../Result.js";
2
- import { HttpError, ApiError, NetworkError } from "../errors.js";
3
- export async function executeGraphQL(config, fetchFn, query, variables = {}) {
4
- const url = `${config.endpoint}/graphql`;
5
- let response;
6
- try {
7
- const body = JSON.stringify({
8
- query,
9
- variables
10
- });
11
- const headers = {
12
- "Content-Type": "application/json",
13
- "x-tenant": config.tenant ?? "root",
14
- ...config.headers
15
- };
16
-
17
- // Only add Authorization header if token is provided and not already set in custom headers.
18
- if (config.token && !headers.Authorization) {
19
- const token = typeof config.token === "function" ? await config.token() : config.token;
20
- headers.Authorization = `Bearer ${token}`;
2
+ import { ApiError, HttpError, NetworkError } from "../errors.js";
3
+ async function executeGraphQL(config, fetchFn, query, variables = {}) {
4
+ const url = `${config.endpoint}/graphql`;
5
+ let response;
6
+ try {
7
+ const body = JSON.stringify({
8
+ query,
9
+ variables
10
+ });
11
+ const headers = {
12
+ "Content-Type": "application/json",
13
+ "x-tenant": config.tenant ?? "root",
14
+ ...config.headers
15
+ };
16
+ if (config.token && !headers.Authorization) {
17
+ const token = "function" == typeof config.token ? await config.token() : config.token;
18
+ headers.Authorization = `Bearer ${token}`;
19
+ }
20
+ response = await fetchFn(url, {
21
+ method: "POST",
22
+ headers,
23
+ body
24
+ });
25
+ } catch (error) {
26
+ return Result.fail(new NetworkError(error instanceof Error ? error.message : "Network request failed"));
27
+ }
28
+ if (!response.ok) return Result.fail(new HttpError(response.status, `HTTP error! status: ${response.status}`));
29
+ let result;
30
+ try {
31
+ result = await response.json();
32
+ } catch {
33
+ return Result.fail(new NetworkError("Failed to parse response JSON"));
34
+ }
35
+ if (result.errors) {
36
+ const error = result.errors[0];
37
+ return Result.fail(new ApiError(error?.message || "GraphQL error", error?.code));
21
38
  }
22
- response = await fetchFn(url, {
23
- method: "POST",
24
- headers,
25
- body
26
- });
27
- } catch (error) {
28
- return Result.fail(new NetworkError(error instanceof Error ? error.message : "Network request failed"));
29
- }
30
- if (!response.ok) {
31
- return Result.fail(new HttpError(response.status, `HTTP error! status: ${response.status}`));
32
- }
33
- let result;
34
- try {
35
- result = await response.json();
36
- } catch {
37
- return Result.fail(new NetworkError("Failed to parse response JSON"));
38
- }
39
- if (result.errors) {
40
- const error = result.errors[0];
41
- return Result.fail(new ApiError(error?.message || "GraphQL error", error?.code));
42
- }
43
- return Result.ok(result.data);
39
+ return Result.ok(result.data);
44
40
  }
41
+ export { executeGraphQL };
45
42
 
46
43
  //# sourceMappingURL=executeGraphQL.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","HttpError","ApiError","NetworkError","executeGraphQL","config","fetchFn","query","variables","url","endpoint","response","body","JSON","stringify","headers","tenant","token","Authorization","method","error","fail","Error","message","ok","status","result","json","errors","code","data"],"sources":["executeGraphQL.ts"],"sourcesContent":["import type { WebinyConfig } from \"../types.js\";\nimport { Result } from \"../Result.js\";\nimport { HttpError, ApiError, NetworkError } from \"../errors.js\";\n\nexport async function executeGraphQL(\n config: WebinyConfig,\n fetchFn: typeof fetch,\n query: string,\n variables: Record<string, unknown> = {}\n): Promise<Result<any, HttpError | ApiError | NetworkError>> {\n const url = `${config.endpoint}/graphql`;\n\n let response: Response;\n\n try {\n const body = JSON.stringify({ query, variables });\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"x-tenant\": config.tenant ?? \"root\",\n ...config.headers\n };\n\n // Only add Authorization header if token is provided and not already set in custom headers.\n if (config.token && !headers.Authorization) {\n const token = typeof config.token === \"function\" ? await config.token() : config.token;\n headers.Authorization = `Bearer ${token}`;\n }\n\n response = await fetchFn(url, {\n method: \"POST\",\n headers,\n body\n });\n } catch (error) {\n return Result.fail(\n new NetworkError(error instanceof Error ? error.message : \"Network request failed\")\n );\n }\n\n if (!response.ok) {\n return Result.fail(\n new HttpError(response.status, `HTTP error! status: ${response.status}`)\n );\n }\n\n let result: any;\n try {\n result = await response.json();\n } catch {\n return Result.fail(new NetworkError(\"Failed to parse response JSON\"));\n }\n\n if (result.errors) {\n const error = result.errors[0];\n return Result.fail(new ApiError(error?.message || \"GraphQL error\", error?.code));\n }\n\n return Result.ok(result.data);\n}\n"],"mappings":"AACA,SAASA,MAAM;AACf,SAASC,SAAS,EAAEC,QAAQ,EAAEC,YAAY;AAE1C,OAAO,eAAeC,cAAcA,CAChCC,MAAoB,EACpBC,OAAqB,EACrBC,KAAa,EACbC,SAAkC,GAAG,CAAC,CAAC,EACkB;EACzD,MAAMC,GAAG,GAAG,GAAGJ,MAAM,CAACK,QAAQ,UAAU;EAExC,IAAIC,QAAkB;EAEtB,IAAI;IACA,MAAMC,IAAI,GAAGC,IAAI,CAACC,SAAS,CAAC;MAAEP,KAAK;MAAEC;IAAU,CAAC,CAAC;IAEjD,MAAMO,OAA+B,GAAG;MACpC,cAAc,EAAE,kBAAkB;MAClC,UAAU,EAAEV,MAAM,CAACW,MAAM,IAAI,MAAM;MACnC,GAAGX,MAAM,CAACU;IACd,CAAC;;IAED;IACA,IAAIV,MAAM,CAACY,KAAK,IAAI,CAACF,OAAO,CAACG,aAAa,EAAE;MACxC,MAAMD,KAAK,GAAG,OAAOZ,MAAM,CAACY,KAAK,KAAK,UAAU,GAAG,MAAMZ,MAAM,CAACY,KAAK,CAAC,CAAC,GAAGZ,MAAM,CAACY,KAAK;MACtFF,OAAO,CAACG,aAAa,GAAG,UAAUD,KAAK,EAAE;IAC7C;IAEAN,QAAQ,GAAG,MAAML,OAAO,CAACG,GAAG,EAAE;MAC1BU,MAAM,EAAE,MAAM;MACdJ,OAAO;MACPH;IACJ,CAAC,CAAC;EACN,CAAC,CAAC,OAAOQ,KAAK,EAAE;IACZ,OAAOpB,MAAM,CAACqB,IAAI,CACd,IAAIlB,YAAY,CAACiB,KAAK,YAAYE,KAAK,GAAGF,KAAK,CAACG,OAAO,GAAG,wBAAwB,CACtF,CAAC;EACL;EAEA,IAAI,CAACZ,QAAQ,CAACa,EAAE,EAAE;IACd,OAAOxB,MAAM,CAACqB,IAAI,CACd,IAAIpB,SAAS,CAACU,QAAQ,CAACc,MAAM,EAAE,uBAAuBd,QAAQ,CAACc,MAAM,EAAE,CAC3E,CAAC;EACL;EAEA,IAAIC,MAAW;EACf,IAAI;IACAA,MAAM,GAAG,MAAMf,QAAQ,CAACgB,IAAI,CAAC,CAAC;EAClC,CAAC,CAAC,MAAM;IACJ,OAAO3B,MAAM,CAACqB,IAAI,CAAC,IAAIlB,YAAY,CAAC,+BAA+B,CAAC,CAAC;EACzE;EAEA,IAAIuB,MAAM,CAACE,MAAM,EAAE;IACf,MAAMR,KAAK,GAAGM,MAAM,CAACE,MAAM,CAAC,CAAC,CAAC;IAC9B,OAAO5B,MAAM,CAACqB,IAAI,CAAC,IAAInB,QAAQ,CAACkB,KAAK,EAAEG,OAAO,IAAI,eAAe,EAAEH,KAAK,EAAES,IAAI,CAAC,CAAC;EACpF;EAEA,OAAO7B,MAAM,CAACwB,EAAE,CAACE,MAAM,CAACI,IAAI,CAAC;AACjC","ignoreList":[]}
1
+ {"version":3,"file":"methods/executeGraphQL.js","sources":["../../src/methods/executeGraphQL.ts"],"sourcesContent":["import type { WebinyConfig } from \"../types.js\";\nimport { Result } from \"../Result.js\";\nimport { HttpError, ApiError, NetworkError } from \"../errors.js\";\n\nexport async function executeGraphQL(\n config: WebinyConfig,\n fetchFn: typeof fetch,\n query: string,\n variables: Record<string, unknown> = {}\n): Promise<Result<any, HttpError | ApiError | NetworkError>> {\n const url = `${config.endpoint}/graphql`;\n\n let response: Response;\n\n try {\n const body = JSON.stringify({ query, variables });\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"x-tenant\": config.tenant ?? \"root\",\n ...config.headers\n };\n\n // Only add Authorization header if token is provided and not already set in custom headers.\n if (config.token && !headers.Authorization) {\n const token = typeof config.token === \"function\" ? await config.token() : config.token;\n headers.Authorization = `Bearer ${token}`;\n }\n\n response = await fetchFn(url, {\n method: \"POST\",\n headers,\n body\n });\n } catch (error) {\n return Result.fail(\n new NetworkError(error instanceof Error ? error.message : \"Network request failed\")\n );\n }\n\n if (!response.ok) {\n return Result.fail(\n new HttpError(response.status, `HTTP error! status: ${response.status}`)\n );\n }\n\n let result: any;\n try {\n result = await response.json();\n } catch {\n return Result.fail(new NetworkError(\"Failed to parse response JSON\"));\n }\n\n if (result.errors) {\n const error = result.errors[0];\n return Result.fail(new ApiError(error?.message || \"GraphQL error\", error?.code));\n }\n\n return Result.ok(result.data);\n}\n"],"names":["executeGraphQL","config","fetchFn","query","variables","url","response","body","JSON","headers","token","error","Result","NetworkError","Error","HttpError","result","ApiError"],"mappings":";;AAIO,eAAeA,eAClBC,MAAoB,EACpBC,OAAqB,EACrBC,KAAa,EACbC,YAAqC,CAAC,CAAC;IAEvC,MAAMC,MAAM,GAAGJ,OAAO,QAAQ,CAAC,QAAQ,CAAC;IAExC,IAAIK;IAEJ,IAAI;QACA,MAAMC,OAAOC,KAAK,SAAS,CAAC;YAAEL;YAAOC;QAAU;QAE/C,MAAMK,UAAkC;YACpC,gBAAgB;YAChB,YAAYR,OAAO,MAAM,IAAI;YAC7B,GAAGA,OAAO,OAAO;QACrB;QAGA,IAAIA,OAAO,KAAK,IAAI,CAACQ,QAAQ,aAAa,EAAE;YACxC,MAAMC,QAAQ,AAAwB,cAAxB,OAAOT,OAAO,KAAK,GAAkB,MAAMA,OAAO,KAAK,KAAKA,OAAO,KAAK;YACtFQ,QAAQ,aAAa,GAAG,CAAC,OAAO,EAAEC,OAAO;QAC7C;QAEAJ,WAAW,MAAMJ,QAAQG,KAAK;YAC1B,QAAQ;YACRI;YACAF;QACJ;IACJ,EAAE,OAAOI,OAAO;QACZ,OAAOC,OAAO,IAAI,CACd,IAAIC,aAAaF,iBAAiBG,QAAQH,MAAM,OAAO,GAAG;IAElE;IAEA,IAAI,CAACL,SAAS,EAAE,EACZ,OAAOM,OAAO,IAAI,CACd,IAAIG,UAAUT,SAAS,MAAM,EAAE,CAAC,oBAAoB,EAAEA,SAAS,MAAM,EAAE;IAI/E,IAAIU;IACJ,IAAI;QACAA,SAAS,MAAMV,SAAS,IAAI;IAChC,EAAE,OAAM;QACJ,OAAOM,OAAO,IAAI,CAAC,IAAIC,aAAa;IACxC;IAEA,IAAIG,OAAO,MAAM,EAAE;QACf,MAAML,QAAQK,OAAO,MAAM,CAAC,EAAE;QAC9B,OAAOJ,OAAO,IAAI,CAAC,IAAIK,SAASN,OAAO,WAAW,iBAAiBA,OAAO;IAC9E;IAEA,OAAOC,OAAO,EAAE,CAACI,OAAO,IAAI;AAChC"}
@@ -1,71 +1,29 @@
1
- /**
2
- * Helper to build GraphQL fields selection from fields array.
3
- * Supports both top-level fields (e.g., "id", "name") and nested fields (e.g., "location.folderId", "createdBy.displayName").
4
- * Properly merges nested fields that share common parent paths.
5
- *
6
- * @param fields - Array of field paths in dot notation
7
- * @returns GraphQL selection string with proper field nesting
8
- *
9
- * @example
10
- * buildFieldsSelection(["id", "name", "location.folderId", "createdBy.id", "createdBy.displayName"])
11
- * // Returns:
12
- * // id
13
- * // name
14
- * // location {
15
- * // folderId
16
- * // }
17
- * // createdBy {
18
- * // id
19
- * // displayName
20
- * // }
21
- */
22
- export const buildFieldsSelection = fields => {
23
- const fieldTree = {};
24
- fields.forEach(field => {
25
- const parts = field.split(".");
26
- let current = fieldTree;
27
- parts.forEach((part, index) => {
28
- if (current[part] === undefined) {
29
- // Leaf node (null) or new branch (empty object)
30
- current[part] = index === parts.length - 1 ? null : {};
31
- } else if (current[part] === null && index < parts.length - 1) {
32
- // Convert leaf to branch if we need to traverse deeper
33
- current[part] = {};
34
- }
35
- if (current[part] !== null) {
36
- current = current[part];
37
- }
1
+ const buildFieldsSelection = (fields)=>{
2
+ const fieldTree = {};
3
+ fields.forEach((field)=>{
4
+ const parts = field.split(".");
5
+ let current = fieldTree;
6
+ parts.forEach((part, index)=>{
7
+ if (void 0 === current[part]) current[part] = index === parts.length - 1 ? null : {};
8
+ else if (null === current[part] && index < parts.length - 1) current[part] = {};
9
+ if (null !== current[part]) current = current[part];
10
+ });
38
11
  });
39
- });
40
-
41
- /**
42
- * Recursively converts the field tree into a GraphQL selection string.
43
- *
44
- * @param node - The current field tree node to process
45
- * @param indent - Current indentation level for formatting
46
- * @returns GraphQL selection string for this node and its children
47
- *
48
- * Handles two cases:
49
- * - Leaf nodes (value === null): Simple field name
50
- * - Branch nodes (value === object): Field name with nested selection in braces
51
- */
52
- const buildSelection = (node, indent = " ") => {
53
- const lines = [];
54
- Object.keys(node).sort().forEach(key => {
55
- const value = node[key];
56
- if (value === null) {
57
- // Leaf field - just the field name
58
- lines.push(`${indent}${key}`);
59
- } else {
60
- // Branch field - field name with nested selection
61
- lines.push(`${indent}${key} {`);
62
- lines.push(buildSelection(value, indent + " "));
63
- lines.push(`${indent}}`);
64
- }
65
- });
66
- return lines.join("\n");
67
- };
68
- return buildSelection(fieldTree);
12
+ const buildSelection = (node, indent = " ")=>{
13
+ const lines = [];
14
+ Object.keys(node).sort().forEach((key)=>{
15
+ const value = node[key];
16
+ if (null === value) lines.push(`${indent}${key}`);
17
+ else {
18
+ lines.push(`${indent}${key} {`);
19
+ lines.push(buildSelection(value, indent + " "));
20
+ lines.push(`${indent}}`);
21
+ }
22
+ });
23
+ return lines.join("\n");
24
+ };
25
+ return buildSelection(fieldTree);
69
26
  };
27
+ export { buildFieldsSelection };
70
28
 
71
29
  //# sourceMappingURL=buildFieldsSelection.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["buildFieldsSelection","fields","fieldTree","forEach","field","parts","split","current","part","index","undefined","length","buildSelection","node","indent","lines","Object","keys","sort","key","value","push","join"],"sources":["buildFieldsSelection.ts"],"sourcesContent":["/**\n * Helper to build GraphQL fields selection from fields array.\n * Supports both top-level fields (e.g., \"id\", \"name\") and nested fields (e.g., \"location.folderId\", \"createdBy.displayName\").\n * Properly merges nested fields that share common parent paths.\n *\n * @param fields - Array of field paths in dot notation\n * @returns GraphQL selection string with proper field nesting\n *\n * @example\n * buildFieldsSelection([\"id\", \"name\", \"location.folderId\", \"createdBy.id\", \"createdBy.displayName\"])\n * // Returns:\n * // id\n * // name\n * // location {\n * // folderId\n * // }\n * // createdBy {\n * // id\n * // displayName\n * // }\n */\nexport const buildFieldsSelection = (fields: string[]): string => {\n interface FieldNode {\n [key: string]: FieldNode | null;\n }\n\n const fieldTree: FieldNode = {};\n\n fields.forEach(field => {\n const parts = field.split(\".\");\n let current = fieldTree;\n\n parts.forEach((part, index) => {\n if (current[part] === undefined) {\n // Leaf node (null) or new branch (empty object)\n current[part] = index === parts.length - 1 ? null : {};\n } else if (current[part] === null && index < parts.length - 1) {\n // Convert leaf to branch if we need to traverse deeper\n current[part] = {};\n }\n if (current[part] !== null) {\n current = current[part] as FieldNode;\n }\n });\n });\n\n /**\n * Recursively converts the field tree into a GraphQL selection string.\n *\n * @param node - The current field tree node to process\n * @param indent - Current indentation level for formatting\n * @returns GraphQL selection string for this node and its children\n *\n * Handles two cases:\n * - Leaf nodes (value === null): Simple field name\n * - Branch nodes (value === object): Field name with nested selection in braces\n */\n const buildSelection = (node: FieldNode, indent: string = \" \"): string => {\n const lines: string[] = [];\n\n Object.keys(node)\n .sort()\n .forEach(key => {\n const value = node[key];\n if (value === null) {\n // Leaf field - just the field name\n lines.push(`${indent}${key}`);\n } else {\n // Branch field - field name with nested selection\n lines.push(`${indent}${key} {`);\n lines.push(buildSelection(value, indent + \" \"));\n lines.push(`${indent}}`);\n }\n });\n\n return lines.join(\"\\n\");\n };\n\n return buildSelection(fieldTree);\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,oBAAoB,GAAIC,MAAgB,IAAa;EAK9D,MAAMC,SAAoB,GAAG,CAAC,CAAC;EAE/BD,MAAM,CAACE,OAAO,CAACC,KAAK,IAAI;IACpB,MAAMC,KAAK,GAAGD,KAAK,CAACE,KAAK,CAAC,GAAG,CAAC;IAC9B,IAAIC,OAAO,GAAGL,SAAS;IAEvBG,KAAK,CAACF,OAAO,CAAC,CAACK,IAAI,EAAEC,KAAK,KAAK;MAC3B,IAAIF,OAAO,CAACC,IAAI,CAAC,KAAKE,SAAS,EAAE;QAC7B;QACAH,OAAO,CAACC,IAAI,CAAC,GAAGC,KAAK,KAAKJ,KAAK,CAACM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;MAC1D,CAAC,MAAM,IAAIJ,OAAO,CAACC,IAAI,CAAC,KAAK,IAAI,IAAIC,KAAK,GAAGJ,KAAK,CAACM,MAAM,GAAG,CAAC,EAAE;QAC3D;QACAJ,OAAO,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MACtB;MACA,IAAID,OAAO,CAACC,IAAI,CAAC,KAAK,IAAI,EAAE;QACxBD,OAAO,GAAGA,OAAO,CAACC,IAAI,CAAc;MACxC;IACJ,CAAC,CAAC;EACN,CAAC,CAAC;;EAEF;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACI,MAAMI,cAAc,GAAGA,CAACC,IAAe,EAAEC,MAAc,GAAG,UAAU,KAAa;IAC7E,MAAMC,KAAe,GAAG,EAAE;IAE1BC,MAAM,CAACC,IAAI,CAACJ,IAAI,CAAC,CACZK,IAAI,CAAC,CAAC,CACNf,OAAO,CAACgB,GAAG,IAAI;MACZ,MAAMC,KAAK,GAAGP,IAAI,CAACM,GAAG,CAAC;MACvB,IAAIC,KAAK,KAAK,IAAI,EAAE;QAChB;QACAL,KAAK,CAACM,IAAI,CAAC,GAAGP,MAAM,GAAGK,GAAG,EAAE,CAAC;MACjC,CAAC,MAAM;QACH;QACAJ,KAAK,CAACM,IAAI,CAAC,GAAGP,MAAM,GAAGK,GAAG,IAAI,CAAC;QAC/BJ,KAAK,CAACM,IAAI,CAACT,cAAc,CAACQ,KAAK,EAAEN,MAAM,GAAG,MAAM,CAAC,CAAC;QAClDC,KAAK,CAACM,IAAI,CAAC,GAAGP,MAAM,GAAG,CAAC;MAC5B;IACJ,CAAC,CAAC;IAEN,OAAOC,KAAK,CAACO,IAAI,CAAC,IAAI,CAAC;EAC3B,CAAC;EAED,OAAOV,cAAc,CAACV,SAAS,CAAC;AACpC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"methods/fileManager/buildFieldsSelection.js","sources":["../../../src/methods/fileManager/buildFieldsSelection.ts"],"sourcesContent":["/**\n * Helper to build GraphQL fields selection from fields array.\n * Supports both top-level fields (e.g., \"id\", \"name\") and nested fields (e.g., \"location.folderId\", \"createdBy.displayName\").\n * Properly merges nested fields that share common parent paths.\n *\n * @param fields - Array of field paths in dot notation\n * @returns GraphQL selection string with proper field nesting\n *\n * @example\n * buildFieldsSelection([\"id\", \"name\", \"location.folderId\", \"createdBy.id\", \"createdBy.displayName\"])\n * // Returns:\n * // id\n * // name\n * // location {\n * // folderId\n * // }\n * // createdBy {\n * // id\n * // displayName\n * // }\n */\nexport const buildFieldsSelection = (fields: string[]): string => {\n interface FieldNode {\n [key: string]: FieldNode | null;\n }\n\n const fieldTree: FieldNode = {};\n\n fields.forEach(field => {\n const parts = field.split(\".\");\n let current = fieldTree;\n\n parts.forEach((part, index) => {\n if (current[part] === undefined) {\n // Leaf node (null) or new branch (empty object)\n current[part] = index === parts.length - 1 ? null : {};\n } else if (current[part] === null && index < parts.length - 1) {\n // Convert leaf to branch if we need to traverse deeper\n current[part] = {};\n }\n if (current[part] !== null) {\n current = current[part] as FieldNode;\n }\n });\n });\n\n /**\n * Recursively converts the field tree into a GraphQL selection string.\n *\n * @param node - The current field tree node to process\n * @param indent - Current indentation level for formatting\n * @returns GraphQL selection string for this node and its children\n *\n * Handles two cases:\n * - Leaf nodes (value === null): Simple field name\n * - Branch nodes (value === object): Field name with nested selection in braces\n */\n const buildSelection = (node: FieldNode, indent: string = \" \"): string => {\n const lines: string[] = [];\n\n Object.keys(node)\n .sort()\n .forEach(key => {\n const value = node[key];\n if (value === null) {\n // Leaf field - just the field name\n lines.push(`${indent}${key}`);\n } else {\n // Branch field - field name with nested selection\n lines.push(`${indent}${key} {`);\n lines.push(buildSelection(value, indent + \" \"));\n lines.push(`${indent}}`);\n }\n });\n\n return lines.join(\"\\n\");\n };\n\n return buildSelection(fieldTree);\n};\n"],"names":["buildFieldsSelection","fields","fieldTree","field","parts","current","part","index","undefined","buildSelection","node","indent","lines","Object","key","value"],"mappings":"AAqBO,MAAMA,uBAAuB,CAACC;IAKjC,MAAMC,YAAuB,CAAC;IAE9BD,OAAO,OAAO,CAACE,CAAAA;QACX,MAAMC,QAAQD,MAAM,KAAK,CAAC;QAC1B,IAAIE,UAAUH;QAEdE,MAAM,OAAO,CAAC,CAACE,MAAMC;YACjB,IAAIF,AAAkBG,WAAlBH,OAAO,CAACC,KAAK,EAEbD,OAAO,CAACC,KAAK,GAAGC,UAAUH,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC;iBAClD,IAAIC,AAAkB,SAAlBA,OAAO,CAACC,KAAK,IAAaC,QAAQH,MAAM,MAAM,GAAG,GAExDC,OAAO,CAACC,KAAK,GAAG,CAAC;YAErB,IAAID,AAAkB,SAAlBA,OAAO,CAACC,KAAK,EACbD,UAAUA,OAAO,CAACC,KAAK;QAE/B;IACJ;IAaA,MAAMG,iBAAiB,CAACC,MAAiBC,SAAiB,UAAU;QAChE,MAAMC,QAAkB,EAAE;QAE1BC,OAAO,IAAI,CAACH,MACP,IAAI,GACJ,OAAO,CAACI,CAAAA;YACL,MAAMC,QAAQL,IAAI,CAACI,IAAI;YACvB,IAAIC,AAAU,SAAVA,OAEAH,MAAM,IAAI,CAAC,GAAGD,SAASG,KAAK;iBACzB;gBAEHF,MAAM,IAAI,CAAC,GAAGD,SAASG,IAAI,EAAE,CAAC;gBAC9BF,MAAM,IAAI,CAACH,eAAeM,OAAOJ,SAAS;gBAC1CC,MAAM,IAAI,CAAC,GAAGD,OAAO,CAAC,CAAC;YAC3B;QACJ;QAEJ,OAAOC,MAAM,IAAI,CAAC;IACtB;IAEA,OAAOH,eAAeP;AAC1B"}
@@ -1,23 +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
- * Completes a multi-part upload.
6
- *
7
- * @param config - SDK configuration
8
- * @param fetchFn - Fetch function to use for HTTP requests
9
- * @param params - Parameters for completing the multi-part upload
10
- * @param params.fileKey - S3 key of the uploaded file
11
- * @param params.uploadId - Upload ID from createMultiPartUpload
12
- * @returns Result containing true on success or an error
13
- */
14
- // Not using createMethod: params include raw upload part data that Zod cannot validate.
15
- export async function completeMultiPartUpload(config, fetchFn, params) {
16
- const {
17
- fileKey,
18
- uploadId
19
- } = params;
20
- const query = `
4
+ async function completeMultiPartUpload(config, fetchFn, params) {
5
+ const { fileKey, uploadId } = params;
6
+ const query = `
21
7
  mutation CompleteMultiPartUpload($fileKey: String!, $uploadId: String!) {
22
8
  fileManager {
23
9
  completeMultiPartUpload(fileKey: $fileKey, uploadId: $uploadId) {
@@ -30,18 +16,15 @@ export async function completeMultiPartUpload(config, fetchFn, params) {
30
16
  }
31
17
  }
32
18
  `;
33
- const result = await executeGraphQL(config, fetchFn, query, {
34
- fileKey,
35
- uploadId
36
- });
37
- if (result.isFail()) {
38
- return Result.fail(result.error);
39
- }
40
- const responseData = result.value;
41
- if (responseData.fileManager.completeMultiPartUpload.error) {
42
- return Result.fail(new ApiError(responseData.fileManager.completeMultiPartUpload.error.message, responseData.fileManager.completeMultiPartUpload.error.code));
43
- }
44
- return Result.ok(responseData.fileManager.completeMultiPartUpload.data);
19
+ const result = await executeGraphQL(config, fetchFn, query, {
20
+ fileKey,
21
+ uploadId
22
+ });
23
+ if (result.isFail()) return Result.fail(result.error);
24
+ const responseData = result.value;
25
+ if (responseData.fileManager.completeMultiPartUpload.error) return Result.fail(new ApiError(responseData.fileManager.completeMultiPartUpload.error.message, responseData.fileManager.completeMultiPartUpload.error.code));
26
+ return Result.ok(responseData.fileManager.completeMultiPartUpload.data);
45
27
  }
28
+ export { completeMultiPartUpload };
46
29
 
47
30
  //# sourceMappingURL=completeMultiPartUpload.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","executeGraphQL","ApiError","completeMultiPartUpload","config","fetchFn","params","fileKey","uploadId","query","result","isFail","fail","error","responseData","value","fileManager","message","code","ok","data"],"sources":["completeMultiPartUpload.ts"],"sourcesContent":["import type { WebinyConfig } from \"../../types.js\";\nimport { Result } from \"../../Result.js\";\nimport type { HttpError, NetworkError } from \"../../errors.js\";\nimport { executeGraphQL } from \"../executeGraphQL.js\";\nimport { ApiError } from \"../../errors.js\";\n\nexport interface CompleteMultiPartUploadParams {\n fileKey: string;\n uploadId: string;\n}\n\n/**\n * Completes a multi-part upload.\n *\n * @param config - SDK configuration\n * @param fetchFn - Fetch function to use for HTTP requests\n * @param params - Parameters for completing the multi-part upload\n * @param params.fileKey - S3 key of the uploaded file\n * @param params.uploadId - Upload ID from createMultiPartUpload\n * @returns Result containing true on success or an error\n */\n// Not using createMethod: params include raw upload part data that Zod cannot validate.\nexport async function completeMultiPartUpload(\n config: WebinyConfig,\n fetchFn: typeof fetch,\n params: CompleteMultiPartUploadParams\n): Promise<Result<boolean, HttpError | ApiError | NetworkError>> {\n const { fileKey, uploadId } = params;\n\n const query = `\n mutation CompleteMultiPartUpload($fileKey: String!, $uploadId: String!) {\n fileManager {\n completeMultiPartUpload(fileKey: $fileKey, uploadId: $uploadId) {\n data\n error {\n message\n code\n }\n }\n }\n }\n `;\n\n const result = await executeGraphQL(config, fetchFn, query, { fileKey, uploadId });\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const responseData = result.value;\n\n if (responseData.fileManager.completeMultiPartUpload.error) {\n return Result.fail(\n new ApiError(\n responseData.fileManager.completeMultiPartUpload.error.message,\n responseData.fileManager.completeMultiPartUpload.error.code\n )\n );\n }\n\n return Result.ok(responseData.fileManager.completeMultiPartUpload.data);\n}\n"],"mappings":"AACA,SAASA,MAAM;AAEf,SAASC,cAAc;AACvB,SAASC,QAAQ;AAOjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,uBAAuBA,CACzCC,MAAoB,EACpBC,OAAqB,EACrBC,MAAqC,EACwB;EAC7D,MAAM;IAAEC,OAAO;IAAEC;EAAS,CAAC,GAAGF,MAAM;EAEpC,MAAMG,KAAK,GAAG;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;EAED,MAAMC,MAAM,GAAG,MAAMT,cAAc,CAACG,MAAM,EAAEC,OAAO,EAAEI,KAAK,EAAE;IAAEF,OAAO;IAAEC;EAAS,CAAC,CAAC;EAElF,IAAIE,MAAM,CAACC,MAAM,CAAC,CAAC,EAAE;IACjB,OAAOX,MAAM,CAACY,IAAI,CAACF,MAAM,CAACG,KAAK,CAAC;EACpC;EAEA,MAAMC,YAAY,GAAGJ,MAAM,CAACK,KAAK;EAEjC,IAAID,YAAY,CAACE,WAAW,CAACb,uBAAuB,CAACU,KAAK,EAAE;IACxD,OAAOb,MAAM,CAACY,IAAI,CACd,IAAIV,QAAQ,CACRY,YAAY,CAACE,WAAW,CAACb,uBAAuB,CAACU,KAAK,CAACI,OAAO,EAC9DH,YAAY,CAACE,WAAW,CAACb,uBAAuB,CAACU,KAAK,CAACK,IAC3D,CACJ,CAAC;EACL;EAEA,OAAOlB,MAAM,CAACmB,EAAE,CAACL,YAAY,CAACE,WAAW,CAACb,uBAAuB,CAACiB,IAAI,CAAC;AAC3E","ignoreList":[]}
1
+ {"version":3,"file":"methods/fileManager/completeMultiPartUpload.js","sources":["../../../src/methods/fileManager/completeMultiPartUpload.ts"],"sourcesContent":["import type { WebinyConfig } from \"../../types.js\";\nimport { Result } from \"../../Result.js\";\nimport type { HttpError, NetworkError } from \"../../errors.js\";\nimport { executeGraphQL } from \"../executeGraphQL.js\";\nimport { ApiError } from \"../../errors.js\";\n\nexport interface CompleteMultiPartUploadParams {\n fileKey: string;\n uploadId: string;\n}\n\n/**\n * Completes a multi-part upload.\n *\n * @param config - SDK configuration\n * @param fetchFn - Fetch function to use for HTTP requests\n * @param params - Parameters for completing the multi-part upload\n * @param params.fileKey - S3 key of the uploaded file\n * @param params.uploadId - Upload ID from createMultiPartUpload\n * @returns Result containing true on success or an error\n */\n// Not using createMethod: params include raw upload part data that Zod cannot validate.\nexport async function completeMultiPartUpload(\n config: WebinyConfig,\n fetchFn: typeof fetch,\n params: CompleteMultiPartUploadParams\n): Promise<Result<boolean, HttpError | ApiError | NetworkError>> {\n const { fileKey, uploadId } = params;\n\n const query = `\n mutation CompleteMultiPartUpload($fileKey: String!, $uploadId: String!) {\n fileManager {\n completeMultiPartUpload(fileKey: $fileKey, uploadId: $uploadId) {\n data\n error {\n message\n code\n }\n }\n }\n }\n `;\n\n const result = await executeGraphQL(config, fetchFn, query, { fileKey, uploadId });\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const responseData = result.value;\n\n if (responseData.fileManager.completeMultiPartUpload.error) {\n return Result.fail(\n new ApiError(\n responseData.fileManager.completeMultiPartUpload.error.message,\n responseData.fileManager.completeMultiPartUpload.error.code\n )\n );\n }\n\n return Result.ok(responseData.fileManager.completeMultiPartUpload.data);\n}\n"],"names":["completeMultiPartUpload","config","fetchFn","params","fileKey","uploadId","query","result","executeGraphQL","Result","responseData","ApiError"],"mappings":";;;AAsBO,eAAeA,wBAClBC,MAAoB,EACpBC,OAAqB,EACrBC,MAAqC;IAErC,MAAM,EAAEC,OAAO,EAAEC,QAAQ,EAAE,GAAGF;IAE9B,MAAMG,QAAQ,CAAC;;;;;;;;;;;;IAYf,CAAC;IAED,MAAMC,SAAS,MAAMC,eAAeP,QAAQC,SAASI,OAAO;QAAEF;QAASC;IAAS;IAEhF,IAAIE,OAAO,MAAM,IACb,OAAOE,OAAO,IAAI,CAACF,OAAO,KAAK;IAGnC,MAAMG,eAAeH,OAAO,KAAK;IAEjC,IAAIG,aAAa,WAAW,CAAC,uBAAuB,CAAC,KAAK,EACtD,OAAOD,OAAO,IAAI,CACd,IAAIE,SACAD,aAAa,WAAW,CAAC,uBAAuB,CAAC,KAAK,CAAC,OAAO,EAC9DA,aAAa,WAAW,CAAC,uBAAuB,CAAC,KAAK,CAAC,IAAI;IAKvE,OAAOD,OAAO,EAAE,CAACC,aAAa,WAAW,CAAC,uBAAuB,CAAC,IAAI;AAC1E"}
@@ -6,129 +6,68 @@ import { ApiError } from "../../errors.js";
6
6
  import { getPresignedPostPayload } from "./getPresignedPostPayload.js";
7
7
  import { uploadToS3 } from "./utils/uploadToS3.js";
8
8
  import { uploadLargeFile } from "./utils/uploadLargeFile.js";
9
- /**
10
- * Creates a new file in the file manager.
11
- * If a file is provided, it will be uploaded to S3 first, then the record is created.
12
- * If no file is provided, only the metadata record is created.
13
- *
14
- * @param config - SDK configuration
15
- * @param fetchFn - Fetch function to use for HTTP requests
16
- * @param params - Parameters for creating the file
17
- * @param params.file - Optional: The actual file content to upload
18
- * @param params.data - The file metadata
19
- * @param params.onProgress - Optional: Progress callback
20
- * @param params.multiPartThreshold - Optional: Threshold in MB for multi-part upload (default: 100)
21
- * @param params.signal - Optional: AbortSignal for cancellation
22
- * @returns Result containing the created file data or an error
23
- */
24
- // Not using createMethod: params include File/Buffer/Blob, onProgress callback, and AbortSignal — types Zod cannot validate.
25
- export async function createFile(config, fetchFn, params) {
26
- const {
27
- file,
28
- data,
29
- fields,
30
- onProgress,
31
- multiPartThreshold = 100,
32
- signal
33
- } = params;
34
-
35
- // If no file provided, just create metadata record (existing behavior).
36
- if (!file) {
37
- return createFileRecord(config, fetchFn, data, fields);
38
- }
39
-
40
- // File upload flow.
41
- try {
42
- const fileSize = getFileSize(file);
43
- const thresholdBytes = multiPartThreshold * 1024 * 1024;
44
-
45
- // Ensure we have required metadata for upload.
46
- if (!data.name || !data.type) {
47
- return Result.fail(new Error("File name and type are required for upload"));
48
- }
49
-
50
- // Decide upload strategy based on file size.
51
- if (fileSize < thresholdBytes) {
52
- // Simple upload.
53
- return await uploadSmallFile(config, fetchFn, file, data, fields, onProgress, signal);
54
- } else {
55
- // Multi-part upload.
56
- return await uploadLargeFileWrapper(config, fetchFn, file, data, fields, onProgress, signal);
9
+ async function createFile(config, fetchFn, params) {
10
+ const { file, data, fields, onProgress, multiPartThreshold = 100, signal } = params;
11
+ if (!file) return createFileRecord(config, fetchFn, data, fields);
12
+ try {
13
+ const fileSize = getFileSize(file);
14
+ const thresholdBytes = 1024 * multiPartThreshold * 1024;
15
+ if (!data.name || !data.type) return Result.fail(new Error("File name and type are required for upload"));
16
+ if (fileSize < thresholdBytes) return await uploadSmallFile(config, fetchFn, file, data, fields, onProgress, signal);
17
+ return await uploadLargeFileWrapper(config, fetchFn, file, data, fields, onProgress, signal);
18
+ } catch (error) {
19
+ return Result.fail(error);
57
20
  }
58
- } catch (error) {
59
- return Result.fail(error);
60
- }
61
21
  }
62
-
63
- /**
64
- * Uploads a small file using simple presigned POST.
65
- */
66
22
  async function uploadSmallFile(config, fetchFn, file, data, fields, onProgress, signal) {
67
- // 1. Get presigned POST payload.
68
- const presignedResult = await getPresignedPostPayload(config, fetchFn, {
69
- name: data.name,
70
- type: data.type,
71
- size: getFileSize(file),
72
- key: data.key,
73
- keyPrefix: data.keyPrefix
74
- });
75
- if (presignedResult.isFail()) {
76
- return Result.fail(presignedResult.error);
77
- }
78
-
79
- // 2. Upload to S3.
80
- await uploadToS3(file, presignedResult.value.data, {
81
- onProgress,
82
- signal
83
- });
84
-
85
- // 3. Create file record with S3 key from presigned response.
86
- const fileMetadata = {
87
- ...data,
88
- id: presignedResult.value.file.id,
89
- key: presignedResult.value.file.key,
90
- size: presignedResult.value.file.size
91
- };
92
- return createFileRecord(config, fetchFn, fileMetadata, fields);
93
- }
94
-
95
- /**
96
- * Uploads a large file using multi-part upload.
97
- */
98
- async function uploadLargeFileWrapper(config, fetchFn, file, data, fields, onProgress, signal) {
99
- try {
100
- const uploadedFile = await uploadLargeFile(file, {
101
- name: data.name,
102
- type: data.type,
103
- size: getFileSize(file),
104
- key: data.key,
105
- keyPrefix: data.keyPrefix
106
- }, config, fetchFn, {
107
- onProgress,
108
- signal,
109
- chunkSize: 50,
110
- parallelUploads: 5
23
+ const presignedResult = await getPresignedPostPayload(config, fetchFn, {
24
+ name: data.name,
25
+ type: data.type,
26
+ size: getFileSize(file),
27
+ key: data.key,
28
+ keyPrefix: data.keyPrefix
29
+ });
30
+ if (presignedResult.isFail()) return Result.fail(presignedResult.error);
31
+ await uploadToS3(file, presignedResult.value.data, {
32
+ onProgress,
33
+ signal
111
34
  });
112
-
113
- // Create file record with uploaded metadata.
114
35
  const fileMetadata = {
115
- ...data,
116
- id: uploadedFile.id,
117
- key: uploadedFile.key,
118
- size: uploadedFile.size
36
+ ...data,
37
+ id: presignedResult.value.file.id,
38
+ key: presignedResult.value.file.key,
39
+ size: presignedResult.value.file.size
119
40
  };
120
41
  return createFileRecord(config, fetchFn, fileMetadata, fields);
121
- } catch (error) {
122
- return Result.fail(error);
123
- }
124
42
  }
125
-
126
- /**
127
- * Creates a file record via GraphQL (metadata only).
128
- */
43
+ async function uploadLargeFileWrapper(config, fetchFn, file, data, fields, onProgress, signal) {
44
+ try {
45
+ const uploadedFile = await uploadLargeFile(file, {
46
+ name: data.name,
47
+ type: data.type,
48
+ size: getFileSize(file),
49
+ key: data.key,
50
+ keyPrefix: data.keyPrefix
51
+ }, config, fetchFn, {
52
+ onProgress,
53
+ signal,
54
+ chunkSize: 50,
55
+ parallelUploads: 5
56
+ });
57
+ const fileMetadata = {
58
+ ...data,
59
+ id: uploadedFile.id,
60
+ key: uploadedFile.key,
61
+ size: uploadedFile.size
62
+ };
63
+ return createFileRecord(config, fetchFn, fileMetadata, fields);
64
+ } catch (error) {
65
+ return Result.fail(error);
66
+ }
67
+ }
129
68
  async function createFileRecord(config, fetchFn, data, fields) {
130
- const fieldsSelection = buildFieldsSelection(fields);
131
- const query = `
69
+ const fieldsSelection = buildFieldsSelection(fields);
70
+ const query = `
132
71
  mutation CreateFile($data: FmFileCreateInput!) {
133
72
  fileManager {
134
73
  createFile(data: $data) {
@@ -143,17 +82,14 @@ ${fieldsSelection}
143
82
  }
144
83
  }
145
84
  `;
146
- const result = await executeGraphQL(config, fetchFn, query, {
147
- data
148
- });
149
- if (result.isFail()) {
150
- return Result.fail(result.error);
151
- }
152
- const responseData = result.value;
153
- if (responseData.fileManager.createFile.error) {
154
- return Result.fail(new ApiError(responseData.fileManager.createFile.error.message, responseData.fileManager.createFile.error.code));
155
- }
156
- return Result.ok(responseData.fileManager.createFile.data);
85
+ const result = await executeGraphQL(config, fetchFn, query, {
86
+ data
87
+ });
88
+ if (result.isFail()) return Result.fail(result.error);
89
+ const responseData = result.value;
90
+ if (responseData.fileManager.createFile.error) return Result.fail(new ApiError(responseData.fileManager.createFile.error.message, responseData.fileManager.createFile.error.code));
91
+ return Result.ok(responseData.fileManager.createFile.data);
157
92
  }
93
+ export { createFile };
158
94
 
159
95
  //# sourceMappingURL=createFile.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","getFileSize","buildFieldsSelection","executeGraphQL","ApiError","getPresignedPostPayload","uploadToS3","uploadLargeFile","createFile","config","fetchFn","params","file","data","fields","onProgress","multiPartThreshold","signal","createFileRecord","fileSize","thresholdBytes","name","type","fail","Error","uploadSmallFile","uploadLargeFileWrapper","error","presignedResult","size","key","keyPrefix","isFail","value","fileMetadata","id","uploadedFile","chunkSize","parallelUploads","fieldsSelection","query","result","responseData","fileManager","message","code","ok"],"sources":["createFile.ts"],"sourcesContent":["import type { WebinyConfig } from \"../../types.js\";\nimport { Result } from \"../../Result.js\";\nimport type { HttpError, NetworkError } from \"../../errors.js\";\nimport type { FmFile, FmIdentity, FmLocationInput, UploadProgress } from \"./fileManagerTypes.js\";\nimport { getFileSize } from \"./utils/fileTypeDetection.js\";\nimport { buildFieldsSelection } from \"./buildFieldsSelection.js\";\nimport { executeGraphQL } from \"../executeGraphQL.js\";\nimport { ApiError } from \"../../errors.js\";\nimport { getPresignedPostPayload } from \"./getPresignedPostPayload.js\";\nimport { uploadToS3 } from \"./utils/uploadToS3.js\";\nimport { uploadLargeFile } from \"./utils/uploadLargeFile.js\";\n\nexport interface CreateFileData {\n id?: string;\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 keyPrefix?: string;\n type?: string;\n size?: number;\n tags?: string[];\n [key: string]: any;\n}\n\nexport interface CreateFileParams {\n file?: Buffer | Blob | File;\n data: CreateFileData;\n fields: string[];\n onProgress?: (progress: UploadProgress) => void;\n multiPartThreshold?: number;\n signal?: AbortSignal;\n}\n\n/**\n * Creates a new file in the file manager.\n * If a file is provided, it will be uploaded to S3 first, then the record is created.\n * If no file is provided, only the metadata record is created.\n *\n * @param config - SDK configuration\n * @param fetchFn - Fetch function to use for HTTP requests\n * @param params - Parameters for creating the file\n * @param params.file - Optional: The actual file content to upload\n * @param params.data - The file metadata\n * @param params.onProgress - Optional: Progress callback\n * @param params.multiPartThreshold - Optional: Threshold in MB for multi-part upload (default: 100)\n * @param params.signal - Optional: AbortSignal for cancellation\n * @returns Result containing the created file data or an error\n */\n// Not using createMethod: params include File/Buffer/Blob, onProgress callback, and AbortSignal — types Zod cannot validate.\nexport async function createFile(\n config: WebinyConfig,\n fetchFn: typeof fetch,\n params: CreateFileParams\n): Promise<Result<FmFile, HttpError | ApiError | NetworkError>> {\n const { file, data, fields, onProgress, multiPartThreshold = 100, signal } = params;\n\n // If no file provided, just create metadata record (existing behavior).\n if (!file) {\n return createFileRecord(config, fetchFn, data, fields);\n }\n\n // File upload flow.\n try {\n const fileSize = getFileSize(file);\n const thresholdBytes = multiPartThreshold * 1024 * 1024;\n\n // Ensure we have required metadata for upload.\n if (!data.name || !data.type) {\n return Result.fail(new Error(\"File name and type are required for upload\") as any);\n }\n\n // Decide upload strategy based on file size.\n if (fileSize < thresholdBytes) {\n // Simple upload.\n return await uploadSmallFile(config, fetchFn, file, data, fields, onProgress, signal);\n } else {\n // Multi-part upload.\n return await uploadLargeFileWrapper(\n config,\n fetchFn,\n file,\n data,\n fields,\n onProgress,\n signal\n );\n }\n } catch (error) {\n return Result.fail(error as any);\n }\n}\n\n/**\n * Uploads a small file using simple presigned POST.\n */\nasync function uploadSmallFile(\n config: WebinyConfig,\n fetchFn: typeof fetch,\n file: Buffer | Blob | File,\n data: CreateFileData,\n fields: string[],\n onProgress?: (progress: UploadProgress) => void,\n signal?: AbortSignal\n): Promise<Result<FmFile, HttpError | ApiError | NetworkError>> {\n // 1. Get presigned POST payload.\n const presignedResult = await getPresignedPostPayload(config, fetchFn, {\n name: data.name!,\n type: data.type!,\n size: getFileSize(file),\n key: data.key,\n keyPrefix: data.keyPrefix\n });\n\n if (presignedResult.isFail()) {\n return Result.fail(presignedResult.error);\n }\n\n // 2. Upload to S3.\n await uploadToS3(file, presignedResult.value.data, { onProgress, signal });\n\n // 3. Create file record with S3 key from presigned response.\n const fileMetadata: CreateFileData = {\n ...data,\n id: presignedResult.value.file.id,\n key: presignedResult.value.file.key,\n size: presignedResult.value.file.size\n };\n\n return createFileRecord(config, fetchFn, fileMetadata, fields);\n}\n\n/**\n * Uploads a large file using multi-part upload.\n */\nasync function uploadLargeFileWrapper(\n config: WebinyConfig,\n fetchFn: typeof fetch,\n file: Buffer | Blob | File,\n data: CreateFileData,\n fields: string[],\n onProgress?: (progress: UploadProgress) => void,\n signal?: AbortSignal\n): Promise<Result<FmFile, HttpError | ApiError | NetworkError>> {\n try {\n const uploadedFile = await uploadLargeFile(\n file,\n {\n name: data.name!,\n type: data.type!,\n size: getFileSize(file),\n key: data.key,\n keyPrefix: data.keyPrefix\n },\n config,\n fetchFn,\n { onProgress, signal, chunkSize: 50, parallelUploads: 5 }\n );\n\n // Create file record with uploaded metadata.\n const fileMetadata: CreateFileData = {\n ...data,\n id: uploadedFile.id,\n key: uploadedFile.key,\n size: uploadedFile.size\n };\n\n return createFileRecord(config, fetchFn, fileMetadata, fields);\n } catch (error) {\n return Result.fail(error as any);\n }\n}\n\n/**\n * Creates a file record via GraphQL (metadata only).\n */\nasync function createFileRecord(\n config: WebinyConfig,\n fetchFn: typeof fetch,\n data: CreateFileData,\n fields: string[]\n): Promise<Result<FmFile, HttpError | ApiError | NetworkError>> {\n const fieldsSelection = buildFieldsSelection(fields);\n\n const query = `\n mutation CreateFile($data: FmFileCreateInput!) {\n fileManager {\n createFile(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, { data });\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const responseData = result.value;\n\n if (responseData.fileManager.createFile.error) {\n return Result.fail(\n new ApiError(\n responseData.fileManager.createFile.error.message,\n responseData.fileManager.createFile.error.code\n )\n );\n }\n\n return Result.ok(responseData.fileManager.createFile.data);\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"methods/fileManager/createFile.js","sources":["../../../src/methods/fileManager/createFile.ts"],"sourcesContent":["import type { WebinyConfig } from \"../../types.js\";\nimport { Result } from \"../../Result.js\";\nimport type { HttpError, NetworkError } from \"../../errors.js\";\nimport type { FmFile, FmIdentity, FmLocationInput, UploadProgress } from \"./fileManagerTypes.js\";\nimport { getFileSize } from \"./utils/fileTypeDetection.js\";\nimport { buildFieldsSelection } from \"./buildFieldsSelection.js\";\nimport { executeGraphQL } from \"../executeGraphQL.js\";\nimport { ApiError } from \"../../errors.js\";\nimport { getPresignedPostPayload } from \"./getPresignedPostPayload.js\";\nimport { uploadToS3 } from \"./utils/uploadToS3.js\";\nimport { uploadLargeFile } from \"./utils/uploadLargeFile.js\";\n\nexport interface CreateFileData {\n id?: string;\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 keyPrefix?: string;\n type?: string;\n size?: number;\n tags?: string[];\n [key: string]: any;\n}\n\nexport interface CreateFileParams {\n file?: Buffer | Blob | File;\n data: CreateFileData;\n fields: string[];\n onProgress?: (progress: UploadProgress) => void;\n multiPartThreshold?: number;\n signal?: AbortSignal;\n}\n\n/**\n * Creates a new file in the file manager.\n * If a file is provided, it will be uploaded to S3 first, then the record is created.\n * If no file is provided, only the metadata record is created.\n *\n * @param config - SDK configuration\n * @param fetchFn - Fetch function to use for HTTP requests\n * @param params - Parameters for creating the file\n * @param params.file - Optional: The actual file content to upload\n * @param params.data - The file metadata\n * @param params.onProgress - Optional: Progress callback\n * @param params.multiPartThreshold - Optional: Threshold in MB for multi-part upload (default: 100)\n * @param params.signal - Optional: AbortSignal for cancellation\n * @returns Result containing the created file data or an error\n */\n// Not using createMethod: params include File/Buffer/Blob, onProgress callback, and AbortSignal — types Zod cannot validate.\nexport async function createFile(\n config: WebinyConfig,\n fetchFn: typeof fetch,\n params: CreateFileParams\n): Promise<Result<FmFile, HttpError | ApiError | NetworkError>> {\n const { file, data, fields, onProgress, multiPartThreshold = 100, signal } = params;\n\n // If no file provided, just create metadata record (existing behavior).\n if (!file) {\n return createFileRecord(config, fetchFn, data, fields);\n }\n\n // File upload flow.\n try {\n const fileSize = getFileSize(file);\n const thresholdBytes = multiPartThreshold * 1024 * 1024;\n\n // Ensure we have required metadata for upload.\n if (!data.name || !data.type) {\n return Result.fail(new Error(\"File name and type are required for upload\") as any);\n }\n\n // Decide upload strategy based on file size.\n if (fileSize < thresholdBytes) {\n // Simple upload.\n return await uploadSmallFile(config, fetchFn, file, data, fields, onProgress, signal);\n } else {\n // Multi-part upload.\n return await uploadLargeFileWrapper(\n config,\n fetchFn,\n file,\n data,\n fields,\n onProgress,\n signal\n );\n }\n } catch (error) {\n return Result.fail(error as any);\n }\n}\n\n/**\n * Uploads a small file using simple presigned POST.\n */\nasync function uploadSmallFile(\n config: WebinyConfig,\n fetchFn: typeof fetch,\n file: Buffer | Blob | File,\n data: CreateFileData,\n fields: string[],\n onProgress?: (progress: UploadProgress) => void,\n signal?: AbortSignal\n): Promise<Result<FmFile, HttpError | ApiError | NetworkError>> {\n // 1. Get presigned POST payload.\n const presignedResult = await getPresignedPostPayload(config, fetchFn, {\n name: data.name!,\n type: data.type!,\n size: getFileSize(file),\n key: data.key,\n keyPrefix: data.keyPrefix\n });\n\n if (presignedResult.isFail()) {\n return Result.fail(presignedResult.error);\n }\n\n // 2. Upload to S3.\n await uploadToS3(file, presignedResult.value.data, { onProgress, signal });\n\n // 3. Create file record with S3 key from presigned response.\n const fileMetadata: CreateFileData = {\n ...data,\n id: presignedResult.value.file.id,\n key: presignedResult.value.file.key,\n size: presignedResult.value.file.size\n };\n\n return createFileRecord(config, fetchFn, fileMetadata, fields);\n}\n\n/**\n * Uploads a large file using multi-part upload.\n */\nasync function uploadLargeFileWrapper(\n config: WebinyConfig,\n fetchFn: typeof fetch,\n file: Buffer | Blob | File,\n data: CreateFileData,\n fields: string[],\n onProgress?: (progress: UploadProgress) => void,\n signal?: AbortSignal\n): Promise<Result<FmFile, HttpError | ApiError | NetworkError>> {\n try {\n const uploadedFile = await uploadLargeFile(\n file,\n {\n name: data.name!,\n type: data.type!,\n size: getFileSize(file),\n key: data.key,\n keyPrefix: data.keyPrefix\n },\n config,\n fetchFn,\n { onProgress, signal, chunkSize: 50, parallelUploads: 5 }\n );\n\n // Create file record with uploaded metadata.\n const fileMetadata: CreateFileData = {\n ...data,\n id: uploadedFile.id,\n key: uploadedFile.key,\n size: uploadedFile.size\n };\n\n return createFileRecord(config, fetchFn, fileMetadata, fields);\n } catch (error) {\n return Result.fail(error as any);\n }\n}\n\n/**\n * Creates a file record via GraphQL (metadata only).\n */\nasync function createFileRecord(\n config: WebinyConfig,\n fetchFn: typeof fetch,\n data: CreateFileData,\n fields: string[]\n): Promise<Result<FmFile, HttpError | ApiError | NetworkError>> {\n const fieldsSelection = buildFieldsSelection(fields);\n\n const query = `\n mutation CreateFile($data: FmFileCreateInput!) {\n fileManager {\n createFile(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, { data });\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const responseData = result.value;\n\n if (responseData.fileManager.createFile.error) {\n return Result.fail(\n new ApiError(\n responseData.fileManager.createFile.error.message,\n responseData.fileManager.createFile.error.code\n )\n );\n }\n\n return Result.ok(responseData.fileManager.createFile.data);\n}\n"],"names":["createFile","config","fetchFn","params","file","data","fields","onProgress","multiPartThreshold","signal","createFileRecord","fileSize","getFileSize","thresholdBytes","Result","Error","uploadSmallFile","uploadLargeFileWrapper","error","presignedResult","getPresignedPostPayload","uploadToS3","fileMetadata","uploadedFile","uploadLargeFile","fieldsSelection","buildFieldsSelection","query","result","executeGraphQL","responseData","ApiError"],"mappings":"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"}