@maas/payload-plugin-media-cloud 0.0.31 → 0.0.33

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 (163) hide show
  1. package/dist/adapter/handleDelete.d.mts +3 -3
  2. package/dist/adapter/handleDelete.mjs +6 -6
  3. package/dist/adapter/handleDelete.mjs.map +1 -1
  4. package/dist/adapter/handleUpload.mjs.map +1 -1
  5. package/dist/adapter/staticHandler.d.mts +5 -3
  6. package/dist/adapter/staticHandler.mjs +8 -7
  7. package/dist/adapter/staticHandler.mjs.map +1 -1
  8. package/dist/adapter/storageAdapter.d.mts +3 -3
  9. package/dist/adapter/storageAdapter.mjs +4 -4
  10. package/dist/adapter/storageAdapter.mjs.map +1 -1
  11. package/dist/collectionHooks/afterChange.d.mts +7 -0
  12. package/dist/collectionHooks/afterChange.mjs +39 -0
  13. package/dist/collectionHooks/afterChange.mjs.map +1 -0
  14. package/dist/collectionHooks/beforeChange.d.mts +7 -0
  15. package/dist/collectionHooks/beforeChange.mjs +33 -0
  16. package/dist/collectionHooks/beforeChange.mjs.map +1 -0
  17. package/dist/collections/mediaCollection.d.mts +3 -2
  18. package/dist/collections/mediaCollection.mjs +36 -187
  19. package/dist/collections/mediaCollection.mjs.map +1 -1
  20. package/dist/components/folderFileCard/folderFileCard.d.mts +13 -0
  21. package/dist/components/folderFileCard/folderFileCard.mjs +75 -0
  22. package/dist/components/folderFileCard/folderFileCard.mjs.map +1 -0
  23. package/dist/components/gridContext/gridContext.d.mts +51 -0
  24. package/dist/components/gridContext/gridContext.mjs +227 -0
  25. package/dist/components/gridContext/gridContext.mjs.map +1 -0
  26. package/dist/components/gridView/gridView.css +50 -0
  27. package/dist/components/gridView/gridView.d.mts +16 -0
  28. package/dist/components/gridView/gridView.mjs +283 -0
  29. package/dist/components/gridView/gridView.mjs.map +1 -0
  30. package/dist/components/gridView/index.d.mts +2 -0
  31. package/dist/components/gridView/index.mjs +3 -0
  32. package/dist/components/index.d.mts +9 -7
  33. package/dist/components/index.mjs +5 -4
  34. package/dist/components/itemCardGrid/itemCardGrid.css +12 -0
  35. package/dist/components/itemCardGrid/itemCardGrid.d.mts +18 -0
  36. package/dist/components/itemCardGrid/itemCardGrid.mjs +42 -0
  37. package/dist/components/itemCardGrid/itemCardGrid.mjs.map +1 -0
  38. package/dist/components/muxPreview/index.d.mts +2 -0
  39. package/dist/components/muxPreview/index.mjs +3 -0
  40. package/dist/components/{mux-preview/mux-preview.d.mts → muxPreview/muxPreview.d.mts} +2 -2
  41. package/dist/components/muxPreview/muxPreview.mjs +65 -0
  42. package/dist/components/muxPreview/muxPreview.mjs.map +1 -0
  43. package/dist/components/uploadHandler/index.d.mts +2 -0
  44. package/dist/components/uploadHandler/index.mjs +3 -0
  45. package/dist/components/uploadHandler/uploadHandler.d.mts +20 -0
  46. package/dist/components/{upload-handler/upload-handler.mjs → uploadHandler/uploadHandler.mjs} +82 -52
  47. package/dist/components/uploadHandler/uploadHandler.mjs.map +1 -0
  48. package/dist/components/uploadManager/index.d.mts +2 -0
  49. package/dist/components/uploadManager/index.mjs +3 -0
  50. package/dist/components/{upload-manager/upload-manager.d.mts → uploadManager/uploadManager.d.mts} +3 -3
  51. package/dist/components/uploadManager/uploadManager.mjs +363 -0
  52. package/dist/components/uploadManager/uploadManager.mjs.map +1 -0
  53. package/dist/endpoints/fileExistsHandler.d.mts +12 -0
  54. package/dist/endpoints/{tusFileExistsHandler.mjs → fileExistsHandler.mjs} +7 -7
  55. package/dist/endpoints/fileExistsHandler.mjs.map +1 -0
  56. package/dist/endpoints/muxAssetHandler.d.mts +1 -0
  57. package/dist/endpoints/muxAssetHandler.mjs +3 -3
  58. package/dist/endpoints/muxAssetHandler.mjs.map +1 -1
  59. package/dist/endpoints/muxCreateUploadHandler.mjs.map +1 -1
  60. package/dist/endpoints/muxWebhookHandler.d.mts +1 -0
  61. package/dist/endpoints/muxWebhookHandler.mjs +6 -5
  62. package/dist/endpoints/muxWebhookHandler.mjs.map +1 -1
  63. package/dist/endpoints/tusCleanupHandler.d.mts +3 -2
  64. package/dist/endpoints/tusCleanupHandler.mjs +4 -4
  65. package/dist/endpoints/tusCleanupHandler.mjs.map +1 -1
  66. package/dist/endpoints/tusFolderHandler.d.mts +12 -0
  67. package/dist/endpoints/tusFolderHandler.mjs +39 -0
  68. package/dist/endpoints/tusFolderHandler.mjs.map +1 -0
  69. package/dist/endpoints/tusPostProcessorHandler.d.mts +3 -2
  70. package/dist/endpoints/tusPostProcessorHandler.mjs +6 -5
  71. package/dist/endpoints/tusPostProcessorHandler.mjs.map +1 -1
  72. package/dist/fields/alt.d.mts +7 -0
  73. package/dist/fields/alt.mjs +10 -0
  74. package/dist/fields/alt.mjs.map +1 -0
  75. package/dist/fields/filename.d.mts +7 -0
  76. package/dist/fields/filename.mjs +14 -0
  77. package/dist/fields/filename.mjs.map +1 -0
  78. package/dist/fields/height.d.mts +7 -0
  79. package/dist/fields/height.mjs +15 -0
  80. package/dist/fields/height.mjs.map +1 -0
  81. package/dist/fields/mux.d.mts +7 -0
  82. package/dist/fields/mux.mjs +149 -0
  83. package/dist/fields/mux.mjs.map +1 -0
  84. package/dist/fields/path.d.mts +7 -0
  85. package/dist/fields/path.mjs +14 -0
  86. package/dist/fields/path.mjs.map +1 -0
  87. package/dist/fields/storage.d.mts +7 -0
  88. package/dist/fields/storage.mjs +18 -0
  89. package/dist/fields/storage.mjs.map +1 -0
  90. package/dist/fields/thumbnail.d.mts +7 -0
  91. package/dist/fields/thumbnail.mjs +17 -0
  92. package/dist/fields/thumbnail.mjs.map +1 -0
  93. package/dist/fields/width.d.mts +7 -0
  94. package/dist/fields/width.mjs +15 -0
  95. package/dist/fields/width.mjs.map +1 -0
  96. package/dist/hooks/useErrorHandler.d.mts +1 -1
  97. package/dist/hooks/useErrorHandler.mjs +26 -7
  98. package/dist/hooks/useErrorHandler.mjs.map +1 -1
  99. package/dist/hooks/useMediaCloudEmitter.mjs.map +1 -1
  100. package/dist/plugin.d.mts +5 -4
  101. package/dist/plugin.mjs +53 -29
  102. package/dist/plugin.mjs.map +1 -1
  103. package/dist/tus/stores/s3/{expiration-manager.d.mts → expirationManager.d.mts} +4 -3
  104. package/dist/tus/stores/s3/{expiration-manager.mjs → expirationManager.mjs} +6 -3
  105. package/dist/tus/stores/s3/expirationManager.mjs.map +1 -0
  106. package/dist/tus/stores/s3/{file-operations.d.mts → fileOperations.d.mts} +2 -2
  107. package/dist/tus/stores/s3/{file-operations.mjs → fileOperations.mjs} +2 -2
  108. package/dist/tus/stores/s3/fileOperations.mjs.map +1 -0
  109. package/dist/tus/stores/s3/index.d.mts +1 -1
  110. package/dist/tus/stores/s3/index.mjs +20 -9
  111. package/dist/tus/stores/s3/index.mjs.map +1 -1
  112. package/dist/tus/stores/s3/{metadata-manager.d.mts → metadataManager.d.mts} +4 -2
  113. package/dist/tus/stores/s3/{metadata-manager.mjs → metadataManager.mjs} +6 -5
  114. package/dist/tus/stores/s3/metadataManager.mjs.map +1 -0
  115. package/dist/tus/stores/s3/{parts-manager.d.mts → partsManager.d.mts} +4 -4
  116. package/dist/tus/stores/s3/{parts-manager.mjs → partsManager.mjs} +67 -29
  117. package/dist/tus/stores/s3/partsManager.mjs.map +1 -0
  118. package/dist/tus/stores/s3/{s3-store.d.mts → s3Store.d.mts} +38 -32
  119. package/dist/tus/stores/s3/{s3-store.mjs → s3Store.mjs} +104 -59
  120. package/dist/tus/stores/s3/s3Store.mjs.map +1 -0
  121. package/dist/tus/stores/s3/semaphore.mjs.map +1 -1
  122. package/dist/types/errors.d.mts +32 -0
  123. package/dist/types/errors.mjs +32 -0
  124. package/dist/types/errors.mjs.map +1 -1
  125. package/dist/types/index.d.mts +42 -4
  126. package/dist/utils/buildS3Path.d.mts +10 -0
  127. package/dist/utils/buildS3Path.mjs +16 -0
  128. package/dist/utils/buildS3Path.mjs.map +1 -0
  129. package/dist/utils/buildThumbnailURL.d.mts +14 -0
  130. package/dist/utils/buildThumbnailURL.mjs +10 -0
  131. package/dist/utils/buildThumbnailURL.mjs.map +1 -0
  132. package/dist/utils/defaultOptions.d.mts +7 -0
  133. package/dist/utils/defaultOptions.mjs +12 -0
  134. package/dist/utils/defaultOptions.mjs.map +1 -0
  135. package/dist/utils/file.d.mts +16 -2
  136. package/dist/utils/file.mjs +58 -6
  137. package/dist/utils/file.mjs.map +1 -1
  138. package/dist/utils/mux.mjs +19 -8
  139. package/dist/utils/mux.mjs.map +1 -1
  140. package/dist/utils/tus.d.mts +9 -6
  141. package/dist/utils/tus.mjs +31 -11
  142. package/dist/utils/tus.mjs.map +1 -1
  143. package/package.json +11 -4
  144. package/dist/components/mux-preview/index.d.mts +0 -2
  145. package/dist/components/mux-preview/index.mjs +0 -3
  146. package/dist/components/mux-preview/mux-preview.mjs +0 -29
  147. package/dist/components/mux-preview/mux-preview.mjs.map +0 -1
  148. package/dist/components/upload-handler/index.d.mts +0 -2
  149. package/dist/components/upload-handler/index.mjs +0 -3
  150. package/dist/components/upload-handler/upload-handler.d.mts +0 -22
  151. package/dist/components/upload-handler/upload-handler.mjs.map +0 -1
  152. package/dist/components/upload-manager/index.d.mts +0 -2
  153. package/dist/components/upload-manager/index.mjs +0 -3
  154. package/dist/components/upload-manager/upload-manager.mjs +0 -273
  155. package/dist/components/upload-manager/upload-manager.mjs.map +0 -1
  156. package/dist/endpoints/tusFileExistsHandler.d.mts +0 -11
  157. package/dist/endpoints/tusFileExistsHandler.mjs.map +0 -1
  158. package/dist/tus/stores/s3/expiration-manager.mjs.map +0 -1
  159. package/dist/tus/stores/s3/file-operations.mjs.map +0 -1
  160. package/dist/tus/stores/s3/metadata-manager.mjs.map +0 -1
  161. package/dist/tus/stores/s3/parts-manager.mjs.map +0 -1
  162. package/dist/tus/stores/s3/s3-store.mjs.map +0 -1
  163. /package/dist/components/{upload-manager/upload-manager.css → uploadManager/uploadManager.css} +0 -0
