@humaan/payload-storage-imagekit 2.3.2 → 2.3.4

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/index.js CHANGED
@@ -35,6 +35,33 @@ const findImageKitFileId = async (imagekit, filePath)=>{
35
35
  return undefined;
36
36
  };
37
37
  const isRecord = (value)=>!!value && typeof value === 'object';
38
+ const getStoredImageKitURL = (doc)=>{
39
+ const storedURL = doc?.imagekit?.url;
40
+ return typeof storedURL === 'string' && storedURL.trim().length > 0 ? storedURL : undefined;
41
+ };
42
+ const findUploadDocumentByFilename = async ({ collection, filename, prefix, req })=>{
43
+ const constraints = [
44
+ {
45
+ filename: {
46
+ equals: filename
47
+ }
48
+ }
49
+ ];
50
+ if (typeof prefix === 'string') {
51
+ constraints.push({
52
+ prefix: {
53
+ equals: prefix
54
+ }
55
+ });
56
+ }
57
+ return req.payload.db.findOne({
58
+ collection,
59
+ req,
60
+ where: {
61
+ and: constraints
62
+ }
63
+ });
64
+ };
38
65
  const applyClientUploadContextToData = (data, clientUploadContext)=>{
39
66
  if (!isImageKitClientUploadContext(clientUploadContext)) {
40
67
  return data;
@@ -152,8 +179,14 @@ const imagekitAdapter = ({ client, clientUploads, rootFolder, urlEndpoint })=>{
152
179
  });
153
180
  return fetchUploadedFile(imagekitURL);
154
181
  }
