@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 @@
1
+ {"version":3,"file":"uploadManager.mjs","names":["c","_c","createContext","use","useState","useCallback","useEffect","useRef","Button","useMediaCloudEmitter","useErrorHandler","MediaCloudErrors","MediaCloudEmitterEvents","React","Upload","filename","progress","uploadId","error","polling","pollingUrl","status","UploadManagerContextType","showUploadManager","activeUploads","addUpload","args","updateUpload","UploadManagerProviderArgs","children","ReactNode","RenderUploadListArgs","uploads","UploadManagerContext","UploadManagerProvider","$","setShowUploadManager","t0","Symbol","for","setActiveUploads","activeTab","setActiveTab","emitter","activeTabRef","activeUploadsRef","logError","t1","t2","current","t3","t4","t5","hasActiveUploads","some","_temp","hasProcessingUploads","_temp2","hasCompletedUploads","_temp3","checkAutoSwitchToCompleted","t6","t7","pollingUploads","filter","_temp4","length","pollAssets","pollingUpload","response","fetch","method","credentials","ok","data","json","ready","prev","updatedUploads","map","upload_3","upload","const","setTimeout","t8","UPLOAD_POLLING_ERROR","message","intervalId","setInterval","clearInterval","event","TUS_UPLOAD_ERROR","prev_0","upload_4","onUploadError","t9","event_0","upload_5","prev_1","onAddUpload","t10","event_1","filename_0","prev_2","upload_6","undefined","onUpdateUpload","t11","event_2","prev_3","upload_7","onRemoveUpload","t12","event_3","upload_9","find","upload_8","prev_4","upload_10","prev_5","updatedUploads_0","upload_11","onUploadComplete","t13","t14","on","off","t15","args_0","filename_1","t16","polling_0","upload_12","prev_6","args_1","filename_2","progress_0","polling_1","prev_7","upload_13","T0","t17","t18","uploadingFiles","_temp5","processingFiles","_temp6","completedFiles","_temp7","t19","renderUploadList","args_2","uploads_0","_temp8","t20","closeUploadManager","hasPollingUploads","_temp9","t21","value","Provider","_temp0","window","location","reload","upload_18","upload_17","Math","ceil","CSSProperties","upload_16","upload_15","upload_14","upload_2","upload_1","upload_0","useUploadManagerContext"],"sources":["../../../src/components/uploadManager/uploadManager.tsx"],"sourcesContent":["'use client'\n\nimport {\n createContext,\n use,\n useState,\n useCallback,\n useEffect,\n useRef,\n} from 'react'\nimport { Button } from '@payloadcms/ui'\n\nimport { useMediaCloudEmitter } from '../../hooks/useMediaCloudEmitter'\nimport { useErrorHandler } from '../../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../../types/errors'\n\nimport type { MediaCloudEmitterEvents } from '../../types'\nimport type React from 'react'\n\nimport './uploadManager.css'\n\ninterface Upload {\n filename: string\n progress: number\n uploadId?: string\n error?: string\n polling?: boolean\n pollingUrl?: string\n status?: 'uploading' | 'processing' | 'completed'\n}\n\ninterface UploadManagerContextType {\n showUploadManager?: boolean\n activeUploads: Upload[]\n addUpload: (args: MediaCloudEmitterEvents['addUpload']) => void\n updateUpload: (args: MediaCloudEmitterEvents['updateUpload']) => void\n}\n\ninterface UploadManagerProviderArgs {\n children: React.ReactNode\n}\n\ninterface RenderUploadListArgs {\n uploads: Upload[]\n}\n\nconst UploadManagerContext = createContext<UploadManagerContextType>({\n showUploadManager: false,\n activeUploads: [],\n addUpload: () => {},\n updateUpload: () => {},\n})\n\n/**\n * Provider component for upload management context\n * @param args - Arguments including children to wrap\n * @returns JSX element providing upload management context\n */\nexport function UploadManagerProvider(args: UploadManagerProviderArgs) {\n const { children } = args\n const [showUploadManager, setShowUploadManager] = useState(false)\n const [activeUploads, setActiveUploads] = useState<Upload[]>([])\n const [activeTab, setActiveTab] = useState<\n 'uploading' | 'processing' | 'completed'\n >('uploading')\n\n const emitter = useMediaCloudEmitter()\n const activeTabRef = useRef(activeTab)\n const activeUploadsRef = useRef(activeUploads)\n\n const { logError } = useErrorHandler()\n\n // Keep refs in sync with state\n useEffect(() => {\n activeTabRef.current = activeTab\n }, [activeTab])\n\n useEffect(() => {\n activeUploadsRef.current = activeUploads\n }, [activeUploads])\n\n // Helper function to check if we should auto-switch to completed tab\n const checkAutoSwitchToCompleted = useCallback((uploads: Upload[]) => {\n const hasActiveUploads = uploads.some(\n (upload) => upload.status === 'uploading'\n )\n const hasProcessingUploads = uploads.some(\n (upload) => upload.status === 'processing'\n )\n const hasCompletedUploads = uploads.some(\n (upload) => upload.status === 'completed'\n )\n\n // Auto-switch to completed tab if no uploading/processing uploads remain\n if (\n !hasActiveUploads &&\n !hasProcessingUploads &&\n hasCompletedUploads &&\n activeTabRef.current !== 'completed'\n ) {\n setActiveTab('completed')\n }\n }, [])\n\n // Polling logic\n useEffect(() => {\n const pollingUploads = activeUploads.filter(\n (upload) => upload.polling && upload.pollingUrl\n )\n\n if (pollingUploads.length === 0) {\n return\n }\n\n const pollAssets = async () => {\n for (const pollingUpload of pollingUploads) {\n try {\n const response = await fetch(\n `${pollingUpload.pollingUrl}?upload_id=${pollingUpload.uploadId}`,\n {\n method: 'GET',\n credentials: 'include',\n }\n )\n\n if (response.ok) {\n const data = await response.json()\n\n if (data.ready) {\n // Asset is ready, stop polling for this upload\n setActiveUploads((prev) => {\n const updatedUploads = prev.map((upload) =>\n upload.uploadId === pollingUpload.uploadId\n ? {\n ...upload,\n polling: false,\n progress: 100,\n status: 'completed' as const,\n }\n : upload\n )\n\n // Check if we should auto-switch to completed tab\n setTimeout(() => checkAutoSwitchToCompleted(updatedUploads), 0)\n\n return updatedUploads\n })\n }\n }\n } catch (_error) {\n logError(MediaCloudErrors.UPLOAD_POLLING_ERROR.message)\n }\n }\n }\n\n const intervalId = setInterval(pollAssets, 2000) // Poll every 2 seconds\n\n return () => clearInterval(intervalId)\n }, [activeUploads, checkAutoSwitchToCompleted, logError])\n\n /**\n * Handles the 'uploadError' event\n * @param event - The upload error event\n */\n const onUploadError = useCallback(\n (event: MediaCloudEmitterEvents['uploadError']) => {\n const { filename, error } = event\n\n logError(MediaCloudErrors.TUS_UPLOAD_ERROR.message)\n\n setActiveUploads((prev) =>\n prev.map((upload) =>\n upload.filename === filename\n ? { ...upload, error: error, status: 'completed' }\n : upload\n )\n )\n },\n [logError]\n )\n\n /**\n * Handles the 'addUpload' event\n * @param event - The add upload event\n */\n const onAddUpload = useCallback(\n (event: MediaCloudEmitterEvents['addUpload']) => {\n const upload: Upload = {\n filename: event.filename,\n uploadId: event.uploadId,\n progress: 0,\n polling: event.polling,\n pollingUrl: event.pollingUrl,\n status: 'uploading',\n }\n\n setActiveUploads((prev) => [...prev, upload])\n\n // Show the upload manager when new upload starts\n setShowUploadManager(true)\n\n // Auto-switch to uploading tab when new upload starts\n if (activeTabRef.current !== 'uploading') {\n setActiveTab('uploading')\n }\n },\n []\n )\n\n /**\n * Handles the 'updateUpload' event\n * @param event - The update upload event\n */\n const onUpdateUpload = useCallback(\n (event: MediaCloudEmitterEvents['updateUpload']) => {\n const { filename, progress, polling } = event\n setActiveUploads((prev) =>\n prev.map((upload) =>\n upload.filename === filename\n ? {\n ...upload,\n progress,\n ...(polling !== undefined && { polling }),\n status: polling\n ? 'processing'\n : progress >= 100\n ? 'completed'\n : 'uploading',\n }\n : upload\n )\n )\n },\n []\n )\n\n /**\n * Handles the 'removeUpload' event\n * @param event - The remove upload event\n */\n const onRemoveUpload = useCallback(\n (event: MediaCloudEmitterEvents['removeUpload']) => {\n setActiveUploads((prev) =>\n prev.filter((upload) => upload.filename !== event.filename)\n )\n },\n []\n )\n\n /**\n * Handles the 'uploadComplete' event\n * @param event - The upload completed event\n */\n const onUploadComplete = useCallback(\n (event: MediaCloudEmitterEvents['uploadComplete']) => {\n // Check if this upload has a polling URL (Mux upload)\n const upload = activeUploadsRef.current.find(\n (upload) => upload.filename === event.filename\n )\n if (upload?.pollingUrl) {\n setActiveUploads((prev) =>\n prev.map((upload) =>\n upload.filename === event.filename\n ? {\n ...upload,\n polling: true,\n progress: 100,\n status: 'processing' as const,\n }\n : upload\n )\n )\n } else {\n // Regular upload completion\n setActiveUploads((prev) => {\n const updatedUploads = prev.map((upload) =>\n upload.filename === event.filename\n ? { ...upload, progress: 100, status: 'completed' as const }\n : upload\n )\n\n // Check if we should auto-switch to completed tab\n setTimeout(() => checkAutoSwitchToCompleted(updatedUploads), 0)\n\n return updatedUploads\n })\n }\n },\n [checkAutoSwitchToCompleted]\n )\n\n useEffect(() => {\n emitter.on('addUpload', onAddUpload)\n emitter.on('updateUpload', onUpdateUpload)\n emitter.on('removeUpload', onRemoveUpload)\n emitter.on('uploadError', onUploadError)\n emitter.on('uploadComplete', onUploadComplete)\n\n return () => {\n emitter.off('addUpload', onAddUpload)\n emitter.off('updateUpload', onUpdateUpload)\n emitter.off('removeUpload', onRemoveUpload)\n emitter.off('uploadError', onUploadError)\n emitter.off('uploadComplete', onUploadComplete)\n }\n }, [\n emitter,\n onAddUpload,\n onUpdateUpload,\n onRemoveUpload,\n onUploadError,\n onUploadComplete,\n ])\n\n /**\n * Adds a new upload to the manager\n * @param args - The upload arguments\n */\n const addUpload = useCallback(\n (args: MediaCloudEmitterEvents['addUpload']) => {\n const { filename, polling = false, pollingUrl } = args\n const upload: Upload = {\n filename,\n progress: 0,\n polling,\n pollingUrl,\n status: 'uploading',\n }\n\n setActiveUploads((prev) => [...prev, upload])\n },\n []\n )\n\n /**\n * Updates an existing upload in the manager\n * @param args - The update arguments\n */\n const updateUpload = useCallback(\n (args: MediaCloudEmitterEvents['updateUpload']) => {\n const { filename, progress, polling } = args\n setActiveUploads((prev) =>\n prev.map((upload) =>\n upload.filename === filename\n ? {\n ...upload,\n progress,\n ...(polling !== undefined && { polling }),\n status: polling\n ? 'processing'\n : progress >= 100\n ? 'completed'\n : 'uploading',\n }\n : upload\n )\n )\n },\n []\n )\n\n // Filter uploads by status\n const uploadingFiles = activeUploads.filter(\n (upload) => upload.status === 'uploading'\n )\n const processingFiles = activeUploads.filter(\n (upload) => upload.status === 'processing'\n )\n const completedFiles = activeUploads.filter(\n (upload) => upload.status === 'completed'\n )\n\n /**\n * Renders the upload list\n * @param args - The render arguments\n * @returns JSX element representing the upload list\n */\n function renderUploadList(args: RenderUploadListArgs) {\n const { uploads } = args\n return (\n <ul>\n {uploads.map((upload) => (\n <li key={upload.filename} data-status={upload.status}>\n <div className=\"upload-info\">\n <span className=\"upload-filename\">{upload.filename}</span>\n <span className=\"upload-meta\">\n {upload.status === 'processing'\n ? 'Processing...'\n : upload.progress < 100\n ? `${Math.ceil(upload.progress)}%`\n : 'Completed'}\n </span>\n </div>\n <div\n className=\"upload-progress-bar\"\n style={\n {\n ['--progress']:\n upload.status === 'processing'\n ? '1'\n : `${upload.progress / 100}`,\n } as React.CSSProperties\n }\n >\n <div\n data-active={upload.status === 'processing'}\n className=\"upload-progress\"\n />\n </div>\n </li>\n ))}\n </ul>\n )\n }\n\n /**\n * Closes the upload manager\n */\n function closeUploadManager() {\n // Only allow closing if no uploads are actively polling\n const hasPollingUploads = activeUploads.some((upload) => upload.polling)\n if (!hasPollingUploads) {\n setActiveUploads([])\n setShowUploadManager(false)\n }\n }\n\n const value: UploadManagerContextType = {\n activeUploads,\n addUpload,\n updateUpload,\n }\n\n return (\n <UploadManagerContext.Provider value={value}>\n {showUploadManager && (\n <div className=\"upload-manager\">\n <div className=\"upload-manager__header\">\n <h4>Uploads</h4>\n <Button\n buttonStyle=\"icon-label\"\n icon=\"x\"\n margin={false}\n onClick={closeUploadManager}\n />\n </div>\n\n <div className=\"upload-manager__tabs\">\n <button\n data-active={activeTab === 'uploading'}\n className=\"upload-tab\"\n onClick={() => setActiveTab('uploading')}\n >\n Uploading ({uploadingFiles.length})\n </button>\n <button\n data-active={activeTab === 'processing'}\n className=\"upload-tab\"\n onClick={() => setActiveTab('processing')}\n >\n Processing ({processingFiles.length})\n </button>\n <button\n data-active={activeTab === 'completed'}\n className=\"upload-tab\"\n onClick={() => setActiveTab('completed')}\n >\n Completed ({completedFiles.length})\n </button>\n </div>\n\n <div className=\"upload-manager__content\">\n {activeTab === 'uploading' && uploadingFiles.length > 0 && (\n <div>{renderUploadList({ uploads: uploadingFiles })}</div>\n )}\n {activeTab === 'processing' && processingFiles.length > 0 && (\n <div>{renderUploadList({ uploads: processingFiles })}</div>\n )}\n {activeTab === 'completed' && completedFiles.length > 0 && (\n <div>\n {renderUploadList({ uploads: completedFiles })}\n <div className=\"upload-manager__footer\">\n <Button\n buttonStyle=\"subtle\"\n size=\"small\"\n margin={false}\n onClick={() => window?.location?.reload()}\n >\n Refresh\n </Button>\n </div>\n </div>\n )}\n {((activeTab === 'uploading' && uploadingFiles.length === 0) ||\n (activeTab === 'processing' && processingFiles.length === 0) ||\n (activeTab === 'completed' && completedFiles.length === 0)) && (\n <p className=\"upload-empty-state\">No {activeTab} files</p>\n )}\n </div>\n </div>\n )}\n {children}\n </UploadManagerContext.Provider>\n )\n}\n\nexport const useUploadManagerContext = () => use(UploadManagerContext)\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { S3Store } from "../tus/stores/s3/s3Store.mjs";
2
+ import { PayloadHandler } from "payload";
3
+
4
+ //#region src/endpoints/fileExistsHandler.d.ts
5
+ interface GetFileExistsHandlerArgs {
6
+ getS3Store: () => S3Store;
7
+ collection: string;
8
+ }
9
+ declare function getFileExistsHandler(args: GetFileExistsHandlerArgs): PayloadHandler;
10
+ //#endregion
11
+ export { getFileExistsHandler };
12
+ //# sourceMappingURL=fileExistsHandler.d.mts.map
@@ -1,9 +1,9 @@
1
1
  import { MediaCloudErrors } from "../types/errors.mjs";
2
2
  import { useErrorHandler } from "../hooks/useErrorHandler.mjs";
3
3
 
4
- //#region src/endpoints/tusFileExistsHandler.ts
5
- function getTusFileExistsHandler(args) {
6
- const { s3Store } = args;
4
+ //#region src/endpoints/fileExistsHandler.ts
5
+ function getFileExistsHandler(args) {
6
+ const { getS3Store, collection } = args;
7
7
  const { throwError, logError } = useErrorHandler();
8
8
  return async function(req) {
9
9
  try {
@@ -11,13 +11,13 @@ function getTusFileExistsHandler(args) {
11
11
  const filename = routeParams?.filename;
12
12
  if (!filename) throwError(MediaCloudErrors.FILE_MISSING_NAME);
13
13
  const { docs } = await payload.find({
14
- collection: "media",
14
+ collection,
15
15
  where: { filename: { equals: filename } },
16
16
  limit: 1,
17
17
  pagination: false
18
18
  });
19
19
  if (docs.length > 0) return Response.json({ message: "File found [payload]" }, { status: 200 });
20
- const url = s3Store.getUrl(filename);
20
+ const url = getS3Store().getUrl(filename);
21
21
  if ((await fetch(url, { method: "HEAD" })).status === 200) return Response.json({ message: "File found [S3]" }, { status: 200 });
22
22
  return Response.json({ message: "File not found" }, { status: 404 });
23
23
  } catch (_error) {
@@ -28,5 +28,5 @@ function getTusFileExistsHandler(args) {
28
28
  }
29
29
 
30
30
  //#endregion
31
- export { getTusFileExistsHandler };
32
- //# sourceMappingURL=tusFileExistsHandler.mjs.map
31
+ export { getFileExistsHandler };
32
+ //# sourceMappingURL=fileExistsHandler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileExistsHandler.mjs","names":["PayloadHandler","useErrorHandler","MediaCloudErrors","S3Store","GetFileExistsHandlerArgs","getS3Store","collection","getFileExistsHandler","args","throwError","logError","req","routeParams","payload","filename","FILE_MISSING_NAME","docs","find","where","equals","limit","pagination","length","Response","json","message","status","url","getUrl","s3Response","fetch","method","_error","FILE_DIMENSIONS_ERROR"],"sources":["../../src/endpoints/fileExistsHandler.ts"],"sourcesContent":["import type { PayloadHandler } from 'payload'\nimport { useErrorHandler } from '../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../types/errors'\n\nimport { S3Store } from '../tus/stores/s3/s3Store'\n\ninterface GetFileExistsHandlerArgs {\n getS3Store: () => S3Store\n collection: string\n}\n\nexport function getFileExistsHandler(\n args: GetFileExistsHandlerArgs\n): PayloadHandler {\n const { getS3Store, collection } = args\n const { throwError, logError } = useErrorHandler()\n\n return async function (req) {\n try {\n const { routeParams, payload } = req\n const filename = routeParams?.filename as string\n\n if (!filename) {\n throwError(MediaCloudErrors.FILE_MISSING_NAME)\n }\n\n // Check if file exists in Payload database\n const { docs } = await payload.find({\n collection,\n where: {\n filename: {\n equals: filename,\n },\n },\n limit: 1,\n pagination: false,\n })\n\n if (docs.length > 0) {\n return Response.json(\n { message: 'File found [payload]' },\n { status: 200 }\n )\n }\n\n // Check if completed file exists in S3\n const url = getS3Store().getUrl(filename)\n const s3Response = await fetch(url, { method: 'HEAD' })\n\n if (s3Response.status === 200) {\n return Response.json({ message: 'File found [S3]' }, { status: 200 })\n }\n\n return Response.json({ message: 'File not found' }, { status: 404 })\n } catch (_error) {\n logError(MediaCloudErrors.FILE_DIMENSIONS_ERROR.message)\n return Response.json(\n { message: 'Failed to process asset' },\n { status: 500 }\n )\n }\n }\n}\n"],"mappings":";;;;AAWA,SAAgBO,qBACdC,MACgB;CAChB,MAAM,EAAEH,YAAYC,eAAeE;CACnC,MAAM,EAAEC,YAAYC,aAAaT,iBAAiB;AAElD,QAAO,eAAgBU,KAAK;AAC1B,MAAI;GACF,MAAM,EAAEC,aAAaC,YAAYF;GACjC,MAAMG,WAAWF,aAAaE;AAE9B,OAAI,CAACA,SACHL,YAAWP,iBAAiBa,kBAAkB;GAIhD,MAAM,EAAEC,SAAS,MAAMH,QAAQI,KAAK;IAClCX;IACAY,OAAO,EACLJ,UAAU,EACRK,QAAQL,UACV,EACD;IACDM,OAAO;IACPC,YAAY;IACb,CAAC;AAEF,OAAIL,KAAKM,SAAS,EAChB,QAAOC,SAASC,KACd,EAAEC,SAAS,wBAAwB,EACnC,EAAEC,QAAQ,KACZ,CAAC;GAIH,MAAMC,MAAMtB,YAAY,CAACuB,OAAOd,SAAS;AAGzC,QAFmB,MAAMgB,MAAMH,KAAK,EAAEI,QAAQ,QAAQ,CAAC,EAExCL,WAAW,IACxB,QAAOH,SAASC,KAAK,EAAEC,SAAS,mBAAmB,EAAE,EAAEC,QAAQ,KAAK,CAAC;AAGvE,UAAOH,SAASC,KAAK,EAAEC,SAAS,kBAAkB,EAAE,EAAEC,QAAQ,KAAK,CAAC;WAC7DM,QAAQ;AACftB,YAASR,iBAAiB+B,sBAAsBR,QAAQ;AACxD,UAAOF,SAASC,KACd,EAAEC,SAAS,2BAA2B,EACtC,EAAEC,QAAQ,KACZ,CAAC"}
@@ -4,6 +4,7 @@ import { PayloadHandler } from "payload";
4
4
  //#region src/endpoints/muxAssetHandler.d.ts
5
5
  interface GetMuxAssetHandlerArgs {
6
6
  getMuxClient: () => Mux$1;
7
+ collection: string;
7
8
  }
8
9
  declare function getMuxAssetHandler(args: GetMuxAssetHandlerArgs): PayloadHandler;
9
10
  //#endregion
@@ -1,6 +1,6 @@
1
1
  //#region src/endpoints/muxAssetHandler.ts
2
2
  function getMuxAssetHandler(args) {
3
- const { getMuxClient } = args;
3
+ const { getMuxClient, collection } = args;
4
4
  return async (req) => {
5
5
  try {
6
6
  const mux = getMuxClient();
@@ -15,7 +15,7 @@ function getMuxAssetHandler(args) {
15
15
  if (asset.status === "ready") {
16
16
  const { payload } = req;
17
17
  const { docs } = await payload.find({
18
- collection: "media",
18
+ collection,
19
19
  where: { "mux.uploadId": { equals: uploadId } },
20
20
  limit: 1,
21
21
  pagination: false
@@ -25,7 +25,7 @@ function getMuxAssetHandler(args) {
25
25
  const width = Array.from(asset.tracks ?? []).reduce((max, track) => track.type === "video" && track.max_width ? Math.max(max, track.max_width) : max, 0);
26
26
  const height = Array.from(asset.tracks ?? []).reduce((max, track) => track.type === "video" && track.max_height ? Math.max(max, track.max_height) : max, 0);
27
27
  await payload.update({
28
- collection: "media",
28
+ collection,
29
29
  id,
30
30
  data: {
31
31
  mux: {
@@ -1 +1 @@
1
- {"version":3,"file":"muxAssetHandler.mjs","names":[],"sources":["../../src/endpoints/muxAssetHandler.ts"],"sourcesContent":["import type { Mux } from '@mux/mux-node'\nimport type { PayloadHandler } from 'payload'\nimport type { StaticRenditions } from '../types'\n\ninterface GetMuxAssetHandlerArgs {\n getMuxClient: () => Mux\n}\n\nexport function getMuxAssetHandler(\n args: GetMuxAssetHandlerArgs\n): PayloadHandler {\n const { getMuxClient } = args\n\n return async (req) => {\n try {\n const mux = getMuxClient()\n const { query } = req\n\n const uploadId = query.upload_id as string\n\n if (!uploadId) {\n return Response.json(\n { message: 'Upload ID is required' },\n { status: 400 }\n )\n }\n\n const assets = await mux.video.assets.list({\n limit: 1,\n upload_id: uploadId,\n })\n\n const asset = assets?.data[0]\n\n if (!asset) {\n return Response.json(\n { message: 'No asset found for the given upload ID' },\n { status: 404 }\n )\n }\n\n if (asset.status === 'ready') {\n const { payload } = req\n\n const { docs } = await payload.find({\n collection: 'media',\n where: {\n 'mux.uploadId': {\n equals: uploadId,\n },\n },\n limit: 1,\n pagination: false,\n })\n\n if (docs.length > 0) {\n const { id } = docs[0]\n\n const width = Array.from(asset.tracks ?? []).reduce(\n (max, track) =>\n track.type === 'video' && track.max_width\n ? Math.max(max, track.max_width)\n : max,\n 0\n )\n\n const height = Array.from(asset.tracks ?? []).reduce(\n (max, track) =>\n track.type === 'video' && track.max_height\n ? Math.max(max, track.max_height)\n : max,\n 0\n )\n\n await payload.update({\n collection: 'media',\n id,\n data: {\n mux: {\n status: asset.status,\n assetId: asset.id,\n playbackId: asset.playback_ids?.[0]?.id,\n aspectRatio: asset.aspect_ratio,\n duration: asset.duration,\n tracks: asset.tracks,\n maxResolutionTier: asset.max_resolution_tier,\n videoQuality: asset.video_quality,\n staticRenditions: asset.static_renditions as StaticRenditions,\n },\n width,\n height,\n },\n })\n }\n\n return Response.json(\n {\n ready: asset.status === 'ready',\n asset,\n },\n { status: 200 }\n )\n } else {\n return Response.json(\n {\n ready: false,\n asset,\n },\n { status: 200 }\n )\n }\n } catch (_error) {\n return Response.json(\n { message: 'Failed to fetch Mux asset' },\n { status: 500 }\n )\n }\n }\n}\n"],"mappings":";AAQA,SAAgB,mBACd,MACgB;CAChB,MAAM,EAAE,iBAAiB;AAEzB,QAAO,OAAO,QAAQ;AACpB,MAAI;GACF,MAAM,MAAM,cAAc;GAC1B,MAAM,EAAE,UAAU;GAElB,MAAM,WAAW,MAAM;AAEvB,OAAI,CAAC,SACH,QAAO,SAAS,KACd,EAAE,SAAS,yBAAyB,EACpC,EAAE,QAAQ,KAAK,CAChB;GAQH,MAAM,SALS,MAAM,IAAI,MAAM,OAAO,KAAK;IACzC,OAAO;IACP,WAAW;IACZ,CAAC,GAEoB,KAAK;AAE3B,OAAI,CAAC,MACH,QAAO,SAAS,KACd,EAAE,SAAS,0CAA0C,EACrD,EAAE,QAAQ,KAAK,CAChB;AAGH,OAAI,MAAM,WAAW,SAAS;IAC5B,MAAM,EAAE,YAAY;IAEpB,MAAM,EAAE,SAAS,MAAM,QAAQ,KAAK;KAClC,YAAY;KACZ,OAAO,EACL,gBAAgB,EACd,QAAQ,UACT,EACF;KACD,OAAO;KACP,YAAY;KACb,CAAC;AAEF,QAAI,KAAK,SAAS,GAAG;KACnB,MAAM,EAAE,OAAO,KAAK;KAEpB,MAAM,QAAQ,MAAM,KAAK,MAAM,UAAU,EAAE,CAAC,CAAC,QAC1C,KAAK,UACJ,MAAM,SAAS,WAAW,MAAM,YAC5B,KAAK,IAAI,KAAK,MAAM,UAAU,GAC9B,KACN,EACD;KAED,MAAM,SAAS,MAAM,KAAK,MAAM,UAAU,EAAE,CAAC,CAAC,QAC3C,KAAK,UACJ,MAAM,SAAS,WAAW,MAAM,aAC5B,KAAK,IAAI,KAAK,MAAM,WAAW,GAC/B,KACN,EACD;AAED,WAAM,QAAQ,OAAO;MACnB,YAAY;MACZ;MACA,MAAM;OACJ,KAAK;QACH,QAAQ,MAAM;QACd,SAAS,MAAM;QACf,YAAY,MAAM,eAAe,IAAI;QACrC,aAAa,MAAM;QACnB,UAAU,MAAM;QAChB,QAAQ,MAAM;QACd,mBAAmB,MAAM;QACzB,cAAc,MAAM;QACpB,kBAAkB,MAAM;QACzB;OACD;OACA;OACD;MACF,CAAC;;AAGJ,WAAO,SAAS,KACd;KACE,OAAO,MAAM,WAAW;KACxB;KACD,EACD,EAAE,QAAQ,KAAK,CAChB;SAED,QAAO,SAAS,KACd;IACE,OAAO;IACP;IACD,EACD,EAAE,QAAQ,KAAK,CAChB;WAEI,QAAQ;AACf,UAAO,SAAS,KACd,EAAE,SAAS,6BAA6B,EACxC,EAAE,QAAQ,KAAK,CAChB"}
1
+ {"version":3,"file":"muxAssetHandler.mjs","names":["Mux","PayloadHandler","StaticRenditions","GetMuxAssetHandlerArgs","getMuxClient","collection","getMuxAssetHandler","args","req","mux","query","uploadId","upload_id","Response","json","message","status","assets","video","list","limit","asset","data","payload","docs","find","where","equals","pagination","length","id","width","Array","from","tracks","reduce","max","track","type","max_width","Math","height","max_height","update","assetId","playbackId","playback_ids","aspectRatio","aspect_ratio","duration","maxResolutionTier","max_resolution_tier","videoQuality","video_quality","staticRenditions","static_renditions","ready","_error"],"sources":["../../src/endpoints/muxAssetHandler.ts"],"sourcesContent":["import type { Mux } from '@mux/mux-node'\nimport type { PayloadHandler } from 'payload'\nimport type { StaticRenditions } from '../types'\n\ninterface GetMuxAssetHandlerArgs {\n getMuxClient: () => Mux\n collection: string\n}\n\nexport function getMuxAssetHandler(\n args: GetMuxAssetHandlerArgs\n): PayloadHandler {\n const { getMuxClient, collection } = args\n\n return async (req) => {\n try {\n const mux = getMuxClient()\n const { query } = req\n\n const uploadId = query.upload_id as string\n\n if (!uploadId) {\n return Response.json(\n { message: 'Upload ID is required' },\n { status: 400 }\n )\n }\n\n const assets = await mux.video.assets.list({\n limit: 1,\n upload_id: uploadId,\n })\n\n const asset = assets?.data[0]\n\n if (!asset) {\n return Response.json(\n { message: 'No asset found for the given upload ID' },\n { status: 404 }\n )\n }\n\n if (asset.status === 'ready') {\n const { payload } = req\n\n const { docs } = await payload.find({\n collection,\n where: {\n 'mux.uploadId': {\n equals: uploadId,\n },\n },\n limit: 1,\n pagination: false,\n })\n\n if (docs.length > 0) {\n const { id } = docs[0]\n\n const width = Array.from(asset.tracks ?? []).reduce(\n (max, track) =>\n track.type === 'video' && track.max_width\n ? Math.max(max, track.max_width)\n : max,\n 0\n )\n\n const height = Array.from(asset.tracks ?? []).reduce(\n (max, track) =>\n track.type === 'video' && track.max_height\n ? Math.max(max, track.max_height)\n : max,\n 0\n )\n\n await payload.update({\n collection,\n id,\n data: {\n mux: {\n status: asset.status,\n assetId: asset.id,\n playbackId: asset.playback_ids?.[0]?.id,\n aspectRatio: asset.aspect_ratio,\n duration: asset.duration,\n tracks: asset.tracks,\n maxResolutionTier: asset.max_resolution_tier,\n videoQuality: asset.video_quality,\n staticRenditions: asset.static_renditions as StaticRenditions,\n },\n width,\n height,\n },\n })\n }\n\n return Response.json(\n {\n ready: asset.status === 'ready',\n asset,\n },\n { status: 200 }\n )\n } else {\n return Response.json(\n {\n ready: false,\n asset,\n },\n { status: 200 }\n )\n }\n } catch (_error) {\n return Response.json(\n { message: 'Failed to fetch Mux asset' },\n { status: 500 }\n )\n }\n }\n}\n"],"mappings":";AASA,SAAgBM,mBACdC,MACgB;CAChB,MAAM,EAAEH,cAAcC,eAAeE;AAErC,QAAO,OAAOC,QAAQ;AACpB,MAAI;GACF,MAAMC,MAAML,cAAc;GAC1B,MAAM,EAAEM,UAAUF;GAElB,MAAMG,WAAWD,MAAME;AAEvB,OAAI,CAACD,SACH,QAAOE,SAASC,KACd,EAAEC,SAAS,yBAAyB,EACpC,EAAEC,QAAQ,KACZ,CAAC;GAQH,MAAMK,SALS,MAAMZ,IAAIS,MAAMD,OAAOE,KAAK;IACzCC,OAAO;IACPR,WAAWD;IACZ,CAAC,GAEoBW,KAAK;AAE3B,OAAI,CAACD,MACH,QAAOR,SAASC,KACd,EAAEC,SAAS,0CAA0C,EACrD,EAAEC,QAAQ,KACZ,CAAC;AAGH,OAAIK,MAAML,WAAW,SAAS;IAC5B,MAAM,EAAEO,YAAYf;IAEpB,MAAM,EAAEgB,SAAS,MAAMD,QAAQE,KAAK;KAClCpB;KACAqB,OAAO,EACL,gBAAgB,EACdC,QAAQhB,UACV,EACD;KACDS,OAAO;KACPQ,YAAY;KACb,CAAC;AAEF,QAAIJ,KAAKK,SAAS,GAAG;KACnB,MAAM,EAAEC,OAAON,KAAK;KAEpB,MAAMO,QAAQC,MAAMC,KAAKZ,MAAMa,UAAU,EAAE,CAAC,CAACC,QAC1CC,KAAKC,UACJA,MAAMC,SAAS,WAAWD,MAAME,YAC5BC,KAAKJ,IAAIA,KAAKC,MAAME,UAAU,GAC9BH,KACN,EACD;KAED,MAAMK,SAAST,MAAMC,KAAKZ,MAAMa,UAAU,EAAE,CAAC,CAACC,QAC3CC,KAAKC,UACJA,MAAMC,SAAS,WAAWD,MAAMK,aAC5BF,KAAKJ,IAAIA,KAAKC,MAAMK,WAAW,GAC/BN,KACN,EACD;AAED,WAAMb,QAAQoB,OAAO;MACnBtC;MACAyB;MACAR,MAAM;OACJb,KAAK;QACHO,QAAQK,MAAML;QACd4B,SAASvB,MAAMS;QACfe,YAAYxB,MAAMyB,eAAe,IAAIhB;QACrCiB,aAAa1B,MAAM2B;QACnBC,UAAU5B,MAAM4B;QAChBf,QAAQb,MAAMa;QACdgB,mBAAmB7B,MAAM8B;QACzBC,cAAc/B,MAAMgC;QACpBC,kBAAkBjC,MAAMkC;QACzB;OACDxB;OACAU;OACF;MACD,CAAC;;AAGJ,WAAO5B,SAASC,KACd;KACE0C,OAAOnC,MAAML,WAAW;KACxBK;KACD,EACD,EAAEL,QAAQ,KACZ,CAAC;SAED,QAAOH,SAASC,KACd;IACE0C,OAAO;IACPnC;IACD,EACD,EAAEL,QAAQ,KACZ,CAAC;WAEIyC,QAAQ;AACf,UAAO5C,SAASC,KACd,EAAEC,SAAS,6BAA6B,EACxC,EAAEC,QAAQ,KACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"muxCreateUploadHandler.mjs","names":[],"sources":["../../src/endpoints/muxCreateUploadHandler.ts"],"sourcesContent":["import type { Mux } from '@mux/mux-node'\n\nimport type { PayloadHandler } from 'payload'\nimport { MediaCloudPluginOptions } from '../types'\nimport { useErrorHandler } from '../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../types/errors'\n\ninterface GetMuxCreateUploadHandlerArgs {\n getMuxClient: () => Mux\n pluginOptions: MediaCloudPluginOptions\n}\n\nexport function getMuxCreateUploadHandler(\n args: GetMuxCreateUploadHandlerArgs\n): PayloadHandler {\n const { getMuxClient, pluginOptions } = args\n\n return async (req) => {\n const { throwError, logError } = useErrorHandler()\n\n try {\n if (!req.json) {\n throwError(MediaCloudErrors.MUX_REQUEST_NO_JSON)\n throw new Error() // This will never execute but satisfies TypeScript\n }\n const body = req.json ? await req.json() : ''\n const { filename } = body\n const mux = getMuxClient()\n const assetOptions = pluginOptions.mux?.assetOptions || {}\n const upload = await mux.video.uploads.create({\n cors_origin: '*',\n new_asset_settings: {\n playback_policies: ['public'],\n meta: {\n title: filename,\n },\n ...assetOptions,\n },\n test: pluginOptions.mux?.testMode ?? false,\n })\n return Response.json({ url: upload.url, uploadId: upload.id })\n } catch (_error) {\n logError(MediaCloudErrors.MUX_CREATE_UPLOAD_ERROR.message)\n return Response.json(\n { message: 'Failed to create upload' },\n { status: 500 }\n )\n }\n }\n}\n"],"mappings":";;;;AAYA,SAAgB,0BACd,MACgB;CAChB,MAAM,EAAE,cAAc,kBAAkB;AAExC,QAAO,OAAO,QAAQ;EACpB,MAAM,EAAE,YAAY,aAAa,iBAAiB;AAElD,MAAI;AACF,OAAI,CAAC,IAAI,MAAM;AACb,eAAW,iBAAiB,oBAAoB;AAChD,UAAM,IAAI,OAAO;;GAGnB,MAAM,EAAE,aADK,IAAI,OAAO,MAAM,IAAI,MAAM,GAAG;GAE3C,MAAM,MAAM,cAAc;GAC1B,MAAM,eAAe,cAAc,KAAK,gBAAgB,EAAE;GAC1D,MAAM,SAAS,MAAM,IAAI,MAAM,QAAQ,OAAO;IAC5C,aAAa;IACb,oBAAoB;KAClB,mBAAmB,CAAC,SAAS;KAC7B,MAAM,EACJ,OAAO,UACR;KACD,GAAG;KACJ;IACD,MAAM,cAAc,KAAK,YAAY;IACtC,CAAC;AACF,UAAO,SAAS,KAAK;IAAE,KAAK,OAAO;IAAK,UAAU,OAAO;IAAI,CAAC;WACvD,QAAQ;AACf,YAAS,iBAAiB,wBAAwB,QAAQ;AAC1D,UAAO,SAAS,KACd,EAAE,SAAS,2BAA2B,EACtC,EAAE,QAAQ,KAAK,CAChB"}
1
+ {"version":3,"file":"muxCreateUploadHandler.mjs","names":["Mux","PayloadHandler","MediaCloudPluginOptions","useErrorHandler","MediaCloudErrors","GetMuxCreateUploadHandlerArgs","getMuxClient","pluginOptions","getMuxCreateUploadHandler","args","req","throwError","logError","json","MUX_REQUEST_NO_JSON","Error","body","filename","mux","assetOptions","upload","video","uploads","create","cors_origin","new_asset_settings","playback_policies","meta","title","test","testMode","Response","url","uploadId","id","_error","MUX_CREATE_UPLOAD_ERROR","message","status"],"sources":["../../src/endpoints/muxCreateUploadHandler.ts"],"sourcesContent":["import type { Mux } from '@mux/mux-node'\n\nimport type { PayloadHandler } from 'payload'\nimport { MediaCloudPluginOptions } from '../types'\nimport { useErrorHandler } from '../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../types/errors'\n\ninterface GetMuxCreateUploadHandlerArgs {\n getMuxClient: () => Mux\n pluginOptions: MediaCloudPluginOptions\n}\n\nexport function getMuxCreateUploadHandler(\n args: GetMuxCreateUploadHandlerArgs\n): PayloadHandler {\n const { getMuxClient, pluginOptions } = args\n\n return async (req) => {\n const { throwError, logError } = useErrorHandler()\n\n try {\n if (!req.json) {\n throwError(MediaCloudErrors.MUX_REQUEST_NO_JSON)\n throw new Error() // This will never execute but satisfies TypeScript\n }\n const body = req.json ? await req.json() : ''\n const { filename } = body\n const mux = getMuxClient()\n const assetOptions = pluginOptions.mux?.assetOptions || {}\n const upload = await mux.video.uploads.create({\n cors_origin: '*',\n new_asset_settings: {\n playback_policies: ['public'],\n meta: {\n title: filename,\n },\n ...assetOptions,\n },\n test: pluginOptions.mux?.testMode ?? false,\n })\n return Response.json({ url: upload.url, uploadId: upload.id })\n } catch (_error) {\n logError(MediaCloudErrors.MUX_CREATE_UPLOAD_ERROR.message)\n return Response.json(\n { message: 'Failed to create upload' },\n { status: 500 }\n )\n }\n }\n}\n"],"mappings":";;;;AAYA,SAAgBQ,0BACdC,MACgB;CAChB,MAAM,EAAEH,cAAcC,kBAAkBE;AAExC,QAAO,OAAOC,QAAQ;EACpB,MAAM,EAAEC,YAAYC,aAAaT,iBAAiB;AAElD,MAAI;AACF,OAAI,CAACO,IAAIG,MAAM;AACbF,eAAWP,iBAAiBU,oBAAoB;AAChD,UAAM,IAAIC,OAAO;;GAGnB,MAAM,EAAEE,aADKP,IAAIG,OAAO,MAAMH,IAAIG,MAAM,GAAG;GAE3C,MAAMK,MAAMZ,cAAc;GAC1B,MAAMa,eAAeZ,cAAcW,KAAKC,gBAAgB,EAAE;GAC1D,MAAMC,SAAS,MAAMF,IAAIG,MAAMC,QAAQC,OAAO;IAC5CC,aAAa;IACbC,oBAAoB;KAClBC,mBAAmB,CAAC,SAAS;KAC7BC,MAAM,EACJC,OAAOX,UACR;KACD,GAAGE;KACJ;IACDU,MAAMtB,cAAcW,KAAKY,YAAY;IACtC,CAAC;AACF,UAAOC,SAASlB,KAAK;IAAEmB,KAAKZ,OAAOY;IAAKC,UAAUb,OAAOc;IAAI,CAAC;WACvDC,QAAQ;AACfvB,YAASR,iBAAiBgC,wBAAwBC,QAAQ;AAC1D,UAAON,SAASlB,KACd,EAAEwB,SAAS,2BAA2B,EACtC,EAAEC,QAAQ,KACZ,CAAC"}
@@ -4,6 +4,7 @@ import { PayloadHandler } from "payload";
4
4
  //#region src/endpoints/muxWebhookHandler.d.ts
5
5
  interface GetMuxWebhookHandlerArgs {
6
6
  getMuxClient: () => Mux$1;
7
+ collection: string;
7
8
  }
8
9
  declare function getMuxWebhookHandler(args: GetMuxWebhookHandlerArgs): PayloadHandler;
9
10
  //#endregion
@@ -4,7 +4,7 @@ import { useErrorHandler } from "../hooks/useErrorHandler.mjs";
4
4
  //#region src/endpoints/muxWebhookHandler.ts
5
5
  const { logError, log } = useErrorHandler();
6
6
  function getMuxWebhookHandler(args) {
7
- const { getMuxClient } = args;
7
+ const { getMuxClient, collection } = args;
8
8
  return async (req) => {
9
9
  const mux = getMuxClient();
10
10
  try {
@@ -24,7 +24,8 @@ function getMuxWebhookHandler(args) {
24
24
  case "video.asset.static_renditions.deleted":
25
25
  await updateMuxAsset({
26
26
  asset: event.object,
27
- payload: req.payload
27
+ payload: req.payload,
28
+ collection
28
29
  });
29
30
  break;
30
31
  }
@@ -35,10 +36,10 @@ function getMuxWebhookHandler(args) {
35
36
  };
36
37
  }
37
38
  async function updateMuxAsset(args) {
38
- const { asset, payload } = args;
39
+ const { asset, payload, collection } = args;
39
40
  if (asset.status === "ready") {
40
41
  const { docs } = await payload.find({
41
- collection: "media",
42
+ collection,
42
43
  where: { "mux.assetId": { equals: asset.id } },
43
44
  limit: 1,
44
45
  pagination: false
@@ -48,7 +49,7 @@ async function updateMuxAsset(args) {
48
49
  const width = Array.from(asset.tracks ?? []).reduce((max, track) => track.type === "video" && track.max_width ? Math.max(max, track.max_width) : max, 0);
49
50
  const height = Array.from(asset.tracks ?? []).reduce((max, track) => track.type === "video" && track.max_height ? Math.max(max, track.max_height) : max, 0);
50
51
  await payload.update({
51
- collection: "media",
52
+ collection,
52
53
  id,
53
54
  data: {
54
55
  mux: {
@@ -1 +1 @@
1
- {"version":3,"file":"muxWebhookHandler.mjs","names":[],"sources":["../../src/endpoints/muxWebhookHandler.ts"],"sourcesContent":["import { useErrorHandler } from '../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../types/errors'\n\nimport type { Mux } from '@mux/mux-node'\nimport type { BasePayload, PayloadHandler } from 'payload'\nimport type { StaticRenditions } from '../types'\n\ninterface GetMuxWebhookHandlerArgs {\n getMuxClient: () => Mux\n}\n\nconst { logError, log } = useErrorHandler()\n\nexport function getMuxWebhookHandler(\n args: GetMuxWebhookHandlerArgs\n): PayloadHandler {\n const { getMuxClient } = args\n\n return async (req) => {\n const mux = getMuxClient()\n\n try {\n const body = req.text ? await req.text() : ''\n const headers = req.headers\n\n if (!body) {\n logError(MediaCloudErrors.MUX_WEBHOOK_BODY_INVALID.message)\n }\n\n // Verify the webhook signature\n mux.webhooks.verifySignature(body, headers)\n\n // Parse the request body\n const event = JSON.parse(body)\n\n // Handle the event\n switch (event.type) {\n case 'video.asset.created':\n case 'video.asset.errored':\n case 'video.asset.deleted':\n log(`Received Mux webhook: ${event.type}, ${event.object.id}`)\n break\n case 'video.asset.ready':\n case 'video.asset.static_renditions.ready':\n case 'video.asset.static_renditions.deleted':\n await updateMuxAsset({ asset: event.object, payload: req.payload })\n break\n }\n\n return Response.json({ message: 'Webhook received' }, { status: 200 })\n } catch (error) {\n return Response.json(\n { message: error instanceof Error ? error.message : String(error) },\n { status: 500 }\n )\n }\n }\n}\n\ninterface UpdateMuxAssetArgs {\n asset: Mux.Video.Asset\n payload: BasePayload\n}\n\nasync function updateMuxAsset(args: UpdateMuxAssetArgs): Promise<void> {\n const { asset, payload } = args\n\n if (asset.status === 'ready') {\n const { docs } = await payload.find({\n collection: 'media',\n where: {\n 'mux.assetId': {\n equals: asset.id,\n },\n },\n limit: 1,\n pagination: false,\n })\n\n if (docs.length > 0) {\n const { id } = docs[0]\n\n const width = Array.from(asset.tracks ?? []).reduce(\n (max, track) =>\n track.type === 'video' && track.max_width\n ? Math.max(max, track.max_width)\n : max,\n 0\n )\n\n const height = Array.from(asset.tracks ?? []).reduce(\n (max, track) =>\n track.type === 'video' && track.max_height\n ? Math.max(max, track.max_height)\n : max,\n 0\n )\n\n await payload.update({\n collection: 'media',\n id,\n data: {\n mux: {\n status: asset.status,\n assetId: asset.id,\n playbackId: asset.playback_ids?.[0]?.id,\n aspectRatio: asset.aspect_ratio,\n duration: asset.duration,\n tracks: asset.tracks,\n maxResolutionTier: asset.max_resolution_tier,\n videoQuality: asset.video_quality,\n staticRenditions: asset.static_renditions as StaticRenditions,\n },\n width,\n height,\n },\n })\n }\n }\n}\n"],"mappings":";;;;AAWA,MAAM,EAAE,UAAU,QAAQ,iBAAiB;AAE3C,SAAgB,qBACd,MACgB;CAChB,MAAM,EAAE,iBAAiB;AAEzB,QAAO,OAAO,QAAQ;EACpB,MAAM,MAAM,cAAc;AAE1B,MAAI;GACF,MAAM,OAAO,IAAI,OAAO,MAAM,IAAI,MAAM,GAAG;GAC3C,MAAM,UAAU,IAAI;AAEpB,OAAI,CAAC,KACH,UAAS,iBAAiB,yBAAyB,QAAQ;AAI7D,OAAI,SAAS,gBAAgB,MAAM,QAAQ;GAG3C,MAAM,QAAQ,KAAK,MAAM,KAAK;AAG9B,WAAQ,MAAM,MAAd;IACE,KAAK;IACL,KAAK;IACL,KAAK;AACH,SAAI,yBAAyB,MAAM,KAAK,IAAI,MAAM,OAAO,KAAK;AAC9D;IACF,KAAK;IACL,KAAK;IACL,KAAK;AACH,WAAM,eAAe;MAAE,OAAO,MAAM;MAAQ,SAAS,IAAI;MAAS,CAAC;AACnE;;AAGJ,UAAO,SAAS,KAAK,EAAE,SAAS,oBAAoB,EAAE,EAAE,QAAQ,KAAK,CAAC;WAC/D,OAAO;AACd,UAAO,SAAS,KACd,EAAE,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,EAAE,EACnE,EAAE,QAAQ,KAAK,CAChB;;;;AAUP,eAAe,eAAe,MAAyC;CACrE,MAAM,EAAE,OAAO,YAAY;AAE3B,KAAI,MAAM,WAAW,SAAS;EAC5B,MAAM,EAAE,SAAS,MAAM,QAAQ,KAAK;GAClC,YAAY;GACZ,OAAO,EACL,eAAe,EACb,QAAQ,MAAM,IACf,EACF;GACD,OAAO;GACP,YAAY;GACb,CAAC;AAEF,MAAI,KAAK,SAAS,GAAG;GACnB,MAAM,EAAE,OAAO,KAAK;GAEpB,MAAM,QAAQ,MAAM,KAAK,MAAM,UAAU,EAAE,CAAC,CAAC,QAC1C,KAAK,UACJ,MAAM,SAAS,WAAW,MAAM,YAC5B,KAAK,IAAI,KAAK,MAAM,UAAU,GAC9B,KACN,EACD;GAED,MAAM,SAAS,MAAM,KAAK,MAAM,UAAU,EAAE,CAAC,CAAC,QAC3C,KAAK,UACJ,MAAM,SAAS,WAAW,MAAM,aAC5B,KAAK,IAAI,KAAK,MAAM,WAAW,GAC/B,KACN,EACD;AAED,SAAM,QAAQ,OAAO;IACnB,YAAY;IACZ;IACA,MAAM;KACJ,KAAK;MACH,QAAQ,MAAM;MACd,SAAS,MAAM;MACf,YAAY,MAAM,eAAe,IAAI;MACrC,aAAa,MAAM;MACnB,UAAU,MAAM;MAChB,QAAQ,MAAM;MACd,mBAAmB,MAAM;MACzB,cAAc,MAAM;MACpB,kBAAkB,MAAM;MACzB;KACD;KACA;KACD;IACF,CAAC"}
1
+ {"version":3,"file":"muxWebhookHandler.mjs","names":["useErrorHandler","MediaCloudErrors","Mux","BasePayload","PayloadHandler","StaticRenditions","GetMuxWebhookHandlerArgs","getMuxClient","collection","logError","log","getMuxWebhookHandler","args","req","mux","body","text","headers","MUX_WEBHOOK_BODY_INVALID","message","webhooks","verifySignature","event","JSON","parse","type","object","id","updateMuxAsset","asset","payload","Response","json","status","error","Error","String","UpdateMuxAssetArgs","Video","Asset","Promise","docs","find","where","equals","limit","pagination","length","width","Array","from","tracks","reduce","max","track","max_width","Math","height","max_height","update","data","assetId","playbackId","playback_ids","aspectRatio","aspect_ratio","duration","maxResolutionTier","max_resolution_tier","videoQuality","video_quality","staticRenditions","static_renditions"],"sources":["../../src/endpoints/muxWebhookHandler.ts"],"sourcesContent":["import { useErrorHandler } from '../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../types/errors'\n\nimport type { Mux } from '@mux/mux-node'\nimport type { BasePayload, PayloadHandler } from 'payload'\nimport type { StaticRenditions } from '../types'\n\ninterface GetMuxWebhookHandlerArgs {\n getMuxClient: () => Mux\n collection: string\n}\n\nconst { logError, log } = useErrorHandler()\n\nexport function getMuxWebhookHandler(\n args: GetMuxWebhookHandlerArgs\n): PayloadHandler {\n const { getMuxClient, collection } = args\n\n return async (req) => {\n const mux = getMuxClient()\n\n try {\n const body = req.text ? await req.text() : ''\n const headers = req.headers\n\n if (!body) {\n logError(MediaCloudErrors.MUX_WEBHOOK_BODY_INVALID.message)\n }\n\n // Verify the webhook signature\n mux.webhooks.verifySignature(body, headers)\n\n // Parse the request body\n const event = JSON.parse(body)\n\n // Handle the event\n switch (event.type) {\n case 'video.asset.created':\n case 'video.asset.errored':\n case 'video.asset.deleted':\n log(`Received Mux webhook: ${event.type}, ${event.object.id}`)\n break\n case 'video.asset.ready':\n case 'video.asset.static_renditions.ready':\n case 'video.asset.static_renditions.deleted':\n await updateMuxAsset({\n asset: event.object,\n payload: req.payload,\n collection,\n })\n break\n }\n\n return Response.json({ message: 'Webhook received' }, { status: 200 })\n } catch (error) {\n return Response.json(\n { message: error instanceof Error ? error.message : String(error) },\n { status: 500 }\n )\n }\n }\n}\n\ninterface UpdateMuxAssetArgs {\n asset: Mux.Video.Asset\n payload: BasePayload\n collection: string\n}\n\nasync function updateMuxAsset(args: UpdateMuxAssetArgs): Promise<void> {\n const { asset, payload, collection } = args\n\n if (asset.status === 'ready') {\n const { docs } = await payload.find({\n collection,\n where: {\n 'mux.assetId': {\n equals: asset.id,\n },\n },\n limit: 1,\n pagination: false,\n })\n\n if (docs.length > 0) {\n const { id } = docs[0]\n\n const width = Array.from(asset.tracks ?? []).reduce(\n (max, track) =>\n track.type === 'video' && track.max_width\n ? Math.max(max, track.max_width)\n : max,\n 0\n )\n\n const height = Array.from(asset.tracks ?? []).reduce(\n (max, track) =>\n track.type === 'video' && track.max_height\n ? Math.max(max, track.max_height)\n : max,\n 0\n )\n\n await payload.update({\n collection,\n id,\n data: {\n mux: {\n status: asset.status,\n assetId: asset.id,\n playbackId: asset.playback_ids?.[0]?.id,\n aspectRatio: asset.aspect_ratio,\n duration: asset.duration,\n tracks: asset.tracks,\n maxResolutionTier: asset.max_resolution_tier,\n videoQuality: asset.video_quality,\n staticRenditions: asset.static_renditions as StaticRenditions,\n },\n width,\n height,\n },\n })\n }\n }\n}\n"],"mappings":";;;;AAYA,MAAM,EAAES,UAAUC,QAAQV,iBAAiB;AAE3C,SAAgBW,qBACdC,MACgB;CAChB,MAAM,EAAEL,cAAcC,eAAeI;AAErC,QAAO,OAAOC,QAAQ;EACpB,MAAMC,MAAMP,cAAc;AAE1B,MAAI;GACF,MAAMQ,OAAOF,IAAIG,OAAO,MAAMH,IAAIG,MAAM,GAAG;GAC3C,MAAMC,UAAUJ,IAAII;AAEpB,OAAI,CAACF,KACHN,UAASR,iBAAiBiB,yBAAyBC,QAAQ;AAI7DL,OAAIM,SAASC,gBAAgBN,MAAME,QAAQ;GAG3C,MAAMK,QAAQC,KAAKC,MAAMT,KAAK;AAG9B,WAAQO,MAAMG,MAAd;IACE,KAAK;IACL,KAAK;IACL,KAAK;AACHf,SAAI,yBAAyBY,MAAMG,KAAI,IAAKH,MAAMI,OAAOC,KAAK;AAC9D;IACF,KAAK;IACL,KAAK;IACL,KAAK;AACH,WAAMC,eAAe;MACnBC,OAAOP,MAAMI;MACbI,SAASjB,IAAIiB;MACbtB;MACD,CAAC;AACF;;AAGJ,UAAOuB,SAASC,KAAK,EAAEb,SAAS,oBAAoB,EAAE,EAAEc,QAAQ,KAAK,CAAC;WAC/DC,OAAO;AACd,UAAOH,SAASC,KACd,EAAEb,SAASe,iBAAiBC,QAAQD,MAAMf,UAAUiB,OAAOF,MAAK,EAAG,EACnE,EAAED,QAAQ,KACZ,CAAC;;;;AAWP,eAAeL,eAAehB,MAAyC;CACrE,MAAM,EAAEiB,OAAOC,SAAStB,eAAeI;AAEvC,KAAIiB,MAAMI,WAAW,SAAS;EAC5B,MAAM,EAAEQ,SAAS,MAAMX,QAAQY,KAAK;GAClClC;GACAmC,OAAO,EACL,eAAe,EACbC,QAAQf,MAAMF,IAChB,EACD;GACDkB,OAAO;GACPC,YAAY;GACb,CAAC;AAEF,MAAIL,KAAKM,SAAS,GAAG;GACnB,MAAM,EAAEpB,OAAOc,KAAK;GAEpB,MAAMO,QAAQC,MAAMC,KAAKrB,MAAMsB,UAAU,EAAE,CAAC,CAACC,QAC1CC,KAAKC,UACJA,MAAM7B,SAAS,WAAW6B,MAAMC,YAC5BC,KAAKH,IAAIA,KAAKC,MAAMC,UAAU,GAC9BF,KACN,EACD;GAED,MAAMI,SAASR,MAAMC,KAAKrB,MAAMsB,UAAU,EAAE,CAAC,CAACC,QAC3CC,KAAKC,UACJA,MAAM7B,SAAS,WAAW6B,MAAMI,aAC5BF,KAAKH,IAAIA,KAAKC,MAAMI,WAAW,GAC/BL,KACN,EACD;AAED,SAAMvB,QAAQ6B,OAAO;IACnBnD;IACAmB;IACAiC,MAAM;KACJ9C,KAAK;MACHmB,QAAQJ,MAAMI;MACd4B,SAAShC,MAAMF;MACfmC,YAAYjC,MAAMkC,eAAe,IAAIpC;MACrCqC,aAAanC,MAAMoC;MACnBC,UAAUrC,MAAMqC;MAChBf,QAAQtB,MAAMsB;MACdgB,mBAAmBtC,MAAMuC;MACzBC,cAAcxC,MAAMyC;MACpBC,kBAAkB1C,MAAM2C;MACzB;KACDxB;KACAS;KACF;IACD,CAAC"}
@@ -1,9 +1,10 @@
1
- import { createS3Store } from "../tus/stores/s3/index.mjs";
1
+ import { S3Store } from "../tus/stores/s3/s3Store.mjs";
2
2
  import { PayloadHandler } from "payload";
3
3
 
4
4
  //#region src/endpoints/tusCleanupHandler.d.ts
5
5
  interface GetTusCleanupHandlerArgs {
6
- s3Store: ReturnType<typeof createS3Store>;
6
+ getS3Store: () => S3Store;
7
+ collection: string;
7
8
  }
8
9
  declare function getTusCleanupHandler(args: GetTusCleanupHandlerArgs): PayloadHandler;
9
10
  //#endregion
@@ -4,20 +4,20 @@ import { useErrorHandler } from "../hooks/useErrorHandler.mjs";
4
4
  //#region src/endpoints/tusCleanupHandler.ts
5
5
  const { logError } = useErrorHandler();
6
6
  function getTusCleanupHandler(args) {
7
- const { s3Store } = args;
7
+ const { getS3Store, collection } = args;
8
8
  return async (req) => {
9
9
  try {
10
10
  const { filename } = await req.json?.();
11
11
  if (!filename) return new Response("Missing filename", { status: 400 });
12
- await s3Store.remove(filename);
12
+ await getS3Store().remove(filename);
13
13
  const payload = req.payload;
14
14
  const { docs } = await req.payload.find({
15
- collection: "media",
15
+ collection,
16
16
  where: { filename: { equals: filename } },
17
17
  limit: 1
18
18
  });
19
19
  if (docs?.length > 0) await payload.delete({
20
- collection: "media",
20
+ collection,
21
21
  id: docs[0].id
22
22
  });
23
23
  return new Response("Cleanup successful", { status: 200 });
@@ -1 +1 @@
1
- {"version":3,"file":"tusCleanupHandler.mjs","names":[],"sources":["../../src/endpoints/tusCleanupHandler.ts"],"sourcesContent":["import type { PayloadHandler } from 'payload'\nimport { useErrorHandler } from '../hooks/useErrorHandler'\nimport { createS3Store } from '../tus/stores/s3'\nimport { MediaCloudErrors } from '../types/errors'\n\ninterface GetTusCleanupHandlerArgs {\n s3Store: ReturnType<typeof createS3Store>\n}\n\nconst { logError } = useErrorHandler()\n\nexport function getTusCleanupHandler(\n args: GetTusCleanupHandlerArgs\n): PayloadHandler {\n const { s3Store } = args\n\n return async (req) => {\n try {\n const data = await req.json?.()\n const { filename } = data\n\n if (!filename) {\n return new Response('Missing filename', { status: 400 })\n }\n\n // Abort the multipart upload and delete S3 objects (.info, .part)\n await s3Store.remove(filename)\n\n // Find and delete the Payload document\n const payload = req.payload\n const { docs } = await req.payload.find({\n collection: 'media',\n where: {\n filename: {\n equals: filename,\n },\n },\n limit: 1,\n })\n\n if (docs?.length > 0) {\n await payload.delete({\n collection: 'media',\n id: docs[0].id,\n })\n }\n\n return new Response('Cleanup successful', { status: 200 })\n } catch {\n logError(MediaCloudErrors.TUS_CLEANUP_ERROR.message)\n return new Response('Cleanup failed', { status: 500 })\n }\n }\n}\n"],"mappings":";;;;AASA,MAAM,EAAE,aAAa,iBAAiB;AAEtC,SAAgB,qBACd,MACgB;CAChB,MAAM,EAAE,YAAY;AAEpB,QAAO,OAAO,QAAQ;AACpB,MAAI;GAEF,MAAM,EAAE,aADK,MAAM,IAAI,QAAQ;AAG/B,OAAI,CAAC,SACH,QAAO,IAAI,SAAS,oBAAoB,EAAE,QAAQ,KAAK,CAAC;AAI1D,SAAM,QAAQ,OAAO,SAAS;GAG9B,MAAM,UAAU,IAAI;GACpB,MAAM,EAAE,SAAS,MAAM,IAAI,QAAQ,KAAK;IACtC,YAAY;IACZ,OAAO,EACL,UAAU,EACR,QAAQ,UACT,EACF;IACD,OAAO;IACR,CAAC;AAEF,OAAI,MAAM,SAAS,EACjB,OAAM,QAAQ,OAAO;IACnB,YAAY;IACZ,IAAI,KAAK,GAAG;IACb,CAAC;AAGJ,UAAO,IAAI,SAAS,sBAAsB,EAAE,QAAQ,KAAK,CAAC;UACpD;AACN,YAAS,iBAAiB,kBAAkB,QAAQ;AACpD,UAAO,IAAI,SAAS,kBAAkB,EAAE,QAAQ,KAAK,CAAC"}
1
+ {"version":3,"file":"tusCleanupHandler.mjs","names":["PayloadHandler","useErrorHandler","MediaCloudErrors","S3Store","GetTusCleanupHandlerArgs","getS3Store","collection","logError","getTusCleanupHandler","args","req","data","json","filename","Response","status","remove","payload","docs","find","where","equals","limit","length","delete","id","TUS_CLEANUP_ERROR","message"],"sources":["../../src/endpoints/tusCleanupHandler.ts"],"sourcesContent":["import type { PayloadHandler } from 'payload'\nimport { useErrorHandler } from '../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../types/errors'\nimport type { S3Store } from '../tus/stores/s3/s3Store'\n\ninterface GetTusCleanupHandlerArgs {\n getS3Store: () => S3Store\n collection: string\n}\n\nconst { logError } = useErrorHandler()\n\nexport function getTusCleanupHandler(\n args: GetTusCleanupHandlerArgs\n): PayloadHandler {\n const { getS3Store, collection } = args\n\n return async (req) => {\n try {\n const data = await req.json?.()\n const { filename } = data\n\n if (!filename) {\n return new Response('Missing filename', { status: 400 })\n }\n\n // Abort the multipart upload and delete S3 objects (.info, .part)\n await getS3Store().remove(filename)\n\n // Find and delete the Payload document\n const payload = req.payload\n const { docs } = await req.payload.find({\n collection,\n where: {\n filename: {\n equals: filename,\n },\n },\n limit: 1,\n })\n\n if (docs?.length > 0) {\n await payload.delete({\n collection,\n id: docs[0].id,\n })\n }\n\n return new Response('Cleanup successful', { status: 200 })\n } catch {\n logError(MediaCloudErrors.TUS_CLEANUP_ERROR.message)\n return new Response('Cleanup failed', { status: 500 })\n }\n }\n}\n"],"mappings":";;;;AAUA,MAAM,EAAEO,aAAaN,iBAAiB;AAEtC,SAAgBO,qBACdC,MACgB;CAChB,MAAM,EAAEJ,YAAYC,eAAeG;AAEnC,QAAO,OAAOC,QAAQ;AACpB,MAAI;GAEF,MAAM,EAAEG,aADK,MAAMH,IAAIE,QAAQ;AAG/B,OAAI,CAACC,SACH,QAAO,IAAIC,SAAS,oBAAoB,EAAEC,QAAQ,KAAK,CAAC;AAI1D,SAAMV,YAAY,CAACW,OAAOH,SAAS;GAGnC,MAAMI,UAAUP,IAAIO;GACpB,MAAM,EAAEC,SAAS,MAAMR,IAAIO,QAAQE,KAAK;IACtCb;IACAc,OAAO,EACLP,UAAU,EACRQ,QAAQR,UACV,EACD;IACDS,OAAO;IACR,CAAC;AAEF,OAAIJ,MAAMK,SAAS,EACjB,OAAMN,QAAQO,OAAO;IACnBlB;IACAmB,IAAIP,KAAK,GAAGO;IACb,CAAC;AAGJ,UAAO,IAAIX,SAAS,sBAAsB,EAAEC,QAAQ,KAAK,CAAC;UACpD;AACNR,YAASL,iBAAiBwB,kBAAkBC,QAAQ;AACpD,UAAO,IAAIb,SAAS,kBAAkB,EAAEC,QAAQ,KAAK,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { S3Store } from "../tus/stores/s3/s3Store.mjs";
2
+ import { PayloadHandler } from "payload";
3
+
4
+ //#region src/endpoints/tusFolderHandler.d.ts
5
+ interface GetTusPostProcessorHandlerArgs {
6
+ getS3Store: () => S3Store;
7
+ collection: string;
8
+ }
9
+ declare function getTusFolderHandler(args: GetTusPostProcessorHandlerArgs): PayloadHandler;
10
+ //#endregion
11
+ export { getTusFolderHandler };
12
+ //# sourceMappingURL=tusFolderHandler.d.mts.map
@@ -0,0 +1,39 @@
1
+ import { MediaCloudErrors } from "../types/errors.mjs";
2
+ import { useErrorHandler } from "../hooks/useErrorHandler.mjs";
3
+ import { sanitizeFilename } from "../utils/file.mjs";
4
+
5
+ //#region src/endpoints/tusFolderHandler.ts
6
+ function getTusFolderHandler(args) {
7
+ const { getS3Store, collection } = args;
8
+ const { throwError, logError } = useErrorHandler();
9
+ return async function(req) {
10
+ try {
11
+ const { routeParams, payload } = req;
12
+ const filename = routeParams?.filename;
13
+ if (!filename) throwError(MediaCloudErrors.FILE_MISSING_NAME);
14
+ const sanitizedFilename = sanitizeFilename(filename);
15
+ const { docs } = await payload.find({
16
+ collection,
17
+ where: { filename: { equals: sanitizedFilename } },
18
+ limit: 1,
19
+ pagination: false
20
+ });
21
+ const media = docs?.[0];
22
+ if (!media) throwError(MediaCloudErrors.FILE_NOT_FOUND);
23
+ if (media.storage !== "s3") return Response.json({ message: "Asset not stored on S3, skipping …" }, { status: 200 });
24
+ const s3Store = getS3Store();
25
+ if (await s3Store?.read(media.path).catch(() => null)) return Response.json({ message: "Asset already in correct location, skipping …" }, { status: 200 });
26
+ const oldKey = media.filename;
27
+ const newKey = media.path;
28
+ await s3Store?.copy(oldKey, newKey);
29
+ return Response.json({ message: "Asset moved" }, { status: 200 });
30
+ } catch (_error) {
31
+ logError(MediaCloudErrors.S3_MOVE_ERROR.message);
32
+ return Response.json({ message: "Failed to move asset" }, { status: 500 });
33
+ }
34
+ };
35
+ }
36
+
37
+ //#endregion
38
+ export { getTusFolderHandler };
39
+ //# sourceMappingURL=tusFolderHandler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tusFolderHandler.mjs","names":["PayloadHandler","useErrorHandler","MediaCloudErrors","S3Store","sanitizeFilename","GetTusPostProcessorHandlerArgs","getS3Store","collection","getTusFolderHandler","args","throwError","logError","req","routeParams","payload","filename","FILE_MISSING_NAME","sanitizedFilename","docs","find","where","equals","limit","pagination","media","FILE_NOT_FOUND","storage","Response","json","message","status","s3Store","file","read","path","catch","oldKey","newKey","copy","_error","S3_MOVE_ERROR"],"sources":["../../src/endpoints/tusFolderHandler.ts"],"sourcesContent":["import type { PayloadHandler } from 'payload'\nimport { useErrorHandler } from '../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../types/errors'\n\nimport { S3Store } from '../tus/stores/s3/s3Store'\nimport { sanitizeFilename } from '../utils/file'\n\ninterface GetTusPostProcessorHandlerArgs {\n getS3Store: () => S3Store\n collection: string\n}\n\nexport function getTusFolderHandler(\n args: GetTusPostProcessorHandlerArgs\n): PayloadHandler {\n const { getS3Store, collection } = args\n const { throwError, logError } = useErrorHandler()\n\n return async function (req) {\n try {\n const { routeParams, payload } = req\n const filename = routeParams?.filename as string\n\n if (!filename) {\n throwError(MediaCloudErrors.FILE_MISSING_NAME)\n }\n\n const sanitizedFilename = sanitizeFilename(filename)\n\n const { docs } = await payload.find({\n collection,\n where: {\n filename: {\n equals: sanitizedFilename,\n },\n },\n limit: 1,\n pagination: false,\n })\n\n const media = docs?.[0]\n\n if (!media) {\n throwError(MediaCloudErrors.FILE_NOT_FOUND)\n }\n\n if (media.storage !== 's3') {\n return Response.json(\n { message: 'Asset not stored on S3, skipping …' },\n { status: 200 }\n )\n }\n\n const s3Store = getS3Store()\n const file = await s3Store?.read(media.path).catch(() => null)\n\n if (file) {\n return Response.json(\n { message: 'Asset already in correct location, skipping …' },\n { status: 200 }\n )\n }\n\n const oldKey = media.filename\n const newKey = media.path\n\n await s3Store?.copy(oldKey, newKey)\n return Response.json({ message: 'Asset moved' }, { status: 200 })\n } catch (_error) {\n logError(MediaCloudErrors.S3_MOVE_ERROR.message)\n return Response.json({ message: 'Failed to move asset' }, { status: 500 })\n }\n }\n}\n"],"mappings":";;;;;AAYA,SAAgBQ,oBACdC,MACgB;CAChB,MAAM,EAAEH,YAAYC,eAAeE;CACnC,MAAM,EAAEC,YAAYC,aAAaV,iBAAiB;AAElD,QAAO,eAAgBW,KAAK;AAC1B,MAAI;GACF,MAAM,EAAEC,aAAaC,YAAYF;GACjC,MAAMG,WAAWF,aAAaE;AAE9B,OAAI,CAACA,SACHL,YAAWR,iBAAiBc,kBAAkB;GAGhD,MAAMC,oBAAoBb,iBAAiBW,SAAS;GAEpD,MAAM,EAAEG,SAAS,MAAMJ,QAAQK,KAAK;IAClCZ;IACAa,OAAO,EACLL,UAAU,EACRM,QAAQJ,mBACV,EACD;IACDK,OAAO;IACPC,YAAY;IACb,CAAC;GAEF,MAAMC,QAAQN,OAAO;AAErB,OAAI,CAACM,MACHd,YAAWR,iBAAiBuB,eAAe;AAG7C,OAAID,MAAME,YAAY,KACpB,QAAOC,SAASC,KACd,EAAEC,SAAS,sCAAsC,EACjD,EAAEC,QAAQ,KACZ,CAAC;GAGH,MAAMC,UAAUzB,YAAY;AAG5B,OAFa,MAAMyB,SAASE,KAAKT,MAAMU,KAAK,CAACC,YAAY,KAAK,CAG5D,QAAOR,SAASC,KACd,EAAEC,SAAS,iDAAiD,EAC5D,EAAEC,QAAQ,KACZ,CAAC;GAGH,MAAMM,SAASZ,MAAMT;GACrB,MAAMsB,SAASb,MAAMU;AAErB,SAAMH,SAASO,KAAKF,QAAQC,OAAO;AACnC,UAAOV,SAASC,KAAK,EAAEC,SAAS,eAAe,EAAE,EAAEC,QAAQ,KAAK,CAAC;WAC1DS,QAAQ;AACf5B,YAAST,iBAAiBsC,cAAcX,QAAQ;AAChD,UAAOF,SAASC,KAAK,EAAEC,SAAS,wBAAwB,EAAE,EAAEC,QAAQ,KAAK,CAAC"}
@@ -1,9 +1,10 @@
1
- import { S3Store } from "../tus/stores/s3/s3-store.mjs";
1
+ import { S3Store } from "../tus/stores/s3/s3Store.mjs";
2
2
  import { PayloadHandler } from "payload";
3
3
 
4
4
  //#region src/endpoints/tusPostProcessorHandler.d.ts
5
5
  interface GetTusPostProcessorHandlerArgs {
6
- s3Store: S3Store;
6
+ getS3Store: () => S3Store;
7
+ collection: string;
7
8
  }
8
9
  declare function getTusPostProcessorHandler(args: GetTusPostProcessorHandlerArgs): PayloadHandler;
9
10
  //#endregion
@@ -5,7 +5,7 @@ import { imageSize } from "image-size";
5
5
 
6
6
  //#region src/endpoints/tusPostProcessorHandler.ts
7
7
  function getTusPostProcessorHandler(args) {
8
- const { s3Store } = args;
8
+ const { getS3Store, collection } = args;
9
9
  const { throwError, logError } = useErrorHandler();
10
10
  return async function(req) {
11
11
  try {
@@ -14,20 +14,21 @@ function getTusPostProcessorHandler(args) {
14
14
  if (!filename) throwError(MediaCloudErrors.FILE_MISSING_NAME);
15
15
  const sanitizedFilename = sanitizeFilename(filename);
16
16
  const { docs } = await payload.find({
17
- collection: "media",
17
+ collection,
18
18
  where: { filename: { equals: sanitizedFilename } },
19
19
  limit: 1,
20
20
  pagination: false
21
21
  });
22
22
  const media = docs?.[0];
23
23
  if (!media) throwError(MediaCloudErrors.FILE_NOT_FOUND);
24
- if (media.storage !== "s3") return Response.json({ message: "Asset not stored on S3, skipping processing" }, { status: 200 });
24
+ if (media.storage !== "s3") return Response.json({ message: "Asset not stored on S3, skipping " }, { status: 200 });
25
+ const s3Store = getS3Store();
25
26
  const matchedId = media?.id;
26
- const url = s3Store.getUrl(filename);
27
+ const url = s3Store?.getUrl(filename);
27
28
  const arrayBuffer = await (await fetch(url)).arrayBuffer();
28
29
  const { width, height } = imageSize(Buffer.from(arrayBuffer));
29
30
  if (width && height) await payload.update({
30
- collection: "media",
31
+ collection,
31
32
  id: matchedId,
32
33
  data: {
33
34
  width,
@@ -1 +1 @@
1
- {"version":3,"file":"tusPostProcessorHandler.mjs","names":[],"sources":["../../src/endpoints/tusPostProcessorHandler.ts"],"sourcesContent":["import type { PayloadHandler } from 'payload'\nimport { useErrorHandler } from '../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../types/errors'\n\nimport { S3Store } from '../tus/stores/s3/s3-store'\nimport { imageSize } from 'image-size'\nimport { sanitizeFilename } from '../utils/file'\n\ninterface GetTusPostProcessorHandlerArgs {\n s3Store: S3Store\n}\n\nexport function getTusPostProcessorHandler(\n args: GetTusPostProcessorHandlerArgs\n): PayloadHandler {\n const { s3Store } = args\n const { throwError, logError } = useErrorHandler()\n\n return async function (req) {\n try {\n const { routeParams, payload } = req\n const filename = routeParams?.filename as string\n\n if (!filename) {\n throwError(MediaCloudErrors.FILE_MISSING_NAME)\n }\n\n const sanitizedFilename = sanitizeFilename(filename)\n\n const { docs } = await payload.find({\n collection: 'media',\n where: {\n filename: {\n equals: sanitizedFilename,\n },\n },\n limit: 1,\n pagination: false,\n })\n\n const media = docs?.[0]\n\n if (!media) {\n throwError(MediaCloudErrors.FILE_NOT_FOUND)\n }\n\n if (media.storage !== 's3') {\n return Response.json(\n { message: 'Asset not stored on S3, skipping processing' },\n { status: 200 }\n )\n }\n\n const matchedId = media?.id\n\n const url = s3Store.getUrl(filename)\n const response = await fetch(url)\n const arrayBuffer = await response.arrayBuffer()\n const buffer = Buffer.from(arrayBuffer)\n\n const dimensions = imageSize(buffer)\n const { width, height } = dimensions\n\n if (width && height) {\n await payload.update({\n collection: 'media',\n id: matchedId,\n data: {\n width,\n height,\n },\n })\n }\n\n return Response.json({ message: 'Asset processed' }, { status: 200 })\n } catch (_error) {\n logError(MediaCloudErrors.FILE_DIMENSIONS_ERROR.message)\n return Response.json(\n { message: 'Failed to process asset' },\n { status: 500 }\n )\n }\n }\n}\n"],"mappings":";;;;;;AAYA,SAAgB,2BACd,MACgB;CAChB,MAAM,EAAE,YAAY;CACpB,MAAM,EAAE,YAAY,aAAa,iBAAiB;AAElD,QAAO,eAAgB,KAAK;AAC1B,MAAI;GACF,MAAM,EAAE,aAAa,YAAY;GACjC,MAAM,WAAW,aAAa;AAE9B,OAAI,CAAC,SACH,YAAW,iBAAiB,kBAAkB;GAGhD,MAAM,oBAAoB,iBAAiB,SAAS;GAEpD,MAAM,EAAE,SAAS,MAAM,QAAQ,KAAK;IAClC,YAAY;IACZ,OAAO,EACL,UAAU,EACR,QAAQ,mBACT,EACF;IACD,OAAO;IACP,YAAY;IACb,CAAC;GAEF,MAAM,QAAQ,OAAO;AAErB,OAAI,CAAC,MACH,YAAW,iBAAiB,eAAe;AAG7C,OAAI,MAAM,YAAY,KACpB,QAAO,SAAS,KACd,EAAE,SAAS,+CAA+C,EAC1D,EAAE,QAAQ,KAAK,CAChB;GAGH,MAAM,YAAY,OAAO;GAEzB,MAAM,MAAM,QAAQ,OAAO,SAAS;GAEpC,MAAM,cAAc,OADH,MAAM,MAAM,IAAI,EACE,aAAa;GAIhD,MAAM,EAAE,OAAO,WADI,UAFJ,OAAO,KAAK,YAAY,CAEH;AAGpC,OAAI,SAAS,OACX,OAAM,QAAQ,OAAO;IACnB,YAAY;IACZ,IAAI;IACJ,MAAM;KACJ;KACA;KACD;IACF,CAAC;AAGJ,UAAO,SAAS,KAAK,EAAE,SAAS,mBAAmB,EAAE,EAAE,QAAQ,KAAK,CAAC;WAC9D,QAAQ;AACf,YAAS,iBAAiB,sBAAsB,QAAQ;AACxD,UAAO,SAAS,KACd,EAAE,SAAS,2BAA2B,EACtC,EAAE,QAAQ,KAAK,CAChB"}
1
+ {"version":3,"file":"tusPostProcessorHandler.mjs","names":["PayloadHandler","useErrorHandler","MediaCloudErrors","S3Store","imageSize","sanitizeFilename","GetTusPostProcessorHandlerArgs","getS3Store","collection","getTusPostProcessorHandler","args","throwError","logError","req","routeParams","payload","filename","FILE_MISSING_NAME","sanitizedFilename","docs","find","where","equals","limit","pagination","media","FILE_NOT_FOUND","storage","Response","json","message","status","s3Store","matchedId","id","url","getUrl","response","fetch","arrayBuffer","buffer","Buffer","from","dimensions","width","height","update","data","_error","FILE_DIMENSIONS_ERROR"],"sources":["../../src/endpoints/tusPostProcessorHandler.ts"],"sourcesContent":["import type { PayloadHandler } from 'payload'\nimport { useErrorHandler } from '../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../types/errors'\n\nimport { S3Store } from '../tus/stores/s3/s3Store'\nimport { imageSize } from 'image-size'\nimport { sanitizeFilename } from '../utils/file'\n\ninterface GetTusPostProcessorHandlerArgs {\n getS3Store: () => S3Store\n collection: string\n}\n\nexport function getTusPostProcessorHandler(\n args: GetTusPostProcessorHandlerArgs\n): PayloadHandler {\n const { getS3Store, collection } = args\n const { throwError, logError } = useErrorHandler()\n\n return async function (req) {\n try {\n const { routeParams, payload } = req\n const filename = routeParams?.filename as string\n\n if (!filename) {\n throwError(MediaCloudErrors.FILE_MISSING_NAME)\n }\n\n const sanitizedFilename = sanitizeFilename(filename)\n\n const { docs } = await payload.find({\n collection,\n where: {\n filename: {\n equals: sanitizedFilename,\n },\n },\n limit: 1,\n pagination: false,\n })\n\n const media = docs?.[0]\n\n if (!media) {\n throwError(MediaCloudErrors.FILE_NOT_FOUND)\n }\n\n if (media.storage !== 's3') {\n return Response.json(\n { message: 'Asset not stored on S3, skipping ' },\n { status: 200 }\n )\n }\n\n const s3Store = getS3Store()\n const matchedId = media?.id\n\n const url = s3Store?.getUrl(filename)\n const response = await fetch(url)\n const arrayBuffer = await response.arrayBuffer()\n const buffer = Buffer.from(arrayBuffer)\n\n const dimensions = imageSize(buffer)\n const { width, height } = dimensions\n\n if (width && height) {\n await payload.update({\n collection,\n id: matchedId,\n data: {\n width,\n height,\n },\n })\n }\n\n return Response.json({ message: 'Asset processed' }, { status: 200 })\n } catch (_error) {\n logError(MediaCloudErrors.FILE_DIMENSIONS_ERROR.message)\n return Response.json(\n { message: 'Failed to process asset' },\n { status: 500 }\n )\n }\n }\n}\n"],"mappings":";;;;;;AAaA,SAAgBS,2BACdC,MACgB;CAChB,MAAM,EAAEH,YAAYC,eAAeE;CACnC,MAAM,EAAEC,YAAYC,aAAaX,iBAAiB;AAElD,QAAO,eAAgBY,KAAK;AAC1B,MAAI;GACF,MAAM,EAAEC,aAAaC,YAAYF;GACjC,MAAMG,WAAWF,aAAaE;AAE9B,OAAI,CAACA,SACHL,YAAWT,iBAAiBe,kBAAkB;GAGhD,MAAMC,oBAAoBb,iBAAiBW,SAAS;GAEpD,MAAM,EAAEG,SAAS,MAAMJ,QAAQK,KAAK;IAClCZ;IACAa,OAAO,EACLL,UAAU,EACRM,QAAQJ,mBACV,EACD;IACDK,OAAO;IACPC,YAAY;IACb,CAAC;GAEF,MAAMC,QAAQN,OAAO;AAErB,OAAI,CAACM,MACHd,YAAWT,iBAAiBwB,eAAe;AAG7C,OAAID,MAAME,YAAY,KACpB,QAAOC,SAASC,KACd,EAAEC,SAAS,sCAAsC,EACjD,EAAEC,QAAQ,KACZ,CAAC;GAGH,MAAMC,UAAUzB,YAAY;GAC5B,MAAM0B,YAAYR,OAAOS;GAEzB,MAAMC,MAAMH,SAASI,OAAOpB,SAAS;GAErC,MAAMuB,cAAc,OADH,MAAMD,MAAMH,IAAI,EACEI,aAAa;GAIhD,MAAM,EAAEK,OAAOC,WADIzC,UAFJqC,OAAOC,KAAKH,YAAY,CAEH;AAGpC,OAAIK,SAASC,OACX,OAAM9B,QAAQ+B,OAAO;IACnBtC;IACA0B,IAAID;IACJc,MAAM;KACJH;KACAC;KACF;IACD,CAAC;AAGJ,UAAOjB,SAASC,KAAK,EAAEC,SAAS,mBAAmB,EAAE,EAAEC,QAAQ,KAAK,CAAC;WAC9DiB,QAAQ;AACfpC,YAASV,iBAAiB+C,sBAAsBnB,QAAQ;AACxD,UAAOF,SAASC,KACd,EAAEC,SAAS,2BAA2B,EACtC,EAAEC,QAAQ,KACZ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { TextField } from "payload";
2
+
3
+ //#region src/fields/alt.d.ts
4
+ declare const altField: TextField;
5
+ //#endregion
6
+ export { altField };
7
+ //# sourceMappingURL=alt.d.mts.map
@@ -0,0 +1,10 @@
1
+ //#region src/fields/alt.ts
2
+ const altField = {
3
+ name: "alt",
4
+ label: "Alternative Text",
5
+ type: "text"
6
+ };
7
+
8
+ //#endregion
9
+ export { altField };
10
+ //# sourceMappingURL=alt.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alt.mjs","names":["TextField","altField","name","label","type"],"sources":["../../src/fields/alt.ts"],"sourcesContent":["import type { TextField } from 'payload'\n\nexport const altField: TextField = {\n name: 'alt',\n label: 'Alternative Text',\n type: 'text',\n}\n"],"mappings":";AAEA,MAAaC,WAAsB;CACjCC,MAAM;CACNC,OAAO;CACPC,MAAM;CACP"}
@@ -0,0 +1,7 @@
1
+ import { TextField } from "payload";
2
+
3
+ //#region src/fields/filename.d.ts
4
+ declare const filenameField: TextField;
5
+ //#endregion
6
+ export { filenameField };
7
+ //# sourceMappingURL=filename.d.mts.map
@@ -0,0 +1,14 @@
1
+ //#region src/fields/filename.ts
2
+ const filenameField = {
3
+ type: "text",
4
+ name: "filename",
5
+ unique: true,
6
+ admin: {
7
+ hidden: false,
8
+ readOnly: false
9
+ }
10
+ };
11
+
12
+ //#endregion
13
+ export { filenameField };
14
+ //# sourceMappingURL=filename.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filename.mjs","names":["TextField","filenameField","type","name","unique","admin","hidden","readOnly"],"sources":["../../src/fields/filename.ts"],"sourcesContent":["import type { TextField } from 'payload'\n\nexport const filenameField: TextField = {\n type: 'text',\n name: 'filename',\n unique: true,\n admin: {\n hidden: false,\n readOnly: false,\n },\n}\n"],"mappings":";AAEA,MAAaC,gBAA2B;CACtCC,MAAM;CACNC,MAAM;CACNC,QAAQ;CACRC,OAAO;EACLC,QAAQ;EACRC,UAAU;EACZ;CACD"}
@@ -0,0 +1,7 @@
1
+ import { TextField } from "payload";
2
+
3
+ //#region src/fields/height.d.ts
4
+ declare const heightField: TextField;
5
+ //#endregion
6
+ export { heightField };
7
+ //# sourceMappingURL=height.d.mts.map
@@ -0,0 +1,15 @@
1
+ //#region src/fields/height.ts
2
+ const heightField = {
3
+ name: "height",
4
+ label: "Height",
5
+ type: "text",
6
+ admin: {
7
+ readOnly: true,
8
+ hidden: false,
9
+ width: "50%"
10
+ }
11
+ };
12
+
13
+ //#endregion
14
+ export { heightField };
15
+ //# sourceMappingURL=height.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"height.mjs","names":["TextField","heightField","name","label","type","admin","readOnly","hidden","width"],"sources":["../../src/fields/height.ts"],"sourcesContent":["import type { TextField } from 'payload'\n\nexport const heightField: TextField = {\n name: 'height',\n label: 'Height',\n type: 'text',\n admin: {\n readOnly: true,\n hidden: false,\n width: '50%',\n },\n}\n"],"mappings":";AAEA,MAAaC,cAAyB;CACpCC,MAAM;CACNC,OAAO;CACPC,MAAM;CACNC,OAAO;EACLC,UAAU;EACVC,QAAQ;EACRC,OAAO;EACT;CACD"}
@@ -0,0 +1,7 @@
1
+ import { GroupField } from "payload";
2
+
3
+ //#region src/fields/mux.d.ts
4
+ declare const muxField: GroupField;
5
+ //#endregion
6
+ export { muxField };
7
+ //# sourceMappingURL=mux.d.mts.map