@webiny/app-file-manager 6.4.0-beta.2 → 6.4.0-beta.3

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 (55) hide show
  1. package/app.js +2 -1
  2. package/app.js.map +1 -1
  3. package/features/fileUploader/FileUploader.d.ts +3 -2
  4. package/features/fileUploader/FileUploader.js +10 -6
  5. package/features/fileUploader/FileUploader.js.map +1 -1
  6. package/features/fileUploader/FileUploader.test.js +2 -0
  7. package/features/fileUploader/FileUploader.test.js.map +1 -1
  8. package/features/fileUrlFormatter/FileUrlFormatter.d.ts +8 -0
  9. package/features/fileUrlFormatter/FileUrlFormatter.js +13 -0
  10. package/features/fileUrlFormatter/FileUrlFormatter.js.map +1 -0
  11. package/features/fileUrlFormatter/abstractions.d.ts +1 -0
  12. package/features/fileUrlFormatter/abstractions.js +1 -0
  13. package/features/fileUrlFormatter/feature.d.ts +1 -0
  14. package/features/fileUrlFormatter/feature.js +11 -0
  15. package/features/fileUrlFormatter/feature.js.map +1 -0
  16. package/features/getFile/GetFileGateway.d.ts +3 -1
  17. package/features/getFile/GetFileGateway.js +7 -4
  18. package/features/getFile/GetFileGateway.js.map +1 -1
  19. package/features/listFiles/ListFilesGateway.d.ts +3 -1
  20. package/features/listFiles/ListFilesGateway.js +7 -4
  21. package/features/listFiles/ListFilesGateway.js.map +1 -1
  22. package/features/shared/FILE_FIELDS.js +1 -2
  23. package/features/shared/FILE_FIELDS.js.map +1 -1
  24. package/features/shared/FileFieldsProvider.d.ts +8 -0
  25. package/features/shared/FileFieldsProvider.js +14 -0
  26. package/features/shared/FileFieldsProvider.js.map +1 -0
  27. package/features/shared/FileFieldsProviderWithWcp.d.ts +12 -0
  28. package/features/shared/FileFieldsProviderWithWcp.js +25 -0
  29. package/features/shared/FileFieldsProviderWithWcp.js.map +1 -0
  30. package/features/shared/abstractions.d.ts +7 -0
  31. package/features/shared/abstractions.js +2 -1
  32. package/features/shared/abstractions.js.map +1 -1
  33. package/features/shared/feature.d.ts +1 -0
  34. package/features/shared/feature.js +7 -2
  35. package/features/shared/feature.js.map +1 -1
  36. package/features/shared/index.d.ts +2 -2
  37. package/features/shared/index.js +1 -1
  38. package/features/updateFile/UpdateFile.test.js +2 -0
  39. package/features/updateFile/UpdateFile.test.js.map +1 -1
  40. package/features/updateFile/UpdateFileRepository.d.ts +3 -2
  41. package/features/updateFile/UpdateFileRepository.js +7 -5
  42. package/features/updateFile/UpdateFileRepository.js.map +1 -1
  43. package/features/updateFile/UpdateFileUseCase.d.ts +3 -1
  44. package/features/updateFile/UpdateFileUseCase.js +7 -4
  45. package/features/updateFile/UpdateFileUseCase.js.map +1 -1
  46. package/modules/FileUrlFormatter.d.ts +2 -0
  47. package/modules/FileUrlFormatter.js +9 -0
  48. package/modules/FileUrlFormatter.js.map +1 -0
  49. package/package.json +18 -18
  50. package/presentation/FileList/components/FileDropArea/FileDropArea.js +0 -1
  51. package/presentation/FileList/components/FileDropArea/FileDropArea.js.map +1 -1
  52. package/presentation/FileList/components/Grid/FileGrid.js +1 -7
  53. package/presentation/FileList/components/Grid/FileGrid.js.map +1 -1
  54. package/presentation/FileManager/FileManagerView.js +14 -6
  55. package/presentation/FileManager/FileManagerView.js.map +1 -1
package/app.js CHANGED
@@ -7,6 +7,7 @@ import { DefaultFileManagerConfig } from "./presentation/config/DefaultFileManag
7
7
  import { HeadlessCmsModule } from "./modules/HeadlessCms/index.js";
8
8
  import { EnterpriseModule } from "./modules/Enterprise/index.js";
9
9
  import { SecurityPermissions } from "./modules/SecurityPermissions.js";
10
+ import { FileUrlFormatterModule } from "./modules/FileUrlFormatter.js";
10
11
  import { FmPermissionsFeature } from "./features/permissions/feature.js";
11
12
  import { GetFileFeature } from "./features/getFile/feature.js";
12
13
  import { ResolveImageToolFeature } from "./features/resolveImageTool/feature.js";
@@ -50,7 +51,7 @@ const FileManager = ()=>/*#__PURE__*/ react.createElement(react.Fragment, null,
50
51
  }), /*#__PURE__*/ react.createElement(AdminConfig, null, /*#__PURE__*/ react.createElement(AdminConfig.Form.FieldRenderer, {
51
52
  name: "folderTree",
52
53
  component: FolderTreeFieldRenderer
53
- })), /*#__PURE__*/ react.createElement(FileManagerRoutes, null), /*#__PURE__*/ react.createElement(SettingsModule, null), /*#__PURE__*/ react.createElement(FileManagerRendererDecorator, null), /*#__PURE__*/ react.createElement(DefaultFileManagerConfig, null), /*#__PURE__*/ react.createElement(HeadlessCmsModule, null), /*#__PURE__*/ react.createElement(EnterpriseModule, null), /*#__PURE__*/ react.createElement(SecurityPermissions, null));
54
+ })), /*#__PURE__*/ react.createElement(FileManagerRoutes, null), /*#__PURE__*/ react.createElement(SettingsModule, null), /*#__PURE__*/ react.createElement(FileManagerRendererDecorator, null), /*#__PURE__*/ react.createElement(DefaultFileManagerConfig, null), /*#__PURE__*/ react.createElement(HeadlessCmsModule, null), /*#__PURE__*/ react.createElement(EnterpriseModule, null), /*#__PURE__*/ react.createElement(SecurityPermissions, null), /*#__PURE__*/ react.createElement(FileUrlFormatterModule, null));
54
55
  export { FileManager };
55
56
 
56
57
  //# sourceMappingURL=app.js.map