@@ -0,0 +1,149 @@
1
+ //#region src/fields/mux.ts
2
+ const muxField = {
3
+ name: "mux",
4
+ label: "Mux",
5
+ type: "group",
6
+ admin: {
7
+ disableListColumn: true,
8
+ disableBulkEdit: true,
9
+ disableListFilter: true,
10
+ readOnly: true,
11
+ condition: (data) => {
12
+ return data.storage === "mux";
13
+ }
14
+ },
15
+ fields: [
16
+ {
17
+ name: "preview",
18
+ type: "ui",
19
+ admin: {
20
+ condition: (data) => {
21
+ return data.storage === "mux";
22
+ },
23
+ disableListColumn: true,
24
+ components: { Field: "@maas/payload-plugin-media-cloud/components#MuxPreview" }
25
+ }
26
+ },
27
+ {
28
+ name: "status",
29
+ label: "Status",
30
+ type: "text"
31
+ },
32
+ {
33
+ name: "uploadId",
34
+ label: "Upload ID",
35
+ type: "text"
36
+ },
37
+ {
38
+ name: "assetId",
39
+ label: "Asset ID",
40
+ type: "text"
41
+ },
42
+ {
43
+ name: "playbackId",
44
+ label: "Playback ID",
45
+ type: "text"
46
+ },
47
+ {
48
+ name: "aspectRatio",
49
+ label: "Aspect Ratio",
50
+ type: "text"
51
+ },
52
+ {
53
+ name: "duration",
54
+ label: "Duration",
55
+ type: "number"
56
+ },
57
+ {
58
+ name: "tracks",
59
+ label: "Tracks",
60
+ type: "json",
61
+ typescriptSchema: [({ jsonSchema }) => ({
62
+ ...jsonSchema,
63
+ type: "array",
64
+ items: [{
65
+ type: "object",
66
+ properties: {
67
+ type: {
68
+ type: "string",
69
+ enum: ["audio", "video"]
70
+ },
71
+ id: { type: "string" },
72
+ duration: { type: "number" },
73
+ primary: { type: "boolean" },
74
+ max_channels: { type: "number" },
75
+ max_channel_layout: { type: "string" },
76
+ max_width: { type: "number" },
77
+ max_height: { type: "number" },
78
+ max_frame_rate: { type: "number" }
79
+ },
80
+ required: [
81
+ "type",
82
+ "id",
83
+ "duration",
84
+ "primary",
85
+ "max_channels",
86
+ "max_channel_layout",
87
+ "max_width",
88
+ "max_height",
89
+ "max_frame_rate"
90
+ ]
91
+ }]
92
+ })]
93
+ },
94
+ {
95
+ name: "maxResolutionTier",
96
+ label: "Max Resolution Tier",
97
+ type: "text"
98
+ },
99
+ {
100
+ name: "videoQuality",
101
+ label: "Video Quality",
102
+ type: "text"
103
+ },
104
+ {
105
+ name: "staticRenditions",
106
+ label: "Static Renditions",
107
+ type: "json",
108
+ typescriptSchema: [({ jsonSchema }) => ({
109
+ ...jsonSchema,
110
+ type: "object",
111
+ properties: { files: {
112
+ type: "array",
113
+ items: {
114
+ type: "object",
115
+ properties: {
116
+ type: { type: "string" },
117
+ status: { type: "string" },
118
+ resolution: { type: "string" },
119
+ name: { type: "string" },
120
+ id: { type: "string" },
121
+ ext: { type: "string" },
122
+ width: { type: "number" },
123
+ height: { type: "number" },
124
+ filesize: { type: "string" },
125
+ bitrate: { type: "number" }
126
+ }
127
+ },
128
+ required: [
129
+ "type",
130
+ "status",
131
+ "resolution",
132
+ "name",
133
+ "id",
134
+ "ext",
135
+ "width",
136
+ "height",
137
+ "filesize",
138
+ "bitrate"
139
+ ]
140
+ } },
141
+ required: ["files"]
142
+ })]
143
+ }
144
+ ]
145
+ };
146
+
147
+ //#endregion
148
+ export { muxField };
149
+ //# sourceMappingURL=mux.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mux.mjs","names":["GroupField","muxField","name","label","type","admin","disableListColumn","disableBulkEdit","disableListFilter","readOnly","condition","data","storage","fields","components","Field","typescriptSchema","jsonSchema","items","properties","enum","id","duration","primary","max_channels","max_channel_layout","max_width","max_height","max_frame_rate","required","files","status","resolution","ext","width","height","filesize","bitrate"],"sources":["../../src/fields/mux.ts"],"sourcesContent":["import type { GroupField } from 'payload'\n\nexport const muxField: GroupField = {\n name: 'mux',\n label: 'Mux',\n type: 'group',\n admin: {\n disableListColumn: true,\n disableBulkEdit: true,\n disableListFilter: true,\n readOnly: true,\n condition: (data) => {\n return data.storage === 'mux'\n },\n },\n fields: [\n {\n name: 'preview',\n type: 'ui',\n admin: {\n condition: (data) => {\n return data.storage === 'mux'\n },\n disableListColumn: true,\n components: {\n Field: '@maas/payload-plugin-media-cloud/components#MuxPreview',\n },\n },\n },\n {\n name: 'status',\n label: 'Status',\n type: 'text',\n },\n {\n name: 'uploadId',\n label: 'Upload ID',\n type: 'text',\n },\n {\n name: 'assetId',\n label: 'Asset ID',\n type: 'text',\n },\n {\n name: 'playbackId',\n label: 'Playback ID',\n type: 'text',\n },\n {\n name: 'aspectRatio',\n label: 'Aspect Ratio',\n type: 'text',\n },\n {\n name: 'duration',\n label: 'Duration',\n type: 'number',\n },\n {\n name: 'tracks',\n label: 'Tracks',\n type: 'json',\n typescriptSchema: [\n ({ jsonSchema }) => ({\n ...jsonSchema,\n type: 'array',\n items: [\n {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n enum: ['audio', 'video'],\n },\n id: {\n type: 'string',\n },\n duration: {\n type: 'number',\n },\n primary: {\n type: 'boolean',\n },\n max_channels: {\n type: 'number',\n },\n max_channel_layout: {\n type: 'string',\n },\n max_width: {\n type: 'number',\n },\n max_height: {\n type: 'number',\n },\n max_frame_rate: {\n type: 'number',\n },\n },\n required: [\n 'type',\n 'id',\n 'duration',\n 'primary',\n 'max_channels',\n 'max_channel_layout',\n 'max_width',\n 'max_height',\n 'max_frame_rate',\n ],\n },\n ],\n }),\n ],\n },\n {\n name: 'maxResolutionTier',\n label: 'Max Resolution Tier',\n type: 'text',\n },\n {\n name: 'videoQuality',\n label: 'Video Quality',\n type: 'text',\n },\n {\n name: 'staticRenditions',\n label: 'Static Renditions',\n type: 'json',\n typescriptSchema: [\n ({ jsonSchema }) => ({\n ...jsonSchema,\n type: 'object',\n properties: {\n files: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n },\n status: {\n type: 'string',\n },\n resolution: {\n type: 'string',\n },\n name: {\n type: 'string',\n },\n id: {\n type: 'string',\n },\n ext: {\n type: 'string',\n },\n width: {\n type: 'number',\n },\n height: {\n type: 'number',\n },\n filesize: {\n type: 'string',\n },\n bitrate: {\n type: 'number',\n },\n },\n },\n required: [\n 'type',\n 'status',\n 'resolution',\n 'name',\n 'id',\n 'ext',\n 'width',\n 'height',\n 'filesize',\n 'bitrate',\n ],\n },\n },\n required: ['files'],\n }),\n ],\n },\n ],\n}\n"],"mappings":";AAEA,MAAaC,WAAuB;CAClCC,MAAM;CACNC,OAAO;CACPC,MAAM;CACNC,OAAO;EACLC,mBAAmB;EACnBC,iBAAiB;EACjBC,mBAAmB;EACnBC,UAAU;EACVC,YAAYC,SAAS;AACnB,UAAOA,KAAKC,YAAY;;EAE3B;CACDC,QAAQ;EACN;GACEX,MAAM;GACNE,MAAM;GACNC,OAAO;IACLK,YAAYC,SAAS;AACnB,YAAOA,KAAKC,YAAY;;IAE1BN,mBAAmB;IACnBQ,YAAY,EACVC,OAAO,0DACT;IACF;GACD;EACD;GACEb,MAAM;GACNC,OAAO;GACPC,MAAM;GACP;EACD;GACEF,MAAM;GACNC,OAAO;GACPC,MAAM;GACP;EACD;GACEF,MAAM;GACNC,OAAO;GACPC,MAAM;GACP;EACD;GACEF,MAAM;GACNC,OAAO;GACPC,MAAM;GACP;EACD;GACEF,MAAM;GACNC,OAAO;GACPC,MAAM;GACP;EACD;GACEF,MAAM;GACNC,OAAO;GACPC,MAAM;GACP;EACD;GACEF,MAAM;GACNC,OAAO;GACPC,MAAM;GACNY,kBAAkB,EACf,EAAEC,kBAAkB;IACnB,GAAGA;IACHb,MAAM;IACNc,OAAO,CACL;KACEd,MAAM;KACNe,YAAY;MACVf,MAAM;OACJA,MAAM;OACNgB,MAAM,CAAC,SAAS,QAAO;OACxB;MACDC,IAAI,EACFjB,MAAM,UACP;MACDkB,UAAU,EACRlB,MAAM,UACP;MACDmB,SAAS,EACPnB,MAAM,WACP;MACDoB,cAAc,EACZpB,MAAM,UACP;MACDqB,oBAAoB,EAClBrB,MAAM,UACP;MACDsB,WAAW,EACTtB,MAAM,UACP;MACDuB,YAAY,EACVvB,MAAM,UACP;MACDwB,gBAAgB,EACdxB,MAAM,UACR;MACD;KACDyB,UAAU;MACR;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MAAgB;KAEnB,CAAA;IAEJ,EAAC;GAEL;EACD;GACE3B,MAAM;GACNC,OAAO;GACPC,MAAM;GACP;EACD;GACEF,MAAM;GACNC,OAAO;GACPC,MAAM;GACP;EACD;GACEF,MAAM;GACNC,OAAO;GACPC,MAAM;GACNY,kBAAkB,EACf,EAAEC,kBAAkB;IACnB,GAAGA;IACHb,MAAM;IACNe,YAAY,EACVW,OAAO;KACL1B,MAAM;KACNc,OAAO;MACLd,MAAM;MACNe,YAAY;OACVf,MAAM,EACJA,MAAM,UACP;OACD2B,QAAQ,EACN3B,MAAM,UACP;OACD4B,YAAY,EACV5B,MAAM,UACP;OACDF,MAAM,EACJE,MAAM,UACP;OACDiB,IAAI,EACFjB,MAAM,UACP;OACD6B,KAAK,EACH7B,MAAM,UACP;OACD8B,OAAO,EACL9B,MAAM,UACP;OACD+B,QAAQ,EACN/B,MAAM,UACP;OACDgC,UAAU,EACRhC,MAAM,UACP;OACDiC,SAAS,EACPjC,MAAM,UACR;OACF;MACD;KACDyB,UAAU;MACR;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MAAS;KAEb,EACD;IACDA,UAAU,CAAC,QAAO;IACnB,EAAC;GAEL;EAAA;CAEJ"}
@@ -0,0 +1,7 @@
1
+ import { TextField } from "payload";
2
+
3
+ //#region src/fields/path.d.ts
4
+ declare const pathField: TextField;
5
+ //#endregion
6
+ export { pathField };
7
+ //# sourceMappingURL=path.d.mts.map
@@ -0,0 +1,14 @@
1
+ //#region src/fields/path.ts
2
+ const pathField = {
3
+ type: "text",
4
+ name: "path",
5
+ unique: true,
6
+ admin: {
7
+ hidden: true,
8
+ readOnly: true
9
+ }
10
+ };
11
+
12
+ //#endregion
13
+ export { pathField };
14
+ //# sourceMappingURL=path.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.mjs","names":["TextField","pathField","type","name","unique","admin","hidden","readOnly"],"sources":["../../src/fields/path.ts"],"sourcesContent":["import type { TextField } from 'payload'\n\nexport const pathField: TextField = {\n type: 'text',\n name: 'path',\n unique: true,\n admin: {\n hidden: true,\n readOnly: true,\n },\n}\n"],"mappings":";AAEA,MAAaC,YAAuB;CAClCC,MAAM;CACNC,MAAM;CACNC,QAAQ;CACRC,OAAO;EACLC,QAAQ;EACRC,UAAU;EACZ;CACD"}
@@ -0,0 +1,7 @@
1
+ import { SelectField } from "payload";
2
+
3
+ //#region src/fields/storage.d.ts
4
+ declare const storageField: SelectField;
5
+ //#endregion
6
+ export { storageField };
7
+ //# sourceMappingURL=storage.d.mts.map
@@ -0,0 +1,18 @@
1
+ //#region src/fields/storage.ts
2
+ const storageField = {
3
+ name: "storage",
4
+ label: "Storage",
5
+ type: "select",
6
+ options: [{
7
+ label: "Mux",
8
+ value: "mux"
9
+ }, {
10
+ label: "S3",
11
+ value: "s3"
12
+ }],
13
+ admin: { readOnly: true }
14
+ };
15
+
16
+ //#endregion
17
+ export { storageField };
18
+ //# sourceMappingURL=storage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.mjs","names":["SelectField","storageField","name","label","type","options","value","admin","readOnly"],"sources":["../../src/fields/storage.ts"],"sourcesContent":["import type { SelectField } from 'payload'\n\nexport const storageField: SelectField = {\n name: 'storage',\n label: 'Storage',\n type: 'select',\n options: [\n {\n label: 'Mux',\n value: 'mux',\n },\n {\n label: 'S3',\n value: 's3',\n },\n ],\n admin: {\n readOnly: true,\n },\n}\n"],"mappings":";AAEA,MAAaC,eAA4B;CACvCC,MAAM;CACNC,OAAO;CACPC,MAAM;CACNC,SAAS,CACP;EACEF,OAAO;EACPG,OAAO;EACR,EACD;EACEH,OAAO;EACPG,OAAO;EACR,CACF;CACDC,OAAO,EACLC,UAAU,MACZ;CACD"}
@@ -0,0 +1,7 @@
1
+ import { TextField } from "payload";
2
+
3
+ //#region src/fields/thumbnail.d.ts
4
+ declare const thumbnailField: TextField;
5
+ //#endregion
6
+ export { thumbnailField };
7
+ //# sourceMappingURL=thumbnail.d.mts.map
@@ -0,0 +1,17 @@
1
+ //#region src/fields/thumbnail.ts
2
+ const thumbnailField = {
3
+ type: "text",
4
+ name: "thumbnail",
5
+ admin: {
6
+ readOnly: true,
7
+ hidden: true,
8
+ disableListColumn: true,
9
+ disableListFilter: true,
10
+ disableBulkEdit: true,
11
+ disableGroupBy: true
12
+ }
13
+ };
14
+
15
+ //#endregion
16
+ export { thumbnailField };
17
+ //# sourceMappingURL=thumbnail.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thumbnail.mjs","names":["TextField","thumbnailField","type","name","admin","readOnly","hidden","disableListColumn","disableListFilter","disableBulkEdit","disableGroupBy"],"sources":["../../src/fields/thumbnail.ts"],"sourcesContent":["import { TextField } from 'payload'\n\nexport const thumbnailField: TextField = {\n type: 'text',\n name: 'thumbnail',\n admin: {\n readOnly: true,\n hidden: true,\n disableListColumn: true,\n disableListFilter: true,\n disableBulkEdit: true,\n disableGroupBy: true,\n },\n}\n"],"mappings":";AAEA,MAAaC,iBAA4B;CACvCC,MAAM;CACNC,MAAM;CACNC,OAAO;EACLC,UAAU;EACVC,QAAQ;EACRC,mBAAmB;EACnBC,mBAAmB;EACnBC,iBAAiB;EACjBC,gBAAgB;EAClB;CACD"}
@@ -0,0 +1,7 @@
1
+ import { TextField } from "payload";
2
+
3
+ //#region src/fields/width.d.ts
4
+ declare const widthField: TextField;
5
+ //#endregion
6
+ export { widthField };
7
+ //# sourceMappingURL=width.d.mts.map
@@ -0,0 +1,15 @@
1
+ //#region src/fields/width.ts
2
+ const widthField = {
3
+ name: "width",
4
+ label: "Width",
5
+ type: "text",
6
+ admin: {
7
+ readOnly: true,
8
+ hidden: false,
9
+ width: "50%"
10
+ }
11
+ };
12
+
13
+ //#endregion
14
+ export { widthField };
15
+ //# sourceMappingURL=width.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"width.mjs","names":["TextField","widthField","name","label","type","admin","readOnly","hidden","width"],"sources":["../../src/fields/width.ts"],"sourcesContent":["import type { TextField } from 'payload'\n\nexport const widthField: TextField = {\n name: 'width',\n label: 'Width',\n type: 'text',\n admin: {\n readOnly: true,\n hidden: false,\n width: '50%',\n },\n}\n"],"mappings":";AAEA,MAAaC,aAAwB;CACnCC,MAAM;CACNC,OAAO;CACPC,MAAM;CACNC,OAAO;EACLC,UAAU;EACVC,QAAQ;EACRC,OAAO;EACT;CACD"}
@@ -1,7 +1,7 @@
1
1
  import { UseMagicErrorReturn } from "@maas/error-handler";
