@maas/payload-plugin-media-cloud 0.0.35 → 0.0.36
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.
- package/dist/collectionHooks/afterChange.mjs +1 -1
- package/dist/collectionHooks/afterChange.mjs.map +1 -1
- package/dist/components/gridView/gridView.mjs +1 -1
- package/dist/components/gridView/gridView.mjs.map +1 -1
- package/dist/components/uploadHandler/uploadHandler.mjs.map +1 -1
- package/dist/fields/path.mjs +5 -1
- package/dist/fields/path.mjs.map +1 -1
- package/dist/types/index.d.mts +3 -0
- package/dist/utils/buildThumbnailURL.mjs +1 -1
- package/dist/utils/buildThumbnailURL.mjs.map +1 -1
- package/dist/utils/defaultOptions.mjs +2 -1
- package/dist/utils/defaultOptions.mjs.map +1 -1
- package/dist/utils/file.d.mts +2 -2
- package/package.json +1 -1
|
@@ -21,7 +21,7 @@ const afterChangeHook = async ({ collection, doc, previousDoc, req }) => {
|
|
|
21
21
|
if (!doc.thumbnail || previousDoc?.path !== doc.path) {
|
|
22
22
|
const thumbnail = buildThumbnailURL({
|
|
23
23
|
storage: doc.storage,
|
|
24
|
-
playbackId: doc.storage === "mux" ? doc.
|
|
24
|
+
playbackId: doc.storage === "mux" ? doc.mux.playbackId : void 0,
|
|
25
25
|
s3Key: doc.storage === "s3" ? doc.path ?? doc.filename : void 0,
|
|
26
26
|
s3Store
|
|
27
27
|
});
|
|
@@ -1 +1 @@
|
|
|
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.
|
|
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.mux.playbackId : 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,IAAI,aAAa;GACzD,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"}
|
|
@@ -356,8 +356,8 @@ function GridView(props) {
|
|
|
356
356
|
return t24;
|
|
357
357
|
}
|
|
358
358
|
function _temp(doc) {
|
|
359
|
-
if (doc?.storage === "mux" && doc?.mux?.playbackId) return `https://image.mux.com/${doc.mux.playbackId}/thumbnail.jpg?width=400&height=400&fit_mode=pad`;
|
|
360
359
|
if (doc?.thumbnailURL) return doc.thumbnailURL;
|
|
360
|
+
if (doc?.storage === "mux" && doc?.mux?.playbackId) return `https://image.mux.com/${doc.mux.playbackId}/thumbnail.jpg?width=400&height=400&fit_mode=pad`;
|
|
361
361
|
}
|
|
362
362
|
var gridView_default = GridView;
|
|
363
363
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gridView.mjs","names":["c","_c","React","Fragment","useMemo","useEffect","useRouter","getTranslation","Gutter","useListQuery","useConfig","SelectionProvider","useTranslation","useWindowInfo","useBulkUpload","useModal","useStepNav","ListHeader","ListSelection","ListControls","PageControls","SelectMany","useListDrawerContext","DefaultListViewTabs","formatAdminURL","ItemCardGrid","GridProvider","jsx","_jsx","jsxs","_jsxs","GridView","props","$","collectionSlug","AfterList","AfterListTable","BeforeList","BeforeListTable","Description","newDocumentURL","hasCreatePermission","hasDeletePermission","disableBulkDelete","disableBulkEdit","beforeActions","viewType","config","getEntityConfig","routes","t0","admin","adminRoute","router","data","t1","docs","t2","t3","undefined","i18n","setStepNav","openModal","drawerSlug","bulkUploadDrawerSlug","setCollectionSlug","setBulkUploadCollectionSlug","setOnSuccess","breakpoints","t4","s","smallBreak","t5","collectionConfig","labels","upload","isUploadCollection","Boolean","isBulkUploadEnabled","bulkUpload","isTrashEnabled","trash","onBulkSelect","getThumbnailURL","_temp","t6","t7","doc_0","title","doc","filename","alt","String","id","storage","thumbnailURL","relationTo","map","mappedDocs","refresh","openBulkUpload","t8","plural","baseLabel","label","url","path","trashLabel","t","navItems","t9","t10","totalDocs","t11","t12","t13","t14","filter","t15","t16","Actions","onBulkUploadSuccess","t17","enableColumns","t18","length","singular","className","children","type","onClick","push","t19","AfterPageControls","t20","t21","t22","t23","allowMultiSelection","t24","mux","playbackId"],"sources":["../../../src/components/gridView/gridView.tsx"],"sourcesContent":["'use client'\n\nimport React, { Fragment, useMemo, useEffect } from 'react'\nimport { useRouter } from 'next/navigation'\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n Gutter,\n useListQuery,\n useConfig,\n SelectionProvider,\n useTranslation,\n useWindowInfo,\n useBulkUpload,\n useModal,\n useStepNav,\n ListHeader,\n ListSelection,\n ListControls,\n PageControls,\n SelectMany,\n useListDrawerContext,\n} from '@payloadcms/ui'\nimport { DefaultListViewTabs } from '@payloadcms/ui/elements/DefaultListViewTabs'\nimport { formatAdminURL } from 'payload/shared'\nimport { ItemCardGrid } from '../itemCardGrid/itemCardGrid'\nimport { GridProvider } from '../gridContext/gridContext'\n\nimport type { ListViewClientProps } from 'payload'\n\nimport './gridView.css'\n\n// Type for media document with common properties\ninterface MediaDocument {\n id: string | number\n storage: 'mux' | 's3'\n filename?: string\n alt?: string\n mimeType?: string\n url?: string\n thumbnailURL?: string\n mux?: {\n playbackId?: string\n }\n}\n\nexport interface MappedDocument {\n id: string | number\n storage: 'mux' | 's3'\n title: string\n thumbnailURL?: string\n relationTo: string\n}\n\nexport function GridView(props: ListViewClientProps): React.JSX.Element {\n const baseClass = 'grid-view'\n\n const {\n collectionSlug,\n AfterList,\n AfterListTable,\n BeforeList,\n BeforeListTable,\n Description,\n newDocumentURL,\n hasCreatePermission,\n hasDeletePermission,\n disableBulkDelete,\n disableBulkEdit,\n beforeActions,\n viewType,\n } = props\n\n const { config, getEntityConfig } = useConfig()\n\n const {\n routes: { admin: adminRoute },\n } = config\n\n const router = useRouter()\n\n const { data } = useListQuery() ?? {}\n const { docs = [] } = data ?? {}\n\n const { i18n } = useTranslation()\n const { setStepNav } = useStepNav()\n const { openModal } = useModal()\n\n const {\n drawerSlug: bulkUploadDrawerSlug,\n setCollectionSlug: setBulkUploadCollectionSlug,\n setOnSuccess,\n } = useBulkUpload()\n\n const {\n breakpoints: { s: smallBreak },\n } = useWindowInfo()\n\n const collectionConfig = getEntityConfig({ collectionSlug })\n const { labels, upload } = collectionConfig\n\n const isUploadCollection = Boolean(upload)\n\n const isBulkUploadEnabled =\n (isUploadCollection && collectionConfig.upload?.bulkUpload) ?? true\n\n const isTrashEnabled = Boolean(collectionConfig.trash)\n\n const { onBulkSelect } = useListDrawerContext()\n\n const getThumbnailURL = (doc: MediaDocument): string | undefined => {\n if (doc?.storage === 'mux' && doc?.mux?.playbackId) {\n return `https://image.mux.com/${doc.mux.playbackId}/thumbnail.jpg?width=400&height=400&fit_mode=pad`\n }\n\n if (doc?.thumbnailURL) {\n return doc.thumbnailURL\n }\n\n return undefined\n }\n\n const mappedDocs: MappedDocument[] = useMemo(() => {\n return docs.map((doc: MediaDocument) => {\n const title = doc.filename ?? doc.alt ?? String(doc.id)\n return {\n id: doc.id,\n storage: doc.storage,\n title: title,\n thumbnailURL: getThumbnailURL(doc),\n relationTo: collectionSlug,\n }\n })\n }, [docs, collectionSlug])\n\n const openBulkUpload = React.useCallback(() => {\n setBulkUploadCollectionSlug(collectionSlug)\n openModal(bulkUploadDrawerSlug)\n setOnSuccess(() => router.refresh())\n }, [\n router,\n collectionSlug,\n bulkUploadDrawerSlug,\n openModal,\n setBulkUploadCollectionSlug,\n setOnSuccess,\n ])\n\n // Set breadcrumb navigation\n useEffect(() => {\n const baseLabel = {\n label: getTranslation(labels?.plural, i18n),\n url:\n isTrashEnabled && viewType === 'trash'\n ? formatAdminURL({\n adminRoute,\n path: `/collections/${collectionSlug}`,\n })\n : undefined,\n }\n const trashLabel = {\n label: i18n.t('general:trash'),\n }\n const navItems =\n isTrashEnabled && viewType === 'trash'\n ? [baseLabel, trashLabel]\n : [baseLabel]\n setStepNav(navItems)\n }, [\n adminRoute,\n setStepNav,\n labels,\n isTrashEnabled,\n viewType,\n i18n,\n collectionSlug,\n ])\n\n return (\n <SelectionProvider docs={docs} totalDocs={data?.totalDocs ?? 0}>\n <GridProvider allowMultiSelection={true} docs={mappedDocs}>\n <div className={`grid-view grid-view--${collectionSlug}`}>\n <Fragment>\n {BeforeList}\n <Gutter className={`${baseClass}__wrapper collection-list__wrap`}>\n <ListHeader\n Actions={[\n beforeActions,\n !smallBreak && (\n <ListSelection\n disableBulkDelete={disableBulkDelete}\n disableBulkEdit={\n collectionConfig.disableBulkEdit ?? disableBulkEdit\n }\n key=\"list-selection\"\n label={getTranslation(labels?.plural, i18n)}\n />\n ),\n <DefaultListViewTabs\n collectionConfig={collectionConfig}\n config={config}\n key=\"default-list-actions\"\n viewType=\"list\"\n />,\n ].filter(Boolean)}\n collectionConfig={collectionConfig}\n Description={Description}\n disableBulkDelete={disableBulkDelete}\n disableBulkEdit={disableBulkEdit}\n hasCreatePermission={hasCreatePermission}\n hasDeletePermission={hasDeletePermission}\n i18n={i18n}\n isBulkUploadEnabled={isBulkUploadEnabled}\n isTrashEnabled={isTrashEnabled}\n newDocumentURL={newDocumentURL}\n onBulkUploadSuccess={() => router.refresh()}\n openBulkUpload={openBulkUpload}\n smallBreak={smallBreak}\n viewType={viewType}\n />\n <ListControls\n collectionConfig={collectionConfig}\n collectionSlug={collectionSlug}\n enableColumns={false}\n />\n\n {BeforeListTable}\n\n {docs.length === 0 ? (\n <div className={`${baseClass}__no-results`}>\n <p>\n {i18n.t(\n viewType === 'trash'\n ? 'general:noTrashResults'\n : 'general:noResults',\n {\n label: getTranslation(labels?.plural, i18n),\n }\n )}\n </p>\n {hasCreatePermission && newDocumentURL && (\n <div className={`${baseClass}__no-results__actions`}>\n <button\n type=\"button\"\n onClick={() => router.push(newDocumentURL)}\n className={`${baseClass}__create-link btn btn--icon-style-without-border btn--size-small btn--withoutPopup btn--style-pill btn--withoutPopup`}\n >\n {i18n.t('general:createNewLabel', {\n label: getTranslation(labels?.singular, i18n),\n })}\n </button>\n </div>\n )}\n </div>\n ) : (\n <ItemCardGrid\n items={mappedDocs}\n adminRoute={adminRoute}\n collectionSlug={collectionSlug}\n />\n )}\n\n {docs?.length > 0 && (\n <PageControls\n AfterPageControls={\n smallBreak ? (\n <div className={`${baseClass}__list-selection`}>\n <ListSelection\n collectionConfig={collectionConfig}\n disableBulkDelete={disableBulkDelete}\n disableBulkEdit={disableBulkEdit}\n label={getTranslation(\n collectionConfig.labels.plural,\n i18n\n )}\n />\n <div className={`${baseClass}__list-selection-actions`}>\n {typeof onBulkSelect === 'function'\n ? beforeActions\n ? [\n ...beforeActions,\n <SelectMany\n key=\"select-many\"\n onClick={onBulkSelect}\n />,\n ]\n : [\n <SelectMany\n key=\"select-many\"\n onClick={onBulkSelect}\n />,\n ]\n : beforeActions}\n </div>\n </div>\n ) : null\n }\n collectionConfig={collectionConfig}\n />\n )}\n\n {AfterListTable}\n </Gutter>\n {AfterList}\n </Fragment>\n </div>\n </GridProvider>\n </SelectionProvider>\n )\n}\n\nexport default GridView\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gridView.mjs","names":["c","_c","React","Fragment","useMemo","useEffect","useRouter","getTranslation","Gutter","useListQuery","useConfig","SelectionProvider","useTranslation","useWindowInfo","useBulkUpload","useModal","useStepNav","ListHeader","ListSelection","ListControls","PageControls","SelectMany","useListDrawerContext","DefaultListViewTabs","formatAdminURL","ItemCardGrid","GridProvider","jsx","_jsx","jsxs","_jsxs","GridView","props","$","collectionSlug","AfterList","AfterListTable","BeforeList","BeforeListTable","Description","newDocumentURL","hasCreatePermission","hasDeletePermission","disableBulkDelete","disableBulkEdit","beforeActions","viewType","config","getEntityConfig","routes","t0","admin","adminRoute","router","data","t1","docs","t2","t3","undefined","i18n","setStepNav","openModal","drawerSlug","bulkUploadDrawerSlug","setCollectionSlug","setBulkUploadCollectionSlug","setOnSuccess","breakpoints","t4","s","smallBreak","t5","collectionConfig","labels","upload","isUploadCollection","Boolean","isBulkUploadEnabled","bulkUpload","isTrashEnabled","trash","onBulkSelect","getThumbnailURL","_temp","t6","t7","doc_0","title","doc","filename","alt","String","id","storage","thumbnailURL","relationTo","map","mappedDocs","refresh","openBulkUpload","t8","plural","baseLabel","label","url","path","trashLabel","t","navItems","t9","t10","totalDocs","t11","t12","t13","t14","filter","t15","t16","Actions","onBulkUploadSuccess","t17","enableColumns","t18","length","singular","className","children","type","onClick","push","t19","AfterPageControls","t20","t21","t22","t23","allowMultiSelection","t24","mux","playbackId"],"sources":["../../../src/components/gridView/gridView.tsx"],"sourcesContent":["'use client'\n\nimport React, { Fragment, useMemo, useEffect } from 'react'\nimport { useRouter } from 'next/navigation'\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n Gutter,\n useListQuery,\n useConfig,\n SelectionProvider,\n useTranslation,\n useWindowInfo,\n useBulkUpload,\n useModal,\n useStepNav,\n ListHeader,\n ListSelection,\n ListControls,\n PageControls,\n SelectMany,\n useListDrawerContext,\n} from '@payloadcms/ui'\nimport { DefaultListViewTabs } from '@payloadcms/ui/elements/DefaultListViewTabs'\nimport { formatAdminURL } from 'payload/shared'\nimport { ItemCardGrid } from '../itemCardGrid/itemCardGrid'\nimport { GridProvider } from '../gridContext/gridContext'\n\nimport type { ListViewClientProps } from 'payload'\n\nimport './gridView.css'\n\n// Type for media document with common properties\ninterface MediaDocument {\n id: string | number\n storage: 'mux' | 's3'\n filename?: string\n alt?: string\n mimeType?: string\n url?: string\n thumbnailURL?: string\n mux?: {\n playbackId?: string\n }\n}\n\nexport interface MappedDocument {\n id: string | number\n storage: 'mux' | 's3'\n title: string\n thumbnailURL?: string\n relationTo: string\n}\n\nexport function GridView(props: ListViewClientProps): React.JSX.Element {\n const baseClass = 'grid-view'\n\n const {\n collectionSlug,\n AfterList,\n AfterListTable,\n BeforeList,\n BeforeListTable,\n Description,\n newDocumentURL,\n hasCreatePermission,\n hasDeletePermission,\n disableBulkDelete,\n disableBulkEdit,\n beforeActions,\n viewType,\n } = props\n\n const { config, getEntityConfig } = useConfig()\n\n const {\n routes: { admin: adminRoute },\n } = config\n\n const router = useRouter()\n\n const { data } = useListQuery() ?? {}\n const { docs = [] } = data ?? {}\n\n const { i18n } = useTranslation()\n const { setStepNav } = useStepNav()\n const { openModal } = useModal()\n\n const {\n drawerSlug: bulkUploadDrawerSlug,\n setCollectionSlug: setBulkUploadCollectionSlug,\n setOnSuccess,\n } = useBulkUpload()\n\n const {\n breakpoints: { s: smallBreak },\n } = useWindowInfo()\n\n const collectionConfig = getEntityConfig({ collectionSlug })\n const { labels, upload } = collectionConfig\n\n const isUploadCollection = Boolean(upload)\n\n const isBulkUploadEnabled =\n (isUploadCollection && collectionConfig.upload?.bulkUpload) ?? true\n\n const isTrashEnabled = Boolean(collectionConfig.trash)\n\n const { onBulkSelect } = useListDrawerContext()\n\n const getThumbnailURL = (doc: MediaDocument): string | undefined => {\n if (doc?.thumbnailURL) {\n return doc.thumbnailURL\n }\n\n if (doc?.storage === 'mux' && doc?.mux?.playbackId) {\n return `https://image.mux.com/${doc.mux.playbackId}/thumbnail.jpg?width=400&height=400&fit_mode=pad`\n }\n\n return undefined\n }\n\n const mappedDocs: MappedDocument[] = useMemo(() => {\n return docs.map((doc: MediaDocument) => {\n const title = doc.filename ?? doc.alt ?? String(doc.id)\n return {\n id: doc.id,\n storage: doc.storage,\n title: title,\n thumbnailURL: getThumbnailURL(doc),\n relationTo: collectionSlug,\n }\n })\n }, [docs, collectionSlug])\n\n const openBulkUpload = React.useCallback(() => {\n setBulkUploadCollectionSlug(collectionSlug)\n openModal(bulkUploadDrawerSlug)\n setOnSuccess(() => router.refresh())\n }, [\n router,\n collectionSlug,\n bulkUploadDrawerSlug,\n openModal,\n setBulkUploadCollectionSlug,\n setOnSuccess,\n ])\n\n // Set breadcrumb navigation\n useEffect(() => {\n const baseLabel = {\n label: getTranslation(labels?.plural, i18n),\n url:\n isTrashEnabled && viewType === 'trash'\n ? formatAdminURL({\n adminRoute,\n path: `/collections/${collectionSlug}`,\n })\n : undefined,\n }\n const trashLabel = {\n label: i18n.t('general:trash'),\n }\n const navItems =\n isTrashEnabled && viewType === 'trash'\n ? [baseLabel, trashLabel]\n : [baseLabel]\n setStepNav(navItems)\n }, [\n adminRoute,\n setStepNav,\n labels,\n isTrashEnabled,\n viewType,\n i18n,\n collectionSlug,\n ])\n\n return (\n <SelectionProvider docs={docs} totalDocs={data?.totalDocs ?? 0}>\n <GridProvider allowMultiSelection={true} docs={mappedDocs}>\n <div className={`grid-view grid-view--${collectionSlug}`}>\n <Fragment>\n {BeforeList}\n <Gutter className={`${baseClass}__wrapper collection-list__wrap`}>\n <ListHeader\n Actions={[\n beforeActions,\n !smallBreak && (\n <ListSelection\n disableBulkDelete={disableBulkDelete}\n disableBulkEdit={\n collectionConfig.disableBulkEdit ?? disableBulkEdit\n }\n key=\"list-selection\"\n label={getTranslation(labels?.plural, i18n)}\n />\n ),\n <DefaultListViewTabs\n collectionConfig={collectionConfig}\n config={config}\n key=\"default-list-actions\"\n viewType=\"list\"\n />,\n ].filter(Boolean)}\n collectionConfig={collectionConfig}\n Description={Description}\n disableBulkDelete={disableBulkDelete}\n disableBulkEdit={disableBulkEdit}\n hasCreatePermission={hasCreatePermission}\n hasDeletePermission={hasDeletePermission}\n i18n={i18n}\n isBulkUploadEnabled={isBulkUploadEnabled}\n isTrashEnabled={isTrashEnabled}\n newDocumentURL={newDocumentURL}\n onBulkUploadSuccess={() => router.refresh()}\n openBulkUpload={openBulkUpload}\n smallBreak={smallBreak}\n viewType={viewType}\n />\n <ListControls\n collectionConfig={collectionConfig}\n collectionSlug={collectionSlug}\n enableColumns={false}\n />\n\n {BeforeListTable}\n\n {docs.length === 0 ? (\n <div className={`${baseClass}__no-results`}>\n <p>\n {i18n.t(\n viewType === 'trash'\n ? 'general:noTrashResults'\n : 'general:noResults',\n {\n label: getTranslation(labels?.plural, i18n),\n }\n )}\n </p>\n {hasCreatePermission && newDocumentURL && (\n <div className={`${baseClass}__no-results__actions`}>\n <button\n type=\"button\"\n onClick={() => router.push(newDocumentURL)}\n className={`${baseClass}__create-link btn btn--icon-style-without-border btn--size-small btn--withoutPopup btn--style-pill btn--withoutPopup`}\n >\n {i18n.t('general:createNewLabel', {\n label: getTranslation(labels?.singular, i18n),\n })}\n </button>\n </div>\n )}\n </div>\n ) : (\n <ItemCardGrid\n items={mappedDocs}\n adminRoute={adminRoute}\n collectionSlug={collectionSlug}\n />\n )}\n\n {docs?.length > 0 && (\n <PageControls\n AfterPageControls={\n smallBreak ? (\n <div className={`${baseClass}__list-selection`}>\n <ListSelection\n collectionConfig={collectionConfig}\n disableBulkDelete={disableBulkDelete}\n disableBulkEdit={disableBulkEdit}\n label={getTranslation(\n collectionConfig.labels.plural,\n i18n\n )}\n />\n <div className={`${baseClass}__list-selection-actions`}>\n {typeof onBulkSelect === 'function'\n ? beforeActions\n ? [\n ...beforeActions,\n <SelectMany\n key=\"select-many\"\n onClick={onBulkSelect}\n />,\n ]\n : [\n <SelectMany\n key=\"select-many\"\n onClick={onBulkSelect}\n />,\n ]\n : beforeActions}\n </div>\n </div>\n ) : null\n }\n collectionConfig={collectionConfig}\n />\n )}\n\n {AfterListTable}\n </Gutter>\n {AfterList}\n </Fragment>\n </div>\n </GridProvider>\n </SelectionProvider>\n )\n}\n\nexport default GridView\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadHandler.mjs","names":["upchunk","tus","createClientUploadHandler","MediaCloudErrors","MediaCloudLogs","useMediaCloudEmitter","useErrorHandler","isVideo","getMimeType","generateUniqueFilename","sanitizeFilename","useMagicError","MUX_CHUNK_SIZE","TUS_CHUNK_SIZE","TUS_RETRY_DELAYS","magicError","prefix","throwError","emitter","muxUpload","args","file","serverURL","apiRoute","mimeType","endpoint","filename","name","response","fetch","body","JSON","stringify","credentials","method","headers","url","uploadId","json","uploader","createUpload","chunkSize","emit","polling","pollingUrl","on","MUX_UPLOAD_ERROR","progress","detail","storage","MUX_DIRECT_UPLOAD_ERROR","error","tusUpload","filetype","type","filesize","size","toString","Object","keys","localStorage","filter","key","startsWith","forEach","removeItem","uploadUrlAvailable","eventListenerAdded","onBeforeUnload","e","window","removeEventListener","preventDefault","onPageUnload","navigator","sendBeacon","Promise","resolve","upload","Upload","retryDelays","storeFingerprintForResuming","metadata","contentType","contentLength","contentDisposition","onError","message","TUS_UPLOAD_ERROR","cause","onBeforeRequest","addEventListener","onProgress","bytesUploaded","bytesTotal","percentage","Math","round","onSuccess","onUploadUrlAvailable","start","log","UploadHandler","props","handler","updateFilename","extra","pluginOptions","assert","FILE_TYPE_UNKNOWN","allowedMimeTypes","limits","mimeTypes","mimeTypeMatches","some","allowed","endsWith","replace","FILE_TYPE_NOT_ALLOWED","fileSize","Infinity","FILE_SIZE_EXCEEDED","mappedFile","status","S3_STORE_FILE_FOUND","newFilename","File","NAMING_FUNCTION_ERROR","uploadArgs","storageForMimeType","prototype","hasOwnProperty","call","undefined","isVideoFile","storeOnMux","UPLOAD_HANDLER_ERROR"],"sources":["../../../src/components/uploadHandler/uploadHandler.tsx"],"sourcesContent":["'use client'\n\nimport * as upchunk from '@mux/upchunk'\nimport * as tus from 'tus-js-client'\n\nimport { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client'\n\nimport { MediaCloudErrors, MediaCloudLogs } from '../../types/errors'\nimport { useMediaCloudEmitter } from '../../hooks/useMediaCloudEmitter'\nimport { useErrorHandler } from '../../hooks/useErrorHandler'\nimport {\n isVideo,\n getMimeType,\n generateUniqueFilename,\n sanitizeFilename,\n} from '../../utils/file'\n\nimport type {\n MediaCloudPluginOptions,\n Storage,\n MimeType,\n} from '../../types/index'\nimport type { ReactNode } from 'react'\nimport type { UploadCollectionSlug } from 'payload'\nimport { useMagicError, UseMagicErrorReturn } from '@maas/error-handler'\n\ninterface UploadArgs {\n serverURL: string\n apiRoute: string\n file: File\n mimeType: MimeType\n prefix?: string\n}\n\ninterface UploadResult {\n storage: Storage\n mimeType: MimeType\n filename: string\n uploadId?: string\n}\n\ninterface MuxCreateUploadResponse {\n url: string\n uploadId: string\n filename: string\n}\n\nconst MUX_CHUNK_SIZE = 30720\nconst TUS_CHUNK_SIZE = 1024 * 1024\nconst TUS_RETRY_DELAYS = [0, 1000, 2000, 5000]\n\nconst magicError: UseMagicErrorReturn = useMagicError({\n prefix: 'PLUGIN-MEDIA-CLOUD',\n})\n\nconst { throwError } = magicError\nconst emitter = useMediaCloudEmitter()\n\n/**\n * Handles Mux video upload with progress tracking\n * @param args - The upload arguments including file, server URL, and callbacks\n * @returns Promise that resolves to upload result or null if upload fails\n */\nasync function muxUpload(args: UploadArgs): Promise<UploadResult | null> {\n const { file, serverURL, apiRoute, mimeType } = args\n\n const endpoint = `${serverURL}${apiRoute}`\n const filename = file.name\n\n try {\n // Request upload URL from Mux\n const response = await fetch(`${endpoint}/mux/upload`, {\n body: JSON.stringify({ filename, mimeType }),\n credentials: 'include',\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n const { url, uploadId } = (await response.json()) as MuxCreateUploadResponse\n\n // Create upchunk uploader\n const uploader = await upchunk.createUpload({\n endpoint: url,\n file,\n chunkSize: MUX_CHUNK_SIZE,\n })\n\n // Add upload to tracker\n emitter.emit('addUpload', {\n filename,\n uploadId,\n polling: false,\n pollingUrl: `${endpoint}/mux/asset`,\n })\n\n // Set up event handlers\n uploader.on('error', function () {\n emitter.emit('removeUpload', { uploadId })\n throwError(MediaCloudErrors.MUX_UPLOAD_ERROR)\n })\n\n uploader.on('progress', function (progress) {\n emitter.emit('updateUpload', {\n filename,\n progress: progress.detail,\n })\n })\n\n uploader.on('success', function () {\n emitter.emit('uploadComplete', { filename })\n })\n\n // Update collection entry\n // with filename, uploadId, mimeType, and storage\n return {\n filename,\n uploadId,\n mimeType,\n storage: 'mux',\n }\n } catch {\n throwError(MediaCloudErrors.MUX_DIRECT_UPLOAD_ERROR)\n emitter.emit('uploadError', { filename, error: 'Video upload failed' })\n return null\n }\n}\n\n/**\n * Handles TUS file upload with resumable capabilities\n * @param args - The upload arguments including file, server URL, and callbacks\n * @returns Promise that resolves to upload result or null if upload fails\n */\nasync function tusUpload(args: UploadArgs): Promise<UploadResult | null> {\n const { apiRoute, serverURL, file, prefix = '', mimeType } = args\n\n const filename = file.name\n const filetype = file.type\n const filesize = file.size.toString()\n\n const endpoint = `${serverURL}${apiRoute}/uploads`\n\n // Clear any stale TUS uploads from localStorage\n Object.keys(localStorage)\n .filter((key) => key.startsWith('tus::'))\n .forEach((key) => localStorage.removeItem(key))\n\n // Flag to prevent multiple onUploadUrlAvailable calls\n let uploadUrlAvailable = false\n let eventListenerAdded = false\n\n function onBeforeUnload(e: BeforeUnloadEvent) {\n window.removeEventListener('beforeunload', onBeforeUnload)\n e.preventDefault()\n }\n\n function onPageUnload() {\n window.removeEventListener('unload', onPageUnload)\n navigator.sendBeacon(`${endpoint}/cleanup`, JSON.stringify({ filename }))\n }\n\n return new Promise((resolve) => {\n const upload = new tus.Upload(file, {\n endpoint,\n retryDelays: TUS_RETRY_DELAYS,\n chunkSize: TUS_CHUNK_SIZE,\n storeFingerprintForResuming: false,\n metadata: {\n filetype,\n filesize,\n filename,\n prefix,\n contentType: filetype,\n contentLength: filesize,\n contentDisposition: 'inline',\n },\n onError(error) {\n // Clean up\n navigator.sendBeacon(\n `${endpoint}/cleanup`,\n JSON.stringify({ filename })\n )\n\n // Inform user\n emitter.emit('uploadError', { filename, error: error.message })\n emitter.emit('removeUpload', { filename })\n throwError({ ...MediaCloudErrors.TUS_UPLOAD_ERROR, cause: error })\n resolve(null)\n },\n onBeforeRequest() {\n if (!eventListenerAdded) {\n window.addEventListener('beforeunload', onBeforeUnload)\n window.addEventListener('unload', onPageUnload)\n eventListenerAdded = true\n }\n },\n onProgress: function (bytesUploaded, bytesTotal) {\n const percentage = Math.round((bytesUploaded / bytesTotal) * 100)\n emitter.emit('updateUpload', {\n filename,\n progress: percentage,\n })\n },\n async onSuccess() {\n // Clean up beforeunload listener\n window.removeEventListener('beforeunload', onBeforeUnload)\n window.removeEventListener('unload', onPageUnload)\n\n // Mark upload as complete in UI\n emitter.emit('uploadComplete', { filename })\n\n // Trigger post upload processing\n await fetch(`${endpoint}/${filename}/process`)\n\n // Move file to correct folder\n await fetch(`${endpoint}/${filename}/folder`)\n },\n onUploadUrlAvailable: async function () {\n // Prevent multiple callbacks\n if (uploadUrlAvailable) {\n return\n }\n\n // Update flag\n uploadUrlAvailable = true\n\n // Add upload to UI\n emitter.emit('addUpload', { filename })\n\n // Update collection entry\n // with filename, mimeType, and storage\n resolve({\n filename,\n mimeType,\n storage: 's3',\n })\n },\n })\n\n upload.start()\n })\n}\n\nconst { log } = useErrorHandler()\n\ninterface Extra {\n pluginOptions: MediaCloudPluginOptions\n}\n\ntype ClientUploadHandlerProps<T extends Record<string, unknown>> = {\n children: ReactNode\n collectionSlug: UploadCollectionSlug\n enabled?: boolean\n extra: T\n prefix?: string\n serverHandlerPath: `/${string}`\n}\n\nexport function UploadHandler(\n props: ClientUploadHandlerProps<{ pluginOptions: MediaCloudPluginOptions }>\n) {\n return createClientUploadHandler({\n handler: async function (args) {\n const { serverURL, apiRoute, file, prefix, updateFilename, extra } = args\n const { pluginOptions } = extra as unknown as Extra\n\n // Check mime type\n const mimeType = await getMimeType(file)\n\n magicError.assert(mimeType, MediaCloudErrors.FILE_TYPE_UNKNOWN)\n\n const allowedMimeTypes = pluginOptions.limits?.mimeTypes ?? []\n const mimeTypeMatches = allowedMimeTypes.some((allowed) =>\n allowed.endsWith('/*')\n ? mimeType?.startsWith(allowed.replace('/*', '/'))\n : mimeType === allowed\n )\n\n if (!mimeTypeMatches) {\n throwError(MediaCloudErrors.FILE_TYPE_NOT_ALLOWED)\n return null\n }\n\n // Check file size limit\n if (file.size > (pluginOptions.limits?.fileSize ?? Infinity)) {\n throwError(MediaCloudErrors.FILE_SIZE_EXCEEDED)\n return null\n }\n\n // Clone file\n let mappedFile = file\n\n try {\n // Check if file with same name exists\n const endpoint = `${serverURL}${apiRoute}/uploads`\n const response = await fetch(`${endpoint}/${file.name}/exists`)\n\n if (response?.status === 200) {\n log(MediaCloudLogs.S3_STORE_FILE_FOUND)\n }\n\n // If file exists, generate a cloned file with a unique filename\n // If not, generate a cloned file with a sanitized filename\n const newFilename =\n response?.status === 200\n ? generateUniqueFilename(file.name)\n : sanitizeFilename(file.name)\n\n mappedFile = new File([file], newFilename, {\n type: file.type,\n })\n\n await updateFilename(newFilename)\n } catch (error) {\n throwError({\n ...MediaCloudErrors.NAMING_FUNCTION_ERROR,\n cause: error,\n })\n return null\n }\n\n try {\n const uploadArgs: UploadArgs = {\n file: mappedFile,\n serverURL,\n apiRoute,\n mimeType,\n prefix,\n }\n\n // Check storage mapping for mime type\n type StorageMap = NonNullable<typeof pluginOptions.storage>\n\n const storageForMimeType =\n pluginOptions.storage &&\n Object.prototype.hasOwnProperty.call(pluginOptions.storage, mimeType)\n ? pluginOptions.storage[mimeType as keyof StorageMap]\n : undefined\n\n const isVideoFile = await isVideo(file)\n const storeOnMux =\n pluginOptions.storage?.['video/*'] === 'mux' ||\n storageForMimeType === 'mux'\n\n switch (true) {\n case storeOnMux && isVideoFile:\n return await muxUpload(uploadArgs)\n default:\n return await tusUpload(uploadArgs)\n }\n } catch (error) {\n throwError({ ...MediaCloudErrors.UPLOAD_HANDLER_ERROR, cause: error })\n return null\n }\n },\n })(props)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"uploadHandler.mjs","names":["upchunk","tus","createClientUploadHandler","MediaCloudErrors","MediaCloudLogs","useMediaCloudEmitter","useErrorHandler","isVideo","getMimeType","generateUniqueFilename","sanitizeFilename","useMagicError","MUX_CHUNK_SIZE","TUS_CHUNK_SIZE","TUS_RETRY_DELAYS","magicError","prefix","throwError","emitter","muxUpload","args","file","serverURL","apiRoute","mimeType","endpoint","filename","name","response","fetch","body","JSON","stringify","credentials","method","headers","url","uploadId","json","uploader","createUpload","chunkSize","emit","polling","pollingUrl","on","MUX_UPLOAD_ERROR","progress","detail","storage","MUX_DIRECT_UPLOAD_ERROR","error","tusUpload","filetype","type","filesize","size","toString","Object","keys","localStorage","filter","key","startsWith","forEach","removeItem","uploadUrlAvailable","eventListenerAdded","onBeforeUnload","e","window","removeEventListener","preventDefault","onPageUnload","navigator","sendBeacon","Promise","resolve","upload","Upload","retryDelays","storeFingerprintForResuming","metadata","contentType","contentLength","contentDisposition","onError","message","TUS_UPLOAD_ERROR","cause","onBeforeRequest","addEventListener","onProgress","bytesUploaded","bytesTotal","percentage","Math","round","onSuccess","onUploadUrlAvailable","start","log","UploadHandler","props","handler","updateFilename","extra","pluginOptions","assert","FILE_TYPE_UNKNOWN","allowedMimeTypes","limits","mimeTypes","mimeTypeMatches","some","allowed","endsWith","replace","FILE_TYPE_NOT_ALLOWED","fileSize","Infinity","FILE_SIZE_EXCEEDED","mappedFile","status","S3_STORE_FILE_FOUND","newFilename","File","NAMING_FUNCTION_ERROR","uploadArgs","storageForMimeType","prototype","hasOwnProperty","call","undefined","isVideoFile","storeOnMux","UPLOAD_HANDLER_ERROR"],"sources":["../../../src/components/uploadHandler/uploadHandler.tsx"],"sourcesContent":["'use client'\n\nimport * as upchunk from '@mux/upchunk'\nimport * as tus from 'tus-js-client'\n\nimport { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client'\n\nimport { MediaCloudErrors, MediaCloudLogs } from '../../types/errors'\nimport { useMediaCloudEmitter } from '../../hooks/useMediaCloudEmitter'\nimport { useErrorHandler } from '../../hooks/useErrorHandler'\nimport {\n isVideo,\n getMimeType,\n generateUniqueFilename,\n sanitizeFilename,\n} from '../../utils/file'\n\nimport type {\n MediaCloudPluginOptions,\n Storage,\n MimeType,\n} from '../../types/index'\nimport type { ReactNode } from 'react'\nimport type { UploadCollectionSlug } from 'payload'\nimport { useMagicError, UseMagicErrorReturn } from '@maas/error-handler'\n\ninterface UploadArgs {\n serverURL: string\n apiRoute: string\n file: File\n mimeType: MimeType\n prefix?: string\n}\n\ninterface UploadResult {\n storage: Storage\n mimeType: MimeType\n filename: string\n uploadId?: string\n}\n\ninterface MuxCreateUploadResponse {\n url: string\n uploadId: string\n filename: string\n}\n\nconst MUX_CHUNK_SIZE = 30720\nconst TUS_CHUNK_SIZE = 1024 * 1024\nconst TUS_RETRY_DELAYS = [0, 1000, 2000, 5000]\n\nconst magicError: UseMagicErrorReturn = useMagicError({\n prefix: 'PLUGIN-MEDIA-CLOUD',\n})\n\nconst { throwError } = magicError\nconst emitter = useMediaCloudEmitter()\n\n/**\n * Handles Mux video upload with progress tracking\n * @param args - The upload arguments including file, server URL, and callbacks\n * @returns Promise that resolves to upload result or null if upload fails\n */\nasync function muxUpload(args: UploadArgs): Promise<UploadResult | null> {\n const { file, serverURL, apiRoute, mimeType } = args\n\n const endpoint = `${serverURL}${apiRoute}`\n const filename = file.name\n\n try {\n // Request upload URL from Mux\n const response = await fetch(`${endpoint}/mux/upload`, {\n body: JSON.stringify({ filename, mimeType }),\n credentials: 'include',\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n const { url, uploadId } = (await response.json()) as MuxCreateUploadResponse\n\n // Create upchunk uploader\n const uploader = await upchunk.createUpload({\n endpoint: url,\n file,\n chunkSize: MUX_CHUNK_SIZE,\n })\n\n // Add upload to tracker\n emitter.emit('addUpload', {\n filename,\n uploadId,\n polling: false,\n pollingUrl: `${endpoint}/mux/asset`,\n })\n\n // Set up event handlers\n uploader.on('error', function () {\n emitter.emit('removeUpload', { uploadId })\n throwError(MediaCloudErrors.MUX_UPLOAD_ERROR)\n })\n\n uploader.on('progress', function (progress) {\n emitter.emit('updateUpload', {\n filename,\n progress: progress.detail,\n })\n })\n\n uploader.on('success', function () {\n emitter.emit('uploadComplete', { filename })\n })\n\n // Update collection entry\n // with filename, uploadId, mimeType, and storage\n return {\n filename,\n uploadId,\n mimeType,\n storage: 'mux',\n }\n } catch {\n throwError(MediaCloudErrors.MUX_DIRECT_UPLOAD_ERROR)\n emitter.emit('uploadError', { filename, error: 'Video upload failed' })\n return null\n }\n}\n\n/**\n * Handles TUS file upload with resumable capabilities\n * @param args - The upload arguments including file, server URL, and callbacks\n * @returns Promise that resolves to upload result or null if upload fails\n */\nasync function tusUpload(args: UploadArgs): Promise<UploadResult | null> {\n const { apiRoute, serverURL, file, prefix = '', mimeType } = args\n\n const filename = file.name\n const filetype = file.type\n const filesize = file.size.toString()\n\n const endpoint = `${serverURL}${apiRoute}/uploads`\n\n // Clear any stale TUS uploads from localStorage\n Object.keys(localStorage)\n .filter((key) => key.startsWith('tus::'))\n .forEach((key) => localStorage.removeItem(key))\n\n // Flag to prevent multiple onUploadUrlAvailable calls\n let uploadUrlAvailable = false\n let eventListenerAdded = false\n\n function onBeforeUnload(e: BeforeUnloadEvent) {\n window.removeEventListener('beforeunload', onBeforeUnload)\n e.preventDefault()\n }\n\n function onPageUnload() {\n window.removeEventListener('unload', onPageUnload)\n navigator.sendBeacon(`${endpoint}/cleanup`, JSON.stringify({ filename }))\n }\n\n return new Promise((resolve) => {\n const upload = new tus.Upload(file, {\n endpoint,\n retryDelays: TUS_RETRY_DELAYS,\n chunkSize: TUS_CHUNK_SIZE,\n storeFingerprintForResuming: false,\n metadata: {\n filetype,\n filesize,\n filename,\n prefix,\n contentType: filetype,\n contentLength: filesize,\n contentDisposition: 'inline',\n },\n onError(error) {\n // Clean up\n navigator.sendBeacon(\n `${endpoint}/cleanup`,\n JSON.stringify({ filename })\n )\n\n // Inform user\n emitter.emit('uploadError', { filename, error: error.message })\n emitter.emit('removeUpload', { filename })\n throwError({ ...MediaCloudErrors.TUS_UPLOAD_ERROR, cause: error })\n resolve(null)\n },\n onBeforeRequest() {\n if (!eventListenerAdded) {\n window.addEventListener('beforeunload', onBeforeUnload)\n window.addEventListener('unload', onPageUnload)\n eventListenerAdded = true\n }\n },\n onProgress: function (bytesUploaded, bytesTotal) {\n const percentage = Math.round((bytesUploaded / bytesTotal) * 100)\n emitter.emit('updateUpload', {\n filename,\n progress: percentage,\n })\n },\n async onSuccess() {\n // Clean up beforeunload listener\n window.removeEventListener('beforeunload', onBeforeUnload)\n window.removeEventListener('unload', onPageUnload)\n\n // Mark upload as complete in UI\n emitter.emit('uploadComplete', { filename })\n\n // Trigger post upload processing\n await fetch(`${endpoint}/${filename}/process`)\n\n // Move file to correct folder\n await fetch(`${endpoint}/${filename}/folder`)\n },\n onUploadUrlAvailable: async function () {\n // Prevent multiple callbacks\n if (uploadUrlAvailable) {\n return\n }\n\n // Update flag\n uploadUrlAvailable = true\n\n // Add upload to UI\n emitter.emit('addUpload', { filename })\n\n // Update collection entry\n // with filename, mimeType, and storage\n resolve({\n filename,\n mimeType,\n storage: 's3',\n })\n },\n })\n\n upload.start()\n })\n}\n\nconst { log } = useErrorHandler()\n\ninterface Extra {\n pluginOptions: MediaCloudPluginOptions\n}\n\ntype ClientUploadHandlerProps<T extends Record<string, unknown>> = {\n children: ReactNode\n collectionSlug: UploadCollectionSlug\n enabled?: boolean\n extra: T\n prefix?: string\n serverHandlerPath: `/${string}`\n}\n\nexport function UploadHandler(\n props: ClientUploadHandlerProps<{ pluginOptions: MediaCloudPluginOptions }>\n) {\n return createClientUploadHandler({\n handler: async function (args) {\n const { serverURL, apiRoute, file, prefix, updateFilename, extra } = args\n const { pluginOptions } = extra as unknown as Extra\n\n // Check mime type\n const mimeType = await getMimeType(file)\n\n magicError.assert(mimeType, MediaCloudErrors.FILE_TYPE_UNKNOWN)\n\n const allowedMimeTypes = pluginOptions.limits?.mimeTypes ?? []\n\n const mimeTypeMatches = allowedMimeTypes.some((allowed) =>\n allowed.endsWith('/*')\n ? mimeType?.startsWith(allowed.replace('/*', '/'))\n : mimeType === allowed\n )\n\n if (!mimeTypeMatches) {\n throwError(MediaCloudErrors.FILE_TYPE_NOT_ALLOWED)\n return null\n }\n\n // Check file size limit\n if (file.size > (pluginOptions.limits?.fileSize ?? Infinity)) {\n throwError(MediaCloudErrors.FILE_SIZE_EXCEEDED)\n return null\n }\n\n // Clone file\n let mappedFile = file\n\n try {\n // Check if file with same name exists\n const endpoint = `${serverURL}${apiRoute}/uploads`\n const response = await fetch(`${endpoint}/${file.name}/exists`)\n\n if (response?.status === 200) {\n log(MediaCloudLogs.S3_STORE_FILE_FOUND)\n }\n\n // If file exists, generate a cloned file with a unique filename\n // If not, generate a cloned file with a sanitized filename\n const newFilename =\n response?.status === 200\n ? generateUniqueFilename(file.name)\n : sanitizeFilename(file.name)\n\n mappedFile = new File([file], newFilename, {\n type: file.type,\n })\n\n await updateFilename(newFilename)\n } catch (error) {\n throwError({\n ...MediaCloudErrors.NAMING_FUNCTION_ERROR,\n cause: error,\n })\n return null\n }\n\n try {\n const uploadArgs: UploadArgs = {\n file: mappedFile,\n serverURL,\n apiRoute,\n mimeType,\n prefix,\n }\n\n // Check storage mapping for mime type\n type StorageMap = NonNullable<typeof pluginOptions.storage>\n\n const storageForMimeType =\n pluginOptions.storage &&\n Object.prototype.hasOwnProperty.call(pluginOptions.storage, mimeType)\n ? pluginOptions.storage[mimeType as keyof StorageMap]\n : undefined\n\n const isVideoFile = await isVideo(file)\n const storeOnMux =\n pluginOptions.storage?.['video/*'] === 'mux' ||\n storageForMimeType === 'mux'\n\n switch (true) {\n case storeOnMux && isVideoFile:\n return await muxUpload(uploadArgs)\n default:\n return await tusUpload(uploadArgs)\n }\n } catch (error) {\n throwError({ ...MediaCloudErrors.UPLOAD_HANDLER_ERROR, cause: error })\n return null\n }\n },\n })(props)\n}\n"],"mappings":"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"}
|
package/dist/fields/path.mjs
CHANGED
package/dist/fields/path.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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;
|
|
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 disableListColumn: true,\n disableListFilter: true,\n disableBulkEdit: true,\n disableGroupBy: true,\n },\n}\n"],"mappings":";AAEA,MAAaA,YAAuB;CAClC,MAAM;CACN,MAAM;CACN,QAAQ;CACR,OAAO;EACL,QAAQ;EACR,UAAU;EACV,mBAAmB;EACnB,mBAAmB;EACnB,iBAAiB;EACjB,gBAAgB;EACjB;CACF"}
|
package/dist/types/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
//#region src/utils/buildThumbnailURL.ts
|
|
2
2
|
function buildThumbnailURL(args) {
|
|
3
3
|
const { storage, s3Store, playbackId, s3Key } = args;
|
|
4
|
-
if (storage === "mux" && playbackId) return `https://image.mux.com/${playbackId}/thumbnail.jpg?width=
|
|
4
|
+
if (storage === "mux" && playbackId) return `https://image.mux.com/${playbackId}/thumbnail.jpg?width=400&height=400&fit_mode=pad`;
|
|
5
5
|
if (storage === "s3" && s3Key) return `https://wsrv.nl/?url=${s3Store?.getUrl(s3Key)}?width=512&height=512&default=1&q=80`;
|
|
6
6
|
}
|
|
7
7
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildThumbnailURL.mjs","names":[],"sources":["../../src/utils/buildThumbnailURL.ts"],"sourcesContent":["import type { S3Store } from '../tus/stores/s3/s3Store'\nimport type { Storage } from '../types'\n\ninterface BuildThumbnailURLArgs {\n storage: Storage\n playbackId?: string\n s3Key?: string\n s3Store?: S3Store | null\n}\n\nexport function buildThumbnailURL(args: BuildThumbnailURLArgs) {\n const { storage, s3Store, playbackId, s3Key } = args\n\n if (storage === 'mux' && playbackId) {\n return `https://image.mux.com/${playbackId}/thumbnail.jpg?width=
|
|
1
|
+
{"version":3,"file":"buildThumbnailURL.mjs","names":[],"sources":["../../src/utils/buildThumbnailURL.ts"],"sourcesContent":["import type { S3Store } from '../tus/stores/s3/s3Store'\nimport type { Storage } from '../types'\n\ninterface BuildThumbnailURLArgs {\n storage: Storage\n playbackId?: string\n s3Key?: string\n s3Store?: S3Store | null\n}\n\nexport function buildThumbnailURL(args: BuildThumbnailURLArgs) {\n const { storage, s3Store, playbackId, s3Key } = args\n\n if (storage === 'mux' && playbackId) {\n return `https://image.mux.com/${playbackId}/thumbnail.jpg?width=400&height=400&fit_mode=pad`\n }\n\n if (storage === 's3' && s3Key) {\n const url = s3Store?.getUrl(s3Key)\n return `https://wsrv.nl/?url=${url}?width=512&height=512&default=1&q=80`\n }\n}\n"],"mappings":";AAUA,SAAgB,kBAAkB,MAA6B;CAC7D,MAAM,EAAE,SAAS,SAAS,YAAY,UAAU;AAEhD,KAAI,YAAY,SAAS,WACvB,QAAO,yBAAyB,WAAW;AAG7C,KAAI,YAAY,QAAQ,MAEtB,QAAO,wBADK,SAAS,OAAO,MAAM,CACC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultOptions.mjs","names":["defaultOptions: MediaCloudDefaultPluginOptions"],"sources":["../../src/utils/defaultOptions.ts"],"sourcesContent":["import { MediaCloudDefaultPluginOptions } from '../types'\n\nexport const defaultOptions: MediaCloudDefaultPluginOptions = {\n enabled: true,\n collection: 'media',\n view: 'grid',\n folders: true,\n storage: {\n 'video/*': 'mux',\n },\n}\n"],"mappings":";AAEA,MAAaA,iBAAiD;CAC5D,SAAS;CACT,YAAY;CACZ,MAAM;CACN,SAAS;CACT,SAAS,EACP,WAAW,OACZ;CACF"}
|
|
1
|
+
{"version":3,"file":"defaultOptions.mjs","names":["defaultOptions: MediaCloudDefaultPluginOptions"],"sources":["../../src/utils/defaultOptions.ts"],"sourcesContent":["import { MediaCloudDefaultPluginOptions } from '../types'\n\nexport const defaultOptions: MediaCloudDefaultPluginOptions = {\n enabled: true,\n collection: 'media',\n view: 'grid',\n folders: true,\n storage: {\n 'video/*': 'mux',\n },\n limits: {\n mimeTypes: ['image/*', 'video/*'],\n },\n}\n"],"mappings":";AAEA,MAAaA,iBAAiD;CAC5D,SAAS;CACT,YAAY;CACZ,MAAM;CACN,SAAS;CACT,SAAS,EACP,WAAW,OACZ;CACD,QAAQ,EACN,WAAW,CAAC,WAAW,UAAU,EAClC;CACF"}
|
package/dist/utils/file.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MediaCloudPluginOptions, MimeType } from "../types/index.mjs";
|
|
2
2
|
import { S3Store } from "../tus/stores/s3/s3Store.mjs";
|
|
3
|
-
import * as
|
|
3
|
+
import * as payload1 from "payload";
|
|
4
4
|
|
|
5
5
|
//#region src/utils/file.d.ts
|
|
6
6
|
|
|
@@ -35,7 +35,7 @@ interface CreateFileEndpointsArgs {
|
|
|
35
35
|
pluginOptions: MediaCloudPluginOptions;
|
|
36
36
|
}
|
|
37
37
|
declare function createFileEndpoints(args: CreateFileEndpointsArgs): {
|
|
38
|
-
handler:
|
|
38
|
+
handler: payload1.PayloadHandler;
|
|
39
39
|
method: "get";
|
|
40
40
|
path: string;
|
|
41
41
|
}[];
|