182
+ const doc = args.doc || await findUploadDocumentByFilename({
183
+ collection: args.params.collection,
184
+ filename: args.params.filename,
185
+ prefix: args.params.prefix,
186
+ req
187
+ });
155
188
  const imagekitURL = client.helper.buildSrc({
156
- src: getFilePath(rootFolder, args.params.collection, args.params.filename),
189
+ src: getStoredImageKitURL(doc) || getFilePath(rootFolder, args.params.collection, args.params.filename),
157
190
  transformation: tr ? [
158
191
  {
159
192
  raw: tr
@@ -210,18 +243,6 @@ export const imagekitStorage = (pluginOptions)=>(config)=>{
210
243
  const beforeDocumentControls = collection.admin?.components?.edit?.beforeDocumentControls || [];
211
244
  return {
212
245
  ...collection,
213
- hooks: {
214
- ...collection.hooks || {},
215
- beforeChange: [
216
- ...collection.hooks?.beforeChange || [],
217
- ({ data, req })=>{
218
- if (!isRecord(data) || !req.file?.clientUploadContext) {
219
- return data;
220
- }
221
- return applyClientUploadContextToData(data, req.file.clientUploadContext);
222
- }
223
- ]
224
- },
225
246
  admin: clientUploads ? {
226
247
  ...collection.admin || {},
227
248
  components: {
@@ -243,6 +264,18 @@ export const imagekitStorage = (pluginOptions)=>(config)=>{
243
264
  }
244
265
  }
245
266
  } : collection.admin,
267
+ hooks: {
268
+ ...collection.hooks || {},
269
+ beforeChange: [
270
+ ...collection.hooks?.beforeChange || [],
271
+ ({ data, req })=>{
272
+ if (!isRecord(data) || !req.file?.clientUploadContext) {
273
+ return data;
274
+ }
275
+ return applyClientUploadContextToData(data, req.file.clientUploadContext);
276
+ }
277
+ ]
278
+ },
246
279
  upload: {
247
280
  ...typeof collection.upload === 'object' ? collection.upload : {},
248
281
  adminThumbnail: ({ doc })=>getAdminThumbnailURL(doc),
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Adapter, CollectionOptions } from '@payloadcms/plugin-cloud-storage/types'\nimport type { CollectionSlug, Config, UploadCollectionSlug } from 'payload'\n\nimport ImageKit, { toFile } from '@imagekit/nodejs'\nimport { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage'\nimport path from 'node:path'\n\nimport { getImageKitUploadAuthPath, isImageKitClientUploadContext } from './clientUploads.js'\nimport { createImageKitUploadAuthHandler } from './endpoints/createImageKitUploadAuthHandler.js'\nimport { getAdminThumbnailURL } from './getAdminThumbnailURL.js'\n\ntype ImageKitCollectionMap = Partial<Record<UploadCollectionSlug, true>>\ntype ImagekitReference = {\n imagekit?: {\n fileId?: string\n thumbnailUrl?: string\n url?: string\n }\n}\n\ntype UploadDocumentData = ImagekitReference & {\n thumbnailURL?: string\n}\n\nexport type PayloadStorageImagekitConfig = {\n alwaysInsertFields?: boolean\n clientUploads?: boolean\n collections: ImageKitCollectionMap\n disablePayloadAccessControl?: true\n enabled?: boolean\n folder: string\n privateKey: string\n publicKey: string\n urlEndpoint: string\n}\n\nconst normalizeFolder = (folder: string): string => {\n const normalized = folder.trim().replace(/^\\/+|\\/+$/g, '')\n\n if (!normalized) {\n throw new Error('imagekitStorage: `folder` is required.')\n }\n\n return `/${normalized}`\n}\n\nconst getCollectionFolder = (rootFolder: string, collectionSlug: string): string =>\n path.posix.join(rootFolder, collectionSlug)\n\nconst getFilePath = (rootFolder: string, collectionSlug: string, filename: string): string =>\n path.posix.join(getCollectionFolder(rootFolder, collectionSlug), filename)\n\nconst findImageKitFileId = async (\n imagekit: ImageKit,\n filePath: string,\n): Promise<string | undefined> => {\n const parentPath = path.posix.dirname(filePath)\n const name = path.posix.basename(filePath)\n\n const limit = 100\n\n for (let skip = 0; ; skip += limit) {\n const assets = await imagekit.assets.list({\n type: 'file',\n limit,\n path: parentPath === '/' ? '/' : `${parentPath}/`,\n skip,\n })\n\n const found = assets.find(\n (asset) => 'fileId' in asset && asset.filePath === filePath && asset.name === name,\n )\n\n if (found && 'fileId' in found) {\n return found.fileId\n }\n\n if (assets.length < limit) {\n break\n }\n }\n\n return undefined\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === 'object'\n\nconst applyClientUploadContextToData = <T extends UploadDocumentData>(\n data: T,\n clientUploadContext: unknown,\n): T => {\n if (!isImageKitClientUploadContext(clientUploadContext)) {\n return data\n }\n\n data.imagekit = {\n fileId: clientUploadContext.fileId,\n thumbnailUrl: clientUploadContext.thumbnailUrl,\n url: clientUploadContext.url,\n }\n\n // Preserve the admin preview when the original file was already uploaded client-side.\n data.thumbnailURL = getAdminThumbnailURL(data)\n\n return data\n}\n\nconst imagekitAdapter = ({\n client,\n clientUploads,\n rootFolder,\n urlEndpoint,\n}: {\n client: ImageKit\n clientUploads?: boolean\n rootFolder: string\n urlEndpoint: string\n}): Adapter => {\n const fetchUploadedFile = async (fileURL: string): Promise<Response> => {\n const response = await fetch(fileURL)\n\n if (!response.ok) {\n throw new Error(\n `imagekitStorage: failed to fetch uploaded file from ImageKit (${response.status}).`,\n )\n }\n\n const fileBuffer = await response.arrayBuffer()\n const headers = new Headers()\n const contentType = response.headers.get('Content-Type')\n\n if (contentType) {\n headers.set('Content-Type', contentType)\n }\n\n headers.set('Content-Length', String(fileBuffer.byteLength))\n\n return new Response(fileBuffer, {\n headers,\n status: 200,\n statusText: response.statusText,\n })\n }\n\n return ({ collection }) => ({\n name: 'imagekit',\n clientUploads,\n fields: [\n {\n name: 'imagekit',\n type: 'group',\n admin: {\n disableListColumn: true,\n disableListFilter: true,\n },\n fields: [\n {\n name: 'fileId',\n type: 'text',\n admin: {\n hidden: true,\n },\n },\n {\n name: 'url',\n type: 'text',\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'thumbnailUrl',\n type: 'text',\n admin: {\n hidden: true,\n },\n },\n ],\n interfaceName: 'imagekitFields',\n },\n ],\n generateURL: ({ filename }) =>\n client.helper.buildSrc({\n src: getFilePath(rootFolder, collection.slug, filename),\n urlEndpoint,\n }),\n handleDelete: async ({ doc, filename }) => {\n const storedFileId = (doc as ImagekitReference & typeof doc).imagekit?.fileId\n const fileId =\n storedFileId ||\n (await findImageKitFileId(client, getFilePath(rootFolder, collection.slug, filename)))\n\n if (!fileId) {\n return\n }\n\n await client.files.delete(fileId)\n },\n handleUpload: async ({ clientUploadContext, data, file }) => {\n if (isImageKitClientUploadContext(clientUploadContext)) {\n return applyClientUploadContextToData(data, clientUploadContext)\n }\n\n const uploadFile = await toFile(file.buffer, file.filename, { type: file.mimeType })\n\n const uploaded = await client.files.upload({\n file: uploadFile,\n fileName: file.filename,\n folder: getCollectionFolder(rootFolder, collection.slug),\n useUniqueFileName: false,\n })\n\n data.imagekit = {\n fileId: uploaded.fileId,\n thumbnailUrl: uploaded.thumbnailUrl,\n url: uploaded.url,\n }\n\n // Set the root-level thumbnailURL that Payload's admin interface expects\n data.thumbnailURL = getAdminThumbnailURL(data)\n\n return data\n },\n staticHandler: async (req, args) => {\n const requestURL = new URL(req.url || 'http://localhost')\n const tr = requestURL.searchParams.get('tr')\n const hasClientUploadContext = 'clientUploadContext' in args.params\n\n if (hasClientUploadContext) {\n const clientUploadContext = args.params.clientUploadContext\n const clientUploadURL =\n isImageKitClientUploadContext(clientUploadContext) &&\n typeof clientUploadContext.url === 'string' &&\n clientUploadContext.url.length > 0\n ? clientUploadContext.url\n : null\n const filePath =\n isImageKitClientUploadContext(clientUploadContext) &&\n typeof clientUploadContext.filePath === 'string' &&\n clientUploadContext.filePath.length > 0\n ? clientUploadContext.filePath\n : getFilePath(rootFolder, args.params.collection, args.params.filename)\n const imagekitURL =\n clientUploadURL ||\n client.helper.buildSrc({\n src: filePath,\n urlEndpoint,\n })\n\n return fetchUploadedFile(imagekitURL)\n }\n\n const imagekitURL = client.helper.buildSrc({\n src: getFilePath(rootFolder, args.params.collection, args.params.filename),\n transformation: tr ? [{ raw: tr }] : undefined,\n urlEndpoint,\n })\n\n return Response.redirect(imagekitURL, 302)\n },\n })\n}\n\nconst toCloudStorageCollections = (\n collections: ImageKitCollectionMap,\n adapter: Adapter,\n disablePayloadAccessControl?: true,\n): Partial<Record<CollectionSlug, CollectionOptions>> => {\n const mappedCollections: Partial<Record<CollectionSlug, CollectionOptions>> = {}\n\n for (const collectionSlug of Object.keys(collections)) {\n mappedCollections[collectionSlug] = {\n adapter,\n disableLocalStorage: true,\n disablePayloadAccessControl,\n }\n }\n\n return mappedCollections\n}\n\nexport const imagekitStorage =\n (pluginOptions: PayloadStorageImagekitConfig) =>\n (config: Config): Config => {\n const {\n alwaysInsertFields,\n clientUploads,\n collections,\n disablePayloadAccessControl,\n enabled,\n folder,\n privateKey,\n publicKey,\n urlEndpoint,\n } = pluginOptions\n\n if (!privateKey?.trim()) {\n throw new Error('imagekitStorage: `privateKey` is required.')\n }\n\n if (!publicKey?.trim()) {\n throw new Error('imagekitStorage: `publicKey` is required.')\n }\n\n if (!urlEndpoint?.trim()) {\n throw new Error('imagekitStorage: `urlEndpoint` is required.')\n }\n\n if (!collections || Object.keys(collections).length === 0) {\n throw new Error('imagekitStorage: `collections` must include at least one upload collection.')\n }\n\n const rootFolder = normalizeFolder(folder)\n\n const imagekitClient = new ImageKit({ privateKey })\n const adapter = imagekitAdapter({\n client: imagekitClient,\n clientUploads,\n rootFolder,\n urlEndpoint,\n })\n\n const configuredSlugs = new Set(Object.keys(collections))\n const configWithCropDisabled: Config = {\n ...config,\n collections: (config.collections || []).map((collection) => {\n if (!configuredSlugs.has(collection.slug)) {\n return collection\n }\n\n const beforeDocumentControls =\n collection.admin?.components?.edit?.beforeDocumentControls || []\n\n return {\n ...collection,\n hooks: {\n ...(collection.hooks || {}),\n beforeChange: [\n ...(collection.hooks?.beforeChange || []),\n ({ data, req }) => {\n if (!isRecord(data) || !req.file?.clientUploadContext) {\n return data\n }\n\n return applyClientUploadContextToData(data, req.file.clientUploadContext)\n },\n ],\n },\n admin: clientUploads\n ? {\n ...(collection.admin || {}),\n components: {\n ...(collection.admin?.components || {}),\n edit: {\n ...(collection.admin?.components?.edit || {}),\n beforeDocumentControls: [\n ...beforeDocumentControls,\n {\n clientProps: {\n authPath: getImageKitUploadAuthPath(collection.slug),\n collectionSlug: collection.slug,\n folder: getCollectionFolder(rootFolder, collection.slug),\n publicKey,\n },\n path: '@humaan/payload-storage-imagekit/client#ImageKitUploadHandler',\n },\n ],\n },\n },\n }\n : collection.admin,\n upload: {\n ...(typeof collection.upload === 'object' ? collection.upload : {}),\n adminThumbnail: ({ doc }) => getAdminThumbnailURL(doc),\n crop: false,\n },\n }\n }),\n endpoints: clientUploads\n ? [\n ...(config.endpoints || []),\n {\n handler: createImageKitUploadAuthHandler({\n client: imagekitClient,\n collections,\n }),\n method: 'get',\n path: `${getImageKitUploadAuthPath(':collection')}`,\n },\n ]\n : config.endpoints,\n }\n\n return cloudStoragePlugin({\n alwaysInsertFields,\n collections: toCloudStorageCollections(collections, adapter, disablePayloadAccessControl),\n enabled,\n })(configWithCropDisabled)\n }\n\nexport { migrateFolder } from './migrate.js'\nexport type { MigrateFolderOptions, MigrationJobResult } from './migrate.js'\n\n// Backward-compatible alias\nexport const payloadStorageImagekit = imagekitStorage\n"],"names":["ImageKit","toFile","cloudStoragePlugin","path","getImageKitUploadAuthPath","isImageKitClientUploadContext","createImageKitUploadAuthHandler","getAdminThumbnailURL","normalizeFolder","folder","normalized","trim","replace","Error","getCollectionFolder","rootFolder","collectionSlug","posix","join","getFilePath","filename","findImageKitFileId","imagekit","filePath","parentPath","dirname","name","basename","limit","skip","assets","list","type","found","find","asset","fileId","length","undefined","isRecord","value","applyClientUploadContextToData","data","clientUploadContext","thumbnailUrl","url","thumbnailURL","imagekitAdapter","client","clientUploads","urlEndpoint","fetchUploadedFile","fileURL","response","fetch","ok","status","fileBuffer","arrayBuffer","headers","Headers","contentType","get","set","String","byteLength","Response","statusText","collection","fields","admin","disableListColumn","disableListFilter","hidden","readOnly","interfaceName","generateURL","helper","buildSrc","src","slug","handleDelete","doc","storedFileId","files","delete","handleUpload","file","uploadFile","buffer","mimeType","uploaded","upload","fileName","useUniqueFileName","staticHandler","req","args","requestURL","URL","tr","searchParams","hasClientUploadContext","params","clientUploadURL","imagekitURL","transformation","raw","redirect","toCloudStorageCollections","collections","adapter","disablePayloadAccessControl","mappedCollections","Object","keys","disableLocalStorage","imagekitStorage","pluginOptions","config","alwaysInsertFields","enabled","privateKey","publicKey","imagekitClient","configuredSlugs","Set","configWithCropDisabled","map","has","beforeDocumentControls","components","edit","hooks","beforeChange","clientProps","authPath","adminThumbnail","crop","endpoints","handler","method","migrateFolder","payloadStorageImagekit"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Adapter, CollectionOptions } from '@payloadcms/plugin-cloud-storage/types'\nimport type {\n CollectionSlug,\n Config,\n PayloadRequest,\n TypeWithID,\n UploadCollectionSlug,\n Where,\n} from 'payload'\n\nimport ImageKit, { toFile } from '@imagekit/nodejs'\nimport { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage'\nimport path from 'node:path'\n\nimport { getImageKitUploadAuthPath, isImageKitClientUploadContext } from './clientUploads.js'\nimport { createImageKitUploadAuthHandler } from './endpoints/createImageKitUploadAuthHandler.js'\nimport { getAdminThumbnailURL } from './getAdminThumbnailURL.js'\n\ntype ImageKitCollectionMap = Partial<Record<UploadCollectionSlug, true>>\ntype ImagekitReference = {\n imagekit?: {\n fileId?: string\n thumbnailUrl?: string\n url?: string\n }\n}\n\ntype UploadDocumentData = {\n thumbnailURL?: string\n} & ImagekitReference\n\nexport type PayloadStorageImagekitConfig = {\n alwaysInsertFields?: boolean\n clientUploads?: boolean\n collections: ImageKitCollectionMap\n disablePayloadAccessControl?: true\n enabled?: boolean\n folder: string\n privateKey: string\n publicKey: string\n urlEndpoint: string\n}\n\nconst normalizeFolder = (folder: string): string => {\n const normalized = folder.trim().replace(/^\\/+|\\/+$/g, '')\n\n if (!normalized) {\n throw new Error('imagekitStorage: `folder` is required.')\n }\n\n return `/${normalized}`\n}\n\nconst getCollectionFolder = (rootFolder: string, collectionSlug: string): string =>\n path.posix.join(rootFolder, collectionSlug)\n\nconst getFilePath = (rootFolder: string, collectionSlug: string, filename: string): string =>\n path.posix.join(getCollectionFolder(rootFolder, collectionSlug), filename)\n\nconst findImageKitFileId = async (\n imagekit: ImageKit,\n filePath: string,\n): Promise<string | undefined> => {\n const parentPath = path.posix.dirname(filePath)\n const name = path.posix.basename(filePath)\n\n const limit = 100\n\n for (let skip = 0; ; skip += limit) {\n const assets = await imagekit.assets.list({\n type: 'file',\n limit,\n path: parentPath === '/' ? '/' : `${parentPath}/`,\n skip,\n })\n\n const found = assets.find(\n (asset) => 'fileId' in asset && asset.filePath === filePath && asset.name === name,\n )\n\n if (found && 'fileId' in found) {\n return found.fileId\n }\n\n if (assets.length < limit) {\n break\n }\n }\n\n return undefined\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === 'object'\n\nconst getStoredImageKitURL = (doc: unknown): string | undefined => {\n const storedURL = (doc as ImagekitReference | undefined)?.imagekit?.url\n\n return typeof storedURL === 'string' && storedURL.trim().length > 0 ? storedURL : undefined\n}\n\nconst findUploadDocumentByFilename = async ({\n collection,\n filename,\n prefix,\n req,\n}: {\n collection: string\n filename: string\n prefix?: string\n req: PayloadRequest\n}): Promise<null | TypeWithID> => {\n const constraints: Where[] = [\n {\n filename: {\n equals: filename,\n },\n },\n ]\n\n if (typeof prefix === 'string') {\n constraints.push({\n prefix: {\n equals: prefix,\n },\n })\n }\n\n return req.payload.db.findOne({\n collection,\n req,\n where: {\n and: constraints,\n },\n })\n}\n\nconst applyClientUploadContextToData = <T extends UploadDocumentData>(\n data: T,\n clientUploadContext: unknown,\n): T => {\n if (!isImageKitClientUploadContext(clientUploadContext)) {\n return data\n }\n\n data.imagekit = {\n fileId: clientUploadContext.fileId,\n thumbnailUrl: clientUploadContext.thumbnailUrl,\n url: clientUploadContext.url,\n }\n\n // Preserve the admin preview when the original file was already uploaded client-side.\n data.thumbnailURL = getAdminThumbnailURL(data)\n\n return data\n}\n\nconst imagekitAdapter = ({\n client,\n clientUploads,\n rootFolder,\n urlEndpoint,\n}: {\n client: ImageKit\n clientUploads?: boolean\n rootFolder: string\n urlEndpoint: string\n}): Adapter => {\n const fetchUploadedFile = async (fileURL: string): Promise<Response> => {\n const response = await fetch(fileURL)\n\n if (!response.ok) {\n throw new Error(\n `imagekitStorage: failed to fetch uploaded file from ImageKit (${response.status}).`,\n )\n }\n\n const fileBuffer = await response.arrayBuffer()\n const headers = new Headers()\n const contentType = response.headers.get('Content-Type')\n\n if (contentType) {\n headers.set('Content-Type', contentType)\n }\n\n headers.set('Content-Length', String(fileBuffer.byteLength))\n\n return new Response(fileBuffer, {\n headers,\n status: 200,\n statusText: response.statusText,\n })\n }\n\n return ({ collection }) => ({\n name: 'imagekit',\n clientUploads,\n fields: [\n {\n name: 'imagekit',\n type: 'group',\n admin: {\n disableListColumn: true,\n disableListFilter: true,\n },\n fields: [\n {\n name: 'fileId',\n type: 'text',\n admin: {\n hidden: true,\n },\n },\n {\n name: 'url',\n type: 'text',\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'thumbnailUrl',\n type: 'text',\n admin: {\n hidden: true,\n },\n },\n ],\n interfaceName: 'imagekitFields',\n },\n ],\n generateURL: ({ filename }) =>\n client.helper.buildSrc({\n src: getFilePath(rootFolder, collection.slug, filename),\n urlEndpoint,\n }),\n handleDelete: async ({ doc, filename }) => {\n const storedFileId = (doc as ImagekitReference & typeof doc).imagekit?.fileId\n const fileId =\n storedFileId ||\n (await findImageKitFileId(client, getFilePath(rootFolder, collection.slug, filename)))\n\n if (!fileId) {\n return\n }\n\n await client.files.delete(fileId)\n },\n handleUpload: async ({ clientUploadContext, data, file }) => {\n if (isImageKitClientUploadContext(clientUploadContext)) {\n return applyClientUploadContextToData(data, clientUploadContext)\n }\n\n const uploadFile = await toFile(file.buffer, file.filename, { type: file.mimeType })\n\n const uploaded = await client.files.upload({\n file: uploadFile,\n fileName: file.filename,\n folder: getCollectionFolder(rootFolder, collection.slug),\n useUniqueFileName: false,\n })\n\n data.imagekit = {\n fileId: uploaded.fileId,\n thumbnailUrl: uploaded.thumbnailUrl,\n url: uploaded.url,\n }\n\n // Set the root-level thumbnailURL that Payload's admin interface expects\n data.thumbnailURL = getAdminThumbnailURL(data)\n\n return data\n },\n staticHandler: async (req, args) => {\n const requestURL = new URL(req.url || 'http://localhost')\n const tr = requestURL.searchParams.get('tr')\n const hasClientUploadContext = 'clientUploadContext' in args.params\n\n if (hasClientUploadContext) {\n const clientUploadContext = args.params.clientUploadContext\n const clientUploadURL =\n isImageKitClientUploadContext(clientUploadContext) &&\n typeof clientUploadContext.url === 'string' &&\n clientUploadContext.url.length > 0\n ? clientUploadContext.url\n : null\n const filePath =\n isImageKitClientUploadContext(clientUploadContext) &&\n typeof clientUploadContext.filePath === 'string' &&\n clientUploadContext.filePath.length > 0\n ? clientUploadContext.filePath\n : getFilePath(rootFolder, args.params.collection, args.params.filename)\n const imagekitURL =\n clientUploadURL ||\n client.helper.buildSrc({\n src: filePath,\n urlEndpoint,\n })\n\n return fetchUploadedFile(imagekitURL)\n }\n\n const doc =\n args.doc ||\n (await findUploadDocumentByFilename({\n collection: args.params.collection,\n filename: args.params.filename,\n prefix: args.params.prefix,\n req,\n }))\n const imagekitURL = client.helper.buildSrc({\n src:\n getStoredImageKitURL(doc) ||\n getFilePath(rootFolder, args.params.collection, args.params.filename),\n transformation: tr ? [{ raw: tr }] : undefined,\n urlEndpoint,\n })\n\n return Response.redirect(imagekitURL, 302)\n },\n })\n}\n\nconst toCloudStorageCollections = (\n collections: ImageKitCollectionMap,\n adapter: Adapter,\n disablePayloadAccessControl?: true,\n): Partial<Record<CollectionSlug, CollectionOptions>> => {\n const mappedCollections: Partial<Record<CollectionSlug, CollectionOptions>> = {}\n\n for (const collectionSlug of Object.keys(collections)) {\n mappedCollections[collectionSlug] = {\n adapter,\n disableLocalStorage: true,\n disablePayloadAccessControl,\n }\n }\n\n return mappedCollections\n}\n\nexport const imagekitStorage =\n (pluginOptions: PayloadStorageImagekitConfig) =>\n (config: Config): Config => {\n const {\n alwaysInsertFields,\n clientUploads,\n collections,\n disablePayloadAccessControl,\n enabled,\n folder,\n privateKey,\n publicKey,\n urlEndpoint,\n } = pluginOptions\n\n if (!privateKey?.trim()) {\n throw new Error('imagekitStorage: `privateKey` is required.')\n }\n\n if (!publicKey?.trim()) {\n throw new Error('imagekitStorage: `publicKey` is required.')\n }\n\n if (!urlEndpoint?.trim()) {\n throw new Error('imagekitStorage: `urlEndpoint` is required.')\n }\n\n if (!collections || Object.keys(collections).length === 0) {\n throw new Error('imagekitStorage: `collections` must include at least one upload collection.')\n }\n\n const rootFolder = normalizeFolder(folder)\n\n const imagekitClient = new ImageKit({ privateKey })\n const adapter = imagekitAdapter({\n client: imagekitClient,\n clientUploads,\n rootFolder,\n urlEndpoint,\n })\n\n const configuredSlugs = new Set(Object.keys(collections))\n const configWithCropDisabled: Config = {\n ...config,\n collections: (config.collections || []).map((collection) => {\n if (!configuredSlugs.has(collection.slug)) {\n return collection\n }\n\n const beforeDocumentControls =\n collection.admin?.components?.edit?.beforeDocumentControls || []\n\n return {\n ...collection,\n admin: clientUploads\n ? {\n ...(collection.admin || {}),\n components: {\n ...(collection.admin?.components || {}),\n edit: {\n ...(collection.admin?.components?.edit || {}),\n beforeDocumentControls: [\n ...beforeDocumentControls,\n {\n clientProps: {\n authPath: getImageKitUploadAuthPath(collection.slug),\n collectionSlug: collection.slug,\n folder: getCollectionFolder(rootFolder, collection.slug),\n publicKey,\n },\n path: '@humaan/payload-storage-imagekit/client#ImageKitUploadHandler',\n },\n ],\n },\n },\n }\n : collection.admin,\n hooks: {\n ...(collection.hooks || {}),\n beforeChange: [\n ...(collection.hooks?.beforeChange || []),\n ({ data, req }) => {\n if (!isRecord(data) || !req.file?.clientUploadContext) {\n return data\n }\n\n return applyClientUploadContextToData(data, req.file.clientUploadContext)\n },\n ],\n },\n upload: {\n ...(typeof collection.upload === 'object' ? collection.upload : {}),\n adminThumbnail: ({ doc }) => getAdminThumbnailURL(doc),\n crop: false,\n },\n }\n }),\n endpoints: clientUploads\n ? [\n ...(config.endpoints || []),\n {\n handler: createImageKitUploadAuthHandler({\n client: imagekitClient,\n collections,\n }),\n method: 'get',\n path: `${getImageKitUploadAuthPath(':collection')}`,\n },\n ]\n : config.endpoints,\n }\n\n return cloudStoragePlugin({\n alwaysInsertFields,\n collections: toCloudStorageCollections(collections, adapter, disablePayloadAccessControl),\n enabled,\n })(configWithCropDisabled)\n }\n\nexport { migrateFolder } from './migrate.js'\nexport type { MigrateFolderOptions, MigrationJobResult } from './migrate.js'\n\n// Backward-compatible alias\nexport const payloadStorageImagekit = imagekitStorage\n"],"names":["ImageKit","toFile","cloudStoragePlugin","path","getImageKitUploadAuthPath","isImageKitClientUploadContext","createImageKitUploadAuthHandler","getAdminThumbnailURL","normalizeFolder","folder","normalized","trim","replace","Error","getCollectionFolder","rootFolder","collectionSlug","posix","join","getFilePath","filename","findImageKitFileId","imagekit","filePath","parentPath","dirname","name","basename","limit","skip","assets","list","type","found","find","asset","fileId","length","undefined","isRecord","value","getStoredImageKitURL","doc","storedURL","url","findUploadDocumentByFilename","collection","prefix","req","constraints","equals","push","payload","db","findOne","where","and","applyClientUploadContextToData","data","clientUploadContext","thumbnailUrl","thumbnailURL","imagekitAdapter","client","clientUploads","urlEndpoint","fetchUploadedFile","fileURL","response","fetch","ok","status","fileBuffer","arrayBuffer","headers","Headers","contentType","get","set","String","byteLength","Response","statusText","fields","admin","disableListColumn","disableListFilter","hidden","readOnly","interfaceName","generateURL","helper","buildSrc","src","slug","handleDelete","storedFileId","files","delete","handleUpload","file","uploadFile","buffer","mimeType","uploaded","upload","fileName","useUniqueFileName","staticHandler","args","requestURL","URL","tr","searchParams","hasClientUploadContext","params","clientUploadURL","imagekitURL","transformation","raw","redirect","toCloudStorageCollections","collections","adapter","disablePayloadAccessControl","mappedCollections","Object","keys","disableLocalStorage","imagekitStorage","pluginOptions","config","alwaysInsertFields","enabled","privateKey","publicKey","imagekitClient","configuredSlugs","Set","configWithCropDisabled","map","has","beforeDocumentControls","components","edit","clientProps","authPath","hooks","beforeChange","adminThumbnail","crop","endpoints","handler","method","migrateFolder","payloadStorageImagekit"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@humaan/payload-storage-imagekit",
3
- "version": "2.3.2",
3
+ "version": "2.3.4",
4
4
  "description": "ImageKit storage adapter plugin for Payload CMS uploads",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -31,47 +31,48 @@
31
31
  "dist"
32
32
  ],
33
33
  "devDependencies": {
34
- "@eslint/eslintrc": "^3.3.5",
35
- "@payloadcms/db-mongodb": "3.80.0",
36
- "@payloadcms/db-postgres": "3.80.0",
37
- "@payloadcms/db-sqlite": "3.80.0",
34
+ "@eslint/eslintrc": "^3.2.0",
35
+ "@payloadcms/db-mongodb": "3.82.1",
36
+ "@payloadcms/db-postgres": "3.82.1",
37
+ "@payloadcms/db-sqlite": "3.82.1",
38
38
  "@payloadcms/eslint-config": "3.28.0",
39
- "@payloadcms/next": "3.80.0",
40
- "@payloadcms/richtext-lexical": "3.80.0",
41
- "@payloadcms/ui": "3.80.0",
42
- "@playwright/test": "1.58.2",
43
- "@swc-node/register": "1.11.1",
44
- "@swc/cli": "0.8.0",
45
- "@types/node": "25.5.0",
39
+ "@payloadcms/next": "3.82.1",
40
+ "@payloadcms/plugin-cloud-storage": "3.82.1",
41
+ "@payloadcms/richtext-lexical": "3.82.1",
42
+ "@payloadcms/ui": "3.82.1",
43
+ "@playwright/test": "1.59.1",
44
+ "@swc-node/register": "1.10.9",
45
+ "@swc/cli": "0.6.0",
46
+ "@types/node": "24.12.3",
46
47
  "@types/react": "19.2.14",
47
48
  "@types/react-dom": "19.2.3",
48
49
  "copyfiles": "2.4.1",
49
- "cross-env": "^7.0.3",
50
- "eslint": "^9.39.4",
51
- "eslint-config-next": "16.2.1",
52
- "graphql": "^16.13.1",
50
+ "cross-env": "10.1.0",
51
+ "eslint": "^9.23.0",
52
+ "eslint-config-next": "16.2.6",
53
+ "graphql": "^16.8.1",
53
54
  "mongodb-memory-server": "10.1.4",
54
- "next": "16.2.1",
55
- "open": "^10.2.0",
56
- "payload": "3.80.0",
57
- "prettier": "^3.8.1",
58
- "qs-esm": "7.0.3",
59
- "react": "19.2.4",
60
- "react-dom": "19.2.4",
55
+ "next": "16.2.6",
56
+ "open": "^10.1.0",
57
+ "payload": "3.82.1",
58
+ "prettier": "^3.4.2",
59
+ "qs-esm": "8.0.1",
60
+ "react": "19.2.6",
61
+ "react-dom": "19.2.6",
61
62
  "rimraf": "3.0.2",
62
- "sharp": "0.34.5",
63
- "sort-package-json": "^2.15.1",
64
- "typescript": "5.9.3",
65
- "vite-tsconfig-paths": "6.1.1",
66
- "vitest": "4.1.0"
63
+ "sharp": "0.34.2",
64
+ "sort-package-json": "^2.10.0",
65
+ "typescript": "6.0.3",
66
+ "vite": "7.3.2",
67
+ "vite-tsconfig-paths": "6.0.5",
68
+ "vitest": "4.1.6"
67
69
  },
68
70
  "peerDependencies": {
69
- "payload": ">=3.80.0 <4.0.0",
70
- "@payloadcms/plugin-cloud-storage": ">=3.80.0 <4.0.0"
71
+ "@payloadcms/plugin-cloud-storage": ">=3.82.1 <4.0.0",
72
+ "payload": ">=3.80.0 <4.0.0"
71
73
  },
72
74
  "engines": {
73
- "node": "^18.20.2 || >=20.9.0",
74
- "pnpm": "^9 || ^10"
75
+ "node": ">=24.15.0 <25"
75
76
  },
76
77
  "publishConfig": {
77
78
  "access": "public",
@@ -79,7 +80,7 @@
79
80
  },
80
81
  "registry": "https://registry.npmjs.org/",
81
82
  "dependencies": {
82
- "@imagekit/nodejs": "7.4.0"
83
+ "@imagekit/nodejs": "7.6.2"
83
84
  },
84
85
  "scripts": {
85
86
  "build": "pnpm copyfiles && pnpm build:types && pnpm build:swc",