2
2
 
3
3
  //#region src/hooks/useErrorHandler.d.ts
4
- declare function useErrorHandler(): Omit<UseMagicErrorReturn, 'assert' | 'MagicError'>;
4
+ declare function useErrorHandler(): Omit<UseMagicErrorReturn, 'MagicError'>;
5
5
  //#endregion
6
6
  export { useErrorHandler };
7
7
  //# sourceMappingURL=useErrorHandler.d.mts.map
@@ -1,14 +1,33 @@
1
1
  import { useMagicError } from "../error-handler/dist/index.mjs";
2
+ import { c } from "react/compiler-runtime";
2
3
 
3
4
  //#region src/hooks/useErrorHandler.ts
4
5
  function useErrorHandler() {
5
- const { log, logError, throwError, logWarning } = useMagicError({ prefix: "PLUGIN-MEDIA-CLOUD" });
6
- return {
7
- log,
8
- logError,
9
- throwError,
10
- logWarning
11
- };
6
+ const $ = c(7);
7
+ let t0;
8
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
9
+ t0 = { prefix: "PLUGIN-MEDIA-CLOUD" };
10
+ $[0] = t0;
11
+ } else t0 = $[0];
12
+ const magicError = useMagicError(t0);
13
+ const { log, logError, throwError, logWarning } = magicError;
14
+ let t1;
15
+ if ($[1] !== log || $[2] !== logError || $[3] !== logWarning || $[4] !== magicError.assert || $[5] !== throwError) {
16
+ t1 = {
17
+ log,
18
+ logError,
19
+ throwError,
20
+ logWarning,
21
+ assert: magicError.assert
22
+ };
23
+ $[1] = log;
24
+ $[2] = logError;
25
+ $[3] = logWarning;
26
+ $[4] = magicError.assert;
27
+ $[5] = throwError;
28
+ $[6] = t1;
29
+ } else t1 = $[6];
30
+ return t1;
12
31
  }
