@payloadcms/payload-cloud 3.23.0-canary.f63b80a → 3.23.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAW,MAAM,SAAS,CAAA;AAE9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAW/C,eAAO,MAAM,oBAAoB,QAAO,MAGvC,CAAA;AAED,eAAO,MAAM,kBAAkB,mBACZ,aAAa,sBACP,MAAM,KAAG,OAAO,CAAC,MAAM,CA6J7C,CAAA"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAW,MAAM,SAAS,CAAA;AAE9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAW/C,eAAO,MAAM,oBAAoB,QAAO,MAGvC,CAAA;AAED,eAAO,MAAM,kBAAkB,mBACZ,aAAa,sBACP,MAAM,KAAG,OAAO,CAAC,MAAM,CA8J7C,CAAA"}
package/dist/plugin.js CHANGED
@@ -61,7 +61,8 @@ export const payloadCloudPlugin = (pluginOptions)=>async (incomingConfig)=>{
61
61
  ...typeof collection.upload === 'object' && Array.isArray(collection.upload.handlers) ? collection.upload.handlers : [],
62
62
  getStaticHandler({
63
63
  cachingOptions: pluginOptions?.uploadCaching,
64
- collection
64
+ collection,
65
+ debug: pluginOptions?.debug
65
66
  })
66
67
  ]
