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

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 (42) hide show
  1. package/dist/adapter/handleDelete.mjs.map +1 -1
  2. package/dist/adapter/handleUpload.mjs.map +1 -1
  3. package/dist/adapter/staticHandler.mjs.map +1 -1
  4. package/dist/adapter/storageAdapter.mjs.map +1 -1
  5. package/dist/collectionHooks/afterChange.mjs.map +1 -1
  6. package/dist/collectionHooks/beforeChange.mjs.map +1 -1
  7. package/dist/collections/mediaCollection.mjs.map +1 -1
  8. package/dist/endpoints/fileExistsHandler.mjs.map +1 -1
  9. package/dist/endpoints/muxAssetHandler.mjs.map +1 -1
  10. package/dist/endpoints/muxCreateUploadHandler.mjs.map +1 -1
  11. package/dist/endpoints/muxWebhookHandler.mjs.map +1 -1
  12. package/dist/endpoints/tusCleanupHandler.mjs.map +1 -1
  13. package/dist/endpoints/tusFolderHandler.mjs.map +1 -1
  14. package/dist/endpoints/tusPostProcessorHandler.mjs.map +1 -1
  15. package/dist/fields/alt.mjs.map +1 -1
  16. package/dist/fields/filename.mjs.map +1 -1
  17. package/dist/fields/height.mjs.map +1 -1
  18. package/dist/fields/mux.mjs.map +1 -1
  19. package/dist/fields/path.mjs.map +1 -1
  20. package/dist/fields/storage.mjs.map +1 -1
  21. package/dist/fields/thumbnail.mjs.map +1 -1
  22. package/dist/fields/width.mjs.map +1 -1
  23. package/dist/hooks/useErrorHandler.mjs +8 -25
  24. package/dist/hooks/useErrorHandler.mjs.map +1 -1
  25. package/dist/hooks/useMediaCloudEmitter.mjs.map +1 -1
  26. package/dist/plugin.mjs.map +1 -1
  27. package/dist/tus/stores/s3/expirationManager.mjs.map +1 -1
  28. package/dist/tus/stores/s3/fileOperations.mjs.map +1 -1
  29. package/dist/tus/stores/s3/index.mjs.map +1 -1
  30. package/dist/tus/stores/s3/metadataManager.mjs.map +1 -1
  31. package/dist/tus/stores/s3/partsManager.mjs.map +1 -1
  32. package/dist/tus/stores/s3/s3Store.mjs +2 -2
  33. package/dist/tus/stores/s3/s3Store.mjs.map +1 -1
  34. package/dist/tus/stores/s3/semaphore.mjs.map +1 -1
  35. package/dist/types/errors.mjs.map +1 -1
  36. package/dist/utils/buildS3Path.mjs.map +1 -1
  37. package/dist/utils/buildThumbnailURL.mjs.map +1 -1
  38. package/dist/utils/defaultOptions.mjs.map +1 -1
  39. package/dist/utils/file.mjs.map +1 -1
  40. package/dist/utils/mux.mjs.map +1 -1
  41. package/dist/utils/tus.mjs.map +1 -1
  42. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"handleDelete.mjs","names":["useErrorHandler","MediaCloudErrors","HandleDelete","Document","Mux","S3Store","HandleDeleteArgs","getS3Store","getMuxClient","DeleteMuxAssetArgs","uploadId","DeleteS3FileArgs","filename","logError","deleteMuxAsset","args","Promise","mux","assets","video","list","upload_id","data","length","asset","delete","id","_error","MUX_ASSET_DELETE_ERROR","message","deleteS3File","client","bucket","deleteObjects","Bucket","Delete","Objects","Key","S3_DELETE_ERROR","getHandleDelete","doc","req","method","media","storage","UNKNOWN_STORAGE_TYPE"],"sources":["../../src/adapter/handleDelete.ts"],"sourcesContent":["import { useErrorHandler } from '../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../types/errors'\n\nimport type { HandleDelete } from '@payloadcms/plugin-cloud-storage/types'\nimport type { Document } from 'payload'\nimport type { Mux } from '@mux/mux-node'\nimport type { S3Store } from '../tus/stores/s3/s3Store'\n\ninterface HandleDeleteArgs {\n getS3Store: () => S3Store\n getMuxClient: () => Mux\n}\n\ninterface DeleteMuxAssetArgs {\n getMuxClient: () => Mux\n uploadId: string\n}\n\ninterface DeleteS3FileArgs {\n getS3Store: () => S3Store\n filename: string\n}\n\nconst { logError } = useErrorHandler()\n\n/**\n * Deletes a Mux asset by upload ID\n * @param args - The arguments for deleting the Mux asset\n * @param args.getMuxClient - Function that returns a Mux client instance\n * @param args.uploadId - The upload ID of the Mux asset to delete\n * @returns Promise that resolves when the asset is deleted or rejects on error\n */\nasync function deleteMuxAsset(args: DeleteMuxAssetArgs): Promise<void> {\n const { getMuxClient, uploadId } = args\n\n try {\n const mux = getMuxClient()\n const assets = await mux.video.assets.list({ upload_id: uploadId })\n if (assets.data.length > 0) {\n const asset = assets.data[0]\n await mux.video.assets.delete(asset.id)\n }\n } catch (_error) {\n logError(MediaCloudErrors.MUX_ASSET_DELETE_ERROR.message)\n }\n}\n\n/**\n * Deletes a file from S3 storage including its metadata info file\n * @param args - The arguments for deleting the S3 file\n * @param args.getS3Store - Function that returns an S3 client instance\n * @param args.filename - The filename of the file to delete from S3\n * @returns Promise that resolves when the file is deleted or rejects on error\n */\nasync function deleteS3File(args: DeleteS3FileArgs): Promise<void> {\n const { getS3Store, filename } = args\n\n try {\n const { client, bucket } = getS3Store()\n await client.deleteObjects({\n Bucket: bucket,\n Delete: {\n Objects: [{ Key: filename }, { Key: `${filename}.info` }],\n },\n })\n } catch (_error) {\n logError(MediaCloudErrors.S3_DELETE_ERROR.message)\n }\n}\n\n/**\n * Creates a handle delete function for processing file deletions from both Mux and S3 storage\n * @param args - The arguments for creating the delete handler\n * @param args.getS3Store - Function that returns an S3 client instance\n * @param args.getMuxClient - Function that returns a Mux client instance\n * @returns A HandleDelete function that processes deletion requests based on storage type\n */\nexport function getHandleDelete(args: HandleDeleteArgs): HandleDelete {\n const { getS3Store, getMuxClient } = args\n return async ({ doc, req }) => {\n if (req?.method !== 'DELETE' || !doc) {\n return\n }\n\n const media = doc as Document\n\n switch (media?.storage) {\n case 'mux':\n if (media.mux?.uploadId) {\n await deleteMuxAsset({ getMuxClient, uploadId: media.mux.uploadId })\n }\n break\n case 's3':\n if (media.filename) {\n await deleteS3File({ getS3Store, filename: media.filename })\n }\n break\n default:\n logError(MediaCloudErrors.UNKNOWN_STORAGE_TYPE.message)\n }\n }\n}\n"],"mappings":";;;;AAuBA,MAAM,EAAEa,aAAab,iBAAiB;;;;;;;;AAStC,eAAec,eAAeC,MAAyC;CACrE,MAAM,EAAEP,cAAcE,aAAaK;AAEnC,KAAI;EACF,MAAME,MAAMT,cAAc;EAC1B,MAAMU,SAAS,MAAMD,IAAIE,MAAMD,OAAOE,KAAK,EAAEC,WAAWX,UAAU,CAAC;AACnE,MAAIQ,OAAOI,KAAKC,SAAS,GAAG;GAC1B,MAAMC,QAAQN,OAAOI,KAAK;AAC1B,SAAML,IAAIE,MAAMD,OAAOO,OAAOD,MAAME,GAAG;;UAElCC,QAAQ;AACfd,WAASZ,iBAAiB2B,uBAAuBC,QAAQ;;;;;;;;;;AAW7D,eAAeC,aAAaf,MAAuC;CACjE,MAAM,EAAER,YAAYK,aAAaG;AAEjC,KAAI;EACF,MAAM,EAAEgB,QAAQC,WAAWzB,YAAY;AACvC,QAAMwB,OAAOE,cAAc;GACzBC,QAAQF;GACRG,QAAQ,EACNC,SAAS,CAAC,EAAEC,KAAKzB,UAAU,EAAE,EAAEyB,KAAK,GAAGzB,SAAQ,QAAS,CAAA,EAC1D;GACD,CAAC;UACKe,QAAQ;AACfd,WAASZ,iBAAiBqC,gBAAgBT,QAAQ;;;;;;;;;;AAWtD,SAAgBU,gBAAgBxB,MAAsC;CACpE,MAAM,EAAER,YAAYC,iBAAiBO;AACrC,QAAO,OAAO,EAAEyB,KAAKC,UAAU;AAC7B,MAAIA,KAAKC,WAAW,YAAY,CAACF,IAC/B;EAGF,MAAMG,QAAQH;AAEd,UAAQG,OAAOC,SAAf;GACE,KAAK;AACH,QAAID,MAAM1B,KAAKP,SACb,OAAMI,eAAe;KAAEN;KAAcE,UAAUiC,MAAM1B,IAAIP;KAAU,CAAC;AAEtE;GACF,KAAK;AACH,QAAIiC,MAAM/B,SACR,OAAMkB,aAAa;KAAEvB;KAAYK,UAAU+B,MAAM/B;KAAU,CAAC;AAE9D;GACF,QACEC,UAASZ,iBAAiB4C,qBAAqBhB,QAAQ"}