13
32
 
14
33
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"useErrorHandler.mjs","names":[],"sources":["../../src/hooks/useErrorHandler.ts"],"sourcesContent":["import { useMagicError, type UseMagicErrorReturn } from '@maas/error-handler'\n\nexport function useErrorHandler(): Omit<\n UseMagicErrorReturn,\n 'assert' | 'MagicError'\n> {\n const { log, logError, throwError, logWarning } = useMagicError({\n prefix: 'PLUGIN-MEDIA-CLOUD',\n })\n\n return {\n log,\n logError,\n throwError,\n logWarning,\n }\n}\n"],"mappings":";;;AAEA,SAAgB,kBAGd;CACA,MAAM,EAAE,KAAK,UAAU,YAAY,eAAe,cAAc,EAC9D,QAAQ,sBACT,CAAC;AAEF,QAAO;EACL;EACA;EACA;EACA;EACD"}
1
+ {"version":3,"file":"useErrorHandler.mjs","names":["useMagicError","UseMagicErrorReturn","useErrorHandler","$","_c","t0","Symbol","for","prefix","magicError","log","logError","throwError","logWarning","t1","assert"],"sources":["../../src/hooks/useErrorHandler.ts"],"sourcesContent":["import { useMagicError, type UseMagicErrorReturn } from '@maas/error-handler'\n\nexport function useErrorHandler(): Omit<UseMagicErrorReturn, 'MagicError'> {\n const magicError: UseMagicErrorReturn = useMagicError({\n prefix: 'PLUGIN-MEDIA-CLOUD',\n })\n\n const { log, logError, throwError, logWarning } = magicError\n\n return {\n log,\n logError,\n throwError,\n logWarning,\n assert: magicError.assert,\n }\n}\n"],"mappings":";;;;AAEA,SAAOE,kBAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAA,IAAAC;AAAA,KAAAF,EAAA,OAAAG,OAAAC,IAAA,4BAAA,EAAA;AACiDF,OAAA,EAAAG,QAC5C,sBACT;AAAAL,IAAA,KAAAE;OAAAA,MAAAF,EAAA;CAFD,MAAAM,aAAwCT,cAAcK,GAEpD;CAEF,MAAA,EAAAK,KAAAC,UAAAC,YAAAC,eAAkDJ;CAAU,IAAAK;AAAA,KAAAX,EAAA,OAAAO,OAAAP,EAAA,OAAAQ,YAAAR,EAAA,OAAAU,cAAAV,EAAA,OAAAM,WAAAM,UAAAZ,EAAA,OAAAS,YAAA;AAErDE,OAAA;GAAAJ;GAAAC;GAAAC;GAAAC;GAAAE,QAKGN,WAAUM;GACnB;AAAAZ,IAAA,KAAAO;AAAAP,IAAA,KAAAQ;AAAAR,IAAA,KAAAU;AAAAV,IAAA,KAAAM,WAAAM;AAAAZ,IAAA,KAAAS;AAAAT,IAAA,KAAAW;OAAAA,MAAAX,EAAA;AAAA,QANMW"}
@@ -1 +1 @@
1
- {"version":3,"file":"useMediaCloudEmitter.mjs","names":[],"sources":["../../src/hooks/useMediaCloudEmitter.ts"],"sourcesContent":["import mitt from 'mitt'\nimport type { MediaCloudEmitterEvents } from '../types'\n\nconst emitter = mitt<MediaCloudEmitterEvents>()\n\n/**\n * Hook to access the global event emitter for upload management\n * @returns An object with emitter methods (on, off, emit)\n */\nfunction useMediaCloudEmitter() {\n return {\n on: emitter.on,\n off: emitter.off,\n emit: emitter.emit,\n }\n}\n\nexport { useMediaCloudEmitter }\n"],"mappings":";;;AAGA,MAAM,UAAU,MAA+B;;;;;AAM/C,SAAS,uBAAuB;AAC9B,QAAO;EACL,IAAI,QAAQ;EACZ,KAAK,QAAQ;EACb,MAAM,QAAQ;EACf"}
1
+ {"version":3,"file":"useMediaCloudEmitter.mjs","names":["mitt","MediaCloudEmitterEvents","emitter","useMediaCloudEmitter","on","off","emit"],"sources":["../../src/hooks/useMediaCloudEmitter.ts"],"sourcesContent":["import mitt from 'mitt'\nimport type { MediaCloudEmitterEvents } from '../types'\n\nconst emitter = mitt<MediaCloudEmitterEvents>()\n\n/**\n * Hook to access the global event emitter for upload management\n * @returns An object with emitter methods (on, off, emit)\n */\nfunction useMediaCloudEmitter() {\n return {\n on: emitter.on,\n off: emitter.off,\n emit: emitter.emit,\n }\n}\n\nexport { useMediaCloudEmitter }\n"],"mappings":";;;AAGA,MAAME,UAAUF,MAA+B;;;;;AAM/C,SAASG,uBAAuB;AAC9B,QAAO;EACLC,IAAIF,QAAQE;EACZC,KAAKH,QAAQG;EACbC,MAAMJ,QAAQI;EACf"}
package/dist/plugin.d.mts CHANGED
@@ -1,14 +1,15 @@
1
1
  import { MediaCloudPluginOptions } from "./types/index.mjs";