67
68
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { Config, Payload } from 'payload'\n\nimport type { PluginOptions } from './types.js'\n\nimport { payloadCloudEmail } from './email.js'\nimport { getAfterDeleteHook } from './hooks/afterDelete.js'\nimport { getBeforeChangeHook } from './hooks/beforeChange.js'\nimport {\n getCacheUploadsAfterChangeHook,\n getCacheUploadsAfterDeleteHook,\n} from './hooks/uploadCache.js'\nimport { getStaticHandler } from './staticHandler.js'\n\nexport const generateRandomString = (): string => {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n return Array.from({ length: 24 }, () => chars[Math.floor(Math.random() * chars.length)]).join('')\n}\n\nexport const payloadCloudPlugin =\n (pluginOptions?: PluginOptions) =>\n async (incomingConfig: Config): Promise<Config> => {\n let config = { ...incomingConfig }\n\n if (process.env.PAYLOAD_CLOUD !== 'true') {\n return config\n }\n\n const cachingEnabled =\n pluginOptions?.uploadCaching !== false && !!process.env.PAYLOAD_CLOUD_CACHE_KEY\n\n const apiEndpoint = pluginOptions?.endpoint || 'https://cloud-api.payloadcms.com'\n\n // Configure cloud storage\n if (pluginOptions?.storage !== false) {\n config = {\n ...config,\n collections: (config.collections || []).map((collection) => {\n if (collection.upload) {\n return {\n ...collection,\n hooks: {\n ...(collection.hooks || {}),\n afterChange: [\n ...(collection.hooks?.afterChange || []),\n ...(cachingEnabled\n ? [getCacheUploadsAfterChangeHook({ endpoint: apiEndpoint })]\n : []),\n ],\n afterDelete: [\n ...(collection.hooks?.afterDelete || []),\n getAfterDeleteHook({ collection }),\n ...(cachingEnabled\n ? [getCacheUploadsAfterDeleteHook({ endpoint: apiEndpoint })]\n : []),\n ],\n beforeChange: [\n ...(collection.hooks?.beforeChange || []),\n getBeforeChangeHook({ collection }),\n ],\n },\n upload: {\n ...(typeof collection.upload === 'object' ? collection.upload : {}),\n disableLocalStorage: true,\n handlers: [\n ...(typeof collection.upload === 'object' &&\n Array.isArray(collection.upload.handlers)\n ? collection.upload.handlers\n : []),\n getStaticHandler({\n cachingOptions: pluginOptions?.uploadCaching,\n collection,\n }),\n ],\n },\n }\n }\n\n return collection\n }),\n upload: {\n ...(config.upload || {}),\n useTempFiles: true,\n },\n }\n }\n\n // Configure cloud email\n const apiKey = process.env.PAYLOAD_CLOUD_EMAIL_API_KEY\n const defaultDomain = process.env.PAYLOAD_CLOUD_DEFAULT_DOMAIN\n if (pluginOptions?.email !== false && apiKey && defaultDomain) {\n config.email = await payloadCloudEmail({\n apiKey,\n config,\n defaultDomain,\n defaultFromAddress: pluginOptions?.email?.defaultFromAddress,\n defaultFromName: pluginOptions?.email?.defaultFromName,\n skipVerify: pluginOptions?.email?.skipVerify,\n })\n }\n\n // We make sure to only run cronjobs on one instance using a instance identifier stored in a global.\n\n const DEFAULT_CRON = '* * * * *'\n const DEFAULT_LIMIT = 10\n const DEFAULT_CRON_JOB = {\n cron: DEFAULT_CRON,\n limit: DEFAULT_LIMIT,\n queue: 'default',\n }\n\n config.globals = [\n ...(config.globals || []),\n {\n slug: 'payload-cloud-instance',\n admin: {\n hidden: true,\n },\n fields: [\n {\n name: 'instance',\n type: 'text',\n required: true,\n },\n ],\n },\n ]\n\n if (pluginOptions?.enableAutoRun === false || !config.jobs) {\n return config\n }\n\n const oldAutoRunCopy = config.jobs.autoRun ?? []\n\n const hasExistingAutorun = Boolean(config.jobs.autoRun)\n\n const newShouldAutoRun = async (payload: Payload) => {\n if (process.env.PAYLOAD_CLOUD_JOBS_INSTANCE) {\n const retrievedGlobal = await payload.findGlobal({\n slug: 'payload-cloud-instance',\n })\n\n if (retrievedGlobal.instance === process.env.PAYLOAD_CLOUD_JOBS_INSTANCE) {\n return true\n } else {\n process.env.PAYLOAD_CLOUD_JOBS_INSTANCE = ''\n }\n }\n\n return false\n }\n\n if (!config.jobs.shouldAutoRun) {\n config.jobs.shouldAutoRun = newShouldAutoRun\n }\n\n const newAutoRun = async (payload: Payload) => {\n const instance = generateRandomString()\n\n process.env.PAYLOAD_CLOUD_JOBS_INSTANCE = instance\n\n await payload.updateGlobal({\n slug: 'payload-cloud-instance',\n data: {\n instance,\n },\n })\n\n if (!hasExistingAutorun) {\n return [DEFAULT_CRON_JOB]\n }\n\n return typeof oldAutoRunCopy === 'function' ? await oldAutoRunCopy(payload) : oldAutoRunCopy\n }\n\n config.jobs.autoRun = newAutoRun\n\n return config\n }\n"],"names":["payloadCloudEmail","getAfterDeleteHook","getBeforeChangeHook","getCacheUploadsAfterChangeHook","getCacheUploadsAfterDeleteHook","getStaticHandler","generateRandomString","chars","Array","from","length","Math","floor","random","join","payloadCloudPlugin","pluginOptions","incomingConfig","config","process","env","PAYLOAD_CLOUD","cachingEnabled","uploadCaching","PAYLOAD_CLOUD_CACHE_KEY","apiEndpoint","endpoint","storage","collections","map","collection","upload","hooks","afterChange","afterDelete","beforeChange","disableLocalStorage","handlers","isArray","cachingOptions","useTempFiles","apiKey","PAYLOAD_CLOUD_EMAIL_API_KEY","defaultDomain","PAYLOAD_CLOUD_DEFAULT_DOMAIN","email","defaultFromAddress","defaultFromName","skipVerify","DEFAULT_CRON","DEFAULT_LIMIT","DEFAULT_CRON_JOB","cron","limit","queue","globals","slug","admin","hidden","fields","name","type","required","enableAutoRun","jobs","oldAutoRunCopy","autoRun","hasExistingAutorun","Boolean","newShouldAutoRun","payload","PAYLOAD_CLOUD_JOBS_INSTANCE","retrievedGlobal","findGlobal","instance","shouldAutoRun","newAutoRun","updateGlobal","data"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { Config, Payload } from 'payload'\n\nimport type { PluginOptions } from './types.js'\n\nimport { payloadCloudEmail } from './email.js'\nimport { getAfterDeleteHook } from './hooks/afterDelete.js'\nimport { getBeforeChangeHook } from './hooks/beforeChange.js'\nimport {\n getCacheUploadsAfterChangeHook,\n getCacheUploadsAfterDeleteHook,\n} from './hooks/uploadCache.js'\nimport { getStaticHandler } from './staticHandler.js'\n\nexport const generateRandomString = (): string => {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n return Array.from({ length: 24 }, () => chars[Math.floor(Math.random() * chars.length)]).join('')\n}\n\nexport const payloadCloudPlugin =\n (pluginOptions?: PluginOptions) =>\n async (incomingConfig: Config): Promise<Config> => {\n let config = { ...incomingConfig }\n\n if (process.env.PAYLOAD_CLOUD !== 'true') {\n return config\n }\n\n const cachingEnabled =\n pluginOptions?.uploadCaching !== false && !!process.env.PAYLOAD_CLOUD_CACHE_KEY\n\n const apiEndpoint = pluginOptions?.endpoint || 'https://cloud-api.payloadcms.com'\n\n // Configure cloud storage\n if (pluginOptions?.storage !== false) {\n config = {\n ...config,\n collections: (config.collections || []).map((collection) => {\n if (collection.upload) {\n return {\n ...collection,\n hooks: {\n ...(collection.hooks || {}),\n afterChange: [\n ...(collection.hooks?.afterChange || []),\n ...(cachingEnabled\n ? [getCacheUploadsAfterChangeHook({ endpoint: apiEndpoint })]\n : []),\n ],\n afterDelete: [\n ...(collection.hooks?.afterDelete || []),\n getAfterDeleteHook({ collection }),\n ...(cachingEnabled\n ? [getCacheUploadsAfterDeleteHook({ endpoint: apiEndpoint })]\n : []),\n ],\n beforeChange: [\n ...(collection.hooks?.beforeChange || []),\n getBeforeChangeHook({ collection }),\n ],\n },\n upload: {\n ...(typeof collection.upload === 'object' ? collection.upload : {}),\n disableLocalStorage: true,\n handlers: [\n ...(typeof collection.upload === 'object' &&\n Array.isArray(collection.upload.handlers)\n ? collection.upload.handlers\n : []),\n getStaticHandler({\n cachingOptions: pluginOptions?.uploadCaching,\n collection,\n debug: pluginOptions?.debug,\n }),\n ],\n },\n }\n }\n\n return collection\n }),\n upload: {\n ...(config.upload || {}),\n useTempFiles: true,\n },\n }\n }\n\n // Configure cloud email\n const apiKey = process.env.PAYLOAD_CLOUD_EMAIL_API_KEY\n const defaultDomain = process.env.PAYLOAD_CLOUD_DEFAULT_DOMAIN\n if (pluginOptions?.email !== false && apiKey && defaultDomain) {\n config.email = await payloadCloudEmail({\n apiKey,\n config,\n defaultDomain,\n defaultFromAddress: pluginOptions?.email?.defaultFromAddress,\n defaultFromName: pluginOptions?.email?.defaultFromName,\n skipVerify: pluginOptions?.email?.skipVerify,\n })\n }\n\n // We make sure to only run cronjobs on one instance using a instance identifier stored in a global.\n\n const DEFAULT_CRON = '* * * * *'\n const DEFAULT_LIMIT = 10\n const DEFAULT_CRON_JOB = {\n cron: DEFAULT_CRON,\n limit: DEFAULT_LIMIT,\n queue: 'default',\n }\n\n config.globals = [\n ...(config.globals || []),\n {\n slug: 'payload-cloud-instance',\n admin: {\n hidden: true,\n },\n fields: [\n {\n name: 'instance',\n type: 'text',\n required: true,\n },\n ],\n },\n ]\n\n if (pluginOptions?.enableAutoRun === false || !config.jobs) {\n return config\n }\n\n const oldAutoRunCopy = config.jobs.autoRun ?? []\n\n const hasExistingAutorun = Boolean(config.jobs.autoRun)\n\n const newShouldAutoRun = async (payload: Payload) => {\n if (process.env.PAYLOAD_CLOUD_JOBS_INSTANCE) {\n const retrievedGlobal = await payload.findGlobal({\n slug: 'payload-cloud-instance',\n })\n\n if (retrievedGlobal.instance === process.env.PAYLOAD_CLOUD_JOBS_INSTANCE) {\n return true\n } else {\n process.env.PAYLOAD_CLOUD_JOBS_INSTANCE = ''\n }\n }\n\n return false\n }\n\n if (!config.jobs.shouldAutoRun) {\n config.jobs.shouldAutoRun = newShouldAutoRun\n }\n\n const newAutoRun = async (payload: Payload) => {\n const instance = generateRandomString()\n\n process.env.PAYLOAD_CLOUD_JOBS_INSTANCE = instance\n\n await payload.updateGlobal({\n slug: 'payload-cloud-instance',\n data: {\n instance,\n },\n })\n\n if (!hasExistingAutorun) {\n return [DEFAULT_CRON_JOB]\n }\n\n return typeof oldAutoRunCopy === 'function' ? await oldAutoRunCopy(payload) : oldAutoRunCopy\n }\n\n config.jobs.autoRun = newAutoRun\n\n return config\n }\n"],"names":["payloadCloudEmail","getAfterDeleteHook","getBeforeChangeHook","getCacheUploadsAfterChangeHook","getCacheUploadsAfterDeleteHook","getStaticHandler","generateRandomString","chars","Array","from","length","Math","floor","random","join","payloadCloudPlugin","pluginOptions","incomingConfig","config","process","env","PAYLOAD_CLOUD","cachingEnabled","uploadCaching","PAYLOAD_CLOUD_CACHE_KEY","apiEndpoint","endpoint","storage","collections","map","collection","upload","hooks","afterChange","afterDelete","beforeChange","disableLocalStorage","handlers","isArray","cachingOptions","debug","useTempFiles","apiKey","PAYLOAD_CLOUD_EMAIL_API_KEY","defaultDomain","PAYLOAD_CLOUD_DEFAULT_DOMAIN","email","defaultFromAddress","defaultFromName","skipVerify","DEFAULT_CRON","DEFAULT_LIMIT","DEFAULT_CRON_JOB","cron","limit","queue","globals","slug","admin","hidden","fields","name","type","required","enableAutoRun","jobs","oldAutoRunCopy","autoRun","hasExistingAutorun","Boolean","newShouldAutoRun","payload","PAYLOAD_CLOUD_JOBS_INSTANCE","retrievedGlobal","findGlobal","instance","shouldAutoRun","newAutoRun","updateGlobal","data"],"mappings":"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"}
@@ -3,7 +3,8 @@ import type { PluginOptions, StaticHandler } from './types.js';
3
3
  interface Args {
4
4
  cachingOptions?: PluginOptions['uploadCaching'];
5
5
  collection: CollectionConfig;
6
+ debug?: boolean;
6
7
  }
7
- export declare const getStaticHandler: ({ cachingOptions, collection }: Args) => StaticHandler;
8
+ export declare const getStaticHandler: ({ cachingOptions, collection, debug }: Args) => StaticHandler;
8
9
  export {};
9
10
  //# sourceMappingURL=staticHandler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"staticHandler.d.ts","sourceRoot":"","sources":["../src/staticHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,OAAO,KAAK,EAA2B,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAKvF,UAAU,IAAI;IACZ,cAAc,CAAC,EAAE,aAAa,CAAC,eAAe,CAAC,CAAA;IAC/C,UAAU,EAAE,gBAAgB,CAAA;CAC7B;AAWD,eAAO,MAAM,gBAAgB,mCAAoC,IAAI,KAAG,aAgFvE,CAAA"}
1
+ {"version":3,"file":"staticHandler.d.ts","sourceRoot":"","sources":["../src/staticHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAG/C,OAAO,KAAK,EAA2B,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAKvF,UAAU,IAAI;IACZ,cAAc,CAAC,EAAE,aAAa,CAAC,eAAe,CAAC,CAAA;IAC/C,UAAU,EAAE,gBAAgB,CAAA;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAuBD,eAAO,MAAM,gBAAgB,0CAA2C,IAAI,KAAG,aAoG9E,CAAA"}
@@ -1,5 +1,9 @@
1
1
  import { createKey } from './utilities/createKey.js';
2
2
  import { getStorageClient } from './utilities/getStorageClient.js';
3
+ // Type guard for NodeJS.Readable streams
4
+ const isNodeReadableStream = (body)=>{
5
+ return typeof body === 'object' && body !== null && 'pipe' in body && typeof body.pipe === 'function' && 'destroy' in body && typeof body.destroy === 'function';
6
+ };
3
7
  // Convert a stream into a promise that resolves with a Buffer
4
8
  const streamToBuffer = async (readableStream)=>{
5
9
  const chunks = [];
@@ -8,7 +12,7 @@ const streamToBuffer = async (readableStream)=>{
8
12
  }
9
13
  return Buffer.concat(chunks);
10
14
  };
11
- export const getStaticHandler = ({ cachingOptions, collection })=>{
15
+ export const getStaticHandler = ({ cachingOptions, collection, debug })=>{
12
16
  let maxAge = 86400 // 24 hours default
13
17
  ;
14
18
  let collCacheConfig;
@@ -39,6 +43,18 @@ export const getStaticHandler = ({ cachingOptions, collection })=>{
39
43
  statusText: 'Not Found'
40
44
  });
41
45
  }
46
+ // On error, manually destroy stream to close socket
47
+ if (object.Body && isNodeReadableStream(object.Body)) {
48
+ const stream = object.Body;
49
+ stream.on('error', (err)=>{
50
+ req.payload.logger.error({
51
+ err,
52
+ key,
53
+ msg: 'Error streaming S3 object, destroying stream'
54
+ });
55
+ stream.destroy();
56
+ });
57
+ }
42
58
  const bodyBuffer = await streamToBuffer(object.Body);
43
59
  return new Response(bodyBuffer, {
44
60
  headers: new Headers({
@@ -52,21 +68,37 @@ export const getStaticHandler = ({ cachingOptions, collection })=>{
52
68
  status: 200
53
69
  });
54
70
  } catch (err) {
55
- /**
56
- * If object key does not found, the getObject function attempts a ListBucket operation.
57
- * Because of permissions, this will throw very specific error that we can catch and handle.
58
- */ if (err instanceof Error && err.name === 'AccessDenied' && err.message?.includes('s3:ListBucket') && 'type' in err && err.type === 'S3ServiceException') {
59
- req.payload.logger.error({
60
- collectionSlug: collection.slug,
61
- err,
62
- msg: `Requested file not found in cloud storage: ${params.filename}`,
63
- params,
64
- requestedKey: key
65
- });
66
- return new Response(null, {
67
- status: 404,
68
- statusText: 'Not Found'
69
- });
71
+ // Handle each error explicitly
72
+ if (err instanceof Error) {
73
+ /**
74
+ * Note: If AccessDenied comes back, it typically means that the object key is not found.
75
+ * The AWS SDK throws this because it attempts an s3:ListBucket operation under the hood
76
+ * if it does not find the object key, which we have disallowed in our bucket policy.
77
+ */ if (err.name === 'AccessDenied') {
78
+ req.payload.logger.warn({
79
+ awsErr: debug ? err : err.name,
80
+ collectionSlug: collection.slug,
81
+ msg: `Requested file not found in cloud storage: ${params.filename}`,
82
+ params,
83
+ requestedKey: key
84
+ });
85
+ return new Response(null, {
86
+ status: 404,
87
+ statusText: 'Not Found'
88
+ });
89
+ } else if (err.name === 'NoSuchKey') {
90
+ req.payload.logger.warn({
91
+ awsErr: debug ? err : err.name,
92
+ collectionSlug: collection.slug,
93
+ msg: `Requested file not found in cloud storage: ${params.filename}`,
94
+ params,
95
+ requestedKey: key
96
+ });
97
+ return new Response(null, {
98
+ status: 404,
99
+ statusText: 'Not Found'
100
+ });
101
+ }
70
102
  }
71
103
  req.payload.logger.error({
72
104
  collectionSlug: collection.slug,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/staticHandler.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\nimport type { CollectionCachingConfig, PluginOptions, StaticHandler } from './types.js'\n\nimport { createKey } from './utilities/createKey.js'\nimport { getStorageClient } from './utilities/getStorageClient.js'\n\ninterface Args {\n cachingOptions?: PluginOptions['uploadCaching']\n collection: CollectionConfig\n}\n\n// Convert a stream into a promise that resolves with a Buffer\nconst streamToBuffer = async (readableStream: any) => {\n const chunks = []\n for await (const chunk of readableStream) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk)\n }\n return Buffer.concat(chunks)\n}\n\nexport const getStaticHandler = ({ cachingOptions, collection }: Args): StaticHandler => {\n let maxAge = 86400 // 24 hours default\n let collCacheConfig: CollectionCachingConfig | undefined\n if (cachingOptions !== false) {\n // Set custom maxAge for all collections\n maxAge = cachingOptions?.maxAge || maxAge\n collCacheConfig = cachingOptions?.collections?.[collection.slug] || {}\n }\n\n // Set maxAge using collection-specific override\n maxAge = collCacheConfig?.maxAge || maxAge\n\n const cachingEnabled =\n cachingOptions !== false &&\n !!process.env.PAYLOAD_CLOUD_CACHE_KEY &&\n collCacheConfig?.enabled !== false\n\n return async (req, { params }) => {\n let key = ''\n try {\n const { identityID, storageClient } = await getStorageClient()\n\n key = createKey({\n collection: collection.slug,\n filename: params.filename,\n identityID,\n })\n\n const object = await storageClient.getObject({\n Bucket: process.env.PAYLOAD_CLOUD_BUCKET,\n Key: key,\n })\n\n if (!object.Body || !object.ContentType || !object.ETag) {\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n\n const bodyBuffer = await streamToBuffer(object.Body)\n\n return new Response(bodyBuffer, {\n headers: new Headers({\n 'Content-Length': String(object.ContentLength),\n 'Content-Type': object.ContentType,\n ...(cachingEnabled && { 'Cache-Control': `public, max-age=${maxAge}` }),\n ETag: object.ETag,\n }),\n status: 200,\n })\n } catch (err: unknown) {\n /**\n * If object key does not found, the getObject function attempts a ListBucket operation.\n * Because of permissions, this will throw very specific error that we can catch and handle.\n */\n if (\n err instanceof Error &&\n err.name === 'AccessDenied' &&\n err.message?.includes('s3:ListBucket') &&\n 'type' in err &&\n err.type === 'S3ServiceException'\n ) {\n req.payload.logger.error({\n collectionSlug: collection.slug,\n err,\n msg: `Requested file not found in cloud storage: ${params.filename}`,\n params,\n requestedKey: key,\n })\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n\n req.payload.logger.error({\n collectionSlug: collection.slug,\n err,\n msg: `Error getting file from cloud storage: ${params.filename}`,\n params,\n requestedKey: key,\n })\n return new Response('Internal Server Error', { status: 500 })\n }\n }\n}\n"],"names":["createKey","getStorageClient","streamToBuffer","readableStream","chunks","chunk","push","Buffer","from","concat","getStaticHandler","cachingOptions","collection","maxAge","collCacheConfig","collections","slug","cachingEnabled","process","env","PAYLOAD_CLOUD_CACHE_KEY","enabled","req","params","key","identityID","storageClient","filename","object","getObject","Bucket","PAYLOAD_CLOUD_BUCKET","Key","Body","ContentType","ETag","Response","status","statusText","bodyBuffer","headers","Headers","String","ContentLength","err","Error","name","message","includes","type","payload","logger","error","collectionSlug","msg","requestedKey"],"mappings":"AAIA,SAASA,SAAS,QAAQ,2BAA0B;AACpD,SAASC,gBAAgB,QAAQ,kCAAiC;AAOlE,8DAA8D;AAC9D,MAAMC,iBAAiB,OAAOC;IAC5B,MAAMC,SAAS,EAAE;IACjB,WAAW,MAAMC,SAASF,eAAgB;QACxCC,OAAOE,IAAI,CAAC,OAAOD,UAAU,WAAWE,OAAOC,IAAI,CAACH,SAASA;IAC/D;IACA,OAAOE,OAAOE,MAAM,CAACL;AACvB;AAEA,OAAO,MAAMM,mBAAmB,CAAC,EAAEC,cAAc,EAAEC,UAAU,EAAQ;IACnE,IAAIC,SAAS,MAAM,mBAAmB;;IACtC,IAAIC;IACJ,IAAIH,mBAAmB,OAAO;QAC5B,wCAAwC;QACxCE,SAASF,gBAAgBE,UAAUA;QACnCC,kBAAkBH,gBAAgBI,aAAa,CAACH,WAAWI,IAAI,CAAC,IAAI,CAAC;IACvE;IAEA,gDAAgD;IAChDH,SAASC,iBAAiBD,UAAUA;IAEpC,MAAMI,iBACJN,mBAAmB,SACnB,CAAC,CAACO,QAAQC,GAAG,CAACC,uBAAuB,IACrCN,iBAAiBO,YAAY;IAE/B,OAAO,OAAOC,KAAK,EAAEC,MAAM,EAAE;QAC3B,IAAIC,MAAM;QACV,IAAI;YACF,MAAM,EAAEC,UAAU,EAAEC,aAAa,EAAE,GAAG,MAAMzB;YAE5CuB,MAAMxB,UAAU;gBACdY,YAAYA,WAAWI,IAAI;gBAC3BW,UAAUJ,OAAOI,QAAQ;gBACzBF;YACF;YAEA,MAAMG,SAAS,MAAMF,cAAcG,SAAS,CAAC;gBAC3CC,QAAQZ,QAAQC,GAAG,CAACY,oBAAoB;gBACxCC,KAAKR;YACP;YAEA,IAAI,CAACI,OAAOK,IAAI,IAAI,CAACL,OAAOM,WAAW,IAAI,CAACN,OAAOO,IAAI,EAAE;gBACvD,OAAO,IAAIC,SAAS,MAAM;oBAAEC,QAAQ;oBAAKC,YAAY;gBAAY;YACnE;YAEA,MAAMC,aAAa,MAAMrC,eAAe0B,OAAOK,IAAI;YAEnD,OAAO,IAAIG,SAASG,YAAY;gBAC9BC,SAAS,IAAIC,QAAQ;oBACnB,kBAAkBC,OAAOd,OAAOe,aAAa;oBAC7C,gBAAgBf,OAAOM,WAAW;oBAClC,GAAIjB,kBAAkB;wBAAE,iBAAiB,CAAC,gBAAgB,EAAEJ,QAAQ;oBAAC,CAAC;oBACtEsB,MAAMP,OAAOO,IAAI;gBACnB;gBACAE,QAAQ;YACV;QACF,EAAE,OAAOO,KAAc;YACrB;;;OAGC,GACD,IACEA,eAAeC,SACfD,IAAIE,IAAI,KAAK,kBACbF,IAAIG,OAAO,EAAEC,SAAS,oBACtB,UAAUJ,OACVA,IAAIK,IAAI,KAAK,sBACb;gBACA3B,IAAI4B,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC;oBACvBC,gBAAgBzC,WAAWI,IAAI;oBAC/B4B;oBACAU,KAAK,CAAC,2CAA2C,EAAE/B,OAAOI,QAAQ,EAAE;oBACpEJ;oBACAgC,cAAc/B;gBAChB;gBACA,OAAO,IAAIY,SAAS,MAAM;oBAAEC,QAAQ;oBAAKC,YAAY;gBAAY;YACnE;YAEAhB,IAAI4B,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC;gBACvBC,gBAAgBzC,WAAWI,IAAI;gBAC/B4B;gBACAU,KAAK,CAAC,uCAAuC,EAAE/B,OAAOI,QAAQ,EAAE;gBAChEJ;gBACAgC,cAAc/B;YAChB;YACA,OAAO,IAAIY,SAAS,yBAAyB;gBAAEC,QAAQ;YAAI;QAC7D;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../src/staticHandler.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\nimport type { Readable } from 'stream'\n\nimport type { CollectionCachingConfig, PluginOptions, StaticHandler } from './types.js'\n\nimport { createKey } from './utilities/createKey.js'\nimport { getStorageClient } from './utilities/getStorageClient.js'\n\ninterface Args {\n cachingOptions?: PluginOptions['uploadCaching']\n collection: CollectionConfig\n debug?: boolean\n}\n\n// Type guard for NodeJS.Readable streams\nconst isNodeReadableStream = (body: unknown): body is Readable => {\n return (\n typeof body === 'object' &&\n body !== null &&\n 'pipe' in body &&\n typeof (body as any).pipe === 'function' &&\n 'destroy' in body &&\n typeof (body as any).destroy === 'function'\n )\n}\n\n// Convert a stream into a promise that resolves with a Buffer\nconst streamToBuffer = async (readableStream: any) => {\n const chunks = []\n for await (const chunk of readableStream) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk)\n }\n return Buffer.concat(chunks)\n}\n\nexport const getStaticHandler = ({ cachingOptions, collection, debug }: Args): StaticHandler => {\n let maxAge = 86400 // 24 hours default\n let collCacheConfig: CollectionCachingConfig | undefined\n if (cachingOptions !== false) {\n // Set custom maxAge for all collections\n maxAge = cachingOptions?.maxAge || maxAge\n collCacheConfig = cachingOptions?.collections?.[collection.slug] || {}\n }\n\n // Set maxAge using collection-specific override\n maxAge = collCacheConfig?.maxAge || maxAge\n\n const cachingEnabled =\n cachingOptions !== false &&\n !!process.env.PAYLOAD_CLOUD_CACHE_KEY &&\n collCacheConfig?.enabled !== false\n\n return async (req, { params }) => {\n let key = ''\n try {\n const { identityID, storageClient } = await getStorageClient()\n\n key = createKey({\n collection: collection.slug,\n filename: params.filename,\n identityID,\n })\n\n const object = await storageClient.getObject({\n Bucket: process.env.PAYLOAD_CLOUD_BUCKET,\n Key: key,\n })\n\n if (!object.Body || !object.ContentType || !object.ETag) {\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n\n // On error, manually destroy stream to close socket\n if (object.Body && isNodeReadableStream(object.Body)) {\n const stream = object.Body\n stream.on('error', (err) => {\n req.payload.logger.error({\n err,\n key,\n msg: 'Error streaming S3 object, destroying stream',\n })\n stream.destroy()\n })\n }\n\n const bodyBuffer = await streamToBuffer(object.Body)\n\n return new Response(bodyBuffer, {\n headers: new Headers({\n 'Content-Length': String(object.ContentLength),\n 'Content-Type': object.ContentType,\n ...(cachingEnabled && { 'Cache-Control': `public, max-age=${maxAge}` }),\n ETag: object.ETag,\n }),\n status: 200,\n })\n } catch (err: unknown) {\n // Handle each error explicitly\n if (err instanceof Error) {\n /**\n * Note: If AccessDenied comes back, it typically means that the object key is not found.\n * The AWS SDK throws this because it attempts an s3:ListBucket operation under the hood\n * if it does not find the object key, which we have disallowed in our bucket policy.\n */\n if (err.name === 'AccessDenied') {\n req.payload.logger.warn({\n awsErr: debug ? err : err.name,\n collectionSlug: collection.slug,\n msg: `Requested file not found in cloud storage: ${params.filename}`,\n params,\n requestedKey: key,\n })\n return new Response(null, { status: 404, statusText: 'Not Found' })\n } else if (err.name === 'NoSuchKey') {\n req.payload.logger.warn({\n awsErr: debug ? err : err.name,\n collectionSlug: collection.slug,\n msg: `Requested file not found in cloud storage: ${params.filename}`,\n params,\n requestedKey: key,\n })\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n }\n\n req.payload.logger.error({\n collectionSlug: collection.slug,\n err,\n msg: `Error getting file from cloud storage: ${params.filename}`,\n params,\n requestedKey: key,\n })\n return new Response('Internal Server Error', { status: 500 })\n }\n }\n}\n"],"names":["createKey","getStorageClient","isNodeReadableStream","body","pipe","destroy","streamToBuffer","readableStream","chunks","chunk","push","Buffer","from","concat","getStaticHandler","cachingOptions","collection","debug","maxAge","collCacheConfig","collections","slug","cachingEnabled","process","env","PAYLOAD_CLOUD_CACHE_KEY","enabled","req","params","key","identityID","storageClient","filename","object","getObject","Bucket","PAYLOAD_CLOUD_BUCKET","Key","Body","ContentType","ETag","Response","status","statusText","stream","on","err","payload","logger","error","msg","bodyBuffer","headers","Headers","String","ContentLength","Error","name","warn","awsErr","collectionSlug","requestedKey"],"mappings":"AAKA,SAASA,SAAS,QAAQ,2BAA0B;AACpD,SAASC,gBAAgB,QAAQ,kCAAiC;AAQlE,yCAAyC;AACzC,MAAMC,uBAAuB,CAACC;IAC5B,OACE,OAAOA,SAAS,YAChBA,SAAS,QACT,UAAUA,QACV,OAAO,AAACA,KAAaC,IAAI,KAAK,cAC9B,aAAaD,QACb,OAAO,AAACA,KAAaE,OAAO,KAAK;AAErC;AAEA,8DAA8D;AAC9D,MAAMC,iBAAiB,OAAOC;IAC5B,MAAMC,SAAS,EAAE;IACjB,WAAW,MAAMC,SAASF,eAAgB;QACxCC,OAAOE,IAAI,CAAC,OAAOD,UAAU,WAAWE,OAAOC,IAAI,CAACH,SAASA;IAC/D;IACA,OAAOE,OAAOE,MAAM,CAACL;AACvB;AAEA,OAAO,MAAMM,mBAAmB,CAAC,EAAEC,cAAc,EAAEC,UAAU,EAAEC,KAAK,EAAQ;IAC1E,IAAIC,SAAS,MAAM,mBAAmB;;IACtC,IAAIC;IACJ,IAAIJ,mBAAmB,OAAO;QAC5B,wCAAwC;QACxCG,SAASH,gBAAgBG,UAAUA;QACnCC,kBAAkBJ,gBAAgBK,aAAa,CAACJ,WAAWK,IAAI,CAAC,IAAI,CAAC;IACvE;IAEA,gDAAgD;IAChDH,SAASC,iBAAiBD,UAAUA;IAEpC,MAAMI,iBACJP,mBAAmB,SACnB,CAAC,CAACQ,QAAQC,GAAG,CAACC,uBAAuB,IACrCN,iBAAiBO,YAAY;IAE/B,OAAO,OAAOC,KAAK,EAAEC,MAAM,EAAE;QAC3B,IAAIC,MAAM;QACV,IAAI;YACF,MAAM,EAAEC,UAAU,EAAEC,aAAa,EAAE,GAAG,MAAM9B;YAE5C4B,MAAM7B,UAAU;gBACdgB,YAAYA,WAAWK,IAAI;gBAC3BW,UAAUJ,OAAOI,QAAQ;gBACzBF;YACF;YAEA,MAAMG,SAAS,MAAMF,cAAcG,SAAS,CAAC;gBAC3CC,QAAQZ,QAAQC,GAAG,CAACY,oBAAoB;gBACxCC,KAAKR;YACP;YAEA,IAAI,CAACI,OAAOK,IAAI,IAAI,CAACL,OAAOM,WAAW,IAAI,CAACN,OAAOO,IAAI,EAAE;gBACvD,OAAO,IAAIC,SAAS,MAAM;oBAAEC,QAAQ;oBAAKC,YAAY;gBAAY;YACnE;YAEA,oDAAoD;YACpD,IAAIV,OAAOK,IAAI,IAAIpC,qBAAqB+B,OAAOK,IAAI,GAAG;gBACpD,MAAMM,SAASX,OAAOK,IAAI;gBAC1BM,OAAOC,EAAE,CAAC,SAAS,CAACC;oBAClBnB,IAAIoB,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC;wBACvBH;wBACAjB;wBACAqB,KAAK;oBACP;oBACAN,OAAOvC,OAAO;gBAChB;YACF;YAEA,MAAM8C,aAAa,MAAM7C,eAAe2B,OAAOK,IAAI;YAEnD,OAAO,IAAIG,SAASU,YAAY;gBAC9BC,SAAS,IAAIC,QAAQ;oBACnB,kBAAkBC,OAAOrB,OAAOsB,aAAa;oBAC7C,gBAAgBtB,OAAOM,WAAW;oBAClC,GAAIjB,kBAAkB;wBAAE,iBAAiB,CAAC,gBAAgB,EAAEJ,QAAQ;oBAAC,CAAC;oBACtEsB,MAAMP,OAAOO,IAAI;gBACnB;gBACAE,QAAQ;YACV;QACF,EAAE,OAAOI,KAAc;YACrB,+BAA+B;YAC/B,IAAIA,eAAeU,OAAO;gBACxB;;;;SAIC,GACD,IAAIV,IAAIW,IAAI,KAAK,gBAAgB;oBAC/B9B,IAAIoB,OAAO,CAACC,MAAM,CAACU,IAAI,CAAC;wBACtBC,QAAQ1C,QAAQ6B,MAAMA,IAAIW,IAAI;wBAC9BG,gBAAgB5C,WAAWK,IAAI;wBAC/B6B,KAAK,CAAC,2CAA2C,EAAEtB,OAAOI,QAAQ,EAAE;wBACpEJ;wBACAiC,cAAchC;oBAChB;oBACA,OAAO,IAAIY,SAAS,MAAM;wBAAEC,QAAQ;wBAAKC,YAAY;oBAAY;gBACnE,OAAO,IAAIG,IAAIW,IAAI,KAAK,aAAa;oBACnC9B,IAAIoB,OAAO,CAACC,MAAM,CAACU,IAAI,CAAC;wBACtBC,QAAQ1C,QAAQ6B,MAAMA,IAAIW,IAAI;wBAC9BG,gBAAgB5C,WAAWK,IAAI;wBAC/B6B,KAAK,CAAC,2CAA2C,EAAEtB,OAAOI,QAAQ,EAAE;wBACpEJ;wBACAiC,cAAchC;oBAChB;oBACA,OAAO,IAAIY,SAAS,MAAM;wBAAEC,QAAQ;wBAAKC,YAAY;oBAAY;gBACnE;YACF;YAEAhB,IAAIoB,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC;gBACvBW,gBAAgB5C,WAAWK,IAAI;gBAC/ByB;gBACAI,KAAK,CAAC,uCAAuC,EAAEtB,OAAOI,QAAQ,EAAE;gBAChEJ;gBACAiC,cAAchC;YAChB;YACA,OAAO,IAAIY,SAAS,yBAAyB;gBAAEC,QAAQ;YAAI;QAC7D;IACF;AACF,EAAC"}
package/dist/types.d.ts CHANGED
@@ -41,6 +41,12 @@ export interface PayloadCloudEmailOptions {
41
41
  skipVerify?: boolean;
42
42
  }
43
43
  export interface PluginOptions {
44
+ /**
45
+ * Enable additional debug logging
46
+ *
47
+ * @default false
48
+ */
49
+ debug?: boolean;
44
50
  /** Payload Cloud Email
45
51
  * @default true
46
52
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,MAAM,EACN,QAAQ,EACR,cAAc,EACd,UAAU,EACV,oBAAoB,EACrB,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,IAAI;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE;IAChC,UAAU,EAAE,gBAAgB,CAAA;IAC5B,IAAI,EAAE,GAAG,CAAA;IACT,IAAI,EAAE,IAAI,CAAA;IACV,GAAG,EAAE,cAAc,CAAA;CACpB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAE1B,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE;IAChC,UAAU,EAAE,gBAAgB,CAAA;IAC5B,GAAG,EAAE,QAAQ,GAAG,UAAU,GAAG,cAAc,CAAA;IAC3C,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,cAAc,CAAA;CACpB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAE1B,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE;IAC/B,UAAU,EAAE,gBAAgB,CAAA;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;AAE9B,MAAM,MAAM,aAAa,GAAG,CAC1B,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE;IAAE,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,KACvD,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAA;AAExD,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,KAAK,CAAC,EACF;QACE,kBAAkB,EAAE,MAAM,CAAA;QAC1B,eAAe,EAAE,MAAM,CAAA;QACvB,UAAU,CAAC,EAAE,OAAO,CAAA;KACrB,GACD,KAAK,CAAA;IAET;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IAEvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,KAAK,CAAA;IAEf;;;;;;;;;;;;;;;;;OAiBG;IAEH,aAAa,CAAC,EACV;QACE;;WAEG;QACH,WAAW,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,CAAC,CAAA;QAC5E;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,GACD,KAAK,CAAA;CACV;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,MAAM,EACN,QAAQ,EACR,cAAc,EACd,UAAU,EACV,oBAAoB,EACrB,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,IAAI;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE;IAChC,UAAU,EAAE,gBAAgB,CAAA;IAC5B,IAAI,EAAE,GAAG,CAAA;IACT,IAAI,EAAE,IAAI,CAAA;IACV,GAAG,EAAE,cAAc,CAAA;CACpB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAE1B,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE;IAChC,UAAU,EAAE,gBAAgB,CAAA;IAC5B,GAAG,EAAE,QAAQ,GAAG,UAAU,GAAG,cAAc,CAAA;IAC3C,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,cAAc,CAAA;CACpB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAE1B,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE;IAC/B,UAAU,EAAE,gBAAgB,CAAA;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;AAE9B,MAAM,MAAM,aAAa,GAAG,CAC1B,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE;IAAE,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,KACvD,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAA;AAExD,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;OAEG;IACH,KAAK,CAAC,EACF;QACE,kBAAkB,EAAE,MAAM,CAAA;QAC1B,eAAe,EAAE,MAAM,CAAA;QACvB,UAAU,CAAC,EAAE,OAAO,CAAA;KACrB,GACD,KAAK,CAAA;IAET;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IAEvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,KAAK,CAAA;IAEf;;;;;;;;;;;;;;;;;OAiBG;IAEH,aAAa,CAAC,EACV;QACE;;WAEG;QACH,WAAW,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,CAAC,CAAA;QAC5E;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,GACD,KAAK,CAAA;CACV;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type {\n CollectionConfig,\n Config,\n FileData,\n PayloadRequest,\n TypeWithID,\n UploadCollectionSlug,\n} from 'payload'\n\nexport interface File {\n buffer: Buffer\n filename: string\n filesize: number\n mimeType: string\n tempFilePath?: string\n}\n\nexport type HandleUpload = (args: {\n collection: CollectionConfig\n data: any\n file: File\n req: PayloadRequest\n}) => Promise<void> | void\n\nexport interface TypeWithPrefix {\n prefix?: string\n}\n\nexport type HandleDelete = (args: {\n collection: CollectionConfig\n doc: FileData & TypeWithID & TypeWithPrefix\n filename: string\n req: PayloadRequest\n}) => Promise<void> | void\n\nexport type GenerateURL = (args: {\n collection: CollectionConfig\n filename: string\n prefix?: string\n}) => Promise<string> | string\n\nexport type StaticHandler = (\n req: PayloadRequest,\n args: { params: { collection: string; filename: string } },\n) => Promise<Response> | Promise<void> | Response | void\n\nexport interface PayloadCloudEmailOptions {\n apiKey: string\n config: Config\n defaultDomain: string\n defaultFromAddress?: string\n defaultFromName?: string\n skipVerify?: boolean\n}\n\nexport interface PluginOptions {\n /** Payload Cloud Email\n * @default true\n */\n email?:\n | {\n defaultFromAddress: string\n defaultFromName: string\n skipVerify?: boolean\n }\n | false\n\n /**\n *\n * Configures whether cron jobs defined in config.jobs.autoRun will be run or not\n *\n * @default true\n */\n enableAutoRun?: boolean\n\n /**\n * Payload Cloud API endpoint\n *\n * @internal Endpoint override for developement\n */\n endpoint?: string\n\n /** Payload Cloud Storage\n * @default true\n */\n storage?: false\n\n /**\n * Upload caching. Defaults to 24 hours for all collections.\n *\n * Optionally configure caching per collection\n *\n * ```ts\n * {\n * collSlug1: {\n * maxAge: 3600 // Custom value in seconds\n * },\n * collSlug2: {\n * enabled: false // Disable caching for this collection\n * }\n * }\n * ```\n *\n * @default true\n */\n\n uploadCaching?:\n | {\n /**\n * Caching configuration per-collection\n */\n collections?: Partial<Record<UploadCollectionSlug, CollectionCachingConfig>>\n /** Caching in seconds override for all collections\n * @default 86400 (24 hours)\n */\n maxAge?: number\n }\n | false\n}\n\nexport type CollectionCachingConfig = {\n /**\n * Enable/disable caching for this collection\n *\n * @default true\n */\n enabled?: boolean\n /** Caching in seconds override for this collection\n * @default 86400 (24 hours)\n */\n maxAge?: number\n}\n"],"names":[],"mappings":"AAwHA,WAWC"}
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type {\n CollectionConfig,\n Config,\n FileData,\n PayloadRequest,\n TypeWithID,\n UploadCollectionSlug,\n} from 'payload'\n\nexport interface File {\n buffer: Buffer\n filename: string\n filesize: number\n mimeType: string\n tempFilePath?: string\n}\n\nexport type HandleUpload = (args: {\n collection: CollectionConfig\n data: any\n file: File\n req: PayloadRequest\n}) => Promise<void> | void\n\nexport interface TypeWithPrefix {\n prefix?: string\n}\n\nexport type HandleDelete = (args: {\n collection: CollectionConfig\n doc: FileData & TypeWithID & TypeWithPrefix\n filename: string\n req: PayloadRequest\n}) => Promise<void> | void\n\nexport type GenerateURL = (args: {\n collection: CollectionConfig\n filename: string\n prefix?: string\n}) => Promise<string> | string\n\nexport type StaticHandler = (\n req: PayloadRequest,\n args: { params: { collection: string; filename: string } },\n) => Promise<Response> | Promise<void> | Response | void\n\nexport interface PayloadCloudEmailOptions {\n apiKey: string\n config: Config\n defaultDomain: string\n defaultFromAddress?: string\n defaultFromName?: string\n skipVerify?: boolean\n}\n\nexport interface PluginOptions {\n /**\n * Enable additional debug logging\n *\n * @default false\n */\n debug?: boolean\n\n /** Payload Cloud Email\n * @default true\n */\n email?:\n | {\n defaultFromAddress: string\n defaultFromName: string\n skipVerify?: boolean\n }\n | false\n\n /**\n *\n * Configures whether cron jobs defined in config.jobs.autoRun will be run or not\n *\n * @default true\n */\n enableAutoRun?: boolean\n\n /**\n * Payload Cloud API endpoint\n *\n * @internal Endpoint override for developement\n */\n endpoint?: string\n\n /** Payload Cloud Storage\n * @default true\n */\n storage?: false\n\n /**\n * Upload caching. Defaults to 24 hours for all collections.\n *\n * Optionally configure caching per collection\n *\n * ```ts\n * {\n * collSlug1: {\n * maxAge: 3600 // Custom value in seconds\n * },\n * collSlug2: {\n * enabled: false // Disable caching for this collection\n * }\n * }\n * ```\n *\n * @default true\n */\n\n uploadCaching?:\n | {\n /**\n * Caching configuration per-collection\n */\n collections?: Partial<Record<UploadCollectionSlug, CollectionCachingConfig>>\n /** Caching in seconds override for all collections\n * @default 86400 (24 hours)\n */\n maxAge?: number\n }\n | false\n}\n\nexport type CollectionCachingConfig = {\n /**\n * Enable/disable caching for this collection\n *\n * @default true\n */\n enabled?: boolean\n /** Caching in seconds override for this collection\n * @default 86400 (24 hours)\n */\n maxAge?: number\n}\n"],"names":[],"mappings":"AA+HA,WAWC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/payload-cloud",
3
- "version": "3.23.0-canary.f63b80a",
3
+ "version": "3.23.0",
4
4
  "description": "The official Payload Cloud plugin",
5
5
  "homepage": "https://payloadcms.com",
6
6
  "repository": {
@@ -37,15 +37,15 @@
37
37
  "@aws-sdk/lib-storage": "^3.614.0",
38
38
  "amazon-cognito-identity-js": "^6.1.2",
39
39
  "nodemailer": "6.9.16",
40
- "@payloadcms/email-nodemailer": "3.23.0-canary.f63b80a"
40
+ "@payloadcms/email-nodemailer": "3.23.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/jest": "29.5.12",
44
44
  "@types/nodemailer": "6.4.17",
45
- "payload": "3.23.0-canary.f63b80a"
45
+ "payload": "3.23.0"
46
46
  },
47
47
  "peerDependencies": {
48
- "payload": "3.23.0-canary.f63b80a"
48
+ "payload": "3.23.0"
49
49
  },
50
50
  "scripts": {
51
51
  "build": "pnpm build:types && pnpm build:swc",