1
+ {"version":3,"file":"handleDelete.mjs","names":[],"sources":["../../src/adapter/handleDelete.ts"],"sourcesContent":["import { useErrorHandler } from '../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../types/errors'\n\nimport type { HandleDelete } from '@payloadcms/plugin-cloud-storage/types'\nimport type { Document } from 'payload'\nimport type { Mux } from '@mux/mux-node'\nimport type { S3Store } from '../tus/stores/s3/s3Store'\n\ninterface HandleDeleteArgs {\n getS3Store: () => S3Store\n getMuxClient: () => Mux\n}\n\ninterface DeleteMuxAssetArgs {\n getMuxClient: () => Mux\n uploadId: string\n}\n\ninterface DeleteS3FileArgs {\n getS3Store: () => S3Store\n filename: string\n}\n\nconst { logError } = useErrorHandler()\n\n/**\n * Deletes a Mux asset by upload ID\n * @param args - The arguments for deleting the Mux asset\n * @param args.getMuxClient - Function that returns a Mux client instance\n * @param args.uploadId - The upload ID of the Mux asset to delete\n * @returns Promise that resolves when the asset is deleted or rejects on error\n */\nasync function deleteMuxAsset(args: DeleteMuxAssetArgs): Promise<void> {\n const { getMuxClient, uploadId } = args\n\n try {\n const mux = getMuxClient()\n const assets = await mux.video.assets.list({ upload_id: uploadId })\n if (assets.data.length > 0) {\n const asset = assets.data[0]\n await mux.video.assets.delete(asset.id)\n }\n } catch (_error) {\n logError(MediaCloudErrors.MUX_ASSET_DELETE_ERROR.message)\n }\n}\n\n/**\n * Deletes a file from S3 storage including its metadata info file\n * @param args - The arguments for deleting the S3 file\n * @param args.getS3Store - Function that returns an S3 client instance\n * @param args.filename - The filename of the file to delete from S3\n * @returns Promise that resolves when the file is deleted or rejects on error\n */\nasync function deleteS3File(args: DeleteS3FileArgs): Promise<void> {\n const { getS3Store, filename } = args\n\n try {\n const { client, bucket } = getS3Store()\n await client.deleteObjects({\n Bucket: bucket,\n Delete: {\n Objects: [{ Key: filename }, { Key: `${filename}.info` }],\n },\n })\n } catch (_error) {\n logError(MediaCloudErrors.S3_DELETE_ERROR.message)\n }\n}\n\n/**\n * Creates a handle delete function for processing file deletions from both Mux and S3 storage\n * @param args - The arguments for creating the delete handler\n * @param args.getS3Store - Function that returns an S3 client instance\n * @param args.getMuxClient - Function that returns a Mux client instance\n * @returns A HandleDelete function that processes deletion requests based on storage type\n */\nexport function getHandleDelete(args: HandleDeleteArgs): HandleDelete {\n const { getS3Store, getMuxClient } = args\n return async ({ doc, req }) => {\n if (req?.method !== 'DELETE' || !doc) {\n return\n }\n\n const media = doc as Document\n\n switch (media?.storage) {\n case 'mux':\n if (media.mux?.uploadId) {\n await deleteMuxAsset({ getMuxClient, uploadId: media.mux.uploadId })\n }\n break\n case 's3':\n if (media.filename) {\n await deleteS3File({ getS3Store, filename: media.filename })\n }\n break\n default:\n logError(MediaCloudErrors.UNKNOWN_STORAGE_TYPE.message)\n }\n }\n}\n"],"mappings":";;;;AAuBA,MAAM,EAAE,aAAa,iBAAiB;;;;;;;;AAStC,eAAe,eAAe,MAAyC;CACrE,MAAM,EAAE,cAAc,aAAa;AAEnC,KAAI;EACF,MAAM,MAAM,cAAc;EAC1B,MAAM,SAAS,MAAM,IAAI,MAAM,OAAO,KAAK,EAAE,WAAW,UAAU,CAAC;AACnE,MAAI,OAAO,KAAK,SAAS,GAAG;GAC1B,MAAM,QAAQ,OAAO,KAAK;AAC1B,SAAM,IAAI,MAAM,OAAO,OAAO,MAAM,GAAG;;UAElC,QAAQ;AACf,WAAS,iBAAiB,uBAAuB,QAAQ;;;;;;;;;;AAW7D,eAAe,aAAa,MAAuC;CACjE,MAAM,EAAE,YAAY,aAAa;AAEjC,KAAI;EACF,MAAM,EAAE,QAAQ,WAAW,YAAY;AACvC,QAAM,OAAO,cAAc;GACzB,QAAQ;GACR,QAAQ,EACN,SAAS,CAAC,EAAE,KAAK,UAAU,EAAE,EAAE,KAAK,GAAG,SAAS,QAAQ,CAAC,EAC1D;GACF,CAAC;UACK,QAAQ;AACf,WAAS,iBAAiB,gBAAgB,QAAQ;;;;;;;;;;AAWtD,SAAgB,gBAAgB,MAAsC;CACpE,MAAM,EAAE,YAAY,iBAAiB;AACrC,QAAO,OAAO,EAAE,KAAK,UAAU;AAC7B,MAAI,KAAK,WAAW,YAAY,CAAC,IAC/B;EAGF,MAAM,QAAQ;AAEd,UAAQ,OAAO,SAAf;GACE,KAAK;AACH,QAAI,MAAM,KAAK,SACb,OAAM,eAAe;KAAE;KAAc,UAAU,MAAM,IAAI;KAAU,CAAC;AAEtE;GACF,KAAK;AACH,QAAI,MAAM,SACR,OAAM,aAAa;KAAE;KAAY,UAAU,MAAM;KAAU,CAAC;AAE9D;GACF,QACE,UAAS,iBAAiB,qBAAqB,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"handleUpload.mjs","names":["HandleUpload","ClientUploadContext","storage","uploadId","mimeType","getHandleUpload","clientUploadContext","data","ctx","mux","status"],"sources":["../../src/adapter/handleUpload.ts"],"sourcesContent":["import type { HandleUpload } from '@payloadcms/plugin-cloud-storage/types'\n\ninterface ClientUploadContext {\n storage: 'mux' | 's3'\n uploadId?: string\n mimeType?: string\n}\n\n/**\n * Creates a handle upload function for processing file uploads to both Mux and S3 storage\n * @returns A HandleUpload function that processes client upload context and updates document data\n */\nexport function getHandleUpload(): HandleUpload {\n return async function ({ clientUploadContext, data }) {\n if (!clientUploadContext) {\n return data\n }\n\n const ctx = clientUploadContext as ClientUploadContext\n data.mimeType = ctx.mimeType\n\n switch (ctx.storage) {\n case 'mux':\n data.storage = 'mux'\n data.mux = {\n uploadId: ctx.uploadId ?? '',\n status: 'preparing',\n }\n break\n default:\n data.storage = 's3'\n break\n }\n\n return data\n }\n}\n"],"mappings":";;;;;AAYA,SAAgBK,kBAAgC;AAC9C,QAAO,eAAgB,EAAEC,qBAAqBC,QAAQ;AACpD,MAAI,CAACD,oBACH,QAAOC;EAGT,MAAMC,MAAMF;AACZC,OAAKH,WAAWI,IAAIJ;AAEpB,UAAQI,IAAIN,SAAZ;GACE,KAAK;AACHK,SAAKL,UAAU;AACfK,SAAKE,MAAM;KACTN,UAAUK,IAAIL,YAAY;KAC1BO,QAAQ;KACT;AACD;GACF;AACEH,SAAKL,UAAU;AACf;;AAGJ,SAAOK"}
1
+ {"version":3,"file":"handleUpload.mjs","names":[],"sources":["../../src/adapter/handleUpload.ts"],"sourcesContent":["import type { HandleUpload } from '@payloadcms/plugin-cloud-storage/types'\n\ninterface ClientUploadContext {\n storage: 'mux' | 's3'\n uploadId?: string\n mimeType?: string\n}\n\n/**\n * Creates a handle upload function for processing file uploads to both Mux and S3 storage\n * @returns A HandleUpload function that processes client upload context and updates document data\n */\nexport function getHandleUpload(): HandleUpload {\n return async function ({ clientUploadContext, data }) {\n if (!clientUploadContext) {\n return data\n }\n\n const ctx = clientUploadContext as ClientUploadContext\n data.mimeType = ctx.mimeType\n\n switch (ctx.storage) {\n case 'mux':\n data.storage = 'mux'\n data.mux = {\n uploadId: ctx.uploadId ?? '',\n status: 'preparing',\n }\n break\n default:\n data.storage = 's3'\n break\n }\n\n return data\n }\n}\n"],"mappings":";;;;;AAYA,SAAgB,kBAAgC;AAC9C,QAAO,eAAgB,EAAE,qBAAqB,QAAQ;AACpD,MAAI,CAAC,oBACH,QAAO;EAGT,MAAM,MAAM;AACZ,OAAK,WAAW,IAAI;AAEpB,UAAQ,IAAI,SAAZ;GACE,KAAK;AACH,SAAK,UAAU;AACf,SAAK,MAAM;KACT,UAAU,IAAI,YAAY;KAC1B,QAAQ;KACT;AACD;GACF;AACE,SAAK,UAAU;AACf;;AAGJ,SAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"staticHandler.mjs","names":["Readable","StaticHandler","Document","S3Store","StaticHandlerArgs","getS3Store","collection","ServeS3FileArgs","doc","CreateEmptyResponseArgs","mimeType","getStaticHandler","args","req","params","payload","filename","docs","find","where","equals","createEmptyResponse","storage","serveS3File","Response","Uint8Array","status","headers","Promise","s3Store","stream","read","webStream","toWeb","ReadableStream","_error"],"sources":["../../src/adapter/staticHandler.ts"],"sourcesContent":["import { Readable } from 'node:stream'\nimport type { StaticHandler } from '@payloadcms/plugin-cloud-storage/types'\nimport type { Document } from 'payload'\nimport type { S3Store } from '../tus/stores/s3/s3Store'\n\ninterface StaticHandlerArgs {\n getS3Store: () => S3Store\n collection: string\n}\n\ninterface ServeS3FileArgs {\n getS3Store: () => S3Store\n doc: Document\n}\n\ninterface CreateEmptyResponseArgs {\n mimeType?: string\n}\n\n/**\n * Creates a static handler that serves files from S3 or returns empty responses for Mux assets\n * @param args - The arguments for creating the static handler\n * @param args.getS3Store - Function that returns an S3 client instance\n * @param args.collection - The name of the media collection in Payload\n * @returns A StaticHandler function that serves files or empty responses based on storage type\n */\nexport function getStaticHandler(args: StaticHandlerArgs): StaticHandler {\n const { getS3Store, collection } = args\n return async (req, { params }) => {\n const { payload } = req\n const filename = params.filename\n\n const { docs } = await payload.find({\n collection,\n where: { filename: { equals: filename } },\n })\n\n const doc = docs[0] as Document\n\n if (!doc) {\n return createEmptyResponse()\n }\n\n if (doc.storage === 'mux') {\n return createEmptyResponse({ mimeType: doc.mimeType })\n }\n\n return await serveS3File({ getS3Store, doc })\n }\n}\n\n/**\n * Creates an empty response with appropriate headers\n * @param args - Optional arguments for the empty response\n * @param args.mimeType - The MIME type to set in the Content-Type header\n * @returns A Response object with empty content and appropriate headers\n */\nfunction createEmptyResponse(args?: CreateEmptyResponseArgs): Response {\n const { mimeType = 'application/octet-stream' } = args ?? {}\n return new Response(new Uint8Array(0), {\n status: 200,\n headers: {\n 'Content-Type': mimeType,\n 'Content-Length': '0',\n },\n })\n}\n\n/**\n * Serves a file from S3 storage\n * @param args - The arguments for serving the S3 file\n * @param args.getS3Store - Function that returns an S3 client instance\n * @param args.doc - The document containing file metadata\n * @returns A Promise that resolves to a Response object containing the file stream or empty response on error\n */\nasync function serveS3File({\n getS3Store,\n doc,\n}: ServeS3FileArgs): Promise<Response> {\n try {\n const s3Store = getS3Store()\n const stream = await s3Store.read(doc.filename)\n\n if (stream) {\n const webStream = Readable.toWeb(stream) as ReadableStream<Uint8Array>\n return new Response(webStream)\n }\n } catch (_error) {\n // File not found or other error, fall back to empty response\n }\n\n return createEmptyResponse({})\n}\n"],"mappings":";;;;;;;;;;AA0BA,SAAgBW,iBAAiBC,MAAwC;CACvE,MAAM,EAAEP,YAAYC,eAAeM;AACnC,QAAO,OAAOC,KAAK,EAAEC,aAAa;EAChC,MAAM,EAAEC,YAAYF;EACpB,MAAMG,WAAWF,OAAOE;EAExB,MAAM,EAAEC,SAAS,MAAMF,QAAQG,KAAK;GAClCZ;GACAa,OAAO,EAAEH,UAAU,EAAEI,QAAQJ,UAAS,EAAE;GACzC,CAAC;EAEF,MAAMR,MAAMS,KAAK;AAEjB,MAAI,CAACT,IACH,QAAOa,qBAAqB;AAG9B,MAAIb,IAAIc,YAAY,MAClB,QAAOD,oBAAoB,EAAEX,UAAUF,IAAIE,UAAU,CAAC;AAGxD,SAAO,MAAMa,YAAY;GAAElB;GAAYG;GAAK,CAAC;;;;;;;;;AAUjD,SAASa,oBAAoBT,MAA0C;CACrE,MAAM,EAAEF,WAAW,+BAA+BE,QAAQ,EAAE;AAC5D,QAAO,IAAIY,SAAS,IAAIC,WAAW,EAAE,EAAE;EACrCC,QAAQ;EACRC,SAAS;GACP,gBAAgBjB;GAChB,kBAAkB;GACpB;EACD,CAAC;;;;;;;;;AAUJ,eAAea,YAAY,EACzBlB,YACAG,OACqC;AACrC,KAAI;EAEF,MAAMsB,WAAS,MADCzB,YAAY,CACC0B,KAAKvB,IAAIQ,SAAS;AAE/C,MAAIc,UAAQ;GACV,MAAME,YAAYhC,SAASiC,MAAMH,SAAO;AACxC,UAAO,IAAIN,SAASQ,UAAU;;UAEzBG,QAAQ;AAIjB,QAAOd,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"staticHandler.mjs","names":["stream"],"sources":["../../src/adapter/staticHandler.ts"],"sourcesContent":["import { Readable } from 'node:stream'\nimport type { StaticHandler } from '@payloadcms/plugin-cloud-storage/types'\nimport type { Document } from 'payload'\nimport type { S3Store } from '../tus/stores/s3/s3Store'\n\ninterface StaticHandlerArgs {\n getS3Store: () => S3Store\n collection: string\n}\n\ninterface ServeS3FileArgs {\n getS3Store: () => S3Store\n doc: Document\n}\n\ninterface CreateEmptyResponseArgs {\n mimeType?: string\n}\n\n/**\n * Creates a static handler that serves files from S3 or returns empty responses for Mux assets\n * @param args - The arguments for creating the static handler\n * @param args.getS3Store - Function that returns an S3 client instance\n * @param args.collection - The name of the media collection in Payload\n * @returns A StaticHandler function that serves files or empty responses based on storage type\n */\nexport function getStaticHandler(args: StaticHandlerArgs): StaticHandler {\n const { getS3Store, collection } = args\n return async (req, { params }) => {\n const { payload } = req\n const filename = params.filename\n\n const { docs } = await payload.find({\n collection,\n where: { filename: { equals: filename } },\n })\n\n const doc = docs[0] as Document\n\n if (!doc) {\n return createEmptyResponse()\n }\n\n if (doc.storage === 'mux') {\n return createEmptyResponse({ mimeType: doc.mimeType })\n }\n\n return await serveS3File({ getS3Store, doc })\n }\n}\n\n/**\n * Creates an empty response with appropriate headers\n * @param args - Optional arguments for the empty response\n * @param args.mimeType - The MIME type to set in the Content-Type header\n * @returns A Response object with empty content and appropriate headers\n */\nfunction createEmptyResponse(args?: CreateEmptyResponseArgs): Response {\n const { mimeType = 'application/octet-stream' } = args ?? {}\n return new Response(new Uint8Array(0), {\n status: 200,\n headers: {\n 'Content-Type': mimeType,\n 'Content-Length': '0',\n },\n })\n}\n\n/**\n * Serves a file from S3 storage\n * @param args - The arguments for serving the S3 file\n * @param args.getS3Store - Function that returns an S3 client instance\n * @param args.doc - The document containing file metadata\n * @returns A Promise that resolves to a Response object containing the file stream or empty response on error\n */\nasync function serveS3File({\n getS3Store,\n doc,\n}: ServeS3FileArgs): Promise<Response> {\n try {\n const s3Store = getS3Store()\n const stream = await s3Store.read(doc.filename)\n\n if (stream) {\n const webStream = Readable.toWeb(stream) as ReadableStream<Uint8Array>\n return new Response(webStream)\n }\n } catch (_error) {\n // File not found or other error, fall back to empty response\n }\n\n return createEmptyResponse({})\n}\n"],"mappings":";;;;;;;;;;AA0BA,SAAgB,iBAAiB,MAAwC;CACvE,MAAM,EAAE,YAAY,eAAe;AACnC,QAAO,OAAO,KAAK,EAAE,aAAa;EAChC,MAAM,EAAE,YAAY;EACpB,MAAM,WAAW,OAAO;EAExB,MAAM,EAAE,SAAS,MAAM,QAAQ,KAAK;GAClC;GACA,OAAO,EAAE,UAAU,EAAE,QAAQ,UAAU,EAAE;GAC1C,CAAC;EAEF,MAAM,MAAM,KAAK;AAEjB,MAAI,CAAC,IACH,QAAO,qBAAqB;AAG9B,MAAI,IAAI,YAAY,MAClB,QAAO,oBAAoB,EAAE,UAAU,IAAI,UAAU,CAAC;AAGxD,SAAO,MAAM,YAAY;GAAE;GAAY;GAAK,CAAC;;;;;;;;;AAUjD,SAAS,oBAAoB,MAA0C;CACrE,MAAM,EAAE,WAAW,+BAA+B,QAAQ,EAAE;AAC5D,QAAO,IAAI,SAAS,IAAI,WAAW,EAAE,EAAE;EACrC,QAAQ;EACR,SAAS;GACP,gBAAgB;GAChB,kBAAkB;GACnB;EACF,CAAC;;;;;;;;;AAUJ,eAAe,YAAY,EACzB,YACA,OACqC;AACrC,KAAI;EAEF,MAAMA,WAAS,MADC,YAAY,CACC,KAAK,IAAI,SAAS;AAE/C,MAAIA,UAAQ;GACV,MAAM,YAAY,SAAS,MAAMA,SAAO;AACxC,UAAO,IAAI,SAAS,UAAU;;UAEzB,QAAQ;AAIjB,QAAO,oBAAoB,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"storageAdapter.mjs","names":["getHandleUpload","getHandleDelete","getStaticHandler","Adapter","GeneratedAdapter","Mux","MediaCloudPluginOptions","S3Store","StorageAdapterArgs","pluginOptions","getS3Store","getMuxClient","getStorageAdapter","args","name","clientUploads","handleUpload","handleDelete","staticHandler"],"sources":["../../src/adapter/storageAdapter.ts"],"sourcesContent":["import { getHandleUpload } from './handleUpload'\nimport { getHandleDelete } from './handleDelete'\nimport { getStaticHandler } from './staticHandler'\n\nimport type {\n Adapter,\n GeneratedAdapter,\n} from '@payloadcms/plugin-cloud-storage/types'\nimport type { Mux } from '@mux/mux-node'\nimport type { MediaCloudPluginOptions } from '../types'\nimport type { S3Store } from '../tus/stores/s3/s3Store'\n\ninterface StorageAdapterArgs {\n pluginOptions: MediaCloudPluginOptions\n getS3Store: () => S3Store\n getMuxClient: () => Mux\n}\n\n/**\n * Creates the storage adapter for media cloud plugin\n * @param args - The arguments for creating the storage adapter\n * @param args.pluginOptions - The media cloud plugin options\n * @param args.getS3Store - Function that returns an S3 client instance\n * @param args.getMuxClient - Function that returns a Mux client instance\n * @returns An Adapter function that returns a GeneratedAdapter configuration\n */\nexport function getStorageAdapter(args: StorageAdapterArgs): Adapter {\n const { getS3Store, getMuxClient } = args\n\n return (): GeneratedAdapter => ({\n name: 'media-cloud',\n clientUploads: true,\n handleUpload: getHandleUpload(),\n handleDelete: getHandleDelete({ getS3Store, getMuxClient }),\n staticHandler: getStaticHandler({ getS3Store }),\n })\n}\n"],"mappings":";;;;;;;;;;;;;AA0BA,SAAgBY,kBAAkBC,MAAmC;CACnE,MAAM,EAAEH,YAAYC,iBAAiBE;AAErC,eAAgC;EAC9BC,MAAM;EACNC,eAAe;EACfC,cAAchB,iBAAiB;EAC/BiB,cAAchB,gBAAgB;GAAES;GAAYC;GAAc,CAAC;EAC3DO,eAAehB,iBAAiB,EAAEQ,YAAY,CAAA;EAC/C"}
1
+ {"version":3,"file":"storageAdapter.mjs","names":[],"sources":["../../src/adapter/storageAdapter.ts"],"sourcesContent":["import { getHandleUpload } from './handleUpload'\nimport { getHandleDelete } from './handleDelete'\nimport { getStaticHandler } from './staticHandler'\n\nimport type {\n Adapter,\n GeneratedAdapter,\n} from '@payloadcms/plugin-cloud-storage/types'\nimport type { Mux } from '@mux/mux-node'\nimport type { MediaCloudPluginOptions } from '../types'\nimport type { S3Store } from '../tus/stores/s3/s3Store'\n\ninterface StorageAdapterArgs {\n pluginOptions: MediaCloudPluginOptions\n getS3Store: () => S3Store\n getMuxClient: () => Mux\n}\n\n/**\n * Creates the storage adapter for media cloud plugin\n * @param args - The arguments for creating the storage adapter\n * @param args.pluginOptions - The media cloud plugin options\n * @param args.getS3Store - Function that returns an S3 client instance\n * @param args.getMuxClient - Function that returns a Mux client instance\n * @returns An Adapter function that returns a GeneratedAdapter configuration\n */\nexport function getStorageAdapter(args: StorageAdapterArgs): Adapter {\n const { getS3Store, getMuxClient } = args\n\n return (): GeneratedAdapter => ({\n name: 'media-cloud',\n clientUploads: true,\n handleUpload: getHandleUpload(),\n handleDelete: getHandleDelete({ getS3Store, getMuxClient }),\n staticHandler: getStaticHandler({ getS3Store }),\n })\n}\n"],"mappings":";;;;;;;;;;;;;AA0BA,SAAgB,kBAAkB,MAAmC;CACnE,MAAM,EAAE,YAAY,iBAAiB;AAErC,eAAgC;EAC9B,MAAM;EACN,eAAe;EACf,cAAc,iBAAiB;EAC/B,cAAc,gBAAgB;GAAE;GAAY;GAAc,CAAC;EAC3D,eAAe,iBAAiB,EAAE,YAAY,CAAC;EAChD"}
@@ -1 +1 @@
1
- {"version":3,"file":"afterChange.mjs","names":["buildThumbnailURL","s3Store","MediaCloudErrors","useErrorHandler","CollectionAfterChangeHook","afterChangeHook","collection","doc","previousDoc","req","throwError","path","storage","oldKey","filename","newKey","copy","error","S3_MOVE_ERROR","cause","thumbnail","playbackId","id","undefined","s3Key","payload","update","slug","data"],"sources":["../../src/collectionHooks/afterChange.ts"],"sourcesContent":["import { buildThumbnailURL } from '../utils/buildThumbnailURL'\nimport { s3Store } from '../plugin'\nimport { MediaCloudErrors } from '../types/errors'\nimport { useErrorHandler } from '../hooks/useErrorHandler'\n\nimport type { CollectionAfterChangeHook } from 'payload'\n\nexport const afterChangeHook: CollectionAfterChangeHook = async ({\n collection,\n doc,\n previousDoc,\n req,\n}) => {\n const { throwError } = useErrorHandler()\n\n // Move asset in S3 if path has changed\n if (doc.path !== previousDoc?.path) {\n if (doc.storage === 's3' && s3Store) {\n try {\n const oldKey = previousDoc?.path ?? previousDoc?.filename\n const newKey = doc.path\n\n await s3Store.copy(oldKey, newKey)\n } catch (error) {\n throwError({ ...MediaCloudErrors.S3_MOVE_ERROR, cause: error })\n }\n }\n }\n\n // Handle thumbnail\n if (!doc.thumbnail || previousDoc?.path !== doc.path) {\n const thumbnail = buildThumbnailURL({\n storage: doc.storage,\n playbackId: doc.storage === 'mux' ? doc.id : undefined,\n s3Key: doc.storage === 's3' ? (doc.path ?? doc.filename) : undefined,\n s3Store,\n })\n\n req.payload.update({\n collection: collection.slug,\n id: doc.id,\n data: { thumbnail },\n })\n }\n\n return doc\n}\n"],"mappings":";;;;;;AAOA,MAAaK,kBAA6C,OAAO,EAC/DC,YACAC,KACAC,aACAC,UACI;CACJ,MAAM,EAAEC,eAAeP,iBAAiB;AAGxC,KAAII,IAAII,SAASH,aAAaG,MAC5B;MAAIJ,IAAIK,YAAY,QAAQX,QAC1B,KAAI;GACF,MAAMY,SAASL,aAAaG,QAAQH,aAAaM;GACjD,MAAMC,SAASR,IAAII;AAEnB,SAAMV,QAAQe,KAAKH,QAAQE,OAAO;WAC3BE,OAAO;AACdP,cAAW;IAAE,GAAGR,iBAAiBgB;IAAeC,OAAOF;IAAO,CAAC;;;AAMrE,KAAI,CAACV,IAAIa,aAAaZ,aAAaG,SAASJ,IAAII,MAAM;EACpD,MAAMS,YAAYpB,kBAAkB;GAClCY,SAASL,IAAIK;GACbS,YAAYd,IAAIK,YAAY,QAAQL,IAAIe,KAAKC;GAC7CC,OAAOjB,IAAIK,YAAY,OAAQL,IAAII,QAAQJ,IAAIO,WAAYS;GAC3DtB;GACD,CAAC;AAEFQ,MAAIgB,QAAQC,OAAO;GACjBpB,YAAYA,WAAWqB;GACvBL,IAAIf,IAAIe;GACRM,MAAM,EAAER,WAAU;GACnB,CAAC;;AAGJ,QAAOb"}
1
+ {"version":3,"file":"afterChange.mjs","names":["afterChangeHook: CollectionAfterChangeHook"],"sources":["../../src/collectionHooks/afterChange.ts"],"sourcesContent":["import { buildThumbnailURL } from '../utils/buildThumbnailURL'\nimport { s3Store } from '../plugin'\nimport { MediaCloudErrors } from '../types/errors'\nimport { useErrorHandler } from '../hooks/useErrorHandler'\n\nimport type { CollectionAfterChangeHook } from 'payload'\n\nexport const afterChangeHook: CollectionAfterChangeHook = async ({\n collection,\n doc,\n previousDoc,\n req,\n}) => {\n const { throwError } = useErrorHandler()\n\n // Move asset in S3 if path has changed\n if (doc.path !== previousDoc?.path) {\n if (doc.storage === 's3' && s3Store) {\n try {\n const oldKey = previousDoc?.path ?? previousDoc?.filename\n const newKey = doc.path\n\n await s3Store.copy(oldKey, newKey)\n } catch (error) {\n throwError({ ...MediaCloudErrors.S3_MOVE_ERROR, cause: error })\n }\n }\n }\n\n // Handle thumbnail\n if (!doc.thumbnail || previousDoc?.path !== doc.path) {\n const thumbnail = buildThumbnailURL({\n storage: doc.storage,\n playbackId: doc.storage === 'mux' ? doc.id : undefined,\n s3Key: doc.storage === 's3' ? (doc.path ?? doc.filename) : undefined,\n s3Store,\n })\n\n req.payload.update({\n collection: collection.slug,\n id: doc.id,\n data: { thumbnail },\n })\n }\n\n return doc\n}\n"],"mappings":";;;;;;AAOA,MAAaA,kBAA6C,OAAO,EAC/D,YACA,KACA,aACA,UACI;CACJ,MAAM,EAAE,eAAe,iBAAiB;AAGxC,KAAI,IAAI,SAAS,aAAa,MAC5B;MAAI,IAAI,YAAY,QAAQ,QAC1B,KAAI;GACF,MAAM,SAAS,aAAa,QAAQ,aAAa;GACjD,MAAM,SAAS,IAAI;AAEnB,SAAM,QAAQ,KAAK,QAAQ,OAAO;WAC3B,OAAO;AACd,cAAW;IAAE,GAAG,iBAAiB;IAAe,OAAO;IAAO,CAAC;;;AAMrE,KAAI,CAAC,IAAI,aAAa,aAAa,SAAS,IAAI,MAAM;EACpD,MAAM,YAAY,kBAAkB;GAClC,SAAS,IAAI;GACb,YAAY,IAAI,YAAY,QAAQ,IAAI,KAAK;GAC7C,OAAO,IAAI,YAAY,OAAQ,IAAI,QAAQ,IAAI,WAAY;GAC3D;GACD,CAAC;AAEF,MAAI,QAAQ,OAAO;GACjB,YAAY,WAAW;GACvB,IAAI,IAAI;GACR,MAAM,EAAE,WAAW;GACpB,CAAC;;AAGJ,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"beforeChange.mjs","names":["useErrorHandler","MediaCloudErrors","buildS3Path","CollectionBeforeChangeHook","beforeChangeHook","data","originalDoc","req","throwError","filename","folder","prefix","payload","findByID","id","collection","select","name","error","FOLDER_FETCH_ERROR","cause","path"],"sources":["../../src/collectionHooks/beforeChange.ts"],"sourcesContent":["import { useErrorHandler } from '../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../types/errors'\nimport { buildS3Path } from '../utils/buildS3Path'\nimport type { CollectionBeforeChangeHook } from 'payload'\n\nexport const beforeChangeHook: CollectionBeforeChangeHook = async ({\n data,\n originalDoc,\n req,\n}) => {\n const { throwError } = useErrorHandler()\n // Update path\n if (\n (data.filename && data.filename !== originalDoc?.filename) ||\n (data.folder && data.folder !== originalDoc?.folder) ||\n !data.folder\n ) {\n let prefix = ''\n\n if (data.folder) {\n try {\n const folder = await req.payload.findByID({\n id: data.folder,\n collection: 'payload-folders',\n select: { name: true, folder: true },\n })\n\n if (folder) {\n prefix = buildS3Path(folder)\n }\n } catch (error) {\n throwError({ ...MediaCloudErrors.FOLDER_FETCH_ERROR, cause: error })\n }\n }\n\n // Save path\n data.path = prefix ? `${prefix}/${data.filename}` : data.filename\n }\n\n return data\n}\n"],"mappings":";;;;;AAKA,MAAaI,mBAA+C,OAAO,EACjEC,MACAC,aACAC,UACI;CACJ,MAAM,EAAEC,eAAeR,iBAAiB;AAExC,KACGK,KAAKI,YAAYJ,KAAKI,aAAaH,aAAaG,YAChDJ,KAAKK,UAAUL,KAAKK,WAAWJ,aAAaI,UAC7C,CAACL,KAAKK,QACN;EACA,IAAIC,SAAS;AAEb,MAAIN,KAAKK,OACP,KAAI;GACF,MAAMA,SAAS,MAAMH,IAAIK,QAAQC,SAAS;IACxCC,IAAIT,KAAKK;IACTK,YAAY;IACZC,QAAQ;KAAEC,MAAM;KAAMP,QAAQ;KAAK;IACpC,CAAC;AAEF,OAAIA,OACFC,UAAST,YAAYQ,OAAO;WAEvBQ,OAAO;AACdV,cAAW;IAAE,GAAGP,iBAAiBkB;IAAoBC,OAAOF;IAAO,CAAC;;AAKxEb,OAAKgB,OAAOV,SAAS,GAAGA,OAAM,GAAIN,KAAKI,aAAaJ,KAAKI;;AAG3D,QAAOJ"}
1
+ {"version":3,"file":"beforeChange.mjs","names":["beforeChangeHook: CollectionBeforeChangeHook"],"sources":["../../src/collectionHooks/beforeChange.ts"],"sourcesContent":["import { useErrorHandler } from '../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../types/errors'\nimport { buildS3Path } from '../utils/buildS3Path'\nimport type { CollectionBeforeChangeHook } from 'payload'\n\nexport const beforeChangeHook: CollectionBeforeChangeHook = async ({\n data,\n originalDoc,\n req,\n}) => {\n const { throwError } = useErrorHandler()\n // Update path\n if (\n (data.filename && data.filename !== originalDoc?.filename) ||\n (data.folder && data.folder !== originalDoc?.folder) ||\n !data.folder\n ) {\n let prefix = ''\n\n if (data.folder) {\n try {\n const folder = await req.payload.findByID({\n id: data.folder,\n collection: 'payload-folders',\n select: { name: true, folder: true },\n })\n\n if (folder) {\n prefix = buildS3Path(folder)\n }\n } catch (error) {\n throwError({ ...MediaCloudErrors.FOLDER_FETCH_ERROR, cause: error })\n }\n }\n\n // Save path\n data.path = prefix ? `${prefix}/${data.filename}` : data.filename\n }\n\n return data\n}\n"],"mappings":";;;;;AAKA,MAAaA,mBAA+C,OAAO,EACjE,MACA,aACA,UACI;CACJ,MAAM,EAAE,eAAe,iBAAiB;AAExC,KACG,KAAK,YAAY,KAAK,aAAa,aAAa,YAChD,KAAK,UAAU,KAAK,WAAW,aAAa,UAC7C,CAAC,KAAK,QACN;EACA,IAAI,SAAS;AAEb,MAAI,KAAK,OACP,KAAI;GACF,MAAM,SAAS,MAAM,IAAI,QAAQ,SAAS;IACxC,IAAI,KAAK;IACT,YAAY;IACZ,QAAQ;KAAE,MAAM;KAAM,QAAQ;KAAM;IACrC,CAAC;AAEF,OAAI,OACF,UAAS,YAAY,OAAO;WAEvB,OAAO;AACd,cAAW;IAAE,GAAG,iBAAiB;IAAoB,OAAO;IAAO,CAAC;;AAKxE,OAAK,OAAO,SAAS,GAAG,OAAO,GAAG,KAAK,aAAa,KAAK;;AAG3D,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"mediaCollection.mjs","names":["thumbnailField","pathField","filenameField","altField","widthField","heightField","storageField","muxField","beforeChangeHook","afterChangeHook","CollectionConfig","Document","MediaCloudPluginOptions","GetMediaCollectionArgs","view","folders","baseCollection","getMediaCollection","args","components","views","list","Component","undefined","afterChange","beforeChange","config","slug","custom","storage","access","read","delete","admin","group","pagination","defaultLimit","upload","crop","displayPreview","hideRemoveFile","adminThumbnail","doc","thumbnail","fields","type","hooks"],"sources":["../../src/collections/mediaCollection.ts"],"sourcesContent":["import { thumbnailField } from '../fields/thumbnail'\nimport { pathField } from '../fields/path'\nimport { filenameField } from '../fields/filename'\nimport { altField } from '../fields/alt'\nimport { widthField } from '../fields/width'\nimport { heightField } from '../fields/height'\nimport { storageField } from '../fields/storage'\nimport { muxField } from '../fields/mux'\n\nimport { beforeChangeHook } from '../collectionHooks/beforeChange'\nimport { afterChangeHook } from '../collectionHooks/afterChange'\n\nimport type { CollectionConfig } from 'payload'\nimport type { Document } from 'payload'\nimport type { MediaCloudPluginOptions } from '../types/index'\n\ninterface GetMediaCollectionArgs {\n view: MediaCloudPluginOptions['view']\n folders: MediaCloudPluginOptions['folders']\n baseCollection?: CollectionConfig\n}\n\n/**\n * Creates a media collection configuration for Payload CMS\n * @param args - Arguments including the S3Store instance\n * @returns A configured Payload collection for media files\n */\nexport function getMediaCollection(\n args: GetMediaCollectionArgs\n): CollectionConfig {\n const { baseCollection, view, folders } = args\n\n // Override list view to use grid view if specified\n const components =\n view === 'grid'\n ? {\n views: {\n list: {\n Component: '@maas/payload-plugin-media-cloud/components#GridView',\n },\n },\n }\n : undefined\n\n // Add hook, if folders are enabled\n // to handle thumbnails and S3 prefixing\n const afterChange = folders ? [afterChangeHook] : []\n const beforeChange = folders ? [beforeChangeHook] : []\n\n const config: CollectionConfig = {\n slug: 'media',\n custom: {\n storage: 'test',\n },\n access: {\n read: () => true,\n delete: () => true,\n },\n admin: {\n components,\n group: 'Media Cloud',\n pagination: {\n defaultLimit: 50,\n },\n },\n upload: {\n crop: false,\n displayPreview: true,\n hideRemoveFile: true,\n adminThumbnail({ doc }: { doc: Document }) {\n return doc.thumbnail ?? null\n },\n },\n fields: [\n thumbnailField,\n pathField,\n altField,\n {\n type: 'row',\n fields: [widthField, heightField],\n },\n storageField,\n muxField,\n ],\n hooks: {\n beforeChange,\n afterChange,\n },\n }\n\n if (!baseCollection) {\n return config\n }\n\n return {\n ...baseCollection,\n slug: baseCollection.slug ?? config.slug,\n admin: {\n ...(config.admin ?? {}),\n ...(baseCollection.admin ?? {}),\n },\n access: {\n ...(config.access ?? {}),\n ...(baseCollection.access ?? {}),\n },\n upload: config.upload,\n fields: [...(baseCollection.fields ?? []), ...config.fields, filenameField],\n hooks: {\n ...baseCollection.hooks,\n beforeChange: [\n ...(baseCollection.hooks?.beforeChange ?? []),\n ...(config.hooks?.beforeChange ?? []),\n ],\n afterChange: [\n ...(baseCollection.hooks?.afterChange ?? []),\n ...(config.hooks?.afterChange ?? []),\n ],\n },\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA2BA,SAAgBiB,mBACdC,MACkB;CAClB,MAAM,EAAEF,gBAAgBF,MAAMC,YAAYG;CAmB1C,MAAMQ,SAA2B;EAC/BC,MAAM;EACNC,QAAQ,EACNC,SAAS,QACV;EACDC,QAAQ;GACNC,YAAY;GACZC,cAAc;GACf;EACDC,OAAO;GACLd,YAzBFL,SAAS,SACL,EACEM,OAAO,EACLC,MAAM,EACJC,WAAW,wDACb,EACF,EACD,GACDC;GAkBFW,OAAO;GACPC,YAAY,EACVC,cAAc,IAChB;GACD;EACDC,QAAQ;GACNC,MAAM;GACNC,gBAAgB;GAChBC,gBAAgB;GAChBC,eAAe,EAAEC,OAA0B;AACzC,WAAOA,IAAIC,aAAa;;GAE3B;EACDC,QAAQ;GACN5C;GACAC;GACAE;GACA;IACE0C,MAAM;IACND,QAAQ,CAACxC,YAAYC,YAAW;IACjC;GACDC;GACAC;GACD;EACDuC,OAAO;GACLrB,cAtCiBV,UAAU,CAACP,iBAAiB,GAAG,EAAE;GAuClDgB,aAxCgBT,UAAU,CAACN,gBAAgB,GAAG,EAAE;GAyClD;EACD;AAED,KAAI,CAACO,eACH,QAAOU;AAGT,QAAO;EACL,GAAGV;EACHW,MAAMX,eAAeW,QAAQD,OAAOC;EACpCM,OAAO;GACL,GAAIP,OAAOO,SAAS,EAAE;GACtB,GAAIjB,eAAeiB,SAAS,EAAE;GAC/B;EACDH,QAAQ;GACN,GAAIJ,OAAOI,UAAU,EAAE;GACvB,GAAId,eAAec,UAAU,EAAE;GAChC;EACDO,QAAQX,OAAOW;EACfO,QAAQ;GAAC,GAAI5B,eAAe4B,UAAU,EAAE;GAAG,GAAGlB,OAAOkB;GAAQ1C;GAAc;EAC3E4C,OAAO;GACL,GAAG9B,eAAe8B;GAClBrB,cAAc,CACZ,GAAIT,eAAe8B,OAAOrB,gBAAgB,EAAE,EAC5C,GAAIC,OAAOoB,OAAOrB,gBAAgB,EAAE,CACrC;GACDD,aAAa,CACX,GAAIR,eAAe8B,OAAOtB,eAAe,EAAE,EAC3C,GAAIE,OAAOoB,OAAOtB,eAAe,EAAE,CAAC;GAExC;EACD"}
1
+ {"version":3,"file":"mediaCollection.mjs","names":["config: CollectionConfig"],"sources":["../../src/collections/mediaCollection.ts"],"sourcesContent":["import { thumbnailField } from '../fields/thumbnail'\nimport { pathField } from '../fields/path'\nimport { filenameField } from '../fields/filename'\nimport { altField } from '../fields/alt'\nimport { widthField } from '../fields/width'\nimport { heightField } from '../fields/height'\nimport { storageField } from '../fields/storage'\nimport { muxField } from '../fields/mux'\n\nimport { beforeChangeHook } from '../collectionHooks/beforeChange'\nimport { afterChangeHook } from '../collectionHooks/afterChange'\n\nimport type { CollectionConfig } from 'payload'\nimport type { Document } from 'payload'\nimport type { MediaCloudPluginOptions } from '../types/index'\n\ninterface GetMediaCollectionArgs {\n view: MediaCloudPluginOptions['view']\n folders: MediaCloudPluginOptions['folders']\n baseCollection?: CollectionConfig\n}\n\n/**\n * Creates a media collection configuration for Payload CMS\n * @param args - Arguments including the S3Store instance\n * @returns A configured Payload collection for media files\n */\nexport function getMediaCollection(\n args: GetMediaCollectionArgs\n): CollectionConfig {\n const { baseCollection, view, folders } = args\n\n // Override list view to use grid view if specified\n const components =\n view === 'grid'\n ? {\n views: {\n list: {\n Component: '@maas/payload-plugin-media-cloud/components#GridView',\n },\n },\n }\n : undefined\n\n // Add hook, if folders are enabled\n // to handle thumbnails and S3 prefixing\n const afterChange = folders ? [afterChangeHook] : []\n const beforeChange = folders ? [beforeChangeHook] : []\n\n const config: CollectionConfig = {\n slug: 'media',\n custom: {\n storage: 'test',\n },\n access: {\n read: () => true,\n delete: () => true,\n },\n admin: {\n components,\n group: 'Media Cloud',\n pagination: {\n defaultLimit: 50,\n },\n },\n upload: {\n crop: false,\n displayPreview: true,\n hideRemoveFile: true,\n adminThumbnail({ doc }: { doc: Document }) {\n return doc.thumbnail ?? null\n },\n },\n fields: [\n thumbnailField,\n pathField,\n altField,\n {\n type: 'row',\n fields: [widthField, heightField],\n },\n storageField,\n muxField,\n ],\n hooks: {\n beforeChange,\n afterChange,\n },\n }\n\n if (!baseCollection) {\n return config\n }\n\n return {\n ...baseCollection,\n slug: baseCollection.slug ?? config.slug,\n admin: {\n ...(config.admin ?? {}),\n ...(baseCollection.admin ?? {}),\n },\n access: {\n ...(config.access ?? {}),\n ...(baseCollection.access ?? {}),\n },\n upload: config.upload,\n fields: [...(baseCollection.fields ?? []), ...config.fields, filenameField],\n hooks: {\n ...baseCollection.hooks,\n beforeChange: [\n ...(baseCollection.hooks?.beforeChange ?? []),\n ...(config.hooks?.beforeChange ?? []),\n ],\n afterChange: [\n ...(baseCollection.hooks?.afterChange ?? []),\n ...(config.hooks?.afterChange ?? []),\n ],\n },\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA2BA,SAAgB,mBACd,MACkB;CAClB,MAAM,EAAE,gBAAgB,MAAM,YAAY;CAmB1C,MAAMA,SAA2B;EAC/B,MAAM;EACN,QAAQ,EACN,SAAS,QACV;EACD,QAAQ;GACN,YAAY;GACZ,cAAc;GACf;EACD,OAAO;GACL,YAzBF,SAAS,SACL,EACE,OAAO,EACL,MAAM,EACJ,WAAW,wDACZ,EACF,EACF,GACD;GAkBF,OAAO;GACP,YAAY,EACV,cAAc,IACf;GACF;EACD,QAAQ;GACN,MAAM;GACN,gBAAgB;GAChB,gBAAgB;GAChB,eAAe,EAAE,OAA0B;AACzC,WAAO,IAAI,aAAa;;GAE3B;EACD,QAAQ;GACN;GACA;GACA;GACA;IACE,MAAM;IACN,QAAQ,CAAC,YAAY,YAAY;IAClC;GACD;GACA;GACD;EACD,OAAO;GACL,cAtCiB,UAAU,CAAC,iBAAiB,GAAG,EAAE;GAuClD,aAxCgB,UAAU,CAAC,gBAAgB,GAAG,EAAE;GAyCjD;EACF;AAED,KAAI,CAAC,eACH,QAAO;AAGT,QAAO;EACL,GAAG;EACH,MAAM,eAAe,QAAQ,OAAO;EACpC,OAAO;GACL,GAAI,OAAO,SAAS,EAAE;GACtB,GAAI,eAAe,SAAS,EAAE;GAC/B;EACD,QAAQ;GACN,GAAI,OAAO,UAAU,EAAE;GACvB,GAAI,eAAe,UAAU,EAAE;GAChC;EACD,QAAQ,OAAO;EACf,QAAQ;GAAC,GAAI,eAAe,UAAU,EAAE;GAAG,GAAG,OAAO;GAAQ;GAAc;EAC3E,OAAO;GACL,GAAG,eAAe;GAClB,cAAc,CACZ,GAAI,eAAe,OAAO,gBAAgB,EAAE,EAC5C,GAAI,OAAO,OAAO,gBAAgB,EAAE,CACrC;GACD,aAAa,CACX,GAAI,eAAe,OAAO,eAAe,EAAE,EAC3C,GAAI,OAAO,OAAO,eAAe,EAAE,CACpC;GACF;EACF"}
@@ -1 +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"}
1
+ {"version":3,"file":"fileExistsHandler.mjs","names":[],"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,SAAgB,qBACd,MACgB;CAChB,MAAM,EAAE,YAAY,eAAe;CACnC,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;GAIhD,MAAM,EAAE,SAAS,MAAM,QAAQ,KAAK;IAClC;IACA,OAAO,EACL,UAAU,EACR,QAAQ,UACT,EACF;IACD,OAAO;IACP,YAAY;IACb,CAAC;AAEF,OAAI,KAAK,SAAS,EAChB,QAAO,SAAS,KACd,EAAE,SAAS,wBAAwB,EACnC,EAAE,QAAQ,KAAK,CAChB;GAIH,MAAM,MAAM,YAAY,CAAC,OAAO,SAAS;AAGzC,QAFmB,MAAM,MAAM,KAAK,EAAE,QAAQ,QAAQ,CAAC,EAExC,WAAW,IACxB,QAAO,SAAS,KAAK,EAAE,SAAS,mBAAmB,EAAE,EAAE,QAAQ,KAAK,CAAC;AAGvE,UAAO,SAAS,KAAK,EAAE,SAAS,kBAAkB,EAAE,EAAE,QAAQ,KAAK,CAAC;WAC7D,QAAQ;AACf,YAAS,iBAAiB,sBAAsB,QAAQ;AACxD,UAAO,SAAS,KACd,EAAE,SAAS,2BAA2B,EACtC,EAAE,QAAQ,KAAK,CAChB"}
@@ -1 +1 @@
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
+ {"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 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,SAAgB,mBACd,MACgB;CAChB,MAAM,EAAE,cAAc,eAAe;AAErC,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;KACA,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;MACA;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 +1 @@
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"}
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 +1 @@
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
+ {"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 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,EAAE,UAAU,QAAQ,iBAAiB;AAE3C,SAAgB,qBACd,MACgB;CAChB,MAAM,EAAE,cAAc,eAAe;AAErC,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;MACnB,OAAO,MAAM;MACb,SAAS,IAAI;MACb;MACD,CAAC;AACF;;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;;;;AAWP,eAAe,eAAe,MAAyC;CACrE,MAAM,EAAE,OAAO,SAAS,eAAe;AAEvC,KAAI,MAAM,WAAW,SAAS;EAC5B,MAAM,EAAE,SAAS,MAAM,QAAQ,KAAK;GAClC;GACA,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;IACA;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 +1 @@
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"}
1
+ {"version":3,"file":"tusCleanupHandler.mjs","names":[],"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,EAAE,aAAa,iBAAiB;AAEtC,SAAgB,qBACd,MACgB;CAChB,MAAM,EAAE,YAAY,eAAe;AAEnC,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,YAAY,CAAC,OAAO,SAAS;GAGnC,MAAM,UAAU,IAAI;GACpB,MAAM,EAAE,SAAS,MAAM,IAAI,QAAQ,KAAK;IACtC;IACA,OAAO,EACL,UAAU,EACR,QAAQ,UACT,EACF;IACD,OAAO;IACR,CAAC;AAEF,OAAI,MAAM,SAAS,EACjB,OAAM,QAAQ,OAAO;IACnB;IACA,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 +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
+ {"version":3,"file":"tusFolderHandler.mjs","names":[],"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,SAAgB,oBACd,MACgB;CAChB,MAAM,EAAE,YAAY,eAAe;CACnC,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;IACA,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,sCAAsC,EACjD,EAAE,QAAQ,KAAK,CAChB;GAGH,MAAM,UAAU,YAAY;AAG5B,OAFa,MAAM,SAAS,KAAK,MAAM,KAAK,CAAC,YAAY,KAAK,CAG5D,QAAO,SAAS,KACd,EAAE,SAAS,iDAAiD,EAC5D,EAAE,QAAQ,KAAK,CAChB;GAGH,MAAM,SAAS,MAAM;GACrB,MAAM,SAAS,MAAM;AAErB,SAAM,SAAS,KAAK,QAAQ,OAAO;AACnC,UAAO,SAAS,KAAK,EAAE,SAAS,eAAe,EAAE,EAAE,QAAQ,KAAK,CAAC;WAC1D,QAAQ;AACf,YAAS,iBAAiB,cAAc,QAAQ;AAChD,UAAO,SAAS,KAAK,EAAE,SAAS,wBAAwB,EAAE,EAAE,QAAQ,KAAK,CAAC"}
@@ -1 +1 @@
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"}
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/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,SAAgB,2BACd,MACgB;CAChB,MAAM,EAAE,YAAY,eAAe;CACnC,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;IACA,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,sCAAsC,EACjD,EAAE,QAAQ,KAAK,CAChB;GAGH,MAAM,UAAU,YAAY;GAC5B,MAAM,YAAY,OAAO;GAEzB,MAAM,MAAM,SAAS,OAAO,SAAS;GAErC,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;IACA,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 +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"}
1
+ {"version":3,"file":"alt.mjs","names":["altField: TextField"],"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,MAAaA,WAAsB;CACjC,MAAM;CACN,OAAO;CACP,MAAM;CACP"}
@@ -1 +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"}
1
+ {"version":3,"file":"filename.mjs","names":["filenameField: TextField"],"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,MAAaA,gBAA2B;CACtC,MAAM;CACN,MAAM;CACN,QAAQ;CACR,OAAO;EACL,QAAQ;EACR,UAAU;EACX;CACF"}
@@ -1 +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"}
1
+ {"version":3,"file":"height.mjs","names":["heightField: TextField"],"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,MAAaA,cAAyB;CACpC,MAAM;CACN,OAAO;CACP,MAAM;CACN,OAAO;EACL,UAAU;EACV,QAAQ;EACR,OAAO;EACR;CACF"}
@@ -1 +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"}
1
+ {"version":3,"file":"mux.mjs","names":["muxField: GroupField"],"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,MAAaA,WAAuB;CAClC,MAAM;CACN,OAAO;CACP,MAAM;CACN,OAAO;EACL,mBAAmB;EACnB,iBAAiB;EACjB,mBAAmB;EACnB,UAAU;EACV,YAAY,SAAS;AACnB,UAAO,KAAK,YAAY;;EAE3B;CACD,QAAQ;EACN;GACE,MAAM;GACN,MAAM;GACN,OAAO;IACL,YAAY,SAAS;AACnB,YAAO,KAAK,YAAY;;IAE1B,mBAAmB;IACnB,YAAY,EACV,OAAO,0DACR;IACF;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,MAAM;GACP;EACD;GACE,MAAM;GACN,OAAO;GACP,MAAM;GACP;EACD;GACE,MAAM;GACN,OAAO;GACP,MAAM;GACP;EACD;GACE,MAAM;GACN,OAAO;GACP,MAAM;GACP;EACD;GACE,MAAM;GACN,OAAO;GACP,MAAM;GACP;EACD;GACE,MAAM;GACN,OAAO;GACP,MAAM;GACP;EACD;GACE,MAAM;GACN,OAAO;GACP,MAAM;GACN,kBAAkB,EACf,EAAE,kBAAkB;IACnB,GAAG;IACH,MAAM;IACN,OAAO,CACL;KACE,MAAM;KACN,YAAY;MACV,MAAM;OACJ,MAAM;OACN,MAAM,CAAC,SAAS,QAAQ;OACzB;MACD,IAAI,EACF,MAAM,UACP;MACD,UAAU,EACR,MAAM,UACP;MACD,SAAS,EACP,MAAM,WACP;MACD,cAAc,EACZ,MAAM,UACP;MACD,oBAAoB,EAClB,MAAM,UACP;MACD,WAAW,EACT,MAAM,UACP;MACD,YAAY,EACV,MAAM,UACP;MACD,gBAAgB,EACd,MAAM,UACP;MACF;KACD,UAAU;MACR;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD;KACF,CACF;IACF,EACF;GACF;EACD;GACE,MAAM;GACN,OAAO;GACP,MAAM;GACP;EACD;GACE,MAAM;GACN,OAAO;GACP,MAAM;GACP;EACD;GACE,MAAM;GACN,OAAO;GACP,MAAM;GACN,kBAAkB,EACf,EAAE,kBAAkB;IACnB,GAAG;IACH,MAAM;IACN,YAAY,EACV,OAAO;KACL,MAAM;KACN,OAAO;MACL,MAAM;MACN,YAAY;OACV,MAAM,EACJ,MAAM,UACP;OACD,QAAQ,EACN,MAAM,UACP;OACD,YAAY,EACV,MAAM,UACP;OACD,MAAM,EACJ,MAAM,UACP;OACD,IAAI,EACF,MAAM,UACP;OACD,KAAK,EACH,MAAM,UACP;OACD,OAAO,EACL,MAAM,UACP;OACD,QAAQ,EACN,MAAM,UACP;OACD,UAAU,EACR,MAAM,UACP;OACD,SAAS,EACP,MAAM,UACP;OACF;MACF;KACD,UAAU;MACR;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD;KACF,EACF;IACD,UAAU,CAAC,QAAQ;IACpB,EACF;GACF;EACF;CACF"}
@@ -1 +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"}
1
+ {"version":3,"file":"path.mjs","names":["pathField: TextField"],"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,MAAaA,YAAuB;CAClC,MAAM;CACN,MAAM;CACN,QAAQ;CACR,OAAO;EACL,QAAQ;EACR,UAAU;EACX;CACF"}
@@ -1 +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"}
1
+ {"version":3,"file":"storage.mjs","names":["storageField: SelectField"],"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,MAAaA,eAA4B;CACvC,MAAM;CACN,OAAO;CACP,MAAM;CACN,SAAS,CACP;EACE,OAAO;EACP,OAAO;EACR,EACD;EACE,OAAO;EACP,OAAO;EACR,CACF;CACD,OAAO,EACL,UAAU,MACX;CACF"}
@@ -1 +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"}
1
+ {"version":3,"file":"thumbnail.mjs","names":["thumbnailField: TextField"],"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,MAAaA,iBAA4B;CACvC,MAAM;CACN,MAAM;CACN,OAAO;EACL,UAAU;EACV,QAAQ;EACR,mBAAmB;EACnB,mBAAmB;EACnB,iBAAiB;EACjB,gBAAgB;EACjB;CACF"}
@@ -1 +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
+ {"version":3,"file":"width.mjs","names":["widthField: TextField"],"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,MAAaA,aAAwB;CACnC,MAAM;CACN,OAAO;CACP,MAAM;CACN,OAAO;EACL,UAAU;EACV,QAAQ;EACR,OAAO;EACR;CACF"}
@@ -1,33 +1,16 @@
1
1
  import { useMagicError } from "../error-handler/dist/index.mjs";
2
- import { c } from "react/compiler-runtime";
3
2
 
4
3
  //#region src/hooks/useErrorHandler.ts
5
4
  function useErrorHandler() {
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);
5
+ const magicError = useMagicError({ prefix: "PLUGIN-MEDIA-CLOUD" });
13
6
  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;
7
+ return {
8
+ log,
9
+ logError,
10
+ throwError,
11
+ logWarning,
12
+ assert: magicError.assert
13
+ };
31
14
  }
32
15
 
33
16
  //#endregion
@@ -1 +1 @@
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
+ {"version":3,"file":"useErrorHandler.mjs","names":["magicError: UseMagicErrorReturn"],"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,SAAgB,kBAA2D;CACzE,MAAMA,aAAkC,cAAc,EACpD,QAAQ,sBACT,CAAC;CAEF,MAAM,EAAE,KAAK,UAAU,YAAY,eAAe;AAElD,QAAO;EACL;EACA;EACA;EACA;EACA,QAAQ,WAAW;EACpB"}
@@ -1 +1 @@
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"}
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 +1 @@
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
+ {"version":3,"file":"plugin.mjs","names":["muxClient: Mux | null","s3Store: S3Store | null","tusServer: Server | null","mergedConfig: Config"],"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,EAAE,aAAa,iBAAiB;AAEtC,IAAIA,YAAwB;AAC5B,IAAIC,UAA0B;AAC9B,IAAIC,YAA2B;;;;;;AAO/B,SAAgB,iBAAiB,SAAkC;AACjE,QAAO,SAAU,QAAwB;AAEvC,MAAI,CAAC,SAAS;AACZ,YAAS,iBAAiB,sBAAsB,QAAQ;AACxD,UAAO;;EAIT,MAAM,gBAAgB,KAAK,SAAS,eAAe;AAGnD,MAAI,cAAc,YAAY,MAC5B,QAAO;;;;;EAOT,SAAS,eAAoB;AAC3B,UAAO,aAAa,gBAAgB,cAAc,IAAI;;;;;;EAOxD,SAAS,aAAsB;AAC7B,UAAO,WAAW,cAAc,cAAc,GAAG;;;;;;EAOnD,SAAS,eAAuB;AAC9B,UAAO,aAAa,gBAAgB;IAAE;IAAY;IAAe,CAAC;;AAIpE,MAAI,cAAc,IAChB,aAAY,cAAc;AAI5B,MAAI,cAAc,IAAI;AACpB,aAAU,YAAY;AACtB,eAAY,cAAc;;EAI5B,MAAM,iBAAiB,OAAO,aAAa,MACxC,EAAE,WAAW,SAAS,cAAc,WACtC;EAED,MAAM,EAAE,MAAM,YAAY;EAE1B,MAAM,kBAAkB,mBAAmB;GACzC;GACA;GACA;GACD,CAAC;AAIF,MAAI,eACF,UAAS;GACP,GAAG;GACH,aACE,OAAO,aAAa,QACjB,EAAE,WAAW,SAAS,gBAAgB,KACxC,IAAI,EAAE;GACV;AAGH,oBAAkB;GAChB;GACA,SAAS;GACT,eACE;GACF,aAAa,GACV,gBAAgB,OAAO;IACtB,eAAe;IACf,qBAAqB;IACrB,QAAQ,cAAc,IAAI,UAAU;IACrC,EACF;GACD,gCAAgC,EAC9B,eACD;GACD,qBAAqB;AACnB,WAAO,SAAS,KACd,EAAE,SAAS,qCAAqC,EAChD,EAAE,QAAQ,KAAK,CAChB;;GAEH,mBAAmB;GACpB,CAAC;EAEF,MAAM,qBAAqB,EACzB,aAAa,GACV,gBAAgB,OAAO;GACtB,SAAS,kBAAkB;IACzB;IACA;IACA;IACD,CAAC;GACF,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;KAAc;KAAY;KAAe,CAAC;IAClE,GAAG,mBAAmB;KAAE;KAAc;KAAe,CAAC;IACtD,GAAG,oBAAoB;KAAE;KAAY;KAAe,CAAC;IACtD;GACF;AAED,SAAO,mBAAmB,mBAAmB,CAAC,aAAa"}