package/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sources":["../src/app.tsx"],"sourcesContent":["import React from \"react\";\nimport { AdminConfig, RegisterFeature } from \"@webiny/app-admin\";\nimport { FolderTreeFieldRenderer } from \"@webiny/app-aco/presentation/folderTree/FolderTreeFieldRenderer.js\";\nimport { SettingsModule } from \"~/modules/Settings/index.js\";\nimport { FileModelModule } from \"~/modules/FileModelModule.js\";\nimport { DefaultFileManagerConfig } from \"~/presentation/config/DefaultFileManagerConfig.js\";\nimport { HeadlessCmsModule } from \"~/modules/HeadlessCms/index.js\";\nimport { EnterpriseModule } from \"~/modules/Enterprise/index.js\";\nimport { SecurityPermissions } from \"./modules/SecurityPermissions.js\";\nimport { FmPermissionsFeature } from \"~/features/permissions/feature.js\";\nimport { GetFileFeature } from \"~/features/getFile/feature.js\";\nimport { ResolveImageToolFeature } from \"~/features/resolveImageTool/feature.js\";\nimport { ListFilesFeature } from \"~/features/listFiles/index.js\";\nimport { UpdateFileFeature } from \"~/features/updateFile/index.js\";\nimport { DeleteFileFeature } from \"~/features/deleteFile/index.js\";\nimport { FileUploaderFeature } from \"~/features/fileUploader/index.js\";\nimport { ListTagsFeature } from \"~/features/tags/index.js\";\nimport { GetSettingsFeature } from \"~/features/settings/index.js\";\nimport { SharedCacheFeature } from \"~/features/shared/index.js\";\nimport { FileManagerPresenterFeature } from \"~/presentation/FileList/index.js\";\nimport { FileManagerRoutes } from \"~/modules/FileManagerRoutes.js\";\nimport { FileManagerRendererDecorator } from \"~/presentation/FileManager/FileManagerRenderer.js\";\nimport { FileModelProviderFeature } from \"~/features/fileModel/index.js\";\n\nexport const FileManager = () => {\n return (\n <>\n {/* Headless features. */}\n <RegisterFeature feature={FileModelProviderFeature} />\n <RegisterFeature feature={SharedCacheFeature} />\n <RegisterFeature feature={ListFilesFeature} />\n <RegisterFeature feature={GetFileFeature} />\n <RegisterFeature feature={UpdateFileFeature} />\n <RegisterFeature feature={DeleteFileFeature} />\n <RegisterFeature feature={FileUploaderFeature} />\n <RegisterFeature feature={ListTagsFeature} />\n <RegisterFeature feature={GetSettingsFeature} />\n <RegisterFeature feature={FmPermissionsFeature} />\n <RegisterFeature feature={GetFileFeature} />\n <RegisterFeature feature={ResolveImageToolFeature} />\n <FileModelModule />\n {/* Presentation features. */}\n <RegisterFeature feature={FileManagerPresenterFeature} />\n {/* Field renderers. */}\n <AdminConfig>\n <AdminConfig.Form.FieldRenderer\n name={\"folderTree\"}\n component={FolderTreeFieldRenderer}\n />\n </AdminConfig>\n {/* Legacy modules. */}\n <FileManagerRoutes />\n <SettingsModule />\n <FileManagerRendererDecorator />\n <DefaultFileManagerConfig />\n <HeadlessCmsModule />\n <EnterpriseModule />\n <SecurityPermissions />\n </>\n );\n};\n"],"names":["FileManager","RegisterFeature","FileModelProviderFeature","SharedCacheFeature","ListFilesFeature","GetFileFeature","UpdateFileFeature","DeleteFileFeature","FileUploaderFeature","ListTagsFeature","GetSettingsFeature","FmPermissionsFeature","ResolveImageToolFeature","FileModelModule","FileManagerPresenterFeature","AdminConfig","FolderTreeFieldRenderer","FileManagerRoutes","SettingsModule","FileManagerRendererDecorator","DefaultFileManagerConfig","HeadlessCmsModule","EnterpriseModule","SecurityPermissions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAwBO,MAAMA,cAAc,IAChB,WAAP,GACI,wDAEI,oBAACC,iBAAeA;QAAC,SAASC;sBAC1B,oBAACD,iBAAeA;QAAC,SAASE;sBAC1B,oBAACF,iBAAeA;QAAC,SAASG;sBAC1B,oBAACH,iBAAeA;QAAC,SAASI;sBAC1B,oBAACJ,iBAAeA;QAAC,SAASK;sBAC1B,oBAACL,iBAAeA;QAAC,SAASM;sBAC1B,oBAACN,iBAAeA;QAAC,SAASO;sBAC1B,oBAACP,iBAAeA;QAAC,SAASQ;sBAC1B,oBAACR,iBAAeA;QAAC,SAASS;sBAC1B,oBAACT,iBAAeA;QAAC,SAASU;sBAC1B,oBAACV,iBAAeA;QAAC,SAASI;sBAC1B,oBAACJ,iBAAeA;QAAC,SAASW;sBAC1B,oBAACC,iBAAeA,OAAAA,WAAAA,GAEhB,oBAACZ,iBAAeA;QAAC,SAASa;sBAE1B,oBAACC,aAAWA,MAAAA,WAAAA,GACR,oBAACA,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWC;uBAInB,oBAACC,mBAAiBA,OAAAA,WAAAA,GAClB,oBAACC,gBAAcA,OAAAA,WAAAA,GACf,oBAACC,8BAA4BA,OAAAA,WAAAA,GAC7B,oBAACC,0BAAwBA,OAAAA,WAAAA,GACzB,oBAACC,mBAAiBA,OAAAA,WAAAA,GAClB,oBAACC,kBAAgBA,OAAAA,WAAAA,GACjB,oBAACC,qBAAmBA"}
1
+ {"version":3,"file":"app.js","sources":["../src/app.tsx"],"sourcesContent":["import React from \"react\";\nimport { AdminConfig, RegisterFeature } from \"@webiny/app-admin\";\nimport { FolderTreeFieldRenderer } from \"@webiny/app-aco/presentation/folderTree/FolderTreeFieldRenderer.js\";\nimport { SettingsModule } from \"~/modules/Settings/index.js\";\nimport { FileModelModule } from \"~/modules/FileModelModule.js\";\nimport { DefaultFileManagerConfig } from \"~/presentation/config/DefaultFileManagerConfig.js\";\nimport { HeadlessCmsModule } from \"~/modules/HeadlessCms/index.js\";\nimport { EnterpriseModule } from \"~/modules/Enterprise/index.js\";\nimport { SecurityPermissions } from \"./modules/SecurityPermissions.js\";\nimport { FileUrlFormatterModule } from \"./modules/FileUrlFormatter.js\";\nimport { FmPermissionsFeature } from \"~/features/permissions/feature.js\";\nimport { GetFileFeature } from \"~/features/getFile/feature.js\";\nimport { ResolveImageToolFeature } from \"~/features/resolveImageTool/feature.js\";\nimport { ListFilesFeature } from \"~/features/listFiles/index.js\";\nimport { UpdateFileFeature } from \"~/features/updateFile/index.js\";\nimport { DeleteFileFeature } from \"~/features/deleteFile/index.js\";\nimport { FileUploaderFeature } from \"~/features/fileUploader/index.js\";\nimport { ListTagsFeature } from \"~/features/tags/index.js\";\nimport { GetSettingsFeature } from \"~/features/settings/index.js\";\nimport { SharedCacheFeature } from \"~/features/shared/index.js\";\nimport { FileManagerPresenterFeature } from \"~/presentation/FileList/index.js\";\nimport { FileManagerRoutes } from \"~/modules/FileManagerRoutes.js\";\nimport { FileManagerRendererDecorator } from \"~/presentation/FileManager/FileManagerRenderer.js\";\nimport { FileModelProviderFeature } from \"~/features/fileModel/index.js\";\n\nexport const FileManager = () => {\n return (\n <>\n {/* Headless features. */}\n <RegisterFeature feature={FileModelProviderFeature} />\n <RegisterFeature feature={SharedCacheFeature} />\n <RegisterFeature feature={ListFilesFeature} />\n <RegisterFeature feature={GetFileFeature} />\n <RegisterFeature feature={UpdateFileFeature} />\n <RegisterFeature feature={DeleteFileFeature} />\n <RegisterFeature feature={FileUploaderFeature} />\n <RegisterFeature feature={ListTagsFeature} />\n <RegisterFeature feature={GetSettingsFeature} />\n <RegisterFeature feature={FmPermissionsFeature} />\n <RegisterFeature feature={GetFileFeature} />\n <RegisterFeature feature={ResolveImageToolFeature} />\n <FileModelModule />\n {/* Presentation features. */}\n <RegisterFeature feature={FileManagerPresenterFeature} />\n {/* Field renderers. */}\n <AdminConfig>\n <AdminConfig.Form.FieldRenderer\n name={\"folderTree\"}\n component={FolderTreeFieldRenderer}\n />\n </AdminConfig>\n {/* Legacy modules. */}\n <FileManagerRoutes />\n <SettingsModule />\n <FileManagerRendererDecorator />\n <DefaultFileManagerConfig />\n <HeadlessCmsModule />\n <EnterpriseModule />\n <SecurityPermissions />\n <FileUrlFormatterModule />\n </>\n );\n};\n"],"names":["FileManager","RegisterFeature","FileModelProviderFeature","SharedCacheFeature","ListFilesFeature","GetFileFeature","UpdateFileFeature","DeleteFileFeature","FileUploaderFeature","ListTagsFeature","GetSettingsFeature","FmPermissionsFeature","ResolveImageToolFeature","FileModelModule","FileManagerPresenterFeature","AdminConfig","FolderTreeFieldRenderer","FileManagerRoutes","SettingsModule","FileManagerRendererDecorator","DefaultFileManagerConfig","HeadlessCmsModule","EnterpriseModule","SecurityPermissions","FileUrlFormatterModule"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAyBO,MAAMA,cAAc,IAChB,WAAP,GACI,wDAEI,oBAACC,iBAAeA;QAAC,SAASC;sBAC1B,oBAACD,iBAAeA;QAAC,SAASE;sBAC1B,oBAACF,iBAAeA;QAAC,SAASG;sBAC1B,oBAACH,iBAAeA;QAAC,SAASI;sBAC1B,oBAACJ,iBAAeA;QAAC,SAASK;sBAC1B,oBAACL,iBAAeA;QAAC,SAASM;sBAC1B,oBAACN,iBAAeA;QAAC,SAASO;sBAC1B,oBAACP,iBAAeA;QAAC,SAASQ;sBAC1B,oBAACR,iBAAeA;QAAC,SAASS;sBAC1B,oBAACT,iBAAeA;QAAC,SAASU;sBAC1B,oBAACV,iBAAeA;QAAC,SAASI;sBAC1B,oBAACJ,iBAAeA;QAAC,SAASW;sBAC1B,oBAACC,iBAAeA,OAAAA,WAAAA,GAEhB,oBAACZ,iBAAeA;QAAC,SAASa;sBAE1B,oBAACC,aAAWA,MAAAA,WAAAA,GACR,oBAACA,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWC;uBAInB,oBAACC,mBAAiBA,OAAAA,WAAAA,GAClB,oBAACC,gBAAcA,OAAAA,WAAAA,GACf,oBAACC,8BAA4BA,OAAAA,WAAAA,GAC7B,oBAACC,0BAAwBA,OAAAA,WAAAA,GACzB,oBAACC,mBAAiBA,OAAAA,WAAAA,GAClB,oBAACC,kBAAgBA,OAAAA,WAAAA,GACjB,oBAACC,qBAAmBA,OAAAA,WAAAA,GACpB,oBAACC,wBAAsBA"}
@@ -1,12 +1,13 @@
1
1
  import { WebinySdk } from "@webiny/app-admin/features/webinySdk/abstractions.js";
2
- import { FilesListCache } from "../shared/abstractions.js";
2
+ import { FilesListCache, FileFieldsProvider } from "../shared/abstractions.js";
3
3
  import { FileUploader as Abstraction, type UploadFileData, type FileUploaderViewModel, type BatchUploadOptions } from "./abstractions.js";
4
4
  declare class FileUploaderImpl implements Abstraction.Interface {
5
5
  private sdk;
6
6
  private cache;
7
+ private fileFieldsProvider;
7
8
  private jobs;
8
9
  private abortControllers;
9
- constructor(sdk: WebinySdk.Interface, cache: FilesListCache.Interface);
10
+ constructor(sdk: WebinySdk.Interface, cache: FilesListCache.Interface, fileFieldsProvider: FileFieldsProvider.Interface);
10
11
  get vm(): FileUploaderViewModel;
11
12
  upload(file: File, data: UploadFileData): Promise<void>;
12
13
  uploadMany(files: Array<{
@@ -1,21 +1,22 @@
1
1
  import { computed, makeAutoObservable, runInAction } from "mobx";
2
2
  import { WebinySdk } from "@webiny/app-admin/features/webinySdk/abstractions.js";
3
- import { FilesListCache } from "../shared/abstractions.js";
3
+ import { FileFieldsProvider, FilesListCache } from "../shared/abstractions.js";
4
4
  import { FileUploader } from "./abstractions.js";
5
- import { FILE_FIELDS } from "../shared/FILE_FIELDS.js";
6
5
  let jobCounter = 0;
7
6
  function createJobId() {
8
7
  return `upload-${++jobCounter}-${Date.now()}`;
9
8
  }
10
9
  class FileUploaderImpl {
11
- constructor(sdk, cache){
10
+ constructor(sdk, cache, fileFieldsProvider){
12
11
  this.sdk = sdk;
13
12
  this.cache = cache;
13
+ this.fileFieldsProvider = fileFieldsProvider;
14
14
  this.jobs = [];
15
15
  this.abortControllers = new Map();
16
16
  makeAutoObservable(this, {
17
17
  sdk: false,
18
18
  cache: false,
19
+ fileFieldsProvider: false,
19
20
  abortControllers: false,
20
21
  vm: computed
21
22
  });
@@ -46,6 +47,7 @@ class FileUploaderImpl {
46
47
  };
47
48
  }
48
49
  async upload(file, data) {
50
+ const fileFields = await this.fileFieldsProvider.execute();
49
51
  const jobId = createJobId();
50
52
  const controller = new AbortController();
51
53
  this.abortControllers.set(jobId, controller);
@@ -66,7 +68,7 @@ class FileUploaderImpl {
66
68
  const result = await this.sdk.fileManager.createFile({
67
69
  file,
68
70
  data,
69
- fields: FILE_FIELDS,
71
+ fields: fileFields,
70
72
  onProgress: (progress)=>{
71
73
  runInAction(()=>{
72
74
  const idx = this.jobs.findIndex((j)=>j.id === jobId);
@@ -114,6 +116,7 @@ class FileUploaderImpl {
114
116
  }
115
117
  }
116
118
  async uploadMany(files, options) {
119
+ const fileFields = await this.fileFieldsProvider.execute();
117
120
  const controller = new AbortController();
118
121
  const jobIds = [];
119
122
  runInAction(()=>{
@@ -136,7 +139,7 @@ class FileUploaderImpl {
136
139
  const sdkFiles = files.map((entry, index)=>({
137
140
  file: entry.file,
138
141
  data: entry.data,
139
- fields: FILE_FIELDS,
142
+ fields: fileFields,
140
143
  onProgress: (progress)=>{
141
144
  runInAction(()=>{
142
145
  const jobId = jobIds[index];
@@ -231,7 +234,8 @@ const FileUploader_FileUploader = FileUploader.createImplementation({
231
234
  implementation: FileUploaderImpl,
232
235
  dependencies: [
233
236
  WebinySdk,
234
- FilesListCache
237
+ FilesListCache,
238
+ FileFieldsProvider
235
239
  ]
236
240
  });
237
241
  export { FileUploader_FileUploader as FileUploader };
@@ -1 +1 @@
1
- {"version":3,"file":"features/fileUploader/FileUploader.js","sources":["../../../src/features/fileUploader/FileUploader.ts"],"sourcesContent":["import { makeAutoObservable, computed, runInAction } from \"mobx\";\nimport { WebinySdk } from \"@webiny/app-admin/features/webinySdk/abstractions.js\";\nimport { FilesListCache } from \"../shared/abstractions.js\";\nimport {\n FileUploader as Abstraction,\n type UploadJob,\n type UploadFileData,\n type FileUploaderViewModel,\n type BatchUploadOptions\n} from \"./abstractions.js\";\nimport { FILE_FIELDS } from \"~/features/shared/FILE_FIELDS.js\";\n\nlet jobCounter = 0;\n\nfunction createJobId(): string {\n return `upload-${++jobCounter}-${Date.now()}`;\n}\n\nclass FileUploaderImpl implements Abstraction.Interface {\n private jobs: UploadJob[] = [];\n private abortControllers = new Map<string, AbortController>();\n\n constructor(\n private sdk: WebinySdk.Interface,\n private cache: FilesListCache.Interface\n ) {\n makeAutoObservable<FileUploaderImpl, \"sdk\" | \"cache\" | \"abortControllers\">(this, {\n sdk: false,\n cache: false,\n abortControllers: false,\n vm: computed\n });\n }\n\n get vm(): FileUploaderViewModel {\n const jobs = [...this.jobs];\n const uploading = jobs.filter(j => j.status === \"uploading\" || j.status === \"pending\");\n const completed = jobs.filter(j => j.status === \"completed\");\n const failed = jobs.filter(j => j.status === \"failed\");\n\n let sent = 0;\n let total = 0;\n for (const job of jobs) {\n sent += job.progress.sent;\n total += job.progress.total;\n }\n\n return {\n jobs,\n overallProgress: {\n sent,\n total,\n percentage: total > 0 ? Math.round((sent / total) * 100) : 0\n },\n isUploading: uploading.length > 0,\n completedCount: completed.length,\n failedCount: failed.length\n };\n }\n\n async upload(file: File, data: UploadFileData): Promise<void> {\n const jobId = createJobId();\n const controller = new AbortController();\n this.abortControllers.set(jobId, controller);\n\n const job: UploadJob = {\n id: jobId,\n fileName: data.name,\n status: \"uploading\",\n progress: { sent: 0, total: file.size, percentage: 0 }\n };\n\n runInAction(() => {\n this.jobs.push(job);\n });\n\n try {\n const result = await this.sdk.fileManager.createFile({\n file,\n data,\n fields: FILE_FIELDS,\n onProgress: progress => {\n runInAction(() => {\n const idx = this.jobs.findIndex(j => j.id === jobId);\n if (idx !== -1) {\n this.jobs[idx] = {\n ...this.jobs[idx],\n progress: {\n sent: progress.sent,\n total: progress.total,\n percentage: progress.percentage\n }\n };\n }\n });\n },\n signal: controller.signal\n });\n\n if (result.isFail()) {\n throw new Error(result.error.message);\n }\n\n runInAction(() => {\n const idx = this.jobs.findIndex(j => j.id === jobId);\n if (idx !== -1) {\n this.jobs[idx] = {\n ...this.jobs[idx],\n status: \"completed\",\n progress: { sent: file.size, total: file.size, percentage: 100 },\n result: result.value\n };\n }\n this.cache.addItems([result.value]);\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n runInAction(() => {\n const idx = this.jobs.findIndex(j => j.id === jobId);\n if (idx !== -1) {\n this.jobs[idx] = {\n ...this.jobs[idx],\n status: \"failed\",\n error: message\n };\n }\n });\n } finally {\n this.abortControllers.delete(jobId);\n }\n }\n\n async uploadMany(\n files: Array<{ file: File; data: UploadFileData }>,\n options?: BatchUploadOptions\n ): Promise<void> {\n const controller = new AbortController();\n\n // Create jobs for each file.\n const jobIds: string[] = [];\n runInAction(() => {\n for (const entry of files) {\n const jobId = createJobId();\n jobIds.push(jobId);\n this.abortControllers.set(jobId, controller);\n this.jobs.push({\n id: jobId,\n fileName: entry.data.name,\n status: \"pending\",\n progress: { sent: 0, total: entry.file.size, percentage: 0 }\n });\n }\n });\n\n // Build SDK params with per-file onProgress callbacks.\n const sdkFiles = files.map((entry, index) => ({\n file: entry.file,\n data: entry.data,\n fields: FILE_FIELDS,\n onProgress: (progress: { sent: number; total: number; percentage: number }) => {\n runInAction(() => {\n const jobId = jobIds[index];\n const idx = this.jobs.findIndex(j => j.id === jobId);\n if (idx !== -1) {\n this.jobs[idx] = {\n ...this.jobs[idx],\n status: \"uploading\",\n progress: {\n sent: progress.sent,\n total: progress.total,\n percentage: progress.percentage\n }\n };\n }\n });\n }\n }));\n\n try {\n const result = await this.sdk.fileManager.createFiles({\n files: sdkFiles,\n concurrency: options?.concurrency,\n strategy: options?.strategy as any,\n signal: controller.signal\n });\n\n if (result.isFail()) {\n throw new Error(result.error.message);\n }\n\n const { successful, failed } = result.value;\n\n runInAction(() => {\n // Mark successful jobs.\n for (const file of successful) {\n // Match by name since SDK doesn't return our jobId.\n const jobId = jobIds.find(id => {\n const job = this.jobs.find(j => j.id === id);\n return job && job.fileName === file.name && job.status !== \"completed\";\n });\n if (jobId) {\n const idx = this.jobs.findIndex(j => j.id === jobId);\n if (idx !== -1) {\n this.jobs[idx] = {\n ...this.jobs[idx],\n status: \"completed\",\n progress: {\n sent: this.jobs[idx].progress.total,\n total: this.jobs[idx].progress.total,\n percentage: 100\n },\n result: file\n };\n }\n }\n }\n\n // Mark failed jobs.\n for (const failure of failed) {\n const jobId = jobIds.find(id => {\n const job = this.jobs.find(j => j.id === id);\n return job && job.fileName === failure.data.name && job.status !== \"failed\";\n });\n if (jobId) {\n const idx = this.jobs.findIndex(j => j.id === jobId);\n if (idx !== -1) {\n this.jobs[idx] = {\n ...this.jobs[idx],\n status: \"failed\",\n error: failure.error.message\n };\n }\n }\n }\n\n // Update cache with all successful files.\n if (successful.length > 0) {\n this.cache.addItems(successful);\n }\n });\n } catch (error) {\n // Fail-fast: mark all pending/uploading jobs as failed.\n const message = error instanceof Error ? error.message : \"Unknown error\";\n runInAction(() => {\n for (const jobId of jobIds) {\n const idx = this.jobs.findIndex(j => j.id === jobId);\n if (idx !== -1 && this.jobs[idx].status !== \"completed\") {\n this.jobs[idx] = {\n ...this.jobs[idx],\n status: \"failed\",\n error: message\n };\n }\n }\n });\n } finally {\n for (const jobId of jobIds) {\n this.abortControllers.delete(jobId);\n }\n }\n }\n\n abort(jobId: string): void {\n const controller = this.abortControllers.get(jobId);\n if (controller) {\n controller.abort();\n this.abortControllers.delete(jobId);\n }\n }\n\n clear(): void {\n runInAction(() => {\n this.jobs = this.jobs.filter(j => j.status !== \"completed\" && j.status !== \"failed\");\n });\n }\n}\n\nexport const FileUploader = Abstraction.createImplementation({\n implementation: FileUploaderImpl,\n dependencies: [WebinySdk, FilesListCache]\n});\n"],"names":["jobCounter","createJobId","Date","FileUploaderImpl","sdk","cache","Map","makeAutoObservable","computed","jobs","uploading","j","completed","failed","sent","total","job","Math","file","data","jobId","controller","AbortController","runInAction","result","FILE_FIELDS","progress","idx","Error","error","message","files","options","jobIds","entry","sdkFiles","index","successful","id","failure","FileUploader","Abstraction","WebinySdk","FilesListCache"],"mappings":"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"}
1
+ {"version":3,"file":"features/fileUploader/FileUploader.js","sources":["../../../src/features/fileUploader/FileUploader.ts"],"sourcesContent":["import { makeAutoObservable, computed, runInAction } from \"mobx\";\nimport { WebinySdk } from \"@webiny/app-admin/features/webinySdk/abstractions.js\";\nimport { FilesListCache, FileFieldsProvider } from \"../shared/abstractions.js\";\nimport {\n FileUploader as Abstraction,\n type UploadJob,\n type UploadFileData,\n type FileUploaderViewModel,\n type BatchUploadOptions\n} from \"./abstractions.js\";\n\nlet jobCounter = 0;\n\nfunction createJobId(): string {\n return `upload-${++jobCounter}-${Date.now()}`;\n}\n\nclass FileUploaderImpl implements Abstraction.Interface {\n private jobs: UploadJob[] = [];\n private abortControllers = new Map<string, AbortController>();\n\n constructor(\n private sdk: WebinySdk.Interface,\n private cache: FilesListCache.Interface,\n private fileFieldsProvider: FileFieldsProvider.Interface\n ) {\n makeAutoObservable<\n FileUploaderImpl,\n \"sdk\" | \"cache\" | \"fileFieldsProvider\" | \"abortControllers\"\n >(this, {\n sdk: false,\n cache: false,\n fileFieldsProvider: false,\n abortControllers: false,\n vm: computed\n });\n }\n\n get vm(): FileUploaderViewModel {\n const jobs = [...this.jobs];\n const uploading = jobs.filter(j => j.status === \"uploading\" || j.status === \"pending\");\n const completed = jobs.filter(j => j.status === \"completed\");\n const failed = jobs.filter(j => j.status === \"failed\");\n\n let sent = 0;\n let total = 0;\n for (const job of jobs) {\n sent += job.progress.sent;\n total += job.progress.total;\n }\n\n return {\n jobs,\n overallProgress: {\n sent,\n total,\n percentage: total > 0 ? Math.round((sent / total) * 100) : 0\n },\n isUploading: uploading.length > 0,\n completedCount: completed.length,\n failedCount: failed.length\n };\n }\n\n async upload(file: File, data: UploadFileData): Promise<void> {\n const fileFields = await this.fileFieldsProvider.execute();\n const jobId = createJobId();\n const controller = new AbortController();\n this.abortControllers.set(jobId, controller);\n\n const job: UploadJob = {\n id: jobId,\n fileName: data.name,\n status: \"uploading\",\n progress: { sent: 0, total: file.size, percentage: 0 }\n };\n\n runInAction(() => {\n this.jobs.push(job);\n });\n\n try {\n const result = await this.sdk.fileManager.createFile({\n file,\n data,\n fields: fileFields,\n onProgress: progress => {\n runInAction(() => {\n const idx = this.jobs.findIndex(j => j.id === jobId);\n if (idx !== -1) {\n this.jobs[idx] = {\n ...this.jobs[idx],\n progress: {\n sent: progress.sent,\n total: progress.total,\n percentage: progress.percentage\n }\n };\n }\n });\n },\n signal: controller.signal\n });\n\n if (result.isFail()) {\n throw new Error(result.error.message);\n }\n\n runInAction(() => {\n const idx = this.jobs.findIndex(j => j.id === jobId);\n if (idx !== -1) {\n this.jobs[idx] = {\n ...this.jobs[idx],\n status: \"completed\",\n progress: { sent: file.size, total: file.size, percentage: 100 },\n result: result.value\n };\n }\n this.cache.addItems([result.value]);\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n runInAction(() => {\n const idx = this.jobs.findIndex(j => j.id === jobId);\n if (idx !== -1) {\n this.jobs[idx] = {\n ...this.jobs[idx],\n status: \"failed\",\n error: message\n };\n }\n });\n } finally {\n this.abortControllers.delete(jobId);\n }\n }\n\n async uploadMany(\n files: Array<{ file: File; data: UploadFileData }>,\n options?: BatchUploadOptions\n ): Promise<void> {\n const fileFields = await this.fileFieldsProvider.execute();\n const controller = new AbortController();\n\n // Create jobs for each file.\n const jobIds: string[] = [];\n runInAction(() => {\n for (const entry of files) {\n const jobId = createJobId();\n jobIds.push(jobId);\n this.abortControllers.set(jobId, controller);\n this.jobs.push({\n id: jobId,\n fileName: entry.data.name,\n status: \"pending\",\n progress: { sent: 0, total: entry.file.size, percentage: 0 }\n });\n }\n });\n\n // Build SDK params with per-file onProgress callbacks.\n const sdkFiles = files.map((entry, index) => ({\n file: entry.file,\n data: entry.data,\n fields: fileFields,\n onProgress: (progress: { sent: number; total: number; percentage: number }) => {\n runInAction(() => {\n const jobId = jobIds[index];\n const idx = this.jobs.findIndex(j => j.id === jobId);\n if (idx !== -1) {\n this.jobs[idx] = {\n ...this.jobs[idx],\n status: \"uploading\",\n progress: {\n sent: progress.sent,\n total: progress.total,\n percentage: progress.percentage\n }\n };\n }\n });\n }\n }));\n\n try {\n const result = await this.sdk.fileManager.createFiles({\n files: sdkFiles,\n concurrency: options?.concurrency,\n strategy: options?.strategy as any,\n signal: controller.signal\n });\n\n if (result.isFail()) {\n throw new Error(result.error.message);\n }\n\n const { successful, failed } = result.value;\n\n runInAction(() => {\n // Mark successful jobs.\n for (const file of successful) {\n // Match by name since SDK doesn't return our jobId.\n const jobId = jobIds.find(id => {\n const job = this.jobs.find(j => j.id === id);\n return job && job.fileName === file.name && job.status !== \"completed\";\n });\n if (jobId) {\n const idx = this.jobs.findIndex(j => j.id === jobId);\n if (idx !== -1) {\n this.jobs[idx] = {\n ...this.jobs[idx],\n status: \"completed\",\n progress: {\n sent: this.jobs[idx].progress.total,\n total: this.jobs[idx].progress.total,\n percentage: 100\n },\n result: file\n };\n }\n }\n }\n\n // Mark failed jobs.\n for (const failure of failed) {\n const jobId = jobIds.find(id => {\n const job = this.jobs.find(j => j.id === id);\n return job && job.fileName === failure.data.name && job.status !== \"failed\";\n });\n if (jobId) {\n const idx = this.jobs.findIndex(j => j.id === jobId);\n if (idx !== -1) {\n this.jobs[idx] = {\n ...this.jobs[idx],\n status: \"failed\",\n error: failure.error.message\n };\n }\n }\n }\n\n // Update cache with all successful files.\n if (successful.length > 0) {\n this.cache.addItems(successful);\n }\n });\n } catch (error) {\n // Fail-fast: mark all pending/uploading jobs as failed.\n const message = error instanceof Error ? error.message : \"Unknown error\";\n runInAction(() => {\n for (const jobId of jobIds) {\n const idx = this.jobs.findIndex(j => j.id === jobId);\n if (idx !== -1 && this.jobs[idx].status !== \"completed\") {\n this.jobs[idx] = {\n ...this.jobs[idx],\n status: \"failed\",\n error: message\n };\n }\n }\n });\n } finally {\n for (const jobId of jobIds) {\n this.abortControllers.delete(jobId);\n }\n }\n }\n\n abort(jobId: string): void {\n const controller = this.abortControllers.get(jobId);\n if (controller) {\n controller.abort();\n this.abortControllers.delete(jobId);\n }\n }\n\n clear(): void {\n runInAction(() => {\n this.jobs = this.jobs.filter(j => j.status !== \"completed\" && j.status !== \"failed\");\n });\n }\n}\n\nexport const FileUploader = Abstraction.createImplementation({\n implementation: FileUploaderImpl,\n dependencies: [WebinySdk, FilesListCache, FileFieldsProvider]\n});\n"],"names":["jobCounter","createJobId","Date","FileUploaderImpl","sdk","cache","fileFieldsProvider","Map","makeAutoObservable","computed","jobs","uploading","j","completed","failed","sent","total","job","Math","file","data","fileFields","jobId","controller","AbortController","runInAction","result","progress","idx","Error","error","message","files","options","jobIds","entry","sdkFiles","index","successful","id","failure","FileUploader","Abstraction","WebinySdk","FilesListCache","FileFieldsProvider"],"mappings":"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"}
@@ -4,6 +4,7 @@ import { Result } from "@webiny/sdk";
4
4
  import { ListCache } from "@webiny/app-admin/features/listCache/index.js";
5
5
  import { WebinySdk } from "@webiny/app-admin/features/webinySdk/abstractions.js";
6
6
  import { FilesListCache } from "../shared/abstractions.js";
7
+ import { FileFieldsProvider } from "../shared/FileFieldsProvider.js";
7
8
  import { FileUploader } from "./abstractions.js";
8
9
  import { FileUploader as external_FileUploader_js_FileUploader } from "./FileUploader.js";
9
10
  function createFile(overrides = {}) {
@@ -55,6 +56,7 @@ function createContainer(mockSdk) {
55
56
  const cache = new ListCache();
56
57
  container.registerInstance(WebinySdk, mockSdk);
57
58
  container.registerInstance(FilesListCache, cache);
59
+ container.register(FileFieldsProvider).inSingletonScope();
58
60
  container.register(external_FileUploader_js_FileUploader).inSingletonScope();
59
61
  return {
60
62
  container,
@@ -1 +1 @@
1
- {"version":3,"file":"features/fileUploader/FileUploader.test.js","sources":["../../../src/features/fileUploader/FileUploader.test.ts"],"sourcesContent":["import { describe, it, expect, vi, beforeEach } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { Result } from \"@webiny/sdk\";\nimport { ListCache } from \"@webiny/app-admin/features/listCache/index.js\";\nimport { WebinySdk } from \"@webiny/app-admin/features/webinySdk/abstractions.js\";\nimport { FilesListCache } from \"../shared/abstractions.js\";\nimport { FileUploader as Abstraction } from \"./abstractions.js\";\nimport { FileUploader } from \"./FileUploader.js\";\nimport type { FmFile } from \"../shared/types.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction createFile(overrides: Partial<FmFile> = {}): FmFile {\n return {\n id: \"file-1\",\n name: \"photo.jpg\",\n key: \"files/photo.jpg\",\n src: \"https://cdn.example.com/files/photo.jpg\",\n type: \"image/jpeg\",\n size: 204800,\n metadata: {},\n tags: [],\n createdOn: \"2025-01-01T00:00:00Z\",\n savedOn: \"2025-01-01T00:00:00Z\",\n createdBy: { id: \"user-1\", displayName: \"Test User\", type: \"admin\" },\n savedBy: { id: \"user-1\", displayName: \"Test User\", type: \"admin\" },\n location: { folderId: \"root\" },\n ...overrides\n };\n}\n\nfunction createBrowserFile(name: string, size = 1024): File {\n const content = new Uint8Array(size);\n return new File([content], name, { type: \"image/jpeg\" });\n}\n\ninterface MockSdk {\n fileManager: {\n createFile: ReturnType<typeof vi.fn>;\n createFiles: ReturnType<typeof vi.fn>;\n };\n}\n\nfunction createMockSdk(): MockSdk {\n return {\n fileManager: {\n createFile: vi.fn(),\n createFiles: vi.fn()\n }\n };\n}\n\nfunction createContainer(mockSdk: MockSdk) {\n const container = new Container();\n const cache = new ListCache<FmFile>();\n\n container.registerInstance(WebinySdk, mockSdk as any);\n container.registerInstance(FilesListCache, cache);\n container.register(FileUploader).inSingletonScope();\n\n return { container, cache };\n}\n\n// ---------------------------------------------------------------------------\n// Tests\n// ---------------------------------------------------------------------------\n\ndescribe(\"FileUploader Feature\", () => {\n let mockSdk: MockSdk;\n let cache: ListCache<FmFile>;\n let container: Container;\n\n beforeEach(() => {\n mockSdk = createMockSdk();\n const result = createContainer(mockSdk);\n container = result.container;\n cache = result.cache as ListCache<FmFile>;\n });\n\n // -----------------------------------------------------------------------\n // Single file upload.\n // -----------------------------------------------------------------------\n\n it(\"should call SDK createFile with correct params for single upload\", async () => {\n const file = createBrowserFile(\"photo.jpg\", 2048);\n const created = createFile({ id: \"new-1\", name: \"photo.jpg\" });\n mockSdk.fileManager.createFile.mockResolvedValue(Result.ok(created));\n\n const uploader = container.resolve(Abstraction);\n await uploader.upload(file, { name: \"photo.jpg\", type: \"image/jpeg\" });\n\n expect(mockSdk.fileManager.createFile).toHaveBeenCalledTimes(1);\n const callArgs = mockSdk.fileManager.createFile.mock.calls[0][0];\n expect(callArgs.file).toBe(file);\n expect(callArgs.data.name).toBe(\"photo.jpg\");\n expect(callArgs.data.type).toBe(\"image/jpeg\");\n expect(callArgs.fields).toBeDefined();\n expect(callArgs.onProgress).toBeTypeOf(\"function\");\n });\n\n it(\"should update job progress via onProgress callback\", async () => {\n const file = createBrowserFile(\"photo.jpg\", 2048);\n const created = createFile({ id: \"new-1\" });\n\n mockSdk.fileManager.createFile.mockImplementation(async (params: any) => {\n // Simulate progress callbacks.\n params.onProgress({ sent: 1024, total: 2048, percentage: 50 });\n params.onProgress({ sent: 2048, total: 2048, percentage: 100 });\n return Result.ok(created);\n });\n\n const uploader = container.resolve(Abstraction);\n await uploader.upload(file, { name: \"photo.jpg\", type: \"image/jpeg\" });\n\n // After completion, job should be completed.\n expect(uploader.vm.jobs).toHaveLength(1);\n expect(uploader.vm.jobs[0].status).toBe(\"completed\");\n expect(uploader.vm.jobs[0].progress.percentage).toBe(100);\n });\n\n it(\"should update cache on successful single upload\", async () => {\n const file = createBrowserFile(\"photo.jpg\");\n const created = createFile({ id: \"uploaded-1\", name: \"photo.jpg\" });\n mockSdk.fileManager.createFile.mockResolvedValue(Result.ok(created));\n\n expect(cache.hasItems()).toBe(false);\n\n const uploader = container.resolve(Abstraction);\n await uploader.upload(file, { name: \"photo.jpg\", type: \"image/jpeg\" });\n\n expect(cache.hasItems()).toBe(true);\n expect(cache.getItem(f => f.id === \"uploaded-1\")).toEqual(created);\n });\n\n it(\"should mark job as failed when SDK returns error\", async () => {\n const file = createBrowserFile(\"photo.jpg\");\n mockSdk.fileManager.createFile.mockResolvedValue(Result.fail(new Error(\"Upload failed\")));\n\n const uploader = container.resolve(Abstraction);\n await uploader.upload(file, { name: \"photo.jpg\", type: \"image/jpeg\" });\n\n expect(uploader.vm.jobs).toHaveLength(1);\n expect(uploader.vm.jobs[0].status).toBe(\"failed\");\n expect(uploader.vm.jobs[0].error).toBe(\"Upload failed\");\n expect(cache.hasItems()).toBe(false);\n });\n\n // -----------------------------------------------------------------------\n // Batch upload.\n // -----------------------------------------------------------------------\n\n it(\"should call SDK createFiles with correct params for batch upload\", async () => {\n const file1 = createBrowserFile(\"a.jpg\", 1024);\n const file2 = createBrowserFile(\"b.jpg\", 2048);\n const created1 = createFile({ id: \"batch-1\", name: \"a.jpg\" });\n const created2 = createFile({ id: \"batch-2\", name: \"b.jpg\" });\n\n mockSdk.fileManager.createFiles.mockResolvedValue(\n Result.ok({ successful: [created1, created2], failed: [] })\n );\n\n const uploader = container.resolve(Abstraction);\n await uploader.uploadMany(\n [\n { file: file1, data: { name: \"a.jpg\", type: \"image/jpeg\" } },\n { file: file2, data: { name: \"b.jpg\", type: \"image/jpeg\" } }\n ],\n { concurrency: 2, strategy: \"continue\" }\n );\n\n expect(mockSdk.fileManager.createFiles).toHaveBeenCalledTimes(1);\n const callArgs = mockSdk.fileManager.createFiles.mock.calls[0][0];\n expect(callArgs.files).toHaveLength(2);\n expect(callArgs.concurrency).toBe(2);\n expect(callArgs.strategy).toBe(\"continue\");\n });\n\n it(\"should update cache with all successful files from batch\", async () => {\n const file1 = createBrowserFile(\"a.jpg\");\n const file2 = createBrowserFile(\"b.jpg\");\n const created1 = createFile({ id: \"batch-1\", name: \"a.jpg\" });\n const created2 = createFile({ id: \"batch-2\", name: \"b.jpg\" });\n\n mockSdk.fileManager.createFiles.mockResolvedValue(\n Result.ok({ successful: [created1, created2], failed: [] })\n );\n\n const uploader = container.resolve(Abstraction);\n await uploader.uploadMany([\n { file: file1, data: { name: \"a.jpg\", type: \"image/jpeg\" } },\n { file: file2, data: { name: \"b.jpg\", type: \"image/jpeg\" } }\n ]);\n\n expect(cache.count()).toBe(2);\n expect(cache.getItem(f => f.id === \"batch-1\")).toBeDefined();\n expect(cache.getItem(f => f.id === \"batch-2\")).toBeDefined();\n });\n\n it(\"should track per-file progress in batch upload\", async () => {\n const file1 = createBrowserFile(\"a.jpg\", 1024);\n const file2 = createBrowserFile(\"b.jpg\", 2048);\n const created1 = createFile({ id: \"batch-1\", name: \"a.jpg\" });\n const created2 = createFile({ id: \"batch-2\", name: \"b.jpg\" });\n\n mockSdk.fileManager.createFiles.mockImplementation(async (params: any) => {\n // Simulate per-file progress.\n params.files[0].onProgress({ sent: 1024, total: 1024, percentage: 100 });\n params.files[1].onProgress({ sent: 1024, total: 2048, percentage: 50 });\n params.files[1].onProgress({ sent: 2048, total: 2048, percentage: 100 });\n return Result.ok({ successful: [created1, created2], failed: [] });\n });\n\n const uploader = container.resolve(Abstraction);\n await uploader.uploadMany([\n { file: file1, data: { name: \"a.jpg\", type: \"image/jpeg\" } },\n { file: file2, data: { name: \"b.jpg\", type: \"image/jpeg\" } }\n ]);\n\n expect(uploader.vm.jobs).toHaveLength(2);\n expect(uploader.vm.completedCount).toBe(2);\n });\n\n it(\"should handle partial failures in batch upload (continue strategy)\", async () => {\n const file1 = createBrowserFile(\"a.jpg\");\n const file2 = createBrowserFile(\"b.jpg\");\n const created1 = createFile({ id: \"batch-ok\", name: \"a.jpg\" });\n\n mockSdk.fileManager.createFiles.mockResolvedValue(\n Result.ok({\n successful: [created1],\n failed: [{ data: { name: \"b.jpg\" }, error: new Error(\"b.jpg failed\") }]\n })\n );\n\n const uploader = container.resolve(Abstraction);\n await uploader.uploadMany(\n [\n { file: file1, data: { name: \"a.jpg\", type: \"image/jpeg\" } },\n { file: file2, data: { name: \"b.jpg\", type: \"image/jpeg\" } }\n ],\n { strategy: \"continue\" }\n );\n\n expect(uploader.vm.completedCount).toBe(1);\n expect(uploader.vm.failedCount).toBe(1);\n // Only the successful file should be in cache.\n expect(cache.count()).toBe(1);\n expect(cache.getItem(f => f.id === \"batch-ok\")).toBeDefined();\n });\n\n // -----------------------------------------------------------------------\n // Abort.\n // -----------------------------------------------------------------------\n\n it(\"should pass AbortController signal to SDK for single upload\", async () => {\n const file = createBrowserFile(\"photo.jpg\");\n const created = createFile({ id: \"abort-1\" });\n mockSdk.fileManager.createFile.mockResolvedValue(Result.ok(created));\n\n const uploader = container.resolve(Abstraction);\n await uploader.upload(file, { name: \"photo.jpg\", type: \"image/jpeg\" });\n\n // Verify signal was passed.\n const callArgs = mockSdk.fileManager.createFile.mock.calls[0][0];\n expect(callArgs.signal).toBeInstanceOf(AbortSignal);\n });\n\n it(\"should pass AbortController signal to SDK for batch upload\", async () => {\n const file = createBrowserFile(\"photo.jpg\");\n const created = createFile({ id: \"abort-batch\" });\n mockSdk.fileManager.createFiles.mockResolvedValue(\n Result.ok({ successful: [created], failed: [] })\n );\n\n const uploader = container.resolve(Abstraction);\n await uploader.uploadMany([{ file, data: { name: \"photo.jpg\", type: \"image/jpeg\" } }]);\n\n const callArgs = mockSdk.fileManager.createFiles.mock.calls[0][0];\n expect(callArgs.signal).toBeInstanceOf(AbortSignal);\n });\n\n // -----------------------------------------------------------------------\n // Clear.\n // -----------------------------------------------------------------------\n\n it(\"should remove completed and failed jobs on clear\", async () => {\n const file1 = createBrowserFile(\"ok.jpg\");\n const file2 = createBrowserFile(\"fail.jpg\");\n\n // First upload succeeds.\n mockSdk.fileManager.createFile.mockResolvedValueOnce(\n Result.ok(createFile({ id: \"ok-1\", name: \"ok.jpg\" }))\n );\n // Second upload fails.\n mockSdk.fileManager.createFile.mockResolvedValueOnce(Result.fail(new Error(\"fail\")));\n\n const uploader = container.resolve(Abstraction);\n await uploader.upload(file1, { name: \"ok.jpg\", type: \"image/jpeg\" });\n await uploader.upload(file2, { name: \"fail.jpg\", type: \"image/jpeg\" });\n\n expect(uploader.vm.jobs).toHaveLength(2);\n expect(uploader.vm.completedCount).toBe(1);\n expect(uploader.vm.failedCount).toBe(1);\n\n uploader.clear();\n\n expect(uploader.vm.jobs).toHaveLength(0);\n });\n\n // -----------------------------------------------------------------------\n // ViewModel computed properties.\n // -----------------------------------------------------------------------\n\n it(\"should compute overall progress from all jobs\", async () => {\n const file1 = createBrowserFile(\"a.jpg\", 1000);\n const file2 = createBrowserFile(\"b.jpg\", 3000);\n const created1 = createFile({ id: \"p-1\", name: \"a.jpg\" });\n const created2 = createFile({ id: \"p-2\", name: \"b.jpg\" });\n\n mockSdk.fileManager.createFile\n .mockResolvedValueOnce(Result.ok(created1))\n .mockResolvedValueOnce(Result.ok(created2));\n\n const uploader = container.resolve(Abstraction);\n await uploader.upload(file1, { name: \"a.jpg\", type: \"image/jpeg\" });\n await uploader.upload(file2, { name: \"b.jpg\", type: \"image/jpeg\" });\n\n // Both completed — overall should be 100%.\n expect(uploader.vm.isUploading).toBe(false);\n expect(uploader.vm.overallProgress.percentage).toBe(100);\n });\n\n it(\"should report isUploading as false when no jobs exist\", () => {\n const uploader = container.resolve(Abstraction);\n expect(uploader.vm.isUploading).toBe(false);\n expect(uploader.vm.jobs).toHaveLength(0);\n expect(uploader.vm.overallProgress.percentage).toBe(0);\n });\n});\n"],"names":["createFile","overrides","createBrowserFile","name","size","content","Uint8Array","File","createMockSdk","vi","createContainer","mockSdk","container","Container","cache","ListCache","WebinySdk","FilesListCache","FileUploader","describe","beforeEach","result","it","file","created","Result","uploader","Abstraction","expect","callArgs","params","f","Error","file1","file2","created1","created2","AbortSignal"],"mappings":"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"}
1
+ {"version":3,"file":"features/fileUploader/FileUploader.test.js","sources":["../../../src/features/fileUploader/FileUploader.test.ts"],"sourcesContent":["import { describe, it, expect, vi, beforeEach } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { Result } from \"@webiny/sdk\";\nimport { ListCache } from \"@webiny/app-admin/features/listCache/index.js\";\nimport { WebinySdk } from \"@webiny/app-admin/features/webinySdk/abstractions.js\";\nimport { FilesListCache } from \"../shared/abstractions.js\";\nimport { FileFieldsProvider } from \"../shared/FileFieldsProvider.js\";\nimport { FileUploader as Abstraction } from \"./abstractions.js\";\nimport { FileUploader } from \"./FileUploader.js\";\nimport type { FmFile } from \"../shared/types.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction createFile(overrides: Partial<FmFile> = {}): FmFile {\n return {\n id: \"file-1\",\n name: \"photo.jpg\",\n key: \"files/photo.jpg\",\n src: \"https://cdn.example.com/files/photo.jpg\",\n type: \"image/jpeg\",\n size: 204800,\n metadata: {},\n tags: [],\n createdOn: \"2025-01-01T00:00:00Z\",\n savedOn: \"2025-01-01T00:00:00Z\",\n createdBy: { id: \"user-1\", displayName: \"Test User\", type: \"admin\" },\n savedBy: { id: \"user-1\", displayName: \"Test User\", type: \"admin\" },\n location: { folderId: \"root\" },\n ...overrides\n };\n}\n\nfunction createBrowserFile(name: string, size = 1024): File {\n const content = new Uint8Array(size);\n return new File([content], name, { type: \"image/jpeg\" });\n}\n\ninterface MockSdk {\n fileManager: {\n createFile: ReturnType<typeof vi.fn>;\n createFiles: ReturnType<typeof vi.fn>;\n };\n}\n\nfunction createMockSdk(): MockSdk {\n return {\n fileManager: {\n createFile: vi.fn(),\n createFiles: vi.fn()\n }\n };\n}\n\nfunction createContainer(mockSdk: MockSdk) {\n const container = new Container();\n const cache = new ListCache<FmFile>();\n\n container.registerInstance(WebinySdk, mockSdk as any);\n container.registerInstance(FilesListCache, cache);\n container.register(FileFieldsProvider).inSingletonScope();\n container.register(FileUploader).inSingletonScope();\n\n return { container, cache };\n}\n\n// ---------------------------------------------------------------------------\n// Tests\n// ---------------------------------------------------------------------------\n\ndescribe(\"FileUploader Feature\", () => {\n let mockSdk: MockSdk;\n let cache: ListCache<FmFile>;\n let container: Container;\n\n beforeEach(() => {\n mockSdk = createMockSdk();\n const result = createContainer(mockSdk);\n container = result.container;\n cache = result.cache as ListCache<FmFile>;\n });\n\n // -----------------------------------------------------------------------\n // Single file upload.\n // -----------------------------------------------------------------------\n\n it(\"should call SDK createFile with correct params for single upload\", async () => {\n const file = createBrowserFile(\"photo.jpg\", 2048);\n const created = createFile({ id: \"new-1\", name: \"photo.jpg\" });\n mockSdk.fileManager.createFile.mockResolvedValue(Result.ok(created));\n\n const uploader = container.resolve(Abstraction);\n await uploader.upload(file, { name: \"photo.jpg\", type: \"image/jpeg\" });\n\n expect(mockSdk.fileManager.createFile).toHaveBeenCalledTimes(1);\n const callArgs = mockSdk.fileManager.createFile.mock.calls[0][0];\n expect(callArgs.file).toBe(file);\n expect(callArgs.data.name).toBe(\"photo.jpg\");\n expect(callArgs.data.type).toBe(\"image/jpeg\");\n expect(callArgs.fields).toBeDefined();\n expect(callArgs.onProgress).toBeTypeOf(\"function\");\n });\n\n it(\"should update job progress via onProgress callback\", async () => {\n const file = createBrowserFile(\"photo.jpg\", 2048);\n const created = createFile({ id: \"new-1\" });\n\n mockSdk.fileManager.createFile.mockImplementation(async (params: any) => {\n // Simulate progress callbacks.\n params.onProgress({ sent: 1024, total: 2048, percentage: 50 });\n params.onProgress({ sent: 2048, total: 2048, percentage: 100 });\n return Result.ok(created);\n });\n\n const uploader = container.resolve(Abstraction);\n await uploader.upload(file, { name: \"photo.jpg\", type: \"image/jpeg\" });\n\n // After completion, job should be completed.\n expect(uploader.vm.jobs).toHaveLength(1);\n expect(uploader.vm.jobs[0].status).toBe(\"completed\");\n expect(uploader.vm.jobs[0].progress.percentage).toBe(100);\n });\n\n it(\"should update cache on successful single upload\", async () => {\n const file = createBrowserFile(\"photo.jpg\");\n const created = createFile({ id: \"uploaded-1\", name: \"photo.jpg\" });\n mockSdk.fileManager.createFile.mockResolvedValue(Result.ok(created));\n\n expect(cache.hasItems()).toBe(false);\n\n const uploader = container.resolve(Abstraction);\n await uploader.upload(file, { name: \"photo.jpg\", type: \"image/jpeg\" });\n\n expect(cache.hasItems()).toBe(true);\n expect(cache.getItem(f => f.id === \"uploaded-1\")).toEqual(created);\n });\n\n it(\"should mark job as failed when SDK returns error\", async () => {\n const file = createBrowserFile(\"photo.jpg\");\n mockSdk.fileManager.createFile.mockResolvedValue(Result.fail(new Error(\"Upload failed\")));\n\n const uploader = container.resolve(Abstraction);\n await uploader.upload(file, { name: \"photo.jpg\", type: \"image/jpeg\" });\n\n expect(uploader.vm.jobs).toHaveLength(1);\n expect(uploader.vm.jobs[0].status).toBe(\"failed\");\n expect(uploader.vm.jobs[0].error).toBe(\"Upload failed\");\n expect(cache.hasItems()).toBe(false);\n });\n\n // -----------------------------------------------------------------------\n // Batch upload.\n // -----------------------------------------------------------------------\n\n it(\"should call SDK createFiles with correct params for batch upload\", async () => {\n const file1 = createBrowserFile(\"a.jpg\", 1024);\n const file2 = createBrowserFile(\"b.jpg\", 2048);\n const created1 = createFile({ id: \"batch-1\", name: \"a.jpg\" });\n const created2 = createFile({ id: \"batch-2\", name: \"b.jpg\" });\n\n mockSdk.fileManager.createFiles.mockResolvedValue(\n Result.ok({ successful: [created1, created2], failed: [] })\n );\n\n const uploader = container.resolve(Abstraction);\n await uploader.uploadMany(\n [\n { file: file1, data: { name: \"a.jpg\", type: \"image/jpeg\" } },\n { file: file2, data: { name: \"b.jpg\", type: \"image/jpeg\" } }\n ],\n { concurrency: 2, strategy: \"continue\" }\n );\n\n expect(mockSdk.fileManager.createFiles).toHaveBeenCalledTimes(1);\n const callArgs = mockSdk.fileManager.createFiles.mock.calls[0][0];\n expect(callArgs.files).toHaveLength(2);\n expect(callArgs.concurrency).toBe(2);\n expect(callArgs.strategy).toBe(\"continue\");\n });\n\n it(\"should update cache with all successful files from batch\", async () => {\n const file1 = createBrowserFile(\"a.jpg\");\n const file2 = createBrowserFile(\"b.jpg\");\n const created1 = createFile({ id: \"batch-1\", name: \"a.jpg\" });\n const created2 = createFile({ id: \"batch-2\", name: \"b.jpg\" });\n\n mockSdk.fileManager.createFiles.mockResolvedValue(\n Result.ok({ successful: [created1, created2], failed: [] })\n );\n\n const uploader = container.resolve(Abstraction);\n await uploader.uploadMany([\n { file: file1, data: { name: \"a.jpg\", type: \"image/jpeg\" } },\n { file: file2, data: { name: \"b.jpg\", type: \"image/jpeg\" } }\n ]);\n\n expect(cache.count()).toBe(2);\n expect(cache.getItem(f => f.id === \"batch-1\")).toBeDefined();\n expect(cache.getItem(f => f.id === \"batch-2\")).toBeDefined();\n });\n\n it(\"should track per-file progress in batch upload\", async () => {\n const file1 = createBrowserFile(\"a.jpg\", 1024);\n const file2 = createBrowserFile(\"b.jpg\", 2048);\n const created1 = createFile({ id: \"batch-1\", name: \"a.jpg\" });\n const created2 = createFile({ id: \"batch-2\", name: \"b.jpg\" });\n\n mockSdk.fileManager.createFiles.mockImplementation(async (params: any) => {\n // Simulate per-file progress.\n params.files[0].onProgress({ sent: 1024, total: 1024, percentage: 100 });\n params.files[1].onProgress({ sent: 1024, total: 2048, percentage: 50 });\n params.files[1].onProgress({ sent: 2048, total: 2048, percentage: 100 });\n return Result.ok({ successful: [created1, created2], failed: [] });\n });\n\n const uploader = container.resolve(Abstraction);\n await uploader.uploadMany([\n { file: file1, data: { name: \"a.jpg\", type: \"image/jpeg\" } },\n { file: file2, data: { name: \"b.jpg\", type: \"image/jpeg\" } }\n ]);\n\n expect(uploader.vm.jobs).toHaveLength(2);\n expect(uploader.vm.completedCount).toBe(2);\n });\n\n it(\"should handle partial failures in batch upload (continue strategy)\", async () => {\n const file1 = createBrowserFile(\"a.jpg\");\n const file2 = createBrowserFile(\"b.jpg\");\n const created1 = createFile({ id: \"batch-ok\", name: \"a.jpg\" });\n\n mockSdk.fileManager.createFiles.mockResolvedValue(\n Result.ok({\n successful: [created1],\n failed: [{ data: { name: \"b.jpg\" }, error: new Error(\"b.jpg failed\") }]\n })\n );\n\n const uploader = container.resolve(Abstraction);\n await uploader.uploadMany(\n [\n { file: file1, data: { name: \"a.jpg\", type: \"image/jpeg\" } },\n { file: file2, data: { name: \"b.jpg\", type: \"image/jpeg\" } }\n ],\n { strategy: \"continue\" }\n );\n\n expect(uploader.vm.completedCount).toBe(1);\n expect(uploader.vm.failedCount).toBe(1);\n // Only the successful file should be in cache.\n expect(cache.count()).toBe(1);\n expect(cache.getItem(f => f.id === \"batch-ok\")).toBeDefined();\n });\n\n // -----------------------------------------------------------------------\n // Abort.\n // -----------------------------------------------------------------------\n\n it(\"should pass AbortController signal to SDK for single upload\", async () => {\n const file = createBrowserFile(\"photo.jpg\");\n const created = createFile({ id: \"abort-1\" });\n mockSdk.fileManager.createFile.mockResolvedValue(Result.ok(created));\n\n const uploader = container.resolve(Abstraction);\n await uploader.upload(file, { name: \"photo.jpg\", type: \"image/jpeg\" });\n\n // Verify signal was passed.\n const callArgs = mockSdk.fileManager.createFile.mock.calls[0][0];\n expect(callArgs.signal).toBeInstanceOf(AbortSignal);\n });\n\n it(\"should pass AbortController signal to SDK for batch upload\", async () => {\n const file = createBrowserFile(\"photo.jpg\");\n const created = createFile({ id: \"abort-batch\" });\n mockSdk.fileManager.createFiles.mockResolvedValue(\n Result.ok({ successful: [created], failed: [] })\n );\n\n const uploader = container.resolve(Abstraction);\n await uploader.uploadMany([{ file, data: { name: \"photo.jpg\", type: \"image/jpeg\" } }]);\n\n const callArgs = mockSdk.fileManager.createFiles.mock.calls[0][0];\n expect(callArgs.signal).toBeInstanceOf(AbortSignal);\n });\n\n // -----------------------------------------------------------------------\n // Clear.\n // -----------------------------------------------------------------------\n\n it(\"should remove completed and failed jobs on clear\", async () => {\n const file1 = createBrowserFile(\"ok.jpg\");\n const file2 = createBrowserFile(\"fail.jpg\");\n\n // First upload succeeds.\n mockSdk.fileManager.createFile.mockResolvedValueOnce(\n Result.ok(createFile({ id: \"ok-1\", name: \"ok.jpg\" }))\n );\n // Second upload fails.\n mockSdk.fileManager.createFile.mockResolvedValueOnce(Result.fail(new Error(\"fail\")));\n\n const uploader = container.resolve(Abstraction);\n await uploader.upload(file1, { name: \"ok.jpg\", type: \"image/jpeg\" });\n await uploader.upload(file2, { name: \"fail.jpg\", type: \"image/jpeg\" });\n\n expect(uploader.vm.jobs).toHaveLength(2);\n expect(uploader.vm.completedCount).toBe(1);\n expect(uploader.vm.failedCount).toBe(1);\n\n uploader.clear();\n\n expect(uploader.vm.jobs).toHaveLength(0);\n });\n\n // -----------------------------------------------------------------------\n // ViewModel computed properties.\n // -----------------------------------------------------------------------\n\n it(\"should compute overall progress from all jobs\", async () => {\n const file1 = createBrowserFile(\"a.jpg\", 1000);\n const file2 = createBrowserFile(\"b.jpg\", 3000);\n const created1 = createFile({ id: \"p-1\", name: \"a.jpg\" });\n const created2 = createFile({ id: \"p-2\", name: \"b.jpg\" });\n\n mockSdk.fileManager.createFile\n .mockResolvedValueOnce(Result.ok(created1))\n .mockResolvedValueOnce(Result.ok(created2));\n\n const uploader = container.resolve(Abstraction);\n await uploader.upload(file1, { name: \"a.jpg\", type: \"image/jpeg\" });\n await uploader.upload(file2, { name: \"b.jpg\", type: \"image/jpeg\" });\n\n // Both completed — overall should be 100%.\n expect(uploader.vm.isUploading).toBe(false);\n expect(uploader.vm.overallProgress.percentage).toBe(100);\n });\n\n it(\"should report isUploading as false when no jobs exist\", () => {\n const uploader = container.resolve(Abstraction);\n expect(uploader.vm.isUploading).toBe(false);\n expect(uploader.vm.jobs).toHaveLength(0);\n expect(uploader.vm.overallProgress.percentage).toBe(0);\n });\n});\n"],"names":["createFile","overrides","createBrowserFile","name","size","content","Uint8Array","File","createMockSdk","vi","createContainer","mockSdk","container","Container","cache","ListCache","WebinySdk","FilesListCache","FileFieldsProvider","FileUploader","describe","beforeEach","result","it","file","created","Result","uploader","Abstraction","expect","callArgs","params","f","Error","file1","file2","created1","created2","AbortSignal"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { FileUrlFormatter } from "./abstractions.js";
2
+ declare class FileUrlFormatterImpl implements FileUrlFormatter.Interface {
3
+ format(url: URL, params?: FileUrlFormatter.Params): void;
4
+ }
5
+ export declare const FmFileUrlFormatter: typeof FileUrlFormatterImpl & {
6
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/admin-ui/index.js").FileUrlFormatter>;
7
+ };
8
+ export {};
@@ -0,0 +1,13 @@
1
+ import { FileUrlFormatter } from "./abstractions.js";
2
+ class FileUrlFormatterImpl {
3
+ format(url, params) {
4
+ if (params?.width !== void 0) url.searchParams.set("width", String(params.width));
5
+ }
6
+ }
7
+ const FmFileUrlFormatter = FileUrlFormatter.createImplementation({
8
+ implementation: FileUrlFormatterImpl,
9
+ dependencies: []
10
+ });
11
+ export { FmFileUrlFormatter };
12
+
13
+ //# sourceMappingURL=FileUrlFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/fileUrlFormatter/FileUrlFormatter.js","sources":["../../../src/features/fileUrlFormatter/FileUrlFormatter.ts"],"sourcesContent":["import { FileUrlFormatter } from \"./abstractions.js\";\n\nclass FileUrlFormatterImpl implements FileUrlFormatter.Interface {\n format(url: URL, params?: FileUrlFormatter.Params): void {\n if (params?.width !== undefined) {\n url.searchParams.set(\"width\", String(params.width));\n }\n }\n}\n\nexport const FmFileUrlFormatter = FileUrlFormatter.createImplementation({\n implementation: FileUrlFormatterImpl,\n dependencies: []\n});\n"],"names":["FileUrlFormatterImpl","url","params","undefined","String","FmFileUrlFormatter","FileUrlFormatter"],"mappings":";AAEA,MAAMA;IACF,OAAOC,GAAQ,EAAEC,MAAgC,EAAQ;QACrD,IAAIA,QAAQ,UAAUC,QAClBF,IAAI,YAAY,CAAC,GAAG,CAAC,SAASG,OAAOF,OAAO,KAAK;IAEzD;AACJ;AAEO,MAAMG,qBAAqBC,iBAAiB,oBAAoB,CAAC;IACpE,gBAAgBN;IAChB,cAAc,EAAE;AACpB"}
@@ -0,0 +1 @@
1
+ export { FileUrlFormatter } from "@webiny/app-admin/features/fileUrlFormatter/abstractions.js";
@@ -0,0 +1 @@
1
+ export { FileUrlFormatter } from "@webiny/app-admin/features/fileUrlFormatter/abstractions.js";
@@ -0,0 +1 @@
1
+ export declare const FileUrlFormatterFeature: import("@webiny/feature/admin").FeatureDefinition<any, []>;
@@ -0,0 +1,11 @@
1
+ import { createFeature } from "@webiny/feature/admin";
2
+ import { FmFileUrlFormatter } from "./FileUrlFormatter.js";
3
+ const FileUrlFormatterFeature = createFeature({
4
+ name: "FileManager/FileUrlFormatter",
5
+ register (container) {
6
+ container.register(FmFileUrlFormatter).inSingletonScope();
7
+ }
8
+ });
9
+ export { FileUrlFormatterFeature };
10
+
11
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/fileUrlFormatter/feature.js","sources":["../../../src/features/fileUrlFormatter/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { FmFileUrlFormatter } from \"./FileUrlFormatter.js\";\n\nexport const FileUrlFormatterFeature = createFeature({\n name: \"FileManager/FileUrlFormatter\",\n register(container) {\n container.register(FmFileUrlFormatter).inSingletonScope();\n }\n});\n"],"names":["FileUrlFormatterFeature","createFeature","container","FmFileUrlFormatter"],"mappings":";;AAGO,MAAMA,0BAA0BC,cAAc;IACjD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,oBAAoB,gBAAgB;IAC3D;AACJ"}
@@ -1,9 +1,11 @@
1
1
  import { WebinySdk } from "@webiny/app-admin/features/webinySdk/abstractions.js";
2
2
  import type { FmFile } from "../shared/types.js";
3
+ import { FileFieldsProvider } from "../shared/abstractions.js";
3
4
  import { GetFileGateway as GatewayAbstraction, type GetFileGatewayParams } from "./abstractions.js";
4
5
  declare class GetFileGatewayImpl implements GatewayAbstraction.Interface {
5
6
  private sdk;
6
- constructor(sdk: WebinySdk.Interface);
7
+ private fileFieldsProvider;
8
+ constructor(sdk: WebinySdk.Interface, fileFieldsProvider: FileFieldsProvider.Interface);
7
9
  execute(params: GetFileGatewayParams): Promise<FmFile>;
8
10
  }
9
11
  export declare const GetFileGateway: typeof GetFileGatewayImpl & {
@@ -1,14 +1,16 @@
1
1
  import { WebinySdk } from "@webiny/app-admin/features/webinySdk/abstractions.js";
2
+ import { FileFieldsProvider } from "../shared/abstractions.js";
2
3
  import { GetFileGateway } from "./abstractions.js";
3
- import { FILE_FIELDS } from "../shared/FILE_FIELDS.js";
4
4
  class GetFileGatewayImpl {
5
- constructor(sdk){
5
+ constructor(sdk, fileFieldsProvider){
6
6
  this.sdk = sdk;
7
+ this.fileFieldsProvider = fileFieldsProvider;
7
8
  }
8
9
  async execute(params) {
10
+ const fields = await this.fileFieldsProvider.execute();
9
11
  const result = await this.sdk.fileManager.getFile({
10
12
  id: params.id,
11
- fields: FILE_FIELDS
13
+ fields
12
14
  });
13
15
  if (result.isFail()) throw new Error(result.error.message);
14
16
  return result.value;
@@ -17,7 +19,8 @@ class GetFileGatewayImpl {
17
19
  const GetFileGateway_GetFileGateway = GetFileGateway.createImplementation({
18
20
  implementation: GetFileGatewayImpl,
19
21
  dependencies: [
20
- WebinySdk
22
+ WebinySdk,
23
+ FileFieldsProvider
21
24
  ]
22
25
  });
23
26
  export { GetFileGateway_GetFileGateway as GetFileGateway };
@@ -1 +1 @@
1
- {"version":3,"file":"features/getFile/GetFileGateway.js","sources":["../../../src/features/getFile/GetFileGateway.ts"],"sourcesContent":["import { WebinySdk } from \"@webiny/app-admin/features/webinySdk/abstractions.js\";\nimport type { FmFile } from \"../shared/types.js\";\nimport { GetFileGateway as GatewayAbstraction, type GetFileGatewayParams } from \"./abstractions.js\";\nimport { FILE_FIELDS } from \"~/features/shared/FILE_FIELDS.js\";\n\nclass GetFileGatewayImpl implements GatewayAbstraction.Interface {\n constructor(private sdk: WebinySdk.Interface) {}\n\n async execute(params: GetFileGatewayParams): Promise<FmFile> {\n const result = await this.sdk.fileManager.getFile({\n id: params.id,\n fields: FILE_FIELDS\n });\n\n if (result.isFail()) {\n throw new Error(result.error.message);\n }\n\n return result.value;\n }\n}\n\nexport const GetFileGateway = GatewayAbstraction.createImplementation({\n implementation: GetFileGatewayImpl,\n dependencies: [WebinySdk]\n});\n"],"names":["GetFileGatewayImpl","sdk","params","result","FILE_FIELDS","Error","GetFileGateway","GatewayAbstraction","WebinySdk"],"mappings":";;;AAKA,MAAMA;IACF,YAAoBC,GAAwB,CAAE;aAA1BA,GAAG,GAAHA;IAA2B;IAE/C,MAAM,QAAQC,MAA4B,EAAmB;QACzD,MAAMC,SAAS,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC;YAC9C,IAAID,OAAO,EAAE;YACb,QAAQE;QACZ;QAEA,IAAID,OAAO,MAAM,IACb,MAAM,IAAIE,MAAMF,OAAO,KAAK,CAAC,OAAO;QAGxC,OAAOA,OAAO,KAAK;IACvB;AACJ;AAEO,MAAMG,gCAAiBC,eAAAA,oBAAuC,CAAC;IAClE,gBAAgBP;IAChB,cAAc;QAACQ;KAAU;AAC7B"}
1
+ {"version":3,"file":"features/getFile/GetFileGateway.js","sources":["../../../src/features/getFile/GetFileGateway.ts"],"sourcesContent":["import { WebinySdk } from \"@webiny/app-admin/features/webinySdk/abstractions.js\";\nimport type { FmFile } from \"../shared/types.js\";\nimport { FileFieldsProvider } from \"../shared/abstractions.js\";\nimport { GetFileGateway as GatewayAbstraction, type GetFileGatewayParams } from \"./abstractions.js\";\n\nclass GetFileGatewayImpl implements GatewayAbstraction.Interface {\n constructor(\n private sdk: WebinySdk.Interface,\n private fileFieldsProvider: FileFieldsProvider.Interface\n ) {}\n\n async execute(params: GetFileGatewayParams): Promise<FmFile> {\n const fields = await this.fileFieldsProvider.execute();\n const result = await this.sdk.fileManager.getFile({\n id: params.id,\n fields\n });\n\n if (result.isFail()) {\n throw new Error(result.error.message);\n }\n\n return result.value;\n }\n}\n\nexport const GetFileGateway = GatewayAbstraction.createImplementation({\n implementation: GetFileGatewayImpl,\n dependencies: [WebinySdk, FileFieldsProvider]\n});\n"],"names":["GetFileGatewayImpl","sdk","fileFieldsProvider","params","fields","result","Error","GetFileGateway","GatewayAbstraction","WebinySdk","FileFieldsProvider"],"mappings":";;;AAKA,MAAMA;IACF,YACYC,GAAwB,EACxBC,kBAAgD,CAC1D;aAFUD,GAAG,GAAHA;aACAC,kBAAkB,GAAlBA;IACT;IAEH,MAAM,QAAQC,MAA4B,EAAmB;QACzD,MAAMC,SAAS,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO;QACpD,MAAMC,SAAS,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC;YAC9C,IAAIF,OAAO,EAAE;YACbC;QACJ;QAEA,IAAIC,OAAO,MAAM,IACb,MAAM,IAAIC,MAAMD,OAAO,KAAK,CAAC,OAAO;QAGxC,OAAOA,OAAO,KAAK;IACvB;AACJ;AAEO,MAAME,gCAAiBC,eAAAA,oBAAuC,CAAC;IAClE,gBAAgBR;IAChB,cAAc;QAACS;QAAWC;KAAmB;AACjD"}
@@ -1,8 +1,10 @@
1
1
  import { WebinySdk } from "@webiny/app-admin/features/webinySdk/abstractions.js";
2
+ import { FileFieldsProvider } from "../shared/abstractions.js";
2
3
  import { ListFilesGateway as GatewayAbstraction, type ListFilesGatewayParams, type ListFilesGatewayResult } from "./abstractions.js";
3
4
  declare class ListFilesGatewayImpl implements GatewayAbstraction.Interface {
4
5
  private sdk;
5
- constructor(sdk: WebinySdk.Interface);
6
+ private fileFieldsProvider;
7
+ constructor(sdk: WebinySdk.Interface, fileFieldsProvider: FileFieldsProvider.Interface);
6
8
  execute(params: ListFilesGatewayParams): Promise<ListFilesGatewayResult>;
7
9
  }
8
10
  export declare const ListFilesGateway: typeof ListFilesGatewayImpl & {
@@ -1,18 +1,20 @@
1
1
  import { WebinySdk } from "@webiny/app-admin/features/webinySdk/abstractions.js";
2
+ import { FileFieldsProvider } from "../shared/abstractions.js";
2
3
  import { ListFilesGateway } from "./abstractions.js";
3
- import { FILE_FIELDS } from "../shared/FILE_FIELDS.js";
4
4
  class ListFilesGatewayImpl {
5
- constructor(sdk){
5
+ constructor(sdk, fileFieldsProvider){
6
6
  this.sdk = sdk;
7
+ this.fileFieldsProvider = fileFieldsProvider;
7
8
  }
8
9
  async execute(params) {
10
+ const fields = await this.fileFieldsProvider.execute();
9
11
  const result = await this.sdk.fileManager.listFiles({
10
12
  search: params.search,
11
13
  where: params.where,
12
14
  sort: params.sort,
13
15
  limit: params.limit,
14
16
  after: params.after,
15
- fields: FILE_FIELDS
17
+ fields
16
18
  });
17
19
  if (result.isFail()) throw new Error(result.error.message);
18
20
  return {
@@ -24,7 +26,8 @@ class ListFilesGatewayImpl {
24
26
  const ListFilesGateway_ListFilesGateway = ListFilesGateway.createImplementation({
25
27
  implementation: ListFilesGatewayImpl,
26
28
  dependencies: [
27
- WebinySdk
29
+ WebinySdk,
30
+ FileFieldsProvider
28
31
  ]
29
32
  });
30
33
  export { ListFilesGateway_ListFilesGateway as ListFilesGateway };
@@ -1 +1 @@
1
- {"version":3,"file":"features/listFiles/ListFilesGateway.js","sources":["../../../src/features/listFiles/ListFilesGateway.ts"],"sourcesContent":["import { WebinySdk } from \"@webiny/app-admin/features/webinySdk/abstractions.js\";\nimport type { FmFileListWhereInput } from \"@webiny/sdk\";\nimport { FmFileListSorter } from \"@webiny/sdk\";\nimport {\n ListFilesGateway as GatewayAbstraction,\n type ListFilesGatewayParams,\n type ListFilesGatewayResult\n} from \"./abstractions.js\";\nimport { FILE_FIELDS } from \"~/features/shared/FILE_FIELDS.js\";\n\nclass ListFilesGatewayImpl implements GatewayAbstraction.Interface {\n constructor(private sdk: WebinySdk.Interface) {}\n\n async execute(params: ListFilesGatewayParams): Promise<ListFilesGatewayResult> {\n const result = await this.sdk.fileManager.listFiles({\n search: params.search,\n where: params.where as FmFileListWhereInput | undefined,\n sort: params.sort as FmFileListSorter[] | undefined,\n limit: params.limit,\n after: params.after,\n fields: FILE_FIELDS\n });\n\n if (result.isFail()) {\n throw new Error(result.error.message);\n }\n\n return {\n data: result.value.data,\n meta: result.value.meta\n };\n }\n}\n\nexport const ListFilesGateway = GatewayAbstraction.createImplementation({\n implementation: ListFilesGatewayImpl,\n dependencies: [WebinySdk]\n});\n"],"names":["ListFilesGatewayImpl","sdk","params","result","FILE_FIELDS","Error","ListFilesGateway","GatewayAbstraction","WebinySdk"],"mappings":";;;AAUA,MAAMA;IACF,YAAoBC,GAAwB,CAAE;aAA1BA,GAAG,GAAHA;IAA2B;IAE/C,MAAM,QAAQC,MAA8B,EAAmC;QAC3E,MAAMC,SAAS,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC;YAChD,QAAQD,OAAO,MAAM;YACrB,OAAOA,OAAO,KAAK;YACnB,MAAMA,OAAO,IAAI;YACjB,OAAOA,OAAO,KAAK;YACnB,OAAOA,OAAO,KAAK;YACnB,QAAQE;QACZ;QAEA,IAAID,OAAO,MAAM,IACb,MAAM,IAAIE,MAAMF,OAAO,KAAK,CAAC,OAAO;QAGxC,OAAO;YACH,MAAMA,OAAO,KAAK,CAAC,IAAI;YACvB,MAAMA,OAAO,KAAK,CAAC,IAAI;QAC3B;IACJ;AACJ;AAEO,MAAMG,oCAAmBC,iBAAAA,oBAAuC,CAAC;IACpE,gBAAgBP;IAChB,cAAc;QAACQ;KAAU;AAC7B"}
1
+ {"version":3,"file":"features/listFiles/ListFilesGateway.js","sources":["../../../src/features/listFiles/ListFilesGateway.ts"],"sourcesContent":["import { WebinySdk } from \"@webiny/app-admin/features/webinySdk/abstractions.js\";\nimport type { FmFileListWhereInput } from \"@webiny/sdk\";\nimport { FmFileListSorter } from \"@webiny/sdk\";\nimport { FileFieldsProvider } from \"../shared/abstractions.js\";\nimport {\n ListFilesGateway as GatewayAbstraction,\n type ListFilesGatewayParams,\n type ListFilesGatewayResult\n} from \"./abstractions.js\";\n\nclass ListFilesGatewayImpl implements GatewayAbstraction.Interface {\n constructor(\n private sdk: WebinySdk.Interface,\n private fileFieldsProvider: FileFieldsProvider.Interface\n ) {}\n\n async execute(params: ListFilesGatewayParams): Promise<ListFilesGatewayResult> {\n const fields = await this.fileFieldsProvider.execute();\n const result = await this.sdk.fileManager.listFiles({\n search: params.search,\n where: params.where as FmFileListWhereInput | undefined,\n sort: params.sort as FmFileListSorter[] | undefined,\n limit: params.limit,\n after: params.after,\n fields\n });\n\n if (result.isFail()) {\n throw new Error(result.error.message);\n }\n\n return {\n data: result.value.data,\n meta: result.value.meta\n };\n }\n}\n\nexport const ListFilesGateway = GatewayAbstraction.createImplementation({\n implementation: ListFilesGatewayImpl,\n dependencies: [WebinySdk, FileFieldsProvider]\n});\n"],"names":["ListFilesGatewayImpl","sdk","fileFieldsProvider","params","fields","result","Error","ListFilesGateway","GatewayAbstraction","WebinySdk","FileFieldsProvider"],"mappings":";;;AAUA,MAAMA;IACF,YACYC,GAAwB,EACxBC,kBAAgD,CAC1D;aAFUD,GAAG,GAAHA;aACAC,kBAAkB,GAAlBA;IACT;IAEH,MAAM,QAAQC,MAA8B,EAAmC;QAC3E,MAAMC,SAAS,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO;QACpD,MAAMC,SAAS,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC;YAChD,QAAQF,OAAO,MAAM;YACrB,OAAOA,OAAO,KAAK;YACnB,MAAMA,OAAO,IAAI;YACjB,OAAOA,OAAO,KAAK;YACnB,OAAOA,OAAO,KAAK;YACnBC;QACJ;QAEA,IAAIC,OAAO,MAAM,IACb,MAAM,IAAIC,MAAMD,OAAO,KAAK,CAAC,OAAO;QAGxC,OAAO;YACH,MAAMA,OAAO,KAAK,CAAC,IAAI;YACvB,MAAMA,OAAO,KAAK,CAAC,IAAI;QAC3B;IACJ;AACJ;AAEO,MAAME,oCAAmBC,iBAAAA,oBAAuC,CAAC;IACpE,gBAAgBR;IAChB,cAAc;QAACS;QAAWC;KAAmB;AACjD"}
@@ -25,8 +25,7 @@ const FILE_FIELDS = [
25
25
  "metadata.image.format",
26
26
  "metadata.image.orientation",
27
27
  "metadata.exif",
28
- "metadata.iptc",
29
- "accessControl.type"
28
+ "metadata.iptc"
30
29
  ];
31
30
  export { FILE_FIELDS };
32
31
 
@@ -1 +1 @@
1
- {"version":3,"file":"features/shared/FILE_FIELDS.js","sources":["../../../src/features/shared/FILE_FIELDS.ts"],"sourcesContent":["export const FILE_FIELDS = [\n \"id\",\n \"name\",\n \"description\",\n \"key\",\n \"src\",\n \"type\",\n \"size\",\n \"tags\",\n \"createdOn\",\n \"savedOn\",\n \"modifiedOn\",\n \"createdBy.id\",\n \"createdBy.displayName\",\n \"createdBy.type\",\n \"savedBy.id\",\n \"savedBy.displayName\",\n \"savedBy.type\",\n \"modifiedBy.id\",\n \"modifiedBy.displayName\",\n \"modifiedBy.type\",\n \"location.folderId\",\n \"metadata.image.width\",\n \"metadata.image.height\",\n \"metadata.image.format\",\n \"metadata.image.orientation\",\n \"metadata.exif\",\n \"metadata.iptc\",\n \"accessControl.type\"\n];\n"],"names":["FILE_FIELDS"],"mappings":"AAAO,MAAMA,cAAc;IACvB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACH"}
1
+ {"version":3,"file":"features/shared/FILE_FIELDS.js","sources":["../../../src/features/shared/FILE_FIELDS.ts"],"sourcesContent":["export const FILE_FIELDS = [\n \"id\",\n \"name\",\n \"description\",\n \"key\",\n \"src\",\n \"type\",\n \"size\",\n \"tags\",\n \"createdOn\",\n \"savedOn\",\n \"modifiedOn\",\n \"createdBy.id\",\n \"createdBy.displayName\",\n \"createdBy.type\",\n \"savedBy.id\",\n \"savedBy.displayName\",\n \"savedBy.type\",\n \"modifiedBy.id\",\n \"modifiedBy.displayName\",\n \"modifiedBy.type\",\n \"location.folderId\",\n \"metadata.image.width\",\n \"metadata.image.height\",\n \"metadata.image.format\",\n \"metadata.image.orientation\",\n \"metadata.exif\",\n \"metadata.iptc\"\n];\n"],"names":["FILE_FIELDS"],"mappings":"AAAO,MAAMA,cAAc;IACvB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACH"}
@@ -0,0 +1,8 @@
1
+ import { FileFieldsProvider as Abstraction } from "./abstractions.js";
2
+ declare class FileFieldsProviderImpl implements Abstraction.Interface {
3
+ execute(): Promise<string[]>;
4
+ }
5
+ export declare const FileFieldsProvider: typeof FileFieldsProviderImpl & {
6
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IFileFieldsProvider>;
7
+ };
8
+ export {};
@@ -0,0 +1,14 @@
1
+ import { FILE_FIELDS } from "./FILE_FIELDS.js";
2
+ import { FileFieldsProvider } from "./abstractions.js";
3
+ class FileFieldsProviderImpl {
4
+ async execute() {
5
+ return FILE_FIELDS;
6
+ }
7
+ }
8
+ const FileFieldsProvider_FileFieldsProvider = FileFieldsProvider.createImplementation({
9
+ implementation: FileFieldsProviderImpl,
10
+ dependencies: []
11
+ });
12
+ export { FileFieldsProvider_FileFieldsProvider as FileFieldsProvider };
13
+
14
+ //# sourceMappingURL=FileFieldsProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/shared/FileFieldsProvider.js","sources":["../../../src/features/shared/FileFieldsProvider.ts"],"sourcesContent":["import { FILE_FIELDS } from \"./FILE_FIELDS.js\";\nimport { FileFieldsProvider as Abstraction } from \"./abstractions.js\";\n\nclass FileFieldsProviderImpl implements Abstraction.Interface {\n async execute(): Promise<string[]> {\n return FILE_FIELDS;\n }\n}\n\nexport const FileFieldsProvider = Abstraction.createImplementation({\n implementation: FileFieldsProviderImpl,\n dependencies: []\n});\n"],"names":["FileFieldsProviderImpl","FILE_FIELDS","FileFieldsProvider","Abstraction"],"mappings":";;AAGA,MAAMA;IACF,MAAM,UAA6B;QAC/B,OAAOC;IACX;AACJ;AAEO,MAAMC,wCAAqBC,mBAAAA,oBAAgC,CAAC;IAC/D,gBAAgBH;IAChB,cAAc,EAAE;AACpB"}
@@ -0,0 +1,12 @@
1
+ import { WcpService } from "@webiny/app-admin/features/wcp/abstractions.js";
2
+ import { FileFieldsProvider as Abstraction } from "./abstractions.js";
3
+ declare class FileFieldsProviderWithWcpImpl implements Abstraction.Interface {
4
+ private wcp;
5
+ private decoratee;
6
+ constructor(wcp: WcpService.Interface, decoratee: Abstraction.Interface);
7
+ execute(): Promise<string[]>;
8
+ }
9
+ export declare const FileFieldsProviderWithWcp: typeof FileFieldsProviderWithWcpImpl & {
10
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IFileFieldsProvider>;
11
+ };
12
+ export {};