2
+ import { S3Store } from "./tus/stores/s3/s3Store.mjs";
2
3
  import { Config } from "payload";
3
4
 
4
5
  //#region src/plugin.d.ts
5
-
6
+ declare let s3Store: S3Store | null;
6
7
  /**
7
8
  * Media Cloud Plugin for Payload CMS
8
- * @param pluginOptions Configuration options
9
+ * @param options Configuration options
9
10
  * @returns Payload config function
10
11
  */
11
- declare function mediaCloudPlugin(pluginOptions: MediaCloudPluginOptions): (config: Config) => Config;
12
+ declare function mediaCloudPlugin(options: MediaCloudPluginOptions): (config: Config) => Config;
12
13
  //#endregion
13
- export { mediaCloudPlugin };
14
+ export { mediaCloudPlugin, s3Store };
14
15
  //# sourceMappingURL=plugin.d.mts.map
package/dist/plugin.mjs CHANGED
@@ -3,73 +3,92 @@ import { useErrorHandler } from "./hooks/useErrorHandler.mjs";
3
3
  import { getStorageAdapter } from "./adapter/storageAdapter.mjs";
4
4
  import { getMediaCollection } from "./collections/mediaCollection.mjs";
5
5
  import { createS3Store } from "./tus/stores/s3/index.mjs";
6
- import { createMuxClient, createMuxEndpoints, validateMuxConfig } from "./utils/mux.mjs";
6
+ import { createMuxClient, createMuxEndpoints } from "./utils/mux.mjs";
7
+ import { createFileEndpoints } from "./utils/file.mjs";
7
8
  import { createTusEndpoints, createTusServer } from "./utils/tus.mjs";
9
+ import { defaultOptions } from "./utils/defaultOptions.mjs";
10
+ import { defu } from "defu";
8
11
  import { cloudStoragePlugin } from "@payloadcms/plugin-cloud-storage";
9
12
  import { initClientUploads } from "@payloadcms/plugin-cloud-storage/utilities";
10
13
 
11
14
  //#region src/plugin.ts
12
15
  const { logError } = useErrorHandler();
13
16
  let muxClient = null;
17
+ let s3Store = null;
18
+ let tusServer = null;
14
19
  /**
15
20
  * Media Cloud Plugin for Payload CMS
16
- * @param pluginOptions Configuration options
21
+ * @param options Configuration options
17
22
  * @returns Payload config function
18
23
  */
19
- function mediaCloudPlugin(pluginOptions) {
24
+ function mediaCloudPlugin(options) {
20
25
  return function(config) {
21
- if (!pluginOptions) {
26
+ if (!options) {
22
27
  logError(MediaCloudErrors.PLUGIN_NOT_CONFIGURED.message);
23
28
  return config;
24
29
  }
30
+ const pluginOptions = defu(options, defaultOptions);
25
31
  if (pluginOptions.enabled === false) return config;
26
32
  /**
27
33
  * Helper function to get or create Mux client instance
28
34
  * @returns Mux client instance
29
35
  */
30
36
  function getMuxClient() {
31
- if (muxClient) return muxClient;
32
- return createMuxClient(pluginOptions.mux);
37
+ return muxClient ?? createMuxClient(pluginOptions.mux);
33
38
  }
34
- if (pluginOptions.mux) {
35
- validateMuxConfig(pluginOptions.mux);
36
- muxClient = getMuxClient();
37
- } else {
38
- logError(MediaCloudErrors.MUX_CONFIG_INCOMPLETE.message);
39
- muxClient = null;
39
+ /**
40
+ * Helper function to get or create S3 store instance
41
+ * @returns S3 store instance
42
+ */
43
+ function getS3Store() {
44
+ return s3Store ?? createS3Store(pluginOptions.s3);
45
+ }
46
+ /**
47
+ * Helper function to get or create tus server instance
48
+ * @returns TUS server instance
49
+ */
50
+ function getTusServer() {
51
+ return tusServer ?? createTusServer({
52
+ getS3Store,
53
+ pluginOptions
54
+ });
55
+ }
56
+ if (pluginOptions.mux) muxClient = getMuxClient();
57
+ if (pluginOptions.s3) {
58
+ s3Store = getS3Store();
59
+ tusServer = getTusServer();
40
60
  }
41
- const s3Store = createS3Store(pluginOptions.s3);
42
- const tusServer = createTusServer({
43
- s3Store,
44
- pluginOptions
45
- });
46
61
  const baseCollection = config.collections?.find(({ slug }) => slug === pluginOptions.collection);
62
+ const { view, folders } = pluginOptions;
47
63
  const mediaCollection = getMediaCollection({
48
- s3Store,
49
- baseCollection
64
+ baseCollection,
65
+ view,
66
+ folders
50
67
  });
51
68
  if (baseCollection) config = {
52
69
  ...config,
53
- collections: config.collections?.filter(({ slug }) => slug !== baseCollection?.slug) || []
70
+ collections: config.collections?.filter(({ slug }) => slug !== baseCollection?.slug) ?? []
54
71
  };
55
72
  initClientUploads({
73
+ config,
74
+ enabled: true,
56
75
  clientHandler: "@maas/payload-plugin-media-cloud/components#UploadHandler",
57
- collections: { media: {
76
+ collections: { [mediaCollection.slug]: {
58
77
  clientUploads: true,
59
- disableLocalStorage: true
78
+ disableLocalStorage: true,
79
+ prefix: pluginOptions.s3?.prefix ?? ""
60
80
  } },
61
- config,
62
- enabled: true,
81
+ extraClientHandlerProps: () => ({ pluginOptions }),
63
82
  serverHandler: () => {
64
83
  return Response.json({ message: "Server handler is not implemented" }, { status: 501 });
65
84
  },
66
85
  serverHandlerPath: "/media-cloud/upload"
67
86
  });
68
- const cloudStorageConfig = { collections: { media: {
87
+ const cloudStorageConfig = { collections: { [mediaCollection.slug]: {
69
88
  adapter: getStorageAdapter({
70
89
  getMuxClient,
71
90
  pluginOptions,
72
- s3Store
91
+ getS3Store
73
92
  }),
74
93
  clientUploads: true,
75
94
  disableLocalStorage: true
@@ -87,12 +106,17 @@ function mediaCloudPlugin(pluginOptions) {
87
106
  endpoints: [
88
107
  ...config.endpoints ?? [],
89
108
  ...createTusEndpoints({
90
- tusServer,
91
- s3Store
109
+ getTusServer,
110
+ getS3Store,
111
+ pluginOptions
92
112
  }),
93
113
  ...createMuxEndpoints({
94
114
  getMuxClient,
95
115
  pluginOptions
116
+ }),
117
+ ...createFileEndpoints({
118
+ getS3Store,
119
+ pluginOptions
96
120
  })
97
121
  ]
98
122
  };
@@ -101,5 +125,5 @@ function mediaCloudPlugin(pluginOptions) {
101
125
  }
102
126
 
103
127
  //#endregion
104
- export { mediaCloudPlugin };
128
+ export { mediaCloudPlugin, s3Store };
105
129
  //# sourceMappingURL=plugin.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.mjs","names":["muxClient: Mux | null","mergedConfig: Config"],"sources":["../src/plugin.ts"],"sourcesContent":["import Mux from '@mux/mux-node'\nimport { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage'\nimport { initClientUploads } from '@payloadcms/plugin-cloud-storage/utilities'\n\nimport { MediaCloudErrors } from './types/errors'\nimport { getStorageAdapter } from './adapter/storageAdapter'\nimport { getMediaCollection } from './collections/mediaCollection'\nimport { useErrorHandler } from './hooks/useErrorHandler'\nimport { createS3Store } from './tus/stores/s3'\nimport {\n createMuxClient,\n createMuxEndpoints,\n validateMuxConfig,\n} from './utils/mux'\nimport { createTusEndpoints, createTusServer } from './utils/tus'\n\nimport type { Config } from 'payload'\nimport type { MediaCloudPluginOptions } from './types'\n\nconst { logError } = useErrorHandler()\n\nlet muxClient: Mux | null = null\n\n/**\n * Media Cloud Plugin for Payload CMS\n * @param pluginOptions Configuration options\n * @returns Payload config function\n */\nexport function mediaCloudPlugin(pluginOptions: MediaCloudPluginOptions) {\n return function (config: Config): Config {\n // Early returns for invalid or disabled plugin configuration\n if (!pluginOptions) {\n logError(MediaCloudErrors.PLUGIN_NOT_CONFIGURED.message)\n return config\n }\n\n if (pluginOptions.enabled === false) {\n return config\n }\n\n /**\n * Helper function to get or create Mux client instance\n * @returns Mux client instance\n */\n function getMuxClient(): Mux {\n if (muxClient) {\n return muxClient\n }\n return createMuxClient(pluginOptions.mux)\n }\n\n // Initialize Mux client if configuration is provided\n if (pluginOptions.mux) {\n validateMuxConfig(pluginOptions.mux)\n muxClient = getMuxClient()\n } else {\n logError(MediaCloudErrors.MUX_CONFIG_INCOMPLETE.message)\n muxClient = null\n }\n\n const s3Store = createS3Store(pluginOptions.s3)\n const tusServer = createTusServer({ s3Store, pluginOptions })\n\n // Handle collection extension - replace base collection if it exists\n const baseCollection = config.collections?.find(\n ({ slug }) => slug === pluginOptions.collection\n )\n\n const mediaCollection = getMediaCollection({\n s3Store,\n baseCollection,\n })\n\n if (baseCollection) {\n config = {\n ...config,\n collections:\n config.collections?.filter(\n ({ slug }) => slug !== baseCollection?.slug\n ) || [],\n }\n }\n\n initClientUploads({\n clientHandler:\n '@maas/payload-plugin-media-cloud/components#UploadHandler',\n collections: {\n media: {\n clientUploads: true,\n disableLocalStorage: true,\n },\n },\n config,\n enabled: true,\n serverHandler: () => {\n return Response.json(\n { message: 'Server handler is not implemented' },\n { status: 501 }\n )\n },\n serverHandlerPath: '/media-cloud/upload',\n })\n\n const cloudStorageConfig = {\n collections: {\n media: {\n adapter: getStorageAdapter({ getMuxClient, pluginOptions, s3Store }),\n clientUploads: true,\n disableLocalStorage: true,\n },\n },\n }\n\n const mergedConfig: Config = {\n ...config,\n admin: {\n ...config.admin,\n components: {\n ...config.admin?.components,\n providers: [\n ...(config.admin?.components?.providers ?? []),\n '@maas/payload-plugin-media-cloud/components#UploadManagerProvider',\n ],\n },\n },\n collections: [...(config.collections ?? []), mediaCollection],\n endpoints: [\n ...(config.endpoints ?? []),\n ...createTusEndpoints({ tusServer, s3Store }),\n ...createMuxEndpoints({ getMuxClient, pluginOptions }),\n ],\n }\n\n return cloudStoragePlugin(cloudStorageConfig)(mergedConfig)\n }\n}\n"],"mappings":";;;;;;;;;;;AAmBA,MAAM,EAAE,aAAa,iBAAiB;AAEtC,IAAIA,YAAwB;;;;;;AAO5B,SAAgB,iBAAiB,eAAwC;AACvE,QAAO,SAAU,QAAwB;AAEvC,MAAI,CAAC,eAAe;AAClB,YAAS,iBAAiB,sBAAsB,QAAQ;AACxD,UAAO;;AAGT,MAAI,cAAc,YAAY,MAC5B,QAAO;;;;;EAOT,SAAS,eAAoB;AAC3B,OAAI,UACF,QAAO;AAET,UAAO,gBAAgB,cAAc,IAAI;;AAI3C,MAAI,cAAc,KAAK;AACrB,qBAAkB,cAAc,IAAI;AACpC,eAAY,cAAc;SACrB;AACL,YAAS,iBAAiB,sBAAsB,QAAQ;AACxD,eAAY;;EAGd,MAAM,UAAU,cAAc,cAAc,GAAG;EAC/C,MAAM,YAAY,gBAAgB;GAAE;GAAS;GAAe,CAAC;EAG7D,MAAM,iBAAiB,OAAO,aAAa,MACxC,EAAE,WAAW,SAAS,cAAc,WACtC;EAED,MAAM,kBAAkB,mBAAmB;GACzC;GACA;GACD,CAAC;AAEF,MAAI,eACF,UAAS;GACP,GAAG;GACH,aACE,OAAO,aAAa,QACjB,EAAE,WAAW,SAAS,gBAAgB,KACxC,IAAI,EAAE;GACV;AAGH,oBAAkB;GAChB,eACE;GACF,aAAa,EACX,OAAO;IACL,eAAe;IACf,qBAAqB;IACtB,EACF;GACD;GACA,SAAS;GACT,qBAAqB;AACnB,WAAO,SAAS,KACd,EAAE,SAAS,qCAAqC,EAChD,EAAE,QAAQ,KAAK,CAChB;;GAEH,mBAAmB;GACpB,CAAC;EAEF,MAAM,qBAAqB,EACzB,aAAa,EACX,OAAO;GACL,SAAS,kBAAkB;IAAE;IAAc;IAAe;IAAS,CAAC;GACpE,eAAe;GACf,qBAAqB;GACtB,EACF,EACF;EAED,MAAMC,eAAuB;GAC3B,GAAG;GACH,OAAO;IACL,GAAG,OAAO;IACV,YAAY;KACV,GAAG,OAAO,OAAO;KACjB,WAAW,CACT,GAAI,OAAO,OAAO,YAAY,aAAa,EAAE,EAC7C,oEACD;KACF;IACF;GACD,aAAa,CAAC,GAAI,OAAO,eAAe,EAAE,EAAG,gBAAgB;GAC7D,WAAW;IACT,GAAI,OAAO,aAAa,EAAE;IAC1B,GAAG,mBAAmB;KAAE;KAAW;KAAS,CAAC;IAC7C,GAAG,mBAAmB;KAAE;KAAc;KAAe,CAAC;IACvD;GACF;AAED,SAAO,mBAAmB,mBAAmB,CAAC,aAAa"}
1
+ {"version":3,"file":"plugin.mjs","names":["Mux","defu","cloudStoragePlugin","initClientUploads","MediaCloudErrors","getStorageAdapter","getMediaCollection","useErrorHandler","createS3Store","createMuxClient","createMuxEndpoints","createTusEndpoints","createTusServer","createFileEndpoints","defaultOptions","Config","Server","MediaCloudPluginOptions","S3Store","logError","muxClient","s3Store","tusServer","mediaCloudPlugin","options","config","PLUGIN_NOT_CONFIGURED","message","pluginOptions","enabled","getMuxClient","mux","getS3Store","s3","getTusServer","baseCollection","collections","find","slug","collection","view","folders","mediaCollection","filter","clientHandler","clientUploads","disableLocalStorage","prefix","extraClientHandlerProps","serverHandler","Response","json","status","serverHandlerPath","cloudStorageConfig","adapter","mergedConfig","admin","components","providers","endpoints"],"sources":["../src/plugin.ts"],"sourcesContent":["import Mux from '@mux/mux-node'\nimport { defu } from 'defu'\nimport { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage'\nimport { initClientUploads } from '@payloadcms/plugin-cloud-storage/utilities'\n\nimport { MediaCloudErrors } from './types/errors'\nimport { getStorageAdapter } from './adapter/storageAdapter'\nimport { getMediaCollection } from './collections/mediaCollection'\nimport { useErrorHandler } from './hooks/useErrorHandler'\nimport { createS3Store } from './tus/stores/s3'\nimport { createMuxClient, createMuxEndpoints } from './utils/mux'\nimport { createTusEndpoints, createTusServer } from './utils/tus'\nimport { createFileEndpoints } from './utils/file'\nimport { defaultOptions } from './utils/defaultOptions'\n\nimport type { Config } from 'payload'\nimport type { Server } from '@tus/server'\nimport type { MediaCloudPluginOptions } from './types'\nimport type { S3Store } from './tus/stores/s3/s3Store'\n\nconst { logError } = useErrorHandler()\n\nlet muxClient: Mux | null = null\nlet s3Store: S3Store | null = null\nlet tusServer: Server | null = null\n\n/**\n * Media Cloud Plugin for Payload CMS\n * @param options Configuration options\n * @returns Payload config function\n */\nexport function mediaCloudPlugin(options: MediaCloudPluginOptions) {\n return function (config: Config): Config {\n // Check if config is invalid or disabled\n if (!options) {\n logError(MediaCloudErrors.PLUGIN_NOT_CONFIGURED.message)\n return config\n }\n\n // Merge user options with default options\n const pluginOptions = defu(options, defaultOptions)\n\n // Check if the plugin is disabled\n if (pluginOptions.enabled === false) {\n return config\n }\n\n /**\n * Helper function to get or create Mux client instance\n * @returns Mux client instance\n */\n function getMuxClient(): Mux {\n return muxClient ?? createMuxClient(pluginOptions.mux)\n }\n\n /**\n * Helper function to get or create S3 store instance\n * @returns S3 store instance\n */\n function getS3Store(): S3Store {\n return s3Store ?? createS3Store(pluginOptions.s3)\n }\n\n /**\n * Helper function to get or create tus server instance\n * @returns TUS server instance\n */\n function getTusServer(): Server {\n return tusServer ?? createTusServer({ getS3Store, pluginOptions })\n }\n\n // Initialize Mux client if configuration is provided\n if (pluginOptions.mux) {\n muxClient = getMuxClient()\n }\n\n // Initialize S3 store and TUS server if configuration is provided\n if (pluginOptions.s3) {\n s3Store = getS3Store()\n tusServer = getTusServer()\n }\n\n // Check if base collection exists\n const baseCollection = config.collections?.find(\n ({ slug }) => slug === pluginOptions.collection\n )\n\n const { view, folders } = pluginOptions\n\n const mediaCollection = getMediaCollection({\n baseCollection,\n view,\n folders,\n })\n\n // Remove base collection\n // It’ll be replaced with the merged media collection\n if (baseCollection) {\n config = {\n ...config,\n collections:\n config.collections?.filter(\n ({ slug }) => slug !== baseCollection?.slug\n ) ?? [],\n }\n }\n\n initClientUploads({\n config,\n enabled: true,\n clientHandler:\n '@maas/payload-plugin-media-cloud/components#UploadHandler',\n collections: {\n [mediaCollection.slug]: {\n clientUploads: true,\n disableLocalStorage: true,\n prefix: pluginOptions.s3?.prefix ?? '',\n },\n },\n extraClientHandlerProps: () => ({\n pluginOptions,\n }),\n serverHandler: () => {\n return Response.json(\n { message: 'Server handler is not implemented' },\n { status: 501 }\n )\n },\n serverHandlerPath: '/media-cloud/upload',\n })\n\n const cloudStorageConfig = {\n collections: {\n [mediaCollection.slug]: {\n adapter: getStorageAdapter({\n getMuxClient,\n pluginOptions,\n getS3Store,\n }),\n clientUploads: true,\n disableLocalStorage: true,\n },\n },\n }\n\n const mergedConfig: Config = {\n ...config,\n admin: {\n ...config.admin,\n components: {\n ...config.admin?.components,\n providers: [\n ...(config.admin?.components?.providers ?? []),\n '@maas/payload-plugin-media-cloud/components#UploadManagerProvider',\n ],\n },\n },\n collections: [...(config.collections ?? []), mediaCollection],\n endpoints: [\n ...(config.endpoints ?? []),\n ...createTusEndpoints({ getTusServer, getS3Store, pluginOptions }),\n ...createMuxEndpoints({ getMuxClient, pluginOptions }),\n ...createFileEndpoints({ getS3Store, pluginOptions }),\n ],\n }\n\n return cloudStoragePlugin(cloudStorageConfig)(mergedConfig)\n }\n}\n\nexport { s3Store }\n"],"mappings":";;;;;;;;;;;;;;AAoBA,MAAM,EAAEmB,aAAaZ,iBAAiB;AAEtC,IAAIa,YAAwB;AAC5B,IAAIC,UAA0B;AAC9B,IAAIC,YAA2B;;;;;;AAO/B,SAAgBC,iBAAiBC,SAAkC;AACjE,QAAO,SAAUC,QAAwB;AAEvC,MAAI,CAACD,SAAS;AACZL,YAASf,iBAAiBsB,sBAAsBC,QAAQ;AACxD,UAAOF;;EAIT,MAAMG,gBAAgB3B,KAAKuB,SAASV,eAAe;AAGnD,MAAIc,cAAcC,YAAY,MAC5B,QAAOJ;;;;;EAOT,SAASK,eAAoB;AAC3B,UAAOV,aAAaX,gBAAgBmB,cAAcG,IAAI;;;;;;EAOxD,SAASC,aAAsB;AAC7B,UAAOX,WAAWb,cAAcoB,cAAcK,GAAG;;;;;;EAOnD,SAASC,eAAuB;AAC9B,UAAOZ,aAAaV,gBAAgB;IAAEoB;IAAYJ;IAAe,CAAC;;AAIpE,MAAIA,cAAcG,IAChBX,aAAYU,cAAc;AAI5B,MAAIF,cAAcK,IAAI;AACpBZ,aAAUW,YAAY;AACtBV,eAAYY,cAAc;;EAI5B,MAAMC,iBAAiBV,OAAOW,aAAaC,MACxC,EAAEC,WAAWA,SAASV,cAAcW,WACtC;EAED,MAAM,EAAEC,MAAMC,YAAYb;EAE1B,MAAMc,kBAAkBpC,mBAAmB;GACzC6B;GACAK;GACAC;GACD,CAAC;AAIF,MAAIN,eACFV,UAAS;GACP,GAAGA;GACHW,aACEX,OAAOW,aAAaO,QACjB,EAAEL,WAAWA,SAASH,gBAAgBG,KACxC,IAAI,EAAA;GACR;AAGHnC,oBAAkB;GAChBsB;GACAI,SAAS;GACTe,eACE;GACFR,aAAa,GACVM,gBAAgBJ,OAAO;IACtBO,eAAe;IACfC,qBAAqB;IACrBC,QAAQnB,cAAcK,IAAIc,UAAU;IACtC,EACD;GACDC,gCAAgC,EAC9BpB,eACD;GACDqB,qBAAqB;AACnB,WAAOC,SAASC,KACd,EAAExB,SAAS,qCAAqC,EAChD,EAAEyB,QAAQ,KACZ,CAAC;;GAEHC,mBAAmB;GACpB,CAAC;EAEF,MAAMC,qBAAqB,EACzBlB,aAAa,GACVM,gBAAgBJ,OAAO;GACtBiB,SAASlD,kBAAkB;IACzByB;IACAF;IACAI;IACD,CAAC;GACFa,eAAe;GACfC,qBAAqB;GACvB,EACF,EACD;EAED,MAAMU,eAAuB;GAC3B,GAAG/B;GACHgC,OAAO;IACL,GAAGhC,OAAOgC;IACVC,YAAY;KACV,GAAGjC,OAAOgC,OAAOC;KACjBC,WAAW,CACT,GAAIlC,OAAOgC,OAAOC,YAAYC,aAAa,EAAE,EAC7C,oEAAmE;KAEvE;IACD;GACDvB,aAAa,CAAC,GAAIX,OAAOW,eAAe,EAAE,EAAGM,gBAAgB;GAC7DkB,WAAW;IACT,GAAInC,OAAOmC,aAAa,EAAE;IAC1B,GAAGjD,mBAAmB;KAAEuB;KAAcF;KAAYJ;KAAe,CAAC;IAClE,GAAGlB,mBAAmB;KAAEoB;KAAcF;KAAe,CAAC;IACtD,GAAGf,oBAAoB;KAAEmB;KAAYJ;KAAe,CAAC;IAAA;GAExD;AAED,SAAO1B,mBAAmBoD,mBAAmB,CAACE,aAAa"}
@@ -1,6 +1,7 @@
1
+ import { S3MetadataManager } from "./metadataManager.mjs";
1
2
  import { S3 } from "@aws-sdk/client-s3";
2
3
 
3
- //#region src/tus/stores/s3/expiration-manager.d.ts
4
+ //#region src/tus/stores/s3/expirationManager.d.ts
4
5
  type GetExpirationDateArgs = {
5
6
  createdAt: string;
6
7
  };
@@ -10,7 +11,7 @@ declare class S3ExpirationManager {
10
11
  private expirationPeriodInMilliseconds;
11
12
  private generateInfoKey;
12
13
  private generatePartKey;
13
- constructor(client: S3, bucket: string, expirationPeriodInMilliseconds: number, generateInfoKey: (id: string) => string, generatePartKey: (id: string, isIncompletePart: boolean) => string);
14
+ constructor(client: S3, bucket: string, expirationPeriodInMilliseconds: number, generateInfoKey: S3MetadataManager['generateInfoKey'], generatePartKey: S3MetadataManager['generatePartKey']);
14
15
  /**
15
16
  * Calculates the expiration date for a file based on a creation date
16
17
  * @param args - The function arguments
@@ -33,4 +34,4 @@ declare class S3ExpirationManager {
33
34
  }
34
35
  //#endregion
35
36
  export { S3ExpirationManager };
36
- //# sourceMappingURL=expiration-manager.d.mts.map
37
+ //# sourceMappingURL=expirationManager.d.mts.map
@@ -1,4 +1,4 @@
1
- //#region src/tus/stores/s3/expiration-manager.ts
1
+ //#region src/tus/stores/s3/expirationManager.ts
2
2
  var S3ExpirationManager = class {
3
3
  constructor(client, bucket, expirationPeriodInMilliseconds, generateInfoKey, generatePartKey) {
4
4
  this.client = client;
@@ -48,7 +48,10 @@ var S3ExpirationManager = class {
48
48
  return initiatedDate && (/* @__PURE__ */ new Date()).getTime() > this.getExpirationDate({ createdAt: initiatedDate.toISOString() }).getTime();
49
49
  }) || [];
50
50
  const objectsToDelete = expiredUploads.reduce((all, expiredUpload) => {
51
- all.push({ Key: this.generateInfoKey(expiredUpload.Key) }, { Key: this.generatePartKey(expiredUpload.Key, true) });
51
+ all.push({ Key: this.generateInfoKey({ id: expiredUpload.Key }) }, { Key: this.generatePartKey({
52
+ id: expiredUpload.Key,
53
+ isIncomplete: true
54
+ }) });
52
55
  return all;
53
56
  }, []);
54
57
  const deletions = [];
@@ -73,4 +76,4 @@ var S3ExpirationManager = class {
73
76
 
74
77
  //#endregion
75
78
  export { S3ExpirationManager };
76
- //# sourceMappingURL=expiration-manager.mjs.map
79
+ //# sourceMappingURL=expirationManager.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expirationManager.mjs","names":["AWS","S3","S3MetadataManager","GetExpirationDateArgs","createdAt","S3ExpirationManager","constructor","client","bucket","expirationPeriodInMilliseconds","generateInfoKey","generatePartKey","getExpirationDate","args","Date","date","getTime","getExpiration","deleteExpired","Promise","keyMarker","undefined","uploadIdMarker","isTruncated","deleted","listResponse","ListMultipartUploadsCommandOutput","listMultipartUploads","Bucket","KeyMarker","UploadIdMarker","expiredUploads","Uploads","filter","multiPartUpload","MultipartUpload","initiatedDate","Initiated","toISOString","objectsToDelete","reduce","all","Key","expiredUpload","push","id","isIncomplete","deletions","DeleteObjectsCommandOutput","length","deleteObjects","Delete","Objects","abortions","map","abortMultipartUpload","UploadId","IsTruncated","NextKeyMarker","NextUploadIdMarker"],"sources":["../../../../src/tus/stores/s3/expirationManager.ts"],"sourcesContent":["import type AWS from '@aws-sdk/client-s3'\nimport type { S3 } from '@aws-sdk/client-s3'\nimport type { S3MetadataManager } from './metadataManager'\n\ntype GetExpirationDateArgs = {\n createdAt: string\n}\n\nexport class S3ExpirationManager {\n constructor(\n private client: S3,\n private bucket: string,\n private expirationPeriodInMilliseconds: number,\n private generateInfoKey: S3MetadataManager['generateInfoKey'],\n private generatePartKey: S3MetadataManager['generatePartKey']\n ) {}\n\n /**\n * Calculates the expiration date for a file based on a creation date\n * @param args - The function arguments\n * @param args.createdAt - The creation date as a string\n * @returns The expiration date\n */\n getExpirationDate(args: GetExpirationDateArgs): Date {\n const { createdAt } = args\n const date = new Date(createdAt)\n return new Date(date.getTime() + this.expirationPeriodInMilliseconds)\n }\n\n /**\n * Gets the expiration period in milliseconds\n * @returns The expiration period in milliseconds\n */\n getExpiration(): number {\n return this.expirationPeriodInMilliseconds\n }\n\n /**\n * Deletes expired incomplete uploads based on their initialization date.\n * Returns the number of deleted uploads.\n * @param args - The function arguments (empty object)\n * @returns Promise that resolves to the number of deleted uploads\n */\n async deleteExpired(): Promise<number> {\n // No arguments to destructure\n if (this.getExpiration() === 0) {\n return 0\n }\n\n let keyMarker: string | undefined = undefined\n let uploadIdMarker: string | undefined = undefined\n let isTruncated = true\n let deleted = 0\n\n while (isTruncated) {\n const listResponse: AWS.ListMultipartUploadsCommandOutput =\n await this.client.listMultipartUploads({\n Bucket: this.bucket,\n KeyMarker: keyMarker,\n UploadIdMarker: uploadIdMarker,\n })\n\n const expiredUploads =\n listResponse.Uploads?.filter((multiPartUpload: AWS.MultipartUpload) => {\n const initiatedDate = multiPartUpload.Initiated\n return (\n initiatedDate &&\n new Date().getTime() >\n this.getExpirationDate({\n createdAt: initiatedDate.toISOString(),\n }).getTime()\n )\n }) || []\n\n const objectsToDelete = expiredUploads.reduce(\n (all: { Key: string }[], expiredUpload: AWS.MultipartUpload) => {\n all.push(\n {\n Key: this.generateInfoKey({ id: expiredUpload.Key as string }),\n },\n {\n Key: this.generatePartKey({\n id: expiredUpload.Key as string,\n isIncomplete: true,\n }),\n }\n )\n return all\n },\n [] as { Key: string }[]\n )\n\n const deletions: Promise<AWS.DeleteObjectsCommandOutput>[] = []\n\n if (objectsToDelete.length > 0) {\n deletions.push(\n this.client.deleteObjects({\n Bucket: this.bucket,\n Delete: {\n Objects: objectsToDelete,\n },\n })\n )\n }\n\n const abortions = expiredUploads.map(\n (expiredUpload: AWS.MultipartUpload) =>\n this.client.abortMultipartUpload({\n Bucket: this.bucket,\n Key: expiredUpload.Key,\n UploadId: expiredUpload.UploadId,\n })\n )\n\n await Promise.all([...deletions, ...abortions])\n\n deleted += expiredUploads.length\n\n isTruncated = listResponse.IsTruncated || false\n keyMarker = listResponse.NextKeyMarker\n uploadIdMarker = listResponse.NextUploadIdMarker\n }\n\n return deleted\n }\n}\n"],"mappings":";AAQA,IAAaK,sBAAb,MAAiC;CAC/BC,YACE,AAAQC,QACR,AAAQC,QACR,AAAQC,gCACR,AAAQC,iBACR,AAAQC,iBACR;EALQJ;EACAC;EACAC;EACAC;EACAC;;;;;;;;CASVC,kBAAkBC,MAAmC;EACnD,MAAM,EAAET,cAAcS;EACtB,MAAME,OAAO,IAAID,KAAKV,UAAU;AAChC,SAAO,IAAIU,KAAKC,KAAKC,SAAS,GAAG,KAAKP,+BAA+B;;;;;;CAOvEQ,gBAAwB;AACtB,SAAO,KAAKR;;;;;;;;CASd,MAAMS,gBAAiC;AAErC,MAAI,KAAKD,eAAe,KAAK,EAC3B,QAAO;EAGT,IAAIG,YAAgCC;EACpC,IAAIC,iBAAqCD;EACzC,IAAIE,cAAc;EAClB,IAAIC,UAAU;AAEd,SAAOD,aAAa;GAClB,MAAME,eACJ,MAAM,KAAKlB,OAAOoB,qBAAqB;IACrCC,QAAQ,KAAKpB;IACbqB,WAAWT;IACXU,gBAAgBR;IACjB,CAAC;GAEJ,MAAMS,iBACJN,aAAaO,SAASC,QAAQC,oBAAyC;IACrE,MAAME,gBAAgBF,gBAAgBG;AACtC,WACED,kCACA,IAAItB,MAAM,EAACE,SAAS,GAClB,KAAKJ,kBAAkB,EACrBR,WAAWgC,cAAcE,aAAY,EACtC,CAAC,CAACtB,SAAS;KAEhB,IAAI,EAAE;GAEV,MAAMuB,kBAAkBR,eAAeS,QACpCC,KAAwBE,kBAAuC;AAC9DF,QAAIG,KACF,EACEF,KAAK,KAAKhC,gBAAgB,EAAEmC,IAAIF,cAAcD,KAAe,CAAA,EAC9D,EACD,EACEA,KAAK,KAAK/B,gBAAgB;KACxBkC,IAAIF,cAAcD;KAClBI,cAAc;KACf,CAAA,EAEL,CAAC;AACD,WAAOL;MAET,EAAE,CACH;GAED,MAAMM,YAAuD,EAAE;AAE/D,OAAIR,gBAAgBU,SAAS,EAC3BF,WAAUH,KACR,KAAKrC,OAAO2C,cAAc;IACxBtB,QAAQ,KAAKpB;IACb2C,QAAQ,EACNC,SAASb,iBACX;IACD,CACH,CAAC;GAGH,MAAMc,YAAYtB,eAAeuB,KAC9BX,kBACC,KAAKpC,OAAOgD,qBAAqB;IAC/B3B,QAAQ,KAAKpB;IACbkC,KAAKC,cAAcD;IACnBc,UAAUb,cAAca;IACzB,CACL,CAAC;AAED,SAAMrC,QAAQsB,IAAI,CAAC,GAAGM,WAAW,GAAGM,UAAU,CAAC;AAE/C7B,cAAWO,eAAekB;AAE1B1B,iBAAcE,aAAagC,eAAe;AAC1CrC,eAAYK,aAAaiC;AACzBpC,oBAAiBG,aAAakC;;AAGhC,SAAOnC"}